Muszę to zrobić, aby kontynuować operacje również na macierzy. Czy to oznacza, że należy go przekazać przez odniesienie?Jak przekazać tablicę 2D (macierz) do funkcji w C?
Czy to wystarczy?
void operate_on_matrix(char matrix[][20]);
Muszę to zrobić, aby kontynuować operacje również na macierzy. Czy to oznacza, że należy go przekazać przez odniesienie?Jak przekazać tablicę 2D (macierz) do funkcji w C?
Czy to wystarczy?
void operate_on_matrix(char matrix[][20]);
C tak naprawdę nie ma tablic wielowymiarowych, ale istnieje kilka sposobów, aby je symulują. Sposób przekazywania takich tablic do funkcji zależy od sposobu symulowania wielu wymiarów:
1) Użyj tablicy tablic. To może być stosowany tylko wtedy, gdy granice tablicy są w pełni ustalona w czasie kompilacji, czy kompilator obsługuje VLA's:
#define ROWS 4
#define COLS 5
void func(int array[ROWS][COLS])
{
int i, j;
for (i=0; i<ROWS; i++)
{
for (j=0; j<COLS; j++)
{
array[i][j] = i*j;
}
}
}
void func_vla(int rows, int cols, int array[rows][cols])
{
int i, j;
for (i=0; i<rows; i++)
{
for (j=0; j<cols; j++)
{
array[i][j] = i*j;
}
}
}
int main()
{
int x[ROWS][COLS];
func(x);
func_vla(x, rows, cols);
}
2) Użyj (dynamicznie przydzieloną) tablicę wskaźników do (dynamicznie alokowanych) tablic. Jest używany głównie wtedy, gdy granice tablicy są nieznane do czasu wykonania.
void func(int** array, int rows, int cols)
{
int i, j;
for (i=0; i<rows; i++)
{
for (j=0; j<cols; j++)
{
array[i][j] = i*j;
}
}
}
int main()
{
int rows, cols, i;
int **x;
/* obtain values for rows & cols */
/* allocate the array */
x = malloc(rows * sizeof *x);
for (i=0; i<rows; i++)
{
x[i] = malloc(cols * sizeof *x[i]);
}
/* use the array */
func(x, rows, cols);
/* deallocate the array */
for (i=0; i<rows; i++)
{
free(x[i]);
}
free(x);
}
3) Użyj jednowymiarowej tablicy i popraw indeksy. Może być stosowany zarówno statycznie przydzielonego (o stałym rozmiarze) i dynamicznie przydzielane tablice:
void func(int* array, int rows, int cols)
{
int i, j;
for (i=0; i<rows; i++)
{
for (j=0; j<cols; j++)
{
array[i*cols+j]=i*j;
}
}
}
int main()
{
int rows, cols;
int *x;
/* obtain values for rows & cols */
/* allocate the array */
x = malloc(rows * cols * sizeof *x);
/* use the array */
func(x, rows, cols);
/* deallocate the array */
free(x);
}
Nie wiem co masz na myśli przez "dane dont get lost". Oto w jaki sposób można przejść normalny 2D tablicę do funkcji:
void myfunc(int arr[M][N]) { // M is optional, but N is required
..
}
int main() {
int somearr[M][N];
...
myfunc(somearr);
...
}
Losowe factoid: Powodem N jest wymagane jest, ponieważ komputer musi wiedzieć, jak daleko, aby zwiększyć wskaźnik dla każdego „rzędu”. Naprawdę, wszystkie wymiary oprócz pierwszego są konieczne. C przechowuje tablice jako fragmenty pamięci, bez ograniczników. –
Dane nie gubią się bez użycia malloc. Dzięki za pomoc. – Shweta
@ Christian Mann: To dobry faktor. Zdarzyło mi się napisać na ten temat skomplikowane wyjaśnienie :-) http://stackoverflow.com/questions/3906777/error-defining-and-initializing-multidimensional-array/3910533#3910533 – Arun
Jeśli kompilator nie obsługuje Włas, można to zrobić w prosty sposób poprzez przepuszczenie 2d tablicę int * z rzędu i col. W funkcji odbiorczej zregeneruj indeks tablicy 1d z indeksów tablic 2d.
int
getid(int row, int x, int y) {
return (row*x+y);
}
void
printMatrix(int*arr, int row, int col) {
for(int x = 0; x < row ; x++) {
printf("\n");
for (int y = 0; y <col ; y++) {
printf("%d ",arr[getid(row, x,y)]);
}
}
}
main()
{
int arr[2][2] = {11,12,21,22};
int row = 2, col = 2;
printMatrix((int*)arr, row, col);
}
#include <iostream>
using namespace std;
void printarray(int *a, int c,int r)
{
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
cout << "\t" << *(a + i*c + j) << "\t"; // a is a pointer refer to a 2D array
}
cout << endl << "\n\n";
}
}
int main()
{
int array[4][4] =
{{1 ,2 ,3 ,4 },
{12,13,14,5 },
{11,16,15,6 },
{10,9 ,8 ,7 }};
printarray((int*)array,4,4);
// here I use print function but u can use any other useful function like
//setArray((int *) array,4,4);
return 0;
}
To jest oznaczony C, nie C++. – Lundin
W powyższy sposób kod nie zostanie skompilowany. "rzędy" i "cols" w wierszach 17 i 35 muszą zmienić się odpowiednio na "ROWS" i "COLS". – KZcoding
'void func_vla (int array [rows] [cols], int rows, int cols)' powinno być 'void func_vla (int rows, int cols, int array [rows] [cols])' –