Ошибка конфликтующих типов в объявлении функции деления с функцией с плавающей запятой - PullRequest
0 голосов
/ 11 марта 2020

Предполагалось, что это рекурсивная функция, которая продолжает добавлять к 'h' значения 1 / i, пока i меньше, чем 'h', но я продолжаю получать ошибку конфликтующих типов в объявлении функции, что я делаю неправильно? Это просто происходит с поплавком.

#include <stdio.h>

int main()
{
    int i=0, n = 5;
    float h;
    division(i, n, h);
    return 0;
}

float division(int i, int n, float h)
{
    if(i<n)
    {
        h += 1/i;
        division(i, n, h);
    }
    else
    {
        printf("the sum is: %f",h);
        return h;
    }
}

Ответы [ 4 ]

3 голосов
/ 11 марта 2020

Проблема, приводящая к «ошибке конфликтующих типов», заключается в том, что в области действия не существует объявления функции division() в точке, где main() пытается ее вызвать. Такой вызов функции является несоответствующим начиная с C99, но многие компиляторы предоставляют неявное объявление для использования в таком вызове функции, потому что это было поведение изначального C и поддерживается через C90.

HOWEVER, неявное объявление, используемое в этом случае, будет эквивалентно

int division(int i, int n, double h);

, что не соответствует и не совместимо с фактической сигнатурой функции. Когда компилятор позже обнаруживает это, он выдает диагностику c, чтобы предупредить вас об этом. Возможно, он отклоняет код по этой причине - это не ясно из вопроса.

Чтобы разрешить ситуацию, вы должны объявить функцию перед ее (первым) использованием. Один из способов сделать это - переместить все определение division до main(), но вы также можете просто поместить предварительное объявление функции перед main(). Это выглядело бы аналогично приведенному выше (неправильному) объявлению, но оно правильно отражало бы истинный тип возвращаемого значения функции и типы параметров:

float division(int i, int n, float h);
2 голосов
/ 11 марта 2020
  • Функция
float division(int i, int n, float h)

Используется используется до ее объявления, вы должны поместить объявление перед main или просто переместить его перед main. Это является причиной ошибки, так как функция неявно объявлена, тип возвращаемого значения по умолчанию int, конфликтующий с определением.

Пара других проблем:

  • В той же функции возврат не всегда гарантируется.

  • В строке

h += 1/i;

У вас есть потенциальное деление на 0, что приводит к неопределенному поведению .

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

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

1 голос
/ 11 марта 2020

Объявите функцию, прежде чем использовать ее. Либо поместите определение функции перед main, либо вставьте объявление float division(int i, int n, float h); перед main.

Это требуется в современном C, но некоторые компиляторы примут декларацию по умолчанию, если вы ее не предоставите. Декларация по умолчанию имеет тип возврата int, который конфликтует с фактическим типом возврата вашей функции, float. Это вызывает сообщение об ошибке.

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

0 голосов
/ 12 марта 2020

Другая проблема помимо «конфликтующих типов»: бесконечная регрессия

Если i < n, то это будет верно в рекурсивном вызове.

float division(int i, int n, float h) {
    if(i<n) {
        h += 1/i;  // Note: integer division, like should be 1.0f/i;
        division(i, n, h);

Возможно, OP хочет следующее. Хотя я не уверен, но что-то, что меняет i.

        division(i+1, n, h);
...