Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Array übergeben c++

gustav484 / 4 Antworten / Baumansicht Nickles

Hallo und zwar habe ich folgendes problem ich will ein array ( int a [5] [5] )an ein unter programm übergeben. ich habs mit dem auf ruf
frey ( a [i] [j] ) probiert funzt aber net. ich benutze ms visual 6.0

THX

bei Antwort benachrichtigen
vergisses gustav484 „Array übergeben c++“
Optionen

Hallo gustav,

jede Arrayvariable ist ein Zeiger auf den Beginn der für
das Array allozierten Speicherfläche und muss damit
als solcher an Funktionen übergeben werden.
Bei mehrdimensionalen Arrays müssen entsprechend mehrdimensionale
Zeiger (PointerPointer) übergeben werden.
Die aufgerufene Funktion muss entweder bereits
zur Programmierzeit (compiletime) wissen,
wie das Array dimensioniert ist,
oder Du übergibst die Dimensionen als zusätzliche int Parameter.

Hier ein quickanddirty Beispiel,
Fehler sind durchaus möglich ....



void subrout(int **);
void subrout2(int **,int,int);

void aufrufer()
{
int a[5][5];

// Werte füllen ......

subrout(a);
subrout2(a,5,5);
}

void subrout(int **a)
{
int i,ii
for(i=0;i {
for(ii=0;i {
// tuwas
}
}
}

void subrout2(int **a,int b,int c)
{
int i,ii
for(i=0;i {
for(ii=0;i {
// tuwas
}
}
}

bei Antwort benachrichtigen
vergisses Nachtrag zu: „Hallo gustav, jede Arrayvariable ist ein Zeiger auf den Beginn der für das...“
Optionen

Sorry, die subrout2 kam nicht richtig durch...
void subrout2(int **a,int b,int c)
{
int i,ii
for(i=0;i {
for(ii=0;i {
// tuwas
}
}
}

bei Antwort benachrichtigen
gustav484 Nachtrag zu: „Array übergeben c++“
Optionen

ok danke ich werde es mal probieren

bei Antwort benachrichtigen
mr.escape gustav484 „Array übergeben c++“
Optionen

In der aufgerufenen funktion muss der array parameter genau so definiert werden, wie das array (der erste index darf auch leer sein).
Also bei

int a[5][5];

muss es heißen:
void func(int a[][5]);

oder auch
void func(int a[5][5]);

Wobei die erste 5 nur eine dekoration ist und nicht als legale obergrenze erkannt wird (für solche überprüfungen ist C/C++ denkbar die schlechteste wahl).
Tatsächlich ist im o.g. beispiel a ein array aus 25 int werten, wobei der kompiler einem den zugriff darauf erleichter, indem man schreiben kann "a[i][j]" statt "a[i*5+j]". Genau das macht nämlich der kompiler daraus und auch in den funktionen werden die angegebenen grenzen für die multiplikationen benutzt.
Beispiel:
mit
a[5][10][20][30];

wird dann beim zugriff auf
a[i][j][k][l];

intern das daraus (tatsächlich wohl optimiert, aber grundsätzlich):
a[i*10*20*30+j*20*30+k*30+l]

Damit ist auch klar, warum die größe in der ersten stelle bei der funktionsdefinition nicht angegeben werden muss. Die zahl wird einfach beim multiplizieren nicht gebraucht und gibt eigentlich nur die obergrenze für i an (zu grenzwerten s.o.).

Zum schluss noch ein funktionierendes beispiel für feste arrays. (die ausgewählte stelle erscheint negativ).

int a[5][5];//kann auch local in z.b. main() sein und darf auch beliebig heißen.


void func(int a[][5], int i0, int j0){//a willkürlich gewählt
int i, j;
for(i=0;i for(j=0;j if(i==i0 && j==j0)
printf("%d\t", -a[i][j]);
else
printf("%d\t", a[i][j]);
}
printf("\n");
}
printf("Ende.\n");

}

int main(int argc, char* argv[]){
int i, j;
for(i=0;i for(j=0;j a[i][j]=10*i+j;
}
}
func(a, 1, 2);
return 0;
}


mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen