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

Как передать матрицу m в foo ()? если мне не разрешено изменять код или прототип foo ()?

void foo(float **pm)
{
    int i,j;
    for (i = 0; i < 4; i++)
        for (j = 0; j < 4; j++)
            printf("%f\n", pm[i][j]);

}

int main ()
{
    float m[4][4];

    int i,j;
    for (i = 0; i < 4; i++)
        for (j = 0; j < 4; j++)
            m[i][j] = i+j;

    foo(???m???);
}
10
задан user424346 18 August 2010 в 17:52
поделиться

7 ответов

Если вы не можете изменить foo () , вам нужно будет изменить m . Объявите его как float ** m и выделите память соответствующим образом. Затем вызовите foo () . Примерно так:

float **m = malloc(4 * sizeof(float *));
int i, j;
for (i = 0; i < 4; i++)
{
    m[i] = malloc(4 * sizeof(float));
    for (j = 0; j < 4; j++)
    {
        m[i][j] = i + j;
    }
}

Не забудьте после этого free () !

8
ответ дан 3 December 2019 в 15:05
поделиться

Если у вас есть компилятор, поддерживающий C99, текущий стандарт C, вы можете сделать это:

foo((float *[]){ m[0], m[1], m[2], m[3] });

(Обратите внимание, что это в точности то же самое, что и AndreyT ' s ответ, за исключением того, что в нем не требуется указывать имя временного массива)

2
ответ дан 3 December 2019 в 15:05
поделиться

Вы не можете. m несовместимо с аргументом foo . Вам придется использовать временный массив указателей.

int main()
{
    float m[4][4];
    int i,j;

    float *p[4];

    p[0] = m[0];
    p[1] = m[1];
    p[2] = m[2];
    p[3] = m[3];

    for (i = 0; i < 4; i++)
        for (j = 0; j < 4; j++)
            m[i][j] = i+j;


    foo(p);
3
ответ дан 3 December 2019 в 15:05
поделиться

void foo (float ** pm) то же самое, что void foo (float * pm []) , то есть не двумерный массив чисел с плавающей запятой. Это массив float * . Эти float * могут сами указывать на массивы float, но это отдельный вопрос.

0
ответ дан 3 December 2019 в 15:05
поделиться
typedef float Float4[4];

void foo(Float4 *pm)
{
  int i,j;
  for (i = 0; i < 4; i++)
    for (j = 0; j < 4; j++)
      printf("%f\n", pm[i][j]);
}

main()
{
  Float4 m[4];

  int i,j;
  for (i = 0; i < 4; i++)
    for (j = 0; j < 4; j++)
      m[i][j] = i+j;

  foo(m);
  return 0;
}
0
ответ дан 3 December 2019 в 15:05
поделиться

Если вы настаиваете на приведенном выше объявлении foo , то есть

void foo(float **pm)

, и на использовании встроенного 2D-массива, то есть

float m[4][4];

, тогда единственный способ сделать ваша foo работа с m состоит в том, чтобы создать дополнительный массив «индекса строки» и передать его вместо m

...
float *m_rows[4] = { m[0], m[1], m[2], m[3] };
foo(m_rows);

Нет возможности передать m на foo напрямую. Это невозможно. Тип параметра float ** безнадежно несовместим с типом аргумента float [4] [4] .

Кроме того, поскольку C99 вышесказанное может быть выражено более компактно как

foo((float *[]) { m[0], m[1], m[2], m[3] });

P.S. Если вы посмотрите внимательно, вы увидите, что это в основном то же самое, что Карл Норум предложил в своем ответе. За исключением того, что Карл malloc занимает память массива, что не является абсолютно необходимым.

15
ответ дан 3 December 2019 в 15:05
поделиться

Не работает ли foo (m) ?

0
ответ дан 3 December 2019 в 15:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: