Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » 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
12.12.2005, 20:56 Uhr
~tester
Gast


Hi, ich hab ein Problem mit realloc. Und zwar möchte ich ein array wie folgt vergrößern:

Code:

frArr = (Fraction *) realloc(frArr, (sizeof(frArr)/sizeof(frArr[0]))*sizeof(Fraction));



Fraction ist eine Klasse. Und frArr ist ein Array der Klasse. Also so hier:

Code:

Fraction frArr[1];



Allersdings klappt das mit realloc nicht. Der Compiler gibt immer folgenden Fehler:

Zitat:
Auf der linken Seite einer Zuweisung muß ein L-Wert stehen, d.h. ein Ausdruck, dem etwas zugeordnet werden kann.

L-Werte können sein:
Numerische Variablen und Zeigervariablen.
Strukturkomponenten oder Indirektionen durch Zeiger.
Indizierte Array-Elemente.


Was mache ich falsch?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.12.2005, 00:15 Uhr
0xdeadbeef
Gott
(Operator)


realloc funktioniert nur mit Speicherbereichen auf dem heap, also Kram, der mit malloc alloziiert wurde. Das Array liegt auf dem Stack, da kannst du die Größe nicht nachträglich verändern. Davon ab willst du scheinbar dem Array die selbe Größe zuweisen, die es schon hat, das macht für mich jetzt wenig Sinn.

Wie dem auch sei, das läuft im Grunde so:

C++:
Fraction *p = malloc(10 * sizeof(Fraction)); /* 10 Elemente */
Fraction *tmp; /* um eventuelle Fehler zu behandeln */

/* ... */

tmp = realloc(p, 20 * sizeof(Fraction)); /* versuche, auf 20 Elemente zu erweitern */
if(tmp == NULL) {
  /* Fehler */
  fprintf(stderr, "Fehler bei realloc\n");
} else {
  /* realloc hat hingehauen */
  p = tmp;
  /* mit p weiterarbeiten */
}

free(p); /* Speicher freigeben */


Für den Fall, dass das in einer Schleife laufen soll, ist ganz interessant, dass realloc mit NULL als erstem Parameter sich wie malloc verhält und free(NULL) nichts macht. Das lässt sich ganz gut ausnutzen, zum Beispiel:

C++:
#include <stdio.h>
#include <stdlib.h>

int main(void) {
  int *arr = NULL, *tmp;
  int i;
  size_t len;

  for(len = 0; scanf("%d", &i) == 1 && i != 0; ++len) {
    tmp = realloc(arr, (len + 1) * sizeof(int));
    if(tmp == NULL) {
      fprintf(stderr, "Fehler bei realloc\n");
      break;
    }

    arr = tmp;
    arr[len] = i;
  }

  for(i = 0; i < len; ++i) {
    printf("%d ", arr[i]);
  }
  putchar('\n');

  free(arr);

  return 0;
}


Wobei dieses spezielle Beispiel natürlich ein bisschen verschwenderisch ist, weil es in jedem Durchlauf ein realloc macht. Aber naja, das Prinzip sollte klar werden.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 13.12.2005 um 00:26 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.12.2005, 08:52 Uhr
ao

(Operator)



Zitat von ~tester:
Auf der linken Seite einer Zuweisung muß ein L-Wert stehen, d.h. ein Ausdruck, dem etwas zugeordnet werden kann.

L-Werte können sein:
Numerische Variablen und Zeigervariablen.
Strukturkomponenten oder Indirektionen durch Zeiger.
Indizierte Array-Elemente.

Was mache ich falsch?

Deine linke Seite ist ein Array. Nimm einen Zeiger, und es geht.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.12.2005, 11:30 Uhr
Sponge



Fraction frArr[1];
frArr ist meines Wissens der Pointer zum Anfang des Array
man vergleiche folgendes....


C++:
int main (int argc, char * argv[]) {
    int bla[3];

    printf("bla = %d, &bla[0] = %d\n",bla,&bla[0]);
}



und man stellt fest.. es ist das gleiche!
--
Es gibt 10 Arten von Leuten:
die, die das binäre System verstanden haben,
und die, die es nicht verstanden haben ^^
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.12.2005, 11:50 Uhr
ao

(Operator)



Zitat von Sponge:
und man stellt fest.. es ist das gleiche!

Falsch. Man stellt fest: Du kennst nicht den Unterschied zwischen L-Value und R-Value.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.12.2005, 11:54 Uhr
0xdeadbeef
Gott
(Operator)


...und scheinbar auch nicht die zwischen Array und Pointer respektive Stack und Heap. Ein Array ist implizit in einen Pointer konvertibel, aber das ist auch schon alles. Versuch mal folgendes:

C++:
#include <stdio.h>

int main(void) {
    int bla[3];
    int *blubb;

    printf("sizeof(bla) = %d, sizeof(blubb) = %d\n", sizeof(bla), sizeof(blubb));

    return 0;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.12.2005, 12:27 Uhr
Sponge



ok ich geb mich geschlagen ....
so fast zumindest .. sicherlich hab ich nicht daran gedacht dass int bla[3] auf dem Stack liegt, jedoch kann man einem Pointer Speicher auf dem Stack zuweisen oder übersehe ich wieder etwas ?
sicher ... man kann bei int bla[3] .. dem bla nix anderes zuweisen

P.S. einen Unterschied zwischen L und R.. naja den sollte man schon kennen, jedoch verstehe ich den Zusammenhang zu diesem Problem hier ned so ganz um ehrlich zu sein ... oder vielleicht doch nur würde ich es vielleicht anders ausdrücken / verstehen

P.P.S. eigentlich fand ich dieses Forum sehr hilfreich und gut, da man guten Rat findet, wenn man welchen braucht, nur leider muss ich nun nach etwas mehr als einem Monat feststellen, dass manche wie es scheint nicht verstehen können oder wollen, dass andere nicht alles wissen, bzw. andere denkansätze haben und evtl. sich aufgrund wissensmangel bzgl. C Ausdrücken nicht immer korrekt dazu äußern können .. schade eigentlich
--
Es gibt 10 Arten von Leuten:
die, die das binäre System verstanden haben,
und die, die es nicht verstanden haben ^^
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
13.12.2005, 13:06 Uhr
Tommix



Nicht nervös werden ist wohl der Weihnachtsstress.
Das Problem hier lag darin, daß die Daten auf dem Heap liegen müssen und der Zeiger mit malloc belegt werden mußte (beefy schrieb das auch). Die Bemerkung "Nimm einen Zeiger, und es geht." ist etwas irreführend, da sie suggeriert, man könne das Problem in der Art lösen:

C++:
Fraction frArr[1];
Fraction* pArr = &frArr[0];
// und dann mit dem Zeiger reallocen


Das würde ins Auge gehen.

Im Grunde war mit Post 001 alles gesagt.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
13.12.2005, 13:15 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von Sponge:
ok ich geb mich geschlagen ....
so fast zumindest .. sicherlich hab ich nicht daran gedacht dass int bla[3] auf dem Stack liegt, jedoch kann man einem Pointer Speicher auf dem Stack zuweisen oder übersehe ich wieder etwas ?

Weiß ich nicht. Die Frage ist für mich nicht trennscharf formuliert bzw. steht im gegensatz zu dem, was du im Ursprungscode tust.


Zitat von Sponge:
sicher ... man kann bei int bla[3] .. dem bla nix anderes zuweisen


Ja, genau das war das Problem bei Deinem ursprünglichen realloc ansatz.


Zitat von Sponge:
P.S. einen Unterschied zwischen L und R.. naja den sollte man schon kennen, jedoch verstehe ich den Zusammenhang zu diesem Problem hier ned so ganz um ehrlich zu sein ... oder vielleicht doch nur würde ich es vielleicht anders ausdrücken / verstehen

Ein L-Value is einfach ein Ding, dem man was zuweisen kann. Ein Array ist *kein* L-Value ein Pointer hingegen schon:

C++:
char* ptr = malloc(4711);
char arr[4711];

ptr = arr; // Geht, ptr ist L Value
arr = ptr; // Geht nicht: arr ist kein L Value


(Im obigen Beispiel werden Speicherlöcher produziert, ich weiß, aber darum geht es imho hier ja nicht)


Zitat von Sponge:
P.P.S. eigentlich fand ich dieses Forum sehr hilfreich und gut, da man guten Rat findet, wenn man welchen braucht, nur leider muss ich nun nach etwas mehr als einem Monat feststellen, dass manche wie es scheint nicht verstehen können oder wollen, dass andere nicht alles wissen, bzw. andere denkansätze haben und evtl. sich aufgrund wissensmangel bzgl. C Ausdrücken nicht immer korrekt dazu äußern können .. schade eigentlich


Du solltest nicht ein so Dünnes Fell haben. Hätten die ganzen Powerposter hier auch ein dünnes Fell, wäre bald keiner mehr da, der/die kompetent Anwort geben könnte. Weder Kommentare von ao oder 0xdeadbeef fallen für mich in die Kategorie "Beleidigung", allenfalls in die Kategorie "hätte man auch mehr verpacken können".

Friede sei mit Euch.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 13.12.2005 um 13:16 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
13.12.2005, 13:20 Uhr
Sponge



Danke für die Antworten.. ok also bin ich doch ned ganz verbl** was L und R .. angeht

nein ich mag dieses Forum.. manchmal nervt es nur mehr antworten zu bekommen die nix mit dem Thema zu tun aber und verbesserungsvorschläge anderer Sorte sind... (aber manchmal sind die auch ganz hilfreich .. ich weiss wie man es macht macht man es falsch)
--
Es gibt 10 Arten von Leuten:
die, die das binäre System verstanden haben,
und die, die es nicht verstanden haben ^^
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


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: