array pro schleifen durchlauf erweitern
-
Guten Tag verehrte Gemeinschaft,
ich habe ein kleines Problem mit C
ich bin noch neu in dieser Programmiersprache und blicke es noch nicht ganz wie ich ein Array von einem selbst erstellen Datentyp dynamisch erweitern kann.
hier erstmal meine bisherigen überlegungen:
lin *feld; //Feld erzeugen vom typ lin while(fread(&lines, sizeof(sLine), 1, data) != NULL) { feld = malloc(1*sizeof(lin)); lin *newFeld = new lin(lines.x1,lines.y1,lines.x2,lines.y2,lines.r,lines.g,lines.r); } feld += newFeld;
also ich lese aus einer datei daten, die länge der datei weiß ich nicht, ich möchte nun das pro durchlauf immer die aktuelle zeile wieder zu meinem array hinzugefügt wird. mir ist klar das ich theoretisch einen vector nehmen könnte, da es sich aber um ein theoretisches problem handelt und ich ein verständniss für die sprache entwickeln möchte, würde ich es gerne mit einem array machen wollen. könnt ihr mir evtl. ein paar tipps geben.
gruß
paulrabbit
-
Dafür gibt es realloc, das vergrößert/verkleinert den angegebenen Speicherbereich auf einen vorgegebenen Wert.
new ist C++ und hat hier nichts zu suchen:int z=1; lin *feld=malloc(sizeof*feld); while( fread(&feld[z-1],sizeof*feld,1,f) ) { feld=realloc(feld,++z*sizeof*feld); } printf("Es wurden %d Felder gelesen",z-1);
-
ok, erstmal danke für die schnelle antwort ... aber so richtig funktioniert das noch nicht ...
also wenn ich das ganze teste dann bekommen ich eine zugriffsverletzung und das programm stürzt ab
ich sehe auch gar nicht woher der compiler nun weiß das es sich um ein Array des Typs lin handelt?
-
sry, hatte noch etwas vergessen
lin *feld=malloc(sizeof*feld);
Fehlermeldung: a value of type "void*" cannot be used to initialize an entity of type "lin *"
-
paulrabbit schrieb:
sry, hatte noch etwas vergessen
lin *feld=malloc(sizeof*feld);
Fehlermeldung: a value of type "void*" cannot be used to initialize an entity of type "lin *"Du benutzt einen C++-Compiler um C zu compilieren. Das geht vielleicht bei ganz einfachen Programmen noch gut, hier aber schon nicht mehr. So abwärtskompatibel wie es gerne behauptet wird, ist C++ nämlich dann doch nicht (und wird es immer weniger).
-
SeppJ schrieb:
Du benutzt einen C++-Compiler um C zu compilieren.
Das C stammt von Wutz. Der OP schreibt ursprünglich in C++, wie am
new
zu erkennen ist.
-
Bashar schrieb:
SeppJ schrieb:
Du benutzt einen C++-Compiler um C zu compilieren.
Das C stammt von Wutz. Der OP schreibt ursprünglich in C++, wie am
new
zu erkennen ist.Er hat ein einziges new, welches C++ ist, in einem Code dr die C-Standardbibliothek benutzt und er fragt im C-Forum. Ja, wir alle kennen zu genüge diese Krankheit der Sprachmischung, aber hier deuten die Symptome meiner Meinung darauf hin, dass es C sein soll und er sich vermutlich bei Internettutorials mit C++ angesteckt hat. edit: Das
feld = malloc...
im Originalcode kann kein C++ sein.
-
SeppJ schrieb:
Er hat ein einziges new, welches C++ ist, in einem Code dr die C-Standardbibliothek benutzt und er fragt im C-Forum.
Und:
paulrabbit schrieb:
ich habe ein kleines Problem mit C
-
ich finde es gut das ihr darüber diskutiert, was ich so nicht richtig mache, aber wäre trotzdem nett, wenn ihr mir bei meinem problem unter die arme greifen könntet.
-
paulrabbit schrieb:
ich finde es gut das ihr darüber diskutiert, was ich so nicht richtig mache, aber wäre trotzdem nett, wenn ihr mir bei meinem problem unter die arme greifen könntet.
Was ist denn an
SeppJ schrieb:
Du benutzt einen C++-Compiler um C zu compilieren.
noch unklar? Behebe dies und Wutz' Beispiellösung wird funktionieren.
-
irgendwie komme ich immer noch nicht klar
habe jetzt nochmal ein wenig mehr, keine ahnung ob das problem soweit verstanden wird
... aber das dynamicArray vom typ lin soll bei jedem schleifendurchlauf um eins erhöht werden, so dass das feld immer weiter gefüllt wird, leider stürzt das programm noch immer ab.
int z=0; lin* dynamicArray; while(fread(&lines, sizeof(sLine), 1, data) != NULL) { fread(&lines, sizeof(sLine), 0, data); dynamicArray = (lin *) malloc (1*sizeof(lin)); lin retVal(lines.x1,lines.y1,lines.x2,lines.y2,lines.r,lines.g,lines.b); dynamicArray[z] = retVal; ++z; }
Dabei sieht lin so aus:
class lin { short x1,y1,x2,y2; unsigned char r,g,b; public: lin(void); lin(short X1, short Y1, short X2, short Y2, char R, char G, char B); ~lin(); void setX1(short X1); void setY1(short Y1); void setX2(short X2); void setY2(short Y2); void setR(char R); void setG(char G); void setB(char B); short getX1(); short getY1(); short getX2(); short getY2(); char getR(); char getG(); char getB(); };
-
Was denn nun, C oder C++? Dein erster Code sieht aus wie C, der zweite ist eine C++-Klasse mit nicht-trivialem Konstruktor und Destruktor. Und du machst trotzdem ein malloc für diese Klasse.
Was wunderst du dich denn da noch, dass dies nicht funktioniert?
Du musst dich schon für eine Sprache entscheiden, C und C++ arbeiten überhaupt nicht gut zusammen.