Mehrdimensionaler Array-SyntaxProblem

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von VisualDAU.

    Mehrdimensionaler Array-SyntaxProblem

    Ich habe versucht diesen Code nach VB 2010 zu übersetzen.

    Quellcode

    1. BASS_MIDI_EVENT events[]={
    2. {MIDI_EVENT_NOTE, MAKEWORD(60, 100), 0, 0, 0}, // press the key immediately (after 0 ticks)
    3. {MIDI_EVENT_NOTE, 60, 0, 200, 0}, // release the key after 200 ticks
    4. {MIDI_EVENT_END, 0, 0, 400, 0} // end after 400 ticks
    5. };
    6. midi=BASS_MIDI_StreamCreateEvents(events, 100, BASS_SAMPLE_LOOP, 0); // create a stream from the events
    7. BASS_ChannelPlay(midi, 0); // start playing it


    Rausgekommen ist

    VB.NET-Quellcode

    1. Dim events(3, 5) As BASSMIDIEvent
    2. events = {
    3. {BASSMIDIEvent.MIDI_EVENT_NOTE, MakeWord(60, 100), 0, 0, 0},
    4. {BASSMIDIEvent.MIDI_EVENT_NOTE, 60, 0, 200, 0},
    5. {BASSMIDIEvent.MIDI_EVENT_END, 0, 0, 400, 0}
    6. }
    7. Dim midi = BASS_MIDI_StreamCreateEvents(events, 100, BASS_SAMPLE_LOOP, 0)
    8. BASS_ChannelPlay(midi, 0)


    Jetzt erhalte ich bei der vorletzten Zeile beim ersten Argument "events" die Fehlermeldung

    Ein Wert des Typs "2-dimensionales Array von Un4seen.Bass.AddOn.Midi.BASSMIDIEvent" kann nicht in "1-dimensionales Array von Un4seen.Bass.AddOn.Midi.BASS_MIDI_EVENT" konvertiert werden, da "Un4seen.Bass.AddOn.Midi.BASSMIDIEvent" nicht von "Un4seen.Bass.AddOn.Midi.BASS_MIDI_EVENT" abgeleitet ist.


    Der erste Teil der Meldung lässt mich fragen, was habe ich falsch übersetzt?
    Die korrekte Syntax ist so (natürlich mit Deinen Typen und Werten):

    VB.NET-Quellcode

    1. Dim xxx(,) As Double = {{0, 1, 0, 0, 0}, {1, 60, 0, 200, 0}, {2, 0, 0, 400, 0}}
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VisualDAU schrieb:

    Quellcode

    1. BASS_MIDI_EVENT events[]={

    Der automatische Übersetzer macht hier Blödsinn.
    Einfach die Dimensionseinträge rausnehmen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:

    kompiliert denn der c#-code?

    Falls damit gemeint ist, ob dieser Code in C# funktioniert. Keine Ahnung, weil ich rein gar nichts mit C# zu tun habe. Ich habe den Code aus einem Post vom Ersteller der bass.dll. Da hat sich aber noch niemand über die Fehlerhaftigkeit des Codes beschwert.

    @RodFromGermany

    Das Problem ist, dass die Fehlermeldung sagt, dass der Array zweidimensional ist, aber bitte doch eindimensional sein sollte.

    Zu deinem zweiten Posting. Die Übersetzung kam von mir.
    also ich kriege den c# - code nur in dieser Form durch den Compiler (naja, das schrieb Rod auch schon):

    Quellcode

    1. private int MAKEWORD(int a, int b) { return 5; }
    2. public void foo() {
    3. const int MIDI_EVENT_NOTE = 3;
    4. const int MIDI_EVENT_END = 7;
    5. int[,] events ={
    6. {MIDI_EVENT_NOTE, MAKEWORD(60, 100), 0, 0, 0}, // press the key immediately (after 0 ticks)
    7. {MIDI_EVENT_NOTE, 60, 0, 200, 0}, // release the key after 200 ticks
    8. {MIDI_EVENT_END, 0, 0, 400, 0} // end after 400 ticks
    9. };
    10. }
    Die Verschachtelten '{ }' geben imo eindeutig an, dass hier ein 2-dim Array definiert ist, und das kann nicht zu

    Quellcode

    1. BASS_MIDI_EVENT events[]={
    2. ...
    passen, egal was fürn Typ BASS_MIDI_EVENT sein soll - BASS_MIDI_EVENT[] ist halt ein eindimensionales Array, und die verschachtelten '{{...}, {...}, {...}}' sind ein 2dim-Array.

    Daher kann imo die Vorlage nicht kompilieren, die Übersetzung ist richtig, und kompiliert natürlich ebenfalls nicht.
    (Oder die Vorlage ist c++ oder java - davon versteh ich nix.)
    Die korrekte Übersetzung wäre gewesen:

    VB.NET-Quellcode

    1. Dim events() As BASS_MIDI_EVENT
    2. events = {New BASS_MIDI_EVENT(BASSMIDIEvent.MIDI_EVENT_NOTE, MakeWord(60, 100), 0, 0, 0), _
    3. New BASS_MIDI_EVENT(BASSMIDIEvent.MIDI_EVENT_NOTE, 60, 0, 200, 0), _
    4. New BASS_MIDI_EVENT(BASSMIDIEvent.MIDI_EVENT_END, 0, 0, 400, 0)}


    Die Übersetzung kommt aber nicht von mir, sondern von denjenigem der den C-Code geschrieben hat.