Problem mit eigenem Headerfile
-
Hallo Leute,
ich muss zur Zeit eine Aufgabe fuer die Uni machen und komme irgendwie nicht weiter.Hier erst einmal der funktionierende Code ohne Headerdatei:
intarraymain.c#include <stdio.h> #include <stdlib.h> struct IntArray { int laenge; }; struct IntArray * createintarray(int laenge) { struct IntArray *a = (struct IntArray *)malloc(sizeof(struct IntArray)+laenge*sizeof(int)); a->laenge = laenge; return a; } int main() { struct IntArray *a = createintarray(5); printf("Laenge: %d\n", a->laenge); return 0; }
(Anmerkung: Ich alloziere so viel Speicher, weil in das struct eigentlich noch ein Array der Größe laenge soll, jedoch wollte ich erst einmal nur mit laenge testen)
Hier nun meine Headerdatei:
intarray.h#ifndef ARRAY_HEADER #define ARRAY_HEADER struct IntArray; struct IntArray * createintarray(int laenge); #endif
intarray.c
#include <stdio.h> #include <stdlib.h> #include "intarray.h" struct IntArray { int laenge; }; struct IntArray * createintarray(int laenge) { struct IntArray *a = (struct IntArray *)malloc(sizeof(struct IntArray)+laenge*sizeof(int)); a->laenge = laenge; return a; }
und die main dazu:
intarraymain.c#include <stdio.h> #include <stdlib.h> #include "intarray.h" int main() { struct IntArray *a = createintarray(5); printf("Laenge: %d\n", a->laenge); return 0; }
Nun compiliere ich:
gcc-4 -c intarray.c
und
gcc-4 -c intarraymain.c
und bekomme folgendes:
intarraymain.c: In function 'main': intarraymain.c:8:27: error: dereferencing pointer to incomplete type
-
Die Deklaration der struct
struct IntArray { int laenge; };
gehört in die .h
Die Definition der Variablen
struct IntArray;
gehört in die .c
-
Vielen Dank, das war der Fehler! Ging leider nicht aus den Folien der Übung hervor. (Im Gegenteil)
Ich habe aber noch eine Frage:
Ich habe gelesen, dass ich mit typedef ein struct definieren und anschließend das struct weglassen kann. Ist das auch bei headerfiles möglich?
Und kann ich dann beim Einlesen von Variablen und bei der Deklaration der Ausgabe immer das struct weglassen? Funktioniert nämlich irgendwie nicht so recht:#ifndef ARRAY_HEADER #define ARRAY_HEADER typedef struct IntArray { int laenge; }; IntArray * createintarray(int laenge); #endif
#include <stdio.h> #include <stdlib.h> #include "intarray.h" IntArray * createintarray(int laenge) { struct IntArray *a = (IntArray *)malloc(sizeof(IntArray)+laenge*sizeof(int)); a->laenge = laenge; return a; }
In dieser Datei muss ich ja eigentlich am Anfang auch noch struct IntArray schreiben, aber was ist, wenn ich eine typedef gemacht habe?
In file included from intarray.c:3:0: intarray.h:9:1: warning: useless storage class specifier in empty declaration intarray.h:11:10: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token intarray.c:5:10: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token
Ich glaube irgendetwas verstehe ich an diesem typedef total falsch.
-
Okay, alarm zurück, so klappt es:
#ifndef ARRAY_HEADER #define ARRAY_HEADER typedef struct { int laenge; } IntArray; IntArray * createintarray(int laenge); #endif
Edit: Wohl doch nicht -.-
intarray.c lässt sich zwar compilieren, doch intarraymain.c wirft wieder einen ähnlichen Fehler wie zuvor aus. Eventuell sollte ich das mit dem typedef doch lassen.
-
Schau mal da http://www.c-plusplus.net/forum/p2214445#2214445