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
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
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
}
}
}
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
}
}
}
ok danke ich werde es mal probieren
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