Передать 2d массив для работы в C? - PullRequest
2 голосов
/ 02 июня 2010

Я знаю, что это просто, но я не могу заставить это работать.

Моя функция такова:

 int GefMain(int array[][5])
 {
      //do stuff
      return 1;
 }

В моем основном:

 int GefMain(int array[][5]);

 int main(void)
 {
      int array[1800][5];

      GefMain(array);

      return 0;
 }

Я упомянул этот полезный ресурс, но явсе еще появляется ошибка "warning: passing argument 1 of GefMain from incompatible pointer type." Что я делаю не так?

РЕДАКТИРОВАТЬ:

Код находится в двух файлах, связанных компилятором.Я не использую GCC.Приведенный выше код является именно тем, что у меня есть, за исключением того, что функция объявлена ​​как "extern int" в основном.Спасибо всем за ваше время.

Ответы [ 3 ]

2 голосов
/ 02 июня 2010

Код в порядке. В одном файле это прекрасно для меня компилируется с помощью gcc.

int g(int arr[][5])
{
    return 1;
}

int main()
{
    int array[1800][5];
    g(array);
    return 0;
}

Я предполагаю, что вы #include используете неправильный файл - возможно, тот, который имел другое объявление для GefMain. Или, возможно, вы просто не сохранили файл, объявивший GefMain, поэтому он по-прежнему имеет аргумент, например, int [][3], который может вызвать предупреждение.

Я бы посоветовал вам опубликовать весь код, чтобы воспроизвести проблему (разумеется, после того, как вы удалите все, что не нужно для ее воспроизведения). Но, скорее всего, в этот момент вы решите это сами.

1 голос
/ 02 июня 2010

Правильно компилируется даже с параметрами -std=c99 -pedantic. И все равно выглядит правильно ... Это действительно код, который вы хотите проверить? Компилятор, который вы используете ...?

0 голосов
/ 02 июня 2010

gcc будет иметь расширения для того, что у вас было (а у других был успех). Вместо этого попробуйте это, это будет более переносимым для других компиляторов c:

int g(int (* arr)[5])
{
    return 1;
}

int main()
{
    int array[1800][5];
    g(array);
    return 0;
}

или еще лучше;

int g(int (* arr)[5], int count)
{
    return 1;
}

int main()
{
    int array[1800][5];
    g(array, sizeof(array)/sizeof(* array));
    return 0;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...