Pointer auf Offset innerhalb eines Arrays



  • Hallo,

    folgende Zeile:

    ptr_baustein = (FBS_DIR_BAUSTEIN_T *)(&fbs_glob_data.fbs_glob_dir[0] + sizeof(FBS_DIRECTORY_T));
    

    Der Pointer zeigt jetzt im Array bei Index 12 (weil sizeof(FBS_DIRECTORY_T) die Größe 12 hat) auf Position null. Was ich aber will ist das der Pointer beim angegeben Index auf Offset 12 zeigt.
    Wenn ich es so schreibe geht es:

    uint8_t *ptr;
    ptr = &fbs_glob_data.fbs_glob_dir[0];
    ptr_baustein = (FBS_DIR_BAUSTEIN_T *)(ptr + sizeof(FBS_DIRECTORY_T));
    

    Für mich ist das irgendwie dasselbe, weil das was ich dem Hilfspointer zuweise steht oben ja direkt. Wie schreibe ich das den ohne den Hilfspointer richtig ?

    Danke für die Hilfe.

    Grüße



  • Hallo nochmal,

    hab es selbst gelöst, muss es erst noch auf uint8_t casten.

    ptr_baustein = (FBS_DIR_BAUSTEIN_T *)(((uint8_t *)&fbs_glob_data.fbs_glob_dir[0]) + sizeof(FBS_DIRECTORY_T));
    

    Grüße



  • Welchen Typ hat überhaupt fbs_glob_data.fbs_glob_dir? Ich tippe mal irgendein struct. Wenn du dort +sizeof(FBS_DIRECTORY_T) machst kriegst du nicht den Pointer 12 Bytes weiter hinten sondern 12 Elemente von fbs_glob_dir weiter hinten. Und solchen Code wie du da gerade produziert hast sollte man wenn möglich vermeiden, weil es total unleserlich ist und dabei einiges schief gehen kann. Und wenn man dann schon unterschiedliche structs direkt hintereinander in den Speicher packt hätte ich dem ganzen Teil direkt den Typ uint8_t* gegeben, statt dem Pointer zu irgendeinem struct.

    PS: Wenn fbs_glob_dir ein Pointer oder Array ist, dann ist die Schreibweise &fbs_glob_dir[0] unnötig lang, denn du hättest auch einfach nur fbs_glob_dir schreiben können.



  • Hallo,

    ja da bin ich spatter auch drüber gestolpert.

    fbs_glob_data ist ein struct.
    fbs_glob_dir ist ebenfalls ein struct und beinhaltet lediglich ein uint8_t Array dir_sector.

    Jetzt schaut es so aus:

    ptr_baustein = (FBS_DIR_BAUSTEIN_T *)(fbs_glob_data.fbs_glob_dir[0].dir_sector + sizeof(FBS_DIRECTORY_T));
    

    Jetzt gefällt mir das deutlich besser 🙂

    Grüße


Log in to reply