atof, структуры и указатели в c ++ - PullRequest
1 голос
/ 12 февраля 2012

Это пример кода, который я написал для школьной научной выставки.

#include <iostream>
#include <math.h>
using namespace std;

struct FUNC{
    char token;
    FUNC *left;
    FUNC *right;
};

double eval (FUNC *head){
    if (head->left==NULL){ 
        return atof(head->token); //this is where the error occurs
    }
}

void main(){
    FUNC node1= {'1',NULL,NULL};

    cout << eval(&node1)<< endl;

    system("pause");
}

Когда я запускаю этот код, я получаю эту ошибку.

error C2664: 'atof' : cannot convert parameter 1 from 'char' to 'const char *'

Может кто-нибудь объяснить эту ошибку и привести пример того, как ее исправить?

Ответы [ 3 ]

2 голосов
/ 12 февраля 2012

Все просто. Вы передаете символ в функцию, которая ожидает символ *.

struct FUNC{
    char token;
    FUNC *left;
    FUNC *right;
};

должно быть

struct FUNC{
    char* token;
    FUNC *left;
    FUNC *right;
};

и пока вы у него, вам также придется инициализировать символ *, чтобы вы могли создать функцию, подобную

   FUNC* initFunc(const char* str,FUNC* left,FUNC* right)
   {
       // (FUNC*) is a cast to a type of pointer to FUNC. It is not needed if you write in C but 
       //since I saw cout in your code then if it's C++ you need to cast the results of malloc
       FUNC* ret = (FUNC*) malloc(sizeof(FUNC);
       int len = strlen(str);
       ret->str = malloc(len+1);
       strcpy(ret->str,str);
       ret->left = left;
       ret->right = right;
       return ret;
   }

Итак, в конце концов у вас будет что-то вроде этого:

//please note the existence of " " since this is not a char but a string literal
FUNC* node1 = initFunc("1",NULL,NULL);

cout << eval(node1)<< endl;
1 голос
/ 12 февраля 2012

Небольшой совет, вы должны включать заголовок cmath вместо math.h. Цитата GOTW

"" Правило пространства имен №3. Используйте заголовки C с новым стилем "#include <cheader>" вместо старого стиля "#include <header.h>".

Для обратной совместимости с C, C ++ по-прежнему поддерживает все стандартные имена заголовков C (например, stdio.h), и когда вы #include те оригинальные версии, связанные функции библиотеки C видны в глобальном пространстве имен, как и раньше - но в то же время C ++ также говорит, что старые имена заголовков устарели, что ставит Обратите внимание, что они могут быть удалены в будущей версии стандарта C ++. Таким образом, стандартный C ++ настоятельно рекомендует программистам предпочитать использовать новые версии заголовков C, которые начинаются с «c» и удаляют расширение «.h» (например, cstdio); когда вы #include заголовки C, используя новые имена, вы получаете те же функции библиотеки C, но теперь они живут в пространстве имен std. " «

0 голосов
/ 12 февраля 2012

Чтобы получить числовое значение одного символа, просто используйте:

c - '0'

Не знаю, почему вы все равно собираетесь использовать atof для числа, которое не является дробным. Функция выбора для разбора строк на целые числа обычно должна быть strtod, но, как уже упоминалось, с одним символом вам даже не нужен.

...