Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.14;
Скачать: CL | DM;

Вниз

Двумерный массив в качестве параметра с С++   Найти похожие ветки 

 
УАув   (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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.028 c
2-1189796974
AlRal
2007-09-14 23:09
2007.10.14
Поставить один GroupBox над другим


2-1190211725
azl
2007-09-19 18:22
2007.10.14
Как программно добавить новый пункт меню в PopupMenu?


15-1189419547
Галинка
2007-09-10 14:19
2007.10.14
Традиции программирования2: или ...


15-1190012820
Layner
2007-09-17 11:07
2007.10.14
Владельцы MS Vista! Запустите прогу Utils, отработает ли у вас


2-1190308371
Jimmy
2007-09-20 21:12
2007.10.14
Рисовать по региону