Seite 1 von 2

Wertzuweisung in einem Array

Verfasst: Di Okt 30, 2012 2:33 pm
von LadyBird
Hallo!

In einer Funktion möchte ich Werte aus einem Array P in ein Array Pn kopieren.

Code: Alles auswählen

int poisson(float** P,
            float** RHS,
            float** U,
            float** V,
            int imax,
            int jmax,
            float delX,
            float delY,
            float eps,
            int itermax,
            float omg,
            float res)
{
    for(int i = 1; i <= imax; i++)
    {
        for(int j = 1; j <= jmax; j++)
        {
            P[0][j] = P[1][j];
            P[imax+1][j] = P[imax][j];
            P[i][0] = P[i][1];
            P[i][jmax+1] = P[i][jmax];
        }
    }
    float Pn[imax][jmax][itermax];
    for(int i = 1; i <= imax; i++)
    {

        for(int j = 1; j <= jmax; j++)
        {
            Pn[i][j][1] = P[i][j];
        }
    }
}
Dies funktioniert aber nur bis i den Wert 50 erreicht hat und j den Wert 7. Als Test habe ich versucht, Pn[50][6][1] einen beliebigen Wert zuzuweisen, was kein Problem ist. Wenn ich das selbe mit Pn[50][7][1] versuche, erhalte ich den Fehler "segmentation fault(core dumped)". Wie kann das sein und wie kann ich es ändern?

Re: Wertzuweisung in einem Array

Verfasst: Di Okt 30, 2012 2:37 pm
von Xin
jmax ist 7. Das Array geht von j=1 bis j=7. C zählt von 0 bis 6, da passt 7 nicht mehr rein.
Das gleiche Problem hast Du offenbar mit i auch, wenn imax 50 ist.

Re: Wertzuweisung in einem Array

Verfasst: Di Okt 30, 2012 2:50 pm
von LadyBird
imax und jmax ist 50.
Wieso wird mit Pn[50][6][1] dann ein richtiger Wert ausgegeben? Ich hatte denselben Fehler vermutlich auch an anderen Stellen gemacht Wieso hat das da gut funktioniert?

Re: Wertzuweisung in einem Array

Verfasst: Di Okt 30, 2012 2:56 pm
von Xin
LadyBird hat geschrieben:imax und jmax ist 50.
Wieso wird mit Pn[50][6][1] dann ein richtiger Wert ausgegeben? Ich hatte denselben Fehler vermutlich auch an anderen Stellen gemacht Wieso hat das da gut funktioniert?
Weil Du zwar in Speicherbereiche schreibst, die Dir nicht gehören, das OS aber häufig geringfügig größere Bereiche zur Verfügung stellt als Du anforderst.
Der Code ist falsch, funktioniert aber. Dass das OS größere Bereiche anfordert, garantiert Dir aber keiner. Manchmal klappt, manchmal nicht. Bei [50][7] klappt's wohl nicht.
Damit es garantiert klappt musst Du Dich bei einem Array von 'int a[7]' immer von a[0] bis a[6] bewegen, a[7] ist tabu.

Re: Wertzuweisung in einem Array

Verfasst: Di Okt 30, 2012 3:46 pm
von LadyBird
Vielen Dank für die schnelle Antwort. :)
ich habe das Array größer gemacht und damit hatte sich das Problem dann auch erledigt.

Re: Wertzuweisung in einem Array

Verfasst: Di Okt 30, 2012 3:50 pm
von Xin
LadyBird hat geschrieben:Vielen Dank für die schnelle Antwort. :)
ich habe das Array größer gemacht und damit hatte sich das Problem dann auch erledigt.
Vielleicht solltest Du besser Deine Indizes anpassen... ^^

Re: Wertzuweisung in einem Array

Verfasst: Mi Okt 31, 2012 1:23 pm
von LadyBird
Wieso?
Es geht um ein bestimmtes Feld, in dem eine Strömung simuliert werden soll. Das Feld P stellt den Druck dar. Das zu betrachtende Feld hat die Größe imax und jmax. Außerdem hat es ein Randgebiet, das bedeutet, ich hätte das Feld von Anfang an mit der Größe imax+2 und jmax+2 anlegen sollen. Das Feld Pn dient nur zur Berechnung, weil in dem Schritt der Druck auch noch vom Iterationsschritt abhängig ist. Trotzdem müsste es doch dann genau so groß sein wie P, oder?

Re: Wertzuweisung in einem Array

Verfasst: Mi Okt 31, 2012 2:04 pm
von Xin
LadyBird hat geschrieben:Wieso?
Wenn ich dich richtig verstehe, bleiben die 0-Indizes nun immer unbenutzt!?

Re: Wertzuweisung in einem Array

Verfasst: Mi Okt 31, 2012 2:09 pm
von LadyBird
Xin hat geschrieben:
LadyBird hat geschrieben:Wieso?
Wenn ich dich richtig verstehe, bleiben die 0-Indizes nun immer unbenutzt!?
Nein, später in der Funktion gibt es eine Gleichung in der mit Pn[j-1][it] usw. gerechnet wird. Wenn j in der for-Schleife dann 1 ist, wäre das ja dann 0.

Re: Wertzuweisung in einem Array

Verfasst: Mi Okt 31, 2012 2:28 pm
von Xin
LadyBird hat geschrieben:
Xin hat geschrieben:
LadyBird hat geschrieben:Wieso?
Wenn ich dich richtig verstehe, bleiben die 0-Indizes nun immer unbenutzt!?
Nein, später in der Funktion gibt es eine Gleichung in der mit Pn[j-1][it] usw. gerechnet wird. Wenn j in der for-Schleife dann 1 ist, wäre das ja dann 0.

Dann ist Pn[j-1][it] sauber initialisiert?