[C] Struktur deklarieren

üäpöol

Erfahrenes Mitglied
Hi,
ich habe ein etwas unübersichtliches Projekt, bei dem ich Strukturen, Variablen und Funktionen in eine andere Datei sollen. Das bedeutet, dass ich in einer *.h die Deklarationen und in einer functions.c die Definitionen mache. Es funktioniert auch alles, bis auf die Strukturen.
C:
struct xyz;
funktioniert nicht: Ich bekomme haufenweise Fehlermeldungen. Weißt jemand, wie man Strukturen deklarieren kann?!
 
Zeig mal, wie du das in den Headern und c-Dateien gemacht hast.
Und welche Fehler gibt der Compiler genau?

So wie du das hier gezeigt hast stimmt das schon.

Lg
 
Das ist die Fehlermeldung:
Code:
header.h:10: error: array type has incomplete element type
Zeile 10 ist
C:
struct GDTstruct GDT[6];
Ich benutze GCC und linke dann die verschiedenen Dateien mit LD.
 
Die Fehlermeldung bedeutet, das struct GDTstruct noch nicht deklariert ist. Es kommt jetzt voll darauf an, was du mit der Struktur abbilden willst. Hier mal ein einfaches Beispiel:

C:
// In die Header-Datei z.B. point.h
#ifndef POINTS_H
#define POINTS_H

struct point {
   int x;
   int y;
   int z;
};

#endif

Dann im C-File:

C:
#include "point.h"

// Ein Array mit 10 Punkt-Variablen anlegen
struct point points[10];

int main(int argc, char **argv)
{
	points[0].x = 14;
	points[0].y = 25;
	points[0].z = 33;
}
 
OK. Danke. Es muss natürlich so aussehen. Es gibt aber noch ein anderes großes Problem: Es wird einfach nicht erkannt, dass die Variablen schon deklariert wurden:
Code:
functions.c:6: warning: data definition has no type or storage class
functions.c:6: warning: type defaults to 'int' in declaration of 'vidmem'
functions.c:6: error: conflicting types for 'vidmem'
header.h:42: note: previous declaration of 'vidmem' was here
functions.c
C:
vidmem = (char*) 0xB8000;
header.h
C:
char *vidmem;
Ich verstehe's leider nicht.
 
Hast du den include der header.h in der functions.c am Anfang der Datei gemacht oder erst weiter unten im Code?

Mit welchem Compiler kompilierst du?
 
Also mal davon abgesehen, dass der Zeiger auf den Video-Speicher in kein Header-File rein sollte, da er nur innerhalb des Codes benutzt werden sollte, der den Video-Speicher schreibt, kann es sein, das du die Zuweisung vidmem = 0xb8000 im globalen Bereich der functions.c machst?

Ich würde ein static char * innerhalb der functions.c anlegen und sofort mit 0xb8000 belegen.
 
Variablen sollten nur dort angelegt werden, wie sie wirklich gebraucht werden. Prototypen, Strukturen und Defines können in Header-Files abgelegt werden. Variablen sollten das nicht. Sie gehören dort nicht hin. Und es kann wie bei deinem Beispiel zu seltsamen Randwirkungen kommen. Wenn du eine Variable oder den Wert der Variablen in einem anderen .c-File benötigst, erstell ein extern oder noch besser einen Getter.
 
Zurück