Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Dynamische Arraygroesse?!

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 <
000
16.12.2005, 16:30 Uhr
~marko
Gast


Hallo zusammen!

Ich versuche grade (bisher mehr oder weniger erfolgreich) C zu lernen (und dazu auch noch einigermassen zu verstehen ).
Allerdings stosse ich als Perl-Verwoehnter bei der Speicherverwaltung von C da auf ernsthafte Verstaendnisprobleme.

Gibt es irgendeine Moeglichkeit ein char-Array zu erstellen in welches der gesamte Inhalt einer Datei passt?
Die einzige Idee die ich bisher hatte waere das ganze mit einer Art iterativen Vergroesserung des Arrays zu loesen. Also irgendwas à la

Code:
[pseudocode]
while(fgets(file))
{
    newarray = malloc(sizeof(oldarray)+1);  
    newarray = oldarray
}
[/pesudocode]



Allerdings bin ich mir nichtmal sicher ob das so ueberhaupt funktionieren wuerde (und falls ja ob ich das pointer-jonglieren dass dabei bestimmt noetig ist hinbekomme).

Aber ich hoffe mal dass es da auch eine sinnvolle (schoene/effektive) Loesung gibt.

Vielen Dank schonmal
Gruß
Marko
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.12.2005, 16:39 Uhr
virtual
Sexiest Bit alive
(Operator)


Prinzipiell geht das, man darf nur nichts falsch machen. Eigentlich hast Du in C zwei Möglichkeiten:

1. Die Datei Stückweise einlesen und dann entsprechend auch das Array immer weiter vergrößern (übrigens mit realloc, und du darfst nicht nicht gleichen Fehler machen, wie in deinem Pseudocode oben - siehst Du ihn?). funktioniert immer.

2. Die größe der Datei bestimmen, dann Speicher einmal belegen und anschließend dann komplett einlesen. Das funktioniert aber nicht immer. Zum einen gibt es Dateien, deren Größe man nicht bestimmen kann (stdin zB in der Regel nicht), Zum anderen funktionieren die auf ANSI C Basierenden Lösungen nur für Binär geöffnete Dateien.

Also: nimm 1. Lösung. Ist schwerer, man lernt mehr bei.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.12.2005, 17:05 Uhr
~marko
Gast


Sollte natuerlich oldarray = newarray heissen
Gut, dann werd ich mir realloc mal zu Gemuete fuehren...

thx for the help!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.12.2005, 17:28 Uhr
~marko
Gast


Jetzt stellt sich doch aber gleich noch eine Frage:
wohin zeigt der Pointer nach dem realloc? Auf das erste Element oder auf das erste freie oder wohin?

Und ist es "bad habit" ein Arrayfeld ueber einen Zeiger + Index anzusprechen?

char foo[] = "blah";
char *bar;
bar = foo; // oder hier besser "bar = &foo;"? worin liegt der unterschied?
bar[2] = 'x';


thx again!
Marko
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.12.2005, 17:35 Uhr
Pler
Einer von Vielen
(Operator)


der Zeiger zeigt auf den Speicher. Das hat nichts mit frei oder so zu tun.

Also immmer auf den Anfang. Dass die neuen zusätzlichen daten an die richtige stelle kommen, dafür musst du selber sorgen.

Für sowas nimmt man aber glaub ich traditioneller weise ein zweidimensionales array.
Die Zeilen sind eine. Die einzelnen buchstaben sind die zweite dimension.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.12.2005, 17:37 Uhr
Pler
Einer von Vielen
(Operator)


Dann müsstest du auch immer zwei mal allocieren. Einmal für die "anzahl" der Zeilen, und einmal für die strings.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.12.2005, 17:51 Uhr
~marko
Gast


Sollte eigentlich ein Zeiger immer auch explizit noch eine dazugehoerige Variable haben oder ist es auch in Ordnung, den Zeiger "alleine" zu verwenden?

Code:
char *foo;
foo = malloc(5 * sizeof(char));
foo[3] = 'a';
printf("%c", foo[3]);


oder wenn moeglich immer

Code:
char ts[];
char *foo;
foo = ts;
foo = malloc(5 * sizeof(char));
ts[3] = 'a';
printf("%c", ts[3]);


??
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: