Funktion mit Zeiger-Rückgabe kompiliert nicht



  • Hallo,

    ich programmiere normalerweise in Java, für mein derzeitiges Projekt benötige ich allerdings C.

    Problem: Funktion soll einen Zeiger auf meine struct "ImageFrame" zurückgeben.

    new_lib.h

    40:  ImageFrame *load_image(char *img_name);
    

    und in der new_lib.c

    77:  ImageFrame *load_image(char *img_name)
    78:  {
    79:    ImageFrame out_data = malloc(sizeof(ImageFrame));
    80:    ...
    81:    return ImageFrame;
    82:  }
    
    gcc -Wall img_lib.c
    

    führt dann zu

    In file included from new_lib.c:13:
    new_lib.h:40: Fehler: expected »=«, »,«, »;«, »asm« or »__attribute__« before »*« token
    new_lib.c:77: Fehler: expected »=«, »,«, »;«, »asm« or »__attribute__« before »*« token
    

    wobei die angegebenen Zeilen die obengenannten sind.

    Hab ich mich da verformuliert? Wenn ich meinen Code mit Beispielen für Funktionen mit Zeiger-Rückgabewerten suche finde ich keine Fehler (oder bin mit Blindheit geschlagen 🕶)...



  • Hast du den Header mit dem struct im *.c-File included? Sonst kennt der Compiler ImageFrame nicht 😉

    Ahh und dann noch folgendes: Ich weiss nicht, als was ImageFrame definiert ist, aber deine Zuweisung in der Funktion an out_data macht keinen Sinn. Du musst dort ebenfalls einen Zeiger verwenden.
    [cpp]77: ImageFrame *load_image(char *img_name)
    78: {
    79: ImageFrame *****out_data = malloc(sizeof(ImageFrame));
    80: ...
    81: return ImageFrame;
    82: } [/cpp]



  • 1. out_data muss ein Zeiger sein
    2. Du musst schon eine Variable zurückgeben, keinen Datentypen!



  • /rant/ schrieb:

    81: return out_data;



  • Du hast in deinem Code vermutlich so etwas:

    struct ImageFrame 
    {
         // Daten
    };
    

    Versuche mal einen typedef, und du solltest es nach Korrektur der anderen Fehler zum Laufen bekommen:

    struct ImageFrame_
    {
         // Daten
    };
    typedef struct ImageFrame_ ImageFrame;
    
    // bzw. gleich
    typedef struct
    {
         // Daten
    }ImageFrame;
    

    Alternativ könntest du überall struct ImageFrame* schreiben, dies ist imho aber unschön.



  • Hoi, danke für die schnellen Antworten.

    Entschuldigt bitte die Abschreibefehler (ja... das schien mir einfacher als Copy-Paste, weil ich soviel Code rauskürzen musste, ist aber offensichtlich eine Fehlerquelle...) - natürlich haben cookie und rant Recht, war aber im Original ok.

    yahendriks Lösung hat für mich funktioniert, ich habe wie empfohlen zur struct noch eine typedef dazugeschrieben, seitdem klappt alles.

    Kann mir noch jemand erklären (oder verlinken), warum das so ist?
    Ist eine struct nicht - wie bei Java - automatisch ein Typ, den ich instanzieren kann? Bzw. hat das damit zu tun, dass C nicht wirklich objektorientiert "denkt"?



  • Das ist übrigens nicht nur in Java so, auch in C++ reicht es, nur den Namen des structs zu schreiben.
    Achtung Halbwissen:
    Ich denke, ein entscheidender Grund dürfte das Finden aussagekräftiger Namen haben. C kennt keine namespaces, daher kann es manchmal sinvoll sein, Folgendes zu machen:

    struct stat {/* */};
    int stat(int,char*,int); // Funktionsdeklaration mit dem gleichen Namen
    

    Dies geht übrigens auch in C++, nur dann muss ebenfalls struct stat geschrieben werden, wenn die Struktur angesprochen werden soll (gilt natürlich auch für class, enum, union ).


Anmelden zum Antworten