Answer-ID
  • Întrebări
  • Tag-uri
  • Categorii
Notificări
Recompense
Înregistrare
După înregistrare, veți primi notificări despre răspunsurile și comentariile la întrebările DVS.
Logare
Dacă aveţi deja un cont, autentificaţi-vă pentru a verifica notificările noi.
Aici vor fi recompensele pentru întrebările, răspunsurile și comentariile adăugate sau modificate.
Mai mult
Sursă
Editează
 David
David

Transmiterea matricelor multidimensionale ca argumente funcționale în C

În C, pot trece o matrice multidimensională unei funcții ca un singur argument atunci când nu știu care vor fi dimensiunile matricei?

În plus, matricea mea multidimensională poate conține alte tipuri decât șiruri de caractere.

51 2008-08-06T22:01:25+00:00 4
Programare
c
Comentarii la întrebare (0)
andrewrk
1 ianuarie 1970 в 3:00
1970-01-01T03:00:00+00:00
Mai mult
Sursă
Editează
#4192

Puteți face acest lucru cu orice tip de date. Pur și simplu face-o un pointer-la-pointer:

typedef struct {
  int myint;
  char* mystring;
} data;

data** array;

Dar nu uitați că încă trebuie să malloc variabila, și se face un pic mai complex:

//initialize
int x,y,w,h;
w = 10; //width of array
h = 20; //height of array

//malloc the 'y' dimension
array = malloc(sizeof(data*) * h);

//iterate over 'y' dimension
for(y=0;y

Codul de alocare a structurii arată similar - nu uitați să sunați gratuit () pe tot ce ați mallocat! (De asemenea, în aplicații robuste, trebuie să să verificați returnarea malloc () .)

Acum, să presupunem că doriți să transmiteți această funcție unei funcții. Puteți utiliza în continuare pointerul dublu, deoarece probabil că doriți să faceți manipulări pe structura de date, nu pe pointer la indicii structurilor de date:

int whatsMyInt(data** arrayPtr, int x, int y){
  return arrayPtr[y][x].myint;
}

Apelați această funcție cu:

printf("My int is %d.\n", whatsMyInt(array, 2, 4));

ieşire:

My int is 6.
0
0
Comentarii (0)
John Bode
1 ianuarie 1970 в 3:00
1970-01-01T03:00:00+00:00
Mai mult
Sursă
Editează
#1916200

Treceți un pointer explicit la primul element cu dimensiunile matricei ca parametri separați. De exemplu, pentru a manipula matrice arbitrar de 2-d de int:

void func_2d(int *p, size_t M, size_t N)
{
  size_t i, j;
  ...
  p[i*N+j] = ...;
}

care ar fi numit ca

...
int arr1[10][20];
int arr2[5][80];
...
func_2d(&arr1[0][0], 10, 20);
func_2d(&arr2[0][0], 5, 80);

Același principiu se aplică și pentru rețelele cu dimensiuni mai mari:

func_3d(int *p, size_t X, size_t Y, size_t Z)
{
  size_t i, j, k;
  ...
  p[i*Y*Z+j*Z+k] = ...;
  ...
}
...
arr2[10][20][30];
...
func_3d(&arr[0][0][0], 10, 20, 30);
0
0
Comentarii (0)
Pedro
1 ianuarie 1970 в 3:00
1970-01-01T03:00:00+00:00
Mai mult
Sursă
Editează
#8712577
int matmax(int **p, int dim) // p- matrix , dim- dimension of the matrix 
{
    return p[0][0];  
}

int main()
{
   int *u[5]; // will be a 5x5 matrix

   for(int i = 0; i < 5; i++)
       u[i] = new int[5];

   u[0][0] = 1; // initialize u[0][0] - not mandatory

   // put data in u[][]

   printf("%d", matmax(u, 0)); //call to function
   getche(); // just to see the result
}
0
0
Comentarii (0)
rslemos
1 ianuarie 1970 в 3:00
1970-01-01T03:00:00+00:00
Mai mult
Sursă
Editează
#24623778

Vă puteți declara funcția ca:

f(int size, int data[][size]) {...}

Compilatorul va face apoi toate aritmetica pointer pentru tine.

Rețineți că dimensiunile dimensiunilor trebuie să apară înainte de matricea însăși.

GNU C permite redirecționarea declarației argumentului (în cazul în care într-adevăr trebuie să treceți dimensiunile după matrice):

f(int size; int data[][size], int size) {...}

Prima dimensiune, deși puteți trece și ca argument, este inutilă pentru compilatorul C (chiar și pentru operatorul sizeof, atunci când este aplicat peste matrice trecut ca argument va trata întotdeauna este ca un pointer la primul element).

0
0
Comentarii (0)
Adăugati o întrebare
Categorii
Toate
Tehnologii
Cultură
Viață / Artă
Stiință
Profesii
Afaceri
ID
KO
RU
© Answer-ID 2021
Sursă
stackoverflow.com
în cadrul licenței cc by-sa 3.0 cu atribuire