スレを勃てるまでもないC/C++の質問はここで 19
1 :
デフォルトの名無しさん :
2011/06/15(水) 11:47:04.75
/ ゙゙゙̄'''===―--、、、_ _, _ -==''  ̄ ̄ ̄`ヽ ,-=―--、、,,,.―-  ̄ ̄ ヽ√ ̄ ̄ニ ̄-‐ _ィ-‐= 、 彡'" /o 三 `ヽ`ミ、ヽ '´ ,.彡=''"" ̄ `゙ミ { (⌒) } ヽ{ " { (⌒) ,l 丶、 ゙ ノ ヽ ノ ー-- ' ,. 彡〃 、、 、_ー-- ´ 丶ミ=-='''"´ ヽヽヽヽ ̄三=―彡 / / ハ / / / / ハ / ヽ ヽ ヽ / ヽ ヽ ヽ / ̄ ̄ \
言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリリッ 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリリッ 言語規格書にはSIGABRTハンドラはreturnしないと書いてある (キリリッ
C/C++って言語仕様ではマルチスレッドって非対応ですよね? C/C++でのマルチスレッドプログラムのいい参考図書とかないですか?
5 :
デフォルトの名無しさん :2011/06/17(金) 20:52:41.40
矢印キーが押されたかどうかを判定する関数を教えてください
>>5 windowsならWM_KEYDOWNイベントを監視すれば
7 :
5 :2011/06/17(金) 21:05:15.33
>>6 回答ありがとうございました。
スレッドを移動するため
>>5 を撤回します。
8 :
デフォルトの名無しさん :2011/06/18(土) 13:41:59.17
質問です。 lstrcmp()で文字列比較をしているのですが、稀に戻り値の値が間違った値になります。 具体的には、第1引数の文字列の方が辞書順で前にある場合は-1、後ろにある場合は+1が返るはずなのですが ときどき、辞書順で前にあるはずなのに+1が返ったり辞書順で後ろにあるはずなのに-1が返ったりします。 ビルド環境はVisualStudio2005で動作環境はWindowsVista Buisiness SP2です。 VC6でビルド→WinXPで動作、VC2008でビルド→Win7で動作 の場合は いずれも問題が起きていません。(確認した限りでは。) lstrcmp()のかわりにCompareString()を使用しても同じ現象となります。 lstrcmp()、CompareString()ともおなじKernel32.libをインポートライブラリとして使用しているので これが原因だったりしないかなーと思ったりしますが確証なしです。 なにか分かる方いませんでしょうか?
strcmpでも同じ?lstrcmpは使ったこと無いが、 その異常が起こる場合のテストケースをうpすれば解決は早いだろう
ひらがな比較してたりしないだろうな
11 :
8 :2011/06/18(土) 22:17:30.63
長文になってしまい分割します。
恐縮ですがお願いします。
>>9 strcmpは使ってないので分かりません。
_mbscmp()で試したところ問題は発生しませんでした。
ちなみにVisualStudioのプロジェクトのプロパティで文字セットは”マルチバイト文字セットを使用する”にしています。
12 :
8 :2011/06/18(土) 22:29:04.69
>>9 やってること(やりたいこと)は以下。
・文字列配列A と 文字列配列Bをconst指定で別々のヘッダファイルで定義。(文字列はすべて漢字、2文字から7文字、50種程度、内容はABで同一)
・ある構造体メンバに文字列配列Bの中の文字列bのアドレスをわたしておく
・構造体メンバの指している文字列bが文字列配列Aの何番目の文字列か知りたい。
・文字列配列Aの中の文字列bと同じ文字列を探索(辞書順にソートしてあり二分探索で探索)
→この際にlstrcmp(文字列a,文字列b)というようにして比較。戻り値の正負により探索先を配列の小さい方or大きい方に決める)
・稀にlstrcmp()戻り値の正負が逆に判定される
→このとき二分探索で最後まで探しても文字列が見つからずエラーとなる。
13 :
8 :2011/06/18(土) 22:29:57.85
>>9 ※lstrcmpの引数の文字列を文字列と16進でファイルに出力してみたところ、文字列は壊れていない。
※しかし、lstrcmpの戻り値は稀に正負が逆になっている。
※特定の文字列で発生しているという事はなく、ランダムにおかしい結果となる。
※テストプログラムをループさせて試してみたが数万回〜数十万回 lstrcmp()を実施して1回おかしくなる程度
※関係あるかわからないが、テストプログラムを実行する際に他のプログラムを起動させたりするとそのタイミングで発生しやすい。
14 :
8 :2011/06/18(土) 22:34:15.41
>>10 恐らく全て漢字です。(もしかすると ひらがな もあるかも)
動作実績はあるので問題は無いはずと思っています。
lstrcmp()単体で疑ってるのなら、 文字列A、文字列B、戻り値のセットでファイルにでも出力して、 何時間でも回してみるといいじゃない。
16 :
デフォルトの名無しさん :2011/06/18(土) 23:13:07.25
質問です。 あるクラスのオブジェクトのメンバ関数をほかのオブジェクトのメンバ関数の中で呼び出したいときはどうすればよいでしょうか。 そのまま関数呼び出しをすると、コンパイル時に error: no matching function for call to ‘クラス::メンバ関数(引数)’ というエラーメッセージが出てしまいます。 教えてください。
クラスのメンバ関数宣言時に static メンバ関数ってやればいいよ
18 :
8 :2011/06/19(日) 01:02:03.17
>>15 やってみました。
VistaSP2ではボロボロとlstrcmpと_mbscmpの結果が違う場合が発生しました。
何時間どころか一発で出ました。
どなたかWinXPやWin7でどうなるかやってみてもらえませんか?
++count;
for(int k=0; k<100000; k++){
for(int i=0 ; i<11; i++){
for(int j=0; j<11; j++){
if((lstrcmp((LPSTR)cmp_dst[j], (LPCSTR)cmp_src[i])) != _mbscmp((const unsigned char *)cmp_dst[j], (const unsigned char *)cmp_src[i])){
19 :
デフォルトの名無しさん :2011/06/19(日) 01:04:00.73
>>15 書き込めなかったので分割しました。
ヘタクソなやり方で恐縮ですが。
wsprintf((LPSTR)str_buf, (LPCSTR)warning, cmp_dst[j], cmp_src[i]);
TextOut(hdc, 0, 50+i*20, str_buf, strlen(str_buf));
}
}
}
}
wsprintf((LPSTR)str_buf, count_msg, count);
TextOut(hdc, 0, 0, (LPCSTR)str_buf, strlen((const char *)str_buf));
DirectShowのFilterGraphみたいなGUIを作りたいんですが、何か簡単な方法ないですか? フォームアプリケーションだと難しそうで
>>18 なーんか、TCHAR関係を理解してない気がする。そこはおk?
int lstrcmp(
LPCTSTR lpString1, // 最初の文字列
LPCTSTR lpString2 // 2 番目の文字列
);
int _mbscmp(
const unsigned char *string1,
const unsigned char *string2
);
TCHARを使うなら、_MBCSや_UNICODEが定義されているかどうかが決定的。
lstrcmpに渡すポインタを どうキャストして渡すか などで挙動は代わらない。
さらに、以下の「解説」の項目に興味深いこともかいてある。
http://msdn.microsoft.com/ja-jp/library/cc410902.aspx
22 :
デフォルトの名無しさん :2011/06/19(日) 02:18:33.58
アルゴリズムの質問になっちゃうけど、ダイクストラってa→bとb→aへのコストが 違っても普通のダイクストラ法でちゃんと動く?
3要素のchar *の配列の参照はどのように記述すればよいでしょう? ↓これをtypedefせずに一文で書きたい。 typedef char *arr[3]; arr& a;
char *(&a)[3];
ありがとう。えぐいですね。それを返す関数は、あーでもないこーでもないとやった結果 char *(&a())[3]; とさらにえぐかったです。
typedefサンッぱねえっす
すみません。 BYTE配列に、char配列に入れるような文字列(と同じデータ)を、char*から入れたいのですが上手く行きません。 char Cbuff[128] = {"朝日"}; char* pCB = &Cbuff[0]; BYTE Bbuff[128]; memcpy(&Bbuff[0], pCB, sizeof(*pCB)); // 146の整数が入ってしまいます。 sprintf_s((char*)&Bbuff[0], 128, "%s", *pCB); // アクセス違反のエラー。 私は何が理解できておらず、どこを間違っているのでしょうか?
sizeof(*pCB)は1になるけどいいの? >sprintf_s((char*)&Bbuff[0], 128, "%s", *pCB); *pCBの"*"要らない ポインタの理解がまったく足りてないので 勉強しなおせばいいよ
sizeofの使い方も間違ってる 勉強しなおしてこいカスが
こりゃぁ理解まで遠いわ、というのがイッパツでわかるなw よくわかってないのにやろうとしてるのが丸見えになってる。
> よくわかってないのにやろうとしてるのが丸見えになってる。 これをクリアしないと前に進めない。 よくわかってないのにやろうとするのは悪くない。ただなかなか前へ進めないだけだ。 水前寺清子も歌ってる。でも3歩より下がってはいけない。
33 :
28 :2011/06/20(月) 14:38:31.77
>>29-32 ご助言ありがとうございます。sprintf_sの方は言われて見れば%sは文字列の先頭を送るんですから、実体送るだなんて大間違いですね・・。
そしてsizeof・・・実体の大きさを測ってもらう と思っていたら大間違いなんですね。
ポインタが指す変数のサイズをちゃんと測ってくれるものなんですね。
双方思った通りには動いてくれましたが、まだ何か勘違いしているかもなのでポインタについて再学習を始めました。
あまり人様の見よう見まねでコードを継ぎ接ぎしない方が身の為ですね・・。色々ご助言ご指摘、ありがとうございました。
意外と検索能力高かったな 延々と質面攻めになるのかと思ってたwwwwww
35 :
デフォルトの名無しさん :2011/06/21(火) 01:39:12.73
C++は名前空間があるから大規模開発でも問題なくやれるよね〜
GUIでプログラムを作りたいんですが何かおすすめのライブラリとかあります?
38 :
デフォルトの名無しさん :2011/06/21(火) 16:26:00.67
クラスと構造体の違いって何ですか?
デフォルトの可視性とデフォルトの継承指定が違う
触れる手順を強要し自分をさらけ出さない女王様タイプがクラス 股を開いて好きにしてと半マグロタイプが構造体 どっちも調教しだいなんだけどな
>>35 おまえそれ本気でいってんならマジでレベル低い
C,C++しかやったことないのか?市ね世ゴミ
ネームスペースとかゴミみたいな概念でしかない
本来やたら、それは使うべきではなく
思考停止して、とりあえず単純にささっとかきたいときに使う機能だぞ >> ネームスペースw
マジでゴミなんだな・・・・・・・・・・・・・・
uy ◆yyC0rYWEq2 は中卒 216 名前:uy ◆yyC0rYWEq2 [sage]: 2011/06/21(火) 04:57:05.12 うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙 うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙 うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙 うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙 うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙 うわ、中卒乙うわ、中卒乙うわ、中卒乙うわ、中卒乙 うわ、中卒乙うわ、中卒乙うわ、中卒乙 うわ、中卒乙うわ、中卒乙 うわ、中卒乙 うわ、中卒乙 うわ、中卒乙 うわ、中卒乙 うわ、中卒乙 うわ、中卒乙
44 :
デフォルトの名無しさん :2011/06/22(水) 00:37:39.63
チャットソフト作りたいです 参考サイト教えてください
質問です。 std::stringですが、c_str()があるということは、 メモリの連続性というのは保証されているのでしょうか? (可変長なのに、どうやって連続性持たせているのかは、私にはさっぱり想像もつきませんが)
c_str()の有効期限は更新するまで。
>>48 回答ありがとうございます。ただ説明が端的すぎで、もう少し補足をいただけると助かります。
「更新するまで」というのが、よくわかないのですが、
初期化、または代入時までということでしょうか?(要素や文字列を追加したらダメということ?)
>>49 non-constantなメンバーを呼ぶまで。
>>49 度々すみません。
「non-constantなメンバー」というのが、どういうものか、よく分からないんですが、
append() ,assign() ,at(),begin() ,c_str() ,capacity() ,compare()とか、メンバー関数がありますけど、
具体的にはどのメンバー関数が「non-constantなメンバー」になるんでしょうか?
(もしくは、non-constantとそれ以外(constant?)の区別はどこで分かるのでしょうか?)
よろしくお願いします。
>>51 std::stringのマニュアルやインクルードファイル(string)にconstantなメンバーは特記してある。
それ以外がnon-constant
例:
size_t length() const;
>>52 なるほど。丁寧な解説ありがとうございます。
VC++で/MDオプションをつけてマルチスレッドdll版のランタイムを指定してコンパイルして、出来たlibがあるとします。 このlibを人にあげて、その人がリンクするときに、リンカはどうやってlibcではなくmsvcrtが必要だとわかるのですか? libファイルの先頭に、そのlibで使われている未解決のCランタイムライブラリへの参照がシンボルの形で埋められていて、そこに一緒にマルチスレッド版のmallocが要るよ! とか書かれているの? それともマルチスレッド版のmallocとシングルスレッド版のmallocは違う名前になってlibファイルに埋まるの? たとえばコンパイラに/mdオプションをつけたら、_malloc_of_msvcrtって名前でlibに埋め込まれるとか。 (いや、ほんとにそんな変な名前になるとは思わないけど、例えば。)
55 :
デフォルトの名無しさん :2011/06/22(水) 23:41:38.91
0のものを1にするのに インクリメントと1代入どっちが速いの?
速度は実測が基本
どっちかが速かったにしろ、 ++と、+=1(リテラルの1を加算)だったら、 コンパイラが速いほうに統一してくれるだろ。
::だったり.だったり->だったり頭がはげそう
おそらく、1代入だろうな。 1加算は、メモリからのロード、加算、ストアのステップが必要。 1代入はリテラルをストアするだけ。
ボトルネックになるまではそんな細かいことを気にするだけ無駄 意味的に読みやすいほうを選択するべきだろう
61 :
デフォルトの名無しさん :2011/06/23(木) 11:14:12.80
if(a){ if(b){ 処理 } } if(a&&b){ 処理 } って違い出てきますか? 書きたいコードは6か7ぐらいの条件がついて無限ループ内に書くので
C/C++ではショートサーキットが言語仕様で規定されているから、 ロジック的な違いはない。 速度的に違いがあるコードが生成される可能性は無いか? と問われれば、とても間抜けなコンパイラが無駄なコードを吐く可能性を 否定できないので「違いが出る可能性はゼロではない」。
すみません。 char str[5000][800][500]; // 5000行 800項目 1個500byte に入っている文字列をstrcatで800項目連結してはfputsして、それを5000行分行っているのですが、 大したデータ量ではないのにやたらと時間がかかってしまいます。(1回40秒くらいでしょうか・・) もっと素早く処理するにはどうすれば良いでしょうか?
出力の回数を減らして纏めて出力するといいよ
構造体の配列!
>>63 strcat()しない。
どうせfputs()するんだから、最初からfprintf()してしまえばいい。
多少は早くなるはずだ。
それでダメなら、fprintf()もやめて小刻みにfputs()かな。
cygwinみたいな環境でもなければ、どうせバッファリングされるから。
つーか、大した量だよw
>>47 C++0xより前では連続性は保証されていない
ただ、普通に触れる処理系ならまず大丈夫なので気にする必要はない(0xより前の古いものでも大丈夫、つかダメなの聞いたことがない)
可変長なのに連続しているのは単に現在確保してるメモリを超えるなら確保しなおしてるだけだよ
40秒が連結の処理のせいでかかってる時間とは思えないから 単に端末の問題じゃ?fputsコメントアウトしたら一瞬で終わるか?
おなかがすいたんだがどうすりゃいいの?
メモリ不足じゃよ
確かに。2GBの配列でメモリスワップしてたり。 5000行持つのを諦めるとか、可変長にするとかしないと根本解決にならない気が。
2GBを「大したデータ量ではない」とか、すごい時代になったもんだ。
73 :
63 :2011/06/23(木) 13:37:09.99
色々なご意見ありがとうございます。 fputsを減らさないと重くなる と先入観が有ったのですが、 strcatを全部消してfputsだけにしたら2秒弱で終わりました; 時と場合でやり方は変えないとだめなんですね。 ありがとうございました。
74 :
63 :2011/06/23(木) 13:42:02.48
2GB・・・2MB・・?(´・ω・`)
1K=1000として 5000 * 800 * 500 = 2,000,000,000 = 2,000,000K = 2,000M = 2G
77 :
63 :2011/06/23(木) 19:07:13.11
2Gも使う事になってたんですね・・orz でもタスクマネージャの稼動中のプロセス見ても100KBすらメモリ使っていない・・。 扱うファイルが10〜300KBくらいだと全部メモリ確保しないのかな・・なんでだろう・・。(´・ω・`)
仮想メモリ
79 :
63 :2011/06/24(金) 23:43:56.48
大き過ぎるから仮想メモリに確保されている・・? んですね。 ありがとうございました。
80 :
デフォルトの名無しさん :2011/06/25(土) 21:48:20.84
映像のフレームを定期的に処理するプログラムを作っています。 たとえば30fpsですと33.33ミリ秒周期なので処理間隔を33ms or 34msにして1秒間あたりの 処理フレームが設定どおりにしたいと考えています。 で、間隔を33msにするか34msにするかというところの処理を書いてみたのですが、 もう少し良い書き方が無いものかご教示お願いします。
81 :
80 :2011/06/25(土) 21:49:29.06
下記がソース抜粋です。 int count=1;//1sec計測用 DWORD fps, cycle=0; DWORD prev_time=0, cur_time=0, sum_time=0; double cycle_d=0.0, cycle_int=0.0; fps=30;//入力映像のFPS値 prev_time = timeGetTime(); cycle_d=(double)modf((double)1000.0/fps, &cycle_int);//フレーム周期(整数部、小数部)求める while(sum_time<CONTENTS_TIME){//入力映像の長さ(ミリ秒単位) cur_time = timeGetTime(); cycle=(int)cycle_int+((int)(cycle_d*(double)count)-(int)(cycle_d*(double)(count-1)));//←もっとスマートなやり方はないでしょうか? if(cycle<=cur_time - prev_time){ /* ここにフレームの処理を記述 */ prev_time=cur_time; count++; } }
82 :
80 :2011/06/25(土) 21:51:37.84
何度もすいません。 fps値と入力映像の時間は外から与えるようにする予定です。
何度も糞レスしやがって! ゲーム小僧死ねよ
コーディングにセンスないね君。プログラミング止めたほうが良いよ
85 :
デフォルトの名無しさん :2011/06/25(土) 22:25:17.83
こんなスレにセンスあるやるいるのか?
センスは相応の努力をすればある程度磨けるはずなので、それをもって止めた方がよいというのはおかしい
^を付けされる意味って?
89 :
80 :2011/06/25(土) 23:32:27.28
>>83-84 拙いコードで恐縮です。
ゲームではありません。
センスが無いのは承知しておりますが
他に食べ方を知らないのです。
申し訳ないですがご教示願えれば幸いです。
食ってるとまで言うかねえ? 2ちゃんでそれを聞くような人が。
91 :
80 :2011/06/26(日) 00:17:41.15
>>90 ?
「食べてる」というのは偉そうな書き方でしたでしょうか?
転職するあてもないという意味です。
これがカーナビあたりの組み込み系SEの実態か?
93 :
80 :2011/06/26(日) 00:30:14.90
よろしければ女の食べ方もご教示願えれば幸いです。
今まで普通に動いていたプログラムが急に動かなくなってしまいました 問題の箇所は、普通にファイルをオープンしているだけなのですが・・・ std::ifstream(filename); プログラムがここにきたときに強制終了してしまいます。 なぜなのでしょうか・・・ QtCreatorで開発しています
☓ QtCreator ◯ Qt Creator
Qtを使わないようにすれば?
97 :
デフォルトの名無しさん :2011/06/26(日) 15:56:43.38
C++の仮引数の省略ってコンパイラが適当に引数を付加して処理しているの?
そうだよ
99 :
デフォルトの名無しさん :2011/06/26(日) 18:09:28.68
いまだにprintf使っているアホはいい加減死ねよ
102 :
デフォルトの名無しさん :2011/06/26(日) 18:13:31.36
>>102 マジだからどうすれば教えてくださいよwwwwwwwww
それこそゴミじゃん あんな使いにくいものよく使うね
>>105 同意w
C++はOOPLなんでオブジェクトシコーっぽくいきまつ、
さっそくオペレータ<<をオーバーライドしてみますたwww
みたいな悲しさを感じる。
(・o・)<<"いいじゃん"
>>107 全く同意。
C++はオペレータをオーバーライドできまつ。
一例として入出力はその結果<<や>>をオーバーライドすることでこんなふうに書けまつ。
みたいのをずっと引きずってるように見えてならない。
ただのビジュアル的なもののためだけに 名前空間使いまくっている馬鹿をどうにかしてください
stringが入出力もってればいんじゃねーの? String text = String("h") + "e" + "l" + "l" + "o"; text.setWriteTagert(IO::Console); text.write(); text.setReadTarget(IO::Keyboard); text.read();
IOをクラスに実装するってありえん。
>> 111 いやいや。 ミニ言語になってしまってる C のフォーマット関数がまづ問題で フォーマッタ出力とストリーム出力機能を別モノにしまってイイのかという問題もあるし(sprintf とか便利だけどなんか歯痒いじゃん? オブジェクトの役割的にiostream 自体がデフォで中間状態をもってイイのかてのもあるし
結局どうしたいんだ?
つまりみんなboost::formatがお望みか! cout << boost::format("%05d %x %f %%") % 200 % 255 % 3.33 << endl;
各OS実環境向けの文字処理専用スクリプト言語をC/C++規格へマージして欲しい。 バイナリで扱いたいんジャーとかストリーム関数ラブの人向けに旧方式もフリーズして互換維持の方向で
117 :
デフォルトの名無しさん :2011/06/27(月) 17:56:50.25
class CManiac { public: bool operator<(const CManiac& rmaniac) const { // *this が rmaniac よりも小さいという条件をコーディングし、bool 値を返す。 return b; } } 上の例のような,仮引数と関数定義の間にあるconst修飾子の表す意味が分かりません. どなたかぜひ教えてください.
>>117 おおざっぱに噛み砕いて言うと
メンバ変数をいじらないよーっていう表明
オブジェクトをconstで作っても呼び出せるメンバ関数になる
>>117 位置がなぞめいててイラッとさせるが、意味は
>>118 の言うとおり。
constメンバ関数、っていう言い方をしたりする。
>>117 その関数の中ではthisポインタにconstが付いている、という見方もできる。
>>118 ,119,120
謎が解けました.
解説ありがとうございました.
他国語出力したいんですが、上手くできません。何かいい方法ありませんか? ソースコードは間違っていないはず。例えば韓国語だと #include<iostream> #include <fstream> using namespace std; int main(){ char s[10]="테스트"; ofstream ofs("test.txt"); ofs<<s<<endl; ofs.close(); return 0; }
韓国語が標準の環境、韓国で売っているC++を使うとうまくいくと思う 韓国語Winと韓国語VCでどうぞ
124 :
デフォルトの名無しさん :2011/06/27(月) 21:14:46.55
別に韓国語限定じゃなくて、中国やロシアとか色々な言語に対応したいんだ というか、その国向けの開発環境じゃなきゃ出来ないとかあるはずないよね
unicodeつかう
使用者の知能によりけり
127 :
デフォルトの名無しさん :2011/06/27(月) 22:12:17.66
>>125 charで書き込み(読み込み)したいんですよ。
文字列型使えよ
char *hoge[] と char hoge[] の違いがわかりません
>>125 ありがとう、いろいろ調べてるうちにそのほれにたどり着いたけど、処理超面倒だね
>>128 文字列型ってstring?unicodeで使ったらまともに動作しなくね?
>>129 char *hoge[255]みたいな宣言だとすると
*hoge[255]=*hoge×255
hoge[255]=hoge×255
クラスClの構造体Stのポインタを 別のヘッダーファイルで使用するため、 前送り宣言したい (struct Cl::St;みたいな) 何かいい方法ない?
>>122 imbue()しなきゃだめだろ
処理系が韓国語に対応してるか調べてみ
無理ならgccのeucで試してみるとか
ファイルからデータを読み取り(例えば10人ほどの年齢、性別、ナンバー) その値を複数の関数であれこれ操作するとき この変数はグローバル変数するのがベターなんですかね? ・グローバル変数あり int age,sex,no 関数1(age,sex,no) 関数2(age,sex,no) 関数3(age,sex,no) ・グローバル変数なし int age,sex,no 関数1_1(age)return age; 関数2_1(age)return age; 関数3_1(age) return age; 関数1_2(sex)return sex; 関数2_2(sex)return sex; 関数3_2(sex) return sex; 関数1_3(sex)return no; 関数2_3(no)return no; 関数3_3(no) return no; あり・なしを比較するとこういうイメージなのですが
モノステートパターンを使う
>>4 Cはもう暫くするとマルチスレッド対応になるよ
テンプレート内の構造体の前送り宣言の方法がわからない struct Mytemplate<>::Mystruct; みたいなことをしたい
template<type t> struct Mytemplate<t>::Mystruct; でいけないか
>>122 gcc4.5.2(MinGW) + Eclipse CDTでimbueする事無く普通に表示されたぞ
多分入力コードが10進UNICODEになってるのがまずいんじゃないか?
UNICODEにしたら普通に表示された
getline関数で文末判定はどうすればよいのでしょう? while (fin.getline(addata[i].name,50)) { 処理 i++ } 行末ならgetlineで問題ないですが・・・
あなたが何をもってして文末を判定するかじゃないのかい
ファイルの最後と文末は違うぞ?
//sub.h// int check(){ int test; static int chk; test = チェック関数 ; if( test>1){chk++;} else{chk=0;} return chk; } ------------------- #include sub.h main(){ int chk1; while(){ if(check(check()==1){処理} } } とある処理が連続では実行されず、一度休むまで受け付けないという感じのプログラムです #include sub.h main(){ int chk0; chk0=check(); while(){ if(chk0==1){処理} if(chk0)>40){別処理} }} このよう変更するとstatic int chkの値が40を超えるとリセットされず無限に増え続けるようになります 何が問題なのでしょうか?
[チェック関数]が2以上を返すとchkがインクリメントされるのだから、[チェック関数]がおかしいんだろう。 それ以前にchk0=check();がループの外に出てるんだけど? それ以前にコンパイ(ry
関数checkは1回しか呼ばれていないのに増え続けるとな?
>>138 関数の仕様がおかしいんじゃね?
グローバル変数を使う位なら引き数要らないだろ。
つーか、グローバル変数を使う積極的理由がない。
例えば、関数1の中でageその他に触れたいなら、
・ageその他を構造体に纏めて参照渡しにする。
・ageその他を構造体に纏めてポインタ渡しにする。
・ageその他を構造体に纏めて引き数で渡して戻り値で受け取る。
の三択でいいよ。
なんでC/C++はスレッドライブラリが標準でないんでしょうか。 標準であればもっとわかりやすいと思うんですが。
152 :
デフォルトの名無しさん :2011/06/28(火) 17:11:45.53
環境に依存するから
0xでstd::thread入ったじゃん
boost::thread「ワイが面倒みてやるで」
最適化の抑制をどうすればいいのかわからん
156 :
デフォルトの名無しさん :2011/06/28(火) 17:48:55.47
文字列『0 1 3 1 0 3 2 1 3 0』みたいな変動するデータがあるとして それをsscanf系で配列に格納したいのですが スマートなコードの書き方ってないですか?
158 :
138 :2011/06/28(火) 17:50:45.96
>>150 確かにグローバル変数をつかっているのに引数はおかしな話でした。
まとめて渡すとなると
struct hito{
age
sex
no
}
struct hito eigyo[10];
関数1(eigyo)
関数2(eigyo)
関数3(eigyo)
ってイメージですかね
volatileって明確な言語仕様ないだろ
メモリバリアの問題もある
fopen("data\\data01\\data02\\00001.txt") 等のファイル指定の文字列を #define DATA_PATH "data\\data01\\data02" と定義して fopen("DATA_PATH+00001.txt")のような事をしたいのですが どうすればよいでしょ?
>>161 fopen(DATA_PATH"00001.txt")
163 :
161 :2011/06/28(火) 19:42:09.21
どもです
>>162 えっ
printf("hoge""fuga");
これはなぜ動くのですか?
"hoge""fuga"と"hogefuga"は同じ意味 printf("%d\n" "%s", 1, "a");とか改行してもいい
>>165 まじか、そうだったのか
ありがとうございます
マウスの位置を調べる時、判定がこんな感じだとします ☆☆☆△△△□□□□ ☆☆☆△△△□□□□ ☆☆☆△△△□□□□ ☆☆☆△△△×××× ■■■■■■×××× ■■■■■■×××× ■■■■■■○○○○ ■■■■■■○○○○ if(x<400) //中央の左右判定 { if(y<300) //左側の高さ判定 { if(x<200) { ☆; } //左上の左右判定 △; } ■; } 細かくなればなるほど、if文が増えてしまうのは仕方ないのでしょうか?
範囲をRECTで持っておいてPtInRect使え
169 :
168 :2011/06/28(火) 23:05:06.29
RECTとPtInRectを理解できました(思い通りの実行結果になってくれました) インターフェース関連のマウス位置はこれで範囲指定するのが定番なのかな・・・?
>>169 プラットフォーム、使用ライブラリ等でいくらでも変わってくると思われ
ダウンキャストってなぜいけないんです?
静的な保証がなくなる
文字列で 9000 50 700 3 を 0,9,0,0,0 0,0,0,5,0 0,0,7,0,0 0,0,0,0,3 と言う感じに桁を合わせる&分解にはどうすれば良いのでしょうか?(カンマは不要です)
sprintf
176 :
173 :2011/06/29(水) 04:43:25.89
シャワーを浴びたら、解決方法が思いつきました(駄目かもしれないけど) スルーしてください
これがゆとりか
構造体の引渡しについてですが、ネットで調べると大体こんな感じです。 struct ABC{ int x; int y; }; main(){ //↑メインより先に宣言しているからグローバル扱い? struct ABC bbb; func(bbb) { int func(struct ABC test) { test.x test.y } または int func(struct ABC *test) { test->x test->y } でも、構造体をグローバルで宣言しているからわざわざ引数にする必要が無いと思うのですが? グローバルでなくローカルで構造体を宣言した場合は引数として使えないようですし
構造体とインスタンスについて考えよう
>>178 構造体をわざわざ引数にする必要が無いっていうのはいいところに目を付けてるよ
それは、ただ作法的にローカルにしちゃってるだけ
型宣言を、ローカルに閉じ込めて置けないのが、痛々しい言語仕様だよね
C,C++みたいな中途半端な出来栄えの言語だとね、どう頑張っても完璧に組むのは不可能に近いから
誰がどういう説明していようと、そういうのは無視して
かきたいようにかいたほうがいい
特にC,C++を、初心者時代を超えても未だに使い続けている奴ってのは、頭がおかしいので
頭のおかしいソースコードで解説をしている事が多い
Web上にはそういうサンプルがとても多いので、だまされてはいけない そして、適当にある程度のところまで覚えたら
さっさとC,C++を捨てること
きちがい
はいはい天使天使
つか根本的になにもかも間違ってるから無視してやったほうがいい
構造体関数ってよーわからん 普通に func(){ bbb.x bbb.y } って使えるから
185 :
178 :2011/06/29(水) 09:05:01.17
構造体は同一ファイル内の関数なら利用可能だが 別ファイル(ヘッダーファイル等)の関数では利用できない 逆にクラスなら使える 素人はとりあえずクラスで定義しておけ って感じですか?
どこにそんなことが書いてあったんだ? structもclassもそんなに違わない 最初からついてるアクセス指定子がprivateかpublicかの違いだけ 構造体もヘッダで宣言すればincludeしたcppから使える
>>185 全く違う
class と structは
メンバと継承のときにpublicとかprivateとかつけなかったときのデフォルトが違うだけで他は全く一緒
(一応typeidしたときのname()も違うが)
188 :
178 :2011/06/29(水) 09:30:22.52
186 >構造体もヘッダで宣言すればincludeしたcppから使える cppで宣言した構造体を ヘッダーファイルで扱うのは無理なんですか? -----main.cpp----- void hoge3(strcut hoge hoge1) struct hoge{ int x; int y; } struct hoge hoge1; main(){ } hoge3(hoge hoge1){ hoge1.x hoge1.y } これは動作するのですが、hoge3()をヘッダーファイルに表記すると動作しなくなってしまって
いや動作してるわけ無いだろwwwwwww 適当なこと言うなしね
>>188 宣言が見えなきゃ使えるわけないだろ
複数のcppファイルから構造体使いたいならヘッダに宣言しとけ
動作以前にコンパイルできねーだろ。コンパイラ通さなくても一目瞭然にわかる。
192 :
178 :2011/06/29(水) 09:41:50.14
すいません 大体こういう感じで動いてるという意味です そのあたりは補完してください
cppとヘッダの話に便乗して、超初歩的な質問を cpp1つ。残り全部ヘッダファイル。じゃ駄目なん? ヘッダファイルとcppの違いがワカラン!
>>193 複数のcppにするのは分割コンパイルってのをしたいんだよ
それがどういうものかはググッてくれ
説明すると長いから
だぁかぁらぁ C++なんて捨てろっつってんだろ???????????????????? このあたりが滅茶苦茶なんだよ ゲームか何かが作りたいわけェ? C#やっとけよボケが 作法的にはこう ---------------------a.h------------------------- struct hoge{ int x; int y; }; void hoge3(struct hoge * hoge1); -----------------------a.cpp-------------------------- #include<stdio.h> #include "a.h" main(){ struct hoge h = { 0 }; hoge3( &h ); printf("%d %d" , h.x , h.y ) ; } void hoge3(struct hoge * hoge1){ hoge1->x = 33; hoge1->y = 44; } で、構造体の定義前に struct hoge hoge1 戸かやりたい場合は struct hoge; ← これで先に名前だけ押しておく必要がある
つまり、こう ---------------------a.h------------------------- struct hoge; void hoge3(struct hoge * hoge1); -----------------------a.cpp-------------------------- struct hoge{ int x; int y; }; -----------------------わかったか?カス------------------------- きいているのはC++のカスさのほう こうやって、「いちいち」 面倒な手続きをしなければならないのが C,C++
------と---り---あ---え---ず---お---し---え---と---い---て---や---る---け---ど------ で#includeについkて教えておくと C,C++で # のついてる奴はすべてがsプリプロセッサなんだよl? つまりコンパイル舞えに処理さレルってわけl つまり、rrrr #include "a.h" ってやったらsz a.h の内容が その場所に、コピペされるってこと ---------------------------------------------------------------------- ----------------理-------解-------し-------た-------?---------------------------
捨てろと言っている対象についてのスレに居座る不思議。 で、しかも書いている内容が自称年齢に見合わないほど古臭い不思議。
C++なんて捨てろといいつつ 拡張子以外全部C(笑)
>>199 C++を知らないんですよ。そっとしておきましょう。
C++なんて許されるのは19歳までだろ・・・・・ 20超えてもC++やってる奴は低脳 いつまで無駄なことを続けるんだか
そうだねー ApacheやUNIXやFirefox書いてる奴は低脳ですよね
DirectXやOpenGLも低脳さんがバインドしてくれるからC/C++いらないよね
>>202 そういう奴らはC++なんて使ってないんだよ
仕事で扱ってるだけ。おれもC++を仕方なく「扱う」時はあるよ。
なぜ仕方なく扱わなきゃいけないんですかねー? なぜリプレースしようとするプロジェクトが出てこないんですかねー?
はいはい天使
メンバ関数のオーバーロードって一種のポリモーフィズムになるんですか?
>>207 一般にはそれはポリモーフィズムとは言わないなぁ
そもそもただの関数だってオーバーロードできるしな
>>207 オーバーロードはオーバーロード
ポリモフは継承&オーバーライド
ポリモフってロシア人にいそうだな
オーバーロードをポリモーフィズムって説明してる人もいるよ・・・
オーバーロードがポリモー・フィズムってwww おまえほんとにオブジェクト指向りかいしてんのかおwww
>>211 カンタンに想像付くから怖い。
「〜はデザパタの一種と言えるでしょう」
「俺俺デザパタつくってみました」
「オーバーロードはポリモの一種」
不正確なもんを押し通そうとする力が怖い。
そういう細かい定義ばっかり気にしているからおめーらはダメなんだよ 本でも書くん? そうでないなら細かい定義はいらない 殆ど変わらない概念でも別物であるもので まだ名前のついていない概念にたいし、1個、1個、おれが付けていったら 明日から、数千個くらいIT用語増えるから覚悟しとけよ
初歩的な質問です int hoge[5] この時hoge[5]が空だったら、10を入れる、というif文をつくるとしたらどういう条件にすればよいのでしょう? 初期値としてhoge[5]={10};と設定するのではなく 全部入らない場合の配列の空きスペースをみつけて埋めるという処理がしたいので
例えばhogeに入れる値が負の値を取らないと決まっているなら、 hogeの要素全てにあらかじめ-1でも入れておいて if(hoge[5] == -1) hoge[5] = 10; とでもすればよろし。
C,C++で空 なんてのはねーんだよ NULLさえ実装されていない だから何らかの初期値を与えるしかな、 基本的にそれには0を使うのがベスト 0って数字もときより使う配列ならマイナス数値とかにして、「ごまかす」しかない Cなんてさっさとやめちゃえよ
>>216 構造体の配列だから入れてからだと面倒かと思ったのですが、普通にそうやることにします
>>215 std::vector<int> hoge;
if(hoge.empty())
{
}
というのは可能だ 参考までに
optional使うといいよ
> 全部入らない場合 よくわからん そもそもhoge[5]なんて存在しないぞ
それ以前に
int hoge[5]で
hoge[5]はねーだろそこを指摘しろよ
>>217 ぬるぽはC++では作られたろーがボケ
要素数決まってんだし足りるかどうかわかるだろ
ファイルの読み込みとかじゃね? MAXが5個で1〜5個で変動する プログラムって自分好みに作れるわけじゃねーからな 第三者のニーズに応えるためにあれやこれやたられば機能を拡張しなければならない こっちが「こういうプログラムなんでデータや形式はそれに合わせてください!」というなら楽なんだけどなwwww
hoge.txt りんご みかん ぱいなぽ ばなな ←最終行 ------- このテキストファイルを読み込んで配列データに格納して出力をする処理です int i; i=0; while(!fin.eof()) { fin.getline(data[i].[40],30); i++; } fin.close(); 4行目の『ばなな』まで配列も0〜3に綺麗に入っています ですが配列[4]に改行(?)データが入るのか、隙間が出来てしまいます どうすれば空データ(改行?)を回避できるのでしょう
んな基本的なことを聞いてしまうなら本を1冊買いなさい
i++のタイミングと条件判定
228 :
デフォルトの名無しさん :2011/06/30(木) 17:22:31.65
0の場合であっても0xとかつけたほうがいいのですか?
>>228 別にいらないけど付けたほうが分かりやすいっておもったら付けてもいいんじゃないかな
0-9のcharをint変換したいのですが、どうすればいいのでしょう? 今は-'0'で擬似的に数字扱いにして文字のまま計算しています (あいにく0〜9までの範囲しか使わない値なので)
文字コード依存だから正解はないよ
atoiで
わざわざ文字列用のバッファ用意するのか
>>234 要らないよ。
--
int val;
sscanf("5", "%1d", & val);
>>235 文字列になってるじゃねーかwwww
なにが「要らないよ」だよww
char型に入った文字の変換の話だよ?
>>237 だから要らないんだって。
char foo = '5';
sscanf(& foo, 以下略
応用が利かない奴はこれだから……
>>238 それは応用というより標準ライブラリの実装依存の邪道だろ。
>>240 動いたから正しいとか
Cでは通用しないんだよ
問題があると言ってる人は %1dの意味が分かってないんじゃないの?
sscanfの第一引数はnull terminatedじゃないとダメと思い込んでたが、 よく考えたら仕様で確認したこと無かった 誰か詳しい人教えて
scanfが悪者なんじゃなくて、 フォーマットの指示を正確にできてないプログラマが悪い、 っていう話をなぜか連想した。
とはいえ、 「仕様見に行かないと正しいか微妙」 な書きかたは避けたほうが無難では? まあ勉強のため、というのはアリだが 「こんなことも出来るんだぜ?俺スゲー!」 はやはり有害な思考かなと思う
だからCとか触ってる奴がバカだっていってんのに ほんとこのスレにいる分際のゴミ同士なかよくやってろよ
なんだその負け惜しみは。
uyが おきあがり なかまに なりたそうに こちらをみている! なかまに してあげますか?
イア 御免蒙る
>>251 まさかC++使える自分SUGEEみたいな?
そっかwwwwwwwwwwww っじゃwwwww一生C++やってろよwwwwwwwwwwwwwwww
>>254 え? もしかしてC++使えないのがコンプレックスなの?
C++バカは効率の悪さにいつまでたっても気づけナイ C++バカって言葉いいな 今度からそうよぼう だってバカの一つ覚えみたいなもんだし
プログラムの実行時間と開発期間を交換するのがC/C++
あらゆるプログラミングパラダイムを プロセッサ時間メモリ空間で最善になるようにかける言語 その次に大規模開発 最後に手軽さ
C/C++ではA〜Zなんかは連続していることは保障されてないが、 0~9については保証されてるな
ライブラリ多いじゃん (キリッ 本気でC++なんだね^^; 一生やっててください
yasai.txt キャベツ,100,10, じゃがいも,120,20, もろへいや,200,12, for(i=0;i<3;i++){ fin.getline(name[i], 20 , ','); fin.getline(kakaku[i], 20 , ','); fin.getline(kazu[i], 20 , ','); } このような感じに組むと2行目以降頭に”.”ピリオドが追加されます。 キャベツ,100,10, .じゃがいも,120,20, .もろへいや,200,12, 恐らくこういう処理になっている キャベツ,100,10,[] じゃがいも, ↓ []じゃがいも getlineで改行コード判定をしていても、改行コードは取り込んでいる?という理解ですが どうすれば改行コードを排除して2行目以降の先頭の文字列を読み取れるのでしょうか?
>>263 「キリッ」って。
茶化してるってことは、痛いところつかれて反論できないってことか。
>>264 kazu[]は本来数値だろ。カンマで切らず行末まで読んでatoi()すればいい。
配列のシフト移動(?)って可能なんでしょうか? int hoge[5]={1,2,3,4,5} を hoge[5]={2,3,4,5,0} や hoge[5]={0,1,2,3,4,} というプログラム
無理 自分でいちいち代入するしかない
int fuge[14]={0,0,0,0,1,2,3,4}; int (*hoge)[5];=(int(*)[5])&fuga[4];
char a[4]={'a','a','a','a'}; char b[4]="aaaa"; 配列aは問題ないのに、配列bは配列数を5個用意しろと言われるのはなぜ?
"aaaa"は {'a','a','a','a' '\0'}だから
∨∨∨∨∨∨∨∨∨∨ 「「「「「「「「「「「「「「 kazu[]は本来数値だろ。カンマで切らず行末まで読んでatoi()すればいい。 」」」」」」」」」」」」」」(キリッッッッ!!キリッッッッ!!!!ッッ!!!! ∧∧∧∧(キリ! ゴッミゴミだな
標準というからStringを愛用していているんだが、実は糞ライブラリ?
節子それ標準やない
Standard Template Library なんだから標準だろw
テンプレート?
main(){ char hoge[50]; } void strfunc(){ hoge[50]="aiueo" } 配列の値を変更して、メイン関数に反映させたいのですがどうすればよいでしょう? void strfunc(char hoge[]){ hoge[50]="aiueo" } 参照するだけならこの方法で問題ないという事は理解してます
問題ないわけないだろアホか
main(){ char hoge[50]; strfunc(hoge); printf("%s\n", hoge); } void strfunc(char hoge[]){ strcpy(hoge, "auieo"); }
メンバ関数とメソッドの違いって何?
コンストラクタってオブジェクト呼び出し時に実行されるけど そのときの引数ってどうやってるの?
4000バイト未満も文字列データの外部ファイルが4つあるとして 毎回fopenで呼び出して特定のファイルを出力するのと 一番最初にfopenで4データを呼び出して、staticな配列に入れておいて その配列を使いまわすのではPCの処理的にどちらが良いのでしょう?
オーバーフローって知ってる?
>>285 出力したいのか入力したいのかどっちなのかと
>>288 ファイルのデータをプログラム内で利用(出力?)です
>>285 いまどきのPCなら16Kのデータをメモリ上に保持する事なんて屁でもない。
そういう話じゃないでしょ
メモリの話になって今更どのくらい消費しているのかと気になったんだが ショボいプログラムでも55MBも使っていた・・・・ まっさらでウィンドウを表示させただけでも44MBって
どうせdebugビルドなんだろ
>>291 そういう話じゃないならどういう話だよ。
>>293 C++そのものをよく理解してないけどWin32で作っているのが問題っぽい
Windowプロシージャだっけ?あれでウィンドウを表示すると、それだけで数十MB喰われるって認識でいいのかな
コンソールで適当なのを組んだら動作させたら256kだった
なわけねーよ
(作り的に)しょぼいプログラムだから55MBくらいmallocしたんじゃね?
C,C++のゴミカスさがわかったんならさっさと捨てれば って何度もいっているのにバカは効率を理解しない
と、ゴミカスがほざいております
もう俺がゴミカスでいいから、宗教論争を終わりにしてくれないか
>>298 この人ってどのスレでもあたかも全てが敵であるかのように振舞ってるよね
統合失調症とかいうやつかな?かわいそう
すみません。 条件で分岐しながら進行して行く、シナリオ的なシステムを作っているのですが、 #define ROOT 12 // 上の処理を並列して12個同時進行 #define ACT 45 // 条件を満たした時に飛ぶ条件セット #define IF 12 // ACT1個あたりのifの数 #define ORDER 3 // IFを満たした時に実行できる命令は3つだけ #define VALUESIZE 32 // 命令文が抱える変数や文字列の格納用 BYTE root[ROOT][ACT][IF][ORDER][VALUESIZE]; // 合計622KB 現在こうしてtxtファイルからメモリに受け取って処理をしているのですが、 変数のサイズが気になって、不便な制約が増え、制約を超える為に変な仕様を追加して と悪循環になっています。 大元のデータは100KBすら無く、多くのメモリは無駄 でも使いたい所では足りない という事になっています。 どうすれば無駄なメモリを確保しまくらずに、個数制限をしまくらなくて良いプログラムにできるでしょうか・・?
mapとか、vectorで良いだろ。 たとえば、int a[1000000];があって、ほとんど不使用なのに確保するの事と同じだろ? そしたら、出現するデータペアだけ記録したらいい。mapなど。
>>303 ありがとうございます。vectorも適しているんですね。学習しなおして設計しなおしてみようかと思います。
(a,b,c)を例えば、100a + 10b + cとしたら一次元配列に入る。 それをSTLのvectorに入れたら、2分探索できる。 mapより省メモリになり得る。
あほがきた
307 :
デフォルトの名無しさん :2011/07/03(日) 22:02:37.05
bit長を調べるにはどうしたらいいでしょうか。 具体的には1024bitになるまで0をstring型変数に追加していきます。 str = str + "0" みたいな感じです。
>>305 sortしてからならbinary_search出来るが、mapやsetは内部データ構造が初めから二分木
(大抵赤黒木、実装依存)
map(a,b,c)=outputより、 vector(x,output) (x=100a + 10b + c) のほうが省メモリになり得る。
>>307 size_t len = str.length();
if(len<1024){
str.resize(1024);
std::fill(str.begin()+len, str.begin()+1024, '0');
}
エロいback_inserter()使おうぜw
312 :
デフォルトの名無しさん :2011/07/03(日) 22:48:34.02
<<310 ありがとうございます。ものすごく参考になりました。
>>300 宗教論争とかそういう次元の話じゃないじゃん
効率が違いすぎる
まず君、このC,C++が何年前に作られた言語なのか理解しているのか
それすら分からなかったらマジでゴミだぞ
>>265 マジでおまえ理解してないんだ
そうか、じゃあやっぱり一生C++やってろよゴミw
おまえの中ではそれが効率いいんだろ?w
おまえがそう思うんならそうなんだろうwwwwwwおまえんなかではなwwwwww
わかったか?ゴミ
>>313 では、C++の代用になるお勧めの言語はなんですか?
だから俺がゴミでいいから、空気を悪くしないでくれんか
C++しかできない( できてると思ってるだけの実際扱えてないゴミ ) が、多いのがネット上のC++コミュニティだからなぁ Boostまでいってる奴以外はゴミだよ
namespace ns { class C { }; void f(const C& c) {} } void g() { f(ns::C()); } がコンパイル通るのは仕様通りなのでしょうか。 それともgcc 4.5のバグでしょうか。
>>317 自己解決しました。
「Argument-dependent name lookup」
っていう言語仕様ですね。
ADLだな C++の汚い部分 慣れるしかない
320 :
デフォルトの名無しさん :2011/07/04(月) 21:58:14.42
Visual C++のRuntime 2005、2008、2010を入れようと思っています。 検索した結果、2005 SP1、2008 SP1、2010 SP1を発見しましたが、 ATL版を入れるべき という主張をあちこちで見ました。 同様に検索すると、ATL版も発見できたのですが、 本当にそれでいいのかいまひとつ判断がつきません。 よろしければご教示お願いします。
多重継承便利すぎ
そう思っていた時期が僕にも有りました
そんなあなたにインターフェースと実装を
doubleをifの条件式==で使いたい doubleは小数点以下の計算で微妙な誤差が出るっていうけど、 数値が整数のみになるように、整数のみで計算していれば誤差はでないんだろうか?
ならdouble使うこと自体が無駄だっていう
>>325 予め確保してある一つの変数を場合によってintとdoubleで使い分けたいんだよ
doubleを注意して扱えばintと同等に比較できるならそうしたい
共用体だと別の名前にしなきゃいけないし
>>326 intとして扱ってるときもdoubleと同じ方法の比較で、判定できるんじゃないの。
ある程度デカイ整数になると桁が足りなくて1足しても増えなくなるよ そこまでは整数と扱って問題ない
ある程度の桁数なら普通にズレずに使えるってことでいいのかな i=100.000004とかになると、 if(i==100)に引っかからないような気がして心配だったんだ ありがとう
>>330 それだと暗黙的にアップキャストされるから
if((int)i==100)とかでダウンキャストしないとだめ
>>324 >>330 変数の中に常に整数しか入ってないのか、少数もはいる場合があるのかよくわからん。
>>331 そうなのか……
でもそれだと今度は99,999996とかの場合に99になってしまいそう
>>332 整数のみの計算をしていても、誤差で少数になってしまう場合もあるのかどうか、ってのが知りたかったんだ
335 :
デフォルトの名無しさん :2011/07/05(火) 16:56:20.42
>>333 double に整数つっこんで加減乗を行っても誤差は出ない(一般的な実装なら)
10.000000004とかにはならないの
割り算は説明するまでもない
C++は異なる複数の型が混在する連想配列って作成できるのでしょうか。 mapとかはキー値とバリュー値の宣言をしなきゃいけないみたいですし。
boost::anyでも突っ込んだら
>>339 >>340 ちょっと調べてみましたがCで言うvoid型みたいなものっぽいですね。
テストプログラム書いてみます。ありがとう。
C/C++上でアクターモデルを実装する方法はありますか
配列操作で int b[5]={3,4,5,6,7} int a[2]={1,2} int ab[10]; から ab[10]={3,4,5,6,7,1,2} //残りは空 といった感じに配列単位で詰め込む事はできないでしょうか? 1つずつ取り出して、1つずつ入れるしか無い・・・?
memset(ab, 0, sizeof ab); memcpy(ab, b, sizeof b); memcpy(ab + sizeof b / sizeof *b, a, sizeof a);
>>343 すごい。やっぱ知ってる人は知ってるんだな。
これって副作用については自己責任なのかな。読んでみます。
ありがとう。
>>346 知ってるのはオレじゃなくてgoogle先生。
googleはなんでも知っている。そう、あなたの尻の穴のシワの数まで
これ ; デリミタっていうんだけどさ、これをつけなきゃエラーになるような そんな言語使ってる奴ってどうみてもゴミだと思うんだけど もしかして「;」これ打ち忘れてコンパイルエラー出すのが楽しいの? そうか、二度と話かけんなよ ゴミだな
sinxとcosxが分かってる状況でxが分かる関数ありませんか? 画像が移動する向きに向かせたいのに、加速度・速度をx,yに分解したら画像の段階にきてしょんぼりだった…
逆三角関数でぐぐれ 逆関数自体は高3あたりの内容だろ
義務教育じゃないし仕方ないよね
>>351-353 ああ、逆関数…そうか
arcsin arccosは習ってなくともちょうど高3で逆関数は習ってたところだった
逆関数の意味をもうちょっと深く考えるべきだった、感謝です
クラス名やメンバ関数は頭文字は大文字で書く習慣でもあるの?
慣習?
>>356 ああそうです
最初規則と書いていたけど
違うなと思って書き直しても間違ってた
統一感あったほうが気持ちいいし間違えにくいから 同じライブラリやプロジェクトとかでは揃える 仲間内での約束みたいなもん
int b[5]; これをたとえばb[2]を削除してそれ以降のを詰めていくにはどうしたらいいですか? 本当はint型じゃなくて自分で定義したクラスです
swap(b[2],b[3]); swap(b[3],b[4]);
>>355 キャメルとかパスカルとかスネークとかでググれ
swap... こうやって糞コードが増えていくんだな
すみません。 SubCommon.hに書いた構造体の宣言 struct DATAPACK { int t; }; これを DataManage.hで #include "SubCommon.h"してから struct DATAPACK datapack_A; と実体を作ろうとすると、定義されていないと警告が出ます。 不可解な事にほぼ同じ事を別の2組のヘッダーで行うと問題なく実体が作れるのに なぜ未定義となってしまうのでしょうか? うっすらでも思い当たる事が有ればご指摘頂けますと幸いです。
当たり前だのクラッカー
>>363 実はインクルードされてないのでは?
インクルードガードが邪魔してるとか。
366 :
363 :2011/07/08(金) 14:04:46.92
>>365 あー・・多重インクルード防止によって展開がされていないんですね・・。ありがとうございました。
Cというか、プログラムの基本中の基本の質問だけど 10より↑か↓かの処理で if(i<10){ 10未満だよ; } if(i>10){ 10以上だよ; } と if(i<10){ 10未満だよ; } else{ 10以上だよ; } 前者は以下のチェック→以上のチェック。 後者は以下のチェック→それ以外ならの処理 どちらも同じ動きをしてくれると思うのですが、条件は2分岐の時 ifを2つとif、else。どちらが処理が早いのでしょう? イメージ的にはifが2つのが理解しやすいのですが、if文=処理が重いという先入観がありまして 処理速度はelseとifで大きく変わるものですか?
368 :
デフォルトの名無しさん :2011/07/09(土) 11:11:39.67
そんな差はどうでもいい
370 :
デフォルトの名無しさん :2011/07/09(土) 11:15:27.85
無意味に速度を気にしだした初心者の臭いがする 余程のことが無い限り、速度の為にわけの分からない表記にはしるのはよせ そしてそれをやるなら実測結果とかに基づいて行え
371 :
367 :2011/07/09(土) 11:22:52.93
>>370 >無意味に速度を気にしだした初心者の臭いがする
まさにその状況に陥ったので質問しました
わかりやすさ重視にしておきます
>>371 プログラマとしてやっていくなら、死ぬまで有効な格言を教えよう。
KISS。これはどこまでいっても役に立つ。
80:20規則は小学校で必修にするべきだと思う そうすれば日本人もくだらない無意味な節電なんてやめられる
374 :
デフォルトの名無しさん :2011/07/09(土) 11:27:35.33
377 :
デフォルトの名無しさん :2011/07/09(土) 11:48:10.26
>>376 それは嫌ですが
このあたりで止めにしましょう
この話題はこれで終了ということで
ポインタ、配列関連の質問なのですが、 #include<stdio.h> void main() { int i; char a[20]; for (i=0;i<=9;i++) { scanf("%c%*c",&a[i]); a[i+1]='\0'; printf("%s\n",&a); } } これのchar型配列をNULLで初期化する意味を教えてください。
____ . / \ / _ノ '' ⌒\ / (● ) (● ) \ | :::::⌒, ゝ ⌒::::| そんなカリカリすんなよ まったく \ `ー=-' / ⊂⌒ヽ/ ヽ /⌒つ \ ヽ / ヽ / \_,,ノ |、_ノ
>>377 あ?逃げてんじゃねーよ
切腹だ切腹。はやくしろ
みんないつもお前には迷惑してんだよ
>>378 >char型配列をNULLで初期化する
この表現がよく分からないな、詳しくたのむ
> printf("%s\n",&a); おかしくねーか?
printf("%s\n",a); こっちやな
>>367 >>371 わかりやすさ重視ってif二つを採用するんじゃないだろうな。
if二つのほうは、二つの条件を見比べて、かつ最初のifの中でiが変化してないって
確認しないと排他条件になってるって理解できないからわかりにくいぞ。
つーか、iが10のときの振る舞いが違ってしまっている。「以上」なら>=にしないと。
>>384 2つの条件以上増えないと確定しているならif2つよりelseのが分かりやすいが
暫定的であって今後条件が3つ4つと増える可能性があるプログラムなら、ifを2つにしておいたほうが拡張しやすくね?
if (cond) { … } else { … } を if (cond) { … } if (!cond) { … } と書くのはちょっとないわ。
同じ変数使いまわすときとか?
if(a==b) { doSomething1(); } else if(a>b) { doSomething2(); } else { doSomething3(); } この対称性の無さがイラつくから if(a==b)
{ doSomething1(); return; } if(a>b) { doSomething2(); return; } if(a<b) { doSomething3(); return; } って書いちゃう
>>387 は、上はTRUEの時フラグを書き換えてもelse以下は実行されない、
下はTRUE内でフラグを書き換えるとそれ以降の文が実行される可能性がある
どっちも使っても問題ない書き方だけど、実行結果として差が出たりするし意味合いが違うから、
ifとelseの代わりに使うものではないなぁ
クラスによっちゃ!だって無視できるコストにならないかもしれない だから書かなくて済むなら極力書かないほうが良い
どうしても書きたいなら else if で書けばよいのですね わかりました ありがとうございます
そして無視される385w そこは本当に大丈夫か?
些細なことで揚げ足を取るの二夢中になって本質の議論をおろそかにする。バカの典型例ですよね
memo.txt aa,10,12,10, bb,11,22,20, cc,22,10,11 char hozon[30][3]; ifstream file("memo.txt") while(file.eof) { file.getline(str,sizeof(str), ','); hozon[i]=str; i++; } テキストから文字列を読み取って、それを配列に格納する処理をしたいのですが 改行まで行くとそこから先に進みません どうすればよいのでしょうか?
>>397 < while(file.eof) {
< file.getline(str,sizeof(str), ',');
---
> while(file.getline(str,sizeof(str), ',') !=file.eof) {
int a[10]; a[5]=1; a[3]=9; int a[10000]; a[500]=1; a[300]=9; データの処理速度やメモリの使用量に違いってあるんですか? 試しにa[10000]みたいな宣言をしたけど処理がガクっと落ちたり、消費メモリ量が跳ね上がったりする事はなかったもので
>>399 実際どういう処理を記述したのかが分からないから確かなことは言えないんだが
仮想メモリという仕組みがあるので、大きな配列を確保しても確保しただけじゃタスクマネージャ等から確認するようなメモリ消費量は増えないことがある
もしくはint a[10000]で跳ね上がらないとか言ってるから
それが通常40KBほどでしか無いほどを理解してないとか
仮想メモリじゃなくて仮想記憶とか仮想アドレスだ 仮想メモリじゃOSのメモリ内容退避する機能ばっかでてくるわ
>>399 大きな多次元配列を用意して
下位の次元を内側にしたループ
上位の次元を内側にしたループ
これを比較してみると全然速度が違うことがわかるよ
つか
>>367 って同じコードじゃないよね
i=10で死ぬ
どうでもいい
駄プログラマに多いよね 本質を理解できず、重箱の墨についてひたすら気にする奴って 367の要件から 10の判定が重要で、それについてあれこれ会議するのか 10の判定は仮定のデータであり実際にはどうでもよくて、ifの処理速度が要件の肝であるか
そうして上級プログラマー様は後々何故そうなっているのかが分からなくて保守できなくなるコードを書かれる訳で。
例え話の例えにツッコミを入れ続ける馬鹿は 駄、上級プログラマー関係ない ;が無い。スペルが間違っている。()が足りない。 こういう奴は根本的に一緒に仕事したくないw
なんで仕事前提なの? 仕事でプログラム書かなきゃいけない人は好き好んでこんな所見てないでしょ ちなみに俺は趣味グラマ
>>411 保守
仕事
趣味
レスのルーチンを理解出来てないな
プログラムより日本語を勉強した方が良いな
趣味で保守をする趣味グラマさんって・・・
414 :
デフォルトの名無しさん :2011/07/10(日) 14:03:07.79
半角スペース区切りのファイルから読み取って クラス内の変数に次々代入ってどうやるの?
羅列できないから無理だよ
>>415 そうなんですか
ありがとうございました
>>414 ん?普通にやればいいんじゃないかと思ってしまうんだが、
特別な用件でもあるのだろうか?
419 :
デフォルトの名無しさん :2011/07/10(日) 16:18:01.49
scanfで整数の入力をしています ところが、アルファベットを入力してしまうとバグってしまいます 指定した型以外が入力された場合に、入力に戻ってもう一度入力させるには どうしたらいいのでしょうか?
整数かアルファベットか調べてアルファベットならループすればいいよ
scanfは指定した型以外が入るとキーバッファそのままで 返ってくるから、自分でフラッシュしないとならない まあscanfは勉強の間だけ使うんだろうから代替を進めたりはしないでおくか
data.csv 1,谷,40 2,鈴木,32 3,佐藤,170 ・ ・ ・ 100,内藤,341 内藤のデータを呼び出す場合、1行ずつ総当たりするしかないですかね? もしくはデータに規則性を持たせて、1行のデータ量を均一にして 001,谷[][][][][][],040 seekで飛ばすというのも有効なんですが?(思い浮かんだだけで実際には組んでいません) データベース等大掛かりなものでなく、プログラムで簡単に操作できるのか 簡単にすませるつもりなら、データを整えた方が圧倒的に楽なのか 意見を〜
そりゃ1行ずつだね。 全部いっぺんに読んで内部で配列やリスト、ハッシュにしておくこともあるけど。 DB覚えると何でもDBに入れたくなるよ
DBは遅い。
遅くても手軽に済ませたいならSqliteつかえ。 データ格納方法とかを自作する必要がなくなる。
>>422 たとえばcsvが一ギガでメモリに全部載せるのが難しい場合は、
全文検索のようにしたらいい。
>>425 大規模なデータベースでなく、CSVに毛が生えた程度の小規模のデータ郡を扱うなら
STLのLISTを駆使しろって事なのかな?
>>428 速いっていってもこれ要素追加のみの話、どっち使うべきというほどの結論にはつなげられないんじゃないかな
せいぜいDBめちゃめちゃ遅いと思ってる人に、そうでもないよって言えるぐらいの意味しかないんじゃない?
>>429 DB最速のメモリベースとの比較。普通のファイルにしたら遙かに遅い。
DBって言えば、ソートがよくわからない 1次元配列的なソート関数ならわかるけど、多次元配列のソートになるとよくわからない キー 品名 価格 在庫数 品名は数値で表す 1 1(きゃべつ) 200 1000 2 2(レタス) 100 2300 3 4(トマト) 140 3200 4 3(きゅうり) 142 3000 5 5(だいこん) 242 3000 こんな配列で yasai[5][4]={ {1,1,200,1000} {2,2,100,2300} {3,4,140,3200} {4,3,142,3000} {5,5,242,3000} } 価格でソートという方法が良くわからない
スクリプトで動作が遅い、同時アクセスがある場合はデータベースに丸投げしたらいい。 C/C++が扱えるならなるべく工夫しろって事。
>>430 いやファイル版との比較もあるよ
15倍程度になってる
>>430 STLのlistと比較するならオンメモリで妥当じゃないのか?
SQLiteのオンメモリは、使い終わった後で保存できるの? 保存時に別データベースをオープンして全データ流し込むの?
ゲームのセーブ機能をつくろうとしているのですが 設計をどうしたら良いか悩んでいます class ISprite {
439 :
デフォルトの名無しさん :2011/07/10(日) 21:34:18.16
メモリ上の値全部保存しちゃえ
441 :
438 :2011/07/10(日) 21:50:15.08
Tabキー押しちゃったら間違って書きこんでしまいました・・・ スプライトは種類ごとに32bit整数のタイプIDを持っています。 セーブするときは種類を示す文字列に変換し、 ロードするときは文字列をタイプIDに変換させたいのですが 連想配列2つ用意しておいて、起動時にID、名前、関数ポインタの3つを登録すれば いいかな、とは思いますが、何だか変な設計のような気がして ・タイプIDから文字列とスプライトを作成する関数のポインタを取得する連想配列 ・文字列からタイプIDを取得する連想配列
>>441 悩んでいる所をつかめているか分からないからボヤっとした回答だが
・boost::serializationとかでシリアライズする
・cvsとかに変換テーブルデータ書いておく
・データが乱雑になってきたらsqliteとかで管理する
とかの方法もあると思うな
443 :
442 :2011/07/10(日) 22:06:45.99
cvsとか何だよ俺バージョン管理システムかよ csvだよ
どんなデータを記録したいのかで千差万別。 シムシティと、RPGでは違うだろ。
445 :
438 :2011/07/10(日) 22:31:38.03
セーブの殆どの部分はyaml-cppでやっています。各クラス固有のデータを保存する部分は出来ていて、 悩んでいる部分は「名前から各クラスのインスタンスを作るときの方式」です。 連想配列じゃなくて、配列使った線形探索ならできそうなのが分かったのでこっちにします・・・ class ISprite { E_SPRITE_TYPE getType() const { return EST_IMAGE; } } class CSpriteManager { void addSpriteType(int type, char* name, FACTORYFUNC_T func) { // 種類を追加 Types.push_back(SSpriteType(type, name, func)); } ISprite* createSprite(const char* name) { // 線形探索で一致するものを探す } char* getSpriteName(E_SPRITE_TYPE type) { // 線形探索で一致するものを探す } array<SSpriteType> Types; }
とあるサイトで typedef struct { char name[256]; int age; int sex; } People; こんな記述を見たのですが、 PeopleのPが大文字になっているのは何か理由があるのでしょうか?
クラス名は大文字で始めるという、そのページのルールなんだろ。
>>446 なにか意味を考えるとしたら
ユーザー定義型を区別するため
C++ や Javaでのクラスでの一般的なつけ方を使った
とかかなぁ
mapを有効利用できるケースを教えてくれませんか? ペア型(キー,値1)の紐付けじゃ、1次元配列でよくね?と思ってしまうわけで キー,値1,値2,値3,みたいな運用ができれば重宝したのに
struct value { val1 v1; val2 v2; val3 v3; } ; map<key, value> m;
>>449 むしろそういう使い方の方が一般だと思うよ
452 :
449 :2011/07/11(月) 21:44:39.50
>>450 ,451
言われてみれば
2番目を配列にすればよかっただけだった。
どもです
超初心者だけど mapって総舐めでアクセスするんだっけ struct hoge{ int aa; int bb; char cc; int dd[10]; }; hoge datalist[1000]; データ数が変更されないリスト表的なデータなら 構造体の配列要素をキーにしたほうが扱いやすくね?
std::map<int,boost::tuple<int,char,std::string>> などという手もあるぞ
>>454 だいたいは二分木使って実装されてるでしょ
赤黒木やな大体は
A*探索って、ダイクストラのコストの小さいノードから確定して接続ノードを展開していってるのを、 現在の「コスト+ゴールまでの予想コスト」の小さいもの。に置き換えた版ってことであってる?
char a[3][20] char b[2][20] a[0]="00" b[1]="00" if(a[0] == b[1]){ } このif文が成立しないのですが何故でしょう? %sで確認すると 00 と 00 で同じ %dで確認すると微妙に違う値(220341 220752 みたいな感じ) atoiで数字に変換してから比較すると 0と0 でif文がちゃんと動作 厳密にはchar配列に直接文字列を書き込んでいるのではなく、代入で”00”を入れているので若干動作が違いますが %s上は同じ文字列なのに%d(int)で調べると値が異なるというのがわかりません。配列の大きさも同じなのに
a[0]="00" b[1]="00" はスタック上の違う場所に"00"って文字をつくって、そのアドレスを突っ込んでるから。 アドレスが違うので違う。
>>459 strcmpって知ってる?それがなんの為にあるとおもってんの?
>>461 知りません。
が、調べたら単純な2つの文字列比較strcmpで対応すれば間違いは無さそうですね
if(strcmp(a[0],b[1])==0)
{
}
で正常に動作しました
ん。スタック上ってのは嘘だったかも
それ以前の問題だろ 教科書やり直してこい この馬鹿にちゃんと指摘してやれよ 説明面倒だから俺はやらんが
std::stringを知ると幸せになれる人種
if(a[0][0] == b[1][0])でご期待通りに動く
てゆーか代入の時点で問題あるだろ
a[0]="00\0"; b[1]="00\0"; こうだよね☆(ゝω・)v
いやー。ネタなのかマジなのか本気で悩むわw ネタだとしても意味わかんないし(汗
>>469 の場合\0の後にももう1個\0つくの?
つくよ
すみません。すごく基本的なことではまってるので教えてください。 1 2 3 4 という中身の2行のファイルがあって、標準入力から下記のループで読み込みます。 for(;;) { int a,b; if(!cin) { break; } cin >> a >> b; cout << a << " " << b << endl; } すると、下記のように余分に1行出力されるのですが、こういう場合、普通はどう書くのでしょうか? $ ./hoge.exe < src 1 2 3 4 3 4 環境は cygwin の g++ です。
これは int a,b; for(;;) { cin >> a >> b; if(!cin) break; cout << a << " " << b << endl; }
cinとかつかったことないから良くわからないが。その出力からしたら
>>476 でいけるはず。
>>475 二行目の4がbに入るループの終わりではまだcinに改行が残ってる
その次のループでcinはまだ終端ではないのでif文はスルーされる
cinは失敗するが改行は読み込むというか読み飛ばす
a, bには前のループの値のままなので3 4が出力される
cinはもう終端なので次の周のifでbreakされる
とある値が変わってなければ前回と同じ結果で良いという関数があったとして 全てのデータの型をstaticにして 最初に前回の数字と同じだったらスキップするという感じのif文で囲ってしまうのと 同じでも毎回同じ処理をさせるのとどちらがよいのでしょう? 根拠は特にないのですが、staticだらけってのはなんかダメというイメージが・・・ 処理内容は200個未満の配列要素をifったりforしたり その結果でちっちゃなファイルからデータを読み取って反映させる程度です
>>481 staticがよくない理由は
マルチスレッドで対策なしで使うと値が無茶苦茶になることがある
同じ物を代入したのに結果が変わる関数を作れるので、これはあまりよくないとされる
(関数を呼び出した時の引数だけじゃなくて、前回どう呼び出したが関わってしまい面倒といった感じの理由で)
なので、マルチスレッドで使わないというなら
その使い道は別に構わないのではないでしょうか
どっちにすべきかの話をしてるなら内容次第なのでなんとも
そんなのatomicにすればいいだけの話のような・・・ クリティカルセクションとかmutexとかセマフォとか
それが対策ってことじゃん・・・・・・ 用語だけでも添えておけということか
いやそうじゃなくてマルチスレッドで対策なしという前提がおかしいって
そちらこそ大丈夫ですか?
大丈夫です 心配してくれてありがとう
PGの9割はアホという統計が出てる
職業プログラマはね
アマは10割だしな
アマというか趣味グラマはそうでもないぞ 好きでやってるからな 6割くらいだろう
もっといい仕事選べばよかったのにね。アホ過ぎる
日本の職業プログラマ60万人のうち6,7割は、ちょっとできるレベルの アマプログラマに負けてるレベル。
重要な産業なのに待遇最悪で教育もてんでダメとか日本終わってるよな
497 :
デフォルトの名無しさん :2011/07/13(水) 14:35:27.87
C流のクラスの配列は非推奨ってあったんだけど何で?
datalist[4]; 0 1 2 3 4 0001 岩手 100 C エカ 0002 福島 70 E トチト 0003 栃木 60 D サクケ 0004 東京 500 A カカカ こういう感じの項目が綺麗に整っているデータでなく 0001 岩手 C エカ 100 0002 福島 E 70 トチト 0003 栃木 サクケ 60 D 0004 東京 500 A カカカ 完全ランダムではないが、データの配置が数パターンに分かれているとき どうやって扱えばいいのでしょう? 案1 if文 3番目が〜だからdatalist[2]でなく[3]に入れる。 といった感じで条件でデータの値を調べつつ読み取る 案2 読み取りリストを用意する 岩手 0,1,3,4,2 福島 0,1,3,2,4 栃木 0,1,4,2,3 東京 0,1,2,3,4 東京だったら、読み取りリストにアクセスして参照しながら取り出す 元データ数と同じ分だけリストを入力しなければならない。 データ数は300以下。パターン数は6前後(データの項目数は勝手に増減しない)
>>498 例を見る限り、数字、英字、カナで判別出来そうだが。
>>499 実際にはもう少し横に項目数があり、数字で別データもあるという感じでお願いします
501 :
デフォルトの名無しさん :2011/07/13(水) 20:53:16.92
正規表現
よめねえよバカ 読めるように間違えろ!
>その巫山戯た どういう文字列を変換したのか予想がつかないw みざんぎ?
巫山戯ろ
御巫山戯(おふざけ) ふざけんな!って言葉自体良く使うが、漢字の書き方は初めて知ったw
フザケロ フザケル 御ふざけ でないじゃん
え、中学生レベルの知識でしょ…… 「流石」と同じレベル
mapで配列、または構造体の使い方がわかりません int Numdata[10]={1,20,30,40,500,6000,700,800,9,} struct Kouzo{ int a; int b; char c; char d[10]; }; struct Kouzo Kouzoutai[5]; main{ using namespace std; //その1 map<int ,int[]> map1; map1.insert( map<int, int[]>::value_type( 1, ??) ); //その2 map<int ,vector<int>> map1; map1.insert( map<int, vector<int>>::value_type( 1, ??) ); //その3 map<int ,struct Kouzoutai> map1; map1.insert( map<int, struct Kouzoutai>::value_type( 1, ??) ); //その4 map<int ,struct Kouzoutai[]> map1; map1.insert( map<int, struct Kouzoutai[]>::value_type( 1, ??) ); } 配列や構造体のデータをどうやってinsertすればいいんでしょ?
std::pairって知ってる?
>>510 map1[1] = Numdata;
map2[1] = vector<int>(Numdata, Numdata + 10);
mapで配列や構造体を使うならコピーコンストラクタの書き方と参照カウンターを覚えようぜ。
なぜここで参照カウンタ?
二乗三乗の指数計算をPOW(だっけ?)を使わず int型のまま処理する方法ってありませんか? for(i=0;i<4;i++) { 5x10^i }
ループすればいいじゃん
int ipow(int a, int n) { if(n==1) { return a; } if(n==0) { return 1; } return a * ipow( a, n-1); }
>>518 再帰を使って自作の指数関数ってわけですね
再帰って処理を追う事はできても、自分で有効活用できないんだよな・・・
まあ無理に使わなくてもほとんどループで何とかなるしな
処理速度も変わらない(下手すりゃ遅くなる)からな でもコードをシンプルにできたりすると「スゲー」と思う 分かり難くなる場合もあるけどw
末尾再帰は、コンパイラによってはループに最適化される。
523 :
デフォルトの名無しさん :2011/07/14(木) 15:35:43.35
PSGのような電子音をC++で作って制御したいのだけど どこか参考になるサイトはありますか?
それはコンパイラによるだろ。 return a * func(); をループにするのは return func(); をループにするのとでは訳が違うぞ。 前者は中間コード上は tmp1 = func() tmp2 = a * tmp1 return tmp2; となり、単純な末尾再帰として解決できない。 そこまでコンパイラががんばるかどうかは調べないとなんとも言えんよ。 gccとかvsはやってくれるとは思うけど。
>>523 AY-3-8910などを繋いで制御するって事?
526 :
デフォルトの名無しさん :2011/07/14(木) 16:05:20.10
>>525 あ、違います。効果音をプログラム内で賄いたいなと。
さすがに音は環境依存なので、環境わからんと・・・
528 :
デフォルトの名無しさん :2011/07/14(木) 16:14:00.69
環境かー難しそうですね。 ちょっと調べてみます
だめだこりゃ
#include <windows.h> void main(void) { ::Beep(3000, 500); ::Sleep(200); ::Beep(4000, 200); ::Sleep(200); ::Beep(4000, 200); } ネットで見つけました。 周波数や長さを独自で調節するにはどうすればいいのかわからない。 windowsです。
533 :
デフォルトの名無しさん :2011/07/14(木) 18:16:53.58
Cで出来てC で出来ないことってありますか?
すみません、なんかプラスが消えました 「Cで出来てCぷらすぷらすで出来ないことってありますか」です
テスト C++
こういう初期化 int a[100] = { [1] = 10, [2] = 100 }; struct { int x; char b; } = { .b = 'c' }; void *から他のポインターへの暗黙変換 void *a; char *b = a; <= C++ではエラー
>>537 Cだとその初期化ができるのか〜
それができず、今から覚えるならC#のが楽だろ?と思っているぐらい。
C#は触ったことないけどww
それはCであってCじゃないけどな
C++0xにはC99のdesignated initializersは入らないんだよな
>>537 変数名が抜けてた。意味は通っただろうけど。
struct {
int x;
char b;
} a = {
.b = 'c'
};
designated initializer は初めて見たとき、次のような定義 void foo (int a, int b) {printf("%d,%d\n", a, b);} struct foo_args { int a; int b; }; void _foo (struct foo_args *args) {foo(args->a, args->b);} #define foo(...) _foo(&(struct foo_args){__VA_ARGS__}) を使ってキーワード引数もどきが出来るな、と思った func(.a=1,.b=2); func(1,2); // こっちでも呼べる もちろん使った事は無いが
543 :
デフォルトの名無しさん :2011/07/15(金) 15:46:40.63
リスト便利すぎwwwwwwwwwwww 何が問題なんだよwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
mapもlistも使ったことない 全て構造体配列で対応している for(i=0;i<参照リスト;i++) if(商品[0]==参照リスト[i]) { } find?イラネ
listはvectorで十分な場合も多いが、mapはすごく良く使うがなぁ まあstd::mapよりboost::unordered_mapのが良く使うが
find()ですむところをループで回してるのはふつーにダメだな。
>>546 それ気になっているんだけど
ループで
1,2,3,4,5・・・・と上から順番に検索していくのと
findで先頭から調べるのって、内部処理は一緒じゃねーのか?
違うの?
>>547 理論上はfindの計算量オーダーは
配列をバイナリーサーチならO(log N)
ツリーマップなら O(log N)
ハッシュマップなら O(1)
だが線形探索はO(N/2)
この差はサイズが大きいほど顕著に現れる
privateな関数もなんらかの方法で関数ポインタにアドレスを教えてやれば 別クラスから実行できちゃいますか?
>>548 言われてみりゃ〜
みつかった時点で処理が終わるfind
1つ目の要素だとしても最後まで調べてからでないと処理が終わらない全サーチ
10個程度ならまだしも、1000、10000と数が増えると
何度もサーチする必要が出てくる構造となったら無視できなくなるな
>>549 std::function<void ()> func = std::bind(&test::プライベートなメンバ関数名, インスタンスへのポインタ);
>>550 そもそも、仮に効率が同じだとしてもループの中身を見ないと検索していることが分からないだろ。find()なら間違いようがない。strcpy()なんかを使うのも同じことだ。
超初心者時代 他人のソースを見てもMAPの初期設定がよくわからなかったな 下準備という点では配列でループを組んだほうが遥かにわかりやすい 検索データ数が50未満の初心者のお勉強という低次元の話だけど
>>551 bindとか使うんですね。。さらっと流してたけどいろいろ出来そう
ありがとうございました
a[i++] = i; は未定義って規格にも注釈があるけど、 a[i] = i++; a[i] = func(i++); a[i++] = i % 2 ? 0 : 1; j = i++ + i; こんなのも全部未定義でしょうか?
a[i++] = i % 2 ? 0 : 1; これだけ未定義じゃない
a[i++] = (j = i % 2) ? 0 : 1; って書くと大丈夫じゃないような気も。いや気のせいか?
要は左辺で++したりする変数が、右辺に出てきちゃったら未定義だったかと。 たとえカッコでどうしようとも。
×◯◯×じゃないのか?
ああそうだね。?:演算子も副作用完了点だ。
××××じゃないのか? ×××◯じゃないのか? ××◯×じゃないのか? ××◯◯じゃないのか? ×◯××じゃないのか? ×◯×◯じゃないのか? ×◯◯×じゃないのか? ×◯◯◯じゃないのか? ◯×××じゃないのか? ◯××◯じゃないのか? ◯×◯×じゃないのか? ◯×◯◯じゃないのか? ◯◯××じゃないのか? ◯◯×◯じゃないのか? ◯◯◯×じゃないのか? ◯◯◯◯じゃないのか?
おまえマジで暇だな
567 :
563 :2011/07/16(土) 12:31:58.56
> a[i++] = i; は未定義って規格にも注釈があるけど、 a[i] = i, i++;
>>567 a[i] = (i, i++);
こうするとやはり未定義か。括弧で評価順は変わらない?
570 :
563 :2011/07/16(土) 14:48:48.27
> a[i++] = i; は未定義って規格にも注釈があるけど、
int j = i, a[i++] = j;
>>569 は a[i] = i++; と同じじゃないか。
>>568 は int j = i++, a[i] = i; の可能性もあると。
572 :
563 :2011/07/16(土) 15:12:26.70
そうか、訂正して修正
>>568 は int j = i, a[j] = ++i; の可能性もあると。
>>563 もう、いいから引っ込んでろ。痛々しすぎる。
574 :
デフォルトの名無しさん :2011/07/17(日) 11:40:17.96
スコープに関して そのブロックで使われなくなった時点で破棄されるのか ブロックを抜けるときに破棄されるのか知りたいです
575 :
デフォルトの名無しさん :2011/07/17(日) 11:42:08.82
STLの使い方について悩んでます std::list<MyClass*> mylist で行こうか、 std::list<MyClass> mylist で行こうか。。 前者なら MyClass * p = new MyClass(); mylist.push_back(p); std::list<MyClass*>::iterator it = mylist.begin(); delete (MyClass *)(*it); みたいな流れで、作成、削除ができるけど、後者だとどうなるのですか? MyClass * p = new MyClass(); mylist.push_back(*p); std::list<MyClass>::iterator it = mylist.begin(); delete (MyClass *)&(*it); //←じゃないよね。これだとコピーしか消せないし delete p; //結局pが含まれるスコープで消すしかない? アドバイスください
>>574 ブロックを抜けるとき
>>575 後者はdeleteいらないnewする必要もない
MyClass a;
mylist.push_back(a);
これだけでいい
577 :
575 :2011/07/17(日) 12:03:11.39
>>576 ありがとうございます
後者を選択する場合、実体のコピーをリストに作るという思想の設計なのでしょうか?
また、取り出して値を参照したり書き換えたりする場合はどのようにすればよいのでしょうか?
MyClass & ra = (*it);
ra.x = 100;
ra.y = "abc";
みたいにやるのですか?(コンパイルできるかどうかはわかりません。机上で考えて書いてます)
連続で質問してすみませんがよろしくお願いします
>>577 それでもいいけど
it->x = 100;
it->y = "abc";
でもいける
STLはオブジェクトの複製を格納する (*it)は複製されたオブジェクトへの参照を返す もとのオブジェクトとは関係ない
580 :
575 :2011/07/17(日) 12:17:05.08
>>578-579 なるほど!ありがとうございます!
STLの使い方わかってませんでした。。
Cを経由せずにC++を学んだにおいがするな
582 :
575 :2011/07/17(日) 12:32:09.67
参考までにお伝えするとCからC++に入っています。
あなたのことはどうでもいいです
慇懃無礼なQの匂いがする
>>579 > 複製を格納する
mylist.push_back(MyClass());
この場合もコピーコンストラクタが作動してMyClassのコピーが保持されるって事ですか?
>>586 基本的にはそうだよ
最適化とか考えると微妙に違うけどそのへんは深く考えなくていい
>>587 ありがとうございます。
「c++はコピーの概念で出来てる」ってどこかで聞いた事があったので、
このあたりが関係してるのかなと思いました。
参照を引き摺り回して破綻している言語より判り易いね。
vecotr<int> vecNum; vecNum.push_back(100); vecNum.push_back(230); vecNum.push_back(10); vecotr<int>::iterator it; it=vecNum.find(10); 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 map<string, string> mapSt;r mapStr.insert(pair<string, string>("i", "aaa")); mapStr.insert(pair<string, string>("ro", "bbb")); mapStr.insert(pair<string, string>("ha", "ccc")); map<string, string>::iterator it; it=vecNum.find("ro"); イテレータなんですけど 使うコンテナの型?はmapなのかlistなのかvectorなのかわかるんだから vecotr<int>::iterator it; や map<string, string>::iterator it; わざわざ書かず iterator it; it=vecNum.find(10); iterator it; it=vecNum.find("ro"); と自動認識してもいいだろ?と思ったのですが、初心者だからそう思うんですかね もしかしたら仕様なんだからそう記述しろ!という話で済んでしまう事かもしれませんけど
>>590 心配すんな
C++1Xからはautoになる
今のC++が自動認識しないのはCからの哲学「プログラマはコンピュータに何を
させようとしているのか完全に理解している」を引きずっているから
しかし俺の予想だけどC++1Xは不発に終わるような感じがしている
C++ですら脱落者が多量に出てCに敢えて留まるプログラマが多かったのに
C++1Xはちょっとヤバさを感じている
VC++2010ならすでにautoでいけるよ 何気にautoの使い方で一番有効だよな いろんなコンテナを舐めるループをマクロで一括定義できる
ひきずってるて
>>590 typedef で少しは楽になる
typedef map<string, string> HogeMap;
HogeMap hogeMap;
HogeMap::iterator it = hogeMap.find(??);
とか
さらにBOOST_FOREACHでループだけならもっと楽になる。イテレータいらず
BOOST_FOREACH(HogeMap::value_type& v,hogeMap)
{
処理
}
BOOST_FOREACHは酷いコード吐くから使いたくないわ
>>595 もうすでに酷いコード書いてるから
大丈夫だよ
なるほど
C++0xならrange base forになってBOOST_FOREACH捨てられるんだけど
コンセプトさんがいないrange base forの実装なんて
600 :
デフォルトの名無しさん :2011/07/20(水) 14:03:17.46
;をオーバーライドしったったwwwwwwww うそですけどねwwwwwwwwwwwwwwwwwwwwwwwww
C#とJavaしかやったことのない日曜プログラマで これからC++をやってみようと思うんだが、Cやっといたほうが理解が進むのかな? オブジェクト指向から学んだからいまいち手を出しにくいのだけれど…
>>601 C#からな絶対うぜーってなるから
学ばない方がいい
C++を勉強してC++に慣れてしまったが C#から覚えたのなら、わざわざC++なんか覚えなくて良い 特に困ってなければC#でいいだろ と、にわかC++使いは強くそう思う その時間でC#の理解度を高めたほうが100倍マシだな
C/C++はJavaやC#とはコンセプトが違う。 そのコンセプトの違いに意味を見出せないならやる必要がない言語。
不思議なことに、ある観点に立つと、 CとJavaは似ていて、 C++とC#もまた似ている。
OS造りたいんならCやっといた方が良いな
>>601 cでoopのやり方があるんだけどね、それを覚えたらc++の基礎はすぐに覚えられるよ。
あー、そんやって実現してんだ。
あー、そこをやってくれてるんだ。
あー、これが何でも作れるって奴か。
ってなるよきっとw
>>607 それ大事
で次はstringやboostの実装みて
他言語のあれはこうやって動いてるのかとやる
まずはCASL IIを学べ Z80や8086でもいい やっておくと理解度が全然違うぞ
すみません。 CreateWindow関数で作ったウィンドウに、ファイルをドラッグ&ドロップしてそのフルパスを取得したいのですが、 どう実現すれば良いのでしょうか? ググるべきワードか関数名を教えて下さると幸いです;
WM_DROPFILES
>>610 「winapi ドラッグアンドドロップ」でググると一番上に出てくるよ。
613 :
610 :2011/07/21(木) 13:11:23.78
すみません。文字の書き換えを行いたいのですが上手く行かず困っています。 char text[50] = "abcdefghijklmn.og"; char *tgt; tgt = strstr(&text[0], ".og"); if(tgt != NULL) { sprintf_s(tgt, sizeof(tgt), ".txt\0"); } tgtのサイズより大きい文字を入れようとしてしまっているので、Buffer too smallのエラーが出るのは当然とは思うのですが・・ strstrの検索結果を、text[]の要素ナンバーに直す方法か、もっと正しいやり方があれば教えて頂けますと助かります;
>>614 sizeof(tgt)は使えないぞ
ちゃんと計算して残りのメモリのサイズを渡さないと
if(tgt) sprintf_s(tgt, text - tgt + sizeof(text), ".txt");
わかりにくい罠教えるなよ
こんな感じでしょ sprintf_s(tgt, sizeof(text)-(tgt-text), ".txt");
619 :
614 :2011/07/22(金) 08:35:49.24
>>615-618 沢山のご助言ありがとうございます。 sizeof(tgt)が間違いだったんですね。
そして、tgtを計算に使うと元の配列のサイズ+検索結果位置の値になるんですね。初めて知りまりた。
勉強なります。 無事解決し最低限は理解をする事ができました。 ありがとうございました〜
>>619 ポインタ周りの計算が解ってない悪寒。
それと、なんの為にsprintf_s()に使える領域サイズを教示しているのかも解っていない悪寒。
仕事だとしたら大迷惑だな。
「KEY=VALUE」みたいな行が複数あるテキストファイルを行単位で読み込んで、 map(string, string)にkeyとvalueを分けて挿入したいんですが、C言語のstrtokのように新しいbasic_stringを生成せずに、 文字列のRangeだけ渡して生成する、みたいなことはできないんでしょうか? map<string, string> config_map; ifstream config_is(".config"); string line; string::size_type index = 0; while (getline(config_is, line)) { if ((index = line.find("=")) == string::npos) { continue; // line[index++] = '\0'; // C言語でやると←↓のような感じになることをC++でやりたい。substrではなく。 // config_map.insert(map<string, string>::value_type(line, line[index])); } }
上のコード、continue後の閉じブロックが下にずれてしまってます・・。
while(1) じゃなくて for(;;) を使えって言われたけど何で?
>>624 そんなのは個人の好みだから、言った本人に聞くしか無いよ
1がマジックナンバーみたいで気に入らなかったんじゃないの
>>622 stringのコンストラクタ見たらなんとでもなるんじゃないのか
>>624 while(1)だと毎回真偽値判定されてループするが
for(;;)だと空白→特殊処理としてループすることになるんでコストがお得とか何とか
そしてこれはいにしえの話らしい
>>627 いしにえだと断って言われたんなら
そういう話で解決してるんじゃん
何十年前の話だよって感じだが
>>622 >「KEY=VALUE」みたいな行が複数あるテキストファイル
それiniファイルの書式だから
所謂MBCSの扱いでいいならboostかwindowsならapi使えば?
win32apiなら予めUnicodeにしておけばそのままwstringに入れられるし
なぜかswitch分岐は駄目という先入観が染み付いているのですが 本当に駄目なんですかね? 例えばESCで処理終了、 F1でメニュー F2でxxx というキーで分岐するのを if(ESC) if(F1) if(F2) switch (key){ case ESC case F1 case F2 } 数が増えたらcaseのが処理が早くなると言う認識でいいですか? (ifの場合は毎回全部調べなければならない。caseはその項目に飛ぶ)
if else if にしろ
はい
まず、そのスイッチに対応するのは、 if(ESC) else if(F1) else if(F2) だろうに…。で、そんな書き方は冗長だから、 そんなときこそスイッチを使うんじゃないの。
アセンブリコード吐かせてみればわかるけど、両方とも似たようなコードに コンパイルされる。switchはジャンプテーブル使ったジャンプにはならない。
break;抜けるなら変わらないけど そうじゃなかったりしたらぜんぜん違ってくるよ あと{}つけないとスコープも違っている
>>626 詳しく教えてもらえますか?
>>629 それもありなんですが、C++を覚えている最中で、
C言語で出来る一番効率がいい方法(文字列を複製せずに分割)をC++でどうやるのかと思い質問した感じです。
最終的に手段はいいように調整したいんですが、同じようなことをしたいとき、C++ならどうやるのかなと。
個人的には string の特定部分だけをアドレスで持つ range みたいなものがあると思っていたんですが・・・
そんなのはない
>>634 こちらの意図を読み取って、どうでもいいところをギャーギャー騒ぐ典型的な駄プログラマーと違って
ピンポイントな回答をありがとうございます
>>638 >>634 でswitchがだめな理由がよくわからないんだけど。
最適化のためにわざわざswitch書くのに最適化されてねーじゃんって意味?
にわかクン「switchってだめと思い込んでいるけど本当にだめなの?」 その他大勢「内部処理はほぼ同じ」 にわかクン「おなじなのか」 おわり って意味じゃね?
>>640 質問者はswitchはジャンプテーブル使った間接ジャンプにコンパイルされると
思ってたから、
>>630 のような質問をした。
実際はそんなコードにはならないという事がわかれば、どっちで書いても実際
は大差がないので読みやすい方で書けばいいという結論が得られる。
>>636 string ( const string& str, size_t pos, size_t n = npos );
あるんだから, findの結果を元に
config_map.insert(map<string, string>::value_type(string(line, なんか整数変数, , なんか整数変数), string(line, なんか整数変数, , なんか整数変数)));
ってすりゃいーじゃん
644 :
639 :2011/07/23(土) 21:38:30.84
std::map<std::string, std::string> config_map;
std::string line = "abc=def";
std::string::size_type index = line.find("=");
config_map.insert(std::make_pair(line.substr(0, index), line.substr(index+1)));
やってることは
>>643 と一緒
変数をカウントアップしながらループするのは、whileでもforでも書けるけど for()のほうがその意図が明確になる。 一個の変数を参照して分岐する処理ならswitchがいいな。
boost::stringtok()
どのみちstlコンテナなんだからコピーしまくりだろうに
C++1Xが出てmove constructorが多用されるまでコピーで我慢だな
というか文字列をある >文字列のRangeだけ渡して生成する のがsubstrじゃなかったっけ? (開始位置も渡すけど)
あ、たしかにこのやり方ならコピーした方がいいね。入力がストリームだしコンテナに入れてるし。 結局ファイルの中身全部読み込んで、複製せずに終端記号だけ付け替えて使いまわせるよう分割するってのをC++でしたかった。 コンテナに入れたりini形式がどうこうなりはその次で。 >> 646 サンクス >> 649 substrは中でコピーしちゃってるじゃん
>>626 stringがどうこうより、mapがどうこうだからなぁ
自前でコンテナもどき作るしかないだろう
あるいは開始位置・終了位置を保持したクラスをmapしてもダメかね?
>>641 にわかクン「switchって良いと思い込んでいるけど本当に良いの?」
ってんなら文章として通じるんだけどね。
653 :
デフォルトの名無しさん :2011/07/24(日) 15:59:50.47
hanakusogaumai.
655 :
デフォルトの名無しさん :2011/07/24(日) 17:48:02.91
VC++で開発してます。 Cの書式出力が便利で、大体次のようにやってます。 int len = _scprintf("%s", "hello"); char * p = new char[len+1]; sprintf(p, "%s", "hello"); delete [] p; STLもしくはC++標準関数が使える環境で これをもっとエレガントなやり方を教えてくださいませんでしょうか? まことに勝手ですがふしてお願い申し上げます。
char *p = strdup("hello"); free(p);
std::string s = (boost::format("%s") % "hello").str();
> STLもしくはC++標準関数が使える環境で この環境では > Cの書式出力が便利 こう考える人を納得させるものがないので、boost::formatというのが作られた。 直球でいうとその環境でエレガントな方法は無い。
659 :
デフォルトの名無しさん :2011/07/24(日) 19:47:23.96
やっぱそうなんですね。 ありがとうございます。 これで堂々とこの汚いやり方で行けます
C++でクロスプラットフォームなMIDIライブラリをRtMidi以外で知りませんか?
661 :
87 :2011/07/25(月) 00:04:51.15
1バイト文字の配列から、全ての文字の出現回数をカウントしたいのですが(文字のヒストグラム) どのコンテナを使ったら幸せになれますか?
int count[256] = {0}; while (*p != '\0') ++count[*p++];
multiset
>>654 あるいは、最後が
にわかクン「別にだめじゃないのか」
でもおk
666 :
デフォルトの名無しさん :2011/07/25(月) 22:05:22.85
Visual C++で、クラスファイルを作成した際に自動的にヘッダファイルも作成されるんですが、 そのクラスファイルをincludeすると「既に (class).obj で定義されています」とエラーになります。 どうすればいいでしょうか。 test.cppをincludeするとエラー === test.cpp === #include "test.h" test::test(void) { } test::~test(void) { } === test.h === #pragma once class test { public: test(void); ~test(void); };
cppファイルをインクルードするなよ
668 :
デフォルトの名無しさん :2011/07/25(月) 22:17:45.24
すみません、では test.cpp で実装したメンバを利用する際には どうすればいいのでしょうか?
>>668 なんのためにヘッダにクラスを公開してんだよ
ヘッダをインクルードして好きなだけ使えばいい
670 :
デフォルトの名無しさん :2011/07/25(月) 22:29:42.41
重ね重ねありがとうございます。.cppファイルに.hファイルへのincludeがあるので、 main.cpp→test.cpp→test.h というように読まれていくものかと思っていたのですが、 実際には test.h からincludeすると test.cpp も読まれるのでしょうか……? test.cppの中の #include "test.h" は何のためにあるのでしょう?
>>670 main.cppとtest.cppは別々にコンパイルされます
#include "test.h"しないと
testがなにを意味しているかコンパイラさんが分からないだろ
672 :
660 :2011/07/25(月) 22:40:37.69
>>664 レスありがとうございます。
MIDIってのはMIDIファイルのことじゃなくて
MIDI I/Oってことでした。バーチャルポート作ってそっからMIDI信号出力とかがやりたかったんです。
明記してなくてすみません。
まさにRtMidiの様な機能があればいいのですが、
RtMidiはMac OS Xでユニバーサルビルドができなくて...
673 :
デフォルトの名無しさん :2011/07/25(月) 22:52:09.98
>>671 ありがとうございます。test.cppがいつどう呼ばれるのかだけがまだわかってません……
でも、おかげさまで何となくわかってきた気がします。
Cは(当方PHPをかじったことしかないのですが)includeを追うのではないんですね。
確かに、test.cpp単体でコンパイルする時のことを考えると、test::test って何だよって話ですよね。
main.cpp をコンパイルする → main.obj ができる test.cpp をコンパイルする → test.obj ができる main.obj と test.obj とそのほかもろもろ (printfとかscanfとかいろいろたくさん) をリンクする → .exe ができる
675 :
デフォルトの名無しさん :2011/07/25(月) 23:53:26.50
includeって呼ぶ、というよりは1ファイルごとに正しい動作をできるようコンパイラに示すためだけのものって感じですね。 (↑我ながら意味不明な文ですが、何となく理解したつもりです) レス遅れてしまいすみません。恐らく理解できました。 本当にありがとうございます。感謝しています。
include ってのは単に指定したファイルの内容をコンパイル前にその場所にぶちまけるだけ #include "test.h"と書く代わりにtest.hの中身をそこに書いてるのと同じこと
677 :
デフォルトの名無しさん :2011/07/26(火) 00:17:07.74
どうもコンパイルの最中に追っていくようなイメージがあったのです。 自分の中の勘違いも解け、スッキリできたと思います。本当にありがとうございます。
ある関数で構造体配列を宣言して、アドレス渡しで他の関数に渡した場合、アドレスを受けとった側の関数で初期化は可能でしょうか?
可能
ありがとうございます。 どのように記述すれば良いでしょうか? 下記の様な書き方でしょうか? memset(test,0,sizeof(*test));
ok
>>680 Cならまぁ、それでもいいけどC++だったらダメ。
上記記述方法では構造体配列の[0]しか初期化されませんでした。やはり、配列数も渡さない限り、関数側ではわからないですよね。
>>683 配列数なんて渡しても意味ないだろ。要素数を渡しておけ。
vectorでサイズを指定して二次元配列を作るとき、例えば2×3の配列なら vector<vector<int> > a(2, vector<int>(3)); とできますが、3次元配列の場合の書き方を教えてください
static 型ですが //hoge.h func1() {static int i;} func2() {static int i;} //hoge1.h func1() {static int j;} //hoge2.h func2() {static int j;} jは別物で処理されると思うのですが、iは同じ物として扱われてしまう?
スコープ
で?
.cに書いたグローバル変数は、staticをつけるとファイルごとのスコープに
なるけど、なんかそこらへんの話と混同してそう。
>>688 はローカル変数だし、.hだし。
なんでヘッダーに書いてんだ
stlに言え
まあinline関数とかテンプレートはヘッダに書かないといけないけど。
いやいやw 質問者の内容だと hoge.c ------ #include <hoge.h> ------ hoge1.c ------ #include <hoge1.h> #include <hoge2.h> ------ とかになったら意味が無くなるだろw
おっと、、<> は ""で
メンバ関数内で宣言した静的ローカル変数って、 クラスのインスタンスをデストラクタで解体した時に消えてくれます?
くれません
ていうか作れたか? メンバ関数もstaticなのか?
すんません、シングルトンクラスです 回答ありがとうございます
お願いします。vc10ですが 文字列をvector コンテナに代入するのに、このように書くのですが error C2512: 'setVec::setVec' : クラス、構造体、共用体に既定のコンストラクターがありません。 こうなってしまします><何処が悪いのでしょうか? #include <map> #include <vector> #include <algorithm> std::string data = "abcdefg"; std::vector<char> vec; struct setVec { char ch_; setVec(char& ch) : ch_(ch) {} void operator()(char d_) const { vec.push_back(d_); } }; int main() { std::for_each(data.begin(), data.end(), setVec() ); return 0; }
>>701 setVec(char& ch) : ch_(ch) {}
これ消せよ
vec.insert(vec.cend(), data.cbegin(), data.cend()); 素直にこう書け
vec.assign(data.cbegin(), data.cend());でいいだろ
オブジェクト、インスタンスをファイルに保存できるクラスがあると どっかで読んだ気がするんですが、クラス名が思い出せません。 環境はVC++です。
CObject::Serialize
>>707 >>708 多分それです!これから読んできます。
ありがとうございますm(_ _)m
もう一個質問をお願いします。
Visioみたいに図形同士を線で結ぶようなモノを
実現するライブラリってありますか?
GraphVizみたいなことをしたいのかな?
スレチかもしれませんが,WindowsでHPET使ってタイマコールバック設定する方法ありますか? timeSetEventのHPET版みたいな….linuxではできました. 時間計測だけならQueryPerformanceCounterでいいことはわかりました. Win Vista以降のみでOKです.
>>710 ありがとうございます。
マウスを使ってドラッグ&ドロップで図形を配置し、
クリックで図形同士を線で結ぶイメージでいました。
質問が悪くてすいません。
Qtのサンプルでそういうのがあったような・・・
win32プロジェクトから、ファイルを転送したいと考えています。 具体的にはローカルでパスとファイル名が分かっている、ファイルを アカウントとパスの分かっているftpに転送したい、と言った感じです。 しかし、検索しても転送自体全くしたことが無いので、どんな言葉で調べればいいのかもわかりません。 何かこういう言葉で調べろとか、このサイトを見ろとかありましたら教えてもらえないでしょうか。
>>713 ありがとうございます。
Qtは4をインストールして英文ドキュメント見てますが、
いまだにサンプル以上を使えてないorz
可変引数を処理する際にvsaprintfを使用したソースを組んだのですが、 GNUのソース開示の規約があるためプロパーがソースを組み直せと言います。 他に可変引数を処理できるような便利な関数はないでしょうか。
__VA_ARGS__は
templateとオーバーロードで頑張る
classAとclassBがn対nの関係でお互いの参照のリストを持ちたいのですが c;ass B; classA{ list<B*> b; void Attach(B*) void Detach(B*) } classB{ list<A*> a; void Attach(A*) void Detach(A*) } このようにしようとすると error C2027: 認識できない型 'B' が使われています。 error C2227: '->(関数名)' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。 となってしまいます。 コレを解決するにはどうしたらよいでしょうか?
尻の穴?
>>720 ポインタのリストを持つだけなら前方宣言だけでいける
おまえのコードがクソすぎて怒られる原因はわからん
可能な限り、問題が出てるソースをコピペするようにしようぜ それだけだと問題が多すぎて絞り込めないw
>>720 とりあえずセミコロンがずいぶん足りないようだが大丈夫か?
725 :
720 :2011/08/02(火) 18:58:22.62
コード全体が未完成なんで今できてるのはこんな感じです Aのインスタンスが削除されたときに確実にBのDetachを実行して Bがこの後追加する予定の処理で不正なAのポインタに触らないようにしたいと思っています classA{ list<B*> b; void Attach(B*pb){ b.push_back(pb);}; void Detach(B*pb){ b.remove(pb);}; ~A(){ while(b.empty() ){ *(b.begine())->Detach(this); //ここでつまる b.pop_front(); } }; classB{ list<A*> a; void Attach(A*pa){ a.push_back(pa); pa->Attach(this); } void Detach(A*pa){ a.remove(pa); pa->Detach(this); } };
メンバ関数は宣言と定義を分けて定義は下の方にもっていけ
すみません。Debugモードでビルドすると正常の動くのに Releaseモードでビルドすると、破壊されていない様に見える変数へのアクセス違反で 異常終了してしまいます。 こういう場合、原因は何で、どういった確認を行うべきなのでしょうか・・? >環境は、WinXPpro(32bit) VC++2008EE Debug/Releaseともマルチバイト文字利用です
>>728 まず疑うべきは、
・未初期化変数が無いか?
・マクロ分岐で悪いことをしていないか?
例えばassert(処理) とか書いちゃって
(処理)がreleaseだけ削られている、とか
・配列等範囲外メモリ不正アクセスはないか?
運よく(悪く?)debugではうまく動いているように見えていた
このあたりかなぁ
730 :
728 :2011/08/04(木) 20:21:01.68
>>729 ありがとうございます。
assertも試しに数箇所使ってましたが、未初期化変数が山の様にあります;
まずはそっちからですね・・それでも解決しなかったらメモリ不正アクセスを絞り込みながら調べてみます、
ご助言ありがとうございました、感謝っ
std::map のデータをfor_eachの第三引数で、operator()()をオーバーライドした関数オブジェクトに渡したいのですが 文法的に正しいのでしょうか? ネットで探してもあまり例が出てないので、間違ってる気がするのですが?
正しいですよ
>>732 thx です
std::map はfor_each できない仕様ということですね。
boost やloki でも同じなんでしょうか?
正しいつってんだろが
厳密には正しくない
struct stdout { void operator()(map<char,double>::value_type pair) const { cout<< pair.first << ':' << pair.second << endl;} }; これを、ジェネリックtemplate ではどのように書いたらいいですか。
template <typename K, typename V> struct Stdout { void operator()(typename map<K, V>::value_type& pair) const { cout<< pair.first << ':' << pair.second << endl;} };
int=32bitていつまで続くんだ もう10年以上たってるだろ
もう変えないと思うよ
#include <stdio.h> void rev_print(char *s){ if (*(s + 1)) rev_print(s + 1); putchar(*s); } int main(void){ char s[] = "123456"; rev_print(s); return 0; } こんな風に逆順に出力したい場合、再帰のループは何回まで出来るものなのでしょうか?
スタックサイズと相談して
スタック数MBだとしておよそ数万回から十万回くらいじゃね
>>742 ,743
有難うございます。
10^5バイト程度のデータ処理をしようと考えてました。
どっかのC++ スレで誰かが聞いていたような気がするが何処か忘れたので聞きます C でmalloc C++ ではnew でヒープメモリを確保しますが これらを使う必要性としては、自分の解釈だと可変長の配列を生成する以外思いつきません malloc newは、他にどのような用途がある?
自動変数だとスコープを外れたらメモリから消えちゃうだろ
>>745 スタックメモリ領域のサイズはそんなに大きくないから、
ヒープ使うしかない。
例えばVCならデフォルトで1メガしかない
可変長配列ならC99からmallocを使わずに作れるって思ったけど、VCはサポートしてなかったっけ?
yaml-cppがBase64使ったバイナリの読み書きにちゃんと対応していないようなので (元のバイナリデータによっては不正なBase64が出力される、 Base64からバイナリに戻せない等) なので、C/C++で動くBase64エンコーダ/デコーダを探しているのですが、 何処のを使えばいいでしょうか
思ったより簡単だから自作してみればいいと思うよ
752 :
750 :2011/08/12(金) 21:58:29.97
うーん・・・じゃぁ頑張って作ってみます
ttp://www.dinop.com/vc/ftp_wininet.html こちらを参考にソースを、というか
#include "wininet.h"
#pragma comment(lib,"wininet.lib")
の2行を書いた所、wininet.hで大量にエラーが出ました。
一番最初のエラーが「typedef LPVOID HINTERNET;」行に
error C2146: 構文エラー : ';' が、識別子 'HINTERNET' の前に必要です。
とのことだったので、LPVOIDが定義されていないのだと思い、LPVOIDを調べたところ、
WinDef.hに定義されているようなので
wininet宣言の前に、WinDef宣言を追加しました。
すると今度はwininet.hの「PCONTEXT ContextRecord;」で
error C2146: 構文エラー : ';' が、識別子 'ContextRecord' の前に必要です。
が出ました。
また、PCONTEXTが宣言されているヘッダを定義すれば良いのかと思ったのですが、
PCONTEXTが「wininet.h」内にtypedef CONTEXT *PCONTEXT;と宣言されており、
この部分でエラーになる理由が分かりません。
その前のWinDef.h宣言含め、どのように修正すればいいでしょうか。
>>753 #include <windows.h>
#include <wininet.h>
#pragma comment(lib,"wininet.lib")
それでコンパイラは通りました。 で、後学のためにPCONTEXTがエラーになった原因を教えていただけないでしょうか。 今回はwindows.hの中にPCONTEXTの定義か、もしくはPCONTEXTの定義してあるヘッダーが宣言されている、ということなのでしょうが、 そうなると、「wininet.h」内のtypedef CONTEXT *PCONTEXT;の意味が分かりません。 むしろ二重定義になったりしないのでしょうか。
>>755 winapiみたいな歴史的遺物の塊関係のプログラミングなら、
〜へっだにあるの定義が必要でコンパイルエラーはよくある話。
ちなみにtypedef は別名をつける言語構文
例えば typedef int* int_ptr;
とかすると、
int* p;
int_ptr p;
は同じ意味になる
>>755 #ifdef _X86_
...
typedef CONTEXT *PCONTEXT;
// begin_ntminiport
#endif //_X86_
758 :
750 :2011/08/15(月) 22:30:54.89
ビット演算やら何やらで苦戦しましたが、何とかなりました base64書き込みのバグはcharではなくunsigned charで処理すパッチを当てて直しました。 で、読み込みの処理だけ自分で作りました。 文字数が4の倍数でない場合の処理に特に苦心しましたが、(最後に"="とか"=="のついているbase64) 文字数が4の倍数で無い場合だけ、最後に特別な処理を行わせるようにして自己解決しました
限定staticメンバをポインタ使わず実現する方法ってなんかない? struct A{int partial_static_x;}; A a0,a1,a2,a3; a0.partial_static_x=a1.partial_static_x=0; a2.partial_static_x=a3.partial_static_x=1; a0.partial_static_x = 3; assert(a1.partial_static_x==3&&a2.partial_static_x==1);//true
すみません。コードの見た目の統一性についてです。 int型の変数 を「整数」を使ってビット判定しているのですが、 int temp = 2100010000; // 10億の位の数字で処理を振り分ける if (temp & 2000000000) { ... } else if (temp & 1000000000) { ... } else if (temp & 0000000000) { ... } // こうしたいけれど、無理な訳で・・。 10億で割った余りを判定するか、最後をif 10億未満と書けば良い話なのでしょうけれど、 同じビット判定で統一したりってできないものでしょうか・・?
>>761 ビットの勉強するといいよ
if(2000000000 & 2000) printf("It can't be. ;-)");
>>761 出来ない。出来ない理由を理解したいなら、中学校の数学からやり直せ。
>>762 ありがとうございます; 1110111001101011001010000000000と、11111010000でtrueが返るんですね・・。
2の倍数の整数以外のビット判定は厳禁なのでしょうか。 何にしても勉強しなおしてきます。
>>763 何か統一性を保った別の記述方法が有れば・・と思いましたが、そんなものは無い というより上の問題で無意味なのですね。
ご助言ありがとうございます。早めに知れて良かったです。
1110111001101011001010000000000 0000000000000000000011111010000 ------------------------------- [AND] 0000000000000000000010000000000 ->true
if (temp >= 2000000000) { ... } else if (temp >= 1000000000) { ... } else if (temp >= 0 ) { ... } わかりやすい
switch (temp / 1000000000) { case 2: {...;} break; case 1: {...;} break; case 0: {...;} default: break; } 判りやすい。 if (temp >= 2000000000) { ... } else if (temp >= 1000000000) { ... } else if (temp >= 0 ) { ... }
結局書く必要はなくなったのだけど、もし書かなきゃいけなかったらどうしようかと思ったこと。 どうしても解決しなきゃいけない話じゃないので、面白くなかったら流してくれて構わんけど、 面白い答え持ってる人がいたらレスください。 -FLT_MIN < b && b < FLT_MAXを満たすdouble型の値bが与えられたとき、 float型の値aとcで、bを内包するギリギリ狭い範囲を作りたい。 具体的には、次の3条件を満たすfloat型の値a, cを求めたい。 (1) a <= b && b <= c を満たすこと (2) いかなるfloat型の値tについても a < t && t <= b を満たさないこと (3) いかなるfloat型の値tについても b <= t && t < c を満たさないこと できれば、標準ライブラリだけで、処理系非依存にしたい。 floatとdoubleをIEEE 754の単精度と倍精度に仮定できるのであれば、 ビット演算で仮数部を取り出したらできそうだと思ったが、もっとよい方法はないものか。 あるいは、どうせIEEE 754に仮定するんだったら、さらに現実的な仮定を使ってより簡単な方法はないものか。
俺もそれの事だと思った
a = (float)b c = nextafterf(b, FLT_MAX) でいいのか自信ない
772 :
デフォルトの名無しさん :2011/08/22(月) 01:40:47.53
結局-0.0fと0.0fって違うんですか?
f = (float)b if (f > b) { c = f; a = nextafterf(b, -INFINITY) } else { a = f; c = nextafterf(b, INFINITY) } にしないとまずいのか
774 :
デフォルトの名無しさん :2011/08/22(月) 18:38:29.12
C++の新しい規格が決まったみたいですが、いま出てる入門書より、これから出る新規格にそった入門書を買った方がいいんでしょうか? これまで蓄積されてきたノウハウや、公開されているソースは旧規格のものだから、そういうのを使う場合、新規格入門書より、旧規格の入門書を読んだほうがいいんですか?
入門レベルで違いはないだろ。
776 :
768 :2011/08/23(火) 01:03:52.84
nextafterfって、そのまんまな関数があったのですね。ついでにnexttowardfってのもあるのか。
>>775 それじゃあ今出てる入門書買います。どうもありがとうございました。
778 :
デフォルトの名無しさん :2011/08/24(水) 01:37:00.96
関数にstaticつける意味って何?
ファイル外からその関数は呼ばれないよ、ということを主張させるため
Cでは定義されたファイル外に公開しない関数ってこと C++でのprivate関数みたいなもの C++ではインスタンスを生成しなくても呼び出せる関数って事
staticがついた関数は内部結合になる
逆に何も付いていないと外部結合になる
メンバ関数のstaticだと
>>780 のインスタンスを生成しなくても呼び出せる関数
782 :
365 :2011/08/24(水) 12:27:55.41
STL勉強中ですが、for_eachでファンクタを外だしにするくらいなら 普通にfor文でいいと思うのですが、for_eachのほうがC++流なのでしょうか?
>>782 BOOST_FOREACHはもう少し楽だぞ
>>782 イテレーターを定義して使わなくて良いなどのこともあるけど、
for_each などが真に活きてくるのは、C++0x になってからよ。
785 :
デフォルトの名無しさん :2011/08/24(水) 21:45:05.81
結局時間取得はどれ使えばいいんだよ
if(boguDataObj.fukaS1[boguNo]==1)soubi_Eattack+=boguDataObj.fukaV1[boguNo];//遠距離攻撃 else if(boguDataObj.fukaS1[boguNo]==2)soubi_Kattack+=boguDataObj.fukaV1[boguNo];//近距離攻撃 else if(boguDataObj.fukaS1[boguNo]==3)tikara_p+=boguDataObj.fukaV1[boguNo]; //力 else if(boguDataObj.fukaS1[boguNo]==4)sutamina_p+=boguDataObj.fukaV1[boguNo]; //スタミナ else if(boguDataObj.fukaS1[boguNo]==5)seisin_p+=boguDataObj.fukaV1[boguNo]; //精神 else if(boguDataObj.fukaS1[boguNo]==6)hanno_p+=boguDataObj.fukaV1[boguNo]; //反応 else if(boguDataObj.fukaS1[boguNo]==7)maryoku_p+=boguDataObj.fukaV1[boguNo]; //知恵 if(boguDataObj.fukaS2[boguNo]==1)soubi_Eattack+=boguDataObj.fukaV2[boguNo];//遠距離攻撃 else if(boguDataObj.fukaS2[boguNo]==2)soubi_Kattack+=boguDataObj.fukaV2[boguNo];//近距離攻撃 else if(boguDataObj.fukaS2[boguNo]==3)tikara_p+=boguDataObj.fukaV2[boguNo]; //力 else if(boguDataObj.fukaS2[boguNo]==4)sutamina_p+=boguDataObj.fukaV2[boguNo]; //スタミナ else if(boguDataObj.fukaS2[boguNo]==5)seisin_p+=boguDataObj.fukaV2[boguNo]; //精神 else if(boguDataObj.fukaS2[boguNo]==6)hanno_p+=boguDataObj.fukaV2[boguNo]; //反応 else if(boguDataObj.fukaS2[boguNo]==7)maryoku_p+=boguDataObj.fukaV2[boguNo]; //知恵 ↑のコードを変数名を変えずにスマートにまとめるにはどうしたらいいでしょうか。
int n = boguDataObj.fukaV1[boguNo]; switch(boguDataObj.fukaS1[boguNo]) { case 1: soubi_Kattack += n; break; 以下繰り返し
788 :
デフォルトの名無しさん :2011/08/25(木) 01:50:55.94
変数名変えたくないなら新しく配列用意してそれに入れて
789 :
786 :2011/08/25(木) 01:52:11.53
>>787 ありがとうございます。
swich自分から使ったことなかったけど
swichデビューすることにします。
790 :
786 :2011/08/25(木) 01:56:28.46
>>788 ありがとうございます。
それは考えたのですが、コード量はあまり変わらない気がしました。
>>786 今のあなたには switch の方がいいんだろうけど
こんなやりかたもある
int dummy; // 0 番は効果無しみたいな意味があるかも知れないので保険として用意
int *param_ptr[8]={&dummy, &soubi_Eattack, &soubi_Kattack, &tikara_p, ..., &maryoku_p}; // 添え字 7 以降にアクセスするとヤバイ
*param_ptr[boguDataObj.fukaS1[boguNo]]+=boguDataObj.fukaV1[boguNo];
*param_ptr[boguDataObj.fukaS2[boguNo]]+=boguDataObj.fukaV2[boguNo];
792 :
デフォルトの名無しさん :2011/08/25(木) 02:19:17.37
newしたものをdeleteしなくてもプログラムが終了したらメモリ解放されるの? 実行と終了ずっと繰り返したがぜんぜん消費メモリ増えない
793 :
786 :2011/08/25(木) 02:22:08.66
>>791 ありがとうございます。
こんなすごい方法思いつきませんでした。
今後の拡張性を考えてswichの方を使うことにします。
>>793 拡張する予定なら 関数化+switch使用 を薦める
796 :
デフォルトの名無しさん :2011/08/25(木) 02:33:24.52
クラス設計からやり直せ
int *addr(int ptn){ switch(ptn){ case 1: return &soubi_Eattack; 以下繰り返し } return &gomi; } : gomi=0; *addr(boguDataObj.fukaS1[boguNo]) += boguDataObj.fukaV1[boguNo]; *addr(boguDataObj.fukaS2[boguNo]) += boguDataObj.fukaV2[boguNo];
798 :
デフォルトの名無しさん :2011/08/25(木) 02:59:34.91
GUIプログラミングってずっとループばっかじゃん 処理重くならないの?
>>798 書き方による
GetMessage で待つようにしてれば問題ないレベル
800 :
786 :2011/08/25(木) 12:02:52.81
>>797 ありがとうございます。
それで行きます。
main関数の戻り値って何の意味があるんですか?
意味があるように作れば意味がある
>>801 DOSの時代だと、バッチファイルで受け取って分岐とかできてた。
unixとかでもシェルで同じような使い方できるんじゃないの。
いまのWindowsでもsetup.exeがインストールに成功した/失敗したの判定に使ってる・・・かもしれん
戻したコードに意味があるかは別の話だね。
で?
808 :
デフォルトの名無しさん :2011/08/26(金) 09:08:35.90
809 :
デフォルトの名無しさん :2011/08/26(金) 22:54:52.58
switchとcaseにはcaseのところでインデントしないのが一般的なのですか?
一般とかないので好きにしてください
811 :
デフォルトの名無しさん :2011/08/27(土) 09:09:01.53
アセンブリだとオーバーヘッドないってうそだよね?
オーバーヘッドの定義による
long double つかうと値がおかしくなる
814 :
デフォルトの名無しさん :2011/08/27(土) 21:02:23.00
VC++でコンソールプログラミングしているんだけど 閉じるボタン押されたときの処理ってどうなされているの?
コンソールが閉じる
アドレスを取れないビットフィールドの変数がconst参照で渡せるのが納得いかなくて、取得側でアドレスを調べてみたら、 共用体と全然違うところに、1ビットで連続する変数の間隔が12バイト開いてた。 const参照って通常の参照に制限をかけるものじゃなくて、中身をどこかにコピーしてるもんなの? それなら値渡しとコストが変わらない冗長な記述なんじゃないのって思ったんだけど、何か違う?
コンパイラの名前とバージョンは? アドレスを見ようとするから、わざわざ用意してる可能性あり。
そもそもどう渡したんだ? struct X { int y:1; int const & get() {return y;} } とかだとgetの返却値はyをintにキャストした一時変数の参照だぞ。
>>819 そのソースだと
>>818 がいってるのと同じこと。
void foo(const int& a){ cout << &a << endl; }
foo(u.test.x); // ビットフィールドからintに暗黙変換されてその結果の一時変数が関数に渡される。
821 :
820 :2011/08/28(日) 16:51:43.49
なるほど、型名に惑わされていたようです。 分かりやすい解説ありがとうございました。
キャストして書き換えたらどうなるの
あいまいな質問だな。自分で試して結果が理解できなければ改めて具体的に質問したら
switch文ってcaseの後に↓のような感じで{}をつけてもいいんですか? switch(a) { case 1: { 文1; 文2; } break; case 2: { 文1; 文2; } break; }
>>827 ありがとうございます。
やってるの見たことなかったので何か不安だったので質問しました。
変数宣言とかでそれが必須になることもある
>>828 caseは単なるラベルなのでブロック構造とは無関係。
こんなのだって許される。
switch(a)
{
{
case 1:
文1;
文2;
break;
case 2:
;
}
{
文1;
文2;
}
break;
}
>>830 こういう場合って{とcase 1:の間で変数宣言してもちゃんと処理されるの?そのとき代入も一緒にしてもいいのかな?
宣言は処理される 代入は飛ばされる caseのところへgotoしてるのと一緒
質問じゃないけど、関数の引数に関数をアドレスで渡すことが今日判明した 世界が変わった気がした
めくるめく高階関数の世界へようこそ
835 :
826 :2011/08/31(水) 00:16:27.99
>>830 >>832 今までswitch文がしっくりしてなかったけど
ラベルだって知って初めてしっくりきました。
最近CからC++に移行したのですが、ある本を見るとmain関数の中にreturn 0;がありませんでした。 これは、「C++ではmain関数で戻り値を明示しなかった場合は0になる」という理解で合ってますか?
あってます
>>836 warning C4508: がコンパイルすると出るだろ?
>>838 int main(){}
をVC++2010でビルドしたところ、特に警告は出ませんでした。
環境によっては警告が出ることもあるのでしょうか?
そうだとすれば、やはり戻り値を明示した方が良いのでしょうか?
838
VC6でした。
>>840 しなくていいよ.ボロコンパイラがwarnning出そうが知ったこっちゃない
>>840 ISO/IEC 14882:1998でも↓このように定義されている。警告がでるうんこコンパイラなんて見たことがない。
もしかしてcfront? www
3.6.1 p5
A return statement in main has the effect of leaving the main function(destroying any
object with automatic storage duration) and calling exit with return value as the
argument. If control reaches the end of main without encountering a return statement,
the effect of executing
return 0;
>>840 0以外の値を返したいなら書くしかない。
ただそれだけ。
atan2の引数はなぜあのような順番になっているの?
>>845 xy平面上に原点Oおよびそれと異なる点P(x,y)があるとき、x軸と半直線OPのなす角を求めたりするときに
atan2の引数の順番が逆になっていれば、点Pの座標をそのまま使ってatan2(x,y)と出来ると思うんですが
atan3でも作ればいいじゃない
>>847 そうじゃなくて、そもそものatan2が何故ああなのかが気になる
俺よりはるかに頭の良い人が作った言語なのに、理由もなく逆にしてるってのは多分ないと思うので
普通の(下に延びるスタック)CPUなら、逆になってないだろ。
tanがy/xだからyが先
x>0 なら atan(y/x)==atan2(y,x) だから
>>850-851 それぐらいの理由ならわざわざatan2を用意する必要も無いような……
と思ったら、atanとatan2では値域が違うんですね
(atanは数学的な逆正接関数と同じく-π/2〜π/2、atan2はx, yの符号に応じて-π〜πの値をとる)
これには何か意味があるんでしょうか?
>>846 のような使い方では引数の順番が合わないので違うと思いますが……
だから、y / xの順番なんだよ。xが0のときには重宝するぞ。
>>853 そのような理由であれば、引数の順番については納得出来ます。
それでは、値域が-π〜πであるということにも何か理由があるのでしょうか?
>>854-855 に関しては特にコメントはございません。
バカはしゃべるなよ
>>859 846のような感じで、極座標における偏角を求めるのに使うということですよね?
その用途であればやはり変数の順番が逆の方が使いやすいのでは……
と堂々巡りになってしまうので根本的に考え直してみたのですが、
C言語においては、「直交座標をそのまま入れて偏角が出たら楽じゃん」という安直な考え方よりも、
「逆正接関数による偏角の求め方を知っている人からすると、atan(y/x)とatan2(y,x)でyとxの順番が違うとかえって混乱する」という考え方を採用している、
というだけなのでしょうか?
(実際、前者の考え方によってatan2を定義したと思われる言語もあるようです)
だとすれば、そもそもの疑問の持ち方がおかしかったですね……
それにもかかわらず答えていただきありがとうございました。
直交座標の各成分に優劣はない だからx, yの順に並ぶほうがいいなんてことを言う奴はアホ
>>853 のどこに納得できる理由があるのかわからないw
N要素の組から各要素への射影関数の添え字集合は自然数だろ
自然数は順序数じゃん
なら順序数の定義にふくまれる関係<を優劣とすれば
>>861 の一行目の否定が証明できる
仮定が間違い 不合格
N次元デカルト空間は実数の直和で定義されてるから直交座標系上の点とNつ組は同型じゃん
866 :
デフォルトの名無しさん :2011/09/03(土) 23:15:51.87
じゃないよ
867 :
デフォルトの名無しさん :2011/09/03(土) 23:50:10.75
>>861 優劣がないならわざわざy, xの順にする必要ないよね
優劣でなく順番に意味がある
FORTRAN77からの伝統だからな。由来が知りたかったら爺さん探して聞くことだ。
2重ループでまわすときも外をy内をxにすることがほとんどだし、 yが先なことにいちいち違和感もってたらやってけないだろ
え?
せやな
873 :
デフォルトの名無しさん :2011/09/04(日) 11:50:15.24
fwriteで100バイト書きこむ fseekで50バイト戻る そこをEOFにしたい 結果としては50バイトのファイルができあがる というようなことしたいんですが、 一旦100バイト書きこむとfseekで書きこみ位置戻しても関係無いんですね、 上記のようなことは可能ですか? 新しくファイル作リ直すしかないんでしょうか?
>>874 ftruncate()が使えるかもしれませんが、標準関数だけなら作り直す以外ありません。
>>875 回答ありがとうございます。
素直に作りなおすことにします
877 :
デフォルトの名無しさん :2011/09/04(日) 12:53:21.12
上書きモードで50バイト書きこめばいいじゃん
EOFを書きこむのはいいのか?
EOFの書き込み方を具体的に説明してみろ。
882 :
デフォルトの名無しさん :2011/09/04(日) 17:28:03.19
ごめんなさい
>>874 その場所で0バイトの書込みをするとtruncateしてくれるかも。
環境依存で良ければ試してみると良い。
C言語を0から始めるのですが、お勧めのサイト・本があれば教えて下さい。 宜しくお願いします。
K&R
「C実践プログラミング」 でCの文法、make、gdbなど、基礎を習得 ↓ 「C言語ポインタ完全制覇」 or 「秘伝C言語問答 ポインタ編」 でポインタに関して完全理解する ↓ 「エキスパートCプログラミング―知られざるCの深層」 でスタック、ヒープ、リンカ、ローダなど周辺知識を習得 ↓ 「C言語によるオブジェクト指向プログラミング入門」 で実践的な大規模プログラムの作り方を学ぶ ↓ 「C言語デバッグ完全解説」でバグに強いプログラムの記述法をマスター ↓ 神の誕生
馬鹿の誕生の間違いだろ 糞本ばかりあげやがって
ネタコピペにマジレスするなよ
マジレスすると、大きめの本屋で立ち読みして肌に合ったものを選ぶのが一番 他人が分かりやすいからといって、自分が分かりやすいとは限らない 本の語り口調が肌に合わないとか色々あるしな
洋書買え 大学のサイト見れ
参照とconst参照で大体書けてしまうので、値渡しとポインタ演算をほとんど使わなくなったのですが、何か問題あったりしますか?
それで書けてるんなら問題ないんじゃないかな
fscanf関数の書式指定子について質問です。 csvファイルの中身が 1201011099,名無し 太郎,ななし たろう,03-1234-5678 1201011100,名無し 花子,ななし はなこ,06-1234-5678 とあるんですが fscanf(ReadFp2, "%d, %[^,]s", &i, &str); でループさせたとき2回目のループでエラーが出るので、フォーマット指定子で%[^,\n]sと%[^,\r\n]としても エラーで読み込むことができませんでした 番号と名前だけ変数に取るにはどうすればいいですか?
%[^,]s こんな書き方あったっけ?
> 2回目のループでエラー って"ふりがな"と"電話番号"を (2回目の) &i, &str に格納しようとしているからでそ? > 番号と名前だけ変数に取る まず fgets() とかで1行読んだものを sscanf()で取り出す、とか?
> こんな書き方 ウィキペディアに解説があったよw
>>899 ありがとうございます
それでできました。
つーか、文字群指定にsは要らんがな。 つまり、"%[^,]"でいい。
foo(const Point &point) foo(Point &point) の違いを教えて下さい。 Point p(0.0, 2.0); foo( p ); と上の関数だけしか定義してないときに,foo( p )を渡したら, no matching function for callってコンパイラに怒られました。 foo( Point(0.0, 2.0) ); とコンストラクタで一時オブジェクトを渡すと通りました。 2つの違いをどなたか御教授下さいませ。
一時オブジェクトはconst参照でしか束縛できないので通るが 普通の変数はどっちでも束縛できるのでどっちを呼べばいいんだよって文句言われる
普通の変数ならconstじゃ無いほうがえらばれる
>>905
>>904 落ち着いて、よく見直したらpの型(position)を間違えてました。もう一回ためしたら動きました。
ごめんなちゃい。
例外に関してよく分からないことがあるので質問させてください。 今、 try { ... throw Exception(...); } catch (Exception& ex) { ... }; のようなコードがあるとき、例外オブジェクトはどこに作られるのでしょうか。 普通に考えればtry節の中は、 Exception ex; ... throw ex; と同じ(テンポラリオブジェクトにおける最適化はこの際おいておく)ですから、 exはスタック上に作られることになると思います。 それでも、その外側のスコープで&を捕まえられると言うことは、throw の引数は、 暗黙のうちにどこかにコピーされるものと考えられますが、それでよろしいでしょうか。 書籍は「投げられる」とばかり書かれていて要領を得ません。 それで良い場合、作られる場所がスタックやヒープ状では問題が起こりそうです。 グローバル領域ですとcatchブロックをさかのぼっている最中に発生した例外で問題が起こりそうです。 そこから推察するに、システムが予めスレッドローカルなメモリを確保していて そのメモリ内にコピーが作成されるように思われます。またそのメモリは2重例外で問題が起きないよう、 なんらかの管理が行われているものと想像できますが、その認識でよろしいでしょうか? また、これらの動作は、(コンパイラの)実装依存なのでしょうか。 こういった疑問を検索できる文書へのポインタがあれば併せて教えていただけるとありがたいです。
みんなはCでTDDどうやってる?
CとC++でなんか違うの?
>>911 cが人間で、c++は触手やら色々の生えたパワードスーツ
基本、cとしても使えるけど、拡張部分使うと強力になる
が、時々触手が言う事を聞かなくなる
他人のC++は読みたくないが 自分で書くならCよりC++
みんなはCでTDDどうやってる?
CとC++でなんか違うの?
名前が違う
ブロックにいちいちコメントつけてるような奴はオブジェクト指向を解ってないとか言って C++でブロックをやたらメンバ関数にする人がいるんだけど、実際どうなの? 確かに全体の流れは読みやすくなるけど、1度しか呼び出さない、 しかもメンバ変数を弄くり回してるようなルーチンを関数にするのって、危なくて気持ち悪いよね。 ヘッダの行数も凄いことになってたけど、共同作業じゃああいうのが喜ばれるのかな。
メンバ関数ではやらないけど関数化は1度きりでも効果あるだろ 不要な変数に触らないで済むし、エディタの折りたたみ機能を使わなくてもコードが見やすい
>>917 それオブジェクト指向ちゃう。構造化プログラミングや。
って反論すれば良いと思うよ。
こういうのは1度しか呼び出さないかどうかが問題なんじゃなくて、
変数のスコープをうまく制限して部分部分の構造をすっきりさせるのが良い。
出来るのとついやってしまうのでは全然違うだろう 関数化はついやってしまうのを防げるからなるべくやったほうがいい
>>920 constを付けてると却って馬鹿みたいに見えるな
関数化することで処理に名前が付くのも良い コメントを書いてるのと同じ意味になる もちろんhoge()とか付けたら意味内が
構造化はソースコードが見やすくなるだけで幸せ。
みんなはCでTDDどうやってる?
Cやアセンブラで間に合うような分野なら テストみたいな生ぬるいものじゃなくてそれこそ形式手法使ってるだろうな
答えられないから飽きるんだよw
int func(a, b, c) int a, b, c ; { printf("%d, %d, %d", a, b, c); return 0; } int main() { return func(1, 2, 3); } C++ではできないのはなんで? こっちのほうがコードが綺麗に書けると思うんだけど
古い書き方だから
dllライブラリ作ってるんですけど、初期化が必要な場合 グローバルな関数を呼び出しさせるのか、インスタンス作らしてメンバ呼び出すのかどちらがいいでしょうか
935 :
933 :2011/09/09(金) 23:35:55.56
あぁ、勘違いした DLLに限ったことじゃないしお好みでいいと思うよ
>>917 メンバ変数をクラス内グローバルだとか、関数内での動きが見えないとかと
病的に嫌って引数と戻り値だけでやりとりしていた人がいたけど
もはや何の為にクラス使ってんのって話だよ。
みんなはCでTDDどうやってる?
>>938 int value1 = 0;
float value2 = 0.0f;
value2 = Henkou(value1);
内容は暗いまでも、式を見れば、int型の値を利用してfloat型の値を返す関数だと分かる。
Henkou100まで追加されても流れを追うことが可能。
Henkou();
実はメンバ変数value1,value2を同じように動かしているが、呼び出し側からは何を変更しているのか全く分からない。
Henkou100を追加するまでに値を見失うこと必至。
privateだからと甘えたソースの多いこと多いこと。
関数を細切れにするのなら、尚のことメンバ変数経由の値変更なんてするものじゃないと思ってる。
> 呼び出し側からは何を変更しているのか全く分からない 呼び出し側から何を変更しているのかいちいち気にしなきゃならないなんて クラスにした意味無いじゃんw > 関数を細切れにする これも意味不明
class Hoge{ private: int i; void Foo1(); void Foo2(); public: Hoge():i(0){} virtual ~Hoge(){} }; void Hoge::Foo1(){ for(; i<10; ++i){ cout<<"a"<<endl; } } void Hoge::Foo2(){ for(; i<20; ++i){ cout<<"b"<<endl; } } 極端な話、こういうバカを懸念しろってことか?
int Hoge_Foo1_i = 0; int Hoge_Foo2_i = 0; struct Hoge{ static void Foo1(); static void Foo2(); }; これでおk。
>>942 忘れた頃にクラスの仕様を変更しろって言われたらどうすんの?
どこで何が変わっているのかも気にしないで、またバカみたいにメンバの変更箇所を探すの?
どっちにしろ変更箇所を探さないといけないのは当たり前だろ
そんな考え方で安易にグローバル変数を量産されたら困るんだよ。
メンバ変数の話じゃなかったのか・・・
メンバ変数ってのは、クラス内のどこからでも変更可能なわけで。
どんだけ病的なんだ
>>951 そうやって逃げ続けてるから、いつまで経っても人に迷惑のかかるコードしか書けないんだよ。
コードなんて書いたことすらないグーグル勢だろ
>>943 を見てブロックを超える広域変数は普通にヤバいと思ったわ
>>951 privateでもクラス内でグローバルだよ
constと勘違いしてない?
スレを閉じて枕に突っ伏しているのか、反論を必死に検索中なのか知らんが、 自分で考える力も無いのに聞いたような話で水を差すのはどうかと思うねw
オブジェクト指向なんてクソだと思ってるオレでも 941がパラダイム未修得のトーシロと判断するわ
お、なんかそれっぽい言葉を見つけてきたみたいだねw 反論としては全く機能していないけど。 添削してあげるからまずはコードを書いてみ?
30分も与えられて簡単なクラス1つ書けねーのか。 ゴミにも程がある。
959 :
デフォルトの名無しさん :2011/09/14(水) 06:43:17.13
>>951 お前が分かってないじゃん
どこにアンカ付けてんの?
とりあえず否定しておけば、誰かが何か言ってくれるとでも思ったのでしょうよ。 馬鹿な上に、甘ったれ。 おそらく学生だろうが、それ以前に人間として話にならん。
お前らこんなくだらないことで盛り上がれて楽しそうだな。
というかメンバ変数絞って使うのは常識でないの。 何があろうと一切使わない、は病的だけど。
うむ。2chは肥溜めということがよくわかる良い議論であった。皆の者もう下がって良いぞ
>>964-968 うむ。2chは肥溜めということがよくわかる良い流れであった。皆の者もう下がって良いぞ
普通に言ってること分かるけど アスペ?
次スレよろしく
で、結論は?
お前らはうんこ
>>962 でFA.
引っ張るようなレベルの話ではない.
続きは宿題スレでどうぞ.
何仕切ってんだテメー
やんのか?ああ?
いいぜ表出ろや
>>1-979 うむ。2chは肥溜めということがよくわかる良い流れであった。皆の者もう下がって良いぞ
最近C++の本を買って来たのですが、家に帰ってくるとくたびれてしまいその本を読む前に寝てしまうのですがどうすれば良いですか?
その本を枕に眠ればいいと思うよ
試しに使ってみたら案外寝心地が良かったので、これからは枕として活用したいと思います ありがとうございました。
そんなんじゃ、お先真っ暗だな。