char array... elemente hinzufügen problem...
-
Eigentlich wollte ich das er das selbst herleitet...
Aber wie auch immer ...
char* Arr;
.... ist böse... denn bei
if(!Arr)
{
// allokiere Arr
}.. fällt man auf die Fre***
Also
char *Arr = 0; // nie uninitialisierte Variabeln!und "free( pArr );" ist auch nicht so nett.. denn schliesslich
hast du den Pointer im Hauptprogramm allokiert...
-
... gut ... wenn ich jetzt so darüber nachdenke, hast irgendwie schon recht
MfG
-
Hi... ich danke euch beiden erstmal... habt mir echt geholfen.
Und Solaris'dUKe, ich hatte es mir so fast selbst hergeleitet, nur
nicht mit soner schönen Fehlerabfrage... aber hast schon recht.. selbst
hergeleitet ist mehr verstanden. Nun, so verstehe ich das Bsp. von guard
jetz.Trotzdem Danke guard
Ich habe nur ein Probl noch, was mir nicht gefällt, und woran ich echt noch hänge:
mir gefällt das
Arr[0] = 1; Arr[1] = 2; Arr[2] = 3;
nicht. Es funktioniert zwar, aber was wenn ich ca 40 Elemente einfügen will?
Dann wirds auf wendig. z.B. Arr[38] = {0,20,20,20,4,5,6,7,...};
geht da wohl nicht.. leider.
Gibts das was anderes?Und nochwas... wie bekomme ich nun die Anzahl der Elemente?
sizeof liefert die Byteanzahl des Zeigers. ... brauch ich nicht.
und nicht '0' also 00110000b = 48d;Und da weiß ich nun ich wie ich an die Anzahl der Elemente komme. Sind ja
keine chars sondern irgendwie 8 Bit int. oder?MfG
Hevel
-
hatte es mir so fast selbst hergeleitet
freut mich
was wenn ich ca 40 Elemente einfügen will
40 total unterschiedliche Elemente einzufügen sind tatsächlich
handarbeit.... bei einer Zahlenreihe (1-40) kannst du ja ne "for" verwenden..Das hoff ich doch
Für strlen ist dort fertig, wo NULL kommt. Es ist gedacht für
Strings (Zeichenkette) und nicht für Zahlenreihen...Und da weiß ich nun ich wie ich an die Anzahl der Elemente komme. Sind ja
keine chars sondern irgendwie 8 Bit int. oder?Wieso soll ein *char nicht auf ein Char zeigen? Natürlich ist das ein
Char-Array... wobei natürlich das eine nicht das andere aussschliesstUnd wenn du Null auch in deinem Array haben kannst (z.b. {1,2,3,9,0,7,6})
wird dir nichts anderes übrigbleiben, als dein Array genau so gross zu machen
wie du ihn brauchst, bei jedem neuen Element das Teil vergrössern und nebenher
mitzuzählen...
Es sei denn du findest eine andere Endmarkierung als Null...
-
nochmal ich...
hab das
Arr[0] = 1;
Arr[1] = 2;
Arr[2] = 3;Problem jetzt so gelöst:
// Array anlegen und mit Werten initialisieren unsigned char tmpArr[] = {0,1,2,3,4,5,6,7,8,9...}; // Zeiger anlegen Speicher alloc... Arr = ( char* )malloc(sizeof(tmpArr) * sizeof( char )); // in Schleife Werte übertragen for(int i = 0; i < sizeof(tmpArr); i++) { Arr[i] = tmpArr[i]; };
Das ist zwar etwas speicherfressen, aber es erspart mir ne meng Tiparbeit..
Hoffe es gefällt...
MfG
-
Original erstellt von <Hevel>:
Das ist zwar etwas speicherfressen, aber es erspart mir ne meng Tiparbeit..Da hast du wohl war, es erspart. Aber vergiss nicht den Speicher wieder freizugeben und davor noch zu testen ob die Allokierung erfolgreich war
MfG
-
Nochmal ne Grundlagenfrage an guard .. aber auch alle anderen.
Ist die Speichererweiterung mit realloc für pArr in der Funktion
int Add( char* pArr )
nur in dieser Funktion gültig?
Oder besitzt nun Arr in main() auch die erweiterte Speichergröße?
Meiner Meinung nach müsste das so sein, da pArr auf Arr zeigt und
so mit alle Änderungen an pArr auch für Arr gelten müssten.Komischer Weise.. ist das wenn ich das Prog in Borland C++ kompiliere so!
Aber ich habs mal in VC++ eingefügt und 2-3 Schönheitsanpassungen gemacht,
aber am Code selbst nix verändert und siehe da... in VC ist das nicht so,
sondern dort gilt realloc nur innerhalb der Funktion!Wie ist das zu erklären, bzw. was wäre rein logisch richtig?
Danke.
MfG
Hevel
-
Add(char* p)
p ist eine kopie von &Arr[0] - wenn du jetzt willst, das Arr auf etwas anderes zeigt, musst du einen zeiger auf &Arr[0] übergeben
Add(char** p)
-
@ Shade Of Mine:
Um die Änderung für Arr zumachen habe ich die Zeile
so abgeändert. Dann gehts, dann wird die relloc-
Änderung bei Arr gemacht.vorher: if( ( pArr = ( char* )realloc( pArr, 5 ) ) != NULL )
nachher: if( ( *pArr = ( char* )realloc( *pArr, 5 ) ) != NULL )Ist das so korrekt?
Und dann noch ne Unklarheit.
Ich habe man den Code von guard so abgeändert, dass mir die
Länge von Arr ausgegeben wird und durch eine schleife, alle
Element. Das verblüffende ist nun, das strlen(Arr) = 9 ist,
obwohl nur 3 Elemente hinzugefügt wurden!!!??int main( void ) { char* Arr; int i=0; if( ( Arr = ( char* )malloc( 3 * sizeof( char ) + 1 ) ) != NULL ) { fprintf( stdout, "\nFeld allokiert!\n" ); Arr[0] = 1; Arr[1] = 2; Arr[2] = 3; fprintf( stdout, "\nArr[0] = %d", Arr[0] ); fprintf( stdout, "\nArr[1] = %d", Arr[1] ); fprintf( stdout, "\nArr[2] = %d\n\n", Arr[2] ); /* Eingefügt */ for ( i = 0; i < strlen(Arr); i++) { fprintf( stdout, "\nArr[%d] = %d",i, Arr[i] ); } fprintf( stdout, "\nstrlen(Arr) = %d\n\n", strlen(Arr) ); /* Ende eingefügt */ } else { perror( "(main:) test" ); fprintf( stderr, "\n(main:) Es lief etwas schief!\n\n" ); return( EXIT_FAILURE ); } Add( Arr ); /*--- "system()" ist aber kein ANSI-Standard ;) ---*/ system( "PAUSE" ); free( Arr ); return( 0 ); }
Da werd ich nun nicht ganz schlau draus. Ihr?
MfG
Hevel
-
Sorry!
Die nachher Zeile mu? so lauten;
nachher: if( ( *pArr = ( char* )realloc(pArr, 5 ) ) != NULL )
-
die änderung ist richtig!
strlen() macht nichts anderes als:
int strlen(char* str)
{
int i=0;
while(str[i]!=0)++i;
return i;
}du siehst: strlen sucht nur nach 0
du musst dir selber merken wie groß dein array ist!
-
Danke Shade Of Mine.
Nur hab ich da noch Fehler gefunden.
Hab ein char * cArr;
cArr[0] = 0;
cArr[0] = 1;
cArr[0] = 2;nach der Funktion Add() mit realloc ist cArr[0] = 192, seit dem ich die
Änderung anif( ( *pArr = ( char* )realloc(pArr, 5 ) ) != NULL )
gemacht habe. sollte aber immernoch 0 sein.
Verstehe wer will...Ja, da hast du Recht strlen sucht nur nach 0, aber in dem
Bsp ist keine 0 vorhanden, sondern 1,2,3 und trotzdem
ist strlen(Arr) = 9 !!?? hmm... keine Ahnung mehr hab...MfG