mergesort bug



  • hi,

    ich hab in meinem merge einen bug...
    wenn ich j inkrementiere kann es sein das ich auf a[8] zugreife...hier gibt es zwar im moment keinen absturtz weil a[8] eine gross negative zahl ist...
    ...das array ist aber nur von a[0] bis a[7] definiert...
    sieht jeman den fehler?

    void merge(int *a, int *b, int l, int m, int r) 
    { 
       int i = l;
       int j = m;
    
       for (int k = l; k < r; k++)
       { 
          if ((j >= r) || (( i < m) && (a[i] <= a[j]))) 
    	  {
             b[k] = a[i++]; 
    	  }
          else
    	  {
             b[k] = a[j++]; 
    	  }
       } 
    } 
    
    void copy(int *b, int *a, int l, int r) 
    { 
       for (int i = l; i < r; i++)  
          a[i] = b[i]; 
    }
    
    void mergesort(int *a, int *b, int l, int r)
    {
       /* rekursiver mergesort algorithmus */ 
       if (l < r-1) 
       { 
         int m = (l + r) / 2; 
         mergesort(a,b,l,m); 
         mergesort(a,b,m,r); 
         merge(a,b,l,m,r); 
         copy(b,a,l,r); 
       } 
    }
    
    void main()
    {
    	int a[] = {4,3,8,9,6,2,1,5};
    	int b[8] = {0};
    
    	mergesort(a, b, 0, sizeof(a)/sizeof(int));
    }
    


  • Bin zu faul zum Test:
    definiere a[8] = 0 zu Beginn deines Programms
    und schau welche Werte a[8] im Laufe deines Programms annimmt 👍

    Was glaubst du welchen Wert dein Programm findet, wenn du a[8] liest, aber vorher nicht beschrieben hast? Wo kommt der Wert her? Hat der immer die selbe Grösse, egal wie oft und in welcher Reihenfolge du auf deinem PC die Programme aufrufst 😕

    void main()
    

    und C99, wer lehrt euch denn so was 😕



  • Dein Index m (in mergesort) wird auch zweimal sortiert.



  • ich will die groesse des input arrays a nicht veraendern...

    DirkB schrieb:

    Dein Index m (in mergesort) wird auch zweimal sortiert.

    wo denn?



  • Die 8 wird erst erreicht nachdem kopiert wurde.
    d.h. es werden keine Operationen mit a[8] bei dir durchgeführt.

    int main()
    {
        int a[] = {4,3,8,9,6,2,1,5};
        int b[sizeof(a)/sizeof(int)] = {0};
    

    Ältere Compiler könnten eventuell mit der letzten Zeile nicht klarkommen?

    MfG f.-th.



  • Nachtrag - gerade gefunden:
    http://stackoverflow.com/questions/988158/take-the-address-of-a-one-past-the-end-array-element-via-subscript-legal-by-the

    Leider ist mein Englisch bei solchen Feinheiten nicht ganz belastbar.

    Also ist die erste Adresse nach einem Array, unter C99 bei bestimmten Rahmenbedingungen legal nutzbar.

    MfG f.-th.


Anmelden zum Antworten