Strukturen und Dynamische Arrays
-
Hi!
Ich habe probleme mit der allozierung von Speicherplatz eines Dynamischen Arrays!
- Ich habe zwei Strukturen
struct s_playlist { /** Playlist Dynamisches Array*/ Tracks * PL; /** Lieder in Playlist */ unsigned int TRACKS; /** Max Lieder in Playlist. */ unsigned int MAXTRACKS; };
struct s_Tracks { /** Dauer in sec */ unsigned int Dauer; /*Automatisch vergebene ID*/ unsigned int Id; /*Titel des Tracks*/ char * Titel; };
Nun hab ich aber schon Probleme mit der erstellung des Dynamischen Array!
Wie alloziere ich den Speicherplatz richtig????Wie kann man die einzelnen Tracks dann in Pl einfuegen??
mit PL[0] ..PL[5] usw????*THX*
-
Thes-One schrieb:
Nun hab ich aber schon Probleme mit der erstellung des Dynamischen Array!
Wie alloziere ich den Speicherplatz richtig????mit malloc() oder calloc().
Wie kann man die einzelnen Tracks dann in Pl einfuegen??
mit PL[0] ..PL[5] usw????Ja - du mußt nur auf Index-Überläufe aufpassen.
-
Ja das allozieren habe ich soo gemacht!
typedef struct s_playlist Playlist;
typedef struct s_Tracks Tracks;
Playlist * new; new->PL = calloc(size,sizeof(Tracks) );
Ist das den soweit richtig????
Nun habe ich aber eine Funktion in der ich einen Track in das zuvor erstelle Dynamische Array einfuege!
Das bekomme ich aber nicht hin, da ich nicht weiß wie ich das einfuege ohne den Track der zuvor eingefuegt wurde zu ueberschreiben!
-
Dafür gibt es dann die Funktion realloc(). Diese kopiert die alten Daten in den neu angeforderten (vergrößerten) Speicher und du kannst dann die neuen Daten einfügen (hinter die alten Daten).
-
Nein den Speicherplatz muss ich zuvor komplett allokieren!
Dann werden in einer Funktion Werte aus einer Datei ausgelesen!
Diese Werte werden dann in einer weiteren Funktion in das Dynamische Array eingefuegt!Die Werte werden auch alle richtig eingefuegt, nur wenn ich aus der Funktion heraus springe und dann wieder in der Main lande, beeinhaltet die Variable (Dyn Array) nur noch den aller ersten Wert!
Ich weiß net warum!
-
Thes-One schrieb:
Playlist * new; new->PL = calloc(size,sizeof(Tracks) );
Ist das den soweit richtig????
nein. So wie du da hast, zeigt 'new' ins Nirvana und ein Zugriff auf new->PL ist undefiniert (endet meistens mit segfault).
-
Thes-One schrieb:
typedef struct s_playlist Playlist;
typedef struct s_Tracks Tracks;
Playlist * new; new->PL = calloc(size,sizeof(Tracks) );
Ist das den soweit richtig????
komplett verkehrt.
so in etwa:Playlist *new; new = calloc (anzahl_der_playlists, sizeof(Playlist));
und wenn du danach speicher für die tracks in den playlists brauchst:
new[0].Tracks = calloc (anzahl_der_tracks_fuer_playlist_0, sizeof(Tracks)); new[1].Tracks = calloc (anzahl_der_tracks_fuer_playlist_1, sizeof(Tracks)); // ... usw...
-
Hmmm!
Ich will ja nicht mehrer Playlists, sondern ich habe eine Playlist und möchte in der Playlist mehrere Tracks haben!
Playlist *new; new = calloc (1, sizeof(Playlist));
new.Tracks[0] = calloc (1, sizeof(Tracks)); new.Tracks[1] = calloc (1, sizeof(Tracks));
Müsste dann doch so sein oder????
-
Wenn du nur eine Playlist brauchst, mußt du nicht mit Zeigern hantieren:
Playlist liste; liste.PL = calloc(anzahl,sizeof(Tracks)); liste.PL[0].Dauer = ...; ...
-
Genauso mache ich es auch!
Nur das Problem besteht ja noch!
Ich fülle die Liste mit den Werten, die Werte sind dann auch drin das hab ich überprüft nur wenn ich zurück in die Main springe sind alle Werte weg ausser der erste!
-
Wie übergibst du denn deine Playlist zwischen main() und der anderen Funktion?
-
Per Parameter!
Also ....
-> listefuellen(Playlist * liste,....)
Ich rufe die Funktion in der main so auf!
->listefuelle(&liste,...);
-
Zeig doch mal bitte etwas zusammenhängenden Code
(und eine detaillierte Beschreibung des Fehlers)
-
Ich würde dir ja gerne den ganzen Code schicken um dir den Fehler zu zeigen!
Gibt es hier nicht sowas wie PM???Ich möchte / darf nämlich nicht meinen Code hier präsentieren!!!
Ist halt eine Schul Aufgabe!!
-
Nein, hier gibt's keine PM - und selbst wenn du es mir schicken würdest, würde ich den Code erstmal hier veröffentlichen
(für andere hilfsbereite User)
Aber es reicht aus, wenn du den Code auf ein Minimum beschränkst - solange das zusammenhängend ist.
-
Gut zu wissen!
Also.......
int main (int argc, char * argv[]){ FILE * Datei = fopen (argv[1], "r");; Playlist * Liste=NULL; listefuelle(&liste,Datei); /*Hier Teste ich ob die Werte richtig angekommen sind*/ for (i=0;i<Liste->Tracks;i++){ printf("%u",&Liste->Pl[i].Dauer); } /*Komische Ausgabe -> nicht die Werte mit denen es gefüllt wurde*/ /*Erster eingelesener Track ist enthalten rest nicht!*/ }
void listefuelle(Playlist * liste,FILE * file){ /*Zeilen in Datei Zaehlen*/ ..... /*Speicherplatz für "Zeilen" Tracks reservieren -> pro Zeile ein Track*/ ..... /*Zeile für Zeile abarbeiten*/ /* *liste mit Werten füllen*/ /*Hier setze ich z.B Liste->Tracks einen höher, da eine Zeile ohne Fehler verarbeitet wurde und somit ein track eingefügt wurde*/ /*Hier Teste ich ob die Werte richtig gespeichert wurden*/ for (i=0;i<Liste->Tracks;i++){ printf("%u",&Liste->Pl[i].Dauer); } /*Die Werte wurden alle richtig gespeichert*/ }
Ich hoffe jetzt ist klar was überhaupt der Fehler ist!
Also die Variable kommt irgendwie Fehlerhaftig oder einfach nicht komplett wieder zurück in die Main!
*THX*
-
Das geht durch den Compiler? Du übergibst die Adresse eines Zeigers an die Funktion anstatt des Zeigers.
(btw, die Bezeichnungen passen nicht so ganz zu den Definitionen aus dem Eröffnungsbeitrag)
-
Ja mein Kompiler sagt nix!
Hab natürlich auch alles ausgestellt, Warnungen und Fehler da sonst immer bei sscanf usw. nen Fehler kommt das "sscanf ist veraltet" oder so!Ich kann dort irgendwie nur die Adresse des Zeigers übergeben, sonst mekkert er!
-
Was ist denn das für ein komischer Compiler? (btw, Warnungen ausschalten kann ich noch verstehen, aber FEHLER?)
richtig wäre sowas:
PlayList liste; listefuelle(&liste,...);
-
Oh man!!
Gut das es Leute wie dich gibt, die so dummen Pansen wie mir helfen!
DANKE