Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Länge eines variablen Arrays automatisch ermitteln?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
16.03.2015, 01:43 Uhr
Jackson0



Hallo,

ich bin noch C-Anfänger und möchte ein Array mit variabler Länge an eine Routine übermitteln.

Ich muss unterschiedlich lange Befehlssequenzen in denen alle Bytes von 0-FF enthalten seien können an eine Routine übermitteln.

Ich löse das im Moment so, Beispiel:

C++:
///////////////////////////////////////////////////////////////////////////////////////////////////    
    { char SendData[] = {
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
    0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3E, 0x3D, 0x3F,
    0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
    0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6E, 0x6D, 0x6F,
    0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F,
    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
    0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
    0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
    0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
    0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
    0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
    0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF };
    ObdSendCommand(SendData, sizeof(SendData)); }

    { char SendData[] = { 0x10, 0x89 };
        ObdSendCommand(SendData, sizeof(SendData)); }

    { char SendData[] = { 0x1A, 0x9B };
        ObdSendCommand(SendData, sizeof(SendData)); }

    { char SendData[] = { 0x27, 0x03 };
        ObdSendCommand(SendData, sizeof(SendData)); }

    {char SendData[6];
        SendData[0]=0x27;
        SendData[1]=0x04;
        i=ReceiveData[2];
        ReceiveData[2]=ReceiveData[5];
        ReceiveData[5]=i;
        i=ReceiveData[3];
        ReceiveData[3]=ReceiveData[4];
        ReceiveData[4]=i;
        *((long *)(&SendData[2])) = *((long *)(&ReceiveData[2])) + 89518;
        i=SendData[2];
        SendData[2]=SendData[5];
        SendData[5]=i;
        i=SendData[3];
        SendData[3]=SendData[4];
        SendData[4]=i;
        ObdSendCommand(SendData, 6);}

    { char SendData[] = { 0x27, 0x03 };
        ObdSendCommand(SendData, sizeof(SendData)); }

    {char SendData[6];
        SendData[0]=0x27;
        SendData[1]=0x04;
        i=ReceiveData[2];
        ReceiveData[2]=ReceiveData[5];
        ReceiveData[5]=i;
        i=ReceiveData[3];
        ReceiveData[3]=ReceiveData[4];
        ReceiveData[4]=i;
        *((long *)(&SendData[2])) = *((long *)(&ReceiveData[2])) + 0x12A6B;
        i=SendData[2];
        SendData[2]=SendData[5];
        SendData[5]=i;
        i=SendData[3];
        SendData[3]=SendData[4];
        SendData[4]=i;
        ObdSendCommand(SendData, 6);}



Leider funktioniert das automatische ermitteln der Länge mit sizeof bei komplexeren Anweisungen nicht und ich bin mir auch nicht sicher ob ich mit der Charanweisung nicht jedes mal ein neues SendData-Array anlege was meinem Mikrocontroller mit 12KB Ram schnell zum Überlauf bringen würde...

Gibt es da nicht eine bessere Lösung?

Gruß
Jackson
-----
Edit: code-Tags durch cpp-Tags ersetzt.
Edit2: Einrückungen verkleinert und oberste Kommentarzeile eingefügt, damit in der Arrayzuweisung kein Zeilenumbruch entsteht.

Dieser Post wurde am 17.03.2015 um 02:03 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.03.2015, 01:55 Uhr
Hans
Library Walker
(Operator)


Hi,

ich hab mir mal ein kurzes Testprogramm um Deinen Beispielcode herum gebastelt, - das läuft ohne Probleme. Was ich mich aber frage ist, was die geschweiften Klammern um so einen Anweisungsblock herum sollen? - Also jene, die ich hier mal untereinander gesetzt habe:

C++:
{ char SendData[] = { 0x27, 0x03 };
                ObdSendCommand(SendData, sizeof(SendData));
}



Und ja, so wie das jetzt gelöst ist, bekommst Du für jede Zeile der Form

C++:
char SendData[] = { ... };


eine eigenes Array mit genau den Daten, die Du dem Array an dieser Stelle zuweist. Da die Daten jedoch vermutlich von irgendwo herein kommen, (ich vermute, dass SendData[] und ReceiveData[] irgendwelche I/O-Puffer sein sollen) solltest Du es so lösen, dass SendData[] und ReceiveData[] einmal am Anfang des Programms definiert werden. Wenn es für die Befehlssequenzen irgendeine Logik gibt, nach der sie auftauchen, oder irgendwelche Regelmässigkeiten, in denen bestimmte Bytes aufeinander folgen, dann solltest Du die ebenfalls in eine Tabelle packen, die an der Stelle im Programm definiert wird, wo sie gebraucht wird, und daraus jeweils die Bytefolgen holen, die Du gerade an SendArray übergeben willst.
Hoffe, das war jetzt einigermassen verständlich...

Hans


P.S. Es ist auch eine Idee, mal die Application Notes vom Hersteller des Controllers zu studieren. Insbesondere jene, die beschreiben wie ein Problem mit dem Controller gelöst werden kann.
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 17.03.2015 um 01:58 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: