2012-02-12 3 views
1

이것은 학교 과학 경시 대회를 위해 작성한 코드 샘플입니다.atof, structs and pointer in C++

#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 *' 

누구든지이 오류를 설명하고이를 해결하는 방법에 대한 예제를 제공 할 수 있습니까?

답변

2

간단합니다. char *를 예상하는 함수에 char을 전달 중입니다.

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; 
0

는, 단일 문자의 숫자 값을 얻으려면 바로 사용

c - '0' 

당신이 소수가 아닌 다수를위한, 어쨌든 atof를 사용하려는 이유를 확실하지. 문자열을 정수로 파싱하는 데 일반적으로 사용되는 함수는 strtod이어야하지만, 언급 한 바와 같이 한 문자는 더 이상 필요하지 않습니다.

+0

평가 후면 기능이 완료되지 않았습니다. 하지만 int 값을 나눌 수 없기 때문에 값을 double로 필요로합니다. FUNC 구조는 나무 부문 –

+0

@WilliamInasuitBolduc에 대한 '/'와 같은 문자를 포함 할 필요가 있기 때문에 나는 거기에 문자 형식이 필요합니다 그래서 연산자 트리입니다 : 당신은'> 토큰 머리 -을 반환 할 수 있습니다 - '0'; '와 컴파일러 반환 유형 double로 자동 변환됩니다. –

1

약간의 조언이 필요하면 math.h 대신 header cmath를 포함시켜야합니다. GOTW

을 "인용"네임 스페이스 규칙 # 3 : 새로운 스타일을 사용하여 C는 헤더 "#include <header.h>"대신 이전 스타일의 ""#include <cheader>.

C와의 이전 버전과의 호환성을 위해 C++은 여전히 ​​표준 C 헤더 이름 (예 : stdio.h)을 모두 지원하며 원래 버전을 # 포함하면 관련 C 라이브러리 함수가 이전과 같이 전역 이름 공간에 표시됩니다 - 그러나 같은 호흡 C++에서 또한 기존의 헤더 이름은 그들이 C++ 표준의 이후 버전에서 제거 될 수 있음을 통지에 세계를두고있는, 사용되지 않는 것을 말한다. 따라서 Standard C++은 프로그래머가 "c"로 시작하고 ".h"확장자 (예 : cstdio)를 삭제하는 C 헤더의 새 버전을 선호하는 것을 강력히 권장합니다. 새 이름을 사용하여 C 헤더를 #include 할 때, 같은 C 라이브러리 함수를 얻을 수 있지만, 지금은 std 네임 스페이스에 살고 있습니다. 내가 갇혀 있었기 때문에 " "

+0

감사합니다. 저는 오래된 교과서에서 일하고 있습니다. 그리고 그들은 math.h라고 말했습니다. –