Как передать N-мерный массив в функцию?
От: Аноним  
Дата: 23.06.04 04:59
Оценка:
Вот этот код не компилируется:

#include "stdafx.h"

int matrix[2][2] =
{
    1, 2,
    3, 4
};

void test(int *pM)
{
    printf("%d", pM[1][0]); // error C2109
}

int _tmain(int argc, _TCHAR* argv[])
{
    test(matrix); // error C2664
    return 0;
}

error C2109: subscript requires array or pointer type
error C2664: 'test' : cannot convert parameter 1 from 'int [2][2]' to 'int *'

Наверное, лет пять не работал с многомерными массивами. Вот теперь приспичило и на тебе... Подскажите, люди добрые, как это правильно делается?
Re: Как передать N-мерный массив в функцию?
От: Аноним  
Дата: 23.06.04 05:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вот этот код не компилируется:


А>
int matrix[2][2] = { };
А>void test(int *pM)
А>{
А>    printf("%d", pM[1][0]); // error C2109
А>}



А ежели объявить так:
void test(int **pM)
?
Re[2]: Как передать N-мерный массив в функцию?
От: Аноним  
Дата: 23.06.04 05:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А ежели объявить так:

А>
void test(int **pM)
?


А как тогда всунуть в функцию массив?

test(matrix); // error C2664

не срабатывает...

error C2664: 'test' : cannot convert parameter 1 from 'int [2][2]' to 'int ** '


Безумные комбинации, вроде test(&matrix), test(&matrix[0][0]), test(&&matrix) и т.п., тоже ни к чему хорошему не приводят. Так как же быть?
Re[3]: Как передать N-мерный массив в функцию?
От: andy_k  
Дата: 23.06.04 05:45
Оценка:
Здравствуйте, Аноним, Вы писали:
.....

так работает :
test((int **) matrix);
Re: Как передать N-мерный массив в функцию?
От: zubr Россия  
Дата: 23.06.04 05:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Наверное, лет пять не работал с многомерными массивами. Вот теперь приспичило и на тебе... Подскажите, люди добрые, как это правильно делается?


Если размерность N задана на перед то все просто! //только если N большое не красиво
int *** pf;
...
int func( int *** a );


Если N меняеться тогда я вижу только один выход — создать некую оболочку для массива.
Например такую

struct Array {
int dim;
int * arr;
};

и пару методов к нему...

воть, только сильно не пинайте — может я чего не понял.
Re[3]: Как передать N-мерный массив в функцию?
От: Denwer Россия  
Дата: 23.06.04 05:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>>А ежели объявить так:

А>>
void test(int **pM)
?


А>А как тогда всунуть в функцию массив?


А>
test(matrix); // error C2664

А>не срабатывает...

А>

error C2664: 'test' : cannot convert parameter 1 from 'int [2][2]' to 'int ** '


А>Безумные комбинации, вроде test(&matrix), test(&matrix[0][0]), test(&&matrix) и т.п., тоже ни к чему хорошему не приводят. Так как же быть?



Для того что бы у массива поиметь доступ к элументу нужно что бы компилятор знал один размер этого двухмерного массива, т.к. расчет ячейки памяти происходит по формуле ptr = row * sizeRow + col

вот пример

int data[5][3];

void func(int data[5][3])
{
 ...
}

void func(int data[5][]) 
{
 ...
}
Re[2]: Как передать N-мерный массив в функцию?
От: Denwer Россия  
Дата: 23.06.04 05:55
Оценка:
Здравствуйте, zubr, Вы писали:

Z>Здравствуйте, Аноним, Вы писали:


А>>Наверное, лет пять не работал с многомерными массивами. Вот теперь приспичило и на тебе... Подскажите, люди добрые, как это правильно делается?


Z>Если размерность N задана на перед то все просто! //только если N большое не красиво

Z>
Z>int *** pf;
Z>...
Z>int func( int *** a );
Z>


Если размерность задана на перед, то не лучше ли создать массив одним куском в памяти?
А то тебе придется много раз вызывать new/delete, а это не хорошо.

Z>Если N меняеться тогда я вижу только один выход — создать некую оболочку для массива.

Z>Например такую

Z>
Z>struct Array {
Z>int dim;
Z>int * arr;
Z>};
Z>

Z>и пару методов к нему...

Z>воть, только сильно не пинайте — может я чего не понял.


А вот тут лажа, ну будуешь ты знать что Н = 3, и что тебе это даст, как ты будешь обращаться к элементам массива то?
Тебе надо еще знать и размерность по каждому направлению(хотя для минимума на одно можно сократить)
Re[4]: Как передать N-мерный массив в функцию?
От: Аноним  
Дата: 23.06.04 05:59
Оценка:
Здравствуйте, Denwer, Вы писали:

D>Для того что бы у массива поиметь доступ к элументу нужно что бы компилятор знал один размер этого двухмерного массива, т.к. расчет ячейки памяти происходит по формуле ptr = row * sizeRow + col


D>вот пример


D>
D>int data[5][3];

D>void func(int data[5][3])
D>{
D> ...
D>}

D>void func(int data[5][]) 
D>{
D> ...
D>}
D>


Спасибо, дошло... Как всегда, оказывается, все очень просто и логично.
Re[3]: Как передать N-мерный массив в функцию?
От: zubr Россия  
Дата: 23.06.04 06:05
Оценка:
Здравствуйте, Denwer, Вы писали:

D>Если размерность задана на перед, то не лучше ли создать массив одним куском в памяти?

D>А то тебе придется много раз вызывать new/delete, а это не хорошо.

int * pf;
...
int func( int *a );


ну а так?

struct Array {
int dim;
int * dim_size; //храним ширину по данной размерности
int * arr;
};

D>А вот тут лажа, ну будуешь ты знать что Н = 3, и что тебе это даст, как ты будешь обращаться к элементам массива то?
D>Тебе надо еще знать и размерность по каждому направлению(хотя для минимума на одно можно сократить)

в новом свете пойдет?
И если пойдет то можно в принципе оба случая объединить?
Re[4]: Как передать N-мерный массив в функцию?
От: Анатолий Широков СССР  
Дата: 23.06.04 06:23
Оценка:
D>вот пример

...

Вы, наверное, хотели показать, что именно первая размерность не влияет на передачу многомерных массивов? Что
объявление функции


void func(int data[5][3]);


эквивалентно

void func(int data[][3]);


Что подобная функция может быть вызвана как для аргумента int a[5][3], так и для int a[2][3].

Да?
Re[4]: Как передать N-мерный массив в функцию?
От: Андрей Тарасевич Беларусь  
Дата: 23.06.04 06:32
Оценка:
Здравствуйте, andy_k, Вы писали:

_>Здравствуйте, Аноним, Вы писали:

_>.....

_>так работает :

_>test((int **) matrix);


Нет, разумеется. Так не работает.
Best regards,
Андрей Тарасевич
Re[2]: Как передать N-мерный массив в функцию?
От: Андрей Тарасевич Беларусь  
Дата: 23.06.04 06:33
Оценка: +1
Здравствуйте, zubr, Вы писали:

Z>Здравствуйте, Аноним, Вы писали:


А>>Наверное, лет пять не работал с многомерными массивами. Вот теперь приспичило и на тебе... Подскажите, люди добрые, как это правильно делается?


Z>Если размерность N задана на перед то все просто! //только если N большое не красиво

Z>
Z>int *** pf;
Z>...
Z>int func( int *** a );
Z>


Соврешенно бесполезно. Массивы размерности более единицы к многоуровневому указателю привести нельзя.
Best regards,
Андрей Тарасевич
Как передать N-мерный массив в функцию?
От: Андрей Тарасевич Беларусь  
Дата: 23.06.04 06:36
Оценка: +1
#Имя: FAQ.cpp.array2func
А>Вот этот код не компилируется:

А>
#include "stdafx.h"

А>int matrix[2][2] =
А>{
А>    1, 2,
А>    3, 4
А>};

А>void test(int *pM)
А>{
А>    printf("%d", pM[1][0]); // error C2109
А>}

А>int _tmain(int argc, _TCHAR* argv[])
А>{
А>    test(matrix); // error C2664
А>    return 0;
А>}

А>

error C2109: subscript requires array or pointer type
А>error C2664: 'test' : cannot convert parameter 1 from 'int [2][2]' to 'int *'

А>Наверное, лет пять не работал с многомерными массивами. Вот теперь приспичило и на тебе... Подскажите, люди добрые, как это правильно делается?

Если все размеры массива фиксированы (кроме, может быть, самой первой), то так

void test(int (*pM)[2])
{
   printf("%d", pM[1][0]);
}


Если все размеры точно фиксированы, то можно еще так

void test(int (&M)[2][2])
{
   printf("%d", M[1][0]);
}


или так

void test(int (*pM)[2][2])
{
   printf("%d", (*pM)[1][0]);
}
Best regards,
Андрей Тарасевич
Re: Как передать N-мерный массив в функцию?
От: Кодт Россия  
Дата: 23.06.04 09:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Наверное, лет пять не работал с многомерными массивами. Вот теперь приспичило и на тебе... Подскажите, люди добрые, как это правильно делается?


Посмотри книгу "Язык Си в вопросах и ответах"
http://faqs.org.ru/progr/c_cpp/cfaqrus.htm
Раздел 2, вопросы 2.9 и далее.

А если программируешь на С++, задумайся о многомерных контейнерах — vector<vector<T> >, всякие матрицы там...
Перекуём баги на фичи!
Re[2]: Как передать N-мерный массив в функцию?
От: Кодт Россия  
Дата: 23.06.04 09:30
Оценка:
К>http://faqs.org.ru/progr/c_cpp/cfaqrus.htm
К>Раздел 2, вопросы 2.9 и далее.

Пардон. Вопрос 2.10 и далее.
Соответственно, http://faqs.org.ru/progr/c_cpp/cfaqrus2.htm
Перекуём баги на фичи!
Re[5]: Как передать N-мерный массив в функцию?
От: Denwer Россия  
Дата: 23.06.04 11:58
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

Ну блин и старуху бывает проруха. Конечно попутал.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.