Pointer auf Array in Struct speichern



  • Hallo,

    ich habe heute angefangen eine neue Version des Protokolls für mein Projekt zu schreiben. Das Protokoll kommt später zwar auf einen Mikrocontroller, aber hier gehts nur um ein Problem mit "C". Ich entwickel und teste es zurzeit mit CodeBlocks.

    Ich habe einen Fifo (uint8_t) in dem die ankommenden bytes gespeichert werden. Das Ende einer Übertragung ist durch 2 bestimmte Zeichen definiert und wird im Programm erkannt. Vor den 2 Zeichen steht noch die Länge der Payload. Vor der Payload sind noch ein paar Bytes deren länge aber definiert ist. Aus den Daten wird dann noch der Anfang der Nachricht im Fifo berechnet. Über den "Dynamic Memory Access" Controller lasse ich dann die Nachricht in einen anderen Buffer verschieben. Jetzt jedoch so, dass der Anfang der Nachricht auf Position "0" im Array ist.

    Jetzt zum Problem. Ich habe ein struct:

    typedef struct{
        //Address:
        uint8_t * target_id;
        uint8_t * origin_id;
    
        //Acknowledge:
        uint8_t * message_ack;
    
        //Payload identification:
        uint8_t * payload_class;
        uint8_t * payload_id;
        uint8_t * payload_lenght_1;
    
        //Checksum:
        uint8_t * checksum_id;
        uint8_t * checksum_payload;
    
        //Payload:
        uint8_t * payload;
        uint8_t * payload_lenght_2;
    
        //Msg recognition:
        uint8_t * message_recognition;
    }ComProtocolMessageTypeDef;
    

    Ich möchte jetzt direkt Pointer auf das Buffer Array in dem struct speichern, so dass ich direkt über das struct, ohne eine weitere Auswertungsroutine, auf die richtigen Daten zugreifen kann.

    Hier der Buffer. Die Länge beträgt 211, was genau der max. Länge der Nachricht entspricht.

    uint8_t downlink_protocol_buffer[PROTOCOL_BUFFER_LENGHT];
    

    Zu beachten ist, dass die Payload im Struct 200 Zeichen lang ist und die message_recognition 2 Zeichen.

    Hier weise ich dem Struct die Pointer zu:

    /********************************************/
        /***************   Downlink   ***************/
        /********************************************/
        //Address
        downlink_protocol_message.target_id           = downlink_protocol_buffer +   0;
        downlink_protocol_message.origin_id           = downlink_protocol_buffer +   1;
        //Acknowledge
        downlink_protocol_message.message_ack         = downlink_protocol_buffer +   2;
        //Payload identification:
        downlink_protocol_message.payload_class       = downlink_protocol_buffer +   3;
        downlink_protocol_message.payload_id          = downlink_protocol_buffer +   4;
        downlink_protocol_message.payload_lenght_1    = downlink_protocol_buffer +   5;
        //Checksum
        downlink_protocol_message.checksum_id         = downlink_protocol_buffer +   6;
        downlink_protocol_message.checksum_payload    = downlink_protocol_buffer +   7;
        //Payload
        downlink_protocol_message.payload             = downlink_protocol_buffer +   8;
        downlink_protocol_message.payload_lenght_2    = downlink_protocol_buffer + 208;
        //Msg recognition
        downlink_protocol_message.message_recognition = downlink_protocol_buffer + 209;
    

    Das Problem ist, wenn ich dann z.B. in der Target ID ein Wert speicher, steht im Buffer an der Stelle "0" auch der richtige Wert. Aber die Arrays payload und message_recognition funktionieren nicht.

    Ich versuche dann so Daten in der Payload zu speichern:

    downlink_protocol_message.payload[0] = 'H';
        downlink_protocol_message.payload[1] = 'e';
        downlink_protocol_message.payload[2] = 'l';
        downlink_protocol_message.payload[3] = 'l';
        downlink_protocol_message.payload[4] = 'o';
        downlink_protocol_message.payload[5] = ' ';
        downlink_protocol_message.payload[6] = 'W';
        downlink_protocol_message.payload[7] = 'o';
        downlink_protocol_message.payload[8] = 'r';
        downlink_protocol_message.payload[9] = 'l';
        downlink_protocol_message.payload[10] = 'd';
    

    Aber wenn ich dann die entsprechenden Bytes des Arrays auslese kommt nur Müll bei raus.

    Ich weiß nicht, wo der Fehler liegen könnte. Ich hoffe ich habe das mit den Pointern richtig gemacht.

    Ich habe das gesamte Projekt auf meinen Webspace hochgeladen, da ist auch eine exe mit drin, wer probieren will.
    http://www.autorino.de/Protocol_0_1_Beta.zip
    Ich hoffe, ich verstoße damit nicht gegen irgendwelche Forenreglen. Wenn doch den Link wieder rausnehmen.

    Vielen Dank schon mal im voraus,

    MfG
    Philipp



  • Machst du das reinschreiben und auslesen in einer Funktion direkt hintereinander?

    Ist uint8_t downlink_protocol_buffer[PROTOCOL_BUFFER_LENGHT]; eine lokale Variable?

    Was für Warnungen bekommst du?

    Kannst du den eben gezeigten Code so in ein klitzekleines Programm packen, dass das Programm ausgeführt werden kann und der Fehler auftritt?



  • DirkB schrieb:

    Machst du das reinschreiben und auslesen in einer Funktion direkt hintereinander?

    Ist uint8_t downlink_protocol_buffer[PROTOCOL_BUFFER_LENGHT]; eine lokale Variable?

    Was für Warnungen bekommst du?

    Kannst du den eben gezeigten Code so in ein klitzekleines Programm packen, dass das Programm ausgeführt werden kann und der Fehler auftritt?

    Die Zuweisung der Pointer passiert ganz am Anfang in der Initialisierung und bleibt dann gleich.

    uint8_t downlink_protocol_buffer[PROTOCOL_BUFFER_LENGHT]; ist lokal, die ich dann aber in der Header Datei des Protocols mit extern global mache.

    Es gibt keine Warnungen. Das Programm scheint an sich keine Fehler zu haben, aber im Array steht das Falsche.

    Hier nochmal der Link:
    http://www.autorino.de/Protocol_0_1_Beta.zip
    Das ist der Source mit meinem Testprogramm als CodeBLocks Projekt und Compilierbar. Unter bin/Debug ist dann auchnoch eine .exe der compilieren Konsolenanwendung. In der ersten Zeile steht dann "A", was auch richtig ist, und in der Zweiten wirre Zeichen, aber da müsste "Hello World" stehe.

    MfG
    Philipp

    Das Testprogramm. Erste Initialiesierung. Dann zuweisung der Daten und dann auslesen. Das Auslesen der target_id funktioniert, aber nicht das des Arrays.

    #include <stdlib.h>
    #include <stdio.h>
    
    #include "communication_protocol.h"
    
    int main(void)
    {
        communication_protocol_init();
        *downlink_protocol_message.target_id = 'A';
        downlink_protocol_message.payload[0] = 'H';
        downlink_protocol_message.payload[1] = 'e';
        downlink_protocol_message.payload[2] = 'l';
        downlink_protocol_message.payload[3] = 'l';
        downlink_protocol_message.payload[4] = 'o';
        downlink_protocol_message.payload[5] = ' ';
        downlink_protocol_message.payload[6] = 'W';
        downlink_protocol_message.payload[7] = 'o';
        downlink_protocol_message.payload[8] = 'r';
        downlink_protocol_message.payload[9] = 'l';
        downlink_protocol_message.payload[10] = 'd';
    
        printf("%c\n",downlink_protocol_buffer[0]);
    
        for(int i=0;i<11;i++)
        {
            printf("%c",(downlink_protocol_buffer+8+i));
        }
    
        printf("\n");
        return 0;
    }
    


  • printf erwartet bei %c einen Wert. (downlink_protocol_buffer+8+i) ist aber ein Pointer.
    Da fehlt ein *.

    Das kleine Programm würde bei mir nicht fehlerfrei compilieren, da die Variablendefinitionen und eine Funktion fehlt.

    Die Warnung bei %c hätte ich aber bekommen.



  • DirkB schrieb:

    printf erwartet bei %c einen Wert. (downlink_protocol_buffer+8+i) ist aber ein Pointer.
    Da fehlt ein *.

    Das kleine Programm würde bei mir nicht fehlerfrei compilieren, da die Variablendefinitionen und eine Funktion fehlt.

    Die Warnung bei %c hätte ich aber bekommen.

    Achja, stimmt. Ja danke jetzt gehts.

    Der kleine Ausschnitt ist auch nicht compilierbar weil die hälfte fehlt.
    Der gesamte code und die compilierte exe dazu, befinden sich, wie ich in den letzten beiden Posts schon geschrieben habe, in dem Zip File, dass ich auf meinen Webspace geladen habe und hier verlinkt habe.

    CodeBlocks gibt bei mir komischerweise keine einzige Warnung raus. Auch wenn ich erstmal Cleane und dann das Projekt neu compiliere.



  • lord-maricek schrieb:

    CodeBlocks gibt bei mir komischerweise keine einzige Warnung raus. Auch wenn ich erstmal Cleane und dann das Projekt neu compiliere.

    Ich habe das mal mit

    #include <stdio.h>
    
    int main ( void )
    {
        char c = 'A';
        double d = 100.1;
    
        printf("%c, %d\n", &c, d);
    
        return 0;
    }
    

    probiert und auch keine Warnung bekommen. (Code::Blocks 10.05 mit dem mitgelieferten MinGW unter Windows 7)

    Jetzt geht es aber.

    Schau die nochmal die build options an und deaktiviere alles ausser -Wall (in den globalen Settings und auch bei Debug/Release).
    Dann kannst du ja Schrittweise wieder die aktivieren, die du brauchst.


Anmelden zum Antworten