2012-04-02 8 views
5

Ich versuche, ein Array (2d) zu einer Funktion als Parameter übergeben. ich einen Code haben, wie folgt:Wie ein zweidimensionales Array an eine Funktion in C++ übergeben werden

int main() 
{ 
    float T[100][100]; 
    void set_T(float T[][]); 
} 


void set_T(float T1[][]) 
{ 


    for (int i =0 ; i<90;i++) 
    { 
     for(int j =0 ;j <90;j++) 
     { 
      T1[i][j] = 3; 
     } 
    } 

} 

Ich bin nicht sicher, wie man eine Funktion übergeben Array ... Ich erhalte viele Fehler. Kann mir bitte jemand helfen.

+0

mögliche Duplikate von [2D-Array an Funktion übergeben] (http://stackoverflow.com/questions/8767166/passing-2d-array-to-function) – legends2k

Antwort

-3

Rufen Sie es wie folgt aus:

int main() 
{ 
    float T[100][100]; 
    set_T(T); 
} 

Und wie @suddnely_me sagte, die Art der T1 in der Funktionsdeklaration müssen float** sein.

+2

'float [] []' und 'float **' sind unterschiedlich. –

+0

@Jesse ist richtig. Ein 2D-Array im C-Stil ist nicht als Array von * Pointern * zu Arrays implementiert. Es ist eine Anordnung von Anordnungen, d. H. Die erste Reihe von 100 Elementen, gefolgt von der zweiten Reihe von 100 Elementen usw. Um so richtig auf ein 2D-Array unter Verwendung der C-Syntax zuzugreifen, muss die aufgerufene Funktion alle außer einer Dimension spezifizieren. –

5
void set_T(float (&T)[100][100]); 
8

Es gibt zwei Probleme hier:

  • C nicht unterstützt 2D-Arrays, nur Arrays von Arrays oder Arrays von Zeigern auf Arrays, von denen keiner genau das gleiche wie ein 2D-Array ist
  • C erlaubt keine Übergabe von Arrays als Argumente, nur Zeiger in Arrays (im Allgemeinen verwenden Sie einen Zeiger auf das 0. Element eines Arrays, da der Name des Arrays so endet, dass die Indizierung eines solchen Zeigers genau wie ein aussieht Array-Zugriff)

Also wegen des ersten Problems müssen Sie entscheiden, wie Sie ein 2D-Array darstellen wollen - entweder ein Array von Arrays oder ein Array von Zeigern auf Arrays. Wenn Sie die erste Route, der Code gehen endet aussehen wie:

void set_T(float (*T1)[100]) { 
    ... do stuff with T1[i][j] ... 
} 

int main() { 
    float T[100][100]; 
    set_T(T); 
} 

Hier haben Sie erklären T ein Array von 100 Arrays von 100 Schwimmer zu sein, und set_T nimmt einen Zeiger auf Arrays von 100 Schwimmern als sein Argument. Sie übergeben 'T' direkt an set_T, da die Sprache Array-Namen als Zeiger auf ihr 0tes Element behandelt.

Wenn Sie stattdessen ein Array von Zeigern verwenden möchten, um Arrays, am Ende mit etwas nach oben wie:

void set_T(float **T1) { 
    ... do stuff with T1[i][j] ... 
} 

int main() { 
    float *T[100]; 
    float space[100*100]; 
    for (int i = 0; i < 100; i++) 
     T[i] = space + i*100; 
    set_T(T); 
} 

Der hier Nachteil ist, dass man Platz für alle der Second-Level-Arrays zuweisen müssen und initialisieren Sie alle Zeiger der ersten Ebene manuell, um auf sie zu zeigen. Der Vorteil besteht darin, dass die Größen der Arrays der zweiten Ebene nicht Teil des an set_T übergebenen Arguments sind, so dass Sie Arrays mit variabler Größe einfacher handhaben können.

Natürlich, wenn Sie wirklich C++ und nicht C verwenden, sollten Sie überhaupt keine C-Arrays verwenden - Sie sollten stattdessen std::vector oder std::array verwenden - beide teilen nur das C-Array-1D-Problem, so benötigen Sie einen Vektor von Vektoren oder ein Array von Arrays (oder denkbar ein Vektor von Arrays oder ein Array von Vektoren)

+0

Ich glaube, deine Antwort könnte einige bessere Alternativen zu 'float (*) [100]' oder 'float **' auflisten, um wirklich vollständig zu sein. –

Verwandte Themen