LINUX.ORG.RU

sorry
Столкнулся с такой траблой.
uchar a[10][10];
myfunc(uchar *b)

int main(void) { myfunc(a); }

myfunc(uchar *b)
{ int i,j;
for(i=0;i<10; i++)
for(j=0;j<10; j++) { b[i][j]=i*j; }
}
компилятор ругается.

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

uchar a[10][10];
myfunc(uchar *b);

int main(int argc, char *argv[])
{
myfunc(a);
}

myfunc(uchar *b)
{ int i,j;
for(i=0;i<10; i++)
for(j=0;j<10; j++) { b[i][j]=i*j; }
}
компилятор ругается иммено на b[][].

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

Это намек на то, что argv является как раз двумерным массивом ;) Или,
иначе говоря, _массивом_ _массивов_ ;) Понятно? Вобщем,

uchar a[10][10];

//...

void myfunc(uchar **a)
{
//...
}

Если a[10][10][10], то

void myfunc(uchar ***a)

и т.д.

murla
()

Так делать нельзя.

Подумай, откуда при компиляции функции компилер узнает, какой размер массива?

Либо фиксируй размер явно:
myfunc(uchar b[10][10]); либо (как все обычно делают) пользуйся не
uchar a[10][10];
а
uchar **a; и размещай динамически:

a=calloc(10, sizeof(uchar*));
for(i=0; i<10; i++)
a[i]=calloc(10, sizeof(uchar));

А murla неправильно написал.

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

> Так делать нельзя.
> Подумай, откуда при компиляции функции компилер узнает, какой размер
> массива?

Вообще да, правильно - с многомерными гемор. Я ими вообще стараюсь не
пользоваться. Лучше так:

double array[nx*ny];

void f(double *array, int nx, int ny)
{
    int i, j;
    for (i = 0; i < nx; i++)
        for (j = 0; j < ny; j++)
            array[i*ny + j] = ...;
}

но без указания размеров все равно не обойтись, конечно :) ...

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

А еще лучше, ИМХО,

double array[nx*ny];

void f(double *array, int nx, int ny)
{
    int i, j;
    for (i = 0; i < nx; i++)
        for (j = 0; j < ny; j++, array++)
            *array = ...;
}

Может, правда, херово читается?

ay49Mihas
()

в С нету массивов!

осознавая это не ошибёшься

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

>         for (j = 0; j < ny; j++, array++)
>             *array = ...;
> Может, правда, херово читается?

Ага :)
   ...
   for (j = 0; j < ny; j++, array++)
      *array++ = ...;

наверно, чуть лучше будет :)

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