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 10Fehler: '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[]