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 aussschliesst 😉

    Und 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 an

    if( ( *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


Anmelden zum Antworten