struct in struct



  • die nötigen deklarationen für 'malloc' o.ä. stecken normalerweise in 'stdlib.h'
    🙂



  • ^^ thx... die header funktionieren jetzt schom mal... Allerdings Progge ich noch nicht so lange... Und deshlalb habe ich ein paar probleme mit den fehlermeldungen, bzw weiß ich nie wodurch diese entstehen und dem entsprechend weiß ich nie wie man sie behebt..

    struct tBasis *CreateBasis(void) 
    { 
      return calloc(1, sizeof(struct tBasis)); 
    }
    

    Naja... mein Compieler sagt mir das es hier einen fehler gibt.
    Und zwar sachter:

    'return' : 'void *' kann nicht in 'struct tBasis *' konvertiert werden
    

    vööt könnt ihr mir da noch mal helfen ...

    MFG Marian



  • Da ich meinen Quellcode immer "main.c" nenne, wendet mein (Borland)Compiler die C-Syntax an. Mit "main.cpp" bekomme ich die gleiche Meldung.

    Da hilft nur casten. Info: calloc() liefert einen "void *"-Zeiger zurück, return will aber einen "struct tBasis *"-Zeiger haben.

    return (struct tBasis *)calloc(...);
    
    //mit malloc und realloc ist es das gleiche.
    


  • keksekekse schrieb:

    Da hilft nur casten.

    neiiiiiiin ⚠



  • @ten...

    return (struct tBasis *)calloc(1, sizeof(struct tBasis));
    

    So gehts...
    Was ist schlim da dran?



  • Sqwan schrieb:

    @ten...

    return (struct tBasis *)calloc(1, sizeof(struct tBasis));
    

    So gehts...
    Was ist schlim da dran?

    guckst du: https://www.securecoding.cert.org/confluence/display/seccode/MEM02-A.+Do+not+cast+the+return+value+from+malloc()
    auch die links ganz unten



  • q also da ich nicht so gut in englisch bin habe ich das mal bei google eingegeben... Da habe ich allerdings gefunden das man das einfach casten soll.

    Tja, nur leider ist der Zeiger vom typ void, den wir nicht gebrauchen können. Das müssen wir ändern, und zwar mit hilfe des cast- operators:
    [code:1:49e50c0f8e]pcPointer = (char*) malloc ( sizeof(char) * nNeeded );
    [/code:1:49e50c0f8e]
    Hier haben wir den Datentyp von void nach char* geändert.

    davon gabs noch mehr seiten wo in etwa das selbe stand.

    dann noch eine frage...
    Wieso werden so viele Zeiger verwendet...
    ich habe variablen immer normal initalisiert, da ich nicht verstanden habe wann man so einen zeiger braucht: looks like char a;
    Vllt kannst du mir mal einen anstoß für eine google suche geben...
    und vllt auch noch einen denkanstoß um malloc nicht casten zu müssen.

    thx for help
    Marian



  • Also ich seh da nur Probleme in C wenn

    sizeof(int) != sizeof(void *)
    


  • keksekekse schrieb:

    Also ich seh da nur Probleme in C wenn

    sizeof(int) != sizeof(void *)
    

    stimmt, einen pointer nach 'int' casten ist sehr unglücklich.
    besser nach 'unsigned long' oder 'ptrdiff_t'.
    richtig die popokarte hat man aber erst, wenn man keinen linearen adressraum hat und es verschiedene pointer-attribute gibt wie 'near', 'huge', 'banked' usw...
    🙂



  • Genau. Auf DOS 16-Bit und die guten alten Modelle tiny, small, compact, medium, large und huge.

    Aber die nächste Generation wartet auch schon mit 64 Bit, wenn ich nicht irre.



  • keksekekse schrieb:

    Genau. Auf DOS 16-Bit und die guten alten Modelle tiny, small, compact, medium, large und huge.

    da gibt's die verrücktesten sachen. z.b. den schönen S12X von freescale. zwei CPU's drin, die eine sieht einen linearen adressraum von 64 kB, die andere kann 8MB adressieren, aber nicht durchgängig sondern hier mal ein bisschen RAM, dort mal etwas FLASH, ein/ausblendbar über paging register, beide CPU's operieren auf dem selben speicher wobei sich der speicher von CPU#1 aus fetzen von CPU#2 zusammensetzt und das alles in gewissen grenzen noch konfigurierbar 😃
    nicht zu vergessen, dass die eine CPU 2-bytes pointer und die andere 2- oder 3-bytes pointer hat.
    dagegen war die DOS-technik mit diesen segmentregistern, die immer 4 bytes weiterschalten, kinderkram...
    🙂



  • Genau. Auf DOS 16-Bit und die guten alten Modelle tiny, small, compact, medium, large und huge.

    Die gibbet noch in mysql



  • Sqwan schrieb:

    Genau. Auf DOS 16-Bit und die guten alten Modelle tiny, small, compact, medium, large und huge.

    Die gibbet noch in mysql

    das ist da aber was ganz anderes... 😉


Anmelden zum Antworten