掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.24190

スタックを使って後置記法で入力した数式の計算をしたいのですが・・・
投稿者---太郎(2005/11/17 16:07:36)


ソースは、

#include <stdio.h>
#include <stdlib.h>


typedef struct {
int max; /* スタックのサイズ */
int ptr; /* スタックポインタ */
int *stk; /* スタック(の先頭要素へのポインタ) */
} Stack;

/*--- スタックの初期化 ---*/
int StackAlloc(Stack *s, int max)
{
s->ptr = 0;
if ((s->stk = calloc(max, sizeof(int))) == NULL) {
s->max = 0; /* 配列の確保に失敗 */
return (-1);
}
s->max = max;
return (0);
}

/*--- スタックの後始末 ---*/
void StackFree(Stack *s)
{
if (s->stk != NULL) {
free(s->stk);
s->max = s->ptr = 0;
}
}

/*--- スタックにデータをプッシュ ---*/
int StackPush(Stack *s, int x)
{
if (s->ptr >= s->max)
return (-1);
s->stk[s->ptr++] = x;
return (0);
}

/*--- スタックからデータをポップ ---*/
int StackPop(Stack *s, int *x)
{
if (s->ptr <= 0) /* スタックは空 */
return (-1);
*x = s->stk[--s->ptr];
return (0);
}

/*--- スタックからデータをピーク ---*/
int StackPeek(const Stack *s, int *x)
{
if (s->ptr <= 0) /* スタックは空 */
return (-1);
*x = s->stk[s->ptr - 1];
return (0);
}

/*--- スタックの大きさ ---*/
int StackSize(const Stack *s)
{
return (s->max);
}

/*--- スタックに積まれているデータ数 ---*/
int StackNo(const Stack *s)
{
return (s->ptr);
}

/*--- スタックは空か ---*/
int StackIsEmpty(const Stack *s)
{
return (s->ptr <= 0);
}

/*--- スタックは満杯か ---*/
int StackIsFull(const Stack *s)
{
return (s->ptr >= s->max);
}

/*--- スタックを空にする ---*/
void StackClear(Stack *s)
{
s->ptr = 0;
}

/*スタックからpop数値を計算する*/
int ennzan(Stack *s){/*ここから先がうまくいきません*/


if(s->[s->ptr]=='+'){
return(s->[s->ptr+1]+s->[s->ptr+2]);}
if(s->[s->ptr]=='-'){
return(s->[s->ptr+1]-s->[s->ptr+2]);}
if(s->[s->ptr]=='*'){
return(s->[s->ptr+1]*s->[s->ptr+2]);}
if(s->[s->ptr]=='/'){
return(s->[s->ptr+1]/s->[s->ptr+2]);}
if(s->[s->ptr]=='%'){
return(s->[s->ptr+1]%s->[s->ptr+2]);}



}


void keisan(Stack *s){
int x;
printf("計算式を後置記法で入力してください。");
do{
scanf("%d", &x);
if (StackPush(&s, x) == -1){
puts("スタックへのプッシュに失敗しました。");
}
}while(x!=0);

for(s->ptr=0;s->ptr==NULL;s->ptr++){

if (StackPop(&s, &x) == -1)
puts("ポップできません。");
else s->stk[s->ptr+1]=x;


if (StackPop(&s, &x) == -1)
puts("ポップできません。");
else s->stk[s->ptr+2]=x;


if (StackPop(&s, &x) == -1)
puts("ポップできません。");
else s->stk[s->ptr]=x;
}

}

int main(void)
{
Stack s;
int x;
if (StackAlloc(&s, 100) == -1) {
puts("スタックの確保に失敗しました。");
}
printf("現在のデータ数:%d/%d\n", StackNo(&s), StackSize(&s));
keisan(&s);
ennzan(&s);
printf("計算結果は%dです。",s);
StackFree(&s);

return (0);
}
という風に作ったのですが、データを関数の中でpopして、ennzan関数に渡すところがうまくいきません。どうしたらいいのでしょうか。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:スタックを使って後置記法で入力した数式の計算をしたいのですが・・・ 24191 nop 2005/11/17 16:23:55
<子記事> Re:スタックを使って後置記法で入力した数式の計算をしたいのですが・・・ 24196 RAPT 2005/11/17 17:10:01
<子記事> Re:スタックを使って後置記法で入力した数式の計算をしたいのですが・・・ 24199 si 2005/11/17 17:35:37


No.24191

Re:スタックを使って後置記法で入力した数式の計算をしたいのですが・・・
投稿者---nop(2005/11/17 16:23:55)


まず、「掲示板利用宣言」の以下の項目が守られていません。

・ソースの添付は「HTML変換ツール」で字下げします。
・環境(OSとコンパイラ)や症状は具体的に詳しく書きます。


この投稿にコメントする

削除パスワード

No.24192

Re:スタックを使って後置記法で入力した数式の計算をしたいのですが・・・
投稿者---太郎(2005/11/17 16:42:48)


>まず、「掲示板利用宣言」の以下の項目が守られていません。
>
>・ソースの添付は「HTML変換ツール」で字下げします。
>・環境(OSとコンパイラ)や症状は具体的に詳しく書きます。

すいませんでした。以後気をつけます。
#include <stdio.h>
#include <stdlib.h>


typedef struct {
int max; /* スタックのサイズ */
int ptr; /* スタックポインタ */
int *stk; /* スタック(の先頭要素へのポインタ) */
} Stack;

/*--- スタックの初期化 ---*/
int StackAlloc(Stack *s, int max)
{
s->ptr = 0;
if ((s->stk = calloc(max, sizeof(int))) == NULL) {
s->max = 0; /* 配列の確保に失敗 */
return (-1);
}
s->max = max;
return (0);
}

/*--- スタックの後始末 ---*/
void StackFree(Stack *s)
{
if (s->stk != NULL) {
free(s->stk);
s->max = s->ptr = 0;
}
}

/*--- スタックにデータをプッシュ ---*/
int StackPush(Stack *s, int x)
{
if (s->ptr >= s->max)
return (-1);
s->stk[s->ptr++] = x;
return (0);
}

/*--- スタックからデータをポップ ---*/
int StackPop(Stack *s, int *x)
{
if (s->ptr <= 0) /* スタックは空 */
return (-1);
*x = s->stk[--s->ptr];
return (0);
}

/*--- スタックからデータをピーク ---*/
int StackPeek(const Stack *s, int *x)
{
if (s->ptr <= 0) /* スタックは空 */
return (-1);
*x = s->stk[s->ptr - 1];
return (0);
}

/*--- スタックの大きさ ---*/
int StackSize(const Stack *s)
{
return (s->max);
}

/*--- スタックに積まれているデータ数 ---*/
int StackNo(const Stack *s)
{
return (s->ptr);
}

/*--- スタックは空か ---*/
int StackIsEmpty(const Stack *s)
{
return (s->ptr <= 0);
}

/*--- スタックは満杯か ---*/
int StackIsFull(const Stack *s)
{
return (s->ptr >= s->max);
}

/*--- スタックを空にする ---*/
void StackClear(Stack *s)
{
s->ptr = 0;
}

/*スタックからpop数値を計算する*/
int ennzan(Stack *s){/*ここから先がうまくいきません*/


if(s->[s->ptr]=='+'){
return(s->[s->ptr+1]+s->[s->ptr+2]);}
if(s->[s->ptr]=='-'){
return(s->[s->ptr+1]-s->[s->ptr+2]);}
if(s->[s->ptr]=='*'){
return(s->[s->ptr+1]*s->[s->ptr+2]);}
if(s->[s->ptr]=='/'){
return(s->[s->ptr+1]/s->[s->ptr+2]);}
if(s->[s->ptr]=='%'){
return(s->[s->ptr+1]%s->[s->ptr+2]);}



}


void keisan(Stack *s){
int x;
printf("計算式を後置記法で入力してください。");
do{
scanf("%d", &x);
if (StackPush(&s, x) == -1){
puts("スタックへのプッシュに失敗しました。");
}
}while(x!=0);

for(s->ptr=0;s->ptr==NULL;s->ptr++){

if (StackPop(&s, &x) == -1)
puts("ポップできません。");
else s->stk[s->ptr+1]=x;


if (StackPop(&s, &x) == -1)
puts("ポップできません。");
else s->stk[s->ptr+2]=x;


if (StackPop(&s, &x) == -1)
puts("ポップできません。");
else s->stk[s->ptr]=x;
}

}

int main(void)
{
Stack s;
int x;
if (StackAlloc(&s, 100) == -1) {
puts("スタックの確保に失敗しました。");
}
printf("現在のデータ数:%d/%d\n", StackNo(&s), StackSize(&s));
keisan(&s);
ennzan(&s);
printf("計算結果は%dです。",s);
StackFree(&s);

return (0);
}

OSはWindows xp、
コンパイラは、CPad for Borland C++です。

このソースで実行したときに、関数ennzanの最初のif文のところで、

>メンバー識別子が必要(関数 ennzan )

関数keisanのStackPop,StackPushを使ったところで

> 問題のあるポインタの変換(関数 keisan )

というエラーが出るのですがどうしたらいいのでしょうか。



この投稿にコメントする

削除パスワード

No.24194

Re:スタックを使って後置記法で入力した数式の計算をしたいのですが・・・
投稿者---nop(2005/11/17 17:01:50)


とりあえず、

・ソースの添付は「HTML変換ツール」で字下げします。

が直っていません。

>関数ennzanの最初のif文のところで、
>>メンバー識別子が必要(関数 ennzan )
>というエラーが出るのですがどうしたらいいのでしょうか。

>if(s->[s->ptr]=='+'){

この文法がおかしいです。
アロー演算子(->)の後には、メンバ名が必要です。

>関数keisanのStackPop,StackPushを使ったところで
>> 問題のあるポインタの変換(関数 keisan )
>というエラーが出るのですがどうしたらいいのでしょうか。

>void keisan(Stack *s){
>if (StackPush(&s, x) == -1){

StackPush()の第一引数の型は「Stack *」型です。
「Stack **」型の値を渡しても、
StackPush()の中では実態を見れません。

if( StackPush(s,x)==-1)

で良いでしょう。


この投稿にコメントする

削除パスワード

No.24198

Re:スタックを使って後置記法で入力した数式の計算をしたいのですが・・・
投稿者---太郎(2005/11/17 17:24:27)


>とりあえず、
>
>・ソースの添付は「HTML変換ツール」で字下げします。
>
>が直っていません。
何度もすいません。これでいいのでしょうか?
#include <stdio.h>
#include <stdlib.h>


typedef struct {
int max; /* スタックのサイズ */
int ptr; /* スタックポインタ */
int *stk; /* スタック(の先頭要素へのポインタ) */
} Stack;

/*--- スタックの初期化 ---*/
int StackAlloc(Stack *s, int max)
{
s->ptr = 0;
if ((s->stk = calloc(max, sizeof(int))) == NULL) {
s->max = 0; /* 配列の確保に失敗 */
return (-1);
}
s->max = max;
return (0);
}

/*--- スタックの後始末 ---*/
void StackFree(Stack *s)
{
if (s->stk != NULL) {
free(s->stk);
s->max = s->ptr = 0;
}
}

/*--- スタックにデータをプッシュ ---*/
int StackPush(Stack *s, int x)
{
if (s->ptr >= s->max)
return (-1);
s->stk[s->ptr++] = x;
return (0);
}

/*--- スタックからデータをポップ ---*/
int StackPop(Stack *s, int *x)
{
if (s->ptr <= 0) /* スタックは空 */
return (-1);
*x = s->stk[--s->ptr];
return (0);
}

/*--- スタックからデータをピーク ---*/
int StackPeek(const Stack *s, int *x)
{
if (s->ptr <= 0) /* スタックは空 */
return (-1);
*x = s->stk[s->ptr - 1];
return (0);
}

/*--- スタックの大きさ ---*/
int StackSize(const Stack *s)
{
return (s->max);
}

/*--- スタックに積まれているデータ数 ---*/
int StackNo(const Stack *s)
{
return (s->ptr);
}

/*--- スタックは空か ---*/
int StackIsEmpty(const Stack *s)
{
return (s->ptr <= 0);
}

/*--- スタックは満杯か ---*/
int StackIsFull(const Stack *s)
{
return (s->ptr >= s->max);
}

/*--- スタックを空にする ---*/
void StackClear(Stack *s)
{
s->ptr = 0;
}

/*スタックからpop数値を計算する*/
int ennzan(Stack *s){/*ここから先がうまくいきません*/


if(s->[s->ptr]=='+'){
return(s->[s->ptr+1]+s->[s->ptr+2]);} 
if(s->[s->ptr]=='-'){
return(s->[s->ptr+1]-s->[s->ptr+2]);} 
if(s->[s->ptr]=='*'){
return(s->[s->ptr+1]*s->[s->ptr+2]);} 
if(s->[s->ptr]=='/'){
return(s->[s->ptr+1]/s->[s->ptr+2]);} 
if(s->[s->ptr]=='%'){
return(s->[s->ptr+1]%s->[s->ptr+2]);} 



}


void keisan(Stack *s){
int x;
printf("計算式を後置記法で入力してください。");
do{
scanf("%d", &x);
if (StackPush(&s, x) == -1){
puts("スタックへのプッシュに失敗しました。");
}
}while(x!=0);

for(s->ptr=0;s->ptr==NULL;s->ptr++){

if (StackPop(&s, &x) == -1)
puts("ポップできません。");
else s->stk[s->ptr+1]=x;


if (StackPop(&s, &x) == -1)
puts("ポップできません。"); 
else s->stk[s->ptr+2]=x;


if (StackPop(&s, &x) == -1)
puts("ポップできません。");
else s->stk[s->ptr]=x;
}

}

int main(void)
{
Stack s;
int x;
if (StackAlloc(&s, 100) == -1) {
puts("スタックの確保に失敗しました。");
}
printf("現在のデータ数:%d/%d\n", StackNo(&s), StackSize(&s));
keisan(&s);
ennzan(&s);
printf("計算結果は%dです。",s);
StackFree(&s);

return (0);
}


>
>>if(s->[s->ptr]=='+'){
>
>この文法がおかしいです。
>アロー演算子(->)の後には、メンバ名が必要です。
ここの部分のコンパイルエラーは解決しました。
>
>>void keisan(Stack *s){
>>if (StackPush(&s, x) == -1){
>
>StackPush()の第一引数の型は「Stack *」型です。
>「Stack **」型の値を渡しても、
>StackPush()の中では実態を見れません。
>
>if( StackPush(s,x)==-1)
>
>で良いでしょう。
ここもとりあえず実行はできたのですが、実行後123+-0などと入力をしてみたのですが、
>popできません
という表示が3回されてうまく実行できません。
どこが悪いのでしょうか。勉強不足ですいません。



この投稿にコメントする

削除パスワード

No.24206

Re:スタックを使って後置記法で入力した数式の計算をしたいのですが・・・
投稿者---管理人(2005/11/17 22:41:00)


>>とりあえず、
>>
>>・ソースの添付は「HTML変換ツール」で字下げします。
>>
>>が直っていません。
>何度もすいません。これでいいのでしょうか?

いえ、違います。No.24190を貼り直します。
#include  <stdio.h>
#include  <stdlib.h>


typedef struct {
    int  max;        /* スタックのサイズ */
    int  ptr;        /* スタックポインタ */
    int  *stk;      /* スタック(の先頭要素へのポインタ) */
} Stack;

/*--- スタックの初期化 ---*/
int StackAlloc(Stack *s, int max)
{
    s->ptr = 0;
    if ((s->stk = calloc(max, sizeof(int))) == NULL) {
        s->max = 0;        /* 配列の確保に失敗 */
        return (-1);
    }
    s->max = max;
    return (0);
}

/*--- スタックの後始末 ---*/
void StackFree(Stack *s)
{
    if (s->stk != NULL) {
        free(s->stk);
        s->max = s->ptr = 0;
    }
}

/*--- スタックにデータをプッシュ ---*/
int StackPush(Stack *s, int x)
{
    if (s->ptr >= s->max)
         return (-1);
    s->stk[s->ptr++] = x;
    return (0);
}

/*--- スタックからデータをポップ ---*/
int StackPop(Stack *s, int *x)
{
    if (s->ptr <= 0)                            /* スタックは空 */
        return (-1);
    *x = s->stk[--s->ptr];
    return (0);
}

/*--- スタックからデータをピーク ---*/
int StackPeek(const Stack *s, int *x)
{
    if (s->ptr <= 0)                            /* スタックは空 */
        return (-1);
    *x = s->stk[s->ptr - 1];
    return (0);
}

/*--- スタックの大きさ ---*/
int StackSize(const Stack *s)
{
    return (s->max);
}

/*--- スタックに積まれているデータ数 ---*/
int StackNo(const Stack *s)
{
    return (s->ptr);
}

/*--- スタックは空か ---*/
int StackIsEmpty(const Stack *s)
{
    return (s->ptr <= 0);
}

/*--- スタックは満杯か ---*/
int StackIsFull(const Stack *s)
{
    return (s->ptr >= s->max);
}

/*--- スタックを空にする ---*/
void StackClear(Stack *s)
{
    s->ptr = 0;
}

/*スタックからpop数値を計算する*/
int ennzan(Stack *s){/*ここから先がうまくいきません*/

    
    if(s->[s->ptr]=='+'){
        return(s->[s->ptr+1]+s->[s->ptr+2]);}   
    if(s->[s->ptr]=='-'){
        return(s->[s->ptr+1]-s->[s->ptr+2]);}   
    if(s->[s->ptr]=='*'){
        return(s->[s->ptr+1]*s->[s->ptr+2]);}   
    if(s->[s->ptr]=='/'){
        return(s->[s->ptr+1]/s->[s->ptr+2]);}   
    if(s->[s->ptr]=='%'){
        return(s->[s->ptr+1]%s->[s->ptr+2]);}   
        
    

}


void keisan(Stack *s){
    int x;
    printf("計算式を後置記法で入力してください。");
   do{
        scanf("%d", &x);
        if (StackPush(&s, x) == -1){
    puts("スタックへのプッシュに失敗しました。");
                    }
        }while(x!=0);
                    
        for(s->ptr=0;s->ptr==NULL;s->ptr++){
                    
        if (StackPop(&s, &x) == -1)
        puts("ポップできません。");
        else s->stk[s->ptr+1]=x;
                    
                    
        if (StackPop(&s, &x) == -1)
        puts("ポップできません。");  
                   else s->stk[s->ptr+2]=x;
                
                
        if (StackPop(&s, &x) == -1)
        puts("ポップできません。");
        else s->stk[s->ptr]=x;
            }
    
}
    
int main(void)
{
    Stack  s;
    int  x;
    if (StackAlloc(&s, 100) == -1) {
        puts("スタックの確保に失敗しました。");
    }
        printf("現在のデータ数:%d/%d\n", StackNo(&s), StackSize(&s));
     keisan(&s);
     ennzan(&s);
     printf("計算結果は%dです。",s);
    StackFree(&s);

    return (0);
}




この投稿にコメントする

削除パスワード

No.24196

Re:スタックを使って後置記法で入力した数式の計算をしたいのですが・・・
投稿者---RAPT(2005/11/17 17:10:01)


下記が遵守されていません。
・ソースの添付は「HTML変換ツール」で字下げします。
・環境(OSとコンパイラ)や症状は具体的に詳しく書きます。

> データを関数の中でpopして、ennzan関数に渡すところがうまくいきません。
何が「どう」「うまく」いかないのでしょうか。
コンパイルエラーとか、実行時エラーとか、想定外の値になるとか。
# この場合は明らかにコンパイルエラーでしょうが。

> scanf("%d", &x);
これだと、数字以外は入力しても無効なので、'+','/'などの演算子は
入力できませんが、理解していますか?

> for(s->ptr=0;s->ptr==NULL;s->ptr++){
おかしいです。ちなみに、s->ptr はint型ですが、NULLは (void*)型です。

全体的にポインタの使い方が間違っています。
・・・エラーが多すぎます。(机上)コンパイルを中止しました。


■最初のコンパイル
--------------------構成: ctest - Win32 Debug--------------------
コンパイル中...
ctest.c
c:\cppproject\ctest\ctest.c(96) : error C2059: 構文エラー : '['
c:\cppproject\ctest\ctest.c(98) : error C2059: 構文エラー : 'if'
c:\cppproject\ctest\ctest.c(100) : error C2059: 構文エラー : 'if'
c:\cppproject\ctest\ctest.c(102) : error C2059: 構文エラー : 'if'
c:\cppproject\ctest\ctest.c(104) : error C2059: 構文エラー : 'if'
c:\cppproject\ctest\ctest.c(106) : error C2059: 構文エラー : '}'
c:\cppproject\ctest\ctest.c(139) : error C2275: 'Stack' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。
        c:\cppproject\ctest\ctest.c(13) : 'Stack' の宣言を確認してください。
c:\cppproject\ctest\ctest.c(139) : error C2146: 構文エラー : ';' が、識別子 's' の前に必要です。
c:\cppproject\ctest\ctest.c(140) : error C2143: 構文エラー : ';' が 'type' の前に必要です。
c:\cppproject\ctest\ctest.c(141) : warning C4133: 'function' : 'int *' と 'struct Stack *' の間で型に互換性がありません。
c:\cppproject\ctest\ctest.c(144) : warning C4133: 'function' : 'int *' と 'const struct Stack *' の間で型に互換性がありません。
c:\cppproject\ctest\ctest.c(144) : warning C4133: 'function' : 'int *' と 'const struct Stack *' の間で型に互換性がありません。
c:\cppproject\ctest\ctest.c(145) : warning C4013: 関数 'keisan' は定義されていません。int 型の値を返す外部関数と見なします。
c:\cppproject\ctest\ctest.c(146) : warning C4133: 'function' : 'int *' と 'struct Stack *' の間で型に互換性がありません。
c:\cppproject\ctest\ctest.c(148) : warning C4133: 'function' : 'int *' と 'struct Stack *' の間で型に互換性がありません。
cl.exe の実行エラー
ブラウザ データベースを作成中...

ctest.exe - エラー 9、警告 6


■ennzan()関数内をコメントアウトしてコンパイル
--------------------構成: ctest - Win32 Debug--------------------
コンパイル中...
ctest.c
c:\cppproject\ctest\ctest.c(115) : warning C4047: 'function' : 間接参照のレベルが 'struct Stack *' と 'struct Stack ** ' で異なっています。
c:\cppproject\ctest\ctest.c(115) : warning C4024: 'StackPush' : の型が 1 の仮引数および実引数と異なります。
c:\cppproject\ctest\ctest.c(120) : warning C4047: '==' : 間接参照のレベルが 'int ' と 'void *' で異なっています。
c:\cppproject\ctest\ctest.c(122) : warning C4047: 'function' : 間接参照のレベルが 'struct Stack *' と 'struct Stack ** ' で異なっています。
c:\cppproject\ctest\ctest.c(122) : warning C4024: 'StackPop' : の型が 1 の仮引数および実引数と異なります。
c:\cppproject\ctest\ctest.c(127) : warning C4047: 'function' : 間接参照のレベルが 'struct Stack *' と 'struct Stack ** ' で異なっています。
c:\cppproject\ctest\ctest.c(127) : warning C4024: 'StackPop' : の型が 1 の仮引数および実引数と異なります。
c:\cppproject\ctest\ctest.c(132) : warning C4047: 'function' : 間接参照のレベルが 'struct Stack *' と 'struct Stack ** ' で異なっています。
c:\cppproject\ctest\ctest.c(132) : warning C4024: 'StackPop' : の型が 1 の仮引数および実引数と異なります。
c:\cppproject\ctest\ctest.c(141) : warning C4101: 'x' : ローカル変数は 1 度も使われません。
c:\cppproject\ctest\ctest.c(107) : warning C4716: 'ennzan' : 値を返さなければいけません
リンク中...
ブラウザ データベースを作成中...

ctest.exe - エラー 0、警告 11



この投稿にコメントする

削除パスワード

No.24200

Re:スタックを使って後置記法で入力した数式の計算をしたいのですが・・・
投稿者---太郎(2005/11/17 17:51:50)


><pre>下記が遵守されていません。
・ソースの添付は「HTML変換ツール」で<b>字下げ</b>します。
・環境(OSとコンパイラ)や<b>症状は具体的に詳しく</b>書きます。

> データを関数の中でpopして、ennzan関数に渡すところがうまくいきません。
何が「どう」「うまく」いかないのでしょうか。
コンパイルエラーとか、実行時エラーとか、想定外の値になるとか。
# この場合は明らかにコンパイルエラーでしょうが。
今後気をつけます。

> scanf("%d", &x);
これだと、数字以外は入力しても無効なので、'+','/'などの演算子は
入力できませんが、理解していますか?

> for(s->ptr=0;s->ptr==NULL;s->ptr++){
おかしいです。ちなみに、s->ptr はint型ですが、NULLは (void*)型です。

よくわからないのですが、どういうことか良ければ教えてください。




この投稿にコメントする

削除パスワード

No.24199

Re:スタックを使って後置記法で入力した数式の計算をしたいのですが・・・
投稿者---si(2005/11/17 17:35:37)


forth風 逆ポーランド記法(RPN)のスタック計算機を作りたいのであれば、
ネットにサンプルが結構ありますので、それらのソースを読んでまず勉強した方が良いかと思います。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧