wo muss ich was wie deklarieren bzw definieren??
-
Bashar schrieb:
Die typedefs kommen mit den Funktionsdeklarationen in eine Headerdatei. Diese wird sowohl ins Hauptprogramm als auch in die Implementationsdatei eingebunden.
was meinst du mit Implementationsdatei? ist das die datei wo ich die funktionen definiert habe?
Bashar schrieb:
BTW:
typedef struct { struct UNIVERSELL *prev; struct UNIVERSELL *next; void *daten; }UNIVERSELL;
Du nutzt hier den Typ 'struct UNIVERSELL', den gibts aber gar nicht, weil die Struktur anonym ist.
wie kann ich das umgehen bzw aendern?
also ich weiß, daß ich dies hier schreiben kann:
struct UNIVERSELL { struct UNIVERSELL *next; struct UNIVERSELL *next; void *daten; };
dann muesste ich aber auch die funktion so aendern:
int make_u_list(struct UNIVERSELL **start, struct UNIVERSELL **end, int structsize);
und das moechte ich eigentlich vermeiden...
-
Sternenstaub schrieb:
was meinst du mit Implementationsdatei? ist das die datei wo ich die funktionen definiert habe?
Genau.
Sternenstaub schrieb:
Bashar schrieb:
Du nutzt hier den Typ 'struct UNIVERSELL', den gibts aber gar nicht, weil die Struktur anonym ist.
wie kann ich das umgehen bzw aendern?
Beispielsweise der Struktur einen Namen geben. Der Name kann ruhig genauso lauten wie der typedef-Name:
typedef struct UNIVERSELL { struct UNIVERSELL *prev; struct UNIVERSELL *next; void *daten; } UNIVERSELL;
BTW sollte man Bezeichner aus lauter Großbuchstaben nur für Präprozessormakros, eventuell auch enum-Konstanten, benutzen.
-
wenn ich das so mache bekomme ich folg. fehlermeldungen:
X:\Visual Studio\C-Projekte\CKlausur\unilistfunkt.c(35) : error C2143: Syntaxfehler : Fehlendes ')' vor ''
X:\Visual Studio\C-Projekte\CKlausur\unilistfunkt.c(35) : error C2143: Syntaxfehler : Fehlendes '{' vor ''
X:\Visual Studio\C-Projekte\CKlausur\unilistfunkt.c(35) : error C2143: Syntaxfehler : Fehlendes ';' vor '*'
X:\Visual Studio\C-Projekte\CKlausur\unilistfunkt.c(35) : error C2059: Syntaxfehler : 'type'
X:\Visual Studio\C-Projekte\CKlausur\unilistfunkt.c(35) : error C2059: Syntaxfehler : ')'die fehler zeigen auf die erste zeile der folg. funktion:
int make_u_list(UNIVERSELL **start, UNIVERSELL **end, int structsize) // structsize ist die Groesse des Datensegments { UNIVERSELL *act; int errorc = 0; act = (UNIVERSELL *) malloc(sizeof(UNIVERSELL)); if(act==NULL) // wenn diese Bedingung wahr ist konnte kein Speicher für die { // universelle Liste reserviert werden errorc = -1; // und die Funktion wird mit Fehlercode: -1 beendet } else { act->daten = malloc(structsize); if(act->daten == NULL) // wenn diese Bedingung wahr ist konnte kein Speicher für das { // Datensegment reserviert werden free(act); // Der für UNIVERSELL reservierte Speicher wird wieder freigegeben errorc = -1; // und die Funktion wird mit Fehlercode: -1 beendet } else // Hier ist Speicher für alles reserviert { if(*start == NULL) // WENN diese Bedingung wahr ist { *start = act; // ist es das erste Element einer neuen Liste act->prev = NULL; // und "prev" muß dementsprechend gezielt ins Leere zeigen } else // SONST gibt es einen Vorgaenger { act->prev = *end; // auf den "prev" dann zeigen muss } *end = act; // Das neue Element ist auch immer das letzte in der Liste act->next = NULL; // und "next" muß dementsprechend gezielt ins Leere zeigen } } return errorc; }
stimmt irgendwas mit dieser funktion nicht??
ich flippe hier noch aus...
-
Der Fehler wird wohl genau vor der Funktion sein. Ich seh da jedenfalls nichts falsches. Semikolon vergessen oder sowas?
-
ich nehme an, dass du das typedef in einer Header Datei geschrieben hast, includiert unilistfunkt.c sie?
-
als ich das in einer headerdatei stehen hatte hat unilist sie includiert.
habe jetzt mal alles in die main datei geschrieben und jetzt geht auch alles...theoretisch weiß ich ja wie ich das ganze zeug in header dateien deklarieren kann, ABER irgendwo muß ich was falsch gemacht haben
nochmal zur auffrischung:das typedef kann ich in eine header-datei schreiben muß sie aber in jeder datei wo ich diesen datentyp benutzen möchte includieren
(auch in der header-datei wo ich die funktionsdeklarationen mache? das hatte nämlich irgendwie nicht so geklappt)
zb: def.hals nächstes schreibe ich eine header-datei wo ich die funktionsdeklarationen mache.
zb: func.hdie funktionen selber stehen in einer datei: funktionen.c welche die beiden oben genannten header-dateien includiert.
zb: functions.c
# include "def.h"
# include "func.h"und in main includiere ich auch die beiden header-dateien.
zb: haupt.c
# include "def.h"
# include "func.h"natürlich kommen da noch die eine oder andere zusätzliche header-datei dazu, aber so müßte es doch funktionieren, oder?
benutze übrigens MS Visual C++
vielen dank,
Sternenstaub
-
Sollte so funktionieren. Und wie sieht es bei dir?
-
hallo,
so klappt es aber leider nicht. ich weiß nicht was ich falsch mache.
hier jedenfalls mal die dateien:
haupt.c:
# include <stdlib.h> # include <stdio.h> # include <string.h> # include "funktionsd.h" # include "def.h" # define TRUE 1 # define FALSE 0 int main(void) { UNIVERSELL *uliste; uliste = (UNIVERSELL*) malloc(sizeof(UNIVERSELL)); uliste->next = NULL; uliste->prev = NULL; printf("NEXT: %h\n", uliste->next); printf("PREV: %h\n", uliste->prev); return 0; }
unilistfunkt.c
# include <stdlib.h> # include "def.h" // hier kommt eine fehlermeldung: // die datei könnte nich gefunden werden int make_u_list(UNIVERSELL **start, UNIVERSELL **end, int structsize) { UNIVERSELL *act; int errorc = 0; act = (UNIVERSELL *) malloc(sizeof(UNIVERSELL)); if(act==NULL) { errorc = -1; } else { act->daten = malloc(structsize); if(act->daten == NULL) { free(act); errorc = -1; } else { if(*start == NULL) { *start = act; act->prev = NULL; } else { act->prev = *end; } *end = act; act->next = NULL; } } return errorc; } int scan_u_list(UNIVERSELL *start, UNIVERSELL *end) { int errorc = 0; UNIVERSELL *act; UNIVERSELL *old; for(old = NULL, act = start; act != NULL && errorc == 0; old = act, act = act->next) { if((old == NULL && act->prev != NULL) || act -> prev != old) errorc = -1; } return errorc; }
def.h
typedef struct UNIVERSELL { // error C2011: 'UNIVERSELL' : 'struct'-Typ-Neudefinition struct UNIVERSELL *prev; struct UNIVERSELL *next; void *daten; }UNIVERSELL;
funktionsd.h:
# include "def.h" int make_u_list(UNIVERSELL **start, UNIVERSELL **end, int structsize); int scan_u_list(UNIVERSELL *start, UNIVERSELL *end);
was habe ich übersehen??
-
Hi
Du kannst die def.h und funktionsd.h in einer Datei speichern,
die musst du halt nur in jeder Quellcodedatei includen.haupt.c
# include <stdlib.h> # include <stdio.h> # include <string.h> # include "unilist.h"
unilist.h
#ifndef UNILIST_H_ #define UNILIST_H_ // damit die datei nich mehr als einmal eingebunden werden kann (include guards) #include <andereHeaderDateien> typedef struct UNIVERSELL { struct UNIVERSELL *prev; struct UNIVERSELL *next; void *daten; }; int make_u_list(UNIVERSELL **start, UNIVERSELL **end, int structsize); int scan_u_list(UNIVERSELL *start, UNIVERSELL *end); #endif
unilistfunkt.c
#include "unilist.h" ...
der Fehler:
// error C2011: 'UNIVERSELL' : 'struct'-Typ-Neudefinition
kam weil du erst die funktionsd.h includierst und darin die defs.h. damit ich die struct unilist schon definiert und dann includierst du nochmal die defs.h.
in der haupt.cmfg higret
-
vielen dank an alle die sich gedanken gemacht haben!!
leider lag der fehler woanders. aus mir unerfindlichen gründen, war eine der header-dateien nicht in dem verzeichnis wo die anderen dateien waren.
und siehe da, die pfadangabe der include - anweisungen geändert bzw die datei an den richtigen platz kopiert -> schon gehts!!naja sowas passiert wohl wenn man vom vi auf eine sogenannte komfortablere eingebettete entwicklungsumgebung umsteigt...
grüße,
Sternenstaub