PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit new (C++)



SeeksTheMoon
24-06-2003, 20:20
Ich hab ein Problem mit new in C++. Ich habe zwei Zeiger, die mal Arrays werden sollen (datenfeld und tempFeld). tempFeld soll immer 1 int größer sein als datenFeld.
In einer Schleife (die n Durchläufe hat) soll pro Durchlauf ein integer eingelesen werden und ins datenfeld geschrieben werden.
Nachdem das geschehen ist, soll das Datenfeld um 1 vergrößert werden, um im eventuellen nächsten Durchlauf die nächste Zahl aufnehmen zu können.
Die Schleife terminiert bei EOF-Zeichen.

Warum funktioniert mein Code nicht (die Felder wachsen nicht an)?

Kann new das Feld nicht automatisch vergrößern (und den bisherigen Inhalt übernehmen) so wie realloc?
Deshalb mache ich diese Kopieraktionen mit tempFeld und gebe den Speicher immer frei und lege dann einen größeren an und kopiere wieder zurück.

Das Programm geht eigentlich noch weiter; dort brauche ich das datenfeld und dessen Anzahl der Einträge.



#include <stdlib.h>
#include <iostream>
using namespace std;

int main()
{
int *datenfeld=new int;
int *tempFeld=new int[2];
int datenAnzahl=0;

int eingabe;
int index=0;
cout<<"Bitte gib die Zahlen ein!"<<endl;
cin >> eingabe;

while(!cin.eof())
{

datenfeld[index] = eingabe;
datenAnzahl = sizeof(datenfeld);

for(int i=0;i<sizeof(datenfeld)/sizeof(int);i++)
tempFeld[i]=datenfeld[i];
index++;
delete[] datenfeld;
datenfeld=new int[index];

for(int i=0;i<sizeof(datenfeld)/sizeof(int);i++)
datenfeld[i]=tempFeld[i];

delete[] tempFeld;
datenfeld=new int[index+1];

cin >> eingabe;

}

wraith
24-06-2003, 22:09
>>Kann new das Feld nicht automatisch vergrößern (und den bisherigen Inhalt übernehmen) so wie realloc?
Nein,das kann new nicht.Dann nimm doch realloc,oder noch besser gleich std::vector,wenn du eh schon C++ programmierst.

Aber dein Fehler liegt in der Benutzung von sizeof.
sizeof wird (fast) immer zur Compilezeit ausgewertet,d.h.


sizeof(datenfeld);

immer 4 sein wird (auf einer Implementierung,die 4 Bytes für Zeiger verwendet).

Achja,eof() ist i.A. schlecht,besser fail() benutzen.
Bsp. bei der Eingabe kommt es zu einem Fehler,boom,du kommst nie wieder in eof,weil du in einem Fehlerzustand festhängst.

Und der korrekte Header ist cstdlib,nicht stdlib.h ;).

SeeksTheMoon
25-06-2003, 00:35
hey, genau was ich wissen wollte. Vectoren sind in Java auch besser als Arrays, darauf hätte ich in C++ auch kommen müssen.

Gibt es statt sizeof eine Funktion, um zur Runtime die Größe rauszufinden, oder muss ich das selber mit Zählvariablen implementieren?

Mit der cstdlib das is klar - ist ja auch kein Production-Code sondern nur so ein Uni-Schwachsinn.;)

Das eof is von meinem Prof; ich wusste doch, dass der nix drauf hat :D

quinte17
25-06-2003, 07:19
naja... vectoren sind in java im hintergrund auch nur arrays...

hast du schonmal überlegt selber eine lineare liste zu machen? mit structs und so?

bei http://www.pronix.de

findest du gute sachen dazu.... (dann kommst endlich auch mal von den arrays weg)

mfg

wraith
25-06-2003, 08:05
>>Gibt es statt sizeof eine Funktion, um zur Runtime die Größe rauszufinden?
Jain.Der Compiler muß ja irgendwo die Größe abspeichern,weil er die später fürs delete [] selber wieder braucht.
Wenn du weißt wo dein spezieller Compiler das macht,ok. (nein nicht o.k. ;) ).
Hier sind zwei Möglichkeiten beschrieben,wie er das machen könnte.
http://www.parashift.com/c++-faq-lite/compiler-dependencies.html#faq-37.7.

Dann müßte es auch eine Funktion des Betriebssystems geben,die für einen Zeiger die Größe des allokierten Speichers zurückliefert (die kenne ich aber nicht).

Das alles zeigt nur,nimm' lieber std::vector.
Eine eigene Liste würde ich nicht machen,weil eine Liste viele Nachteile gegenüber einem Array (vector) hat.

SeeksTheMoon
25-06-2003, 08:50
Original geschrieben von quinte17
naja... vectoren sind in java im hintergrund auch nur arrays...

ja, aber mit viel komfortableren Funktionen


Original geschrieben von quinte17

hast du schonmal überlegt selber eine lineare liste zu machen? mit structs und so?

bei http://www.pronix.de

findest du gute sachen dazu.... (dann kommst endlich auch mal von den arrays weg)

mfg

ist zu aufwändig für dieses Programm. Die eingegebenen Sachen sollen nachher durch einen Merge-Sort-Algorithmus gejagt werden und ich hab keine Lust auf wilde Zeiger-Gefechte mit Strukturen, weil ich dann dafür sorgen muss, dass die Liste zerlegbar, sortierbar und wieder zusammenfügbar ist.

anda_skoa
25-06-2003, 10:42
Original geschrieben von SeeksTheMoon
ist zu aufwändig für dieses Programm.

Ganz abgesehen davon, dass es in C++ schon eine Liste gibt: std::list

Aber wie wraith schon sagt, ist hier ein vector angebrachter.
Die aktuelle Länge eines vectors bekommt man mit size()

Ciao,
_