2010-06-02 2 views
2

Я знаю, что это просто, но я не могу сделать эту работу.Пропустить 2d массив для работы в C?

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

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; 
} 

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

EDIT:

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

+0

Работает для меня с использованием gcc. Вы уверены, что у вас есть 5 в качестве числа столбцов для объявления массива и параметра GefMain? – user85509

+1

Код, который вы опубликовали, будет компилироваться без каких-либо ошибок или предупреждений. Вы должны размещать фальшивый код. Пожалуйста, опубликуйте настоящий. – AnT

+0

ahh ok вы не используете gcc ... gcc даже с параметрами '-std = c99 -pedantic' не выдают никаких предупреждений (без -std = c99 жалуется на комментарий стиля) ... знание компилятора может помочь кому ваш компилятор, чтобы помочь вам! – ShinTakezou

ответ

2

Код в порядке. В одном файле этот компилятор отлично подходит для меня с gcc.

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

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

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

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

+0

Да ... он только предупреждает. И вопрос в том, почему? – Simon

+0

Мой код в двух файлах, на самом деле. Это что-нибудь изменит? Единственное отличие в коде заключается в том, что в объявлении в основном файле есть «extern int», а не только int. – Evelyn

+0

То же самое ... он компилируется нормально даже с опцией '-pedantic' и extern int. – ShinTakezou

0

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; 
} 

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

+3

Это не будет «более портативным». Код OP является стандартным и портативным, каким он может когда-либо быть. – AnT

+0

К сожалению, я по-прежнему получаю ту же ошибку. – Evelyn

+1

и, кстати, ответ неправильный, так как ваш код идеально подходит для стандартной (и такой переносимости) точки зрения (он не использует никакой gcc ext, и вы вообще не используете gcc!)! скажите нам, какой именно компилятор вы используете (и версию). – ShinTakezou

1

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

Смежные вопросы