- 1 名前:デフォルトの名無しさん [2007/09/27(木) 11:39:04 ]
- エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.42【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1188748806/l50 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
- 75 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 20:55:57 ]
- 確かstd::stringは継承される事を前提に作られてないはず
やめといた方がいいんじゃね デストラクタも仮想じゃないし
- 76 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 21:06:33 ]
- >>74-75
ありがとうございます そうですか、スッキリして良いと思ったのですが残念です
- 77 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 21:08:52 ]
- コンストラクタがないからstd::stringからstring_exに変換できない。
ただし、>>75の指摘通り使用に際しては注意が必要。
- 78 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 21:14:51 ]
- コピー代入演算子とコピーコンストラクタが無いのが原因だな
#include <string> struct A : public std::string { A(){} A(const A&){} A& operator=(const A&) { return *this; } A& operator=(const std::string&) { return *this; } }; int main() { A a; std::string b; a = b; } とりあえずこんな感じでそれらを用意してやれば通る、けどやっちゃいけないよこんな事 basic_stringのカオスさ加減をどうにかしたい気持はわからんでもないけど
- 79 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 21:32:11 ]
- どうやらstd::stringを弄るのは禁じ手のようですね
無理にメンバ関数にしないでフリーの文字操作関数にします いろいろとありがとうございました
- 80 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 21:57:56 ]
- 俺も同じことやってる。
コンストラクタ、代入演算子、あたりを全部作らないといけない上に、const / 非constの制御がかなり面倒。 でもやりたいよね…。ヘルパー作ってばっかだと、なんのためのオブジェクト指向か分からないし。
- 81 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 22:21:44 ]
- >>73
仮想デストラクタを持たないstringやコンテナなどから 派生クラスを作る誘惑に負けるな by スコット・メイヤーズ
- 82 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 08:03:16 ]
- #include <stdio.h>
main() { int i; int b; int c; int d; printf("最初の数字を入れてください(半角)=>"); scanf("%d", &i); printf("なに算をするか入れてください( / * - + )=>"); scanf("%s", &b); if(b = /){ printf("割る数を入れてください=>"); scanf("%s", &c); d = i / c; }else if(b = *){ printf("賭ける数を入れてください=>"); scanf("%s", &c); d = i * c; }else if(b = +){ printf("足す数を入れてください=>"); scanf("%s", &c); d = i + c;}else{ printf("引く数を入れてください=>"); scanf("%s", &c); d = i - c;} printf("%d\n",d);} これでものすごい勢いでコンパイラエラー吐かれます>< 初心者といううか見様見真似でつくったのでどこがだめかエラー見ただけじゃわからない のでどこがおかしか教えてくださるとうれしいです
- 83 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 08:06:56 ]
- 何算するかというところで、
+-/*という数値でないものを入力しようと言うのに intという数値を扱う型で読み込もうとしているのがいけない。 bはchar型にし、%cで読み込めばいい。 そして、if (b == '/') {のようにする。
- 84 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 08:08:30 ]
- >>83
intは数値だったんですか; いろいろがんばってみます
- 85 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 08:11:39 ]
- intはintegerの略。
- 86 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 10:06:21 ]
- >>82
・コンパイルエラーがたくさん出ても焦るな。先頭の1つから順に消していけばいい。 ・見よう見まねで作ったならエラー出て当然。まずはもう少し自分で理解する努力をしてから人に聞け。 ・人に聞くなら、どんなエラーが出たのかぐらいは書くべき。
- 87 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 10:43:22 ]
- >84まず入門書か入門サイト嫁www
- 88 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 11:42:09 ]
- _typeof, __typeof
みたいに前にアンダーバーを1つ2つ付けるのは 予約キーワードと衝突するおそれがあるので避けるべきらしいですが、 typeof_, typeof__ みたいに後ろに付けるならおkでしょうか?
- 89 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 12:23:07 ]
- アンダースコアが2個続くのは先頭でも途中でも最後でもだめ
- 90 名前:デフォルトの名無しさん [2007/09/30(日) 12:49:51 ]
- template<typenamt t, typename sig> class test;
template<typenamt t, typename result, typename arg> class test<t, result (t::*)(arg)>{ result r; };//resultがvoidだとエラーになるので template<typenamt t, typename arg> class test<t, void (t::*)(arg)>{};//特殊化したい んですが、コンパイラからは「特殊化できない」とエラーになります。 引数の数が被ってるのがダメなのかと思い、 template<typenamt t, typename sig, typename dammy1, typename dammy2> class test; template<typenamt t, typename result, typename arg> class test<t, result (t::*)(arg), void, void>{ result r; }; template<typenamt t, typename arg> class test<t, void (t::*)(arg), void, void>{}; としてもやはりダメでした。
- 91 名前:(90) mailto:sage [2007/09/30(日) 12:50:52 ]
- ちなみに上下共に同じエラーで弾かれます。
- 92 名前:(90) mailto:sage [2007/09/30(日) 13:03:41 ]
- 後者にしたうえで、
template<typenamt t, typename arg> class test<t, void (t::*)(arg), void, void>{}; を template<typenamt t, typename arg> class test<t, void, arg>{}; としtemplate<typenamt t, typename result, typename arg> class testの特殊化を狙っても 「テンプレート引数の数が少なすぎます」とダメでした。
- 93 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:04:35 ]
- ちょっと質問。
ヘッダをインクルードする時、ファイル名だけ指定してインクルードパスで検索する方法と、 インクルードパスを限定して、相対パスでファイルを指定する方法とではどちらが一般的でしょうか? ヘッダが100近いフォルダに散在していると前者と後者のどちらを適用すべきか判断がつきません。 他のプロジェクトで類似するケースではどのようにしているのか聞いてみたいんですが。 ちなみにヘッダファイルの移動はないことを前提としています。
- 94 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:04:48 ]
- int main(){
(処理) return 0; } 何で0を返すんですか? 1ではダメなのですか?
- 95 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:20:19 ]
- >>94
いいよ〜 終了コードの使い方は処理系依存だけど、一般的には 0が正常終了、エラーや警告があれば1以上の数字を返すのが慣例。
- 96 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:25:37 ]
- >>90
gcc 3.4.4 だと通った。 詳しいことは解らんけど、それだけ報告。 #include <stdio.h> template<typename t, typename sig> class test { public: static void foo(){ printf("foo\n"); } }; template<typename t, typename arg> class test<t, void (t::*)(arg)> { public: static void foo() { printf("bar\n"); } }; class X{}; int main() { test<int,int>::foo(); test<X, void(X::*)(int)>::foo(); }
- 97 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:48:55 ]
- >>93
適材適所。 そのたくさんのディレクトリが相互に無関係ならそれぞれパス指定するしかないと思う。 そうではなく、ある程度共通のディレクトリの中に分散しているのなら、共通部をパス指定して 残りはファイル名で記述すればいいだろう。 例えば、こんな感じ。 -- /home/who/someProject/include/catA/inc1.h /home/who/someProject/include/catA/inc2.h /home/who/someProject/include/catA/inc3.h /home/who/someProject/include/catB/inc4.h /home/who/someProject/include/catC/inc5.h こんなインクルードファイルがあるなら、 #include "catA/inc1.h" #include "catA/inc2.h" #include "catA/inc3.h" #include "catB/inc4.h" #include "catC/inc5.h" と記述してパス指定に$HOME/someProject/includeを追加。
- 98 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:07:02 ]
- >>90
コンパイラは何を使っている。 また、そもそも何をしたい?それ次第では別の手段があるかもしれない。
- 99 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:16:00 ]
- >>90
#include <stdio.h> #include <boost/type_traits.hpp> class test1 { public: static void foo() {printf("test1\n"); } }; template<typename t, typename result, typename arg> class test2 { public: static void foo() {printf("test2\n"); } }; template<typename t, typename arg> class test3 { public: static void foo() {printf("test3\n"); } }; namespace detail { template<typename t, typename sig> struct selector { typedef test1 type; }; template<typename t, typename result, typename arg> struct selector<t, result (t::*)(arg)> { typedef typename boost::mpl::if_<boost::is_void<result>, test3<t,arg>, test2<t,result,arg> >::type type; }; } int main(int argc, char *argv[]) { detail::selector<test1,void>::type::foo(); detail::selector<test1,int(test1::*)(int)>::type::foo(); detail::selector<test1,void(test1::*)(int)>::type::foo(); return 0; }
- 100 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:18:29 ]
- そもそも>>90のresult r;って、
コンパイラさえ問題なく、しかもrがvoid型なら、 <t, void (t::*)(arg)>なんて特殊化は 不要だと思ったのだが違うのか?
- 101 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:20:32 ]
- >>93
インクルードパスにはあまりごちゃごちゃ含ませないことが望ましい。 インクルードパスに含まれるヘッダの名前は実質システムグローバルだからな。 行儀のいいやりかたは、>>97のように、インクルードパス直下にヘッダを 置かず、モジュールだのライブラリだの用のディレクトリを掘り、その下に ヘッダを入れることだ。 そうすることで、汚染する名前をディレクトリ名だけに限定でき、 名前の衝突を回避しやすくなる。 勿論、これにはインクルードパスの下をあまりとっちらからせずに、整理整頓できる というメリットもある。
- 102 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:28:50 ]
- boostみたいに実装詳細のヘッダをhoge/datail に入れておくと
外部公開するヘッダとプライベートなヘッダを分けられてうれしい
- 103 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:32:36 ]
- svnのboost::function_typesなら関数の型から、戻り値や引数を取りだせるから
それとenable_ifで特殊化してやる方法もある #include <iostream> #include <boost/function_types/result_type.hpp> #include <boost/type_traits.hpp> #include <boost/typeof/typeof.hpp> #include <boost/utility.hpp> void func_v() {} int func() { return 0; } template < typename sig , class Enable = void > struct C { void f() { std::cout << "func\n"; } }; template <typename sig> struct C< sig , typename boost::enable_if< typename boost::is_same< typename boost::function_types::result_type<sig>::type , void>::type>::type > { void f() { std::cout << "void func\n";} }; int main() { C< BOOST_TYPEOF(func_v) >().f(); C< BOOST_TYPEOF(func) >().f(); }
- 104 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:34:33 ]
- うへ
仕事では出会いたくないタイプのコードだな…… だからC++は(ry
- 105 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:34:45 ]
- boost厨多過ぎ
- 106 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:39:40 ]
- boostは順調に使えてる時点ではいいんだけど、
バグったりするともうお手上げ
- 107 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:45:56 ]
- そのバグを自力で直して公式に反映できたり、
そこから新しい使い方を発見できる程になりたひ
- 108 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 17:23:09 ]
- >>97
>>101 レスありがとうございます。 自分も正直ごちゃごちゃしたインクルードパスを書くよりは プロジェクトのルートパスを一つ指定するような書き方が望ましいと思っているので、 その方向で調整して行きたいと思います。 ただ、好みの問題程度にあしらわれないか不安ではありますが。
- 109 名前:(90) mailto:sage [2007/09/30(日) 17:29:01 ]
- 使っているコンパイラはvisual C++ 2005です。
メンバ関数を特殊化で返り値、クラス、引数をそれぞれ特殊化した後に 内部に作っておいたクラスを使い間接的に返り値を特殊化したらコンパイルが可能になり解決しました。
- 110 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 17:40:52 ]
- オーバーロードについて質問
int Func(int a=NULL); string Func(string a=""); こんな感じで引数が無い場合に戻り値の型によって 関数がオーバーロードされるのを期待してみましたが コンパイルエラーが出てしまいました このような場合関数名を変えるしか無いのでしょうか?
- 111 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 17:45:01 ]
- >>110
戻り値の型でオーバーロードはできません。 ポインタじゃないものに NULL を使っちゃだめです。
- 112 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 17:54:37 ]
- >>111
ありがとうございます
- 113 名前:94 mailto:sage [2007/09/30(日) 18:43:55 ]
- >>95
ありがとうございました。
- 114 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 02:02:40 ]
- int x = 4896;
int y = 1406; double z = y/x; でzが0になってしまうのですが、 これを0.28.... とやるにはどうすれば良いのでしょうか?
- 115 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 02:04:23 ]
- z = (double)y / x;
- 116 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 02:47:24 ]
- わぁ、ありがとうございます。
ところで、double>intなのに なんで代入変換されないのでしょうか?
- 117 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 02:51:35 ]
- z=y/xという式は、まずy/xが実行される。
int/intなので結果はint、この時点で結果が0になる。 int型の0をdouble型に代入しても当然0になる。 (double)y/xとすることで、yがdoubleになりこの式の結果もdoubleになる。
- 118 名前:デフォルトの名無しさん [2007/10/01(月) 02:51:59 ]
- int同士の/演算はint -> int -> intだから、代入する時点ですでに(intの)0なんだよ。
それをdoubleに変換したところで、0.0になるだけさ。
- 119 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 02:55:02 ]
- なるほど、ありがとうございました!
- 120 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 03:47:41 ]
- 演算子の優先順位って奴だな
= よりも / の方が優先順位が高い
- 121 名前:デフォルトの名無しさん [2007/10/01(月) 03:54:49 ]
- =の優先度がたかかったら使いにくくてしょーがねー。
(z=y)/x は欲しい結果じゃないだろ?除算結果捨ててるしなw
- 122 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 12:09:57 ]
- メンバ変数をpublicメンバにして公開せずに入出力関数を用意すべきと言いますが
その際に入力用と出力用と2種類作った方が良いのでしょうか? class Choge { private: std::string memo_; public: std::string memo(const std::string& data = "") { return (data.empty() ? memo_ : memo_ = data); } } 上のように入出力をまとめちゃった方がスッキリしそうな気がするのですが 少しトリッキーなようで、こんな事をしても良いのか迷ってます
- 123 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 12:12:09 ]
- >>122
そのメンバを空にしたいときにはどうするんだ? そんな癖のある仕様にするくらいなら、別々に作った方がいいことは自明だ。
- 124 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 12:25:17 ]
- >>122
そもそも、メンバを参照するだけのmemo()がconstメンバ関数じゃないから使い難い。 設定用に非constメンバ関数、取得用にconstメンバ関数を用意するなら、最初から別々に作ればいい。 # 例えば、void func(Choge const & hoge)なんて関数からhoge.memo()を呼べないのは面倒だぞ。
- 125 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 12:54:48 ]
- >>123-124
なるほど。 やっぱり別々にすべきですね。 ありがとうございました。
- 126 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 07:37:48 ]
- ff5a_analyzer_src.zip (53 KiB)
ff5a_analyzer のソースコードです。まだ未完成です。文字コードは EUC-JP、改行コードは LR となっています。 とあるのですが ttp://x11.s11.xrea.com/ff5a_analyzer_src.zip このソースのコンパイルの仕方はどうやるのでしょうか OSはXPです
- 127 名前:デフォルトの名無しさん [2007/10/02(火) 07:38:20 ]
- はじめまして、すいませんが質問させてください。
Linux(Turnolinux Fuji)でsys/systeminfo.hを includeしてSI_HOSTNAMEを使用したい< sysinfo(SI_HOSTNAME〜を対処したい >のですが、 コンパイル時にsys/systeminfo.hがないとエラーが出力されてしまいます。 どうすればよいのでしょうか?ご教授ください。
- 128 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 07:44:19 ]
- 探す。includeする。
- 129 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 07:44:46 ]
- >>126
ちゃんとmakefileまでついてるじゃないか gccみたいだけど別にほかのコンパイラでも大丈夫だろ
- 130 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 07:46:26 ]
- >>126
cygwinを入れて、makeではどうでしょう。 >>127 systeminfo.hを探してみたらどうでしょう。
- 131 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 08:12:04 ]
- >>129
>>130 ありがとうございます がんばってみます
- 132 名前:デフォルトの名無しさん [2007/10/02(火) 12:48:32 ]
- 質問です。
INT_MIN〜INT_MAXの範囲を超える整数の計算をしたいんですけど どうしたらよいのでしょうか?
- 133 名前:デフォルトの名無しさん [2007/10/02(火) 13:02:56 ]
- >>132
search.vector.co.jp/search?query=%91%BD%94%7B%92%B7+%83%89%83C%83u%83%89%83%8A&x=14&y=14
- 134 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 13:03:45 ]
- >>132
intよりも大きい値を扱える型を使いなさい。
- 135 名前:デフォルトの名無しさん [2007/10/02(火) 13:34:03 ]
- ありがとうございます
>>133 多倍長っていうんですね。 ググってみます。なるべく自作したいので。 >>134 ちょっと思いつかないんですが、例えばどんな型がありますか? 符号付の値が扱えるのがいいです。 こちらの環境はVC6です。
- 136 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 13:41:24 ]
- >INT_MIN〜INT_MAXの範囲を超える整数の計算をしたいんですけど
大きく超えないのなら vc6 なら __int64 が使えないこともない。 (なんか加算でバグった経験あって個人的には嫌だけど)
- 137 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 13:43:20 ]
- >>135
C99ならlong longも使えるし、そうでなくてもint64_tなどの型があるかもしれない。 それに、doubleでもlong doubleでもいいかもしれない。 要は、INT_MAXを超えると言われても大きさも必要精度も判らなければなんともしようがない。
- 138 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 15:38:16 ]
- >>135
Windowsだと__int64 / unsigned __int64
- 139 名前:132 mailto:sage [2007/10/02(火) 16:13:46 ]
- >>136
そういえばそんなものがありましたね。試してみます。どうもです。 (バグってどんなバグだろう) >>137 VC6なのでC99なんて対応してません。 精度は64ビットも要らないけど32ビットじゃ足りません。 __int64で試してみます。
- 140 名前:132 mailto:sage [2007/10/02(火) 16:14:33 ]
- >>138もありがとう
- 141 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 16:23:33 ]
- >>139
32<必要ビット数<64なら、doubleが丁度手頃じゃないか。 非標準の型を使わなくて済むし。
- 142 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 16:31:10 ]
- hoge.h hoge.cpp とわざわざ2つのファイルに分けるのはどうしてですか?
後でヘッダファイル見て理解しやすいようにしてるだけ? ヘッダに実装部も含めてclassを記述しちゃった方が楽だと思うのですが
- 143 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 16:34:35 ]
- そう思うのなら、そうすればよろしいでしょう。
実際私も、クラスの実装はインクルードファイルに書くことが多くなっています。
- 144 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 16:46:54 ]
- >>143
何か問題はないのでしょうか?
- 145 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 16:58:17 ]
- >142に提示された条件だけでは問題があるともないともいえません。
- 146 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:03:12 ]
- ヘッダに実装コードを書くのはおかしい
- 147 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:05:19 ]
- 単にprivateなメンバ変数の値返すだけとかならヘッダに書いちゃう。
- 148 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:12:10 ]
- >>144
やってみて問題なければいいんじゃない
- 149 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:13:53 ]
- 全てを宣言内に書いてしまうというのは、分割コンパイルの利点の放棄に等しい。
まぁマシン速くなったから、それもいいんじゃない?
- 150 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:17:49 ]
- >>145-149
ありがとうございます >分割コンパイル そういう意味もあるんですね
- 151 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:18:11 ]
- >>147
そうゆうのはインライン何とかの範囲だからいいと思う
- 152 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:22:43 ]
- インラインは早いけどたくさん使うと実行ファイルが大きくなるみたい
- 153 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 17:26:40 ]
- どうせ今のコンパイラはオブジェクト間最適化で無理矢理インライン展開したりもするんだから、気にするほどのことじゃないだろ。
ついでに言えば、テンプレートクラスだとどうせ実装はインクルードファイルに書かないといけなくなるわけで。
- 154 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 18:38:32 ]
- switch - case と do - while について質問
下記のコードで処理がどのような順番で行われるのか教えてください。 よろしくお願いします。 int width = 15; int n = (width + 3) / 4; switch(width & 0x03) { case 0: do { *buffer++ = 0 case 3: *buffer++ = 0; case 2: *buffer++ = 0; case 1: *buffer++ = 0; } while(--n > 0); }
- 155 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 18:42:26 ]
- >>154
ざっくり言うと、widthを4で割った回数だけループする作りになっている。 実際には、4で割った余りも処理しないといけないのでその分を最初の switchからのcaseへの飛び込みで賄っている。 つまり、その例では15でスタートするから初回はcase 3に飛び込むわけだ。
- 156 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 18:45:00 ]
- 各行にprintfでも挟んでみれば?
- 157 名前:154 mailto:sage [2007/10/02(火) 18:51:37 ]
- >> 155
どうもありがとうございます。 初回に case 3 に飛び込むのは理解しました。 2回目以降はどうして case 0 〜 case 1 まですべての処理を通るのでしょうか。 すいませんが、もう少し詳しく解説してください。 >> 156 printf を挟んで動作は確認しました。 ただ、どうして >> 155 さんのような挙動になるのか理解できません。
- 158 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 18:54:16 ]
- 最初に switch でどれかの case ラベルに飛んだ後、 while で条件が偽だった場合 do に戻る
- 159 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 18:57:26 ]
- もしかして、break が無いとそのまま次の case が実行されるってことを知らない?
- 160 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 18:58:11 ]
- ちなみにこれはDuff's deviceという名で有名。
- 161 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:02:16 ]
- まあただの興味で聞いてるだけだと思うが一応
caseの後には必ずbreak付けろ 使わなくてもdefaultは書け caseはswitchスコープの直下に置け、ループの途中に挟むなんて言語道断 以上
- 162 名前:155 mailto:sage [2007/10/02(火) 19:08:41 ]
- >>154
ヒントを一つ。caseラベルはswitch以外からは只のラベルにしか見えない。 つまり、switchから飛び込んだ後は存在しないも同然。 各caseラベルを渡り歩く理由については>159にも書かれている通り、breakしないとスルーするわけだ。
- 163 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:12:30 ]
- アルゴリズムの質問なんですが
カオリ、165cm、24歳、年収500万 サキ、150cm、21歳、年収1000万 タカシ、180cm、18歳、年収200万 グレイ、100cm、120歳、年収0etc というデータがあってa*身長+b*年齢+c*年収の値が一番大きい順にソートしたとき 最もあいうえお順に近い並び方になるa,b,cの値を探すプログラムを書きたいのだが 如何組めばいいか見当がつきません。 教えてください。
- 164 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:15:26 ]
- 全通りの並べ方試してみてそれぞれあいうえお順に近いかどうか調べりゃいいじゃん
ところであいうえお順に対する近さって何?
- 165 名前:154 mailto:sage [2007/10/02(火) 19:20:26 ]
- >>159
それは理解してます。 >>160 ありがとう。色々調べてほぼ理解できました。 >>161 自分で書く場合はそうしています。 なので、逆に今回のコードが理解できませんでした。 >>162 最初の case 0: do { ...; case 1: ... の時点で理解不能でした。 switchが単なるcaseラベルへのジャンプだと理解すれば それ以降は do{ } while() だけに注目すればよく、その中ではcaseラベルに意味はないのですね。
- 166 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:21:51 ]
- あうかえお
○××○○ 3/5=60% という感じでこの値を100に近づけたいんです。 パラメータの全通りとはどのような感じですか?
- 167 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:22:07 ]
- さらにgotoを加えて混乱させればいいのに…
- 168 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:23:45 ]
- >>166
なんで「う」が×なんだ?
- 169 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:24:51 ]
- >>163
Nx3行列A 165 24 500 150 21 1000 180 18 200 100 120 0 3x1行列B a b c Nx1行列C 6 ← 50音順で何番目か 11 16 8 とするとき A・B=C を満たす行列Bを決定すればよい このとき行列Aの逆行列をPとするとき(上付き文字が使えないので^^;) 両辺に左からPを掛けると P・A・B=P・C B=P・C となり求めることが出来る 逆行列の求め方は本(Numerical Recepies in C/C++ みたいなやつ)に 書いてあるのでそれを見ればおk
- 170 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:27:48 ]
- >>161
ja.wikipedia.org/wiki/Duff's_device 嫁
- 171 名前:163 mailto:sage [2007/10/02(火) 19:28:46 ]
- >>168
本来その位置は「い」だからです。 >>169 どうもありがとうございました。 さっそくやってみます。
- 172 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 19:34:26 ]
- 本来って何だ
「あ」「う」「か」「え」「お」のソートに何で「い」が出てくるんだ? じゃあデータが「さ」「し」「す」「せ」「そ」ならこうなるのか? さ し す せ そ ×(本来あ) ×(本来い) ×(本来う) ×(本来え) ×(本来お) 0% 変なの
- 173 名前:168 mailto:sage [2007/10/02(火) 19:35:26 ]
- >>172 は俺じゃないぞw
俺はもう諦めた
- 174 名前:172 mailto:sage [2007/10/02(火) 19:37:07 ]
- いや、168を騙るつもりはないが
なんか致命的な勘違いをしてる予感がしたから聞いてみたんだがもう見てないかな
- 175 名前:169 mailto:sage [2007/10/02(火) 19:38:07 ]
- >>171
>>169 をちょっと訂正 要素数Nが4以上の時は Nx4行列A (4列目の要素は常に1) 165 24 500 1 150 21 1000 1 180 18 200 1 100 120 0 1 4x1行列B a b c d にしないといけない
|

|