dereferencing pointer to incomplete type



  • Hallo,

    ich möchte versuchen eine art "Objektorientierung" in c zu machen. Allerdings habe ich dabei ein kleines Problem.

    Ich habe folgende Dateien implementiert:

    datei file.c

    #include "stdlib.h"
    #include "file.h"
    
    /* aus Descriptor.c */
    struct _StdFile {
    int (*read)(StdFile *this, void* b, int ml);
    int (*write)(StdFile *this, void *b, int l);
    int (*close)(StdFile *this);
    FILE *fp;
    };
    
    static int stdfile_read(StdFile *this, void *buffer, int maxlen) {
    return fread(buffer, maxlen, 1, this->fp);
    }
    
    static int stdfile_write(StdFile *this, void *buffer, int len) {
    return fwrite(buffer, len, 1, this->fp);
    }
    
    static int stdfile_close(StdFile *this) {
    fclose(this->fp);
    free(this);
    return 1;
    }
    
    StdFile* stdfile_open(const char *path, const char* mode) {
    StdFile *n;
    FILE *fp = fopen(path, mode);
    if (fp == NULL) return NULL;
    n = malloc(sizeof *n);
    n->read = stdfile_read;
    n->write = stdfile_write;
    n->close = stdfile_close;
    n->fp = fp;
    return n;
    }
    

    Datei file.h

    #include <stdio.h>
    
    #ifndef _FILE_H_
    #define _FILE_H_
    
    /* opaque objects */
    typedef struct _StdFile StdFile;
    /* constructor prototypes */
    StdFile* stdfile_open(const char *path, const char* mode);
    
    #endif
    

    Und ich verwende das ganze im main.c so:

    #include "stdio.h"
    #include "file.h"
    
    int main()
    {
        StdFile *datei;
        int test;
    
        datei = stdfile_open("./test.txt","w");
        test = datei->write(datei,"test",5);
        return 0;
    }
    

    soweit so gut. Allerdings kriege ich sobald ich die Zeile

    test = datei->write(datei,"test",5);
    

    einfüge folgenden Fehler :
    error:dereferencing pointer to incomplete type

    Hat jemand eine Ahnung was das heisst ?



  • Das heisst, dass die main-Funktion nicht weiss, wie StdFile aussieht, weil es zwar deklariert aber nicht definiert wurde.



  • Argh, das hatte ich glatt übersehen.

    Danke


Anmelden zum Antworten