Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
swift中定长C数组的访问元素_Swift_Coremidi - Fatal编程技术网

swift中定长C数组的访问元素

swift中定长C数组的访问元素,swift,coremidi,Swift,Coremidi,我想把一些C代码转换成swift。 (为什么?-在OS-X中使用CoreMIDI以防您提出要求) C代码是这样的 void printPacketInfo(const MIDIPacket* packet) { int i; for (i=0; i<packet->length; i++) { printf("%d ", packet->data[i]); } } struct MIDIPacket { MIDITimeStamp

我想把一些C代码转换成swift。 (为什么?-在OS-X中使用CoreMIDI以防您提出要求)

C代码是这样的

void printPacketInfo(const MIDIPacket* packet) {
   int i;
   for (i=0; i<packet->length; i++) {
      printf("%d ", packet->data[i]);
   }
 }
struct MIDIPacket
 {
    MIDITimeStamp           timeStamp;
    UInt16                  length;
    Byte                    data[256];
 };
func printPacketInfo(packet: UnsafeMutablePointer<MIDIPacket>){
    // print some things
    print("length", packet.memory.length)
    print("time", packet.memory.timeStamp)
    print("data[0]", packet.memory.data.1)
    for i in 0 ..< packet.memory.length {
      print("data", i, packet.memory.data[i])
    }
  }
我的雨燕是这样的

void printPacketInfo(const MIDIPacket* packet) {
   int i;
   for (i=0; i<packet->length; i++) {
      printf("%d ", packet->data[i]);
   }
 }
struct MIDIPacket
 {
    MIDITimeStamp           timeStamp;
    UInt16                  length;
    Byte                    data[256];
 };
func printPacketInfo(packet: UnsafeMutablePointer<MIDIPacket>){
    // print some things
    print("length", packet.memory.length)
    print("time", packet.memory.timeStamp)
    print("data[0]", packet.memory.data.1)
    for i in 0 ..< packet.memory.length {
      print("data", i, packet.memory.data[i])
    }
  }
func printPacketInfo(数据包:UnsafeMutablePointer){
//打印一些东西
打印(“长度”,数据包。内存。长度)
打印(“时间”、数据包、内存、时间戳)
打印(“数据[0]”,packet.memory.data.1)
对于0中的i..
但这会产生一个编译器错误

错误:键入“(UInt8,UInt8,…cut..UInt8,UInt8,UInt8)” 没有下标成员

那么,如何取消对固定大小数组的第I个元素的引用呢?

应该:
用于0中的i..

是这个吗?
对于0中的i..
错误消息是一个提示:它表明
MIDIPacket.data
不是作为数组导入的,而是作为元组导入的。(是的,这就是所有固定长度数组在Swift中的导入方式。)您似乎在前一行中注意到了这一点:

print("data[0]", packet.memory.data.1)

Swift中的元组是非常静态的,因此没有一种动态访问元组元素的方法。因此,在某种意义上,打印数据包的唯一“安全”或惯用方式(按照您暗示的方式)是256行代码(或者最多256行,因为数据包的
长度
字段告诉您何时可以安全停止):

显然,这不是一个很好的解决方案。根据用户3441734的回答,使用反射是一种(麻烦的)选择。根据您自己的回答(通过jckarter),不安全的内存访问是另一个问题(但正如API的名称所说,它是“不安全的”)。当然,您始终可以通过(Obj)C处理数据包

如果您需要打印数据包以外的其他操作,可以扩展基于
UnsafePointer
的解决方案,将其转换为如下所示的数组:

extension MIDIPacket {
    var dataBytes: [UInt8] {
        mutating get {
            return withUnsafePointer(&data) { tuplePointer in
                let elementPointer = UnsafePointer<UInt8>(tuplePointer)
                return (0..<Int(length)).map { elementPointer[$0] }
            }
        }
    }
}
扩展数据包{
变量数据字节:[UInt8]{
突变基因{
返回unsafepointer(&data){tuplePointer in
let elementPointer=UnsafePointer(tuplePointer)

return(0..在您的情况下,您可以尝试使用以下内容

// this is tuple with 8 Int values, in your case with 256  Byte (UInt8 ??) values
var t = (1,2,3,4,5,6,7,8)
t.0
t.1
// ....
t.7
func arrayFromTuple<T,R>(tuple:T) -> [R] {
    let reflection = Mirror(reflecting: tuple)
    var arr : [R] = []
    for i in reflection.children {
        // better will be to throw an Error if i.value is not R
        arr.append(i.value as! R)
    }
    return arr
}

let arr:[Int] = arrayFromTuple(t)
print(arr) // [1, 2, 3, 4, 5, 6, 7, 8]
这是由

func printPacketInfo(数据包:UnsafeMutablePointer){
//打印一些东西
打印(“长度”,数据包。内存。长度)
打印(“时间”、数据包、内存、时间戳)
设len=Int(packet.memory.length)
withUnsafePointer(&packet.memory.data){p in
设p=unsafemeutablepointer(p)
对于0中的i:Int.

这太可怕了-我希望编译器将这些废话转换成一些好代码

编译器抱怨的是哪一行?是packet.memory.data[I]line.packet.memory.data代表一个元组,而不是数组。请看我的回答中如何解决您的问题。“没有一种方法可以动态访问元组元素…”。我试着为他的特殊需要做这件事,元组中的所有值都具有相同的类型。请看我的答案。packet.memory.data表示元组…请看我的答案,我试着将其转换为数组。我已经进行了修改,以便以可能有用的方式扩展此选项和其他选项。但告诉苹果你希望看到导入固定len的最佳方式是gth阵列的改进是为了社区,或为社区做出贡献。Swift进化列表中有一个解决这一问题的建议。