Функция Си двойного типа иногда работает при объявлении в определенных заголовках - PullRequest
0 голосов
/ 27 ноября 2018

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

double mapRange(double value, double r1, double r2, double n1, double n2)
{
    double res = n1+(value-r1)*((n2-n1)/(r2-r1));
    printf("dividingby: %f", res);putchar('\n');
    return res;
}

, как вы можете видеть, когда он печатает правильное значение, однако, когда я печатаю возвращенное значение из другой функции, такой как main, я получаю мусорцифры ... Хуже всего то, что я протестировал его на файле сам по себе, и он работал безупречно, я знаю, что это похоже на ошибку с моей стороны, но я действительно не могу найти объяснение этому ... Кто-то сталкивался с чем-то подобным?Мой компилятор сломан?Есть ли какие-то ограничения в C, о которых я не знаю?Я также знаю, что у меня не так много кода, чтобы предложить, чем этот, что делает его трудным для диагностики, но это из довольно небольшого проекта для унив ...

РЕДАКТИРОВАТЬ 1:Хорошо, так что

// main.c

 #ifndef UTIL_H
    #define UTIL_H
    #include "util.h"
    #endif /*UTIL_H*/

int main(int argc, char *argv[]) {
    Matrix* volcan = readVolcano("test.txt");
    double t;
    mapRange(7.0, 1.0, 9.0, 0.0, 1.0,&t);
    printf("%f\n..\n", t);
    mat_printinfo(volcan);
    mat_printmat(volcan, NULL);
    weighted_volcano(volcan, NULL, NULL, NULL);
    mat_free(volcan);
    return 0;
}

// util.c

#include "util.h"


/*
    Retorna una transformacion de value que esta entre r1 y r2 a un valor que esta
    entre n1 y n2, con tal que tenga la misma relacion con el rango [n1, n2] como
    value tenga con el rango [r1, r2]
*/


double mapRange(double value, double r1, double r2, double n1, double n2, double* result)
{
    double res = n1+(value-r1)*((n2-n1)/(r2-r1));
    printf("dividingby: %f", res);putchar('\n');
    if(result!=NULL)
    *result = res;
    return res;
}

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

D:\Code\C\volcan\cc1.exe    [Warning] command line option '-std=c++11' is valid for C++/ObjC++ but not for C
D:\Code\C\volcan\main.c In function 'main':
52  19  D:\Code\C\volcan\main.c [Warning] initialization makes pointer from integer without a cast
D:\Code\C\volcan\main.c In function 'open_volcano':
91  7   D:\Code\C\volcan\main.c [Warning] assignment makes pointer from integer without a cast
D:\Code\C\volcan\main.c In function 'test_volcano':
119 13  D:\Code\C\volcan\main.c [Warning] assignment makes pointer from integer without a cast
D:\Code\C\volcan\cc1.exe    [Warning] command line option '-std=c++11' is valid for C++/ObjC++ but not for C
D:\Code\C\volcan\volcantobmp.c  In function 'weighted_volcano':
38  6   D:\Code\C\volcan\volcantobmp.c  [Warning] assignment makes pointer from integer without a cast
40  6   D:\Code\C\volcan\volcantobmp.c  [Warning] assignment makes pointer from integer without a cast
D:\Code\C\volcan\cc1.exe    [Warning] command line option '-std=c++11' is valid for C++/ObjC++ but not for C

выходные данные IDE

РЕДАКТИРОВАТЬ 2: Так что, похоже, проблема была здесь

// util.ч

#include "headers.h"

было пусто ...

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

@ SteveSummit дал мне решение, в котором требовалось объявление прототипа для функции в util.h

0 голосов
/ 27 ноября 2018

Исходя из вашего описания, наиболее вероятно, что где-то в вашей "базе кода" есть другая функция "mapRange".

Просто чтобы изолировать проблему, я рекомендую переименовать вашу функцию "mapRange" в нечтоуникальный, как добавление текущей даты (mapRange_20181127), оставляя вызов mapRange в main ().Если ваша «база кода» содержит другую функцию с именем «mapRange», вы не столкнетесь с какой-либо ошибкой, так как компоновщик найдет «other» mapRange.

В этом случае выбор другого значимого имени решит вашу проблему.Проблема.

Надеюсь, это поможет!

Обновление: Я думаю, пока я печатал, вы опубликовали больше деталей и получили ответ:).

...