2016-05-02 15 views
2

私が書いたジェネリックスタックライブラリを使ってポストフィックス計算機を書いています。私はそれが宿題であり、通常はオンラインで助けを求めることはしませんが、教授センター/ヘルプルームは今日閉じられていると言ってこれを序文します。"ポインタ型に変換できません" C

私はstdinから文字入力を受け取り、それをトークン化し、それが数、+-*、または^であるか否かを判断する機能「CALC」を持っています。私はすべてのケースでそれを前にテストしたので、トークナイザは動作します。

スタックライブラリを実装する際に問題があるようです。

これは、問題のコードです:

char num[MAX_NUM]; 
float n; 
while (1) { 
      switch (token = get_tok(num, sizeof(num))) { 
      case TOK_NUM: 
        //printf("TOK_NUM: %s (%lf)\n", num, strtod(num, NULL)); 
        n = strtod(num, NULL); 
        push(stk, (void *)n);   
        printf("TOK_NUM_STK: %lf\n", (float)peek(stk)); 
        pop(stk); 
        break; 

あり、他の文字に対処するための他のswitch文である(+、 - 、*、および^)が、私はまだそれらへ移動していません。

考えられるのは、文字配列numを浮動小数点に変換することです。

プッシュ機能は、私のスタックライブラリの一部です。私は前に他のプログラムでそれを使用しているとして、それが予想されるので、私はそれについて心配していないよう

struct stack_t { 
    int count; 
    struct node_t { 
      void *data; 
      struct node_t *next; 
    } *head; 
}; 

void push(stack stk, void *data) { 

    struct node_t *tmp = malloc(sizeof(struct node_t)); 

    tmp -> data = data; 

    tmp -> next = stk -> head; 

    stk -> head = tmp; 

    (stk -> count)++; 
} 

スタックライブラリ作品:これはそのためのコードです。

push(stk, (void *)n); 

は、私が今やろうとしているすべてがある:

私の問題は、私は私のpostfixの計算をコンパイルするとき、私はエラーを取得することを「ポインタ型に変換できません」と、それは、この行を参照していますユーザーの入力をstdinから取り出し、スタックにプッシュしてスタックから読み込み、スタックからポップします。なぜこのエラーが出るのか分かりませんし、どうやって修正するのか分かりません。正しい方向に私を動かすための助けやヒントがあれば幸いです。

+0

「n」のタイプは何ですか?バッファを割り当てて 'n'にデータを格納し、バッファにデータをコピーし、' n'を直接渡すのではなくバッファにポインタを渡す必要があります。 – MikeCAT

+0

お詫び申し上げます。私はその行を含めるのを忘れてしまった。この行は 'while(1)'行の前に現れます。 'float n;' –

+0

ドット( '.')または矢印(' - ')演算子の周囲にはスペースを入れないでください。彼らは確かに非常に緊密に結びついている。正統Cのどちらのサイズにもスペースがあってはいけません。はい、コンパイラは気にしません。しかし、あなたのコードを読んでいる人は、一般的に心に留めています。 –

答えて

4

floatdoubleは、整数型と互換性がありません、あなたはポインタに変換することはできません、あなたが欲しいのは、使用スタック上のフロート、またはフロートへのポインタのいずれかです:

float *f = malloc(sizeof *f); 
*f = n; 
push(stk, f); 

要素を使用するにはスタック上に戻します。

float *f = pop(stk); // I assume your pop function returns a void * 
float n = *f; // n is the number your pushed 
+0

私は間違いなくこれを試して、あなたの答えをありがとう...私の質問は今、スタック上の何で算術演算を行うことができますか?操作を実行する前にフロートにキャストする必要がありますか?それともそれを尊重する必要がありますか? –

+0

@GarrettMasseyはい、元の番号を取得するためにポップして逆参照するだけです。私の更新されたポストを参照してください。 – fluter

+0

これは機能しました。ありがとうございました。私はいくつかの変数を変更しなければならなかったので、他の場所で使用していた変数と衝突しないようにする必要がありましたが、問題は解決されました。どうもありがとうございます! –

関連する問題