Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem mit realloc

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
20.09.2004, 23:30 Uhr
Drager



hoi

also ich hab da ein problem , dass mich etwas verwundert, ich gebe mal eine kurzen ausschnitt meines programms:


C++:

void main()
{
    char** bla = new char*[15];
    .....
    TextureInit(bla);

}

void TextureInit(char** Textureindex)
{

   ....
   Textureindex = (char**) realloc(Textureindex,newsize * sizeof(char*));
   Textureindex[i] = new char[bla];
   ....

}




so das ganze funktioniert auch wunderbar, solange ich in der funktion bleibe (hab mir mal alle werte ausgeben lassen und waren alle korrekt ), sobald ich in die main-funktion zurückspringe aus der ich "TextureInit" aufgerufen habe, stimmt nichts mehr..(adressen von den char* feld sind fast alle inkorrekt)

eigendlich sollte ich doch wenn ich auf Textureindex zugreife, auch auf den neuen speicher zurgriefen können oder? da ich ja einen referenz übergeben habe... das komische ist , dass ein teil des speichers stimmt und ein andere teil nicht, auch wenn ich z.b. eine Liste anlege , in der ich jeder Adresse von Textureindex[i] (buffer[i] = &Textureindex[i]) speichere und dann in der main-funktion, Textureindex[i] auf diese gespeicherte Liste setze funktioniert das auch (sprich in der oberen funktion : Textureindex[i] = buffer[i] (buffer ist die liste mit den adressen))

also ich rufe dazwischen nichts mehr auf, ich springe nur in die obere funktion zurück, und schon stimmen die adressen des char* feldes nicht mehr...

kann mir da wer helfen?

p.s. ich weiss das der code nicht sauber ist , sprich weder abfrage ob realloc geklappt hat, noch benutze ich einen weiteren char** zeiger für realloc , aber auch wenn ich das ändere nützt das nix (bzw. kein realloc == NULL tritt auf..)

mfg

Drager


Bearbeitung von typecast:
code-Tags durch cpp-Tags ersetzt

Dieser Post wurde am 20.09.2004 um 23:52 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.09.2004, 00:13 Uhr
Pablo
Supertux
(Operator)


Igit.... es heißt 1. int main()

2. On the left corner malloc with 700 pounds versus new on the right corner.

Junge, entweder du benutzt malloc/free oder new/delete, aber eine Mischung und mit den selben Pointers ist keine gute Idee, vor allem, weil der Speicher durch new schon reserviert wird, somit nie frei gegeben wird.

Ich verstehe wirklich nicht, was du da machen willst. Wozu reservierst du Speicher mit new und danach schickst du den Pointer in die Funktion und reservierst den Speicher neu aber mit malloc? Und dann nochmal mit new Speicher reservieren? Wozu reservierst du so viel Speicher? Was willst du überhaupt machen?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 21.09.2004 um 00:19 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.09.2004, 00:19 Uhr
Drager




Zitat:
2. On the left corner malloc with 700 pounds versus new on the right corner.



Zitat:
Junge, entweder du benutzt malloc/free oder new/delete, aber eine Mischung und mit den selben Pointers ist keine gute Idee, vor allem, weil der Speicher durch new schon reserviert wird, somit nie frei gegeben wird.


und wie kann ich realloc mit new nachahmen? ohne memcpy etc.?


Zitat:
Ich verstehe wirklich nicht, was du da machen willst. Wozu reservierst du Speicher mit new und danach schickst du den Pointer in die Funktion und reservierst den Speicher neu aber mit malloc? Was willst du machen?



malloc? hab ich nie benutzt.. ich erweiter den speicher mit realloc da:

ich reserviere am anfang einen speicher für texturen die ich per hand eingebe (das sind die bla[15]) , danach lade ich daten von einer VRML datei in der neue Texturen enthalten sind, und damit ich die neuen Texturen auch laden kann, muss ich sie in das Textureindex feld eintragen, darum erweitere ich für jede neue Texture dieses Feld und trage dort den Dateinamen der Texture ein.... das 2te new ist ja für den Namen der datei... dazu brauch ich ja ein feld von chars...

Dieser Post wurde am 21.09.2004 um 00:25 Uhr von Drager editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.09.2004, 00:29 Uhr
Pablo
Supertux
(Operator)


Wie gesagt, du solltest entweder die malloc/realloc/free Variante nehmen, oder die new/delete Variante. Ich kenn C++ nicht, deshalb weiß ich nicht, wie man mit C++ realloc realisieren kann. Aber ich kann C und damit kann ich dir helfen. Allerdings wenn du C++ Code haben willst, würde ich auf eine Erklärung verzichten.

Das größte Problem ist, dass du dein Speicher mehrmals reservierst. Wenn TextureInit dazu dient, die Texturen zu estellen, also den Speicher zu reservieren, dann brauchst du nicht Speicher bei der Deklararion zu reservieren.


C++:
int main()
{
    char** texturen;
    TextureInit(texturen);
}



Was ich aber auch nicht so richtig verstehe: Wie sollen die Texturen aussehen? Also ich meine, TextureInit bekommt einen 2-fachen Pointer, aber wie soll er reserviert werden?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.09.2004, 00:39 Uhr
Drager




Zitat von Pablo:
Wie gesagt, du solltest entweder die malloc/realloc/free Variante nehmen, oder die new/delete Variante. Ich kenn C++ nicht, deshalb weiß ich nicht, wie man mit C++ realloc realisieren kann. Aber ich kann C und damit kann ich dir helfen. Allerdings wenn du C++ Code haben willst, würde ich auf eine Erklärung verzichten.?


ich verstehe beides... kannst ruhig c verwenden...


Zitat von Pablo:

Das größte Problem ist, dass du dein Speicher mehrmals reservierst. Wenn TextureInit dazu dient, die Texturen zu estellen, also den Speicher zu reservieren, dann brauchst du nicht Speicher bei der Deklararion zu reservieren.


das tue ich doch garnicht! ich reserviere den speicher in der main und schreibe dann auch was hinein (hab ich nur bei dem quellcode der übersichtshalber weggelassen)
dann rufe ich eine funktion auf die weitere Texturen hinzufügen soll, und darum brauche ich ein groesseres feld, also realloc...


Zitat von Pablo:

Was ich aber auch nicht so richtig verstehe: Wie sollen die Texturen aussehen? Also ich meine, TextureInit bekommt einen 2-fachen Pointer, aber wie soll er reserviert werden



also ich speicher in dem feld NUR den namen der Texture, das laden der Texture selber kommt dann später, aber ich möchte alle meine Texturen auf einmal laden, dazu verknüpfe ich sie alle in einem Feld... und ich brauche ja um mehrer namen in einem feld zu speichern, eine char** der auf die einzelnen namen (feld von char*) zeigt, und jeder namen besteht ja dann aus einem feld von chars...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.09.2004, 00:54 Uhr
Pablo
Supertux
(Operator)



Zitat von Drager:
und jeder namen besteht ja dann aus einem feld von chars...


also quasi ein "Array" von chars*. gut

Wie viele Felder? 15? Welche Länge für den Pfad bzw. Dateiname?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.09.2004, 01:00 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Drager
guck dir mal std::string und std::vector an, dann kannst du dir die ganze allokierei auch sparen die machen das automatisch für dich

also wenn du ein array von strings haben willst einfach


C++:
std::vector<std::string> mystringarray;



einfügen eines elementes dann einfach mit push_back, der allokiert von selber nach wenn nicht genug platz ist... musst dich um solche spielereien gar nicht kümmern... wenn man schon c++ nutzt sollte man sich nicht mehr freiwillig mit kranken c-konstrukten rumärgern es sei denn man macht das auch sportlichen ehrgeiz weil das programm sonst nur noch nen 5 zeiler ist und man nicht weiss was man sonst noch coden könnte...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 21.09.2004 um 01:01 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.09.2004, 01:08 Uhr
Pablo
Supertux
(Operator)


@Drager: wenn du sowieso C++ programmierst, würde ich auf Windalfs Rat hören, das kling sehr vernünftig.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.09.2004, 11:06 Uhr
virtual
Sexiest Bit alive
(Operator)


@Drager
1. Du wendest realloc falsch an (wenn es schief geht, gibts ein nettes Speicherloch)
2. realloc in C++ , also sowas wie "renew" gibt es nicht.
3. Das, was du gezeigt hast, läßt schon - wie pablo erwähnte - darauf schliessen, daß Du new und realloc mischt. Großes nono. (In main wird new gemacht und der Pointer an die Funktion mit dem realloc weitergereicht).
4. Du hast ein Problem mit dem Rückgabewert, weil Du nur die Kopie veränderst. Du sollest einen call by reference machen, in C++ also eine Referenz, in C einen Pointer verwenden. Siehe hierzu auch: www.fun-soft.de/showtopic.php?threadid=1958
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 21.09.2004 um 11:07 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.09.2004, 11:53 Uhr
Drager




Zitat von virtual:
@Drager
1. Du wendest realloc falsch an (wenn es schief geht, gibts ein nettes Speicherloch)


ja weiss ich, hab ich aber auch schon verändert , hat nix gebracht (mit abfrage auf NULL und zweiten pointer..)

Zitat von virtual:
2. realloc in C++ , also sowas wie "renew" gibt es nicht.

hab ich mir gedacht


Zitat von virtual:
3. Das, was du gezeigt hast, läßt schon - wie pablo erwähnte - darauf schliessen, daß Du new und realloc mischt. Großes nono. (In main wird new gemacht und der Pointer an die Funktion mit dem realloc weitergereicht).

hab mal alles auf malloc geändert.. hat aber auch nix gebracht...


Zitat von virtual:

4. Du hast ein Problem mit dem Rückgabewert, weil Du nur die Kopie veränderst. Du sollest einen call by reference machen, in C++ also eine Referenz, in C einen Pointer verwenden. Siehe hierzu auch: www.fun-soft.de/showtopic.php?threadid=1958


hm ich hab doch den pointer übergeben... oder hab ich da nen fehler im oben angebenen quellcode???

@ Windalf:

ja aber ich bin net so ein fan von der vektor classe, ich schreib das alles immer lieber per hand...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: