Неявное объявление функции недействительно в 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 перед использованием.

Чтобы решить это,

  1. или #include заголовочный файл, содержащий объявление getk_vector_calculation() в вашем файле [С учетом getk_vector_calculation() находится в каком-то другом файле]
  2. или добавить предварительную декларацию 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,

Несколько вопросов здесь:

  1. Как указывал Сурав Гош, вы определяете k_vector_calculation(), но потом попробуй позвонить getk_vector_calculation(), Вы должны использовать правильные имена.

  2. Вы говорите, что хотите "получить массив из другой функции" - вы просто не можете сделать это в C.

  3. Вы не показываете весь свой код для k_vector_calculation(), но, как показано, эта функция будет вызывать себя вечно, потому что последнее, что она делает, это безоговорочно вызывает себя снова. Если у вас есть рекурсивная функция, вам нужно дать ей способ завершиться.

  4. &krec[3] это адрес четвертого элемента массива k, что вы не хотите делать, тем более что ваш массив содержит только 3 элемента. Чтобы обратиться к самому массиву, просто используйте krec,

  5. char krec[3] = getk_vector_calculation(&krec[3]); является недействительным по многим причинам. Во-первых, вы не можете инициализировать массивы таким способом в C. Во-вторых, см. Пункт (4) для вашего аргумента. В-третьих, даже если бы вы могли инициализировать массивы таким способом в C, вы бы попытались передать неинициализированный массив в функцию, инициализировать его там, а затем попытаться инициализировать ваш исходный массив с результатом. Это просто не имеет смысла.

  6. Вы также пишете свои функции для работы с массивом 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;
}
Другие вопросы по тегам