webForumDet fria alternativet

skicka 2-dimensionell array

C/C++

10 svar · 383 visningar · startad av SDCd

Medlem sedan jan. 2001795 inlägg
Frågan#1

Om man vill skicka en integer array till en funktion antar jag att nedanstående kodsnutt fungerar:

#include <iostream.h>

void tilldela(int *pplan, int grund);

main()
{
	const int GAMESIZE=4;
	const int ARRSIZE=GAMESIZE+2;
	
	int plan[ARRSIZE];
	
	
	tilldela(plan, ARRSIZE);
	
	for(int i=0;i<ARRSIZE;i++)
	{
		cout << plan[i];
	}
	cin.get();
}

void tilldela(int *pplan, int grund)
{
	const int START=0;
	
	for(int i=0;i<grund;i++)
	{
	//	for(int j=0;j<grund;j++)
	//	{
			pplan[i] = i;
	//	}
	}
}

Kan jag på något liknande sätt skicka en två dimensionell array, utan att i funktionshuvudet behöva ange storleken?
Det jag skulle vilja göra är att, om jag vill ändra på storleken på arrayen, bara ändra på konstanten GAMESIZE i main().

Medlem sedan juni 200010 432 inlägg
#2

Jepp, man anger inte storlek i funktionshuvuden, det du får i funktionen är en pekare till den arrayen du skickar med... :

void foo(int a[][]){
...
for(int i=0;i<MAX;i++)
    for(int j=0;j<MAX;j++)
         a[i][j]=777;
...
}
Medlem sedan jan. 2001795 inlägg
#3

Hmm, måste tänka fel, för att kompilatorn skall godta koden måste jag ange minst det sista värdet i min två dimmensionella array.

Medlem sedan maj 20018 027 inlägg
#4

SDCd skrev:

Hmm, måste tänka fel, för att kompilatorn skall godta koden måste jag ange minst det sista värdet i min två dimmensionella array.

Du tänker inte fel. Det är så som du skriver. Egentligen är en matris (2-dim-array) en lång array av det minne som du allokerade för matrisen. Har du deklarerat matrisen m[2][2], kan du komma åt en och samma element genom både m[1][0] och m[2]. Men för att matris-åtkomsten ska fungera, måste programmet på något vis veta matrisens dimensioner så det vet var i minnet som nästa rad börjar på. Det är vad du talar om för din funktion genom att ange antal kolumner.

Medlem sedan jan. 2001795 inlägg
#5

Så det finns alltså inget sätt att skicka en 2-dimensionell array, på samma sätt som i mitt exempel ovan?
Alltså deklarera den med en konstant storlek i main()? Anledningen att jag frågar är att jag skulle vilja ha en array som jag kan ändra storlek på genom att ändra en konstant i main().

Medlem sedan maj 20018 027 inlägg
#6

SDCd skrev:

Så det finns alltså inget sätt att skicka en 2-dimensionell array, på samma sätt som i mitt exempel ovan?
Alltså deklarera den med en konstant storlek i main()? Anledningen att jag frågar är att jag skulle vilja ha en array som jag kan ändra storlek på genom att ändra en konstant i main().

Du skulle kunna ha egna storlekar på din matris och du skickar med info om hur stor matrisen är. Du får dock komma åt elementen lite annorlunda än vad du är van vid.

main()
{
  int matrix[3][3];

  minMatrisFunktion( matrix, 3);
}

void minMatrisFunktion( int matrix[], cols)
{
// vill komma åt element matrix[2][2]
int tal = matrix[ 2 + (2*cols) ];
}

Du får alltså räkna ut vilket element i en 1-dim-array som rad-kolumn-angivelse i din matris motsvarar.

Medlem sedan jan. 2001795 inlägg
#7

Hmm, det var en variant. Jag gjorde en variant med en array av structs där jag lagrade första och andra värdet. Verkar fungera som jag tänkt .
Tack för tipsen!

Medlem sedan okt. 20013 217 inlägg
#8
void tilldela(int **pplan, int grund);

Funkar inte detta då ?

Medlem sedan jan. 2001795 inlägg
#9

Se där ett till tips! Hur tolkas de två asteriskerna?

Medlem sedan okt. 20013 217 inlägg
#10

På samma sätt som en asterisk, dvs du kan indexera arrayen mha pplan[0][1]. Va bara noga med att hålla reda på så du inte överstiger arrayens storlek.

Medlem sedan jan. 2001795 inlägg
#11

Tackar och bugar för tipsen

266 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)