2016-10-20 4 views
0
#include <stdio.h> 

int tempconvert(int, int, int); 

int main(void) { 
    float fahr, celsius; 
    int lower, upper, step; 

    lower = 0; 
    upper = 300; 
    step = 20; 

    int tempconvert(lower, upper, step) 
    { 
     fahr = lower; 
     while (fahr <= upper) { 
      celsius = (5.0/9.0) * (fahr-32.0); 
      printf("%3.0f %6.1f\n", fahr, celsius); 
      fahr = fahr + step; 
     } 
    } 
    return 0; 
} 

Всего newb здесь следующие примеры программирования C C. Попытка запускать этот код и компилируется, но printf отказывается фактически печатать что-либо. Я мог бы просто использовать пример книги и двигаться дальше, но я расстроен тем, что не знаю, почему мой код не работает.printf компилирует, но ничего не печатает

Любая помощь или понимание того, что я могу пропустить здесь, было бы замечательно.

+4

У вас нет встроенных функций в C. – EOF

+5

Но даже если бы вы могли - вы не называете это ... –

+2

@EOF Я думаю, что gcc имеет нестандартное расширение, которое позволяет это. –

ответ

7

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

gcc -std=c11 -fPIC -g -Wall -Wextra -Wwrite-strings -Wno-parentheses -Wpedantic -Warray-bounds -O2  -c -o 40157429.o 40157429.c 
40157429.c: In function ‘main’: 
40157429.c:13:5: warning: ISO C forbids nested functions [-Wpedantic] 
    int tempconvert(lower, upper, step){ 
    ^~~ 
40157429.c: In function ‘tempconvert’: 
40157429.c:13:9: warning: type of ‘lower’ defaults to ‘int’ [-Wimplicit-int] 
    int tempconvert(lower, upper, step){ 
     ^~~~~~~~~~~ 
40157429.c:13:9: warning: type of ‘upper’ defaults to ‘int’ [-Wimplicit-int] 
40157429.c:13:9: warning: type of ‘step’ defaults to ‘int’ [-Wimplicit-int] 
40157429.c:20:5: warning: no return statement in function returning non-void [-Wreturn-type] 
    } 
    ^
40157429.c: In function ‘main’: 
40157429.c:7:23: warning: variable ‘step’ set but not used [-Wunused-but-set-variable] 
    int lower, upper, step; 
         ^~~~ 
40157429.c:7:16: warning: variable ‘upper’ set but not used [-Wunused-but-set-variable] 
    int lower, upper, step; 
       ^~~~~ 
40157429.c:7:9: warning: variable ‘lower’ set but not used [-Wunused-but-set-variable] 
    int lower, upper, step; 
     ^~~~~ 
At top level: 
40157429.c:13:9: warning: ‘tempconvert’ defined but not used [-Wunused-function] 
    int tempconvert(lower, upper, step){ 
     ^~~~~~~~~~~ 

Вы можете исправить эти ошибки, встраивание:

#include <stdio.h> 

int main(void) { 
    float fahr, celsius; 
    int lower, upper, step; 

    lower = 0; 
    upper = 300; 
    step = 20; 

    fahr = lower; 
    while (fahr <= upper) { 
     celsius = (5.0/9.0) * (fahr-32.0); 
     printf("%3.0f %6.1f\n", fahr, celsius); 
     fahr = fahr + step; 
    } 
    return 0; 
} 

или путем перемещения контура в функции:

#include <stdio.h> 

void tempconvert(int, int, int); 

int main(void) { 
    int lower, upper, step; 

    lower = 0; 
    upper = 300; 
    step = 20; 
    tempconvert(lower, upper, step); 

    return 0; 
} 


void tempconvert(int lower, int upper, int step){ 
    float fahr = lower; 
    while (fahr <= upper) { 
     float celsius = (5.0/9.0) * (fahr-32.0); 
     printf("%3.0f %6.1f\n", fahr, celsius); 
     fahr = fahr + step; 
    } 
} 

оба из которых делают то, что вы, кажется, хотеть.

+0

Большое вам спасибо, это ответ на мой вопрос отлично! Рад, что я спросил, теперь я немного лучше понимаю язык. Я исхожу из Javascript, поэтому мне нужно многому научиться. – bryanwillis7

3

Есть две вещи -

  1. Вы не можете иметь вложенные функции в С (Подробнее here)

  2. Вы только объявили функцию tempconvert, но никогда не называли его. Несмотря на то, что имена переменных в вашей функции main такие же, как параметры для вашей функции tempconvert, это разные переменные. Вы также должны прочитать о Scope переменных.

Чтобы исправить это, объявите функцию за пределами main, а затем позвоните.

2

Вы определили вложенную функцию, которая не является стандартным C (это было прежнее расширение gcc, но не заметило, что оно осталось до сих пор). В любом случае ваш код почти определяет только функцию внутри основного и никогда не вызывает ее. Более правильным C переписывание кода является:

#include <stdio.h> 

int tempconvert(int, int, int); 

int tempconvert(lower, upper, step){ 
    fahr = lower; 
    while (fahr <= upper) { 
     celsius = (5.0/9.0) * (fahr-32.0); 
     printf("%3.0f %6.1f\n", fahr, celsius); 
     fahr = fahr + step; 
    } 
} 


int main(void) { 
    float fahr, celsius; 
    int lower, upper, step; 

    lower = 0; 
    upper = 300; 
    step = 20; 

    return 0; 
} 

Они отсутствующий вызов tempconvert в основной и не возвращаемое значение этой функции.

Я думаю, что вы хотели бы что-то подобное или так:

#include <stdio.h> 

float tempconvert(int fahr) { 
    float celsius = (5.0f/9.0f) * (fahr-32.0f); 
    return celsius; 
} 


int main(void) { 
    float fahr, celsius; 
    int lower, upper, step; 

    lower = 0; 
    upper = 300; 
    step = 20; 

    fahr = lower; 
    while (fahr <= upper) { 
     celsius = convert(fahr); 
     printf("%3.0f %6.1f\n", fahr, celsius); 
     fahr = fahr + step; 
    } 
    return 0; 
} 
2

Этот код содержит вложенную функцию. Это не стандарт C.

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

Вам необходимо либо переместить тело вложенной функции из main, либо полностью избавиться от строки объявления, чтобы код функции был встроен в main.