1 名前:デフォルトの名無しさん mailto:sage [2007/07/18(水) 09:10:30 ] エスケープシーケンスやWin32APIなどの環境依存な物でもOK。 ただしその場合、質問者は必ず、環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.39【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1182740506/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
666 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 09:52:07 ] int s; *k = 0; while (no>0) { count[*k] = analyze(no, s); ←初期化されてないsが使われてる no -= (1<<count[(*k)++]); }
667 名前:656 mailto:sage [2007/08/02(木) 09:53:38 ] すいません、できました。 divide関数内で *k++とかいう変なことをしてたみたいで・・・ *k += 1; と書き換えたらできました。 ありがとうございます。
668 名前:656 mailto:sage [2007/08/02(木) 09:55:16 ] >>666 ああなるほど、ポインタは括弧をつければよかったんですね・・・orz sは初期化されてないからですか・・・わかりました、ありがとうございます。
669 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 10:03:19 ] >>665 うん。 "A pointer to void shall have the same representation and alignment requirements as a pointer to a character type." ISO C 6.2.5 Types p26
670 名前:656 mailto:sage [2007/08/02(木) 10:03:24 ] というか、sを戻り値として返すなら、divide関数でsはいらないですね・・・。 アホだ・・・orz
671 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 15:03:47 ] Wallにしたら標準ライブラリでさえゴルァされるから使い物にならんと思うんだけど
672 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 15:06:18 ] >>669 d
673 名前:デフォルトの名無しさん [2007/08/02(木) 15:31:38 ] std::vector<int> v;って宣言したときにこれのサイズを保持する型を std::vector<int>::size_typeって宣言するのではなく 変数名vを使って宣言したいのですがなんか良い方法無いですかね? typeof(v)::size_typeとかboost::range_size< typeof(v) >::type (←勿論通りません><) みたいにできたらめちゃ便利だと思うんですが
674 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 16:03:34 ] typeof は提案されたこともあるみたいだけどねえ。 いまんとこはできないね。 そういう場合は typedef しとくというくらいしか言えんなあ。 std::vector<int> v_t; v_t v; v_t::size_type i;
675 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 16:06:22 ] typedef が抜けてた。まあいいや。
676 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 16:07:40 ] ><;
677 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 16:12:12 ] <>;
678 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 16:13:49 ] ×;
679 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 16:26:34 ] ◇;
680 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 16:34:10 ] チョー!
681 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 16:34:32 ] BASIC スレにでも迷い込んだのかと思った
682 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 16:38:20 ] CLS
683 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 16:53:10 ] すいません。 void *型ってどんな型にも切れるただのメモリアドレスって考えれば良いのですか?
684 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:08:12 ] お前別スレで質問してきちんとした回答貰ってるだろうが 礼儀知らずにも程がある
685 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:10:30 ] ええ〜、してないですYo!
686 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:13:33 ] 死ね
687 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:19:25 ] 一方的に決めつけられて、死ねといわれる始末。 なんという仕打ち。
688 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:19:49 ] 「切れる」っていうのが、なんかアクロバティックな用法だなあ。 こう、「アタシは侍ザマス!」みたいな? 「void*型からunsigned long(*)(bstr_t const&, IDispatch**)型に斬ってしんぜるナリ!」みたいな?
689 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:22:55 ] >>683 言葉の使い方は他人に通じるように
690 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:23:44 ] >>673-674 今はdecltypeという名称になっている。
691 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:26:33 ] >>687 同じ文体なんだから別人なら普通変えるだろ。バカかよ
692 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:27:25 ] 不毛
693 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:31:11 ] ><;
694 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:35:58 ] >>684 そのスレどこ?
695 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 17:58:27 ] >>692 C++スレだけに
696 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 18:08:50 ] >>694 pc11.2ch.net/test/read.cgi/tech/1184717430/653-654 >>695 誰がうまいこと言えと(ry
697 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 18:25:13 ] >>684 別スレじゃなくてこのスレかよ >>685 お前の言葉は本当だったな
698 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 19:16:35 ] 構造体のサイズをsizeofで取るとなんか不思議な結果が返ってくる。 struct TEST { char chr[3]; }; printf("%d\n", sizeof(TEST)); 結果:3 struct TEST2 { long lng; char chr[3]; }; printf("%d\n", sizeof(TEST2)); 結果:8 TESTとTEST2で明らかに計算方法が違うのはなぜなんでしょうか?
699 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 19:23:41 ] 「パティング 構造体」でググると幸せになれるよ
700 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 19:26:02 ] パディングじゃね?
701 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 19:28:07 ] そして、なぜパディングが入るかというと、境界調整のため。
702 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 19:42:41 ] >>699-701 www.g-ishihara.com/c_st_01.htm を見て納得しました! ありがとうございます。
703 名前:デフォルトの名無しさん [2007/08/02(木) 19:50:02 ] すいません、おじゃまします。 コンストラクター、デストラクターからstaticのメンバー変数にアクセするにはどのように記述したらよいでしょうか。
704 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 20:01:11 ] >>703 普通に。
705 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 20:49:03 ] >>704 解答としては不適切。
706 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 20:57:27 ] >>703 不適切。
707 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:00:09 ] >>705 それ以外に答えようが
708 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:00:16 ] 静的メンバからのアクセスは制限あるけど 逆は問題ないよね?
709 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:17:00 ] うん
710 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:23:30 ] fstreamが遅いんですが何とかなりませんか。 wfstreamともなるとアホみたいに遅いです。
711 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:25:32 ] 端末変えろ
712 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:27:53 ] fstream捨てたら。
713 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:44:25 ] >>711 端末を変えるとfstreamが速くなるのですか? >>712 機能的にはstdioより好ましいですし標準ですから、出来れば使いたいのですが。 wfstreamとgetline()を使って書かれた単にコピーするだけのC++プログラムが、 perlだのpythonだので書かれた、正規表現を用いてちょっと文字列を置換する スクリプトよりも遅いので、呆れます(後者でもちゃんとエンコード変換を 行っているのにです)
714 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:54:44 ] >>713 アタリマエだろ。 単にコピーするだけにgetlineを使うお前が悪い。
715 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:55:41 ] 単にコピーするなら read して write だろう・・・。
716 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:58:47 ] その処理にgetlineを使おうとする発想にまず驚いた
717 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:59:34 ] >>714 ああ、説明不足でしたね。 行単位で下らない置換処理を行う下らないプログラムを色々な言語や ライブラリを使って書いてみたのです。 ですので、例えばPerlで書いたものも、$/をundefせずに行単位で入力して いますから、条件は対等のはずでしょう。 C++で書いたものがあまりに遅いので、試しに置換処理を抜いて コピーだけにしたところ、その時点で他のスクリプト言語にさえ負けている (wfstreamの場合は)ことが判明してしまいました。
718 名前:703 [2007/08/02(木) 22:04:32 ] RESありがとう御座います。 そうですか、普通にアクセス可能ですか。。。 現象としては「static int xxx」で宣言した変数がリンカーで次のようにエラーしてしまいます。(環境VC2005) LNK2001: 外部シンボル ""public: static int PerfMonMgr::xxx" (?xxx@PerfMonMgr@@2HA)" は未解決です。」 宣言部にstaticを取って「int xxx」で宣言するとエラーは出ないんですが。 ちなみにこのコードはDLLのコードの一部なんですが関係ありませんでしょうか。
719 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:07:27 ] 変数の実体作ってないんでしょ。
720 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:07:34 ] >>717 perlとかはIO関連はC/C++の標準関数は使わずに独自にコントロールしてるんじゃなかったっけ? PerlのIOはPerl向けにチューニングしてるからこそそうなるんであって、 何にもしない素でもC++なら速いと思ってるなら幻想だろう。 構造的な美しさをとるか泥臭くても速度をとるかでケースバイケースじゃないかなぁ。
721 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:09:23 ] なかなか興味深い結果だな。
722 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:10:24 ] ちょっと話題がそれるが、C++でファイルのコピーだけならこんなカンジでいいんじゃね? std::ofstream("out.bin", std::ios::binary) << std::ifstream("in.bin", std::ios::binary).rdbuf() ;
723 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:26:00 ] OSネイティブの入出力APIを使うストリームバッファを自分で書いたりしてみたらどう?
724 名前:710 mailto:sage [2007/08/02(木) 22:29:02 ] ↓実験に使ったソースです tonosiki.mbnsk.net/uploader/src/up1564.zip 青空文庫のテキスト形式の小説を読み込んで、<ruby>タグを適当に 挿入するだけの下らないプログラムです。 サンプル入力として夏目漱石の三四郎を入れてあります。 C++のものは、Boost(Xpressive)、ICU、COM(VBScriptのRegexエンジン) を用いたものと、単にコピーするだけのもの3種(wchar_tに変換しない版、 自前で変換する版、wfstreamに任せる版) スクリプトはJScript(WSH用)、perl, python それとC#のものがあります。 C++で無変換なものが無論最速でしたが、次に速いのはJScript + wshext.dll でした(cscript.exeなどから明示的に起動するとずっと遅い) C++ではICUがなかなか健闘しましたが、boost版はPythonやPerlに勝てず、 wfstreamでただコピーするだけの版は、これらのどれよりも遅かったです。
725 名前:710 mailto:sage [2007/08/02(木) 22:35:40 ] >>720 もともとPerlは速い印象でしたが、エンコード指定のopen()を使うと それほどでもない というか、意外にもPythonのほうが速かったです。 どっちもcygwinのもの(つまり遅い実装)を使ったのですが それよりもVC++7.1でコンパイルしたネイティブのC++プログラムが遅いのは 流石にどうかと思いました ちなみにC++のものは、std::basic_stringを戻り値として使わず 全て参照引数渡しで同じインスタンスを使いまわすとパフォーマンスの 改善が見られましたが、素直な書き方に比べて大きな違いが出るほどでは ありませんでした。
726 名前:デフォルトの名無しさん [2007/08/02(木) 22:41:30 ] Cが最速なのは間違いがないよ C単体ならDLLを使わなくていいんだから・・ 時間が掛かるところは、読み込み、出力と置換する場所のサーチでしょ? 文書をバッファに蓄えておいて、置換作業と並列化してみ
727 名前:710 mailto:sage [2007/08/02(木) 22:46:34 ] >>726 Cでも書こうかと思ったのですが、 char->wchar変換 置換1〜3 wchar->char変換 の5段ぐらいのフィルタ処理を行っており、文字列処理とメモリ管理が あまりに面倒臭いのでやめましたw CでやるならGCが欲しいです。
728 名前:デフォルトの名無しさん [2007/08/02(木) 22:48:01 ] >>724 キミのCのコードは訳が分からん(知識がない訳だが・・・) もっと単純に書いてみ char型にして<<を探して置き換えるだけだろ?? そしたら速いかもよ
729 名前:710 mailto:sage [2007/08/02(木) 22:49:59 ] >>728 Cでは書いていません。C++です。 拡張子cppのものは全てmain()を含むメインプログラムで、 全てのソースでfilter.hppをインクルードしています。
730 名前:デフォルトの名無しさん [2007/08/02(木) 22:50:24 ] >>727 726でCといったのはC++を含むわけだが・・・ 単純に言って、一行読み込んで《・・》を書き換えるだけでしょ? なぜ何工程も必要なんだよ???
731 名前:710 mailto:sage [2007/08/02(木) 22:52:11 ] >>730 日本語を含む正規表現での置換処理ですので、wchar_tに変換しています。 置換を3段階行っているのは、もっと効率化できるかもしれませんが、 どの言語でもやっていることは同じです。 C++だけ特に遅くなるような書き方をしているつもりはありません。
732 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:52:15 ] C++のlocale周りを理解している人間なんて本当に少ない。おれもよくわかんないし。 それはぐぐっても日本語英語問わず資料が少ないことからも想像が付く。 そして処理系の実装はバグ持ちで遅く、ますます誰も使わず、負の悪循環。 >>730 その処理を全部省いたとしても、ワイド文字ストリームという砦が待ち構えている。
733 名前:デフォルトの名無しさん [2007/08/02(木) 22:53:54 ] >>731 正規表現使わずに、例えばchar c[1000]; に読み込んで if ( c[i]=='<' && c[i+1]=='<' ) とやった方が速いだろ
734 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:56:18 ] >>733 他言語との比較でそんな抜け道はだめだろ。
735 名前:デフォルトの名無しさん [2007/08/02(木) 22:59:27 ] 速く変換したいという目的なんでしょ?そのためにどれが速いか検討していると 普通に考えると正規表現使わず<<だけ見つけた方が速いだろって事だ
736 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:00:29 ] wchar_t なんかに変換する必要ないじゃん。 その文字コードに合わせて処理すればいいだけ。
737 名前:710 mailto:sage [2007/08/02(木) 23:02:44 ] >>735 いいえ。違います。 速くしたいのならmmap()でも使いますが、Perlで以下の3行で済む下らない 仕事に一体何行費やすつもりですか。 試しにCのコードを書いてみてください。可変長の文字列を使う時点で既に Cでは面倒くさいです。 $s =~ s{(.+)[#「\1」に傍点]}{ sprintf('<ruby>%s<rt>%s</ruby>', $1, 'ヽ' x length($1))}ego; $s =~ s/|?([々\x{4E00}-\x{9FFF}\x{F900}-\x{FAFF}]+)《(.+?)》/<ruby>$1<rt>$2<\/ruby>/go; $s =~ s{([||〔\s])([^|〔《》\s]+)《(.+?)》}{sprintf( '%s<ruby>%s<rt>%s</ruby>', ($1 eq '|') ? "" : $1, $2, $3)}ego;
738 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:03:43 ] C++ならなんでも速いというのは幻想。 速くなるようにチューニングする余地が用意されているというだけで、 素のままで速いとは限らない。正に今回はその好例。
739 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:04:18 ] 文字コードが何かもわからないのに>>733 はないだろ UCS-2だったらどうする
740 名前:デフォルトの名無しさん [2007/08/02(木) 23:04:37 ] どのコードでも、《》の配置は換わらないのでは???
741 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:06:57 ] >>735 普通の考えなんか価値なす。 大事なのは現実の速度。
742 名前:710 mailto:sage [2007/08/02(木) 23:07:40 ] >>740 漢字《ふりがな》 といったパターンを捕まえて、変換しなければなりませんので、 文字クラスにUnicodeが使えると便利なのです。 それに、「全ての言語で」Unicodeの正規表現を使っています。 C++だけわざわざそうしているわけではありません。
743 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:09:53 ] >>735 他の言語でも同じことやったら、またC++より速くなったりしてw
744 名前:735 [2007/08/02(木) 23:09:59 ] >>710 、ちょっとまってて いま書くから もとのファイル354Kしかないから100倍 (35M) に増やして比較しようぜ! そしたら速度差は歴然になるからさ
745 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:11:22 ] 思わずどっちの方向に歴然とした差が生まれるのかwって言いたくなる。
746 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:12:45 ] ソース見てなかった 》携帯からのtypoかと思ってた
747 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:12:52 ] じゃあ俺はHSPで書く!!
748 名前:735 [2007/08/02(木) 23:16:30 ] ちなみに漢字コードは元々のシフトJISに限定するけどいい??
749 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:18:52 ] ついでだからwchar_tに変換するものも書いてよ。 変換方法は何でもいいからさ。
750 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:20:50 ] >>731 まず入力にはboost::spirit::file_iteratorを使う デコード用のiteratorは自分で書くかboostの中から探す つぎにxpressiveのregex_token_iteratorでトークンに分ける(cvsのでないと遅くなるので注意) そのトークンに付け加えつつストリームに出力する こうしてstd::stringどころかヒープさえほとんど使わないで出力する これで世界最速のプログラムの完成である (完)
751 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:23:05 ] そもそも、Perl だろうが何だろうが、 ターゲットの文字コードは分かんないとあかんだろ?
752 名前:デフォルトの名無しさん [2007/08/02(木) 23:25:29 ] 文字コードを統一する部分を持っていればよい
753 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 23:32:51 ] 標準ではないけど、mbs系の関数使えば?
754 名前:デフォルトの名無しさん [2007/08/03(金) 00:02:30 ] やっぱ面倒になった 方針だけ書いておく e[2]="《"; f[2]="》"; strに一行読み込み str[n] str[n+1]がeと一致するものを探して k=n-2、n-4・・・を調べて (c[k]>134 && c[k]<160) || (c[k]>223 && c[k]<254)でないもの(漢字でない)を見つける そのあとに<ruby>を挿入して、漢字もつなげる 以下同様にやる
755 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:21:35 ] とりあえず、boostをベースに、iostreamをstdioにしてみた。 コンパイラはVC2005。対象は、SANSHIRO.txtを20回繰り返した7MBのテキスト 測定は面倒だったから、cygwinのbashのtimeで。 boost$ time ./boost ../input/20.txt real 0m9.324s user 0m0.031s sys 0m0.015s stdio$ time ./boost ../input/20.txt real 0m7.356s user 0m0.031s sys 0m0.015s
756 名前:710 mailto:sage [2007/08/03(金) 00:24:26 ] >>755 stdio版も意外に遅いですね。 time cygstart aozora.js ../input/20.txt の結果はどうでしょうか? (jsがwshext.dllに関連付けられているかどうか分かりませんが)
757 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 00:30:29 ] 710死ね
758 名前:673 mailto:sage [2007/08/03(金) 00:56:35 ] どうやらBOOST_TYPEOFというのがあるらしいですね VCのバグを使ってほぼ完全にGCCのtypeofをエミュレートできるようです (しかし本当にtypeofという名前だったとは…^^;) 早速使って見ましたが意図したとおりに動いていい感じ range_XXXとかのメタ関数やsmart_ptr,optionalのようなテンプレートと相性がよいようで、 変数から型の参照が文法の上で自在に行えるのは気持ち良いです >>690 検索かけてみましたが0xではその名前になるようですね Visual C++0x(仮)を楽しみに待ちます
759 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:00:35 ] bash-3.1$ perl -v This is perl, v5.8.8 built for MSWin32-x86-multi-thread Binary build 820 [274739] provided by ActiveState www.ActiveState.com (ry bash-3.1$ time perl aozora.pl ../input/20.txt real 0m7.738s user 0m0.015s sys 0m0.031s bash-3.1$ time cscript aozora.js ../input/20.txt Microsoft (R) Windows Script Host Version 5.6 Copyright (C) Microsoft Corporation 1996-2001. All rights reserved. real 0m7.637s user 0m0.015s sys 0m0.031s
760 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:00:43 ] decltype という名前にしたのは、 動的な型は得られないということを分かりやすくしたのかね。
761 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:14:35 ] ちなみに、当方ではどうやってもcscriptかwscriptが起動し、 (aozora.jsへの20.txtのD&Dでも)wshext.dllはどうやれば 使えるのかは判らずじまい
762 名前:710 mailto:sage [2007/08/03(金) 01:16:13 ] >>759 わざわざ有難うございます。 JScriptは、cscript.exeやwscript.exeに実行させると私のところでも遅いです。 もしWindowsのレジストリ上でjsがwshext.dllに関連付けられている場合は、 >>756 で書いたようにcygstartでaozora.jsを実行してみてください。 私のところでは、詐欺のような速さになっていました。 ともあれ、stdio版なら、PerlやJScriptよりはどうにか速くなる といったところでしょうか。
763 名前:710 mailto:sage [2007/08/03(金) 01:19:46 ] >>761 レスを読んでいませんでした。 自分も特別に何かしたわけではないので、分からない……
764 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:23:06 ] wshext.dllって、実行がexplorerのスレッド内だったりして、 計測できるのはIPC(ファイルをexplorerに渡す)部分だけ、 みたいなオチはないよね?
765 名前:710 mailto:sage [2007/08/03(金) 01:27:50 ] >>764 ……んー。よく考えると、それ以前の問題として、cygstartで起動すると、 すぐに呼び出し側に制御が戻ってきてしまうので、timeで計測ができるはずは ないですね。 失礼しましたm(_ _)m
766 名前:710 mailto:sage [2007/08/03(金) 01:49:44 ] wshext.dllがバカみたいに速いらしいぞ、と勘違いする人がいるかもしれないので 念のため書いておきますが、全くのデタラメでした。 自分も>>755 さんと同じように、cygwinのbashのtimeでいい加減に計測していたのです。 jsだけは関連付けで起動させるために、cygstartで実行させていました。 cygstartで走らせたものの実行時間を計れるわけがないのに。大ボケです。 とりあえず、iostreamさえ捨てればC++でスクリプトに勝てると分かりました。 が、コードを書くのが格段に面倒くさいのに、大して差があるわけでもないのが 悩ましいですね。 自分でもっとずっと複雑な計算をするプログラムなら、当然比較にならない ほどC/C++が優位でしょうけれども。
767 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:56:15 ] cygwin の GCC って遅かった気がする。 MinGW の方がいい。
768 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:56:45 ] 勘違いするのはお前くらい
769 名前:710 mailto:sage [2007/08/03(金) 02:09:08 ] >>767 C++のプログラムは全てVC++7.1でコンパイルしました。 cygwinのnewlibは、ロケール周りの実装があまりにショボいので、実質的に ワイド文字の処理には使えないと思います。 (VC++にしても、いくつも地雷を踏みましたが。boostも、boost::regexは バグがあってダメでした) >>768 そうですね><
770 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:12:39 ] ><
771 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:13:30 ] xlocaleをちょっと弄ったらboost::regexも落ちないようになるらしいけど詳細は忘れた
772 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:18:51 ] そうですね><
773 名前:710 mailto:sage [2007/08/03(金) 02:22:31 ] >>771 xlocaleてことは、boost::regexのバグではなくVC++のバグってことですかね。
774 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:31:15 ] 勘違いするのはお前くらい
775 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:31:50 ] ライブラリのバグかコンパイラのバグか知らんけど 動くコンパイラはあるわけだからね
776 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:38:02 ] このスレの>>622 に解決法あるじゃん
777 名前:710 mailto:sage [2007/08/03(金) 02:41:17 ] >>776 あれ、それと同じ問題なのかな? 実はそれを教えていただいた>>616 は自分なんですよ。 ただ、>>616 の場合はxpressiveの正規表現のコンパイル時にスタックが 壊れてSEGVになっていたのですが、 boost::regexの場合は、バックリファレンス含みの正規表現で検索すると、 SEGVではなく、boost::regexが例外をスローしていました。
778 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:49:13 ] じゃあこれかな ttp://capslockabcjp.kitunebi.com/faq.html#boost-bug
779 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 02:51:50 ] バグってるのはお前くらい
780 名前:710 mailto:sage [2007/08/03(金) 02:54:02 ] >>778 実はそれをboostスレに報告したのも自分なのです。 その正規表現の例を見ればモロバレでしょうが。 随分前にそれで「使い物にならん」と判断して放置していたのですが、 ここ数日、ふと思い立ってxpressiveで組みなおしてみたのです。
781 名前:デフォルトの名無しさん [2007/08/03(金) 02:58:01 ] 使い物にならんのはお前くらい
782 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:11:23 ] この流れは酷いな。
783 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 04:53:07 ] filter.hppってなんじゃらほい
784 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 08:14:09 ] STLportとかApache C++ Standard Libraryとかはどう?
785 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:39:09 ] script言語はC/C++で書いてある 比較すること自体バカらしい・・・
786 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:52:46 ] cpythonよりIronPythonのが速いっつー話もあるけどな
787 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 21:58:54 ] class Base{ protected: int a = 0; public: int Test(){ return ++a; } } class Dev : public Base{ public : int Test(){ a += 2; return a; } } int main () { Base * b = new Dev(); printf ( "%d", b->Test() ); } こうやると 1 と表示されます これを2と表示させる(Devクラスの方のTest関数を呼び出す)ことってできないですかね?
788 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 22:00:09 ] virtual
789 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 22:13:27 ] お、できました ありがとうございます
790 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:25:50 ] もう一つ質問です Base * b = new Dev[10]; for( int i = 0; i < 10; ++i ){ b[i]->Test(); } こういうようなことをやっているとループが何回か回った後で メモリ外アクセス落ちちゃうんですが何が原因かかわかりませんか?
791 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:33:59 ] >>790 つーかそれコンパイル通らないだろ
792 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:35:03 ] Base * b = new Dev[10]; for( int i = 0; i < 10; ++i ){ b[i].Test(); } こうですた
793 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:40:53 ] 配列をポリモルフィックに扱ってはいけない それをやりたいならポインタの配列とかでやるべき
794 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:49:00 ] boost::scoped_array<Base> b( new Dev[10] ); for( int i = 0; i < 10; ++i ){ b[i].Test(); } ならおk?
795 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:49:38 ] >>793 そうなんですか? ポインタの配列というと、下のような感じでいいんでしょうか? Base **b = new Dev*[10]; for( int i = 0; i < 10; ++i ){ b[i] = new Dev(); b[i].Test(); }
796 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:53:33 ] >Base **b = new Dev*[10]; これコンパイル通らないだろ。
797 名前:793 mailto:sage [2007/08/03(金) 23:55:00 ] >>795 ソースはMore Effective C++の第三項。ぜひ一読を
798 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:56:31 ] >>794 同じこと。
799 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:57:42 ] >>795 ねたじゃn
800 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 23:59:41 ] >>796 Base **b = new Base*[10]; はいけましたが Base **b = new Dev*[10]; はダメみたいです
801 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:12:01 ] ポインタの配列調べてきました、こんなんでいいんですか? malloc久しぶりに使いますた Base **b = (Base**)malloc(10 * sizeof(Dev*)); for( int i = 0; i < 10; ++i ){ b[i] = (Dev*)malloc(10 * sizeof(Dev)); b[i].Test(); }
802 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:13:52 ] >>801 Base やら Dev やらは構造体なの?
803 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:14:46 ] >>802 >>787 のやつです
804 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:16:00 ] mallocじゃコンストラクタが走らないだろう・・ Devを指すBase*の配列を作ればいいと思うよ、多分
805 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:27:19 ] こうか? typedef Base* PBase; std::size_t n = 10; PBase** b = new PBase[n]; for (std::size_t i = 0; i < n; ++i) { b[i] = new Dev; b[i]->Test(); } いい加減boost::ptr_vector使えとか言いたい。
806 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:28:11 ] ptr_vectorはalgorithmが使えないから・・・
807 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:33:47 ] >>806 boost::indirect_iteratorでなんとかなる話?
808 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:39:59 ] 違う、アルゴリズム体操の話。
809 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:42:20 ] >>807 くやしく
810 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:42:59 ] なんだあほか
811 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:49:08 ] >>809 www.boost.org/libs/iterator/doc/indirect_iterator.html#example value_typeがT*(一般に*演算子が使える型)なイテレータをラップして value_typeがTであるイテレータにするアダプタ。
812 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:55:04 ] >>805 さんの方法で上手くいきました、ありがとうございます
813 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 02:58:29 ] こういうこんがらかるようなソースは嫌い
814 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 03:03:32 ] こんがりコーン
815 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 03:04:27 ] 普通に一個一個newすればいいのに
816 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 03:12:07 ] newが現れた。newが現れた。・・・おや?new達の揚子江が・・・・・!?
817 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 03:22:39 ] 兆候って言えよ
818 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 12:30:45 ] template <typename T> void f( typename boost::call_traits<T>::param_type x); みたいな定義で type x; f(x); のようにして使いたいんですが(要はf<type>(x)とかするのがめどい) 何か良いアイデアありませんか?
819 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 12:53:48 ] template <typename T> void f(T x)ならそのままf(x)できるけどboost::call_traitsってなんだっけ?
820 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 12:54:11 ] f(x)で呼べるだろ。
821 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 12:55:27 ] >>819 boost::call_traits<T>::param_typeは、 引数がクラス型ならconst T&、組込型ならTというように、引数に最適の型になる。
822 名前:819 mailto:sage [2007/08/04(土) 12:56:31 ] >>821 だったら>820。
823 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:14:08 ] 普通に考えればそうなるはずなんですが、結果は #include <boost/call_traits.hpp> template <typename T> void f(typename boost::call_traits<T>::param_type) {} int main() { int x; f(x); } error C2783: 'void f(boost::call_traits<T>::param_type)' : テンプレート 引数を 'T' に対して減少できませんでした 'f' の宣言を確認してください。 oops。。。
824 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:24:07 ] コンパイラは何? vc6だとboostの一部は使えないよ。
825 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:40:31 ] 工工工工工工エエエエエエ(´д`)エエエエエエ工工工工工工
826 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:42:43 ] VC8です あとGCC3.4でも試してみたが駄目ですた 型推論が上手く行かない為だと思うんですが、これはバグなのか 言語仕様上の限界なのかよくわかりません
827 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:14:16 ] 2.5 というのをファイルから読み込んだんですが、これを小数(Float)に変換するには どうすればいいんでしょうか?
828 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:17:26 ] ↑質問をちょっと訂正です 変換する上で便利な関数はありますか? atoiか何かで1文字づつ変換して入れてくしかないんでしょうか?
829 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:28:47 ] atof(), strtod()
830 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:29:03 ] ありゃまatofなんて関数があったんですね 解決しました
831 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:42:03 ] あとふ
832 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:46:03 ] acof
833 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 18:51:54 ] >>826 ググったら上のほうにこんなのがあった。 lists.boost.org/Archives/boost/2005/09/94177.php どうやらC++の仕様らしい。
834 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 19:17:57 ] 関数ブロック内で定義した関数って、 外部リンケージと内部リンケージどっちなんですか? 関数はstatic以外、外部リンケージつう説明を読むと外部リンケージですけど、 別のファイルから使うことなんて出来ないですよね? てか、リンケージの説明が微妙によくわかりません。 なんか良い説明してるページってありますか。
835 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 19:46:56 ] warning: ISO C forbids nested functions
836 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 19:58:55 ] >>835 ああ・・・ああ・・・・なんてこったい。 で、入れ子関数はGCCだと内部リンケージになるらしいですね。
837 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 21:23:18 ] void hoge() { struct nested_fn { void foo() { /* valid nested function */ } }; }
838 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 22:18:04 ] ちょっと組込み系で 簡単なGUI作っているのですが GUI部分とメインロジックを接続するイベントモデルを 設計しているのですが、最近のトレンドだとどんな 感じで実装してるのですか? 関数ポインタ方式 シグナル-スロット方式 ターゲット/メッセージ方式 とかなのかな? あと実際に実装してみようと思うと何かうまい資料とか あると助かるのですが、みなさんは実装しようとしたとき 何を参考に実装しているの?
839 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 04:49:13 ] XMLResourceかね、XULみたいな でも組み込みじゃ無理か
840 名前:デフォルトの名無しさん [2007/08/05(日) 05:08:02 ] C++でSingletonなClassを実装したいのですが、staticを使う方法しか思いつきません。 出来ればstaticを使用せずに実現したいのですが可能でしょうか。 具体的なコードや、参考HPのURLを示していただけると助かります。 よろしくお願いします。
841 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 05:22:37 ] static 使わずに Singleton なんて無謀
842 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 05:25:15 ] extern
843 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 05:27:56 ] なんでstaticを使いたくないんだろうか?
844 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 05:30:46 ] インスタンス取得関数を friend 関数で作り、 そのインスタンスへのポインタをグローバルに置く、 くらいが限界か。 全く意味がないけど。
845 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 06:05:06 ] ファクトリ用のクラスを作ってそこでインスタンスを管理するとか。 もっともファクトリにstaticが必要になるような気もするけどw
846 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 08:34:24 ] C++以外の言語でもstatic相当のものを使わないと無理だよな。
847 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 09:25:28 ] うまく説明できないんですが、BCBで何も考えずに__closure使ってます。 これを使わない場合、どう書けばいいですか?エスパーさんよろしこ
848 名前:エスパー mailto:sage [2007/08/05(日) 09:27:07 ] 死ね
849 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 09:36:20 ] 説明できないならソースで説明してくれ
850 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 09:38:27 ] しょうゅdeも11お
851 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 09:58:55 ] delete x,y,z; はOKなのに、配列に対する delete [] x,y,z; で、うまくいかない理由を教えてください。 一文で各方法はないでしょうか?
852 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:04:14 ] >>851 delete x,y,z;も全然良くない。 deleteとdelete[]演算子は1つしか演算対象を取らない。 また、カンマ演算子は最低の優先順位なので、こうは書ける。 delete x, delete y, delete z; delete[] x, delete[] y, delete[] z; 1行に複数文を並べるのと大して変わりはないが。
853 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:07:54 ] マクロ
854 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:08:33 ] 配列と通常のやつのdeleteが異なるってことが気にくわねぇなら プリプロセッサとmplを組み合わせて、delete_(x, y, z,...);みたいな物作ろうぜ 既に誰かが作ってるかもしれないが
855 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:11:44 ] そもそも配列new[]は使わないし、 deleteも生で使うのはダサい。
856 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:11:57 ] 初心者なんですが、fopenってファイルを開くだけでメモリに乗せるわけではないですよね? ちょっと疑問に思っていまして・・・
857 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:14:13 ] >>855 じゃあどうするの?
858 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:14:28 ] 裏でバッファリングを始めている可能性はあるが、 気にするようなことではない。
859 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:15:49 ] 生ポだろがスマポだろうがお構い無しに意味上での構築破壊が出来る構文が必要ということか
860 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:16:11 ] >>857 new[]→std::vectorあるいはもっと低水準のメモリ確保ルーチンへの二極化。 delete→boost::scoped_ptr, boost::shared_ptr
861 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:17:06 ] >>860 そもそも世の中boost使えない場合が多いの そんな限定していいの?
862 名前:858 mailto:sage [2007/08/05(日) 10:19:13 ] >>858 うーん、TB級のファイルをfopenで開くことって出来ますかね・・・
863 名前:856(訂正) mailto:sage [2007/08/05(日) 10:20:32 ] >>858 間違えましたorz
864 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:23:08 ] ほほえましいな
865 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:28:06 ] >>840 ソフトウェアの立ち上げを早くするために 遅延ロードみたいなことをしたいってこと?
866 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 10:30:08 ] はい
867 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 11:22:59 ] >>861 生を安全なものにするには、ラップするか、使い方に厳密な決まりを作る、しか無いよ。 本質的には。 既存の膜がないなら、できる範囲で自作するのが一番いいと思うけど。
868 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 11:57:29 ] boost::shared_ptr 自分で実装するのめんどい誰か実装して。
869 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 11:59:06 ] すでに実装済み
870 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 11:59:44 ] めんどいから誰かが実装してくれたのが boost じゃないの
871 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 12:35:04 ] あんなでかいライブラリ使いたくねー 他いらねーしshared_ptrだけ実装してくれよ
872 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 12:58:41 ] 既に実装済み
873 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 13:01:09 ] じゃあフリーで使える単体のshared_ptrだけ作ってくれよ
874 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 13:06:18 ] >>873 boostからshared_ptrだけコピペして使えよ
875 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 13:06:46 ] 既存
876 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 14:17:52 ] テンプレートライブラリがどういうものか分かってないんじゃね
877 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 14:50:05 ] boostのshared_ptrもいろいろincludeしてたりして、 依存性を調べるのが面倒くさいからなー。 shared_ptr.hppひとつコピペしたら済む話じゃないでそ?
878 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 14:51:25 ] >>868 std::tr1::shared_ptr libstdc++くらいしかまだ実装していないと思うけど。
879 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 14:53:04 ] >>860 こういう流れになるから std::auto_ptr も挙げるようにしようぜ。
880 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 15:03:11 ] >>879 auto_ptrを挙げるならばその罠や制限についても説明しなければならないだろ 単純なshared_ptrまがいなら色々見たことがあるし そもそも基本的な原理は単純そのものだが とうぜんそれらはshared_ptrほど注意深く実装はされていない >>877 プリプロセッサに食わせて出力をgrepするだけの話だが そもそも取り込むファイルが環境依存だからな
881 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 15:10:22 ] >>880 > auto_ptrを挙げるならばその罠や制限についても説明しなければならないだろ shared_ptr を並べて挙げとけば十分だよ。 罠や制限があっても share_ptr よりコストは低いし標準だし、 単純な例外安全目的にはぴったりだ。
882 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 15:32:32 ] コンテナに突っ込めない出来損ないのスマポが標準だ?笑わせてくれる
883 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 15:39:05 ] 誰が笑おうがコンテナに突っ込めなかろうが、標準は標準。 単純な delete 強制のためだけに boost が要るなんて言われても 面倒なんだよ。
884 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 15:40:43 ] 笑うのはいいこと、もっと笑おう
885 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 15:48:59 ] >>882 コンテナに突っ込めるスマポが標準にないところも笑いどころ。
886 名前:デフォルトの名無しさん [2007/08/05(日) 17:08:20 ] 今、ある数学のプログラムをネット上で見つけたので、 それをコンパイルすることを試みているのですが、 エラーがいっぱい出て、うまいごとにコンパイルできません。 Borland社のbcc32というのを使ってます。 そのソースはこちらのウェブサイトに全部載ってます。 www.math.temple.edu/~wds/homepage/steiner-code.c それから、コマンドプロンプトでコンパイルを試みた結果、 以下のようなエラーが出てきました。 そのエラーにあったようにデバッグを試みたが、 どこをどうデバッグすればいいかもわからなかったので、 どなたか分かる方がいれば本当に助かります。
887 名前:886 [2007/08/05(日) 17:09:16 ] C:\Documents and Settings\Math\デスクトップ\steiner code>bcc32 stei ner-code.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland steiner-code.c: エラー E2219 steiner-code.c 39: マクロ 'RANDM' の呼び出しにおける引数の個数が誤 っている(関数 buildtree ) エラー E2188 steiner-code.c 39: 式の構文エラー(関数 buildtree ) エラー E2219 steiner-code.c 52: マクロ 'RANDM' の呼び出しにおける引数の個数が誤 っている(関数 buildtree ) エラー E2188 steiner-code.c 52: 式の構文エラー(関数 buildtree ) 警告 W8065 steiner-code.c 183: プロトタイプ宣言のない関数 'srand48' の呼び出し( 関数 main ) 警告 W8065 steiner-code.c 188: プロトタイプ宣言のない関数 'exit' の呼び出し(関数 main ) 警告 W8065 steiner-code.c 192: プロトタイプ宣言のない関数 'exit' の呼び出し(関数 main ) 警告 W8065 steiner-code.c 207: プロトタイプ宣言のない関数 'buildtree' の呼び出し (関数 main ) 警告 W8065 steiner-code.c 208: プロトタイプ宣言のない関数 'length' の呼び出し(関 数 main ) 警告 W8065 steiner-code.c 208: プロトタイプ宣言のない関数 'error' の呼び出し(関 数 main ) 警告 W8065 steiner-code.c 209: プロトタイプ宣言のない関数 'optimize' の呼び出し( 関数 main ) 警告 W8065 steiner-code.c 211: プロトタイプ宣言のない関数 'output_tree' の呼び出 し(関数 main )
888 名前:886 [2007/08/05(日) 17:10:32 ] 警告 W8065 steiner-code.c 212: プロトタイプ宣言のない関数 'exit' の呼び出し(関数 main ) エラー E2451 steiner-code.c 218: 未定義のシンボル HUGE(関数 main ) 警告 W8065 steiner-code.c 225: プロトタイプ宣言のない関数 'buildtree' の呼び出し (関数 main ) 警告 W8065 steiner-code.c 227: プロトタイプ宣言のない関数 'length' の呼び出し(関 数 main ) 警告 W8065 steiner-code.c 228: プロトタイプ宣言のない関数 'error' の呼び出し(関 数 main ) 警告 W8065 steiner-code.c 230: プロトタイプ宣言のない関数 'optimize' の呼び出し( 関数 main ) 警告 W8065 steiner-code.c 232: プロトタイプ宣言のない関数 'optimize' の呼び出し( 関数 main ) 警告 W8065 steiner-code.c 232: プロトタイプ宣言のない関数 'length' の呼び出し(関 数 main ) 警告 W8065 steiner-code.c 232: プロトタイプ宣言のない関数 'error' の呼び出し(関 数 main ) 警告 W8065 steiner-code.c 237: プロトタイプ宣言のない関数 'output_tree' の呼び出 し(関数 main ) *** 5 errors in Compile ***
889 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 17:22:28 ] >>886 上から順番につぶしていけば? 標準から大きくずれている&独自の書き方が多いでとても読解する気になれんw 取り合えずRANDMマクロは単に乱数欲しいだけみたいだからrand()にでも置き換えてみるとか?
890 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 17:24:05 ] 昔のソースなんだろ。 1989年と書いてあるな・・・
891 名前:886 [2007/08/05(日) 17:32:28 ] >>889 ありがとうございます。 RANDM()と書いているところをrand()に置き換えたらいいんでしょうか? >>890 だとしたら、最近のコンパイラではコンパイルできないということでしょうか? すみませんが、ご教授お願い致します。
892 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:00:10 ] 何の宿題かぐらいはちゃんと書けよ。
893 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:03:24 ] #include <stdlib.h> を加えて、以下の修正を typedef double REAL; #define RANDM() (rand() / (double)RAND_MAX) /* uniform random deviates in (0,1) */ #define INITRAND() (srand(57731)) void buildtree(int k, int topvec[]) REAL length(void) void optimize(REAL tol) /* a small positive number */ REAL error(void) void output_tree(void) int main(){ /* Inputs NUMSITES, DIMENSION, sites; outputs successive best Steiner : : : return 0; } /* End of Steiner tree program. */
894 名前:886 [2007/08/05(日) 18:03:56 ] >>892 なんの宿題か、というわけでもないのですが、 自分は数学関連の研究をしているもので、プログラミングに関しては ほとんど知らないわけですが、たまたま自分の研究に関連する プログラムをネットで見つけたので、それを使えるようにしたいと 思い、なんとかコンパイラをインストールするところまでには 至ったんですが。
895 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:04:32 ] -AKオプションつけるとどうなる?
896 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:05:56 ] ごめん。[0, 1] じゃなくて [0, 1) みたいだからこうだな。 #define RANDM() (rand() / (RAND_MAX + 1.0)) /* uniform random deviates in (0,1) */
897 名前:886 [2007/08/05(日) 18:13:26 ] >>893 >>896 さん 親切にありがとうございます。早速実行してみましたが、こうなりました。 C:\Documents and Settings\Math\デスクトップ\Lenny's File\steiner code>bcc32 stei ner-code.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland steiner-code.c: エラー E2379 steiner-code.c 39: ステートメントにセミコロン(;)がない(関数 buil dtree ) エラー E2379 steiner-code.c 52: ステートメントにセミコロン(;)がない(関数 buil dtree ) エラー E2379 steiner-code.c 182: ステートメントにセミコロン(;)がない(関数 mai n ) エラー E2193 steiner-code.c 187: 呼び出し時のパラメータが足りない:exit(関数 mai n ) エラー E2193 steiner-code.c 191: 呼び出し時のパラメータが足りない:exit(関数 mai n ) エラー E2193 steiner-code.c 211: 呼び出し時のパラメータが足りない:exit(関数 mai n ) エラー E2451 steiner-code.c 217: 未定義のシンボル HUGE(関数 main ) 警告 W8066 steiner-code.c 260: 実行されないコード(関数 main ) *** 7 errors in Compile ***
898 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:15:49 ] #include <stdlib.h> #define HUGE HUGE_VAL #define exit() exit(EXIT_FAILURE) を追加で少しましになった まだ、drand48,srand48でエラーが出る drand48,srand48ってUNIX Cの関数で標準のC関数じゃないのか?
899 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:16:26 ] rand48 は UNIX/Linux の関数だね。
900 名前:デフォルトの名無しさん [2007/08/05(日) 18:18:51 ] BCCなんて糞コンパイラ使ってるからだよm9(^Д^)プギャー
901 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:20:01 ] しかし886よ、そのプログラムをなんとか動かせたとして、使い方は判ってるのか。
902 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:20:26 ] これでどう? ttp://sund1.sakura.ne.jp/uploader/source/up9355.c
903 名前:886 [2007/08/05(日) 18:24:27 ] >>902 わざわざアップまで親切にありがとうございます。エラーが4つになりました。 迷惑をお掛けしました。 Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland steiner.c: エラー E2219 steiner.c 40: マクロ 'RANDM' の呼び出しにおける引数の個数が誤ってい る(関数 buildtree ) エラー E2188 steiner.c 40: 式の構文エラー(関数 buildtree ) エラー E2219 steiner.c 53: マクロ 'RANDM' の呼び出しにおける引数の個数が誤ってい る(関数 buildtree ) エラー E2188 steiner.c 53: 式の構文エラー(関数 buildtree ) 警告 W8066 steiner.c 261: 実行されないコード(関数 main ) *** 4 errors in Compile ***
904 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:25:37 ] あ、間違えた。 RANDM(a) の a を削除
905 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:27:21 ] 何かこのプログラム永遠に終了しないみたいなんで、 main の最後の return 0; は不要みたいだな。
906 名前:886 [2007/08/05(日) 18:28:03 ] >>900 それじゃあ他の只でダウンロードできるやつ、もしくはフリートライアル のやつをインストールして、やってみた方がいいでしょうか? >>901 大体何をしたいかはわかってます。後は試行錯誤です。 InputとOutputのサンプルが載っている論文が手元にあります。
907 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:36:18 ] >>902 で一様buildできたが、何をするんだこれ?
908 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:42:08 ] >>906 そのまま一生試行錯誤してればいいよ
909 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:48:14 ] enum {MSG_OK,MSG_YESNO}; enum {ID_OK,ID_YES,ID_NO}; int Message(char* msg ,int type){ char ch; switch(type){ case MSG_OK: printf("%s¥tPush Enter>",msg); scanf("%c",&ch); return ID_OK; case MSG_YESNO: printf("%s y/n>",msg); scanf("%c",&ch); return (ch == 'y' ? ID_YES:ID_NO); } return 0; } int main(){ Message("question",MSG_OK); if(Message("How do you do?",MSG_YESNO) == ID_YES) printf("good¥n"); return 0; } というプログラムで、わざとPush Enterと出た時に、Enterを押さないで適当なキーを押すと huga$ ./a.out question Push Enter>y How do you do? y/nhuga$ と表示されます。 フォールスルーでもないし、ちゃんと2度目のMessage関数の呼び出しも出来ている みたいなのですが、なぜこういう風に動くのでしょうか?
910 名前:886 [2007/08/05(日) 18:48:41 ] >>907 説明するのが難しいのでとりあえず論文中にあったInputのサンプルです。 1 2 3 1 0 1.6180339887 0 1.6180339887 1 1.6180339887 1 0 -1 0 1.6180339887 0 1.6180339887 -1 1.6180339887 -1 0 1 0 1.6180339887 0 1.6180339887 1 -1.6180339887 1 0 -1 0 -1.6180339887 0 -1.6180339887 -1 -1.6180339887 -1 0 上のようなInputを与えると、(実際どのような手順で与えるかは 試行錯誤しないとわからないのですが) new record length 18.5529 topology-describing vector 2 3 7 6 7 6 14 ......................... というOutputが出てくるはずです。 Inputは正20面体のすべての頂点の座標で、Outputはこれらすべての頂点を結ぶ木 (サイクルを作らないようなグラフ)の枝の総長を表わしています。
911 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:52:10 ] 最初の scanf("%c",&ch); でその適当に入力した文字が ch に入る。 そして2度目の scanf("%c",&ch); で改行が ch に入る。
912 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:55:22 ] >>907 一様(いちよう)じゃなくて一応(いちおう)ね 一様は「違い・むらが無い」って意味
913 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:56:46 ] なんかお子様多いな
914 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:58:18 ] お前が一番お子様なのにね
915 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 18:59:23 ] >>911 >最初の scanf("%c",&ch); でその適当に入力した文字が ch に入る。 >そして2度目の scanf("%c",&ch); で改行が ch に入る。 成る程です。 ちなみに、2度目の関数呼び出しの際、1度めに使われた変数の中身はクリアされないんでしょうか?
916 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:01:02 ] >>910 正20面体って正三角形が20個でしょ?
917 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:01:15 ] そもそも関数を抜けた時点で ch の中身は保証されなくなる。
918 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:20:14 ] >>911 >最初の scanf("%c",&ch); でその適当に入力した文字が ch に入る。 >そして2度目の scanf("%c",&ch); で改行が ch に入る。 すいません、何故勝手に改行が入力されるのでしょうか? その辺のFAQってどこかにありませんでしょうか? 勉強したいので。
919 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:22:51 ] 「y」と「改行」を入力したでしょう。別に勝手に入るわけじゃない。
920 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:27:57 ] >>918 scanfの仕様に則っただけだからキニスルナ
921 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:28:59 ] >>918 FAQだけで簡単に済まそうとしているのが間違い。 もっと基礎的なことからちゃんと勉強したら? 基本を知らずにFAQだけ読んでも、得られるものは少ないと思う。 > エラー E2379 steiner-code.c 39: ステートメントにセミコロン(;)がない(関数 buil dtree ) こんなエラーすらを自分で解決できないのでは、先に進みようが無い。
922 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:39:28 ] >>921 ごめんなさい、ごめんなさい あのー、基礎的なことってどんなことですか? 何が基礎的なことなのか分からないのです(>_<)
923 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:40:27 ] 基礎的なこと=何が基礎的なことなのか分からないこと
924 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:44:24 ] C言語を真面目に勉強しろってさ
925 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:46:27 ] HelloWorldは書いたかい?
926 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:47:19 ] a,b,cはint型です。 a=0;b=0;c=0;とするところを、a=b=c=0;としても同じでしょうか?
927 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:49:34 ] >>926 同じ、それくらい入門書でも読んでくれ。
928 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:55:48 ] a=b=c=0;この場合の代入の順序はどうなんですか? a=0,b=0,c=0 順番なのですか? それとも a=0,b=a,c=a
929 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:01:36 ] =(a, =(b, =(c,0) ) );
930 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:04:08 ] 優先順位表見てる? あれに右左も書いてあるべ
931 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:06:11 ] a = (b = (c = 0)); ということ
932 名前:926 mailto:sage [2007/08/05(日) 20:12:50 ] >>928 アフォか俺でも分かるわ
933 名前:928 mailto:sage [2007/08/05(日) 20:22:08 ] >>931 しつこくすみません、低能なもんで a = (b = (c = 0));は c=0,b=0,a=0 なのですか? それとも c=0,b=c,a=b つまりb = (c = 0)の処理の場合、b=0、b=cどちらが実行されるのでしょうか? >>930 優先順位表って何ですか
934 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:29:40 ] わざわざ1つの式にまとめて書いといて、順序もクソも無いもんだ。
935 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:32:08 ] >>933 試せよそんぐらい。
936 名前:928 mailto:sage [2007/08/05(日) 20:34:37 ] >>935 どうやってどちらが実行されてるか試すのですか?
937 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:40:12 ] > つまりb = (c = 0)の処理の場合、b=0、b=cどちらが実行されるのでしょうか? なにか違いが?
938 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:45:33 ] c=0の評価値は0だ
939 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:47:20 ] >>936 int a; char b; a = b = 12345; printf("%d %d", a, b);
940 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 20:47:35 ] a = (b = (c = 0)); cに0が代入される。 bに(c = 0)の式の値が代入される。この場合0なので0が代入される。 aに(b = (c = 0))の式の値が代入される。この場合0なので0が代入される。
941 名前:840 [2007/08/05(日) 22:23:56 ] 説明不足で申し訳ありません。 C/C++でstaticを使用する場合グローバルに変数の宣言が必要かと思いますが、 クラスの部品化の観点から、出来るだけグローバル変数の使用は避けたいと考えています。 で、記憶が曖昧なんですが、以前static_castなど(テンプレートを使用していたかもしれません)を使用して GoFのSingletonパターンを実現している記事を見かけましてこちらで質問させていただきました。 何か情報御座いましたらよろしくお願い申します。
942 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 22:29:35 ] >>941 グローバル変数は駄目でシングルトンならいいってのは、どういう理屈かね?
943 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 22:31:51 ] >>941 >C/C++でstaticを使用する場合グローバルに変数の宣言が必要かと思いますが、 いや…、必要ないよ class HOGE { public: static HOGE& get_instance(){ static HOGE hoge; return hoge; } private: HOGE(); };
944 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 22:42:19 ] >>877 libjingleではboostからshared_ptrだけとりだしてコピペしてる箇所があるって聞いたぞ。 そんなに面倒とも思わんけどなぁ
945 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 22:56:04 ] >>877 依存関係の調査自体は bcp 使えば要らない。結果の膨大さにびびるだろうけど。
946 名前:909 mailto:sage [2007/08/05(日) 23:23:53 ] >>919 >「y」と「改行」を入力したでしょう。別に勝手に入るわけじゃない。 え、でもscanfで1文字標準入力を取得した後、 returnでmain関数に戻って、もう一度ifでMesssage関数を呼び出してるから たとえ、改行文字があっても無視されるんじゃないんですか? それにこのプログラムが意図したと売りに動く場合の、 一度目にenterおしてifでMessage関数呼び出して、2度目のifでMesssage関数 を呼び出してyを入力した場合、 huga$ ./a.out question Push Enter> How do you do? y/n>y good の場合はHow do you do? y/nでyとenterを押しているのに なんで正確に動くんですか? もしかして標準入力の内容ってバッファみたいなところに貯められるんですか? >>921 自分は886では無いですよ。 少なくともコンパイルエラーを直してから、質問します。
947 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 23:27:12 ] >>941 例えstaticやグローバル変数を避けてシングルトンを実装したとしても、 目的を達成する手段が変わっただけで、本質的には何も変わっていない。 そう書いてから942の焼き直しだと気付いた。
948 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 23:28:01 ] >>946 >もしかして標準入力の内容ってバッファみたいなところに貯められるんですか? そのとおり。 標準入力に限らず入出力にはバッファを利用されることが多い。
949 名前:909 mailto:sage [2007/08/05(日) 23:42:42 ] >>948 へぇ、知らなかったです。 そんなこと、本には書いてなかったので。 イメージとしては 入力した文字がメモリのどっかに hogehugamoge みたいに保存されて、 そこからscanfの引数の変数の型の分(今回はchar型) コピーされるみたいな感じなんですかね?
950 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 23:58:44 ] そう。 正常に動くケースは、1文字目が改行で2文字目がyで3文字目が改行でしょ。 3文字目は読まれずにバッファに残ったままプログラムが終了するだけ。
951 名前:909 mailto:sage [2007/08/06(月) 00:11:27 ] ありがとうです。 んで、何文字バッファに保存されるかはOSの実装によると。
952 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 00:39:39 ] 普通の使い方なら充分なくらいのバッファはあるはず・・・ 10文字程度で満杯とかそんなことはまずない。
953 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 00:45:25 ] ストリーム入出力ってのは、バッファリングされる入出力のことだ。
954 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 03:34:18 ] すみません質問させてください。 txtファイルから、例えば40.123/42.591/43.569という文字列を読み込んで、 真中の42.591だけを数値として変数に格納したいのですが、 どうにも巧い方法が思いつきませんorz 何卒お力をお貸し頂けますようお願い致します。
955 名前:909 mailto:sage [2007/08/06(月) 03:35:24 ] / ̄ ̄ ̄ ̄\ / ( ( ( ) .) )\ / ( ( / ̄ ̄ ̄”\ .) ) / ( ( |. | ) ) ( ( ( | \ハ/ | ) ) ( ( ( | ゚ ̄ 〈 ゚ ̄ | ) ) ( ( ( | > | ) ) (. ( ( | /へ) / ) ) \_/|\ ー //\/ / ̄ ̄\ ゛ーー/ ̄ ̄\ ./ \ ̄ ̄ ”/ \ | ●|・| ||/ | | | ●|・| ||/ | | \_ ●|・| ||/ | .\ 》||つ【♪1076】___/
956 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 03:40:07 ] >>954 C なのか C++ なのか、まずはそれからだ。
957 名前:954 [2007/08/06(月) 03:41:45 ] ごめんなさい、Cでお願いします。 後、sage禁止だったのですね。重ね重ねすみませんorz
958 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 03:49:30 ] 自己判断で ~~~~~~~~~~~~ 寧ろage禁止
959 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 03:50:58 ] sage禁止とはなんという斬新なルールなのか
960 名前:954 mailto:sage [2007/08/06(月) 04:01:48 ] すみません、以後下げるようにしますorz
961 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 04:22:28 ] どっちでもいいよ。自分で判断しる。
962 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 04:28:03 ] >>957 いろいろ方法はある。 scanf 系関数を使うなら、 %*f のように書式に * を挟むことで 変数に格納しなくなるようにできるのを利用するとか。 あとは1行取得して、 それを strtok で "/" をデリミタにして処理した2番目の文字列を atof するとか。 strtok を使うのが気持ち悪いなら strchr を使ってもいいかもしんない。
963 名前:957 mailto:sage [2007/08/06(月) 04:48:30 ] 了解です、状況で判断しますorz >>962 ご解答頂きありがとうございます。 教えていただいた通り、今回はstrtokを使ってみたいと思います。 %*fという表記は知らなかったので勉強になりました。 本当にどうもありがとうございましたm(_ _)m また皆様のお力をお借りすることがあるかと思いますが、その時はどうぞよろしくお願い致します。
964 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 04:52:45 ] strtok()は癖が強すぎるのでお勧めしない。 scanf()でフォーマットを'%*f/%f/%*f"にしてはいけないのか?
965 名前:957 mailto:sage [2007/08/06(月) 05:55:20 ] >>964 strtok()は癖が強いのですか。 strtok()を使ったことが無かったので使ってみようかと思ったのですが、 そういうことであれば素直に%*fを使ってみたいと思います。 アドバイスありがとうございましたm(_ _)m
966 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 05:56:20 ] test
967 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 08:26:44 ] for(int i=0;i<n1;i++) { ←ここに飛びたい場合どうするのが一般的でしょうか? // 処理 ↑ for(int j=0;j<n2;j++) { ↑ if (a[j] == b) // 条件が成立したらループを抜けて↑ } //処理 }
968 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 08:35:09 ] >>967 つ[goto] まぁ、アルゴリズムを見直してbreakだな。
969 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 10:36:46 ] 中のループをboolを返す関数にしてしまって trueだったらcontinueとかね
970 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 12:31:43 ] void f() { static char *theTxt; strcpy(theTxt,"TEST¥n"); printf("%s",theTxt); } これってtheTxt;がstaticでnull初期化されているから 駄目なんですか?
971 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 12:38:10 ] >>970 theTxtはポインタ。 strcpyはポインタの指すアドレスにデータをコピーする関数。 問題は、theTxtがどこも指していないこと。 mallocで確保するとか、配列にするとか、データの領域をまず用意
972 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 12:39:01 ] どこも指してない、つーかNULLで初期化されてっからアドレス0を指してる、とも言えるか。 まあ同じだけど。
973 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 12:41:58 ] 理解出来ました。 有り難うございます
974 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 13:35:12 ] >>972 >アドレス0を指してる、とも言えるか。 いえない。 因みに、初期化されていないポインタは 「何処を指しているかわからない」
975 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 13:35:58 ] >>974 staticがついてると0に初期化される
976 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 13:36:57 ] static だから = 0 で初期化されている。 ただ、アドレス 0 だとは限らない。
977 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 13:40:29 ] もうヌルポインタが0じゃない話はいいから
978 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 13:57:16 ] >>977 「ぬるぽはどこも指していない話」じゃないのか?
979 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 14:04:28 ] NULLが0なんじゃない、0がNULLなんだよ。
980 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 15:01:18 ] ぬるぽ! ぬるぽ! ぬるぽ! ぬるぽ! ぬるぽ! ぬるぽ! ∩ ∩ ノ) ぬるぽ! ぬるぽ! 川 ∩ 川彡'三つ ぬるぽ! ぬるぽ! ⊂ミ∩、⊂ミ∩彡⊃ ぬるぽ! ぬるぽ! ⊂三ミ( ゚∀゚)彡三彡三⊃ ぬるぽ! ぬるぽ! ⊂彡川⊂彡川ミ⊃ ぬるぽ! ぬるぽ! ⊂彡川∪⊃ U川彡⊃ ぬるぽ! ぬるぽ! (ノ ∪ 川 ∪ミ) ぬるぽ! ぬるぽ! ∪ ぬるぽ! ぬるぽ! ぬるぽ! ぬるぽ! ぬるぽ! ぬるぽ! ぬるぽ!
981 名前:デフォルトの名無しさん [2007/08/06(月) 21:47:18 ] #define NULL ぬるぽ #define 0 NULL
982 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 22:40:13 ] fopenやifstreamがどういう処理をしているか気になります。 遠回しにAPIを呼んでたりするんですか?
983 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 22:47:34 ] そりゃシステムコール呼ばないとファイル開けまへんがな(´・ω・`) そこらのOS毎の差異を吸収するのも標準ライブラリの役目
984 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 22:48:24 ] そう。 遠まわしに、WindowsならCreateFileとかのAPIを呼んでる。
985 名前:デフォルトの名無しさん [2007/08/06(月) 22:51:22 ] まー結局、細部まで一致しないからWINDOWS API使うのが賢い かなり単純なものでないとCのみでしょり出来ないからな
986 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 22:53:31 ] ×>>972 ,>>974 ○>>976 C言語の仕様によれば、staticな変数は『定数ゼロ』(K&R第2版)で初期化される。 だから static char *theTxt; は、 static char *theTxt = 0; と置き換える。 ここで、定数ゼロは整数型に代入されれば整数0であり、ポインタに代入されればヌルポインタになる。 ヌルポインタは、(アドレス0を指す処理系もあるかもしれないが、) 『どこも指していないポインタ』が正解。実際のbit列がゼロの連続とも限らない。 従って、ヌルポインタはprintf()の引数として処理できない。 ちなみに、『ぬるぽ』はNullPointerExceptionの略で、ヌルポインタではない。
987 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 22:54:54 ] BCCで書いているのですが、突然ファイルオープンができなくなりました。 #include<stdio.h> main(void){ int i,j,k,t; int No1,No2; int Rs[3500][20],Hn[3500]={0}; double u,x,y; double Odds[3500][20],Poll[3500][20],Poll_S[3500][20],Poll_T[3500][20]; FILE *fpr,*fpw; fpr=fopen("horse.txt","r"); fpw=fopen("r.txt","w"); while(fscanf(fpr,"%d %d %lf %d",&No1,&No2,&u,&k)!=EOF){ Odds[No1][No2-1]=u; Rs[No1][No2-1]=k; Poll[No1][No2-1]=0.788/(u-1.0); Hn[No1]++; Poll_T[No1][No2]=0; Poll_S[No1][No2]=0; } 何か問題はありますか?教えてください。
988 名前:gotoです mailto:sage [2007/08/06(月) 22:55:51 ] たまには私を思い出してください。 ほら、try-catch句がなかったあの頃を思い出してください・・・
989 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 22:58:45 ] >>987 釣り?
990 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 23:02:37 ] マジです
991 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 23:03:22 ] >>987 とりあえずmainの'{'に対応する'}'と、fcloseが足りない。
992 名前:987 mailto:sage [2007/08/06(月) 23:07:22 ] すみません。 ソースが長いので省略しています。 コンパイルエラーはないんですが テキストファイルが読み込めないんです。
993 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 23:09:38 ] >>993 実行方法は? まさか、カレントディレクトリにファイルがないって落ちじゃないよな?
994 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 23:10:31 ] horse.txtが無いんじゃね?
995 名前:デフォルトの名無しさん [2007/08/06(月) 23:11:32 ] errno調べてみ
996 名前:987 mailto:sage [2007/08/06(月) 23:16:06 ] horse.txtはあります。 今まで動いていたプログラムもファイルが開かなくなりました。 ライトファイルはできます。
997 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 23:18:07 ] どっか別のアプリケーションがファイルを開いてるんじゃない? アプリケーションを全部終了するか、最悪OS再起動したら直るんじゃないかね。
998 名前:987 mailto:sage [2007/08/06(月) 23:19:45 ] と思って再起動したんですが直りませんでした。
999 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 23:22:17 ] errno !!!
1000 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 23:26:49 ] 次スレ!!! pc11.2ch.net/test/read.cgi/tech/1186410368/
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。