Форум: "Прочее";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];
ВнизДвумерный массив в качестве параметра с С++ Найти похожие ветки
← →
УАув (2007-09-08 20:49) [0]Как передать двумерный массив в функцию в качестве параметра? С одномерным понятно: как указатель на int. А как с двумерным? как указатель на указатель? Заранее благодарен!
← →
Anatoly Podgoretsky © (2007-09-08 20:52) [1]> УАув (08.09.2007 20:49:00) [0]
Указатель на массив известного типа, чего же еще
← →
DVM © (2007-09-08 20:53) [2]
> С одномерным понятно: как указатель на int.
причем здесь int?
← →
УАув (2007-09-08 21:08) [3]
> причем здесь int?
ну указатель на любой тип
← →
DVM © (2007-09-08 21:14) [4]
> ну указатель на любой тип
На твой тип массива указатель надо делать. А сколько он мерный - это без разницы.
← →
Sergey Masloff (2007-09-08 22:31) [5]ез разницы сколькимерный
← →
palva © (2007-09-08 23:06) [6]Можно как указатель на указатель. Но если размер фиксированный, то можно прямо в прототипе функции указать размер. Например:
#include <stdio.h>
void f(int i[][3]) {printf("%d\n", i[2][1]);}
int m[][3] = {{1,2},{3,4},{5,6}};
int main() {
f(m); // 6
return 0;
}
← →
_uw_ © (2007-09-08 23:50) [7]Вообще-то
int m[][2] = {{1,2},{3,4},{5,6}};
← →
palva © (2007-09-09 20:24) [8]_uw_ © (08.09.07 23:50) [7]
Да, ошибся. Хотя все равно работает, как написано.
← →
Галинка © (2007-09-18 13:02) [9]подниму тему.
как все же передать двумерный массив, чтобы потом можно было как-то "по-человечески" к его элементам обращаться? Пока имею только:
struct ArrGroesse{
int Laenge;
int Breite;
};
void PrintMatrix(double *arr, int _zeil, int _spal){
int i, j;
for(i=0; i<_zeil; i++){
for(j=0; j<_spal; j++)
printf("%10.3f", arr[i*_spal+j]);
printf("\n");
}
}
struct ArrGroesse GetGroesse(void){
struct ArrGroesse _c_gr;
printf("Geben Sie bitte Anzahl der Zeilen des Matrix ein: ");fflush(stdout);
scanf("%d", &_c_gr.Laenge);
printf("Geben Sie bitte Anzahl der Spalten des Matrix ein: ");fflush(stdout);
scanf("%d", &_c_gr.Breite);
return _c_gr;
}
int main(void){
double *a;
int i, j, rank;//, m, n;
double eps = 0.0000001;
struct ArrGroesse arr_gr = GetGroesse();
a = (double *)malloc(arr_gr.Breite*arr_gr.Laenge*sizeof(double));
for(i=0; i<arr_gr.Laenge; ++i)
for(j=0; j<arr_gr.Breite; ++j)
a[i*arr_gr.Breite+j] = 10.0*rand()/(RAND_MAX + 1.0);
printf("\n\nEingangsmatrix: \n");
PrintMatrix(a, arr_gr.Laenge, arr_gr.Breite);fflush(stdout);
return 0;
}
кривенько, но работает. Но запись arr[i*_spal+j] немного не привычна. По-другому никак нельзя?
← →
Игорь Шевченко © (2007-09-18 13:19) [10]
> как все же передать двумерный массив, чтобы потом можно
> было как-то "по-человечески" к его элементам обращаться?
>
void foo(int** bar)
{
int i = 0, j = 1;
bar[i][j] = 3;
}
?
← →
_uw_ © (2007-09-18 13:25) [11]Хочешь так, хочешь эдак:
typedef int ints_t[3][4];
void func(ints_t a)
{
int b = a[2][2];
}
void func2(int in[3][4])
{
int b = in[2][2];
}
void foo()
{
ints_t ints = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};
ints[2][2] = 11;
int siz = sizeof(ints);
ints_t *inp = (ints_t *)malloc(siz);
memcpy(*inp, ints, siz);
(*inp)[2][2] = 13;
func(*inp);
func(ints);
func2(ints);
}
← →
palva © (2007-09-18 13:28) [12]> По-другому никак нельзя?
Можно.
void PrintMatrix(double *arr, int _zeil, int _spal){
#define ARR(i,j) arr[(i)*_spal+(j)]
int i, j;
for(i=0; i<_zeil; i++){
for(j=0; j<_spal; j++)
printf("%10.3f", ARR(i, j));
printf("\n");
}
}
Но было бы корректнее перейти на C++, где можно заменить массив классом с переопределением операции []. Тогда вообще швы будут незаметны.
← →
Галинка © (2007-09-18 13:41) [13]Игорь Шевченко © (18.09.07 13:19) [10]
вчера целый вечер разбирала этот вариант. Было что-то типа:
int arr_summ(int *c_arr[]){
int i, j, summ = 0;
for(i=0; i<5; i++)
for(j=0;j<5;j++)
summ += new_arr[i][j];
return summ;
}
int main(void){
int new_arr[5][5];
for(i=0; i<5; i++)
for(j=0;j<5;j++)
new_arr[i][j] = 10.0*rand()/(RAND_MAX + 1.0);
int summ = arr_summ(new_arr);
return 0;
}
чем это принципиально отличается от предложенного тобой?
← →
Игорь Шевченко © (2007-09-18 13:46) [14]
> чем это принципиально отличается от предложенного тобой?
Ничем, кроме записи
← →
Галинка © (2007-09-18 14:18) [15]тогда почему компилятор давал ошибку несовпадения типов, типа
int ** expected but int *[5] find
← →
Игорь Шевченко © (2007-09-18 14:23) [16]
> тогда почему компилятор давал ошибку несовпадения типов,
> типа
>
> int ** expected but int *[5] find
потому что int*[5] и int*[] - это разные записи. Даже по количеству символов. Не веришь- посчитай.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.039 c