【初心者歓迎】C/C++室 Ver.28【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/06/09(金) 10:08:51ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.27【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1147183708/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0577デフォルトの名無しさん
2006/06/23(金) 15:59:12#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 15
void get_randam(int block[N][N]){ int *p;for(p = &block[0][0]; p <= &block[N-1][N-1]; p++)*p = rand() % 2; }
void paint(int block[N][N], int x, int y){ if( x<0 || y<0 || x>=N || y>=N || block[y][x] != 0)return;
block[y][x] = 2; paint(block, x+1, y);paint(block, x-1, y);paint(block, x, y+1);paint(block, x, y-1); }
void make_ans(int block[N][N]){ int i; for(i = 0; i < N; i++){ paint(block, 0,i);paint(block, N-1,i);paint(block, i,0);paint(block, i,N-1);
} } int main(){int block[N][N], *p, i = 1;srand(time(NULL));get_randam(block);make_ans(block);for(p = &block[0][0]; p <= &block[N-1][N-1]; p++, i++){
switch(*p){case 0: printf(" 1"); break; case 1: printf(" *"); break; case 2: printf(" -"); break; default:printf(" E"); break;
}if(i % N == 0) putchar('\n'); } return 0;}
上のソースは、宿題レスでだいぶ前に俺が適当に問題提示してみた問題の答え(どなたかが答えたソースです)
-**-**
-*-*-*
*-****
**----
の*で囲まれてる所をすべて別の文字に埋めるっていう問題
で、問題出しただけで答えは自分自身わからなかったのですが
この答えのソース見てもどうやって、再帰つかって探索してるのかが
いったいどうやったらこういうのを思いつけるのかがわからないです。
センスもあるんでしょうが、パズルの解法とかの関連ページ見ても
わからずで。
どういう風に、再帰さして結果を出してるのか。
ヒントか、参考になるページとかあれば、どなたか教えてください。
0578576
2006/06/23(金) 16:00:48・printを多態する(俺造語)関数であると設計するなら、初めからvirtualを付けとけ
・printを多態しない関数であると設計するなら、継承したクラスではその関数名は使うな
(似たような処理をする関数を作りたければ、別の名前にしろ)
また別の側面から考えると、あるクラスライブラリを使うということを考えたときに、
「隠蔽された関数がいたるところに散らばっている」というライブラリの場合、
使いたいクラスの規定クラスまでさかのぼって、多態という文脈でその関数を
使ってよいかどうか調べなければならなくなるかもしれないというようなことも
起こりえる。
0579576
2006/06/23(金) 16:13:480580デフォルトの名無しさん
2006/06/23(金) 16:43:07まぁ昔はそうだったわけだけど、WTLなんかにあるようなテンプレートベースの
クラスライブラリだと virtual なしで関数シグネチャ一致でポリモするってのは
便利に使われてるわけで・・・
たとえば(単純すぎて有効性が示せてない例かもしれないけど)
template class<T> void Log(const T& o) { o.print(); }
なんてのを使いたいとき。
Java とか C# なら >>579 には賛成します。
0581576
2006/06/23(金) 16:52:46俺はただ「1%も同意しない」にひっかかってるだけなんだけど、その「便利な場合」以外においても
C++では>>576,>>578には全く同意できないということですか?
うーん、まぁそういう考えの人もいるってことはわかりました。(あなたにとっては俺のような奴が
いるってことがわかったんでしょうが)
0582576
2006/06/23(金) 17:01:30呼び出される文脈でどれが呼ばれるかが変わるいうことはありません。
こっちの方が自然だと思う。
0583デフォルトの名無しさん
2006/06/23(金) 17:12:56今のところ、標準規格においてstd::basic_stringは要素がメモリ上で連続している保障がないから、
APIにバッファとして渡せないという影響も大きいと思う。(読み取りだけなら勿論c_strがあるけどね)
その点CStringはGetBufferなど、如何にもAPIにバッファとして渡すことを考慮されている分便利。
ちなみにCString以外でWindows APIにバッファとして渡すのに使えるものとしては、
std::vector<TCHAR>とか(std::vectorは要素がメモリ上連続している保障がある)、
new[]してboost::scoped_array, shared_arrayとかがある。
0584デフォルトの名無しさん
2006/06/23(金) 17:38:17主義の違いでよいような気もするけれども、質問風の文章なので一応返事してみます。
CBase::print() // オブジェクトの内部状態を表示
CDerived::print() // オブジェクトの内部状態を表示
なんていう2つの関数は同じ名前でよいと(強く)思うわけです。
CBase::basePrint() // オブジェクトの内部状態を表示
CDerived::derivedPrint() // オブジェクトの内部状態を表示
とするのは馬鹿げてると(これまた強く)思うから。
でまぁ、virtual の有無で動作が変わるからポインタベースでのポリモに使えるか
どうかわからんってのは・・・ドキュメント化するしかないでしょうね。
関数名を変えておけば使えないことは明らかなのでウマー!ってのは・・・アリなのかなぁ。
デストラクタとかは関数名変えようがないわけだし・・・
0585576
2006/06/23(金) 17:52:59うーん、主義の違いとしか言えないということかな。
>なんていう2つの関数は同じ名前でよいと(強く)思うわけです。
全く同意。ただ俺の場合はCBase::print()をvirtualにします。
俺の主義では、CBaseもCDerivedもprintに反応するなら、CFoo : CBaseも、
CBar : CDerivedもprintに反応するのが自然だと本能的に思うわけです。
どうせ全部でprintに反応すると思っているのなら、CBase::print()をvirtualに
しとけって思うんですね。
つまり、親クラスがprintに反応するのに子クラスが反応しないのはOOに
反していると感じるわけです。
やっぱり、主義の違いってことかな・・・。
0586デフォルトの名無しさん
2006/06/23(金) 18:38:20馬鹿じゃないの?
0587デフォルトの名無しさん
2006/06/23(金) 20:01:58馬鹿じゃないの?どう考えても、メンバ関数の隠蔽は、最悪ケースバイケースでそれはオッケーてな感じだろ。
いちいちそんなことされた日にやコンテナ入れるのも迷うわい。可読性とユーザビリティが著しく阻害される。
つか、純粋仮想関数使え。あ、こりゃ仮想だからNGなのかw
0588デフォルトの名無しさん
2006/06/23(金) 20:02:19能無しが無理して割り込まなくていいですよ。
0589デフォルトの名無しさん
2006/06/23(金) 20:32:52ギャハハハハ
0590デフォルトの名無しさん
2006/06/23(金) 21:19:23>どうせ全部でprintに反応すると思っているのなら、CBase::print()をvirtualに
>しとけって思うんですね。
virtual にしなくても反応はするでしょう。ふつうに継承して。
virtual の有無での差はポインタ経由で呼び出すときの違いだけ。
>>587
なにか具体的な例あげて批判してくれるとわかりやすいんだけど。
っていうかみんななんでそんなに仮想関数好きなの?
漏れは純粋仮想関数以外はあんまり使わないけどなぁ。
0591デフォルトの名無しさん
2006/06/23(金) 22:06:00つまりC++の継承とポリモーフィズムの仕組みを真っ向から否定する、ということだね
0592デフォルトの名無しさん
2006/06/23(金) 22:14:430593576
2006/06/23(金) 22:32:28うーん、なんだかもっと話がかみ合わなくなってきた気がするので、これを
最後にします。
>virtual にしなくても反応はするでしょう。ふつうに継承して。
え?そういう話だったんですか?
もともとあるクラスツリーに属するクラスでは全てprintに反応するのだが、
それぞれで実装が違うけど、virtualはお勧めしないって話では?
なぜvirtualを付けることに1%も同意できないのか良く分からなくなって
きました。
とはいうものの、実はC++の場合、俺も将来を見越してvirtualを付けておく
というのは(オーバーライドされることを考えておくというのは)、ほんの少し
違和感があります。前述のRubyの例が自然だと考えてるわけで・・・。
ただひとつ言えることは、言語仕様的にvirtualを付ける/付けないでこの
ように振る舞いがかわるからこうしろ、ということではなく、多態性を使う
のであれば仮想関数にしておくのがC++の流儀である、という認識は
多分どのように説得されても変わることはないと思います。
ではでは。
0594576
2006/06/23(金) 22:35:190595デフォルトの名無しさん
2006/06/23(金) 22:40:21前のよりマシだけど
0596デフォルトの名無しさん
2006/06/23(金) 23:09:30利口な人間は己に欠落を見つけ次第黙々と勉強する。だから利口になる。
馬鹿はそこで間違った自分の正しさを延々と説いて回る。だから馬鹿。
0597デフォルトの名無しさん
2006/06/23(金) 23:10:55・どこまで理解できていて、何が理解できていないのか明確にせよ。
・デバッガを使ってどのような動作するのか調査する。
・printfなどを使って途中経過がわかるようにする。
、、and so on
0598デフォルトの名無しさん
2006/06/23(金) 23:12:55そんなことしか言えないお前らはもっと馬鹿だけどなpgr
0599デフォルトの名無しさん
2006/06/24(土) 00:03:380600デフォルトの名無しさん
2006/06/24(土) 00:04:280601デフォルトの名無しさん
2006/06/24(土) 00:31:470602デフォルトの名無しさん
2006/06/24(土) 00:35:480603デフォルトの名無しさん
2006/06/24(土) 00:37:500604デフォルトの名無しさん
2006/06/24(土) 02:14:57data[number] = a;
number++;
と書くのと、
data[number++] = a;
と書くのでは、では客観的にどっちのほうが良いでしょうか?
0605デフォルトの名無しさん
2006/06/24(土) 02:24:010606デフォルトの名無しさん
2006/06/24(土) 02:33:09客観的に理由を述べられるか?
0607デフォルトの名無しさん
2006/06/24(土) 02:37:000608デフォルトの名無しさん
2006/06/24(土) 02:37:17後者はnumberのインクリメントのためにdata[]のインデックスとして使いaを代入する冗長なコード。
0609デフォルトの名無しさん
2006/06/24(土) 02:40:45(プログラミング手法の好みって宗教と似てる所があるな)
0610デフォルトの名無しさん
2006/06/24(土) 02:42:38馬鹿ですか?
0611デフォルトの名無しさん
2006/06/24(土) 02:47:280612デフォルトの名無しさん
2006/06/24(土) 03:01:320613デフォルトの名無しさん
2006/06/24(土) 03:03:091.インクリメントだけする時、++i; と i++; のどっちがいい?
2.無限ループは、while(true) while(1) for(;;) ?
3.エラー処理へのgoto はOK?
4.関数の入口でチェックしてreturn はOK?
5.ステータスを返す時は、必ず戻り値で返した方が良い ?
6.正常値は 0 にすべき?
…まだまだありそうw
0614デフォルトの名無しさん
2006/06/24(土) 03:13:002.現代では関係ない。
3.gotoでなくthrowが正しい
4.ぜんぜんOK、それを排除するとthrowも書けない
6.Cのライブラリにそういう関数が多いから合わせたほうが良いでしょう。
0615デフォルトの名無しさん
2006/06/24(土) 03:18:48どっちを書いても処理の流れが同じなら、パッと見て把握しやすい
見やすい方を選べば良い。そしてその見やすいの基準は自分で良いんじゃね?
誰かにいちいちケチつけられても始まらないし
そもそも市販の本をいくつか見たことある人なら
そんな細かいことを気にしないんでは?
人それぞれだし、思想の自由まである国で生きていることを実感した方が良いよ?
0616デフォルトの名無しさん
2006/06/24(土) 03:25:04例外のないCの場合は?
0617デフォルトの名無しさん
2006/06/24(土) 03:27:38まあ、ソースを自分しか見ないのであれば。
0618デフォルトの名無しさん
2006/06/24(土) 03:30:32誰が見ても下手なコードは存在する
0619デフォルトの名無しさん
2006/06/24(土) 03:40:11自分の視野が狭く観点が甘いことに気づいた方が良いよ。
無理に相手を理解しない、自分を理解させない。
意見を押し付けない、気に入らない意見ならスルーすりゃ良い。
ただ、誰かが自分の気に入らないことを言っていると思う前に
言っていることが「事実」かどうかは自分で判別する能力を身に着けた方が良いよ。
所詮、他人の意見なんざそいつの価値観による判断でもあるんだろうし。
何も相手が自分が嫌いな食べ物を好き好んでいたって良いじゃん。
嫌うなら食べ物だけにして、食べる人まで嫌うこたぁ〜ないだろ?
0620デフォルトの名無しさん
2006/06/24(土) 04:14:390621デフォルトの名無しさん
2006/06/24(土) 04:33:33Cの黎明期に、実はCが環境依存というか
プロセッサ依存していた名残ですね。
0623デフォルトの名無しさん
2006/06/24(土) 04:36:21いったい何にあきれてるんだ?
このスレでは2.0問題以降、平和なもんだが。
0624デフォルトの名無しさん
2006/06/24(土) 05:12:060625デフォルトの名無しさん
2006/06/24(土) 05:58:150626デフォルトの名無しさん
2006/06/24(土) 09:52:306. WindowsのGetLastError()/HRESULTなどのように複数の意味を持たせる場合には、
逆に0を成功値にするというのもありだとは思う。
7. void func(int* num, size_t size);
或いは
template<typename RandomAccesIter>
void func(RandomAccesIterIter first, RandomAccesIterIter last);
あとRange版もあればなおよしか。
0627デフォルトの名無しさん
2006/06/24(土) 09:59:19┏┫┃┃┃ スレ違い雑談は┃┃┃┣┓
┃┃┃┃┣┓ ここまで.┏┫┃┃┃┃
┃ ┃┃┏━━━┓┃┃ ┃
┃スレ違い ┣┫ ・∀・ ┣┫ END ┃
┗━━━━┛┗┳━┳┛┗━━━━┛
┏┻┓┃
┏━┛ ┣┻┓
┗━━━┫ ┗━┓
┗━━━┛
0628デフォルトの名無しさん
2006/06/24(土) 12:43:330629デフォルトの名無しさん
2006/06/24(土) 13:43:040630デフォルトの名無しさん
2006/06/24(土) 13:55:08君、2ちゃんに向いてないと思うよ。
来なけりゃ腹も立たないし。
Yahooや@ITの掲示板がいいんじゃないかな。マナーいいらしいよ。
0631デフォルトの名無しさん
2006/06/24(土) 14:29:14a="test";
このソースコードに悪い点はありますか?
0632デフォルトの名無しさん
2006/06/24(土) 14:30:200633デフォルトの名無しさん
2006/06/24(土) 14:30:370635デフォルトの名無しさん
2006/06/24(土) 14:33:49char *a = "test";
0636デフォルトの名無しさん
2006/06/24(土) 14:34:170637デフォルトの名無しさん
2006/06/24(土) 14:34:23ないよ。
まぁ固定文字列を代入するのなら
char *a = "test";
って書けという奴はいるかもしれんがな。(俺もこう書く)
0638デフォルトの名無しさん
2006/06/24(土) 14:37:19君なんでそんなに必死なの?
君が振る話題って、手垢が付きまくったもので面白みに欠けるんだけど。
相手してほしけりゃ、もっとましなネタ振って下さいね。
0639631
2006/06/24(土) 14:38:12a="test1";
(aを表示)
a="test2";
(bを表示)
ではこんな使い方も、あながち間違いではないということでしょうか?
0640631
2006/06/24(土) 14:38:45char *a;
a="test1";
(aを表示)
a="test2";
(aを表示)
0641デフォルトの名無しさん
2006/06/24(土) 14:47:49全く問題ない。
(コードの最適化はできるだろうが)
0642デフォルトの名無しさん
2006/06/24(土) 14:48:400643631
2006/06/24(土) 14:52:080645デフォルトの名無しさん
2006/06/24(土) 14:56:23別にいいんじゃないの?気にせず続けなよ。
0646デフォルトの名無しさん
2006/06/24(土) 15:49:30括弧の中を詳しく。
>>640
間違いではないが、括弧の中が関数呼び出しなら
a = "test1";
disp(a);
ではなく
disp("test2");
の方が見通しはよさそうだね。
0647笹井奈琴
2006/06/24(土) 16:10:12const char* a;
a = "test1";
のほうが好ましいと思う。
0648デフォルトの名無しさん
2006/06/24(土) 16:12:020649デフォルトの名無しさん
2006/06/24(土) 16:12:240650デフォルトの名無しさん
2006/06/24(土) 16:17:140651デフォルトの名無しさん
2006/06/24(土) 16:19:140652デフォルトの名無しさん
2006/06/24(土) 16:25:560653デフォルトの名無しさん
2006/06/24(土) 16:54:27char ch[10] = "hoge";
return 謎2
}
int main() {
char str[10] = "test";
str = Hoge();
printf("%s",str);
return 0;
}
関数Hoge()で処理した ch の文字配列を
呼び出し元の str へ入れようとした時に
謎1・2はどんな風に書けばいいのでしょうか。
0654笹井奈琴
2006/06/24(土) 16:57:32void Hoge( char* forRet ) {
char ch[10] = "hoge";
strcpy( forRet, ch );
}
int main() {
char str[10] = "test";
Hoge( str );
printf("%s",str );
return 0;
}
0655笹井奈琴
2006/06/24(土) 17:00:52struct buf_wrap {
char buf[10];
}
struct buf_wrap Hoge() {
struct buf_wrap r;
strcpy( r.buf, "hoge" );
}
int main() {
struct buf_wrap l;
l = Hoge();
printf( "%s", l.buf );
}
スタックをたくさん消費するし、
そんなに簡潔な感じもしないのであんまりお薦めしない。
0657デフォルトの名無しさん
2006/06/24(土) 17:10:57についてわからないのですが、
宣言時に初期化せずにconstした場合、そのとき
aのメモリ位置に元から入っている未知のビットが
aの定数として固定されるのではなく、
後から代入が可能なのですか?
0658デフォルトの名無しさん
2006/06/24(土) 17:22:08const char *a;
と
char * const b;
の違い。
0659@゚ν゚)ニホンゴムズカスィネー ◆FIgVQJjZb6
2006/06/24(土) 17:23:530660デフォルトの名無しさん
2006/06/24(土) 17:31:08しかし画面を最大化するとツールバーが消えてしまいます。
ウィンドウのサイズが変更になったときの処理
WM_SIZE: SendMessage(hTool、TB_AUTOSIZE、0、0)
もして、ツールバーにメッセージをおくっているのですが直りません。
どうしたらいいですか?
0661デフォルトの名無しさん
2006/06/24(土) 18:01:01初心者にもいろいろあるし好みもあるから、一概にこれというのは決められない。
自分で試して使いやすいのを選べ。
0662デフォルトの名無しさん
2006/06/24(土) 18:10:44純粋仮想関数の存在意味がわかりません。
仮想関数でも十分な気がするんですが。
0663デフォルトの名無しさん
2006/06/24(土) 18:12:23・派生クラスにオーバーライドを強制できる
・純粋仮想関数があるクラスはインスタンス化できなくなる
0664デフォルトの名無しさん
2006/06/24(土) 18:27:16gccでコンパイルしたライブラリーはiccからリンクすることは
可能なのでしょうか?
よろしくお願いします。
0665デフォルトの名無しさん
2006/06/24(土) 19:04:20Windows版iccはリンカにMSのLink.exeを使うんじゃなかったかな。gccはどうだっけ?
Linux版はgccでコンパイルしたと思われるライブラリを使っているから大丈夫っぽい。
#但し、C++は無理。
0666デフォルトの名無しさん
2006/06/24(土) 19:21:07これはどういう意味なんでしょうか
0667デフォルトの名無しさん
2006/06/24(土) 19:21:20インターフェースのみのクラスを定義できる。
派生クラスにインターフェースを確実に継承させられる
(インターフェースの保証ができる)
0668デフォルトの名無しさん
2006/06/24(土) 19:28:060669デフォルトの名無しさん
2006/06/24(土) 19:33:15スマン 訂正サンクス。
0670デフォルトの名無しさん
2006/06/24(土) 19:34:45ゼロで除算が行われた。
0671デフォルトの名無しさん
2006/06/24(土) 19:35:33ありがとうございます
0672デフォルトの名無しさん
2006/06/24(土) 19:38:15というかそのまま書いてあるんだから読めよ
0673デフォルトの名無しさん
2006/06/24(土) 20:19:560674デフォルトの名無しさん
2006/06/24(土) 21:46:27int count=0;
int main(void){
while(1){
cout<<count;
}
}
これをコンパイルしようとすると
「E2015'count'とSTL::count(略)の区別が曖昧」ってエラーでて、
countを別の変数に変えると通るのはどうして?
0675デフォルトの名無しさん
2006/06/24(土) 21:56:25obsoleteなC++コンパイラは窓から投げ捨てろ。
0676デフォルトの名無しさん
2006/06/24(土) 22:01:57よくわかんないけどBCC6ってポンコツなのか
■ このスレッドは過去ログ倉庫に格納されています