Sortieralgorithmen: Warum kein Zeiger im Array



  • hi,
    beim folgenden Code werden die unsortierten Zahlen im Array zahl sortiert, allerdings wird bei der Funktion kein Wert zurückgegeben. Warum funktioniert es aber trotzdem?

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
    
    typedef char TArray[999];
    typedef int TKey;
    int last=999;
    
    TArray zahl = {41, 67, ..., 9, 93, 86, 80, 16};
    
    void Swap(int *a ,int *b)
     {
      int temp;
      temp = *a;
      *a   = *b;
      *b   = temp;
     }
    
    void SelectionSort(TArray a, int last)
    {
         int minPos, i, j;
         int temp;
    
        TKey minKey;
         for (i=0; i<last; i++)
         {
             minPos = i;
             minKey = a[minPos];
    
             for (j=i+1; j < last; j++)
    
                 if (a[j] < minKey)
                 {
                              minPos = j;
                              minKey = a[minPos];
                 }
                 //Swap(&a,&a[minPos]);
                 // Vertauschen der Zahlen
                 temp = a[minPos];
                 a[minPos] = a[i];
                 a[i] = temp;
         }
    
    }
    
    void InsertionSort(TArray a, int last)
    {
         int i, j;
         TKey e;
         for (i=0; i < last-1; i++)
         {
             e = a[i+1];
             j = i;
             while ((j >= 0) && (e < a[j]))
             {
                   a[j+1] = a[j];
                   j = j-1;
             }
             a[j+1] = e;
         }
    }
    
    void ShellSort(TArray a, int last)
    {
         int h = last/2;
         int temp, i, j, k;
         while (h > 0)
         {
               for(i = h; i<last; i++)
               {
                     temp = a[i];
                     j = i;
                     while (j >= h && a[j-h] > temp)
                     {
                           a[j] = a[j-h];
                           j = j-h;
                     }
                     a[j] = temp;
               }
               h = h/2;
         }
     }
    
    void ShellSortZ(TArray a, int last)
    {
         int h = last/2;
         int temp, i, j, k;
         while (h > 0)
         {
               for(i = h; i<last; i++)
               {
                     temp = a[i];
                     j = i;
                     while (j >= h && a[j-h] > temp)
                     {
                           a[j] = a[j-h];
                           j = j-h;
                     }
                     a[j] = temp;
                     for (k=0 ; k < last; k++)
                         printf(" %d ",zahl[k]);
                     printf("\n");
               }
               h = h/2;
         }
     }
    
    /*void CombSort(TArray a, int last)
    {
         int noSwaps, i, gap, tmp;
         gap = last;
         do
         {
             gap = gap * 10/13;
             if (gap == 0)
                gap = 1;
             noSwaps = 1;
             for (i=0; i<last-gap; i++)
             {
                 if (a[i] > a[i+gap])
                 {
                          noSwaps = 0;
                          tmp = a[i];
                          a[i] = a[i+gap];
                          a[i+gap] = tmp;
    
                 }
             }
         } while ((gap == 1) && noSwaps);
     }*/
    
    void CombSort(TArray a, int last)
    {
         int vertauscht, i, gap, tmp;
         gap = last;
         do
         {
             vertauscht = 0;
             if (gap > 1)
                gap = gap/1.3;
             for (i=0; i <last; i++)
             {
                 if (a[i] > a[i+gap])
                 {
                          int tmp;
                          tmp = a[i];
                          a[i] = a[i+gap];
                          a[i+gap] = tmp;
                          vertauscht = 1;
                 }
             }
         } while ((vertauscht == 1) || gap > 1);
     }
    
    void QuickSort(TArray a, int first, int last)
    {
         int i,j;
         int x;
         if (first < last)
         {
               x = a[(first+last)/2];
               i = first;
               j = last;
               do
               {
                   while (a[i] < x)
                   i++;
                   while (x < a[j])
                   j--;
                   if (i <= j)
                   {
                         int tmp;
                         tmp = a[i];
                         a[i] = a[j];
                         a[j] = tmp;
                         i++;
                         j--;
                      }
               } while (i<=j);
               QuickSort(a, first,j);
               QuickSort(a,i,last);
         }
    
    }
    
    int main(int argc, char *argv[])
    {
    
        int i, wahl,x;
        printf("Sortieralgorithmen\n\n");
        int last = 999;
    
        while(wahl!=9)
        {
                printf("\n\n1. eigene Zahlen eingeben\n");
                printf("2. SelectionSort\n");
                printf("3. InsertionSort\n");
                printf("4. ShellSort\n");
                printf("5. ShellSort mit Zwischenschritten\n");
                printf("6. CombSort\n");
                printf("7. QuickSort\n");
                printf("8. Standartzahlen wiederherstellen\n");
                printf("9. Raus hier\n\n");
                scanf("%d", &wahl);
                    switch(wahl)
                        {
                                case 1:
                                         printf("Bitte gib die Anzahl der Zahlen an:\n");
                                         scanf("%d", &last);
                                         printf("Gib nun die Zahlen ein:\n");
                                         for (i=0 ; i < last; i++)
                                             scanf("%d",&zahl[i]);
                                         printf("Ausgabe der Zahlen: ");
                                         for (i=0 ; i < last; i++)
                                             printf(" %d ",zahl[i]);
                                         break;
                                case 2:
                                        printf("\nSortiert nach SelectionSort: ");
                                        SelectionSort(zahl, last);
                                        for (i=0 ; i < last; i++)
                                            printf(" %d ",zahl[i]);
    
                                        break;
                                case 3:
                                        printf("\nSortiert nach InsertionSort: ");
                                        InsertionSort(zahl, last);
                                        for (i=0 ; i < last; i++)
                                            printf(" %d ",zahl[i]);
                                        break;
                                case 4:
                                        printf("\nSortiert nach ShellSort: ");
                                        ShellSort(zahl, last);
                                        for (i=0 ; i < last; i++)
                                            printf(" %d ",zahl[i]);
                                        break;
                                case 5:
                                        printf("\nSortiert nach ShellSort: \n");
                                        ShellSortZ(zahl, last);
                                        for (i=0 ; i < last; i++)
                                            printf(" %d ",zahl[i]);
                                        break;
                                case 6:
                                        printf("\nSortiert nach CombSort: \n");
                                        CombSort(zahl, last);
                                        for (i=0 ; i < last; i++)
                                            printf(" %d ",zahl[i]);
                                        break;
                                case 7:
                                        printf("\nSortiert nach QuickSort: \n");
                                        QuickSort(zahl, 0, last);
                                        for (i=0 ; i < last; i++)
                                            printf(" %d ",zahl[i]);
                                        break;
                                case 8:
                                       printf("\n Zahlen wurden wiederhergestellt\n");
                                       TArray zahl = {41, 67, ..., 9, 93, 86, 80, 16};
                                       last = 999;
                                       break;
                                case 9:
                                       break;
    
                                default: printf("falsche Wahl\n");
                                         break;
                        }
        }
    
        printf("\n");
    
      system("PAUSE");
      return 0;
    }
    

    Vielleicht noch zwei weitere Fragen:
    Wie lassen sich mehrere Zahlen im Array abspeichern, ohne neue Deklaration?
    Warum funktioniert [i]CombSort*() nicht?

    Im Array sind normalerweise 999 Zahlen deklariert, habe ich hier aber gekürzt.
    LG 🙂



  • supersass1 schrieb:

    wird bei der Funktion kein Wert zurückgegeben. Warum funktioniert es aber trotzdem?

    http://en.wikipedia.org/wiki/Pointer_(computing)


  • Mod

    supersass1 schrieb:

    hi,
    beim folgenden Code werden die unsortierten Zahlen im Array zahl sortiert, allerdings wird bei der Funktion kein Wert zurückgegeben. Warum funktioniert es aber trotzdem?

    Bei welcher Funktion wird was nicht zurückgegeben, und was funktioniert? Kanns sein, dass du den Begriff call by reference suchst?

    Vielleicht noch zwei weitere Fragen:
    Wie lassen sich mehrere Zahlen im Array abspeichern, ohne neue Deklaration?

    Gar nicht, sofern die Zahlen nicht alle gleich sind oder du schon ein anderes Array mit den passenden Zahlen hast.

    Warum funktioniert CombSort() nicht?

    Dein Programm schmeißt bei mir ein halbes Dutzend Warnungen, vermutlich wegen einer davon. Compiliere immer mit allen Warnoptionen deines Compilers und behandle Warnungen als ob sie Fehler wären.
    Um dich mal zu erleuchten:

    test.c: In function ‘ShellSort’:
    test.c:71: warning: unused variable ‘k’
    test.c: In function ‘CombSort’:
    test.c:139: warning: unused variable ‘tmp’
    test.c: In function ‘main’:
    test.c:218: warning: format ‘%d’ expects type ‘int *’, but argument 2 has type ‘char *’
    test.c:262: warning: unused variable ‘zahl’
    test.c:194: warning: unused variable ‘x’
    test.c:191: warning: unused parameter ‘argc’
    test.c:191: warning: unused parameter ‘argv’
    

    Allgemein: Beschreib deine Fehler besser, wenn du Hilfe möchtest. Was funktioniert nicht an CombSort? Im Fehlerfall gib die genaue Fehlermeldung an. Im Fall, dass etwas anderes passiert als du denkst, beschreibe was passiert und was du stattdessen erwartet hättest.



  • SeppJ schrieb:

    Bei welcher Funktion wird was nicht zurückgegeben, und was funktioniert? Kanns sein, dass du den Begriff call by reference suchst?

    Naja bei mir werden die Zahlen sortiert, sobald ich eine Option wähle (setzt natürlich voraus, dass man Zahlen im Array hat) Das funktioniert also.
    Und bei keiner Funktion wird etwas zurückgegeben, zumindest nicht mit return, so wie man es denken würde..
    Und mit Zeigern arbeite ich auch nicht. In jeder Sortier-Funktion wird ein Array a deklariert, welches sortiert wird. Aber a[] wird gar nicht zurückgegeben. Wieso werden dennoch die Zahlen sortiert ausgegeben?



  • Der erste Parameter jeder dieser Funktionen stellt einen Pointer dar.-


  • Mod

    supersass1 schrieb:

    SeppJ schrieb:

    Bei welcher Funktion wird was nicht zurückgegeben, und was funktioniert? Kanns sein, dass du den Begriff call by reference suchst?

    Naja bei mir werden die Zahlen sortiert, sobald ich eine Option wähle (setzt natürlich voraus, dass man Zahlen im Array hat) Das funktioniert also.
    Und bei keiner Funktion wird etwas zurückgegeben, zumindest nicht mit return, so wie man es denken würde..
    Und mit Zeigern arbeite ich auch nicht. In jeder Sortier-Funktion wird ein Array a deklariert, welches sortiert wird. Aber a[] wird gar nicht zurückgegeben. Wieso werden dennoch die Zahlen sortiert ausgegeben?

    Das ist so eine lustige Eigenart von Arrays. Ich muss aufpassen, dass ich das jetzt richtig erzähle, denn das ist sehr sehr wichtig für C-Programmierer, dies richtig zu verstehen:

    Also Arrays haben, wie die Informatiker sagen, keine Kopiersemantik. Das heißt eine Zuweisung von einem Array an ein anderes kopiert nicht den Inhalt:

    int a[] = {1,2,3};
    int b[] = a;  // Geht nicht
    

    Das ändert sich auch nicht, wenn man ein Array an eine Funktion übergibt:

    void foo(int a[5]);
    
    // ...
    int b[] = {1,2,3};
    foo(b);   // Hier wird keine Kopie gemacht!
    

    Was passiert hier stattdessen? Zunächst einmal ist dem Compiler reichlich egal, was bei der Funktionsdeklaration void foo(int a[5]) in den eckigen Klammern steht. Der macht daraus einfach void foo(int *a) . Aber welchen Wert bekommt dieser Zeiger, wenn man foo mit b aufruft? Es wird ein Zeiger auf das erste Element von b. Das nennt man übrigens array to pointer decay. Und danach geht alles so wie du es von Zeigern gewöhnt bist. Das heißt, wenn a in foo dereferenziert wird und daran etwas geändert wird, dann betrifft das den Inhalt von b.
    Wenn du verschachtelte Arrays hast, bezieht sich das übrigens nur auf das äußerste Array void foo(int a[3][4]) ist nicht das gleiche wie void foo(int a**) , sondern a ist dann ein Zeiger auf ein 4er int Array.



  • Vielen Dank! Das beantwortet meine gestellte Frage ziemlich gut.


Anmelden zum Antworten