problem mit feldern



  • hi leute ich hab ein programm geschrieben welches nach bubblesort eingegebene zaheln sortiert
    das funktioniert auch soweit

    wenn das feld sortiert ist soll es noch überprüfen wieviele zahlen gerade und ungerade sind und diese dann jeweils in das entsprechende feld für gerade und ungerade zahlen einsortieren

    das funktioniert auch soweit

    nur hab ich ein problem mit der ausgabe

    also angenommen ich habe eine sortiere zahlen reihenfolge: 1 2 3 4 5

    dann sieht die ausgabe für die geraden zahlen wie folgt aus: 0 2 0 4 0
    und für ungerade 1 0 3 0 5

    ich hätte aber gerne dass die 0er nicht ausgegeben werden sollen denn eigentlich wird die größe für die felder genau festgelegt

    mein code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <stddef.h>
    
    int main()
    {
    
      /*Variablen Definition*/
      int anIntArraySize;
      int feldzahlen;
      int gerade;
      int ungerade;
      int *Array;
      int *GeradesArray;
      int *UngeradesArray;
      int i;
      int j;
      int tmp;
    
      /*Feldgroesse einlesen*/
      printf("\nAnzahl zu sortierender Werte eingeben: ");
      scanf("%d", &anIntArraySize);
    
      /*Neues Feld Anlegen*/
      Array = (int*) calloc (anIntArraySize, sizeof(int));
    
      /*Überprüfung auf leeres Feld*/
      if (Array == NULL)
       {
          free(Array);
          return 1;
       }
    
      /*Zahlen einlsesn*/
      printf("\nGeben Sie %d ganze Zahlen eingeben: ", anIntArraySize);
      for (i = 0; i < anIntArraySize; ++i) 
      {
        scanf("%d", &feldzahlen);
        Array[i] = feldzahlen;
      }
    
      /*Zahlen sortieren*/
      for (i = anIntArraySize; i > 1; i--)
      {
        /*groessten Wert nach hinten schieben*/
        for (j = 0; j < i - 1; ++j) 
        {
          if (Array[j] > Array[j + 1])
          {
    	/*Werte tauschen*/
    	tmp = Array[j + 1];
    	Array[j + 1] = Array[j];
    	Array[j] = tmp;
          }
        }
      }
    
      /*Ausgabe sortierte Reihenfolge */
    
      printf("\nSortierte Zahlenfolge: \n");
    
      for (i = 0; i < anIntArraySize; ++i)
      {
        printf("%d, ", Array[i]);
      }
    
      printf("\n\n");
    
      /*---------------------------------------------------------------------*/
    
      /* Ergänzungen für gerade und ungerade */
    
      /*Gerade und ungerade zählen*/
      for (i = 0; i < anIntArraySize; ++i)
      {
        if (Array[i] % 2 == 0) 
        {
          gerade++;
        } else 
        {
          ungerade++;
        }
      }
    
      /*Feldern die richtige größe zuweisen*/
      GeradesArray = (int*) calloc (gerade, sizeof(int));
    
      if (GeradesArray == NULL)
       {
          free(GeradesArray);
          return 1;
       }
    
      UngeradesArray = (int*) calloc (ungerade, sizeof(int));
    
      if (UngeradesArray == NULL)
       {
          free(GeradesArray);
          return 1;
       }
    
       /* Gerade und ungerade Zahlen den entsprechenden Feldern zuordnen */
      for (i = 0; i < anIntArraySize; ++i)
      {
        if (Array[i] % 2 == 0) 
        {
          GeradesArray[i] = Array[i];
        } else {
          UngeradesArray[i] = Array[i];
        }
      }
    
      /*Ausgabe gerade und ungerade Zahlen*/
    
      printf("Ungerade Zahlen: \n");
      for (i = 0; i < anIntArraySize; i++) 
      {
        printf("%d, ", UngeradesArray[i]);
      }
      printf("\n\n");
    
      printf("Gerade Zahlen: \n");
      for (i = 0; i < anIntArraySize; i++)
      {
        printf("%d, ", GeradesArray[i]);
      }
      printf("\n\n"); 
    
      /*Speicherplatz wieder freiräumen*/
      free(Array);
      free(GeradesArray);
      free(UngeradesArray);
    
      return 0;
    
    }
    


  • hans-sonny schrieb:

    for (i = 0; i < anIntArraySize; ++i) 
      { 
        if (Array[i] % 2 == 0) 
        { 
          GeradesArray[i] = Array[i]; 
        } else { 
          UngeradesArray[i] = Array[i]; 
        } 
      }
    

    sollte heissen:

    int GroesseGerade = 0;
      int GroesseUngerade = 0;
      for(i = 0; i < anIntArraySize; ++i) 
      { 
        if(Array[i] % 2)
        {
          UngeradesArray[GroesseUngerade++] = Array[i];
        }
        else
        {
          GeradesArray[GroesseGerade++] = Array[i];
        }
      }
    

    Und dann beim Ausgeben halt einfach nur GroesseGerade bzw. GroesseUngerade viele Elemente des Arrays ausgeben.

    MfG, EOutOfResources

    EDIT: Rechtschreibefehler gefixt



  • danke für deine hilfe aber das geht so nicht da kommt dann immer speicher zugriffs fehler

    und du hast gerade und ungerade vertauscht ....



  • hans-sonny schrieb:

    und du hast gerade und ungerade vertauscht ....

    Dafür habe ich das " == 0 " weggelassen.



  • /* Gerade und ungerade Zahlen den entsprechenden Feldern zuordnen */
      for (i = 0; i < anIntArraySize; ++i)
      {
        if (Array[i] % 2) 
        {
          UngeradesArray[ungeradez++] = Array[i];
        } else {
          GeradesArray[geradez++] = Array[i];
        }
      }
    
      /*Ausgabe gerade und ungerade Zahlen*/
    
      printf("Ungerade Zahlen: \n");
      for (i = 0; i < ungeradez; i++) 
      {
        printf("%d, ", UngeradesArray[i]);
      }
      printf("\n\n");
    
      printf("Gerade Zahlen: \n");
      for (i = 0; i < geradez; i++)
      {
        printf("%d, ", GeradesArray[i]);
      }
      printf("\n\n");
    

    so hab ichs jetzt gemacht

    dann kommt aber immer speicherzugriffsfehler bei der ausgabe der geraden und ungeraden



  • Hast du die beteiligten Variablen überhaupt initialisiert, bevor du sie benutzt hast? Die Anweisung "int x;" belegt zwar genug Speicher, aber du kannst dich nicht darauf verlassen, was dort drinsteht.



  • Kann es sein, dass ungeradez/geradez nicht mit 0 initialisiert sind (genau wie ungerade/gerade übrigens auch)?



  • Poste mal bitte den gesamten Code, der mit deinem Problem zutun hat.



  • _Falke schrieb:

    Kann es sein, dass ungeradez/geradez nicht mit 0 initialisiert sind (genau wie ungerade/gerade übrigens auch)?

    Ging mir auch durch den Kopf. Oder wie gross sind die beiden Arrays?



  • ich habs sie gar nicht initialisiert sondern nur deklariert.

    die felder sollen so groß angelegt werden wie nötig (wird mit der modulo funktion gemacht

    ist oben im ersten beitrag im code auch kommentiert

    EDIT: okay jetzt geht es hab die variablen mit 0 initialisiert.

    vielen dank an alle



  • hans-sonny schrieb:

    EDIT: okay jetzt geht es hab die variablen mit 0 initialisiert.

    vielen dank an alle

    Das ist es, worauf wir dich da gemeinschaflich hinweisen wollen: Mit der reinen Deklaration hast du einen undefinierten Wert in der Variable - und damit zu rechnen ergibt nur unsinnige Ergebnisse.



  • CStoll schrieb:

    Mit der reinen Deklaration hast du einen undefinierten Wert in der Variable - und damit zu rechnen ergibt nur unsinnige Ergebnisse.

    Mit Deklarationen habe ich überhaupt keinen Wert einer Variable, den ich initialisieren könnte, denn ich habe noch keinen Speicherplatz.
    Du meinst Definitionen.
    Und dafür gilt dann auch: alle globalen statisch definierten Variablen sind immer implizit 0 initialisiert.



  • Wutz schrieb:

    Und dafür gilt dann auch: alle globalen statisch definierten Variablen sind immer implizit 0 initialisiert.

    Ok, Punkt für dich. Aber hans-sonny arbeitet glücklicherweise mit lokalen Variablen - und die werden nunmal nicht automatisch initialisiert.


Anmelden zum Antworten