2009-08-10 15 views
2

Ich habe ein Array von float rtmp1 [NMAX * 3] [3], und es wird als rtmp1 [i] [n] verwendet, wobei n von 0 bis 2 ist i ist von 0 bis 3 * NMAX - 1. Ich möchte jedoch rtmp1 in rtmp1 [3 * 3 * NMAX] konvertieren. Würde die Adressierung dieses neuen 1D-Arrays als rtmp1 [3 * i + n] äquivalent zu rtmp1 [i] [n] sein? Vielen Dank im Voraus für die Klarstellungen.C++: 2D-Arrays vs. 1D-Array-Unterschiede

+0

Sollte ich nicht von 0 bis (3 * NMAX) - 1 sein? – KTC

+0

Klärung bitte. Meinst du "ich bin von 0 bis 2" oder rtmp1 [3 * 4 * NMAX]? –

+0

@KTC: ja, und ich habe es korrigiert @billweaver: Bitte klären Sie Ihre Frage. – stanigator

Antwort

4

rtmp1 [i] [n] entspricht rtmp1 ist [i * N MAX + n]

http://www.cplusplus.com/doc/tutorial/arrays/ See, wo Ihr nmax ihre Breite.

+0

Das Hauptziel von dem, was ich versuchte, ist, von einem 2D-Array zu einem Pseudo-2D-Array zu konvertieren. Deine Antwort ist diejenige, die ich akzeptiere. Vielen Dank. – stanigator

0

Ja, aber was willst du damit beweisen? rtmp1 [i] [n] hätte wahrscheinlich eine bessere Ausführungszeit und ist leichter zu lesen.

"Eigentlich möchten Sie rtmp [i + 3 * n]" verwenden, was ist der Unterschied? Sie tauschen nur Adressen aus.

+0

Ich versuche, rtmp1 dynamisch zuzuordnen, um ein 1D-Array zu sein, da ich seine Größe bis zur Laufzeit nicht kenne. NMAX ist eine wirklich große Zahl, die statisch zugewiesen werden muss, was die aktuelle Implementierung im Hinblick auf den Speicherverbrauch sehr erschwert. – stanigator

0

Ich bin mir nicht sicher, dass es einige Aliaspräventionsregeln nicht brechen wird. Meine Lektüre ist, dass es in Ordnung ist, aber ich habe mich schon geirrt und der ganze Bereich ist manchmal verwirrend und mutig darauf zu wissen, welche von zwei widersprüchlichen Regeln in verschiedenen Teilen des Standards Priorität hat.

Exemple:

typedef float Point[3]; 

void f(float* tab, Point* pt) 
{ 
    (*pt)[2] = 6; 
    // I don't think the compiler can assume that (*pt)[2] isn't modified by 
    tab[5] = 3.141592; 

}

// context which give a problem if I'm wrong. 
float rtmp1[NMAX*3][3]; 
float *ptr = &rtmpl[0][0]; 
f(ptr, rtmpl[1]);