1 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 21:21:26.11 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.76【環境依存OK hibari.2ch.net/test/read.cgi/tech/1312621728/ ◆ソースのインデントについて 半角空白やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのも手ですが直接貼る場合は、 全角空白か に置換すると見栄えだけはよくなります。 【アップローダー】(質問が長い時はココ使うと便利) codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック) ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)
2 名前:デフォルトの名無しさん [2011/12/12(月) 22:01:55.18 ] >>999 型キャストがビットシフトの前に行われるのって 言語仕様でしたかね?
3 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 22:22:29.78 ] JISX3010によると、 6.5.7 ビット単位のシフト演算子 意味規則 整数拡張を各オペランドに適用する。 らしいです。
4 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 22:26:00.04 ] >>2 算術演算子の優先順位 ttp://www.bohyoh.com/CandCPP/C/operator.html キャスト演算子の方がシフト演算子より優先順位高いですね。
5 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 22:51:51.26 ] >>2 ,4 優先順位とか関係なくね?
6 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 23:05:20.87 ] >>4 「暗黙の」型変換というところに引っ掛かりを覚えるのだが・・・ さらに言えば、ビットシフトとブール演算が右辺で複合的に行われた場合、それらのビットシフトやブール演算より先に 左辺の型を見て右辺の数をのこらず自動型変換って、期待していいものなのか?当てにしているとあぶなくないか?
7 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 23:22:54.97 ] >>5 型変換が行われないと、桁あふれで右辺は0になる
8 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 23:23:55.25 ] 汎整数拡張 ttp://ja.wikipedia.org/wiki/%E6%B1%8E%E6%95%B4%E6%95%B0%E6%8B%A1%E5%BC%B5
9 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 23:24:38.10 ] ん?>>3 に書いてあるとおりじゃないか^^ c<<16の段階で、両辺が整数型にキャストされてる。 左辺 i が整数であるかどうかはまったく関係ない。 double d = c << 16; のごとく書いても、cは整数型にキャストされるし char s = c << 16; のごとく書いても、cは整数型にキャストされる。 (そして結果はchar型にキャストされて面白い事になる)。
10 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 23:31:55.62 ] >>7 整数拡張は演算子じゃないから、優先順位とか関係ないぜ。
11 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 23:38:03.81 ] 左辺をuint64_tにして右辺で4バイト超えるとこまでシフトしても、うまいことキャストするみたいなんだが・・・環境依存? (単に整数型にするだけなら桁あふれでゼロ)
12 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 23:40:00.07 ] >>9 intはint型と書いてくれよ。char型だって整数型なんだから。
13 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 23:51:16.42 ] >>6-10 すんません。偉そうに教える程の知識は無いんですが、、、 「暗黙」だろうが「明示」だろうが、優先順位は変わらないと思います。 そして、式内では「精度の高い型」に変換されるので i = c<<16; は、うちは64bitOS(linux) (1)16はint型とみなされる。 (2)c<<16 で右辺の16はint型なので、cは暗黙的にint型にキャストされる。 (3)i = c<<16 で左辺の(unsigned int)にキャストされる。 ってな感じだと思っていたのです。 ・・・って、みなさんの言う、整数拡張ってwikiって見たら、 確かに演算子ではないですね。ということは、無条件に行われるから 優先順位が一番高いとも言えるのかな。 すっかり、ミイラ取りがミイラになっています。 とりあえず、多分、前スレ>>999 さんは unsigned char c; unsigned int i; c = 0xff; i = (unsigned char)(c<<(unsigned char)(16)); printf("c: %x\n", (unsigned int)c); printf("i: %x\n", i); を期待されていたのでしょう。
14 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 23:53:16.02 ] あ、アンカ間違えた × 前スレ >>999 ○ 前スレ >>997
15 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 23:56:03.66 ] img.pics.livedoor.com/012/d/6/d6f87fce733d70932354-1024.png mamorenihon.files.wordpress.com/2011/09/kao-demo1.jpg blog-imgs-34.fc2.com/d/e/l/deliciousicecoffee/201108040637592d3.jpg tantawan.blog.so-net.ne.jp/_images/blog/_13f/tantawan/E88AB1E78E8BE4B88DE8B2B7-18690.jpg stat.ameba.jp/user_images/20110820/18/lisa-w-paz/07/00/j/o0500032111430159404.jpg livedoor.blogimg.jp/news30over/imgs/c/3/c3860b80.jpg
16 名前:デフォルトの名無しさん mailto:sage [2011/12/13(火) 00:22:04.65 ] www.bohyoh.com/CandCPP/C/operator.html 今まで何の疑問も持たずに見過ごしてきたけど、順位が間違ってるね。 配列の添字[]は関数呼び出し()より順位が高いですよ・・・
17 名前:デフォルトの名無しさん mailto:sage [2011/12/13(火) 00:24:10.32 ] >>16 どんな式でその二つの優先順位の違いが問題になるの?
18 名前:デフォルトの名無しさん mailto:sage [2011/12/13(火) 02:37:54.17 ] C/C++の宿題片付けます 154代目 ttp://hibari.2ch.net/test/read.cgi/tech/1322562648/ のスレを見て、他人のプログラムを見て色々と勉強させてもらっているのですが、 そのスレの、>>258 が質問し、>>259 が解答したプログラム(元コード ttp://ideone.com/BRXCl)があるのですが、 そのプログラム中にある、 char *roman_nums[] = {"XI", "XII", "XIV", "XVIII", "XXIV", "XLIII", "XCIX", "CDXCV", "MDCCCLXXXVIII", "MCMXLV", "MMMCMXCIX"}; for (i = 0; i < sizeof(roman_nums)/sizeof(*roman_nums); i++) { という文の、sizeof(roman_nums) / sizeof(*roman_nums) ところが分かりませんでした。 前(分子)のsizeofと後ろ(分母)のsizeofが何なのかがわかりません。割るとどういうことになるのでしょうか。 前の方は、roman_numsは配列なので&roman_nums[0]ってことでしょうか?? 自分の理解が大分足りてないようで、どなたか解説をお願いできませんか。よろしくお願いします。
19 名前:デフォルトの名無しさん mailto:sage [2011/12/13(火) 02:41:37.26 ] 配列の数がわかる いちいち割らなくても_countofという便利なものもあるけど
20 名前:デフォルトの名無しさん mailto:sage [2011/12/13(火) 02:56:20.91 ] >>19 ほんとですね。 今自分で試したのですが確かに配列の数がピッタリでますね。 どうしてこうなるのでしょうか・・・
21 名前:デフォルトの名無しさん mailto:sage [2011/12/13(火) 02:58:20.66 ] sizeof(roman_nums)で配列全体の大きさがわかって sizeof(*roman_nums)で配列1個の大きさがわかるから *roman_numsが難しかったらroman_nums[0]と読み替えてもいい
22 名前:デフォルトの名無しさん mailto:sage [2011/12/13(火) 03:03:42.52 ] >>21 >*roman_numsが難しかったらroman_nums[0]と読み替えてもいい ああ!そういえばそうですよね。すっかり忘れてました。 お陰ですっきりしました!! ほんとありがとうございます!
23 名前:デフォルトの名無しさん [2011/12/13(火) 06:54:21.79 ] Win7 64+GCC(on MinGW)で・・・・ これはゼロになる unsigned char c; uint64_t i; c = 0xff; i = c<<63; ----------------------------------------- これならMSBにビットが残る unsigned char c; uint64_t i; c = 0xff; i = (uint64_t)c<<63; ----------------------------------------- 暗黙の型変換でやってくれるのは、int(機種依存の?)まで? それはそうと、 :-] ←ドヤ顔
24 名前:デフォルトの名無しさん mailto:sage [2011/12/13(火) 08:02:56.86 ] >>23 そそ、暗黙の型変換は左辺に何があるかは知らない。
25 名前:デフォルトの名無しさん mailto:sage [2011/12/13(火) 10:57:50.76 ] >>23 整数拡張だったら大きい方で計算されるんじゃね? unsigned charとintならint、uint64_tとintならuint64_t
26 名前:デフォルトの名無しさん mailto:sage [2011/12/13(火) 11:41:24.46 ] >>16 こっちの方が良かったかな? ttp://www.cppreference.com/wiki/jp/operator_precedence でも、添字[]と関数呼び出し()の優先順は同じはずですよ。あとは、結合の順番だけのはず。たしか・・・・。 >>17 たぶん、関数ポインタあたりを使うと書ける(問題になる)んじゃない?書いたこと無いけど。
27 名前:デフォルトの名無しさん mailto:sage [2011/12/13(火) 13:16:20.65 ] for文を使う、配列を使わないやり方でお願いします。 10個の数値を入力 入力された各々の数値を二倍して表示するプログラム。
28 名前:デフォルトの名無しさん [2011/12/13(火) 13:24:43.76 ] >>27 for(i=0;i<10;i++){scanf("%d",&n);printf("%d ",2*n);}
29 名前:デフォルトの名無しさん mailto:sage [2011/12/13(火) 15:02:10.31 ] 表示は入力の度ではなくまとめてでお願いします。
30 名前:デフォルトの名無しさん mailto:sage [2011/12/13(火) 15:24:10.41 ] 条件小出しにしないで、宿題スレ行ったら?
31 名前:デフォルトの名無しさん mailto:sage [2011/12/13(火) 17:03:53.64 ] むりじゃね?w ってか釣りか
32 名前:デフォルトの名無しさん mailto:sage [2011/12/13(火) 17:19:14.88 ] int x2(int i){int n;for(;i;)printf("%d\n",x2(--i));scanf("%d",&n);return 2*n;} x2(10);
33 名前:デフォルトの名無しさん mailto:sage [2011/12/13(火) 18:12:03.06 ] >>27 #include<stdio.h> #include<stdlib.h> int main(){ int i, n; char s[1000] = "", *p = s; for (i = 0; i < 10; i++) { printf("%d. ", i + 1); scanf("%d", &n); sprintf(p, "%d ", 2 * n); while (*p)p++; } printf("%s", s); return 0; }
34 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 11:27:42.91 ] 以下のような_allocaをラップした関数を作りたいのですが Debugでは意図通りに出力されません。 template<typename T> T *aloca(size_t t){ return (T*)_alloca(sizeof(T) * t); } int _tmain(int argc, _TCHAR* argv[]){ int *a = aloca<int>(1); *a = 1; int *b = aloca<int>(1); *b = 2; int *c = aloca<int>(1); *c = 3; printf_s("*a = %d\t", *a); printf_s("*b = %d\t", *b); printf_s("*c = %d\t", *c); return 0; } Debug出力 *a = 3 *b = 1 *c = 1 Release出力 *a = 1 *b = 2 *c = 3 やはりalocaを抜けた時点で_allocaが確保したメモリは解放されてしまうのでしょうか? だとするとReleaseで動いているように見える理由は? どうすればDebugでも動くようにできるでしょうか?
35 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 11:47:19.34 ] >>34 msdn.microsoft.com/ja-jp/library/wb1s57t5%28v=vs.80%29.aspx _alloca は、プログラム スタックから size バイトを割り当てます。 割り当てられた領域は、単に割り当てがスコープ外になる場合ではなく、 呼び出し関数が終了する場合に、自動的に解放されます。 このため、_alloca から返されたポインタ値を引数として free に渡さないでください。
36 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 13:35:47.86 ] _alloca()は実装にも拠るけど関数じゃないからね。
37 名前:片山博文MZ ◆0lBZNi.Q7evd [2011/12/14(水) 14:08:39.47 ] #define MYALLOCA(type, count) ((type *)_alloca(count * sizeof(type)))
38 名前:片山博文MZ ◆0lBZNi.Q7evd mailto:sage [2011/12/14(水) 16:09:24.02 ] おっと、カッコで囲まなきゃ。 #define MYALLOCA(type, count) ((type *)_alloca((count) * sizeof(type)))
39 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 17:08:08.53 ] なるほどマクロならいけそうですね。 名前空間に入れられないのがつらいけど それでいこうと思います。 ありがとうございました。
40 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 19:56:37.04 ] マクロを使うとお先真っ黒ってね
41 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 20:43:11.65 ] >>40 まっ、苦労するのは確かだな。
42 名前:デフォルトの名無しさん [2011/12/14(水) 20:50:01.99 ] 在日の戦略にひっかかり、全ての間違いが始まった2009年 夏 |:::::::::::::;;;ノ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |::::::::::( 」 < 民主になればこの世はバラ色、政権交代! ノノノ ヽ_l \______________ ,,-┴―┴- 、 ∩_ /,|┌-[]─┐| \ ( ノ / ヽ| | 在 反 | '、/\ / / / `./| | 日 日 | |\ / \ ヽ| lゝ | | \__/ \ |  ̄ ̄ ̄ | | ┬ |それでも懲りない日本人、韓国民団総理支持率35%w早く目を醒まそう!
43 名前:デフォルトの名無しさん [2011/12/14(水) 21:50:18.48 ] visualstudio2008で開発を行っているのですが、デバッグでは発生せずリリースでのみ発生する不具合があって困っています。 プログラムとしては別スレッドで受信したデータをファイルに記録とウィンドウに表示するものなのですが、20分ほどするとJITのウィンドウが開いてプログラムがフリーズしてしまいます。 その際にVSを立ち上げて落ちた箇所を調べるとfwriteの実行で落ちているようで、書き込むデータのサイズが定数を使用しているにも関わらずfwriteの内部で値が全く違う大きな値になっていました。 このような現象の原因についてご存じもしくは思い当たるふしがあれば教えていただけないでしょうか? よろしくお願いします。
44 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 22:03:51.91 ] volatile修飾子に関係があるかもしれない 何故そう思ったかというと、つい数日前俺が勉強したばかりだからだ
45 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 22:10:24.40 ] >>44 C/C++のvolatilはjavaやC#とちがってメモリバリアもアトミックも 保証されていないぞ
46 名前:デフォルトの名無しさん [2011/12/14(水) 22:27:41.84 ] C++で、クラスポインタを0で初期化するようなプログラムを頻繁に見るんですか、いいんですか? 間違って、初期値のままポインタの参照先の値を書き替えてしまうと、かなり危険なきがするんですが。
47 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 22:32:29.62 ] >>46 間違って書き換える方が悪い、という考えで作られているのがC++。
48 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 22:44:51.81 ] class A{...}; A * p = NULL; *p = hogehoge; みたいなことを言ってるの? 余裕で落ちるから大丈夫
49 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 22:45:52.23 ] C++で class CHoge; CHoge* p_test = NULL; p_test = new CHoge(); ↑の処理は、 一番上はクラスの宣言、 二番目はCHogeを入れるためのp_testという名前の箱を用意してやる、 一番下はコンストラクタを呼び出して、実態を与えてやる といった処理でしょうか?
50 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 23:18:04.55 ] 宣言しただけじゃnewできんぞ
51 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 23:28:57.40 ] >>46 よく気がついたな かなりヤバイコードだから絶対に真似しちゃイカンぞ
52 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 23:29:11.50 ] CHoge* p_test = NULL; /*スタック領域にクラスのポインター型変数を確保*/ p_test = new CHoge(); /*ヒープ領域にクラスに必要なメモリを確保した後、 そのクラスのコンストラクタを呼び出し、 そのポインタをp_testに代入*/
53 名前:デフォルトの名無しさん mailto:sage [2011/12/14(水) 23:32:32.42 ] RAIIのひろーい原則に従えば、ポインタにNULLを突っ込む余地はないはずなんだけどね 確保の直後に初期化されなければならないし、破棄は(コード的に)確保と隣接した場所で行われるから 要するに無効なまま運ばれる区間は限りなく短くなってるはずなので
54 名前:デフォルトの名無しさん mailto:sage [2011/12/15(木) 00:40:15.58 ] なに得意そうにswitchさんデスっての?
55 名前:デフォルトの名無しさん mailto:sage [2011/12/15(木) 09:43:31.74 ] 前スレ>>782 で >namespace manko { > extern "C" { > #include <Windows.h> を見て、へーこんなことできるんだと思って試してみた。 namespace Impl{ struct impl_struct{ char c[8]; }; extern "C" void externCtest(impl_struct *a){ for(int t = 0; t < 8; ++t) printf_s("%d ", a->c[t]); printf_s("\n"); } } namespace Decl{ struct decl_struct{ int a, b; }; extern "C" int externCtest(decl_struct *a); } void externCtest(){ Decl::decl_struct a = { 1, 2 }; printf_s("externCtest ret = %d\n", Decl::externCtest(&a)); printf_s("&Decl::externCtest = %x\n", (int (*)(Decl::decl_struct*))Decl::externCtest); printf_s("&Impl::externCtest = %x\n", (void (*)(Impl::impl_struct*))Impl::externCtest); } extern "C"をつければ、どのnamespaceで定義しても どのnamespaceで宣言しても、引数や戻り値がでたらめでも 名前と引数のサイズとかが合ってれば動くみたいなんだけど これってちゃんと仕様に沿ってるの?
56 名前:デフォルトの名無しさん mailto:sage [2011/12/15(木) 10:16:23.06 ] 呼ばれる関数は同じだがオーバーロード(?)すらできた。 using Impl::externCtest; using Decl::externCtest; Impl::impl_struct a = { 3, 4, 5, 6, 7, 8, 9, 10 }; Decl::decl_struct b = { 1, 2 }; externCtest(&a); auto bret = externCtest(&b);
57 名前:デフォルトの名無しさん mailto:sage [2011/12/15(木) 23:24:31.68 ] >>52 ありがとうございmす
58 名前:デフォルトの名無しさん [2011/12/16(金) 13:43:12.04 ] DLL内の関数名の前につく __imp__ と __imp_ の違いってなに?
59 名前:デフォルトの名無しさん mailto:sage [2011/12/16(金) 17:45:05.81 ] 気分
60 名前:デフォルトの名無しさん mailto:sage [2011/12/16(金) 19:33:04.17 ] エスパーすると区切る場所が違う __imp___func -> __imp__ + _func __imp__func -> __imp_ + _func ではなく __imp___func -> __imp__ + _func __imp__func -> __imp__ + func _func と func の違いは呼出規約(stdcallかcdeclか)の違い
61 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 01:05:33.53 ] インプ君思い出した
62 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 02:47:27.11 ] class Hoge { [型] hoge(bool var); } ↑のような関数があるとき、 Hoge hoge; bool foo = true; // どちらでもいいので初期化 hoge.hoge(foo); // (1). bool型の変数指定 hoge.hoge(true); // (2). trueの定数指定 hoge.hoge(false); // (3). falseの定数指定 と出来ますが、 (3)以外のパターンでコンパイルエラーにしたいのですが、可能でしょうか? falseしか指定できないenumを作るしかありませんか?
63 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 03:04:53.79 ] そもそも引数なんか必要ないんじゃないか? ちなみにC++0xなら、右辺値参照を使えば(1)をコンパイルエラーにできる。 hoge(bool &&var);
64 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 03:21:42.82 ] プロトタイプ宣言の関数の引数に書かれる「rhs」は何の略です?
65 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 03:33:14.60 ] >そもそも引数なんか必要ないんじゃないか? 申し訳ありません。 この例を見ると確かにそのとおりです。言われて気がつきました。 簡単に示そうとして、情報が欠落してしまいました。 Hogeのコンストラクタとして3つ、 Hoge hoge; Hoge hoge(false); Hoge hoge = false; hoge.無効化メソッド(false); のを許して、以下を許さない Hoge hoge(true); Hoge hoge = true; Hoge hoge(bool foo = false); ものを考えていました。 boost::optionalのintだけのようなものをライブラリなしでつかいたいな、と。 class Hoge{public: bool 有効化フラグ_; int hoge_};を使って。 おとなしくenumします。 右辺値参照初めて知りました。少し勉強します。
66 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 03:34:10.36 ] ×hoge.無効化メソッド(false); ○hoge.無効化メソッド();
67 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 04:09:31.81 ] >>64 lhs < Left Hand Side (左辺) rhs < Right Hand Side (右辺)
68 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 09:39:11.49 ] >>62 template<bool p> struct c_bool { static bool const value = p; }; struct Hoge { void hoge(c_bool<false> const & p); }; Hoge h; bool p; h.hoge(p); // error h.hoge(c_bool<true>()); // error h.hoge(c_bool<false>()); // ok
69 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 16:51:49.67 ] C++でコルーチンはどうやれば書けるの?
70 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 17:01:17.89 ] std::stringで数値を文字にする時に int 123 →"00123" int 1234→"01234" みたいに0で桁数を揃えるフォーマットにするにはどうしたらいいですか?
71 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 17:07:36.10 ] >>70 #include <sstream> #include <iomanip> std::string to_str(int x, int d) { std::ostringstream oss; oss << std::setw(d) << std::setfill('0') << x; return oss.str(); }
72 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 17:21:09.91 ] >>71 ありがとうございます!
73 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 17:26:44.94 ] string str = "123"; std::cout << (boost::format("%05d") % str).c_str(); だったかな。(うろ覚え) std::cout << boost::str(boost::format("%05d") % str); とか。(うろ憶え)
74 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 17:29:49.92 ] >>73 %dとstd::stringは、激しくマズイ気がするが気のせいだったらすまない。
75 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 17:41:39.80 ] >>70 >みたいに0で桁数を揃えるフォーマットにするにはどうしたらいいですか? 絶対ないというならいいけど、int 123456 の時に "23456" か "123456" の どっちになって欲しいか書いたほうがいいと思う。
76 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 18:32:08.83 ] class A { enum B {aaa, bbb, ccc} } int main(){ A::B b = A::aaa; // ※1 return 1; } 「※1」の右辺に、凄い違和感があって、 「A::B.aaa」か「A::B::aaa」ってなるのが妥当に思えるのですけど、 何でcの仕様がこうなっていて、 何に私が悩んでいるのか解決できるようなエスパーがいたら、 助言をして欲しいです。よろしくお願いします。
77 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 18:32:59.19 ] 禿がenum嫌いだから
78 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 18:36:48.96 ] 64です。 >>67 ありがとうございます。スッキリ出来ました。
79 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 18:46:53.65 ] >>76 俺も初めは違和感だったな それにC#ではA.B.aaaとなるし 考え方だがCでは整数に名前が付いてるだけ、 くらいの認識と考えれば、その言語仕様も少し納得しやすいかもしれない
80 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 18:56:04.21 ] Aのなかにデロ〜ンとaaa bbb cccが漏れてるからそうなるわけで
81 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 19:02:47.35 ] C++11でenum classが導入されてちゃんとクラススコープに入ったenumがつけるようになるんだったけか。
82 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 19:20:08.60 ] namespace ENUM{int aaa(){return 0;}int bbb(){return 1;}int ccc(){return 2;}} typedef int(*ENUM)(); // これで全て解決だ!
83 名前:76 mailto:sage [2011/12/17(土) 19:22:39.05 ] >Aのなかにデロ〜ンとaaa bbb cccが漏れてるからそうなるわけで つまり、enum自体はc++的なものではなくてc的なものなので、グローバルに展開されてしまうってことですね。 ただし、c++なので、クラス内や名前空間内に限定することは可能になっている、と。 納得できました。 ありがとうございます、>>79 ,>>80 ,>>81 。
84 名前:76 mailto:sage [2011/12/17(土) 19:23:29.46 ] >>83 もありがとうございます。
85 名前:76 mailto:sage [2011/12/17(土) 19:24:10.67 ] ×>>83 ○>>82 スレ汚し失礼しました。
86 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 21:32:25.42 ] 質問 C++で、GLSLのnoise関数のような関数はありますか? つまり、ある値を入に対し、決まった、予想の付かない値を返す関数なのですが
87 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 22:33:45.66 ] コピーコンストラクタ・operator=に関して一件教えてください。 コピーコンストラクタを用意する際には、 operator=も用意するように、 と教えていただいたので、そのようにしてました。あるとき、 そのoperator=の最後に記述する「return *this;」を忘れていました。 ところが、特に問題が出ていませんでした。 これは記述する必要がないのでしょうか?
88 名前: ◆QZaw55cn4c mailto:sage [2011/12/17(土) 22:36:15.47 ] >>86 適当なhash関数はいかが?MD5/SHA-1/2(256) とか。
89 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 22:47:36.22 ] >>88 ありがとうございます 検索してみるとwww.studyinghttp.net/md5 このページを見つけました しばらく見て参りますが、他に良い解説サイトなどありましたらご紹介くださいませ
90 名前:デフォルトの名無しさん mailto:sage [2011/12/17(土) 23:13:57.89 ] >>87 下に示すような記述をする為には、自身を返す必要があるから。 従って、代入した結果を必要としないのなら問題にならない。 -- YourClass foo, bar, baz; foo = bar = baz;
91 名前:65 mailto:sage [2011/12/17(土) 23:25:10.40 ] 「codepad」でエラーになる理由を教えていただけませんか? codepad.org/VybcCvXY ideone.com/WA7TG
92 名前:65=91 mailto:sage [2011/12/17(土) 23:34:02.42 ] ideone.com/WA7TG ttp://www.geocities.jp/ky_webid/cpp/library/027.html 関数のプロトタイプ宣言で、throw(ココ)に書く内容でどのような変化があるのか調べています。 ↑のページの「std::bad_exception」の説明に関して試しています。 178行目の「i2 = hoge5;」において、54行目の関数が呼ばれています。 このとき、 プロトタイプ宣言で、54,55,56のパターンや、 throwする例外オブジェクトで、60,61,62の内容を試すのですが、 「std::bad_exception」がthrowされません。 どこを修正すると説明の通り、「std::bad_exception」がthrowされるか教えていただけませんか? よろしくお願いします。
93 名前:65=91 mailto:sage [2011/12/17(土) 23:49:52.60 ] あと、 「eclipseのc++」や「ideone.com」で試した際と、 「Visual c++」で試した際と、 の間に挙動の違いがあって、205行目が、 前者で実行されない 後者で実行される のですが、何故なのでしょうか? gccでは、宣言以外の例外発生の後に即terminate(); visual c++では、プロトタイプ宣言のthrow()を無視している のでしょうか? ideone.com/qqqhp ※60行目、178行目、205行目
94 名前:65=91 mailto:sage [2011/12/17(土) 23:57:49.65 ] 最後に、(いろいろ問題出そうですが、) 158行目の 「hoge5」 とした場合に、問答無用で、 「(int)hoge5」 「int(hoge5)」 とした場合と同じにすることは可能でしょうか? 可能であれば教えてください。 (型の指定がない場合は、int(T)としたい。が、代入先がboolの場合はbool。「.」や「->」など他のoperatorも残したい。)
95 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 00:02:42.24 ] >>60 ありがとう
96 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 01:41:15.51 ] >>91 エラーの理由をみるにcodepadでは(その警告を出すなら)警告もエラー扱いする設定になってる。 そしてそのソースに対してはクラス定義でのメンバの宣言順とコンストラクタでのメンバ初期化子の順序が違うと警告がでてるからエラーになる。
97 名前:91 mailto:sage [2011/12/18(日) 02:53:35.67 ] >>96 なるほど。理解できました。ありがとうございます。 エラーの内容が続くwarningで示されていたとは。 独立しているのだと勘違いして、warningは無視していました。 codepad.org/lTFa56Ar 動きました。
98 名前:87 mailto:sage [2011/12/18(日) 02:57:54.25 ] >>90 >foo = bar = baz; { bar = baz; foo = bar; } これと等価だと思っていました。わかりやすい説明ありがとうございます。
99 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 03:16:04.70 ] 何度も失礼します。 codepad.org/OuxHRqHa で、41行目にエラーがあり、その内容は、 「定義されていない変数(名)へのアクセスがある」 といったものなのですが、 Visual c++ 2010 Expressで試すと、素通りされてしまいました。 利用していないメソッドの場合も確認してくれるようにするには、どのような設定をすればよいのでしょうか? Visual c++のスレは一週間くらい人大杉で書き込めませんでした。
100 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 03:38:14.38 ] >>99 そりゃ hoge_ が定義メンバにも無いし 継承もしてないからじゃないの?
101 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 03:54:06.53 ] もしかして、メモリリークって、Windowsだと、そのプロセスが終了すれば開放される?
102 名前:デフォルトの名無しさん mailto:sage [2011/12/18(日) 04:59:59.92 ] Visual C++ でコンソールアプリケーションでプロジェクトを作成して、 コンソールの他に、 独立した子ウィンドウをつくって、そこでなにやら処理したいのですけど、 インスタンスハンドルやらウィンドウハンドルやら説明を読んでも読んでもさっぱりわかりません。 そんなソースを示してくれているページを知っていたら教えてください。 簡単であれば書いてくれると助かります。