LINUX.ORG.RU

передача в функцию многомерного массива


0

0

неужели есть только один способ.
void func(int (*mul_arr)[10]); ???
т.е. неужели является обязательным указание кол-ва столбцов.

а если я хочу написать функцию которая перемножает 
матрицы с разным кол-вом столбцов.(не в данный момент а вообще).

func (matr1, matr2, 3); перемножаются матрицы 3х3
func (matr3, matr4, 5); перемножаются матрицы 5x5 

как быть???
★★

Передавай указатель и размерности 

function foo(int *bar,int cols, int rows)

только тогда в теле функции и организуй доступ к элементам через указатель а-ля

*(bar+i*cols+j)=blabla (вместо bar[i][j]=blabla)

r_asian ★☆☆
()

в Ц нету массивов как типа! есть указатель на первый элемент - этим и надо пользоваться

Pi ★★★★★
()
Ответ на: комментарий от r_asian

2r_asian && 2PI:
да спасибо все получилось...

tugrik ★★
() автор топика
Ответ на: комментарий от Pi

> в Ц нету массивов как типа! есть указатель на первый элемент - 
> этим и надо пользоваться

Ну это, положим, неправда:

#include <stdlib.h>
#include <stdio.h>

int main() {
    int arr[10];
    int *ptr;

    ptr = malloc(10*sizeof(int));

    printf("Sizeof array: %d, sizeof int ptr: %d\n", sizeof(arr), sizeof(ptr));
}

anonymous
()
Ответ на: комментарий от Pi

То, что оператор [] можно применять как к массивам, так и к указателям (ибо это оператор адресной арифметики), не отменяет того факта, что указатель и массив - это разные типы данных. Hint:

char a[] = "foo";

do { printf("%c\n", *a);} while(*++a);

А потом поменяй на char *a = "foo";

anonymous
()

В C99 были добавлины массивы переменной длины. Однако реализация этих массивов до сих пор хромала. Кстати интересно, как обстаят дела с VLA в gcc 4.x ?

bbk123 ★★★★★
()
Ответ на: комментарий от anonymous

>На C++, но:

На СИ тоже.

>const char * и char const * и const char const * - это три разные вещи.

Ага, а мужики-то не знали. ;) Ты это к чему вообще?

devinull ★★
()
Ответ на: комментарий от r_asian

это ж адресная арифметика, тут и так можно:

int **a; a = (int**) malloc(sizeof(int)* rows *(1+cols)) for (i=0; i<rows; i++) *(a+i) = (int *) (a + rows + i * cols);

после чего спокойно работаем, используя a[i][j]

anonymous
()
Ответ на: комментарий от r_asian

это ж адресная арифметика, тут и так можно:

int **a;
a = (int**) malloc(sizeof(int)* rows *(1+cols))
for (i=0; i<rows; i++)
    *(a+i) = (int *) (a + rows + i * cols);

после чего спокойно работаем, используя a[i][j]

anonymous
()
Ответ на: комментарий от anonymous

> const char * и char const * и const char const * - это три разные вещи.

парень, const char * и char const * это в точности одно и то же

dilmah ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.