【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


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

No.21259

質問です
投稿者---しろう(2005/06/07 22:53:08)


はじめまして、しろうといいます
以下のようなプログラムを組んだんですが、コンパイルが正しくできません
どこがおかしいのか指摘ください、お願いします
前置記法を解析し、中央順に並べるプログラムです
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

char *a; int i;
typedef struct Tnode* link;
struct Tnode { char token; link l, r; };
link NEW(char token, link l, link r){
link x = malloc(sizeof *x);
x->token = token; x->l = l; x->r = r;
return x;}
link parse(){
char t = a[i++];
link x = NEW(t, NULL, NULL);
if ((t == '+') || (t == '*')){
x->l = parse(); x->r = parse(); }
return x;}

void printnode(char c, int h){
int i;
for (i = 0; i < h; i++) printf(" ");
printf("%c\n", c);}
void show(link x, int h){
if (x == NULL) return;
show(x->r, h+1);
printnode(x->item, h);
show(x->l, h+1); }


int main(int argc, char **argv){
link root;
if(argc != 2) exit(-1);
a = argv[1]; i = 0;
root = parse();
show(root,0);
}


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:質問です 21263 おでん 2005/06/07 23:26:13
<子記事> Re:質問です 21264 まきじ 2005/06/07 23:26:21
<子記事> Re:質問です 21265 elder 2005/06/07 23:26:36


No.21263

Re:質問です
投稿者---おでん(2005/06/07 23:26:13)


【掲示板ご利用上の注意】を読みましたか?
サブジェクト(表題、題名)は、内容をあらわすような書き方をしましょう。
“質問です”だけでは何を聞いているのか解りません。(読んでくれると
思わずに、質問内容を簡潔に表現しましょう)
ソースの字下げもちゃんとしましょう。読む気がしません。
で、本題です。
ちょっと気が付いたことだけですが・・・
コンパイラは、自分が見ているところより先は見えないと思ってください。
なので、"struct Tnode"の定義より前に、"typedef struct Tnode* link;"が
出てきても意味が解りません。
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

char *a; 
int i;
typedef struct Tnode* link; ←構造体の定義が見えません。Tnodeを先に定義しましょう

struct Tnode {
    char token; 
    link l, r; 
};

link NEW(char token, link l, link r){
    link x = malloc(sizeof *x); ←ポインタの領域だけでいいのですか?
    x->token = token; ←これはNGです。
    x->l = l; 
    x->r = r;
    return x;
}
link parse(){
    char t = a[i++];
    link x = NEW(t, NULL, NULL);
    if ((t == '+') || (t == '*')){
        x->l = parse(); 
        x->r = parse(); 
    }
    return x;
}

void printnode(char c, int h){
    int i;
    for (i = 0; i < h; i++) printf(" ");
    printf("%c\n", c);
}
void show(link x, int h){
    if (x == NULL) return;
    show(x->r, h+1);
    printnode(x->item, h);
    show(x->l, h+1); 
}


int main(int argc, char **argv){
    link root;
    if(argc != 2) exit(-1);
    a = argv[1]; 
    i = 0;
    root = parse();
    show(root,0);
}



この投稿にコメントする

削除パスワード

No.21266

Re:質問です(訂正)
投稿者---おでん(2005/06/07 23:34:17)


link x = malloc(sizeof *x); ←ポインタの領域だけでいいのですか?
は、間違っています。
"*x"ってなんですか?
xの宣言が無いようですが?


この投稿にコメントする

削除パスワード

No.21269

Re:質問です
投稿者---かずま(2005/06/08 10:32:55)


> コンパイラは、自分が見ているところより先は見えないと思ってください。
> なので、"struct Tnode"の定義より前に、"typedef struct Tnode* link;"が
> 出てきても意味が解りません。

せっかく字下げをしたのなら、コンパイルしてみてください。エラーは 1箇所
だけなので、未宣言のメンバ名 item を token に変えれば、実行できます。
-------------------
$ a.out +3*57
  7
 *
  5
+
 3
 ------------------


> typedef struct Tnode* link; ←構造体の定義が見えません。Tnodeを先に定義しましょう

コンパイルエラーが出ますか?
struct Tnode で、Tnode の宣言は済んでいます。
link を宣言するのに struct Tnode の定義は必要ありません。


>     link x = malloc(sizeof *x); ←ポインタの領域だけでいいのですか?

link x のところで、x の宣言は済んでいます。
sizeof *x は sizeof(struct Tnode) と同じになります。


>     x->token = token; ←これはNGです。

何も問題ありません。



この投稿にコメントする

削除パスワード

No.21264

Re:質問です
投稿者---まきじ(2005/06/07 23:26:21)


>以下のようなプログラムを組んだんですが、コンパイルが正しくできません
>どこがおかしいのか指摘ください、お願いします

コンパイルエラーでしたら、どこがおかしいかは、
コンパイラーが教えてくれていると思いますが。


この投稿にコメントする

削除パスワード

No.21265

Re:質問です
投稿者---elder(2005/06/07 23:26:36)


まずは他人が読みやすいコードにしてみましょう。
HTML変換ツールを使うのも忘れずに。
今のままでは指摘できるものも指摘できなくなります。


この投稿にコメントする

削除パスワード

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