2015-07-05 2 views
0

Я пишу одну из своих первых программ на C. Я пытаюсь изменить ранний учебник Ritchie и Kernighan по преобразованию Farhenheith и Celsius, но я получаю ошибки, которые я не могу решить.Ошибка компилятора C

Моя цель состоит в том, чтобы запустить ./a.out fahr 20 и для сценария распечатать преобразование температуры Фаренгейта, начиная с 20 (и до 300) до Цельсия.

Но если я напишу ./a.out celsius 0, сценарий распечатает конверсию температуры Цельсия, начиная с 0 (и до 300) до Фаренгейта.

Вот текущий скрипт (а ниже - ошибки, которые я получаю от компилятора).

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

#include <stdio.h> 
#include <string.h> 

int main(int argc, char **argv){ 

    float fahr, celsius; 
    int upper, step; 

    upper = 300; 
    step = 20; 


    if (strcmp("fahr", argv[1] == 0)){ 
     fahr = argv[2]; 
     while (fahr <= upper){ 
      fahr_conversion(fahr); 
      fahr = fahr + step; 
     } 
    } 
    else if (strcmp("celsius", argv[1] == 0)){ 
     celsius = argv[2]; 
     while (celsius <= upper){ 
      cels_conversion(celsius); 
      celsius = celsius + step; 
     } 
    } 
} 

int fahr_conversion(float fahr){ 
     float celsius; 
     celsius = (5.0/9.0) * (fahr - 32.0); 
     printf("%3.0f -> %6.1f\n", fahr, celsius); 

} 
int cels_conversion(float celsius){ 
     float fahr; 
     fahr = (celsius + (9.0/5.0)) + 32.0; 
     printf("%3.0f -> %6.1f\n", celsius, fahr); 
} 

Ошибка:

Far-Cels-Converter $ cc main.c 
main.c:16:21: warning: incompatible integer to pointer conversion passing 'int' 
     to parameter of type 'const char *' [-Wint-conversion] 
     if (strcmp("fahr", argv[1] == 0)){ 
          ^~~~~~~~~~~~ 
/usr/include/string.h:77:39: note: passing argument to parameter here 
int  strcmp(const char *, const char *); 
             ^
main.c:17:8: error: assigning to 'float' from incompatible type 'char *' 
       fahr = argv[2]; 
        ^~~~~~~~ 
main.c:19:4: warning: implicit declaration of function 'fahr_conversion' is 
     invalid in C99 [-Wimplicit-function-declaration] 
         fahr_conversion(fahr); 
         ^
main.c:23:29: warning: incompatible integer to pointer conversion passing 'int' 
     to parameter of type 'const char *' [-Wint-conversion] 
     else if (strcmp("celsius", argv[1] == 0)){ 
            ^~~~~~~~~~~~ 
/usr/include/string.h:77:39: note: passing argument to parameter here 
int  strcmp(const char *, const char *); 
             ^
main.c:24:11: error: assigning to 'float' from incompatible type 'char *' 
       celsius = argv[2]; 
         ^~~~~~~~ 
main.c:26:4: warning: implicit declaration of function 'cels_conversion' is 
     invalid in C99 [-Wimplicit-function-declaration] 
         cels_conversion(celsius); 
         ^
main.c:32:5: error: conflicting types for 'fahr_conversion' 
int fahr_conversion(float fahr){ 
    ^
main.c:19:4: note: previous implicit declaration is here 
         fahr_conversion(fahr); 
         ^
main.c:38:5: error: conflicting types for 'cels_conversion' 
int cels_conversion(float celsius){ 
    ^
main.c:26:4: note: previous implicit declaration is here 
         cels_conversion(celsius); 
         ^
4 warnings and 4 errors generated. 

ответ

3

Здесь есть несколько различных ошибок.

main.c:16:21: warning: incompatible integer to pointer conversion passing 'int' 
     to parameter of type 'const char *' [-Wint-conversion] 
     if (strcmp("fahr", argv[1] == 0)){ 
          ^~~~~~~~~~~~ 

Скобки ошибочны. Это должно быть if (strcmp("fahr", argv[1]) == 0).

main.c:17:8: error: assigning to 'float' from incompatible type 'char *' 
       fahr = argv[2]; 
        ^~~~~~~~ 

Вы не можете назначить строку для поплавка, вам нужно использовать некоторую функцию для ее преобразования. Например. fahr = strtof(argv[2], 0). Вам необходимо включить заголовок <stdlib.h> для strtof.

main.c:19:4: warning: implicit declaration of function 'fahr_conversion' is 
     invalid in C99 [-Wimplicit-function-declaration] 
         fahr_conversion(fahr); 
         ^

Когда main используется в источнике fahr_conversion перед fahr_conversion появляется, компилятор еще не знает тип fahr_conversion, поэтому он принимает стандартный тип (который почти всегда является не то, что вы хотите). Это решается путем добавления прототипа функции Перед главного:

int fahr_conversion(float fahr); 

Хотя, интересно, действительно ли int типа возврата вы хотите. Если вы ничего не возвращаете, тип возврата должен быть void.

+0

Отлично, я думаю, что я почти там: но я получаю это предупреждение : 'main.c: 21: 10: warning: неявное объявление функции 'strtof' недопустимо в C99 [-Wimplicit-function-declaration] fahr = strtof (argv [2], 0);' – Jeff

+0

, но он все еще работает. Horray !! – Jeff

+0

Правильно, вам нужен заголовок '' для 'strtof'. – nemetroid

4

Сделать if (strcmp("fahr", argv[1]) == 0)
Размещение закрывающей скобки неправильно, поэтому ошибка
Аналогично, изменить остальное, если условие
(strcmp("celsius", argv[1]) == 0)
Кроме того, ваши переменной fahr является float, где, поскольку вы назначаете его argv [2], который имеет тип char *, значит, вы получаете ошибку.
Итак, вам нужно преобразовать char * в float или double. atof функция поможет вам здесь. Попробуйте это
fahr=atof(argv[2]);
Убедитесь, что вы ввели файл заголовка stdlib.

+0

Спасибо, что исправил список ошибок. :) – Jeff

+0

Рад, что я мог помочь :) Если это решило вашу проблему, пожалуйста, примите ее в качестве ответа. –

+0

Ну, я все еще получаю эту ошибку: 'main.c: 17: 8: error: присвоение 'float' из несовместимого типа 'char *' fahr = argv [2];' и этот: 'main. c: 32: 5: ошибка: конфликтующие типы для 'fahr_conversion' int fahr_conversion (float fahr) {' – Jeff

2

Во-первых, вы хотите проверить, был ли первый параметр строкой «fahr».Так что вы должны сделать:
сравнения строк:

strcmp("fahr", argv[1]) 

тест результат Comparision

strcmp("fahr", argv[1]) == 0 

и выполнять действия в зависимости от результата теста

if(strcmp("fahr", argv[1]) == 0) {.....} 

узнать разницу в код !

Во-вторых, вы хотите взять второй параметр в виде числового значения. Увы, это строка символов! Вы не получите соответствующий результат, назначив строку переменной float. Вам понадобится функция конвертирования strig-to-float. Возможные значения: atof():

fahr = atof(argv[2]); 
+0

Отлично, почти там, но я получаю: 'main.c: 29: 10: warning: неявное объявление функции 'atof' недопустимо в C99 [-Wimplicit-function-declaration] fahr = atof (argv [2 ]); 'при использовании' atof() ' – Jeff

+0

@Jeff Функция принадлежит к стандартной библиотеке C, вы можете включить объявление функции, добавив' #include 'где-то в начале вашего кода (желательно в первой строке , перед любыми другими заявлениями). – CiaPan

Смежные вопросы