zerstückelte arrays mit pointern
-
Tach,
Ich würde gerne eine Dateistruktur machen die folgendermaßen aussieht:
struct data{ int **distances; };
**distances soll ein ragged array werden, dessen Größe erst mit dem Aufruf einer Funktion festgelegt wird. Die Funktion bekommt einen Integer mitgegeben, der die Größe dann festlegt.
Angenommen, man gibt der funktion N als Größe mit, dann soll distances so ein array werden:
distances[N-1].
Die arrrays auf die das dann zeigt sollen dann die Größen 1,2,3,...,n-1 haben.
Wie ich das hinbekomme weiß ich aber noch nicht recht. Ich nehme an, das funktioniert irgendwie mittels malloc und sizeof. Mein aktueller Plan sieht so aus:struct data getData(int num){ int i; struct data thedata; thedata.distances = malloc(sizeof(int[num-1])); for(i=0;i<num-1;i++){ thedata.distances[i]=malloc(sizeof(int[i+1])); } return thedata; }
Naja das tuts überhaupt nicht und mit der fehlermeldung weiß ich bislang nichts anzufangen(two or more data types in declaration of 'getData').
Würde mir jemand auf die Sprünge helfen? Bin noch etwas unbeholfen mit Arrays, Pointern und dieser Speicherreservierungsgeschichte.
PS: hat C soetwas wie einen Konstruktor, sodass man beim erzeugen des datentyps direkt parameter mitgeben kann? Wäre ja das einfachste.
MFG Orb
-
Orb schrieb:
struct data getData(int num){ int i; struct data thedata; thedata.distances = malloc(sizeof(int[num-1])); for(i=0;i<num-1;i++){ thedata.distances=malloc(sizeof(int[i+1])); } return thedata; }
dieses 'malloc(sizeof(int[num-1]))' sieht nach 'geht-nicht' aus. das müsste ungefähr so aussehen: [i]... = malloc ((num-1)*sizeof(int*))*. damit legst du num-1 int-pointer an. in der schleife darunter ist das gleiche problem. wieso überhaupt -1 und +1 ?
zu der anderen frage: C hat keine konstruktoren (weil's ja auch keine klassen hat). musste mit funktionen machen.
-
Wunderbar, das funktioniert jetzt - Danke.
Allerdings, werde ich jetzt bei der Weiterverwendung der erzeugten Daten gewarnt (Assignment of 'struct flightdata *' to '[incomplete] struct flightdata *').flightdata ist jetzt der name des structs.
Wie ändere ich das?
Momentan sieht es so aus:struct flightdata *theflights; theflights=getflightdata(num_airports); printFlightdataTable("NEW GENERATED FLIGHTDATA",theflights);
die signatur von printFlightdataTable sieht so aus:
void printFlightdataTable(char *headline,struct flightdata *fd)
Das Teil tut eigentlich was es soll, aber ich bekomme diese Warnung. Wieso ist das so und wie kann ich das ändern?
MFG Orb
-
Orb schrieb:
(Assignment of 'struct flightdata *' to '[incomplete] struct flightdata *').
der code kann die definition von struct flightdata nicht sehen. pack die am besten in einen header und #include die überall wo du sie brauchst.
-
Hattest recht, danke
So, jetzt was schwereres:
Die Struktur habe ich mal wieder geändert:
struct flightdata{ int numcities; // speichert die anzahl der Flughäfen int *distances; // speichert die entfernungen(funktioniert jetzt so) char **airports; // speichert eine Liste von Strings(Flughafennamen) };
So, mit numcities und distances gibt es kein Problem mehr.
Airports scheint auch korrekt zu initialisieren.
Zumindest, wenn ich am Ende meiner Funktion, die eine Variable vom Typ struct flightdata erzeugt alles ausprinte, ist auch alles so, wie es sein soll.
Sobal ich allerdings über die Rückgabe auf die felder des struct zugreifen will gibt es Probleme(Hieroglyphen statt Texte wie "London"). Seltsamerweise nur bei airports.
Dann habe ich mal die adresse von airports vor der rückgabe(also in der funktion) ausgedruckt und dann direkt, nachdem die fertig initialisierte Variable zurückgegeben wurde. Die Adressen waren identisch. Also scheinbar geht der Inhalt verloren. Warum ist das so?Falls das hilft, hier mal ein Abriss der beteiligten Funktionen:
Das wäre die Funktion die so eine Instanz von struct flightdata erstellt und den pointer darauf zurückgibt:
struct flightdata *getflightdata(int num){ struct flightdata thedata; struct flightdata *result=&thedata; // 1. schreib jede Menge Zeug in thedata // 2. drucke Alles aus unter anderem dies: printf("&(result->airports[0]): %p\n",&(result->airports[0])); printf("result->airports[0]: %s\n",result->airports[0]); return result;
Und hier die Aufrufende Funktion:
struct flightdata *theflights; // mache jede Menge anderes Zeug theflights=getflightdata(num_airports); printf("&(theflights->airports[0]): %p\n",&(theflights->airports[0])); printf("theflights->airports[0]: %s\n",theflights->airports[0]); // mache jede Menge anderes Zeug
Hier mal eine Beispielausgabe an der betroffenen Stelle:
Hattest recht, danke
So, jetzt was schwereres:
Die Struktur habe ich mal wieder geändert:
struct flightdata{ int numcities; // speichert die anzahl der Flughäfen int *distances; // speichert die entfernungen(funktioniert jetzt so) char **airports; // speichert eine Liste von Strings(Flughafennamen) };
So, mit numcities und distances gibt es kein Problem mehr.
Airports scheint auch korrekt zu initialisieren.
Zumindest, wenn ich am Ende meiner Funktion, die eine Variable vom Typ struct flightdata erzeugt alles ausprinte, ist auch alles so, wie es sein soll.
Sobal ich allerdings über die Rückgabe auf die felder des struct zugreifen will gibt es Probleme(Hieroglyphen statt Texte wie "London"). Seltsamerweise nur bei airports.
Dann habe ich mal die adresse von airports vor der rückgabe(also in der funktion) ausgedruckt und dann direkt, nachdem die fertig initialisierte Variable zurückgegeben wurde. Die Adressen waren identisch. Also scheinbar geht der Inhalt verloren. Warum ist das so?Falls das hilft, hier mal ein Abriss der beteiligten Funktionen:
Das wäre die Funktion die so eine Instanz von struct flightdata erstellt und den pointer darauf zurückgibt:
struct flightdata *getflightdata(int num){ struct flightdata thedata; struct flightdata *result=&thedata; // 1. schreib jede Menge Zeug in thedata // 2. drucke Alles aus unter anderem dies: printf("&(result->airports[0]): %p\n",&(result->airports[0])); printf("result->airports[0]: %s\n",result->airports[0]); return result;
Und hier die Aufrufende Funktion:
struct flightdata *theflights; // mache jede Menge anderes Zeug theflights=getflightdata(num_airports); printf("&(theflights->airports[0]): %p\n",&(theflights->airports[0])); printf("theflights->airports[0]: %s\n",theflights->airports[0]); // mache jede Menge anderes Zeug
Hier mal eine Beispielausgabe an der betroffenen Stelle:
Hattest recht, danke
So, jetzt was schwereres:
Die Struktur habe ich mal wieder geändert:
struct flightdata{ int numcities; // speichert die anzahl der Flughäfen int *distances; // speichert die entfernungen(funktioniert jetzt so) char **airports; // speichert eine Liste von Strings(Flughafennamen) };
So, mit numcities und distances gibt es kein Problem mehr.
Airports scheint auch korrekt zu initialisieren.
Zumindest, wenn ich am Ende meiner Funktion, die eine Variable vom Typ struct flightdata erzeugt alles ausprinte, ist auch alles so, wie es sein soll.
Sobal ich allerdings über die Rückgabe auf die felder des struct zugreifen will gibt es Probleme(Hieroglyphen statt Texte wie "London"). Seltsamerweise nur bei airports.
Dann habe ich mal die adresse von airports vor der rückgabe(also in der funktion) ausgedruckt und dann direkt, nachdem die fertig initialisierte Variable zurückgegeben wurde. Die Adressen waren identisch. Also scheinbar geht der Inhalt verloren. Warum ist das so?Falls das hilft, hier mal ein Abriss der beteiligten Funktionen:
Das wäre die Funktion die so eine Instanz von struct flightdata erstellt und den pointer darauf zurückgibt:
struct flightdata *getflightdata(int num){ struct flightdata thedata; struct flightdata *result=&thedata; // 1. schreib jede Menge Zeug in thedata // 2. drucke Alles aus unter anderem dies: printf("&(result->airports[0]): %p\n",&(result->airports[0])); printf("result->airports[0]: %s\n",result->airports[0]); return result;
Und hier die Aufrufende Funktion:
struct flightdata *theflights; // mache jede Menge anderes Zeug theflights=getflightdata(num_airports); printf("&(theflights->airports[0]): %p\n",&(theflights->airports[0])); printf("theflights->airports[0]: %s\n",theflights->airports[0]); // mache jede Menge anderes Zeug
Hier mal eine Beispielausgabe an der betroffenen Stelle:
Hattest recht, danke
So, jetzt was schwereres:
Die Struktur habe ich mal wieder geändert:
struct flightdata{ int numcities; // speichert die anzahl der Flughäfen int *distances; // speichert die entfernungen(funktioniert jetzt so) char **airports; // speichert eine Liste von Strings(Flughafennamen) };
So, mit numcities und distances gibt es kein Problem mehr.
Airports scheint auch korrekt zu initialisieren.
Zumindest, wenn ich am Ende meiner Funktion, die eine Variable vom Typ struct flightdata erzeugt alles ausprinte, ist auch alles so, wie es sein soll.
Sobal ich allerdings über die Rückgabe auf die felder des struct zugreifen will gibt es Probleme(Hieroglyphen statt Texte wie "London"). Seltsamerweise nur bei airports.
Dann habe ich mal die adresse von airports vor der rückgabe(also in der funktion) ausgedruckt und dann direkt, nachdem die fertig initialisierte Variable zurückgegeben wurde. Die Adressen waren identisch. Also scheinbar geht der Inhalt verloren. Warum ist das so?Falls das hilft, hier mal ein Abriss der beteiligten Funktionen:
Das wäre die Funktion die so eine Instanz von struct flightdata erstellt und den pointer darauf zurückgibt:
struct flightdata *getflightdata(int num){ struct flightdata thedata; struct flightdata *result=&thedata; // 1. schreib jede Menge Zeug in thedata // 2. drucke Alles aus unter anderem dies: printf("&(result->airports[0]): %p\n",&(result->airports[0])); printf("result->airports[0]: %s\n",result->airports[0]); return result;
Und hier die Aufrufende Funktion:
struct flightdata *theflights; // mache jede Menge anderes Zeug theflights=getflightdata(num_airports); printf("&(theflights->airports[0]): %p\n",&(theflights->airports[0])); printf("theflights->airports[0]: %s\n",theflights->airports[0]); // mache jede Menge anderes Zeug
Hier mal eine Beispielausgabe an der betroffenen Stelle:
Hattest recht, danke
So, jetzt was schwereres:
Die Struktur habe ich mal wieder geändert:
struct flightdata{ int numcities; // speichert die anzahl der Flughäfen int *distances; // speichert die entfernungen(funktioniert jetzt so) char **airports; // speichert eine Liste von Strings(Flughafennamen) };
So, mit numcities und distances gibt es kein Problem mehr.
Airports scheint auch korrekt zu initialisieren.
Zumindest, wenn ich am Ende meiner Funktion, die eine Variable vom Typ struct flightdata erzeugt alles ausprinte, ist auch alles so, wie es sein soll.
Sobal ich allerdings über die Rückgabe auf die felder des struct zugreifen will gibt es Probleme(Hieroglyphen statt Texte wie "Airport#0"). Seltsamerweise nur bei airports.
Dann habe ich mal die adresse von airports vor der rückgabe(also in der funktion) ausgedruckt und dann direkt, nachdem die fertig initialisierte Variable zurückgegeben wurde. Die Adressen waren identisch. Also scheinbar geht der Inhalt verloren. Warum ist das so?Falls das hilft, hier mal ein Abriss der beteiligten Funktionen:
Das wäre die Funktion die so eine Instanz von struct flightdata erstellt und den pointer darauf zurückgibt:
struct flightdata *getflightdata(int num){ struct flightdata thedata; struct flightdata *result=&thedata; // 1. schreib jede Menge Zeug in thedata // 2. drucke Alles aus unter anderem dies: printf("&(result->airports[0]): %p\n",&(result->airports[0])); printf("result->airports[0]: %s\n",result->airports[0]); return result;
Und hier die Aufrufende Funktion:
struct flightdata *theflights; // mache jede Menge anderes Zeug theflights=getflightdata(num_airports); printf("&(theflights->airports[0]): %p\n",&(theflights->airports[0])); printf("theflights->airports[0]: %s\n",theflights->airports[0]); // mache jede Menge anderes Zeug
Hier mal eine Beispielausgabe an der betroffenen Stelle:
&(result->airports[0]): 0041036c result->airports[0]: Airport#0 &(theflights->airports[0]): 0041036c theflights->airports[0]: *&$~#... // irgendwelche Hieroglyphen eben
Wäre dankbar, wenn mir jemand auf die Sprünge hilft. Ich kanns absolut nicht nachvollziehen.
MFG Orb
-
Hattest recht, danke
So, jetzt was schwereres:
Die Struktur habe ich mal wieder geändert:
struct flightdata{ int numcities; // speichert die anzahl der Flughäfen int *distances; // speichert die entfernungen(funktioniert jetzt so) char **airports; // speichert eine Liste von Strings(Flughafennamen) };
So, mit numcities und distances gibt es kein Problem mehr.
Airports scheint auch korrekt zu initialisieren.
Zumindest, wenn ich am Ende meiner Funktion, die eine Variable vom Typ struct flightdata erzeugt alles ausprinte, ist auch alles so, wie es sein soll.
Sobal ich allerdings über die Rückgabe auf die felder des struct zugreifen will gibt es Probleme(Hieroglyphen statt Texte wie "Airport#0"). Seltsamerweise nur bei airports.
Dann habe ich mal die adresse von airports vor der rückgabe(also in der funktion) ausgedruckt und dann direkt, nachdem die fertig initialisierte Variable zurückgegeben wurde. Die Adressen waren identisch. Also scheinbar geht der Inhalt verloren. Warum ist das so?Falls das hilft, hier mal ein Abriss der beteiligten Funktionen:
Das wäre die Funktion die so eine Instanz von struct flightdata erstellt und den pointer darauf zurückgibt:
struct flightdata *getflightdata(int num){ struct flightdata thedata; struct flightdata *result=&thedata; // 1. schreib jede Menge Zeug in thedata // 2. drucke Alles aus unter anderem dies: printf("&(result->airports[0]): %p\n",&(result->airports[0])); printf("result->airports[0]: %s\n",result->airports[0]); return result;
Und hier die Aufrufende Funktion:
struct flightdata *theflights; // mache jede Menge anderes Zeug theflights=getflightdata(num_airports); printf("&(theflights->airports[0]): %p\n",&(theflights->airports[0])); printf("theflights->airports[0]: %s\n",theflights->airports[0]); // mache jede Menge anderes Zeug
Hier mal eine Beispielausgabe an der betroffenen Stelle:
&(result->airports[0]): 0041036c result->airports[0]: Airport#0 &(theflights->airports[0]): 0041036c theflights->airports[0]: *&$~#... // irgendwelche Hieroglyphen eben
Wäre dankbar, wenn mir jemand auf die Sprünge hilft. Ich kanns absolut nicht nachvollziehen.
MFG Orb