Problem bei der Übergabe eines Structs an eine andere Datei
-
Hallo, mein Projekt soll aus vielen C- Dateien bestehen, was bedeutet, dass ich Parameter an andere Dateien übergeben muss.
Ich habe mir jetzt folgende Funktion aufgebaut:
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #include <string.h> struct person { char vorname[10]; char nachname[10]; int geburtstag; }; int main() { struct person *zeiger56 = (struct person*)malloc(sizeof(struct person)); struct person element; //func1(element.vorname,element.nachname,&element.geburtstag); func3(&element); free(zeiger56); getchar(); return 0; }
Die zweite Datei sieht so aus:
//extern struct person element; void func3(struct person *zeiger) { //strcpy(zeiger->vorname,"Matthäus"); //zeiger->geburtstag = 1212198; }
Mein Problem besteht darin, dass ich es einfach nicht hinbekomme, den Struct an die zweite Datei zu übersenden.
Ich habe schon ein paar Sachen ausprobiert, aber es wird immer angezeigt.
[Warning] "struct person" declared inside parameter list
Bei der zweiten Datei.Ich würde mich sehr über eure Ratschläge freuen.
Gruss theflasher
-
Ich sehe eher ein Problem darin, dass du die zweite Datei in die erste nicht inkludierst! Ich vermisse sowas wie #include "./zweite_datei.h"! Oder ich habe dich nicht richtig verstanden.
-
@TLEP: Die zweite Datei sieht aber nicht nach einem Header aus
@flasher: Irgendwie mußt du dafür sorgen, daß die beiden Dateien (Programmteile) sich untereinander verständigen können - und dazu benötigst du einen Header mit allem, was auf beiden Seiten benötigt wird (also zumindest die struct-Definition und einen Prototyp deiner Funktion):
//data.h #ifndef DATA_H #define DATA_H struct person { char vorname[10]; char nachname[10]; int geburtstag; }; void func3(struct person*); #endif
//data.c #include "data.h" void func3(struct person* zeiger) { //mach was mit deinen Daten }
//main.c ...//sonstige Includes #include "data.h" int main() { struct person obj={"Max","Muster",11}; func3(&obj); }
-
Wobei ich empfehle, Structs nicht in einem Headerfile zu definieren,
da sonst in jeder Datei auf die Member zugegriffen werden können, was
das Interface ziemlich aufweicht.Lieber so:
//data.h #ifndef DATA_H #define DATA_H typedef struct person *person_t; void set_vorname(person_t, char*); char const *get_vorname(person_t); void func3(person_t); #endif
//data.c #include "data.h" struct person{ char vorname[10]; char nachname[10]; int geburtstag; }; char const *get_vorname(person_t p) { if (!p) exit(-1); return p->vorname; } void func3(struct person* zeiger) { //mach was mit deinen Daten }
Somit kannst du in deinem data.c-File beliebig den struct ändern, ohne
alle anderen Datei zu verändern.Gruß mcr
PS: ach ja, so wie CStoll sein obj in der main definiert hat, geht das
mit dem Ansatz oben nicht mehr. Du brauchst dann eine Funktion, die dir ein
neues, mit malloc alloziertes und anschließend initialisertes Objekt
zurück gibt.
-
Hallo vielen Dank für eure Antworten. Ich bin dadurch um einiges weitergekommen.
Allerdings bin ich wieder an einem Punkt, wo ich einfach nicht hinter die Logik komme. Damit man sich das Problem besser vorstellen kann, sage ich, dass es sich um das N- Damenproblem handelt.
Also. Ich habe folgende Files.
initNQueen --> hier wird der Struct str_nqueen mit allen Werten versehen und alle Elemente des Feldes Board = 2- Dimesionales Array werden mit 0 belegt. main--> Übergabe des str_nqueen an "Callnqueen" hier wird Berechnung durchgeführt Callnqueen--> übergibt wiederum der str_nqueen an "is_Attacking" ,wird die Dame angegriffen?? Und hier kommt es zum Fehler, den ich nicht verstehe:
Sagen wir mal ich schreibe im initnQueen, dass das Board an Position[3][3] = 7 ist, nachdem ich alle Felder mit 0 initialsiert habe
und ich übergebe das an CallnQueen, und überprüfe das mit printf dann ist dort
Board[3][3] auch 7.Wenn ich jetzt von CallnQueen den str_nqueen an is_Attacking übergebe und dann dort den Wert von Board[3][3] wissen möchste ist der plötzlich = 454353 oder ähnliches.
Ich verstehe einfach nicht, wieso der Wert nicht übergeben wird. Den Wert brauche ich aber wiederum, um zu schauen, ob eine Bedrohung der Dame zustande kommt.
Ich werde hier nur Ausschnitte aus dem Programm zeigen, weil das sonst sehr viel wäre. Wenn jemand zum besseren Verständins das ganze File braucht, werde ich es hier reinstellen.
Lasst euch nicht von der Menge des Codes erschlagen, es ist alles sehr leicht zu verstehen, weil ich nichts kompliziertes verwendet habe ^^
Das ist die Headerfile, die für alle C-DAteien zur Verfügung steht
nqueen.h #include <stdio.h> #include <stdlib.h> #include <conio2.h> #include <conio.h> #include <time.h> #define MAXBOARDSIZE 12 enum mode { step,automatic }; enum save { on,off }; enum action { ready,progress }; struct position { int ilastrow; int ilastcol; }; struct nqueen { enum mode emode; enum save esave; enum action eaction; int board[MAXBOARDSIZE][MAXBOARDSIZE]; int currentsize; struct position lastqueen; char filename[255]; int isolution; time_t runtime; }; //typedef struct nqueen * PNQUEEN; typedef struct nqueen NQUEEN; void initNQueen(NQUEEN *); void printstatus(NQUEEN *); void enterfilename(NQUEEN *); void printboard(NQUEEN *); char callnqueen(NQUEEN *,int); int attacking(NQUEEN *,int,int); void reset(NQUEEN *);
Hier werden am Anfang alle Werte des Boardes auf 0 gesetzt mit einer for-Schleife. Danach werden zum Testen einige Felder des Boardes mit Zahlen belegt und diese Felder in der is_attacking abgefragt, es werden aber immer nur 0en angezeigt.Also keine neuen Werte.
initnqueen.c #include "nqueen.h" void initNQueen(NQUEEN *str_nqueen) { int i; int j; str_nqueen->emode = automatic; str_nqueen->esave = off; str_nqueen->eaction = ready; str_nqueen->currentsize = 4; strcpy(str_nqueen->filename,"Please enter the file destination test test test test test"); str_nqueen->isolution = 0; str_nqueen->runtime = 0; for(i=0; i < MAXBOARDSIZE ; i++) // initialization of the board with 0 = no queen { for(j=0; j < MAXBOARDSIZE ; j++) { str_nqueen->board[i][j] = 0; } } str_nqueen->board[7][0] = 7; str_nqueen->board[2][3] = 1; str_nqueen->board[5][7] = 1; str_nqueen->board[8][9] = 1; }
In der _Main wird erst eine Struktur Variable geschaffen str_nqueen, mit der arbeite ich im ganzen Programm, weiter unten ist die Übergabe an Callnqueen zu sehen
main.c nicht komplett #include "nqueen.h" // Header with all libraries and Struct int main() { char character; // command input, see printmenu for all options int row=0; // first queen will be set in row 0 NQUEEN str_nqueen; // Struct nqueen with Typedef struct nqueen NQUEEN textbackground(BLACK); initNQueen(&str_nqueen); do{ character = getch(); switch (character) // menu { case 'x': { character = callnqueen(&str_nqueen,row); // Problemstart break; } }
Callnqueen fragt erst mal, ob row eine gültige Größe hat, also nicht keliner 0 und icht größer als das Board.
Um die Werte von Row und Column im ganzen Programm zu nutzen wollte ich sie in
str_nqueen->lastqueen.ilastrow = row;
str_nqueen->lastqueen.ilastcol = column;
abspeichern. Das funktioniert noch in der Callnqueen, wenn ich aber
str_nqueen->lastqueen.ilastrow
str_nqueen->lastqueen.ilastcol
in der is_atatcking Datei aufrufe bekomme ich zufällige WErte, was ich nicht vestehe.callnqueen.c nicht komplett #include "nqueen.h" char callnqueen(NQUEEN *str_nqueen,int row) { char character; int column; int attacked; if(row < 0 || row >= str_nqueen->currentsize) // has row the right size?? { gotoxy(12,12); printf("GAU"); character = 's'; } else // row has the right size { column = 0; while(column < str_nqueen->currentsize && character != 'e' && character != 's') { str_nqueen->board[row][column] = 1; str_nqueen->lastqueen.ilastrow = row; str_nqueen->lastqueen.ilastcol = column; attacked = is_attacking(&str_nqueen,row,column); //Hier die übergabe an is_attacking
Hier sollten jetzt die neuen Werte angezeigt werden und keine 0en.
is_atatcking nicht komplett, hier komme ich nicht weiter #include "nqueen.h" int is_attacking(NQUEEN *str_nqueen,int row,int column) { int i; int j; int k; int l; int array[row][column]; int attacked; gotoxy(1,1); printf("%d",str_nqueen->board[row][column]); //hier ungültige Zahl gotoxy(1,2); printf("%d",str_nqueen->board[7][0]); //Hier 0, obwohl 7 sein sollte gotoxy(1,3); printf("%d",str_nqueen->board[2][3]); //Hier 0, obwohl 6 sein sollte gotoxy(1,4); printf("%d",str_nqueen->board[5][7]); //Hier 0, obwohl 1 sein sollte gotoxy(1,5); printf("%d",str_nqueen->board[8][9]); //Hier 0, obwohl 1 sein sollte //siehe initnQueen.c
Wenn jemand eine gute Idee hat oder weiß wo hier der Fehler liegt, dann würde es mich sehr freuen.
Gruss the_flasher
-
geht