Pointer in Schleife



  • Hallo,

    für ein Programm (NSGA-II Algorithmus) muss ich folgenden Programmteil in mehreren Iterationen durchlaufen lassen. Da die zu berechnende „crowding distance“ abhaengig vom Rang berechnet werden soll, speichere ich zuerst die Adressen der Element mit gleichem Rang (aktueller Rang wird in i gespeichert) in dem Pointer-Feld „help“, übergib das dann an die Funktion crowd_distance , die mir die crowding distance berechnet und ordne die „help“-Elemente dann wieder zurueck in das „ptr“-Feld ein.

    Allerdings funktioniert das ab der zweiten Iteration nicht mehr richtig. In der Funktion crowd_distance wird die distance zwar richtig berechnet, aber die Werte werden in der letzten Zeile der Funktion komischerweise nicht mehr richtig eingefuegt. Leider konnte ich bis jetzt nicht rausfinden, woran das liegt...vor allem, weil es ja beim ersten Durchlauf richtig funktioniert...

    Ich wäre wirklich sehr dankbar, wenn mir jemand einen Tipp geben könnte, woran das liegen kann...

    Hier der Auszug aus dem main-Programm:

    Mit den Initialisierungen:

    int g, i, j, m, n;
    double *ptr[pop_size];
    double *help[2*pop_size];
    double *R[2*pop_size];
    
    //Crowding Distance (wird an der Stelle „a_size+3“ eingefuegt)
    //wird abhaengig vom Rang (steht an der Stelle „a_size+2“) berechnet
    
    i=1;
    n=0;	
    while(n<pop_size)
    {
    	for(j=n, m=0; j<2*pop_size && *(R[j]+a_size+2)==i; j++, m++)
    		help[m] = R[j];
    	n=j;
    
    	quickSort(help, m, a_size);
    	crowd_distance(help, m);
    
    //wieder zurueck einfuegen
    	if(n<=pop_size)
    	{
    		for(j=n-m, g=0; g<m; j++, g++)
    			ptr[j]=help[g];
    	}
    
    	else
    	{
    		quickSort(help, m, a_size+3);
    		for(j=n-m, g=m-1; j<pop_size; j++, g--)
    			ptr[j] = help[g];
    	}
    
    	i++;
    } //end while
    

    Hier der Auszug aus der Funktion crowd_distance:

    void crowd_distance(double *array[], int s)
    {
    //hier nur die letzten Zeilen der Funktion:
    //distance wird immer richtig berechnet
    	for(i=0; i<s; i++)
    		printf("distance[%d] = %g\n", i, distance[i]);
    
    //und hier passiert der Fehler...
    	for(i=0; i<s; i++)
    		*(array[i]+a_size+3) = distance[i];
    } //end crowd_distance
    


  • Bitte das Beispiel soweit vervollständigen, das es Sinn macht!

    pop_size und a_size sind nicht definiert

    Annahme

    #define pop_size 10
    #define a_size 10

    Fehler: 'i': nichtdeklarierter Bezeichner in crowd_distance
    > for(i=0; i<s; i++)

    > distance nichtdeklarierter Bezeichner in crowd_distance (double array ?; werte ?)

    Mit diesen Annahmen wird die Ausführung bereits bei

    for(j=n, m=0; j<2*pop_size && *(R[j]+a_size+2)==i; j++, m++) 
        help[m] = R[j];
    

    mit einer Zugriffsverletzung beim Lesen bei (j=0 / m=0) beendet.

    Insbesondere weil die "Initialisierung" keine ist. Siehe z.B. *R[]


Anmelden zum Antworten