2017-08-26 5 views
3

Ich versuche, diesen Code zu portieren:Wie kann ein Array C-Bindungen enthalten?

struct SoundIoChannelLayout { 
    const char *name; 
    int channel_count; 
    enum SoundIoChannelId channels[SOUNDIO_MAX_CHANNELS]; 
}; 

Aber ich weiß nicht, wie die Art des channels zu definieren, und ich weiß, dass ich nicht einen Zeiger, weil die endgültige Struktur Größe gewonnen verwenden kann‘ t dasselbe sein.

+0

[Die Dokumente] (https://crystal-lang.org/docs/syntax_and_semantics/c_bindings/fun.html) sprechen über StaticArray, und es hat sogar Syntax Zucker für seine Definition. Ich habe nicht versucht, den resultierenden Code zu schreiben, aber das sollte es tun. – mgarciaisaia

Antwort

4

konnte ich es crystal_lib mit automatisch generieren:

@[Link("soundio")] 
lib LibSoundio 
    MAX_CHANNELS = 24 

    struct ChannelLayout 
    name : LibC::Char* 
    channel_count : LibC::Int 
    channels : ChannelId[MAX_CHANNELS] 
    end 

    enum ChannelId 
    Invalid = 0 
    FrontLeft = 1 
    FrontRight = 2 
    FrontCenter = 3 
    # ... 
    end 
    # ... 
end 

Hinweis:

$ cd crystal_lib 
$ cat examples/soundio.cr 
@[Include("soundio/soundio.h", prefix: %w(SoundIo))] 
@[Link("soundio")] 
lib LibSoundio 
end 
$ crystal src/main.cr -- examples/soundio.cr > soundio.cr 

So sieht es so aus Sie führte manuell möglicherweise aktualisieren müssen Datei weil crystal_lib ist noch experimentell.

Verwandte Themen