K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[1622] Re:mycalc でエラー発生
投稿者:チャチャ丸
2010/08/20 10:27:08

>管理人の前橋です。はじめまして。 >しばらくこちらを見ていなくて、反応が遅くなりましてすみません。 はじめまして。お返事ありがとうございます。 >ここ↑からダウンロードしたファイルに含まれているmake.batやmake.shを >使わず、手作業でyacc(bison?)やlex(flex?)も動かしたということでしょうか? そうですね。bisonとflexを手入力で動かしました。そこではエラーは出ないのですが、 gcc -o mycalc y.tab.c lex.yy.c の所で以下の様なエラーが表示されます。 /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x8e): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0xc2): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0xed): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x133): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x168): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x1af): more undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x872): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x87f): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x899): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x1195): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x1231): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x16fb): undefined reference to `__errno' collect2: Id returned 1 exit status make.batを使った場合も同じ部分に「アクセスが拒否されました」と表示されます。 >具体的にどう操作されたのでしょうか。また、そこで何かエラーは出て >いないでしょうか。 特に変わった事をしたつもりはなかったのですが僕がした操作は、 mycalc.y mycalc.lをc/cygwin/home/user/に作成して >bison --yacc -dv mycalc.y >flex mycalc.l >gcc -o mycalc y.tab.c lex.yy.c と入力しただけです。 エラーが表示されたのは先ほど記述したインストールの最後に表示されるものだけです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1621] Re:mycalc でエラー発生
投稿者:774RR
2010/08/20 09:54:49

特になにか妙な設定が必要であったとか、そういうことはないはずだけど。 ttp://www.cygwin.com/ から setup.exe をダウンロードしローカルに保存 保存した setup.exe を起動 国内ミラーサイトを選択の上でダウンロード+インストールを実施 cygwin bash shell を起動し cd <to/where/mycalc/is/expanded> bison -y -dv mycalc.y flex mycalc.l gcc -o mycalc y.tab.c lex.yy.c ちなみに gcc --version と入力したときになんて表示される? ウチでは gcc (GCC) 4.3.4 20090804 (release) 1 になっている。 gcc -v -o mycalc y.tab.c lex.yy.c だと何が表示される? 結構膨大な量が出るので、先の --version が同じだった場合のみ実行すればいい。 メモを取ったりすると転記ミスが怖いので gcc -v -o mycalc y.tab.c lex.yy.c 2&>hoge.txt として hoge.txt を見たほうがいい。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1620] Re:mycalc でエラー発生
投稿者:774RR
2010/08/20 08:58:30

cygwin (1.5 も 1.7 も) のデフォルトインストール時は unix 改行。 ダウンロードページの mycalc (sjis/zip) に入っているファイルは dos 改行。 ・cygwin の bash-shell 上で make.sh を使うとこの dos 改行が邪魔して動かない。 ・cygwin の bash-shell 上で make.bat を使うと cmd.exe を呼ぶので下記参照 ・アクセサリ→コマンドプロンプトの cmd.exe 上で make.bat を使うと  cygwin 1.7 の /bin/gcc や /bin/cc が (cygwin 仕様による) symlink であるため  cmd.exe が gcc/cc を認識できず、起動失敗する といういささか困ったチャン状態なので、手打ちしたほうが早いという・・・ 改行コードの違いで動かないことが発見できる人なら改行コード変換もできるだろうけど 初めてチャレンジします!って人にそれを求めるのも酷な話で。 改行を修正しても cygwin には flex しか存在しないので lex → flex に要修正。 (/bin/yacc は /bin/bison の symlink になっているのでこっちは問題ない)
[この投稿を含むスレッドを表示] [この投稿を削除]
[1619] Re:mycalc でエラー発生
投稿者:(ぱ)こと管理人
2010/08/20 03:02:05

管理人の前橋です。はじめまして。 しばらくこちらを見ていなくて、反応が遅くなりましてすみません。 さて、チャチャ丸さんが具体的に行った操作がよくわからないのですが、 >今2章のyacc/lexで電卓を作る部分で、とりあえずmycalc.yとmycalc.lを >模写して実行したのですが、 >"cc -o mycalc y.tab.c lex.yy.c"のコマンドを行うとエラーが出ます。 ということは、 >>http://kmaebashi.com/programmer/devlang/book/download.html ここ↑からダウンロードしたファイルに含まれているmake.batやmake.shを 使わず、手作業でyacc(bison?)やlex(flex?)も動かしたということでしょうか? 具体的にどう操作されたのでしょうか。また、そこで何かエラーは出て いないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1618] Re:mycalc でエラー発生
投稿者:チャチャ丸
2010/08/20 01:42:54

連続投稿ですいません。 インストール時のエラーを見逃していました。 (長時間のインストールのせいでボケていたのでしょうかw) インストール終了時になかったパッケージみたいなのが表示されます。 どのサイトを選んでも同じものが表示されました。 以下 Package: No package boxes.sh exit code 2 brltty.sh exit code 1 docbook-xml-simple10.sh exit code 1 docbook-xml-simple11.sh exit code 1 docbook-xml412.sh exit code 1 docbook-xml42.sh exit code 1 docbook-xml43.sh exit code 1 docbook-xml44.sh exit code 1 docbook-xml45.sh exit code 1 docbook-xsl-ns.sh exit code 1 docbook-xsl.sh exit code 1 exim.sh exit code 1 libglade2.0.sh exit code 2 mined.sh exit code 1 です。 setupの前になにか設定が必要なのでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1617] Re:mycalc でエラー発生
投稿者:チャチャ丸
2010/08/19 23:35:43

タイトルありがとうございます。 >これは多分ライブラリを正しくリンクできていないことが原因だと思われる。 >ソースコードが原因ではなくて、まず間違いなく開発環境側の原因。 >cygwin のインストールが不足しているか、操作ミスと思われる。 今日再インストールしてみたのですが同じエラーが表示されました。 今回は出来る物は一応全部インストールしました。 またバージョンは確認したところ1.7.6でした。 同じバージョンで出来ないということは、やはり環境構築にミスがあるのかもしれないです。 再度調べて検証してみます。 >チャチャ丸氏のところの cygwin のバージョンとかインストール状態が不明なので、 >今この場でこれ以上のアドバイスはできないなぁ。 とても助かりました。ありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1616] mycalc でエラー発生
投稿者:774RR
2010/08/18 21:44:44

タイトル変えておくね > undefined reference to `__imp__iob' > undefined reference to `__errno' これは多分ライブラリを正しくリンクできていないことが原因だと思われる。 ソースコードが原因ではなくて、まず間違いなく開発環境側の原因。 cygwin のインストールが不足しているか、操作ミスと思われる。 で、ウチの cygwin 1.7.6 だと何の問題も無くうまくコンパイル・リンクされる。 実行結果も期待通り。 チャチャ丸氏のところの cygwin のバージョンとかインストール状態が不明なので、 今この場でこれ以上のアドバイスはできないなぁ。 cygwin の再/追加インストールしてみるとか・・・ > # make.sh 中 lex → flex に修正が必要かも はとりあえず忘れていいよ。こっちを追求しだすと横道にそれていくので。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1615] Re:はじめまして
投稿者:チャチャ丸
2010/08/18 20:29:19

素早いお返事ありがとうございます。とても助かります。 >提示部はすべて警告であってエラーぢゃない(=承知の上で使う分には問題ない) >以下略の部分にあるエラー(警告でなくエラー)を見せてもらわないと判断不能。 エラーの方はよくわからなくて勝手にはしょってしまいました。すいません。 以下エラーです。 /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x8e): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0xc2): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0xed): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x133): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x168): undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccxzh81W.o:y.tab.c:(.text+0x1af): more undefined reference to `__imp__iob' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x872): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x87f): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x899): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x1195): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x1231): undefined reference to `__errno' /cygdrive/c/DOCUME~1/Temp/ccrE3OK5.o:lex.yy.c:(.text+0x16fb): undefined reference to `__errno' collect2: Id returned 1 exit status です。 >とりあえずタイプミスとか無いかい? >http://kmaebashi.com/programmer/devlang/book/download.html >ここからダウンロードした mycalc は正しく動いたよ。 僕もタイプミスしてるのではと思ってそこからダウンロードしたものでも試したんですが同様のエラーが出てしましました。 ># make.sh 中 lex → flex に修正が必要かも とても基本的なことで申し訳ないのですがどのファイルのどのあたりの部分の事でしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1614] Re:はじめまして
投稿者:774RR
2010/08/18 13:14:16

提示部はすべて警告であってエラーぢゃない(=承知の上で使う分には問題ない) 以下略の部分にあるエラー(警告でなくエラー)を見せてもらわないと判断不能。 とりあえずタイプミスとか無いかい? http://kmaebashi.com/programmer/devlang/book/download.html ここからダウンロードした mycalc は正しく動いたよ。 # make.sh 中 lex → flex に修正が必要かも
[この投稿を含むスレッドを表示] [この投稿を削除]
[1613] はじめまして
投稿者:チャチャ丸
2010/08/18 02:34:17

はじめまして。「プログラミング言語を作る」を読み初めて勉強中のチャチャ丸と申します。 まだまだ序盤なのですが質問があって投稿させてもらいました。 今2章のyacc/lexで電卓を作る部分で、とりあえずmycalc.yとmycalc.lを模写して実行したのですが、 "cc -o mycalc y.tab.c lex.yy.c"のコマンドを行うとエラーが出ます。 エラーの内容は-Wallで見たところ y.tab.c: In function 'yyparse' : y.tab.c:1270: warning: implicit declaration of function 'yylex' y.tab.c:1439: warning: implicit declaration of function 'yyerror' lex.yy.c:1120: warning: 'yyunput' defined but not used lex.yy.c:1163: warning: 'input' defined but not used (以下略) と表示されます。 y.tab.cを見てみたところ622行目から #ifdef YYLEX_PARAM # define YYLEX yylex (YYLEX_PARAM) #else # define YYLEX yylex () #endif という部分があったのでyylexは定義されているように思えるのですが、なにが原因なのでしょうか? ちなみにcygwinを利用しています。 何かお答えいただければ幸いです。よろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1612] 管理者により削除されました
2010/08/12 02:08:17

広告削除…ふぅ。
[この投稿を含むスレッドを表示]
[1611] 管理者により削除されました
2010/08/08 18:24:55

テスト投稿はテスト用掲示板にお願いします。
[この投稿を含むスレッドを表示]
[1610] Re:prime.milについて
投稿者:yuya
2010/08/01 08:29:09

(ぱ)さん、お返事ありがとうございます。 ご事情、了解いたしました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1609] Re:prime.milについて
投稿者:(ぱ)こと管理人
2010/07/31 18:19:16

>日経ソフトウエア8月号「MIL」の記事を読んでいます。 > >本編に進む前に、p18のprime.milでつまづいてしまいました。 もうしわけありません。たしかにprime.milは直感的なコードとは 言えないと思います。ふつうに考えて、そもそもループが三重である必要は ないはずですし。 prime.milがこうなってしまった事情はいろいろあるのですが、最終的には 私の責任であると思います。もうしわけありませんでした。 まあ、prime.milはMILの機能を示すためのサンプルコードなので、制御構造や 計算等の機能を使っていれば問題ない、ということで雑になってしまった面は あります。そこまで丁寧に読んでいただけるのは正直想定外でした。 ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1608] Re:prime.milについて
投稿者:yuya
2010/07/30 16:56:16

774RRさん、ご意見ありがとうございます。 >ならば処理上は一見無駄に思えるような記述であっても合目的でおkだと思いますが。 ># その無駄さ自体がイイというか ># どこがどう無駄かを読者に考えてもらうのがイイというか おっしゃるとおりで、おかげで私も自分で組んでみる機会を得て勉強になりました。 >yuya さんの投稿プログラムも「素数の個数」には実用的でないですよね? ええ、あれは元のソースとほぼ同じアルゴリズムを、自分に読めるように書き直したものです。 脇道に気を取られて、本編のことに全然言及していませんが、 いつものとおり素晴らしく分かりやすい解説です。 「車輪の再発明」にもピンからキリまで、 歴然としたクォリティの違いがあるものだな、と改めて思いました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1607] Re:prime.milについて
投稿者:774RR
2010/07/30 10:26:31

# 元ネタは読んでいません 記事(というかサンプルプログラム)の目的は、 素数の個数を求めることではなくて、その独自言語の解説なんですよね? ならば処理上は一見無駄に思えるような記述であっても合目的でおkだと思いますが。 # その無駄さ自体がイイというか # どこがどう無駄かを読者に考えてもらうのがイイというか yuya さんの投稿プログラムも「素数の個数」には実用的でないですよね?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1606] prime.milについて
投稿者:yuya
2010/07/29 10:00:34

日経ソフトウエア8月号「MIL」の記事を読んでいます。 本編に進む前に、p18のprime.milでつまづいてしまいました。 かなり時間をかけて、「確かにこれで素数は求まる」ことは納得したのですが、 それでも疑問がたくさん残ります。 たとえば、c を number / 2 まで回すのなら分かりますが、 小さな number に対しても一律 HALF_OF_MAX まで回す必要があるのでしょうか? はじめ、ソースが複雑なのは言語の仕様を切り詰めているせいかと思いましたが、 自分で書いてみるとこうなりました。 MAX = 1000; number_of_prime = 0; number = 2; while(number <= MAX){ i = 2; while(i < number){ # 2 から number - 1 の範囲の整数で if(number / i * i == number){ # 割り切れたら goto *exit; # 素数ではない } i = i + 1; } print(number); number_of_prime = number_of_prime + 1; *exit number = number + 1; } print("the number of prime is"); print(number_of_prime); 書いたあとで再度p18のソースを見ると、 必要以上の複雑さがかなり含まれていると感じました。 (ぱ)さんの記事はいつも日本語が驚異的に分かりやすいので、 ソースにも同じくらいの分かりやすさを無意識に要求してしまっているのかもしれません。 読者のわがままというものですが……。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1605] Re:Diksamのmakeでエラーとなる
投稿者:(ぱ)こと管理人
2010/07/28 03:30:25

はじめまして。 >>bison --yacc -dy diksam.y >>diksam.y:428 13-14: $$ for the midrule at $2 of 'block' has no declared type >>gmake: *** [y.tab..h] Error 1 本件、おそらく正誤表の以下の件(p.206の件)だと思います。 http://kmaebashi.com/programmer/devlang/book/seigo.html#p206 当時、どのように判断したのかは正直なところあまり覚えていないのですが、 公開しているソースが修正されていないのは問題かと思います。 週末あたりをめどに確認させてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1604] bison2.4系列だとDiksamがコンパイル出来ないようです
投稿者:hasim
2010/07/28 01:09:03

こんばんは、hasimと申します。 言語作成に関する詳しい解説、勉強させて頂いてます。 Diksamのソースコードをコンパイルしようとしたのですが、 bisonのバージョンが2.4だとエラーが起きるようです。 bisonのバージョンを2.3に落としたら、無事コンパイル出来ました。 エラー内容は以下のようなものでした。 % bison compiler/diksam.y compiler/diksam.y:748.13-14: $$ for the midrule at $2 of `catch_clause' has no declared type compiler/diksam.y:786.13-14: $$ for the midrule at $2 of `block' has no declared type ご参考になれば幸いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1601] 管理者により削除されました
2010/07/05 00:20:27

テスト書き込みはテスト用掲示板にどうぞ。 http://kmaebashi.com/bbs/list.php?boardid=testbbs
[この投稿を含むスレッドを表示]
[1600] 一応できたのでソースをさらします。
投稿者:バッファロー
2010/07/01 09:57:49

助言をいただき、それをむねに一応完成したソースを書き込みます。 変なところがあれば、ぜひ助言をお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef int (*Compare)(int,int) ; typedef struct DATA DATA; struct DATA { DATA * next; char * name; int math; int language; int sum; }; #define MAX 256 int AscendinOrder(int a,int b); int DescendingOrder(int a,int b); DATA* merge_sort(DATA* top,Compare); DATA* merge_list(DATA* x, DATA* y,Compare); /**************************************** 機能:線形リストのデータをすべて解放する。 引数:top 線形リストのトップデータ comp 使用した比較関数 出力:無し ****************************************/ void AllFree(DATA *top,Compare *comp) { DATA *temp,*freeData; if(*comp == AscendinOrder || *comp == NULL){ temp = top; while(temp->next){ freeData = temp; temp =temp->next; free(freeData->name); free(freeData); } }else if(*comp == DescendingOrder){ temp = top->next; while(temp){ freeData = temp; temp =temp->next; free(freeData->name); free(freeData); } } } /**************************************** 機能:線形リストのノードを作成。 引数:無し 出力:DATA型の新しいノードのポインタ ****************************************/ DATA* newnode(){ DATA *p; p=malloc(sizeof(DATA)); p->next=NULL; return p; } /**************************************** 機能:合計点を求める 引数:data 合計点を求めるDATA型のポインタ 出力:mathとlanguageの合計点 ****************************************/ int SUM(DATA *data) { return data->math+data->language; } /**************************************** 機能:線形リストの末尾にノードを追加。 引数:p リストの先頭 c リストnameにはいる名前 lang リストのlanguageに入る数値 math リストのmathに入る数値 出力:無し ****************************************/ void add(DATA *p,char *c,int lang,int math){ while(p->next != NULL){ p= p->next; } p->math = math; p->language = lang; p->sum = SUM(p); p->name=malloc(strlen(c)+1); strcpy(p->name,c); p->next=newnode(); } /**************************************** 機能:線形リストの内容を表示。 引数:data リストの先頭 comp 使った比較関数 出力:無し ****************************************/ void ShowData(DATA *data,Compare *comp) { DATA *temp; if(*comp == AscendinOrder || *comp == NULL){ for(temp = data; temp->next;temp= temp->next){ printf("name : %s, language : %d, math : %d, sum :%d \n",temp->name,temp->language,temp->math,temp->sum); } }else if(*comp == DescendingOrder){ for(temp = data->next; temp;temp= temp->next){ printf("name : %s, language : %d, math : %d, sum :%d \n",temp->name,temp->language,temp->math,temp->sum); } } } /**************************************** 機能:表示方法の設定。 引数:無し 出力:表示方法の値。 ****************************************/ int ShowCase() { char c; printf("昇順で表示 :1 ,降順で表示:2\n"); c = getchar(); switch(c){ case '1': return 1; case '2': return 2; default: return 0; } } int main() { char data[MAX] = {'\0'}; char ctemp[100] = {'\0'}; int m,l,type; FILE *fp = fopen("data.txt","r"); char *n; DATA *top = malloc(sizeof(DATA)); Compare comp = NULL; type=ShowCase(); if(type == 1){ comp = AscendinOrder; }else if(type == 2){ comp = DescendingOrder; }else{ comp = NULL; } top->next = NULL; while(fgets(data,MAX,fp)){ if(n = strchr(data,'\n')) *n = '\0'; sscanf(data,"%s%d%d",ctemp,&m,&l); add(top,ctemp,l,m); } if(comp != NULL){ top =merge_sort(top,comp); } ShowData(top,&comp); AllFree(top,&comp); return 0; } /**************************************** 機能:線形リストのマージソートする。 引数:top リストの先頭 comp 使う比較関数 出力:ソート済みのリストのポインタ ****************************************/ DATA* merge_sort(DATA* top,Compare comp) { DATA *a, *b, *y; /* リストに含まれる要素数が0または1個のときは、ソートの必要がない */ if( top == NULL || top->next == NULL ){ return top; } a = top; /* aは先頭の要素を指す */ b = top->next; if( b != NULL ){ b = b->next; } /* bは先頭から3番目の要素を指す */ /* 線形リストを中心くらいから半分に分けるため、中心位置がどこにあるのか探る */ while( b != NULL ) { a = a->next; /* aは常に1つだけ進む */ b = b->next; if( b != NULL ){ b = b->next; } /* bは基本的に2つ進む */ } /* 線形リストを2つに分割する */ y = a->next; /* yは分割後の2つのリストのうちの、後半部分の方の先頭を指す */ a->next = NULL; /* 分割した2つのリスト */ return merge_list( merge_sort( top ,comp), merge_sort( y ,comp) ,comp); } /************************************************************************ 機能:2つの線形リストをマージする。 引数:x マージする2つの線形リストのうちの片方の先頭要素へのポインタ  y マージする2つの線形リストのうちの片方の先頭要素へのポインタ comp 比較関数 出力: マージされた線形リストの先頭要素へのポインタ *************************************************************************/ DATA* merge_list(DATA* x, DATA* y,Compare comp) { DATA z, *p; p = &z; /* xとyをマージしてzを作り上げる */ /* 分割されている2つのリストのいずれか一方が空になるまで繰り返す */ while( x != NULL && y != NULL ) { /* 2つのリストの先頭要素同士を比較する */ if( comp(x->sum , y->sum) ) { /* リストxの方の先頭要素を、マージ後のリストに連結する */ p->next = x; p = x; x = x->next; } else { /* リストyの方の先頭要素を、マージ後のリストに連結する */ p->next = y; p = y; y = y->next; } } /* 先に片方のリストが空になるので、残された方のリストの要素を、マージ後リストに連結する */ if( x == NULL ) { p->next = y; } else { p->next = x; } return z.next; } int AscendinOrder(int a,int b) { return a>=b? 1:0; } int DescendingOrder(int a,int b) { return a <= b?1:0; } data.txtの中身 jon 90 30 sum 40 50 jack 20 100 tom 35 70
[この投稿を含むスレッドを表示] [この投稿を削除]
[1599] Re:自己参照構造体のソートの方法がわかりません
投稿者:バッファロー
2010/07/01 07:40:14

>>線形リストをつくったのですが、リストに値をセットした後連結リストをソートしたい >>のですが、わかりません。どなたか教えてください。 > >だったらマージソート…と思ったのですが774RRさんに先に書かれてしまったので、 >本題からずれますが、 > >> DATA *top = malloc(sizeof(DATA)); > >最初にいきなりダミーのノードを作っていて、そのために以後、 >ループをまわすとき、p->nextを終了判定に使うことになっています。 >add()関数が微妙に楽になる以外、ここにダミーノードを置くことは >あまりメリットがないんじゃないかなあ、と私は昔から思っているのですが >(センス・オブ・プログラミングに書いたりもしましたが)どうなんでしょうねえ。 > >あとまあ、ものすごく細かいことですが、 > >>int SUM(DATA *data) >>{ >> return data->language+data->language; >>} > >ここはdata->math + data->languageですよね。 > >また、連結リストのソートは、効率を気にしないのなら単純選択ソートとかでも >できるんじゃないでしょうか。 > >・連結リストを頭からスキャンして、最大値のノードを探す。 >・最大値のノードをリストから引っぺがし、ソート済みリストの先頭につなぐ。 >・上記操作を繰り返す。 > 貴重なご意見ありがとうございました。 たしかにdata->math + data->languageでした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1598] Re:自己参照構造体のソートの方法がわかりません
投稿者:バッファロー
2010/07/01 07:11:18

>線形リストのソートは結構めんどくさいので、できればやらずにすむのが理想。 >最初からデータをソート済みの形で保持する構造を使うほうがよい結果が出ることが多い。 >二分木構造とかを使うのが普通(実用上、赤黒木になるかな) > >でもどうしても線形リストをそのままソートしたいのであれば、 >まさにそのような目的のために考案された「マージソート」を使うといい。 >http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%82%B8%E3%82%BD%E3%83%BC%E3%83%88 >http://www.geocities.jp/ky_webid/algorithm/021.html > 貴重なご意見ありがとうございました。 無事ソートできました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1597] Re:自己参照構造体のソートの方法がわかりません
投稿者:(ぱ)こと管理人
2010/07/01 01:53:45

>線形リストをつくったのですが、リストに値をセットした後連結リストをソートしたい >のですが、わかりません。どなたか教えてください。 だったらマージソート…と思ったのですが774RRさんに先に書かれてしまったので、 本題からずれますが、 > DATA *top = malloc(sizeof(DATA)); 最初にいきなりダミーのノードを作っていて、そのために以後、 ループをまわすとき、p->nextを終了判定に使うことになっています。 add()関数が微妙に楽になる以外、ここにダミーノードを置くことは あまりメリットがないんじゃないかなあ、と私は昔から思っているのですが (センス・オブ・プログラミングに書いたりもしましたが)どうなんでしょうねえ。 あとまあ、ものすごく細かいことですが、 >int SUM(DATA *data) >{ > return data->language+data->language; >} ここはdata->math + data->languageですよね。 また、連結リストのソートは、効率を気にしないのなら単純選択ソートとかでも できるんじゃないでしょうか。 ・連結リストを頭からスキャンして、最大値のノードを探す。 ・最大値のノードをリストから引っぺがし、ソート済みリストの先頭につなぐ。 ・上記操作を繰り返す。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1596] Re:自己参照構造体のソートの方法がわかりません
投稿者:774RR
2010/06/30 21:41:22

線形リストのソートは結構めんどくさいので、できればやらずにすむのが理想。 最初からデータをソート済みの形で保持する構造を使うほうがよい結果が出ることが多い。 二分木構造とかを使うのが普通(実用上、赤黒木になるかな) でもどうしても線形リストをそのままソートしたいのであれば、 まさにそのような目的のために考案された「マージソート」を使うといい。 http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%82%B8%E3%82%BD%E3%83%BC%E3%83%88 http://www.geocities.jp/ky_webid/algorithm/021.html
[この投稿を含むスレッドを表示] [この投稿を削除]
[1595] 自己参照構造体のソートの方法がわかりません
投稿者:バッファロー
2010/06/30 11:27:14

線形リストをつくったのですが、リストに値をセットした後連結リストをソートしたい のですが、わかりません。どなたか教えてください。 ソース(free用関数は後で作ります。): #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct DATA DATA; struct DATA { DATA * next; char * name; int math; int language; int sum; }; #define MAX 256 void listSort(DATA *top); DATA* newnode(){ DATA *p; p=malloc(sizeof(DATA)); p->next=NULL; return p; } int SUM(DATA *data) { return data->language+data->language; } void add(DATA *p,char *c,int lang,int math){ while(p->next != NULL){ p= p->next; } p->math = math; p->language = lang; p->sum = SUM(p); p->name=malloc(strlen(c)+1); strcpy(p->name,c); p->next=newnode(); } void ShowData(DATA *data) { FILE *fp = fopen("result.txt","w"); DATA *temp; for(temp = data; temp->next;temp= temp->next){ printf("name : %s, language : %d, math : %d, sum :%d \n",temp->name,temp->language,temp->math,temp->sum); } for(temp = data; temp->next;temp= temp->next){ fprintf(fp,"name : %s, language : %d, math : %d, sum :%d \n",temp->name,temp->language,temp->math,temp->sum); } fclose(fp); } int main() { char data[MAX] = {'\0'}; char ctemp[100] = {'\0'}; int m,l; FILE *fp = fopen("data.txt","r"); char *n; DATA *top = malloc(sizeof(DATA)); top->next = NULL; while(fgets(data,MAX,fp)){ if(n = strchr(data,'\n')) *n = '\0'; sscanf(data,"%s%d%d",ctemp,&m,&l); add(top,ctemp,l,m); } listSort(top); ShowData(top); return 0; } void listSort(DATA *top) { //ここのしょりがわかりません //ちなみにsumで比較 }
[この投稿を含むスレッドを表示] [この投稿を削除]
[1593] Re:spam判定テスト
投稿者:(ぱ)こと管理人
2010/06/13 13:45:23

すみません、ものすごく初歩的なバグがあって本来弾けるはずのspamが来ていました。 修正しました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1592] Re:spam判定テスト
投稿者:(ぱ)こと管理人
2010/06/13 06:19:31

>一時的にテスト用のスクリプトを上げます。 NGワード機能を搭載し、ひととおりの動作テストをしました。 ここで高級バッグの話をしたりするとひっかかるかもしれません。 spammer以外の人には申し訳ないですがご了承ください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1591] spam判定テスト
投稿者:(ぱ)こと管理人
2010/06/13 05:58:08

一時的にテスト用のスクリプトを上げます。 しばらくは投稿がエラーになる可能性があります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1577] Re:IF文の判定について
投稿者:通行人B
2010/06/11 17:34:13

管理人さま >どちらについても保証されています。 根拠まで示していただき、ありがとうございました。m(_ _)m 774RRさま、yuyaさま >一方で #define TRUE 1 とかしていることが多いので >func()==TRUE はバグの元だからやらないほうがいいよ 取り急ぎ、アドバイスにお礼申し上げます。
[この投稿を含むスレッドを表示] [この投稿を削除]