Неявное объявление функции недействительно в C99
Я новичок в языке Си, и у меня возникла проблема, которую я действительно не понимаю. Я пытаюсь получить массив из другой функции, но когда я пытаюсь извлечь информацию, она выдает мне следующее предупреждение:
Неявное объявление функции 'getk_vector_calculation' недопустимо в C99 Инициализатор массива должен быть списком инициализатора или строковым литералом
Вот код:
int k_vector_calculation(int krec[3])
{
...
krec [0] = l*u[0]+m*v[0]+o*[0] ;
krec [1] = l*u[1]+m*v[1]+o*[1] ;
krec [2] = l*u[2]+m*v[2]+o*[2] ;
return k_vector_calculation( &krec[3] )
}
int main ()
{
char krec[3] = getk_vector_calculation(&krec[3]);
...
}
3 ответа
В вашем main()
функция, которую вы вызвали getk_vector_calculation()
[который не k_vector_calculation()
] и который не declared
или же defined
перед использованием.
Чтобы решить это,
- или
#include
заголовочный файл, содержащий объявлениеgetk_vector_calculation()
в вашем файле [С учетомgetk_vector_calculation()
находится в каком-то другом файле] - или добавить предварительную декларацию
getk_vector_calculation()
доmain()
и определитьgetk_vector_calculation()
где-то.
Чтобы узнать больше о неявном объявлении, вы можете проверить этот вопрос.
РЕДАКТИРОВАТЬ:
Как уже отмечали другие, в вашем фрагменте кода есть еще много проблем. Но поскольку название вопроса ограничено implicit declaration
Ошибка, ИМО, этот ответ должен сделать необходимый. Оставшаяся ошибка (и) - это (вообще) другой аспект.
В более старых версиях C функции, которые еще не были объявлены, можно было вызывать, и предполагалось, что они вернулись int
и принял неуказанное количество аргументов. Строго говоря, в C99 запрещено вызывать функцию без ее предварительного объявления.
Однако в вашем случае вы пытаетесь вызвать функцию с именем getk_vector_calculation
но вы определили функцию под названием k_vector_calculation
(нет get
в начале).
Вы также пытаетесь инициализировать массив с помощью функции, что недопустимо (в C функции не могут возвращать массивы). Просто объявите массив и вызовите k_vector_calculation
как отдельное утверждение, например:
int krec[3] = {0};
k_vector_calculation(krec);
Не использовать &krec[3]
так как это указывает на неверное местоположение. использование &krec[0]
предоставить адрес первого элемента в массиве, или, что эквивалентно, просто krec
Сделаю. Nb также, что вы объявляете массив типа char
, но ваша функция принимает указатель на int
и эти типы не совместимы. Ваша функция также безоговорочно вызывает себя, поэтому существует гарантированная бесконечная рекурсия, если вычеркнутый код не возвращает условно. Если вашей функции не нужно вызывать себя, и она не возвращает значение какой-либо важности, измените тип возвращаемого значения на void
чтобы указать, что он не имеет возвращаемого значения.
Поскольку вы используете C99, вы можете воспользоваться static
ключевое слово в объявлении параметра вашей функции:
void k_vector_calculation(int krec[static 3])
{
// ... other code here ...
krec[0] = l*u[0]+m*v[0]+o*[0];
krec[1] = l*u[1]+m*v[1]+o*[1];
krec[2] = l*u[2]+m*v[2]+o*[2];
}
Приведенный выше код объявляет функцию, которая принимает в качестве аргумента массив по крайней мере 3 int
,
Несколько вопросов здесь:
Как указывал Сурав Гош, вы определяете
k_vector_calculation()
, но потом попробуй позвонитьgetk_vector_calculation()
, Вы должны использовать правильные имена.Вы говорите, что хотите "получить массив из другой функции" - вы просто не можете сделать это в C.
Вы не показываете весь свой код для
k_vector_calculation()
, но, как показано, эта функция будет вызывать себя вечно, потому что последнее, что она делает, это безоговорочно вызывает себя снова. Если у вас есть рекурсивная функция, вам нужно дать ей способ завершиться.&krec[3]
это адрес четвертого элемента массиваk
, что вы не хотите делать, тем более что ваш массив содержит только 3 элемента. Чтобы обратиться к самому массиву, просто используйтеkrec
,char krec[3] = getk_vector_calculation(&krec[3]);
является недействительным по многим причинам. Во-первых, вы не можете инициализировать массивы таким способом в C. Во-вторых, см. Пункт (4) для вашего аргумента. В-третьих, даже если бы вы могли инициализировать массивы таким способом в C, вы бы попытались передать неинициализированный массив в функцию, инициализировать его там, а затем попытаться инициализировать ваш исходный массив с результатом. Это просто не имеет смысла.Вы также пишете свои функции для работы с массивом
int
, но объявляюkrec
вmain()
как массивchar
,
Непонятно чего ты хочешь k_vector_calculation()
делать, но вы просто не можете вернуть массивы в C, как это. Вероятно, вам нужно просто передать массив функции, включить функцию и ничего не возвращать. Например:
#include <stdio.h>
void k_vector_calculation(int kvec[])
{
kvec[0] = 1;
kvec[1] = 2;
kvec[2] = 3;
}
int main(void)
{
int kvec[3];
k_vector_calculation(kvec);
for ( int i = 0; i < 3; ++i ) {
printf("kvec[%d] is %d.\n", i, kvec[i]);
}
return 0;
}