Länge eines variablen Arrays automatisch ermitteln?



  • 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:

    { 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


  • Mod

    Jackson0 schrieb:

    Leider funktioniert das automatische ermitteln der Länge mit sizeof bei komplexeren Anweisungen nicht

    Wieso 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...

    Doch, das ist jedes mal ein neues Array. Aber das heißt ja nicht, dass dies nicht dort liegt, wo das alte Array war, schließlich wird jenes gar nicht mehr gebraucht.

    Gibt es da nicht eine bessere Lösung?

    Vielleicht. Muss man mehr für wissen. Mit dem, was du bisher geschrieben hast, kommt mir weder eine bessere Lösung in den Sinn, noch verstehe ich so recht, was an dieser momentanen Lösung so schlecht sein soll.



  • Bei Mikrocontrollern gibt es meist auch Compilererweiterungen, die es erlauben die Arrays im Flash zu belassen.

    Wenn du die Arrays beschreiben willst, kannst du zumindest die Initialwerte in den Flash legen und dann mit memcpy kopieren. Dann brauchst du wirklich nur 1 Array (aber ausreichend groß)



  • Leider funktioniert das automatische ermitteln der Länge mit sizeof bei komplexeren Anweisungen nicht

    sizeof auf ein unsigned char array liefert dir die groesse in Bytes - nur eben nicht auf Pointer (da bekommst du dann 4 oder 😎 - was du wohl meinst wenn du "komplexeren Anweisungen" meinst - oder?


Log in to reply