1 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 15:14:51 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.46【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1198755167/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
577 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 22:19:04 ] C言語って1から覚えるとなると難しいでしょうか? プログラム関係の職(未経験可)どうしてもやってみたくて 就こうと思ってるんだけど理系学校出てないから無謀かな… スレ違いだったら凄くすいません…
578 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 22:21:27 ] まぁアレだ。プログラマ板で聞けばいいんじゃね
579 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 22:22:16 ] >>577 どんな人も1から覚えるわけだが。
580 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 22:26:36 ] パソコンとインターネット環境持ってるなら、ただでプログラミングの 勉強できるから、やってみればいいんじゃないか。 難しいかどうかは、人によるからなんとも言えない。 また、理系かどうかは思ったより関係ない。 ただし、数字アレルギーとか英語まったく読む気ないですぅとか言うなら、 やめた方がいいと思う。
581 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:00:31 ] でも、ひでーアルゴリズムのコードを見ると、 理系ってのも大事だなあと思う。
582 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:06:11 ] >>578 プログラマ板か…、予備知識無くここにカキコんじゃったからな… 次からそっちで聞いてみます >>579 まぁそうなんですよね…<どんな人も1から それを承知で聞いてみたんで >>580 色々サイト巡りして知識付けようとはしてます 数字アレルギーは全く無いけど、英語が学校成績で常に2付近だったから それが不安材料でヤバイってのは承知済み…orz 今度からプログラマ板でも行ってカキコしてみます レスどうもでしたm(__)m
583 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:12:35 ] プログラミング関係の英語ドキュメントなんて複雑な文法とか表現使ってないから学校の成績はほとんど関係ない
584 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:14:29 ] 俺も数学と英語は毎回赤点だったが今では必要なだけは出来るようになったぞ。 まあ相性と経験次第。
585 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:44:01 ] >>581 理系でもひでー奴はいくらでもいる。 >>582 > 英語が学校成績で常に2付近だったから >>580 をよく読んでくれ、英語ができないんじゃなくて、 「英語をまったく読む気がない」ならって書いてあるだろ。 君が必要に迫られたら何とかするタイプなら、心配はない。 >>583-584 が言うように、そんなに高レベルの英語が出て くるわけじゃないし、しかもラッキーなことにここ数年で 機械翻訳がそれなりに進化して、技術文書ならなんとなく 意味が理解できるぐらいなってきたから、あまり心配しな くても大丈夫だよ。
586 名前:デフォルトの名無しさん [2008/01/29(火) 23:44:45 ] 質問させてください。以下のソースをコンパイルしたところ、エラーが吐かれたのですが、その理由が良く分かりません。 #include <fstream> #include <TCHAR.h> #include <string> #include <sstream> using namespace std; class zantei{ private: // 行動データ構造体 class Action { public: int No; // 行動番号 (無しなら0) LPTSTR Type; // 行動種類 (無しなら0) LPTSTR Detail; // 行動詳細 (無しなら0) int Damage; // ダメージ(無しなら100) LPTSTR Color; // 色 (無しなら0) int X; // マルチプレイ用の遠距離行動(無しなら0) }; Action action[32]; public: BOOL LoadAction(); };
587 名前:デフォルトの名無しさん [2008/01/29(火) 23:45:15 ] エラー: ・error C2146: 構文エラー : ';' が、識別子 'Type' の前に必要です。 ・以下、変数Typeが認識されないためと思われるエラー他たくさん(24個) 全角スペースや、Typeが実は予約語だったんじゃないかとも疑いましたが、 空白はすべて半角スペースとタブ入力でしたし、TypeをiやNumに変えても同じエラーが出ました。 …ということは、完全に知らないことか、思い至っていないことによるエラーだと思われる、ということまでは考えることはできました。 どなたかご教授いただけないでしょうか。
588 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:45:50 ] ほほう 何というコンパイラで、何というメッセージが吐かれたのだい?
589 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:50:01 ] コンパイラは、Visual Studio 2005 Academic Editionです。 エラーは、>>587 以外もかくとすると…、ちょっと多いので、少々お待ちください。
590 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:51:06 ] >>586 そのコピペは全角だらけやな
591 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:51:32 ] このエラーだと、通常は Type の直前にある物がおかしいんだが、 tchar.h はインクルードしてあるしな・・・。 TCHAR が大文字でも何か起きると思えないし。
592 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:54:24 ] もしかすると、 #include <windows.h> が無かったりだったりとか?
593 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:54:26 ] >>587 全角が入ってる。間違いない。絶対だ。
594 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:54:56 ] エラー 2 error C2146: 構文エラー : ';' が、識別子 'Type' の前に必要です。 エラー 3 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません エラー 4 error C4430: 型指定子がありません - int と仮定しました。 エラー 5 error C2146: 構文エラー : ';' が、識別子 'Detail' の前に必要です。 エラー 6 error C4430: 型指定子がありません - int と仮定しました。 エラー 7 error C4430: 型指定子がありません - int と仮定しました。 エラー 8 error C2146: 構文エラー : ';' が、識別子 'Color' の前に必要です。 エラー 9 error C4430: 型指定子がありません - int と仮定しました。 エラー 10 error C4430: 型指定子がありません - int と仮定しました。 エラー 11 error C2146: 構文エラー : ';' が、識別子 'LoadAction' の前に必要です。 エラー 12 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません エラー 13 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 警告 14 warning C4183: 'LoadAction': 戻り値の型がありません。'int' を返すメンバ関数とみなします。 これよりしたのエラーは、LoadAction()の実装部分で吐かれているエラーです。
595 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:55:00 ] >>592 そうか。撤回する。
596 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:55:42 ] >>594 全角入りのソースでそれと同じエラーを見たぞ。
597 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:56:36 ] 全角はチェックしてるって書いてあるだろw
598 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:57:21 ] まず、LPTSTR を char* にしてコンパイルは通るか? それをチェックしてみようぜ。
599 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:57:31 ] うーん、それじゃ、ちょっとソースをあっぷしてみますね 全角半角スペースを表示させても全角はは行っているようにみえないですが… 見落としかもしれないですし
600 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:57:43 ] あ、いや、wchar_t* か。
601 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:58:03 ] >>598 あ、はい、分かりました
602 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:01:02 ] マルチバイト文字セットに変えてchar*型、一応w_char*型にしてみても、 同じエラーが吐かれました(確認したのは大体のエラーの見た目と数だけですが) ソースをアップする作業に入りますね
603 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:01:27 ] w_char じゃなくて wchar_t だぜ
604 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:17:01 ] お待たせしました。 www.youlost.mine.nu/html999/upload.php の、2968.zipです。 うp用に、配置しなおしたら、エラーが増えて涙目になってました(汗 他のアプリケーション用に書いてたものを、エラーはかれていたソースファイルを別プロジェクトでテストしながらなおそうとしたため、 プロジェクト別フォルダから読み込む方式になっています。 ヘッダがプロジェクトに入っていないのは、…えー、ごめんなさい、忘れました、試行錯誤の過程です。 いずれヘッダも戻すつもりではいました。 …ごめんなさい。
605 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:28:00 ] zantei の最後にセミコロンがない。
606 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:29:01 ] game.h の方のやつね。
607 名前:デフォルトの名無しさん [2008/01/30(水) 00:31:11 ] 「最大50文字で自然数を2つ入力し、その大小を求めるプログラムを作成せよ」 って問題なんですが、プログラム作ってみたけどわかりません 文字数が同じときの結果がめちゃくちゃになりました 誰かこのおしえてください(><) cout << "文字数a:" << a_count << endl ; cout << "文字数b:" << b_count << endl ; if(a_count > b_count){ cout << "a>b" << endl ; }else if(a_count < b_count){ cout << "a<b" << endl ; }else if(a_count == b_count){ cout << "文字数が一緒なので一桁ずつ判断します" << endl ; for(int i=0 ; i < a_count ; i++){ if(a[a_count-i] == b[a_count-i]){ cout << a[a_count-i] << "=" << b[a_count-i] << endl ; }else if(a[Max_Length-i] != b[Max_Length-i]){ break ; } } if(a[a_count-i] > b[a_count-i]){ cout << "a>b" << endl ; }else if(a[a_count-i] < b[a_count-i]){ cout << "a<b" << endl ; } } }
608 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:32:38 ] a[a_count-i-1]
609 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:33:17 ] (><)
610 名前:607 [2008/01/30(水) 00:34:08 ] #include <iostream.h> #include <iomanip.h> const int Max_Length = 50 ; // 入力できる文字数の最大値 main() { char a[Max_Length] ; // 最初に入力する文字列 char b[Max_Length] ; // あとに入力する文字列 cout << "2つの自然数(最大50桁)を入力し、" << endl ; cout << "その2数の大小を判定するプログラムです" << endl ; cout << "数値を入力してください(最大50桁)" << endl ; cout << "a>>" ; cin.getline( a , Max_Length ) ; cout << "b>>" ; cin.getline( b , Max_Length ) ; int a_count , b_count ; // 文字カウンタ int i , j ; a_count = 0 ; b_count = 0 ; i = 0 ; j = 0 ; // 文字数をカウントする while(a[i] != '\n' && a[i] != '\0'){ a_count++ ; i++ ; } while(b[j] != '\n' && b[j] != '\0'){ b_count++ ; j++ ; }
611 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:34:14 ] iostreamマジ見にくい
612 名前:607 [2008/01/30(水) 00:35:02 ] 610が先で、607が続きです(><)
613 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:35:21 ] 入力できる文字数の最大値が 50 なら、バッファは 51 以上必要だね。
614 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:40:17 ] std::lexical_compare使え
615 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:44:48 ] すみません、元からこんなに早くリアクションがくれると思っていなかったので、 質問してすぐ風呂に入る予定だったため、 アップロードしてしばらく返事がなかったので、急いでお風呂に入っていたため、反応が遅れました。 申し訳ありません。 >>605-606 ありがとうございます! セミコロンを直し、game.hをプロジェクトを追加し、gamemain.cppにgame.hをインクルードし、 gamemain.cppのクラス宣言部分をコメントアウトしてコンパイルしましたが、 結局 error C2146: 構文エラー : ';' が、識別子 'Type' の前に必要です。 がヘッダで吐かれてしまっています… ここの部分を改善する、考えられるミスはありませんでしょうか…
616 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:50:24 ] >>607 ヘッダファイルは <iostream.h> や <iomanip.h> ではなく <iostream> や <iomanip> を使用する事が推奨されている。 cout とかが std::cout とかになっちゃうのが嫌なら、 この程度のプログラムなら using namespace std; と書いておけば std:: を略せる。 古いコンパイラなら知らんがね。 最大 50 文字なら、a のサイズは Max_Length + 1 にする。 cout の後 cin をする際には、cout を flush した方がいい。 cout << "a>>" << flush; でないと、表示されない事もある。 getline は改行文字を格納しない。改行との比較は無駄。 50 文字以上入力したら次の cin.getline が失敗するのは無視してもいいのかな。宿題程度なら。 cin.clear(); して、改行まで読み飛ばすか構わず cin.getline するか・・・。 文字数カウントは strlen で可能だが、まだ習ってないのかな。 i と j という変数を作らなくても、直接 a_count と b_count 使えばいい。 while 文より for 文使った方がすっきりする。 i が 0 〜 a_count - 1 のループでは、 a_count - i は a_count 〜 1 になる。 これは意図する所ではないはず。 そして、a[Max_Length-i] != b[Max_Length-i] で何をやろうとしているのか分からないし、 このあたり全体的にちとおかしいと思う。 もうちょっとよく考えよう。
617 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:51:00 ] >>615 TCHAR.h → tchar.h
618 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:51:46 ] 全角だろ。間違いない。全角なんだ。
619 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:53:17 ] >>615 風呂の予定なんかどうでもいい。 しかも二回も風呂って書きやがって。 風呂はゆっくり入れ。
620 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:54:03 ] インクルードガードがないのもすげー気になるが、 これだけのヘッダファイルだと BOOL は定義されてなくね?
621 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:54:56 ] #include <cstddef> #include <tchar.h>
622 名前:デフォルトの名無しさん [2008/01/30(水) 00:55:17 ] >>616 たくさんありがとうございます! 考え直してもういっかい来ます
623 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:58:12 ] >>615 とりあえず windows.h をインクルードしとけ。
624 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:58:29 ] #include <iostream> int main(void) { const int max_str = 50 + 1; char str1[max_str], str2[max_str]; std::cout << "数値a入力>"; std::cin >> str1; std::cout << "数値b入力>"; std::cin >> str2; int len1, len2; for( len1 = 0; len1 < max_str; ++len1 ){ if( str1[len1] == '\0' ) break; } for( len2 = 0; len2 < max_str; ++len2 ){ if( str2[len2] == '\0' ) break; }
625 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:59:29 ] std::cout << "数値a 文字数:" << len1 << std::endl; std::cout << "数値b 文字数:" << len2 << std::endl; if( len1 == len2 ){ std::cout << "文字数が一緒なので一桁ずつ判断します" << std::endl; for( int i = 0; i < max_str; ++i ){ if( str1[i] == str2[i] ) continue; else if( str1[i] > str2[i] ) std::cout << "a > b" << std::endl; else std::cout << "a < b" << std::endl; break; } }else if( len1 > len2 ) std::cout << "a > b" << std::endl; else std::cout << "a < b" << std::endl; } >>612 総書き直しすれば簡単
626 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:59:38 ] >>617 提案ありがとうございます。すみません、でもとおりませんでした >>618 エディタでトリプルチェックしましたが、やはり全角はありませんでした… >>619 う…(苦笑)。すみません、お気遣いありがとうです。 >>620 windows.hをインクルードすれば定義されるでしょうか? >>621 これは、BOOLのヘッダでしょうか。すみません、レスを先にして、試してきます。
627 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:00:18 ] >>624 std::cin >> str1; バッファオーバーフロー一直線!!!
628 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:02:38 ] >>625 無茶苦茶やな・・・。
629 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:04:36 ] >>621 試してみたら、エラーが13に減りました! でも、 >>623 windos.hをインクルードしたら、もっと減りました(10)! あとは、game.hに、using namespace std;をかけば、通りそうな雰囲気です。 ありがとうございました。 一応、最後に通るか確認してきますね。
630 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:05:22 ] >>629 ヘッダファイルで決して using しないと俺と約束してくれ。
631 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:08:29 ] >>630 ごめんなさい。 gamemain.cppの方でした。 そして、通りました!皆さん本当にありがとうございました。そして、お騒がせしました! ちなみに、ヘッダファイルでusingすると、どんな弊害がおきるのでしょう? ちょっと考えれば分かるかもしれない気はするので、失礼な質問でしたらすみません。 あと、<TCHAR.h>より、<tchar.h>をお勧めになった理由もお教えいただけないでしょうか?
632 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:10:41 ] 本来 tchar.h という名前のファイルだから気になっただけ。 ヘッダで using して、色々インクルードしまくってると、 どこで using されているかさっぱり分からない状態になる。 using されては困る状況が現れた時、どの using が原因で困ってるか分からない。
633 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:12:45 ] 触っちゃダメよと言われてるヘッダファイルで using されてると泣くしかない。
634 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:16:32 ] usingされているヘッダファイルをインクルードすると、 その名前空間がインクルードしたファイルにもusingされてしまう、ということでしょうか? それとも、usingされてると、呼び出すときに、どの名前空間に所属しているのが分かりにくくなり、 数が膨大になったときに、エラーからたどりにくくなる、ということでしょうか? …後者ですよね?
635 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:17:47 ] 両方。
636 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:21:19 ] おあ、両方ですか。 前者も、ということになると、確かに本当にヘッダファイルでusingしてしまう(されてしまう)と、困ってしまいますね。 絶対にヘッダファイルでusingしないと、>>630 さんと指きりしてお約束します。 ありがとうございました!
637 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:24:53 ] namespace isolate { // isolate using directives and declarations #include "hoge.h" // has using directives or declarations } using isolate::Hoge; // declared in hoge.h, and want to use in this source と無理矢理隔離してみたり。
638 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:28:40 ] なるほど
639 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:46:32 ] STLとATLではどちらを覚えたほうがいいですか?
640 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:50:28 ] STL: どの環境でも使える ATL: Windows でしか使えない
641 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:54:30 ] STL: 誰も使ってない ATL: 90%くらいの環境で使える
642 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:57:43 ] 両方覚えろよ
643 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 03:04:22 ] Windowsでプログラミングするなら両方。 そうじゃないならSTL。
644 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 03:39:23 ] >>642 に一票
645 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 05:46:40 ] てゆーか二者択一するようなもんじゃないだろwwwww
646 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 07:02:37 ] 関数内でnewでchar型の動的確保をしたいんだけど、他の全ての関数でもその宣言した char型のを使えるようにするにはどうすればいい?
647 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 07:06:10 ] ごめん文章が変だったので追記 要するに関数内でnewで宣言したcharをグローバル変数みたいな感じで使いたい
648 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 07:07:01 ] 外部変数にchar*型のポインタ用意してそこに代入すれば?
649 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 07:16:06 ] >>648 ああそうか。それでいけたw staticみたいなので全範囲で使えるようになるのないかなって探してたよ ありがとう
650 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 07:31:28 ] C++で開発をする際、他言語以上にいつもクラス設計で悩まされます 何かそこらへんを専門的に取り扱ったおすすめの本はないでしょうか?
651 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 15:11:37 ] ATLにSTLのコンテナ使う仕掛けが合ったよな。
652 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 15:12:25 ] 有った
653 名前:デフォルトの名無しさん [2008/01/30(水) 15:30:11 ] C言語の質問です。コンパイラはgccです。 while(fgets(buffer,filesize,fp)){ flug=strstr(buffer,str); if(flug!=NULL)puts(flug); } これでなぜ出力文字列が検索できないのでしょうか。 教えてくださいませんか? 私の頭の中ではまず改行までのファイルの一行をbufferに読み込む。 その後、bufferに格納されている文字列とstr(検索したい文字列)を比較して検索。 その返り値がflugに入るので、NULLポインタ以外(失敗)のflugは出力。 これで検索した値からの文字列が出力されると思っておりました。
654 名前:デフォルトの名無しさん [2008/01/30(水) 15:40:40 ] cin.getline って文字列を入力させるときに使うの? 普通に50桁の配列に数字を入れたいときって cin >> a[50] でいいのかな??
655 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 15:43:25 ] きもい
656 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 15:49:42 ] >>653 その部分だけじゃわからん。 つーか、その部分に問題は無い。
657 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 15:50:58 ] >>653 ・flugという変数名がキモい ・filesizeは本当にbufferが指すバッファのサイズ? buffer, filesize, str の宣言や初期化などを詳しく開示しましょう。
658 名前:デフォルトの名無しさん [2008/01/30(水) 17:03:00 ] >> 654 getlineの使い方(ファイルからの一行単位の読み込み) string line; ifstream ifs(filename); while (getline(ifs, line)) { lineには一行がはいってる。 } > cin >> a[50]; これでは配列aの51番目の要素に代入してるだけでは?
659 名前:デフォルトの名無しさん [2008/01/30(水) 18:54:56 ] >>658 やっぱりだめなんですね・・ cin>>a[50] だと50桁も入力できないんです ありがとうございました
660 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 19:19:46 ] 例外がcatch{}の中では生存していると仮定して 関数でnew | malloc した文字列を返して デストラクタでdelete[] | freeするのはありですか?
661 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 19:29:05 ] 言っている意味が分からん。 コードで書いてくれ。
662 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 19:47:17 ] エスパーな俺が翻訳すると、 catch内で作ったインスタンスでもデストラクタは呼ばれるのか? ではないかと。
663 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 19:59:41 ] ふつうにわかるだろ
664 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 20:03:22 ] >>660 文字列クラス返せば?
665 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 21:42:46 ] >>659 「桁」が何のことか分からん 配列のサイズのことならfor引数足してまわせばいいだけ 50桁の数値(10の50乗とか)を扱いたいなら普通には無理
666 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 21:43:28 ] 引数じゃなかった添え字だ
667 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 22:27:02 ] 自作クラス内に、CreateWindowというメソッドを作りたいんですが、エラーが出てしまいます。 エラーメッセージを見るとどこかで定義されてるようなんですが、 クラス内は独立した名前領域で、同じ関数名を使えるのではないのですか? どなたか、回答をお願いします。
668 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 22:29:10 ] >>667 windows.h から同名のマクロが include されているのかも知れない
669 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 22:32:01 ] 回答ありがとうございます。 windows.hは確かにインクルードしていました。 windows.hをインクルードしないわけにはいかないし、 CreateWindowという名称を使うのはあきらめたほうがよさそうですね。
670 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:10:41 ] すみません、質問です. C++言語のソースを読んでいて、疑問に感じた所があります。 struct Hoge{ unsigned Wakeup(void) const { return wakeup_time; } Hoge(Container& container); ~Hoge(); private: unsigned int hoge_time; Container& fuga; }; これ構造体ですよね?クラスみたいですけど・・・。 本を読んだりしてクラスと構造体はまったく別物と認識していたんですが。 混乱しています。
671 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:12:12 ] C++では同じ 違いはデフォルトのアクセスがpublicな事
672 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:19:54 ] >>670 実装は同じだけど、考え方としては区別したほうが良いんじゃないかな、
673 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:21:02 ] >>671 もうちょい違うっしょ。
674 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:21:53 ] メンバ変数を public にした方が何かと便利そうなのは構造体に、 そうでないのものはクラスに。 そう考えると、自然と構造体を使う状況は限定される。
675 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:23:22 ] >>673 デフォルトで public 継承になる、というやつのことか?
676 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:30:12 ] テンプレート絡み。
677 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:32:36 ] 最近どこかで目にした流れだな
678 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:36:09 ] はい、STLスレの受け売りです。
679 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:38:38 ] だからテンプレート引数の話とここの話とは ちょっと違うんじゃないか、と。
680 名前:670 mailto:sage [2008/01/30(水) 23:43:33 ] C++だと若干の違いはあるにせよ、classの代わりにstructと書くこともできるんですね。 ありがとうございました。
681 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 00:26:32 ] newで多次元配列分の確保ってできない? char *c; int p=20; c=new char[p][255]; こんな感じでしたいんだけどこれだとエラーでる
682 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 00:26:53 ] char (*c)[255] = new char[p][255];
683 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 00:32:46 ] >>682 ありがとうございます。原理はよく分からないけどできました 勉強してきます
684 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 00:36:46 ] 配列へのポインタを使ってる。 typedef 使うと多少分かりやすいかと。 typedef char BUF[255]; // BUF は char 型 255 要素の配列型 BUF *c = new BUF[p]; やっぱそうでもないか。
685 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 00:40:26 ] つまり、char 型 255 要素の配列を p 個確保して、 c[i] とすると i 個目の配列が得られ、 c[i][j] とするとその配列の j 番目の要素にアクセスできる、と。
686 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 00:53:06 ] >>684-685 分かり易くありがとうございます。何となく分かったような気がする とりあえずもう一度newについて再勉強してきます
687 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 01:23:02 ] newでもmallocでも同じだよ
688 名前:デフォルトの名無しさん [2008/01/31(木) 04:56:35 ] template <int N, typename T> struct array_str { T array[N]; T &operator[](int n) { return array[n]; } }; int p = 20; const int ssize = 255; vector< array_str<ssize,char> > c(p); として、以下のように使う方法は? c[1][1];
689 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 05:15:04 ] >>688 使い方を示しながら使い方を聞く意味がわからん。
690 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 05:19:04 ] proxy classの話かな?
691 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 05:37:32 ] this->template func<type>(arg); という書き方を見たんですが、 this->func<type>(arg); との違いを教えてください。
692 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 05:48:03 ] >>691 template付けないとエラーでコンパイルできない場合がある。 .演算子、->演算子、::演算子の後ろにメンバテンプレート特殊化の 名前があり、それがテンプレート仮引数に属している場合がそう。
693 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 05:52:19 ] >>691 テンプレート内で、 this の型がテンプレート引数に依存するとき、前者のように template を明示しないと、コンパイラは this->func<type という部分を (this->func) < (type) のような比較式と認識してしまう。
694 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 08:21:51 ] "ab"でaとbの間に「"」を入れたい場合って「"a""b"」でおk?
695 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 08:23:28 ] >>694 "a\"b"
696 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 08:23:51 ] \"
697 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 08:29:43 ] ありがとう。あぶなく間違って使うところだった
698 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 09:05:56 ] まぁやったところで別に問題はないけどね、表示されないだけで
699 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 09:07:00 ] 確かになw エスケープを "" で表現するのって、どこの文化だっけ? どっかで見た気はするんだが。
700 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 09:46:44 ] 昔のBASICだろ
701 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 09:50:26 ] だっけか。全然覚えてないや。
702 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 10:45:56 ] 試しにVBでやってみたら通ったわ。""
703 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 11:36:23 ] 演算子の優先度と結合規則がいまいちよく分かりません。 下の式を意味が変わらない範囲でカッコを外すとどうなりますか? a = ( b *= ( ( c+d ) << e ) ) ( ( * ( a[b] ) ) . c ) -> d ( a - ( ( b-c ) * d ) ) - e ( + ( ++a ) ) + ( ( b&c ) << ( d+e ) ) ( ( ( * ( a.b ) ) . c ) -> d ) ++ あと下の4つは順序を明確にするためにカッコを付ける問題です。 a + b * c - d a <<= b << c <= d a = b &= c ==d * a . b * c 参考になるサイトとかありますか?アドバイスお願いします。
704 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 11:39:36 ] 参考になるのは優先順位表 高低だけじゃなくて、右左にも注意
705 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 13:06:37 ] テスト問題とか、与えられた式を最適化するようなプログラムを作っているのでなければ 素直にカッコをつけておくというのはどうだろうか。 前提無視ですね、すみません。
706 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 13:40:09 ] 言語仕様とはちょっと違うけど今でもDB2のSQLは文字列中の"を""で表すぞ
707 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 15:44:34 ] >>703 そんなの、K&Rにかいてあるだろ
708 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 19:40:40 ] ビット演算の優先順位をちゃんと把握してる人なんてそんないないわ。
709 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 20:09:03 ] >>703 優先順位がわかりにくいときは括弧つければいいと思うよ。別にかっこ悪くないと思うよ 括弧減らしてもバグが増えたら意味が無いしな。
710 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 21:35:35 ] VC++8使ってるんですけど、グローバルスコープの関数ってやっぱり ::CreateWindowEx とかスコープ演算子つけた方が良いのですか? ネットにあるサンプルコードだと、両方見かけますが…
711 名前:デフォルトの名無しさん [2008/01/31(木) 21:42:54 ] boostを使わずにstringの文字列を小文字の文字列に変換するにはどうすればよいですか?
712 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:06:34 ] >>711 string str("HeLLo"); for (int i = 0; i < str.size(); i++) { str[i] = tolower(str[i]); } cout << str.c_str() << endl; あまりよろしくないかも。
713 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:12:35 ] std::transform(str.begin(), str.end(), str.begin(), tolower);
714 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:20:35 ] ざんねん、あなたのじっそうでは、tolowerは、「まくろ」だった
715 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:30:15 ] hoge.hで // 構造体 struct POI{ int n; float x; }; // クラス class hoge { public: hoge(void ); // コンストラクタ ~hoge( void ); // デストラクタ private: POI poi[4]; }; と書き、 hoge.cppの hogeコンストラクタ上で poiの初期化を行いたいのですがうまくいきません。 今下のようにやっているのですがどのように直せばいいのでしょうか、どうぞよろしくお願いします。 poi = { { 1 , 0.5 }, { 1 , 0.5 }, { 1 , 0.5 }, { 1 , 0.5 }, };
716 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:30:29 ] そ、そんな実装もあるのか・・・。
717 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:31:24 ] for(int i = 0; i < sizeof poi / sizeof *poi; ++i) { poi[i].n = 1; poi[i].x = 0.5; }
718 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:37:12 ] >>710 好きなほうでどーぞ
719 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:40:15 ] >>715 poi = { { 1 , 0.5 }, { 1 , 0.5 }, { 1 , 0.5 }, { 1 , 0.5 }, }; その形式が使えるのは宣言時だけなので >>717 みたいにしないといけません
720 名前:715 mailto:sage [2008/01/31(木) 22:40:59 ] >>717 できれば poi = { { 1 , 0.5 }, { 1 , 0.5 }, { 1 , 0.5 }, { 1 , 0.5 }, }; こういう風に一括でやりたいのですがこれは無理なのでしょうか?
721 名前:715 mailto:sage [2008/01/31(木) 22:42:07 ] >>719 すいません、見逃しました。 そうですか、わかりました。ご丁寧にありがとうございます。
722 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:43:14 ] >>720 POI poi_src[] = { { 1 , 0.5 }, { 1 , 0.5 }, { 1 , 0.5 }, { 1 , 0.5 }, }; std::copy(poi_src, pos_src + sizeof poi_src / sizeof *pos_src, poi);
723 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:44:45 ] POI poi_src[sizeof poi / sizeof *pos] = { ... }; とサイズ指定してた方が安全か。
724 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:45:24 ] それでもC++0xなら、C++0xならなんとかしてくれる……
725 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:47:00 ] static const POI poi_src[sizeof poi / sizeof *pos] = { ... }; とした方がいいか。
726 名前:デフォルトの名無しさん [2008/01/31(木) 23:06:46 ] >>713 ありがとうございます。でもコンパイル通りません。 下のソースだと、 char my_tolower(char s) { return tolower(s); } int main() { string s = "Hello world"; transform(s.begin(), s.end(), m.begin(), toupper); // コンパイル通らない transform(s.begin(), s.end(), m.begin(), my_tolower); // コンパイル通る 下のような結果になります。 test.cpp:14: error: no matching function for call to 'transform(__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, <unresolved overloaded function type>)'
727 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 23:08:32 ] >>726 >>714 ということか。
728 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 23:10:03 ] 何かオーバーロードされてるのか・・・
729 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 23:12:44 ] >>726 transform(s.begin(), s.end(), m.begin(), static_cast<int(*)(int)>toupper);
730 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 23:20:45 ] >>714 両方あるんじゃなかったっけ?
731 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 23:26:50 ] インクルードするヘッダによって違わなかったっけ
732 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 23:46:02 ] 両方あるなら (tolower) でいいってことか
733 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 23:46:41 ] #undef tolowerじゃだめなの?
734 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 00:00:42 ] >>732 括弧無くても大丈夫だな。 後ろに ( ) がついてないから。 それにしても、うちの gcc じゃ >>726 みたいなエラーでないんだがなあ。 バージョンが違うのか。
735 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 00:11:15 ] tolower(int)のほかに、tolower(char)とかtolower(wchar_t)とかあるんでしょ。
736 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 00:20:07 ] Cとの互換関数だから、規格的にオーバーロード出来ないと思うが。
737 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 00:20:08 ] なら static_cast<int(*)(int)>(tolower) とかしないといけないのか。 面倒臭いな。
738 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 00:43:56 ] <locale>かどこかに、第2引数にロカールをとるバージョンがあったと思う。
739 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 00:45:47 ] 古いヘッダ .h なら通るんだよな 謎だ
740 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 01:22:21 ] >>730 Cでは、関数に加えてマクロを用意しても良かったが、 C++だとそれは認められていない。 (JIS X3014:2003では17.4.1.2の6段落目。更に注(159)で明確に指摘されている)
741 名前:デフォルトの名無しさん [2008/02/01(金) 01:28:39 ] double pai(){ double i,imax,n; double x,y,pi; n=0.0; imax=10000000.0; for(i=0;i<=imax;i++) { x=rand()/(RAND_MAX+1.0); y=rand()/(RAND_MAX+1.0); if((x*x+y*y)<1.0) { n+=1.0; } } pi=n/imax*4.0; return pi; } double px(double t){ double pi=pai(); double x,ans; ans=exp(-x*x/2t)/sqrt(2*pi*t); return ans; } としたら エラー E2121 kadai1.c 27: 関数呼び出しに ) がない(関数 px ) と出ましたorz 誰か解決策わかるようでしたら教えてください(;´Д`)
742 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 01:34:28 ] exp(-x*x/2t)/sqrt(2*pi*t); 2t?
743 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 01:43:52 ] あとx初期化してないよね。
744 名前:デフォルトの名無しさん [2008/02/01(金) 01:44:15 ] c++でswitch文のcaseの中では変数宣言できないですか
745 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 01:46:26 ] case HOGE: { int t = 0;} break; ブロックで囲めばいいんじゃね
746 名前:741 [2008/02/01(金) 01:58:11 ] >742 解決しましたw あざす!!
747 名前:デフォルトの名無しさん [2008/02/01(金) 03:31:40 ] >>745 こっちも解決しました。ありがとう酢。
748 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 18:16:42 ] 空を自由に飛びたいな はーい つLSD
749 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 19:11:19 ] LoadLibraryでもらったHMODULEはCloseHandleで処分できますか?
750 名前:デフォルトの名無しさん [2008/02/01(金) 19:24:52 ] どこで質問すればいいのかわからないほどくだらない質問なのですが、 よく引数であるchar* pszMessageのpszってどういう意味ですか? Pointer Stringはわかるんですが、Zがいったいなんなのか・・・
751 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 19:27:11 ] zはzero、szはヌル終端文字列のこと。
752 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 19:29:52 ] pointer string zero-terminated
753 名前:749 mailto:sage [2008/02/01(金) 19:30:06 ] 間違えました。
754 名前:デフォルトの名無しさん [2008/02/01(金) 19:31:13 ] >>751-752 なるほど・・ゼロでしたか 謎がとけました、ありがとうございます!
755 名前:デフォルトの名無しさん [2008/02/01(金) 21:29:40 ] c++のプログラムを書いてます。 コンソールからstringを入力させたいのですが、getline()とcinを併用すると 何回目かのcinがユーザの入力待ちにならずにそのまま長さゼロの入力を受け取った と誤解して処理が先に進んでしまうようです。何かフラッシュとかの処理が必要なので しょうか?
756 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 22:01:29 ] エラーが発生したなら cin.clear(); するまで関数に失敗するが、 そういうわけではなくて?
757 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 01:13:42 ] Pointer to a String terminated by Zero
758 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 01:38:32 ] std::map<CString, CComPtr<ID3DXFont>> fonts; に問題はありますか?
759 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 01:39:47 ] エラーが出なければ問題は無い。 エラーが出るなら問題。
760 名前:デフォルトの名無しさん [2008/02/02(土) 01:41:21 ] 質問させてください. c言語でscanfで入力を受けるプログラムをつくりました. バッチファイルとかシェルスクリプトで入力してやりたいのですが、つまづいています. 要するに、 (実行ファイル)enter(入力)enter では無く、 (実行ファイル)(入力)enter のような感じに書く方法がありますか?ということです.
761 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 01:46:08 ] int argc, char* argv[] でググれ。
762 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 01:48:35 ] >>760 そのレベルは……ぐぐるとかじゃなくて、本を読んできちんとした知識を身に付けた方が良いよ。 いや、マジで……
763 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 01:54:08 ] >>758 STLのこんてなにオートポインタの類入れると
764 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 01:59:29 ] とりあえず>>だとコンパイルエラーになったりするので> >にしとけ。
765 名前:デフォルトの名無しさん [2008/02/02(土) 02:37:31 ] 760です.確かに知識は無いです. 実は数値計算だったので簡単に済ませたかったんです. リダイレクトでパラメータをいれる代わりに、 そのまま数値を書く方法があるのかなと思って質問してみたんですが. どうやら場違いでした.
766 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 03:34:39 ] ウィンドウつくったり図を表示したりするのってWin32API勉強しないとできない?
767 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 03:49:03 ] >763 std::aut_ptrが例外的にダメなオートポインタで、 大抵のスマートポインタは入れても大丈夫じゃねーの。
768 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 12:09:24 ] VC6 だが、std::vector に CComPtr 入れると resize でアサーションエラーが出た。
769 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 12:31:21 ] intrasive_ptr?だっけ? まさにCOMみたいに自前でカウントしてるクラス用のスマポ
770 名前:デフォルトの名無しさん [2008/02/02(土) 12:46:10 ] string型の変数の中身をlistコンテナに一文字ずつ移そうとしてます。 for_each(string.begin(), string.end(), XXXX); みたいにfor_eachを使って書けないでしょうか?
771 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 12:49:16 ] push_backとmem_fun_ptr
772 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 12:50:12 ] mem_fun_refだったorz
773 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 13:03:58 ] これはだめ? std::list<char> l; std::copy(string.begin(), string.end(), std::back_inserter(l));
774 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 14:48:54 ] std::list<char> l(s.begin(), s.end()); または l.assign(s.begin(), s.end()); だろ。
775 名前:デフォルトの名無しさん [2008/02/02(土) 15:35:03 ] for_each(s.begin(), s.end(), mem_fun_ref(v.push_back)); ということですか? でもこれはコンパイルできなかった。
776 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 16:06:20 ] >>775 >>773 は正しい処理だが、 効率が悪いということじゃないの? 初期化の話だよな? >>775 そりゃ、あらゆる点で無理だ。
777 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 16:16:22 ] v.push_backではなくて&std::list<char>::push_backだろ まあstd::back_inserterを使うのが最適なわけだが
778 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 16:18:57 ] 最適は774だって。 EffectiveSTL嫁。
779 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 16:20:27 ] 元の質問は for_each が使いたいらしいから、 >777 でも間違いではない。
780 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 16:51:44 ] >>777 それでもダメ。引数の数が一致しない。 せめてbind1stを使えといいたいところだが ほとんどの実装でunary_functionで参照の参照が 発生してはじかれる。
781 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 16:55:14 ] >>778 範囲指定のイテレータか
782 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 17:07:39 ] ぶっちゃけ、メンバ関数をforeachみたいな連中に渡すのは 面倒くさいのでboost使おう、という話になるw
783 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 17:11:23 ] だからfor_each使わずに>>774 でいいって。
784 名前:784 [2008/02/02(土) 19:38:53 ] 質問です。 //正規分布を求めるメソッド float BestFitInfo::norDis(float x, float mean, float var){ return 1 / ( sqrt( 2 * 3.14 ) * sqrt(var) ) * exp( - (x - mean) * ( x - mean ) / ( 2 * var ) ); } //BestFitInfoというクラスを作って、 //正規分布を求めるメソッドを書いたところ、 warning C4244: 'return' : 'double' から 'float' への変換です。データが失われる可能性があります。 と言われました。すべて引数は float だし、 exp や sqrt の戻り値もそれに合わせて float のはずなので、 どこで double 型が発生しているのかわかりません。 なぜこのようなエラーとなっているのでしょうか? 分かる方がいらっしゃいましたら教えてください。 よろしくお願いします。
785 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:45:47 ] >>784 >exp や sqrt の戻り値もそれに合わせて float のはずなので、 本当か? floatのはsqrtfとかexpfじゃないのか? あと、3.14はdouble型だ。float型リテラルは3.14fと書く。
786 名前:784 [2008/02/02(土) 19:59:47 ] 785さん、お返事ありがとうございます。 3.14fと書いたら「データが失われる可能性があります」と言われなくなりました。 sqrtについて調べたところ、 double sqrt( double x ); float sqrt( float x ); // C++ only long double sqrt( long double x ); // C++ only float sqrtf( float x ); このように sqrt は多重定義されているようです。 sqrtf はC言語のときの名残のようですね。 解決しました。みなさまありがとうございました。
787 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:11:07 ] 質問です 僕はインクルードガードシンボルにuuidを含ませる事があるんですが Cのプリプロセッサで処理するシンボルは最大何文字までいけるんでしょう? #define HOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGEHOGE ぐらいのものは処理できるならまぁ十分なんですが気になります あと変数名や名前空間名も何文字までいけるか気になります ADLバリアを使うと結構文字数増えますし、 もしあまりに少ない文字数(例えば31文字)だったとしたら怖いんで
788 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:23:36 ] プリプロセッサの制限はわからんけど、 C89までは厳密には識別子は先頭6文字位じゃなかったっけ C99で32文字になったような気がしないでもない
789 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:39:22 ] プリプロセッサの制限はわからんけど、 内部識別子は最低32 外部が8くらいだったと思う。6かもしれん。 VC6なんかでは外部256とかで、複雑なtemplateとかで警告が出るね。
790 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:40:07 ] あ、これはC89ね
791 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 23:21:31 ] 完全にうろ覚えだけど、マクロ名などの内部識別子は、 C89が31文字で、C99は63文字だったと思う。
792 名前:791 mailto:sage [2008/02/02(土) 23:50:16 ] C++98ではCにはあったtranslation limitの既定がなくなって、長さに制限はないと明記されているね。 付録のBで内部外部ともに1024文字以上を推奨ってことになってる。(これは一応調べてきた
793 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 00:14:52 ] クラスあったら構造体いらないと思うんですが、構造体で宣言する利点って何ですか?
794 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 00:20:15 ] メッセージループ(DispatchMessage)に入る前にウィンドウプロシージャにメッセージが飛んでしかも処理されてるっぽいんですが 当たらしく作られた別スレッドで動いてるんですか?このウィンドウプロシージャってやつは
795 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 00:26:14 ] ある種のAPIは、直接プロシージャを呼び出して配送する。 有名なのは、UpdateWindowのWM_PAINTなど。
796 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 00:32:13 ] ほかにもWM_CREATEやそれより前にやってくるメッセージはCreateWindow(Ex)内部で呼ばれるし、 Send系で送る場合も同一スレッドなら直接呼ばれる。
797 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 00:33:50 ] >>795 ああ、なるほど、そういうことですか そういうパターンをすっかり見落としてました
798 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 00:37:05 ] >>793 ただの構造体が欲しいときかな。 たとえば APIにパラメータを渡したいとき。 ハードウェアをアクセスするとき オフセットをがっちりあわせたいとき
799 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 00:37:18 ] >>793 しかしだね、 class Hoge { public: int id; double data; }; に対して hogeInst.id = 1; hogeInst.data = M_PI; なんて操作をするのは背筋がぞわぞわしないか?
800 名前:デフォルトの名無しさん [2008/02/03(日) 00:59:29 ] char* str = "aあいう" みたいに日本語とアルファベットが混在した文字列の、 文字数を数えるにはどうすればいいのでしょうか? strlen(str); とすると7になってしまいます。 環境はWindows XPでWin32APIを使ってプログラミングをしてます。
801 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 01:04:38 ] wchar_t* str = "aあいう"; wcslen(str);
802 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 01:05:10 ] L"aあいう"; だた
803 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 01:12:01 ] すいません、少し説明が足りませんでした。 そもそも何がやりたいかというと、 char*からwchar_t*への変換をしたいのですが、 char*変数のstrに'L'をつけて、L(str);とするとエラーになってしまいます。 そこで、MultiByteToWideCharで変換しようと思ったのですが、 wchar_t* wstr = new wchar_t[len]; というふうに、変換後文字のためのバッファをとろうとして、 その長さのlenをどう数えたらいいか分からなくなりました。
804 名前:デフォルトの名無しさん [2008/02/03(日) 01:16:44 ] >>803 MultiByteToWideCharの仕様をMSDNで良く見直すこと。 とくに戻り値の説明を。
805 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 01:22:44 ] >>798-799 ありがとう。構造体で出来るなら構造体で済ました方が楽ってことですね
806 名前:803 mailto:sage [2008/02/03(日) 01:25:33 ] >>804 ありがとうございます! len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); これで長さがとれました。
807 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 01:30:13 ] ある関数の返り値を配列でほしいのですが 関数の返り値にvectorやらlistを返すのってありですか? それとも引数から参照渡しで変更させたほうがよいですか?
808 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 01:36:04 ] コストを気にしなければあり。
809 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:08:30 ] 参照渡しで変更させたほうがいいなぁ。 要素数一桁だとか、RVOが可能な記述が出来るならともかく。 どうしても戻り値がいい場合はshared_ptrで包む。
810 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:31:06 ] バイナリでのファイル入出力って普通のと何がちがうの? バイナリ形式で保存したのをメモ帳で開いても普通に出力したのと変らないんだけど
811 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:53:33 ] >>799 C++ にもプロパティがあればいいんだけどね。 拡張機能で用意されてる事もあるが。
812 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:59:27 ] >>807 配列の先頭アドレスを返す、じゃダメなのかな >>810 普通のっていうのはテキストモードのことだよね テキストモードだと改行文字をいじったりしてる 詳しく知りたい場合は「fopen テキストモード」とかでググれば出てくると思う
813 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:15:45 ] C++の参照渡しって、結局中ではアドレスが渡されてるんですか? そうじゃないとしたら一体どうなってるんでしょうか?
814 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:21:35 ] 結局中ではアドレスが渡されてる実装しかないだろうな。
815 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:29:27 ] >>812 ありがとうございます 「 ソε2:ホSSカ「8蟹Mタラ男ユムゥtn鶏」みたいな文字化けしたような感じで 書き込まれるのかと思ってたけど違うのね こんな文字化けしたようなdatファイルとかってどうやって作ってるの?
816 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:36:58 ] 文字以外を書き込めばなりやすいな
817 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:44:10 ] >>815 書きたい内容をそのまま書けばいい。 static const unsigned char data[] = { 0xBF, 0x83, 0xC3, 0x32, 0x3A, 0xCE, 0x53, 0x53, 0xB6, 0xA2, 0x38, 0x8A, 0x49, 0x4D, 0xC0, 0xD7, 0x92, 0x6A, 0xD5, 0xD1, 0xA9, 0x74, 0x6E, 0x8C, 0x7B}; // 「 ソε2:ホSSカ「8蟹Mタラ男ユムゥtn鶏」 FILE* fp = fopen("test.dat", "wb"); fwrite(data, 1, sizeof(data), fp); fclose(fp);
818 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:47:54 ] そのデータだと FILE* fp = fopen("test.dat", "w"); fwrite(data, 1, sizeof(data), fp); fclose(fp); でも同じ物が書き込まれるがね。 バイナリモードとテキストモードの違いは メモリ上で 0x0D('\n') となるバイトを ファイル上でその環境の改行コードに変換するか否かしかない。
819 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 08:05:56 ] >>817-818 ありがとう。でも全然分からない おれにはまだ早かったみたいです とりあえずテキストとバイナリモードの違いは\nとかが違うだけで文字は変わら ないんですね 勉強してきます
820 名前:デフォルトの名無しさん [2008/02/03(日) 09:13:33 ] >>811 なければ自分で作ればいいじゃん。 俺は処理系非依存のプロパティ変数クラスを作った。
821 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 11:00:39 ] >>819 結果はメモ帳で見るよりバイナリエディタで見た方が分かりやすいかと思う。 何かバイナリモードとテキストモードでもの凄く違うと考えてるみたいだが、 動作的には大した違いはない。 普通は fprintf はテキストモードで、fwrite はバイナリモードで使うが、 別にそう使わないといけないという決まりはないんで、 バイナリモードとテキストモードで同じ物を書き込んで それぞれどうなるか実験してみればいい。
822 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 11:25:33 ] >>820 プロパティリストではなくて、delphiのプロパティ宣言みたいなものが作れるの?
823 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 12:01:34 ] >>820 初期化が必要なのは面倒臭い。
824 名前:デフォルトの名無しさん [2008/02/03(日) 12:57:16 ] 複数のソースで使うヘッダファイルの変数や関数が、 多重に宣言されないように、externの宣言がありますが、 ヘッダファイルに↓みたいな多重インクルードガードをつけたときも、 externは必要なのでしょうか? #ifndef AAA_H #define AAA_H //ヘッダの内容 #endif
825 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:01:13 ] extern はリンク時の多重宣言を回避するための物。 インクルードガードはコンパイル時の多重宣言を回避するための物。 全く別の物。
826 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:26:37 ] >>824 必要。
827 名前:824 mailto:sage [2008/02/03(日) 13:32:45 ] >>825 >>826 ありがとうございます。 今は、複数ソースで共有する変数/関数にはextern、 全ヘッダにとりあえずインクルードガードをつけてます。 違いがよくわからず、不安なんですが、 こんなんでいいのでしょうか? ちなみに、関数の方はexternをつけなくても動きました。
828 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:42:54 ] 関数はデフォルトでextern
829 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:45:22 ] コンパイルとリンクの違いを調べるといいよ
830 名前:デフォルトの名無しさん [2008/02/03(日) 13:51:38 ] c++で、int [] hoge(適当な引数) みたいに、配列を返す関数って定義できますか? 上記はできなかったので、結局int []を持つstructを定義して、それを返すように したのですが、、
831 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:54:14 ] 普通は効率を考えて配列を渡してそこに書き込むようにする。
832 名前:824 mailto:sage [2008/02/03(日) 13:54:51 ] >>828 そうなのですか。一つ大きな疑問が解決しました。 ありがとうございます。 >>829 勉強してみます。
833 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 13:58:36 ] >>827 関数でも、関数定義を複数書けばエラーになるよ。 エラーにならないのは関数定義は1つしか書いてなくて、 他は関数プロトタイプしか書いてないから。
834 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:30:12 ] >>825 うそん。 >extern はリンク時の多重宣言を回避するための物。 多重宣言どうこうっていうか、外部結合を明示するだけの物じゃないのか? そもそもC言語って定義で無い宣言は複数回しても良いんじゃなかったっけ? 突っ込み入らないってことは俺が誤解してるんだろうか。
835 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:37:54 ] >>834 >そもそもC言語って定義で無い宣言は複数回しても良いんじゃなかったっけ? そのとおりだよ。 extern指定子の無い宣言は仮の宣言。 コンパイル単位に定義が見つかったら、仮の宣言は冗長な定義として 無視される。そうでなければ0で初期化される単一の定義になる。 と思ってる。
836 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:38:09 ] C は仮定義があるから初期化しなけりゃ 複数の記憶クラス指定子のない変数宣言があっても大丈夫。 C++ は仮定義が廃止されたので 複数の記憶クラス指定子のない変数宣言があるとエラー。
837 名前:デフォルトの名無しさん [2008/02/03(日) 14:40:39 ] gcc用で配布されているコードを, VisualStudio2005でコンパイルしたところ, エラー 1 error C2143: 構文エラー : '{' が ':' の前にありません。 c:\program files\microsoft visual studio 8\vc\include\cmath 18 エラー 2 error C2059: 構文エラー : ':' c:\program files\microsoft visual studio 8\vc\include\cmath 18 といった無数のエラーが出ました. ちなみにcmathはインクルードしておらず, #include<stdio.h> #include<stdlib.h> #include<math.h> #include<complex> だけです. どなたかアドバイス頂けませんでしょうか?
838 名前:デフォルトの名無しさん [2008/02/03(日) 14:45:22 ] >>831 ありがとうございます。 参照渡しとかですね。 すいません、あと1つ質問させてください。 stringを継承して、[]をつかって[-1]と[サイズ+1]の要素にアクセスに行ったときだけ 動作の異なるクラスを定義できますか?自分でやろうとしたのですが、コンストラクタ は継承されないから自分で定義しなおさないとダメなのですよね。そうすると、コンストラクタ を書くのが結構大変なような気がしたので。
839 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:49:14 ] >>838 コンストラクタだけじゃなくて演算子だって定義する必要があるんだぜ。 戻り値の型が変わるから。 at 関数を使うと範囲チェックして out_of_range 例外投げるから それ使えばいいんじゃね?
840 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:51:57 ] a.exe から LoadLibrary で b.dll を呼び出すんだけど、 b.dll から右側では .NET を使いたい。 a.exe → b.dll このような場合、b.dllをC++/CLIで作成することになるのかしらん?
841 名前:デフォルトの名無しさん [2008/02/03(日) 14:54:13 ] >>839 なるほど、それでやってみます。 サンクス!
842 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:58:05 ] >>838 stringは仮想デストラクタを定義していないから public継承するのはどうかと思うけど、コンストラクタ の呼び出しに関しては、stringのコンストラクタ を派生クラスのコンストラクタ初期設定リストで 指定すればいいだけじゃないの。
843 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:58:47 ] >>840 a.exeからC++/CLIでどぞ
844 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:01:44 ] >>840 C#でもVB.NETでもお好きにどうぞ
845 名前:840 mailto:sage [2008/02/03(日) 15:16:22 ] >>843 a.exeは他所で作ったものだから、漏れはいじれないんだ。 >>844 LoadLibraryでもマネージDLLを呼び出すことができるってこと?
846 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:31:59 ] >>808 >>809 >>812 返答ありがとうございます 色々とやり様があるみたいですが、c++的にはやはり生の配列を返すよりコンテナを返したほうがよいのでしょうか? そうするとやはりlistを引数に取る関数に参照渡しが無難なのかなぁ・・・?
847 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:33:16 ] class Hoge1 { void hatena(void) { Hoge2 ht; ht.nazo(*this); } }; class Hoge2 { void nazo(const Hoge2 &rho){} }; みたいなのがあって ht.nazo(*this);のところでエラーになります。 どうす
848 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:36:10 ] >>847 nazo(const Hoge1・・・にす
849 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:37:13 ] &rho
850 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:37:17 ] >void nazo(const Hoge2 &rho){} nazoは引数にHoge2を取るようだが thisポインタってhoge1のアドレスを示してるんじゃないの?
851 名前:837 mailto:sage [2008/02/03(日) 15:38:34 ] >>837 の質問はVC++スレに書き直しました. マルチポストすいませんでした.
852 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:41:31 ] Hoge &rho
853 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:41:53 ] 化けるのね。
854 名前:デフォルトの名無しさん [2008/02/03(日) 15:42:31 ] hoge piyo fuga
855 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:45:11 ] &
856 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:46:57 ] &a
857 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:51:34 ] &rh
858 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:53:17 ] &abcd
859 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 15:55:04 ] &rho
860 名前:デフォルトの名無しさん [2008/02/03(日) 18:14:16 ] なぜか、参考書どおりにコードを打ち込んだのに実行結果が違ってしまいます。 #include <stdio.h> int main(void) { int i, j, ln; printf("何段ですか:"); scanf("%d", &ln); for (i=1; i<=ln; i++); { for (j=1; j<=i; j++) putchar('*'); putchar('\n'); } return (0); } ちなみにOSはVistaです。どこか違っていたら教えてください。
861 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:19:32 ] for (i=1; i<=ln; i++); これ。 「;」という何の処理もしない文をforでループさせることになってる。
862 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:21:39 ] >>860 正解が何か知らんからわからんが 改行の位置がおかしいんじゃないか?
863 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:23:03 ] >>861 スマソ そうだね 改行は問題ないわ
864 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:23:08 ] test
865 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:25:57 ] >>860 >参考書どおりにコードを打ち込んだのに実行結果が違ってしまいます このスレを見ている人はその参考書のことなんてしらない。 どのような結果を求めているのかを提示しないと、どこが違っているのか答えられないよ。 明らかにおかしいコードだから答えは>>861 の通りだろうけど、もうちょっと質問の仕方を考えたほうがいいよ。
866 名前:デフォルトの名無しさん [2008/02/03(日) 18:26:15 ] >>861 サンクス 無事実行できました。
867 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:26:28 ] 861に書かれていることと その下の行の { が足りないことで たまたま{ }の対応がうまくいってコンパイルは通ってるんだな。 なので2ヶ所修正
868 名前:デフォルトの名無しさん [2008/02/03(日) 18:26:51 ] C言語でのアルゴリズムの質問をさせて下さい。 現在以下のようなプログラムを作ろうと思っています。 0〜65535までの数字をIDとしてユーザに割当てる。 ユーザが割当てられたIDを使わなくなったときはそのIDを返却し、 返却されたIDは回収されて他のユーザに割当てられる。 最も簡単なやり方は、user_id[65536]などの大きな配列を作って、 使用状況を配列の中身の0か1で判断する、といったものかと思います。 しかしこのやり方よりもっと効率的なものはないでしょうか? このような大きな配列を作るのは実装としてまずいのかな…と感じています。 初心者で申し訳ありませんがアドバイスよろしくお願いします。
869 名前:867 mailto:sage [2008/02/03(日) 18:27:59 ] あ、違った。 ごめん
870 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:29:28 ] とはいえ入門書で{}略すのはイクナイと思う。
871 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:29:56 ] >>868 64Kなら、オンメモリで処理してもいいんじゃね? ビットで処理したら、8Kで収まる。
872 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:31:50 ] >>868 更に上限を増やさなければならない可能性があるなら、 別のやり方を考えたほうがいいと思うけど、 それぐらいなら問題ないと思うね。
873 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:32:16 ] >>870 ぜんぜんOK
874 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:36:59 ] >>868 その、配列やり方でいいと思うよ。 ランダムに返却され再利用されるならそれしかない。>>871 のようにビットマップで配列は小さくできる。 連続の範囲でとりますとか特徴があれば、それを使って効率的に管理することもできる。
875 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:37:36 ] ある静的メンバ変数を含むクラスをテンプレート化しました。 この場合、静的メンバ変数は、テンプレート引数ごとに別々の実体が 作られるということで、このことは確認できました。 で、質問なのですが、この静的メンバ変数の初期化は、 いつ行われるのでしょうか? テンプレート化してない場合は、mainが始まる前ということで、 これは手元の本にも載っているのですが、 テンプレート化した場合、実際にどんなテンプレート引数で クラスが作られるかわからない段階で初期化ってできるのか、と 思ったものですから。 実際、mainの最初で、静的メンバ変数の値を見てみてみても、 なぜかちゃんと初期化した値が入っているように動きます。 なぜなのでしょうか。
876 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:41:47 ] コンパイル終わったときにはわかってるから。
877 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:43:13 ] テンプレートはビルド時に、 初期化コードも含めてすべて実体化されるだろ。
878 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:44:51 ] >>876 >>877 むむむ、そういうことですかーーー。 考えが至りませんでした。 ありがとうございました。
879 名前:868 [2008/02/03(日) 18:56:06 ] >> 871,872,874 アドバイスありがとうございます。 特に問題がないようですので、このやり方で続行します!
880 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:14:04 ] C++だとbitsetでやるのが楽なんだろうけどな
881 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:20:13 ] それだとフリー探索がO(N)になるから、vector<unsigned short>(65536)という 手もよくあるパターンではある。
882 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:23:17 ] set<>は使えんの?
883 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:24:46 ] >>881 なんでunsigned shortなの?
884 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:32:59 ] intよりは節約できるし、IDは0〜65535なんだろ?
885 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:37:16 ] サンプルコード見ながら勉強してるのですが this->SizeGripStyle = System::Windows::Forms::SizeGripStyle::Hide; #pragma endregion private: の、->、::、#、:、の意味がよくわかりません 調べたいのですが、記号はGoogleで検索できないので、この記号の名称を教えてください
886 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:42:26 ] サンプルコードを見る域に達してないな
887 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:45:39 ] だから質問しているんです
888 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:45:51 ] それどころか勉強すら始まってないな
889 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:46:37 ] なんか本買えよ。 というか、そんな変態言語じゃなくて、普通のC++から勉強しろ
890 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:50:40 ] >>887 無料で見れる情報、無料で協力してくれる人だけをあてにして勉強する気? 独学で身につけるだけの基礎的な力をもっているならまだしも、 まったく何も持っていないなら勉強するための最低限の準備くらいはしたら?
891 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 19:52:27 ] >>885 何でも良いからCの入門書を読んでからにしようぜ
892 名前:デフォルトの名無しさん [2008/02/03(日) 20:00:57 ] 質問ていうか相談なんだけど TXTファイルの文字列置換ツール作たいんだけどさ 置換箇所だけ更新かけたいんだよ でもさ、fopenでファイル開くと一箇所変えると全部上書きしないといけないじゃん 置換箇所だけ更新かける方法ない?
893 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:07:34 ] C++/CLIの文法はアレだからなー。
894 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:07:49 ] 一旦、別のファイルに書き出す。 その後、元ファイルを削除し、 さっき書き出したファイルの名前を元の名前に変える。
895 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:08:21 ] 文字数変わらないなら、fseekとかfwriteあたりを駆使して 上書きすりゃいいじゃん。 ずれるのならご愁傷様。
896 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:29:30 ] >>892 ファイルの途中でサイズが増減しても、局所的な更新だけですむような ファイルシステムを実装する。
897 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:08:44 ] >>874 > ランダムに返却され再利用されるならそれしかない。 そんなことはないだろ。 組み込み用途だと、8KB なんて言うテーブルなんてとんでもないと言う こともあるだろうし、PC でも ID を 32bit にしたいとか言われたら、 どうするんだよ。(w >>868 ID の範囲に比べて、同時使用ユーザ数が極端に少ないなら普通にリニア サーチして管理することもできるし、同時使用ユーザ数がそれなりで ID の割り当て・回収の処理コストが問題になるならハッシュとかBツリー を使うこともできる。
898 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:09:38 ] stl::map<stl::string, Animal> animals; Animal &a = animals["cat"]; この時点で、aに入る物は出来ていますか?
899 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:13:50 ] stlの定義による。 stlがstdの間違いなら、aは正しく要素を指している。
900 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:16:27 ] >897 「何」を、リニアサーチするんだ?
901 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:16:42 ] >>897 また組み込み厨がでたよ。 特殊な環境を持ち出して、いちいち反論するヤツ。
902 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:25:25 ] >>897 ランダムに返却されれば、2^65536の組み合わせが発生する。それを記録処理するには65536bit必要になる。すなわち8Kバイトだ。 それ以下にするには、IDの消費が均一ではなく偏らせる必要がある。 たとえば、連続してIDを取得する。そういう特徴があれば、それに応じた処理にして節約すればいい。しかし、それはランダムとは言えない。
903 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:29:51 ] >>897 どこに極端に少ないと書いてある?
904 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:31:54 ] その次に「なら」ってかいてあるがな
905 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:33:18 ] >>884 いまさらだけど、配列の中身は0か1って書いてあるんだからshortは必要ないだろ
906 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:34:05 ] そこかしこのレスから揚げ足を取りたがってるオーラを感じるのは俺だけでいい
907 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:34:51 ] 文章構成がアレだね。 前半は、「パターンがランダムでも、メモリ8KBも取る必要はない」って言ってて、 後半は、「パターンがランダムでなければ、節約する方法がある」みたいな。
908 名前:881=884 mailto:sage [2008/02/03(日) 21:37:43 ] えと、つまり、vectorのvがあるとして、 初期値として、(65535〜0)を入れとくわけね で、こうするとO(N)で触れる、ってだけの話。 要求(){ return v.pop_back() } 解放(id){ v.push_back( id ); }
909 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:41:34 ] それ O(N) じゃなくて O(1) だろ。 解放でデタラメな id 食わされたら死ぬとか言う問題もあるかもね。
910 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:43:20 ] あーそうそうO(1)だね。 でたらめなIDって言っても、if文一発で済むでしょう。 同じIDが複数解放されてきたららドナノヨって話は知らない。
911 名前:883=905 mailto:sage [2008/02/03(日) 21:47:39 ] >>908 大きな配列の変わりにvector使うのかと思ってたw 同じIDのチェックまでするならsetの方がよさそうだな
912 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:01:19 ] Cでbool型って使えたっけ?
913 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:04:18 ] >>902 もちろん、同時利用者数が最大 65536 と言うなら、ビットマップの方が 効率がいいのは自明だけど、>>868 が「そんな大きな配列」とか書いて るから同時利用者数はそれほどじゃないのかも知れないと思っただけの こと。
914 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:09:43 ] 同時利用がたとえば30なら、IDを65535も用意しとく必要無いじゃん。
915 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:26:06 ] >>890 いいえ違います ほかの単語は検索すればわかる、だけど記号は検索できないから質問してるの 検索できない単語が他にも沢山あるならまた質問しまくるかもしれませんが 幸い、検索不可能な記号はこれだけのようなので質問しました >>891 手持ちの入門書には「System::〜と書けばこう動く」という記述はあったが 「::は〜という意味です」という記述はなかった
916 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:26:54 ] >>915 もうちょっとまともな本を買うべきです。
917 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:30:37 ] 入門書どころか入門サイトにも名前つきで紹介されている件について。
918 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:31:15 ] >>915 いいから、独習Cと独習C++あたりでも一通り読んできなさい。
919 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:35:38 ] >>915 >>918 の言うとおりだが、立ち読みは迷惑なのでちゃんと買おうな。
920 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:37:49 ] つうか碌に参考書やサイト読み込んでないのバレバレじゃん
921 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:39:07 ] 大漁大漁^^
922 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:39:47 ] 今時釣り宣言とかwww
923 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:43:09 ] ファイル書き込みについての質問なんですが #include <stdio.h> typedef struct{ char no[6]; char name[21]; int tanka; }SHOHIN; void main(void) { int i; SHOHIN shohin[5]; FILE *fp; if((fp=fopen("shohin.txt","w"))!=NULL); { for(i=0;i<LEN;i++){ printf("商品番号、商品名、単価\n"); scanf("%s,%s,%d",shohin[i].no,shohin[i].name,&shohin[i].tanka); fprintf(fp,"%s",shohin[i].no); fprintf(fp,"%s",shohin[i].name); fprintf(fp,"%d\n",shohin[i].tanka); } fclose(fp); } return; } 文字化けが起きてうまくいきません 例えば a,a,1と入力すると a,a,11245072 となってしまいます 単純なミスだと思うのですがどうか教えてください! コンパイラはbcc55を使用しています
924 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:46:09 ] >>923 <scanf("%s,%s,%d",shohin[i].no,shohin[i].name,&shohin[i].tanka); >scanf("%s,%s,%d",shohin[i].no,shohin[i].name,shohin[i].tanka); こうするとどうだ
925 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:46:48 ] >>923 次の二行を削除(もしくはコメントアウト)してみな fprintf(fp,"%s",shohin[i].name); fprintf(fp,"%d\n",shohin[i].tanka);
926 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:48:33 ] >>924 同じでした・・・
927 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:49:37 ] ,の認識どうなってんだろうね
928 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:50:22 ] >>925 文字化けが消えました! どうもありがとうございました!!!
929 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:52:00 ] >>914 将来の拡張のために ID の範囲は余裕を持っておく ぐらいのことは普通にあるだろ。
930 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:53:40 ] >>928 そうじゃなくて %s でひと続きの文字列として shohin[i].no 以下に格納されてるだけってのを見て欲しい
931 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 23:04:56 ] 突然ですが、実際のプログラム(main)って、 tryの中にほとんどの記述を入れるのでしょうか。 とある本で例外処理の部分を読んでいる初心者ですが、 この章だけは、mainのほとんど(catch以外)を tryの中に入れてます。だけど、この後の章では ざっと見た限りほとんど入れてないように思います。 例外をことごとく捕まえたいときには、実際の 現実的なプログラムだとどうなるのでしょうか。 先走っているのかもしれませんが気になるので教えてください。
932 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 23:10:06 ] 例外がキャッチされなかった場合、 自動変数のデストラクタが走る保証はない。 もしそれで致命的なリソースリークが起こるなら、 例外をキャッチするべきなんだろうな。
933 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 23:10:57 ] 〜皿 只只 只只只只 只只 只只只 | 凸
934 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 23:13:57 ] エラー処理と復帰処理のできるところで捕まえればいい。 mainの処理全体をtryで囲むのは、例外即終了でおkな場合でしょ。
935 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 23:15:43 ] >>931 mainでキャッチしても、エラーメッセージ出すくらいしか使い道無くないかな 例外でアプリを落としてもいい場合は、キャッチしなくてもいいかな 落としたくない場合は、落としたくない箇所でキャッチすれば良い。たとえばメッセージループとかかな 質問だけど、DLL書いたとき、エントリのところで例外全部キャッチしたほうがいいかな
936 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 23:18:34 ] >>934 基本は全部囲っておかないと、 catch 漏れが無いか気をつけないといけなくなる。
937 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 23:41:16 ] >935 まあ、COM入門で出てくる話だが、「例外はDLL境界 超えられないものとして扱うべき」だな。
938 名前:931 mailto:sage [2008/02/03(日) 23:43:24 ] >>932- どうもでした。 mainの中で全部っていうのは、 この本の(この章の)説明の都合なんですね。 こういうことでよろしいのでしょうか。 ・mainの中でcatchしてもエラーメッセージを出すくらいの 処理しかできないので、基本は処理できるところで捕まえる。 ・ただし、catchもれの心配もあるのでmainも全部囲う。 (もしかしてここはプロの方でも人によるとか、、?)
939 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:12:56 ] 例外なんかキャッチしない仕事の人もいるぜ
940 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:17:20 ] >>932 確認させてください。スタックの巻き戻しってのは 例外だろうが何だろうが、スコープを抜けたら 構築済みのローカルオブジェクトは正しくデストラクタ が呼ばれて解放されるんではないんだっけ? これがRAIIを使ったリソース管理のメリットだと 思ってたんだけど。throwされた例外は確実にcatch されないとリークするの? { boost::shared_ptr<Widget>(new Widget); throw Reigai(); } この場合、例外でスコープを抜けても どこかでcatchされないとデストラクタ が呼ばれずに、そのままterminateしてしまう?
941 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:24:00 ] terminate da Human.
942 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 01:15:31 ] 試したけど本当に呼ばれないな。 そういう規格なんだろうか。 ハーブサッターの本の例外の話は嘘か?
943 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 01:17:15 ] 例外を捕まえるハンドラがなければ、 throwした時点でterminate呼んでも良いみたいな話?
944 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 01:25:56 ] 本当だ。 規格に書いてあった。
945 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 01:29:13 ] >>943 Exceptional C++の例外安全の話 項目13 P53とか ”例外が投げられてスコープから出たときにデストラクタが 呼び出され。。。” って書いてあるから勘違いしてたかも。
946 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 01:49:51 ] 最終的にどっかでcatchされるという前提なんだろうな。
947 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 02:05:31 ] しかしわかりにくい。。。 それじゃ、”例外が投げられてスコープから出たときに デストラクタが 呼び出され。。。” じゃなくて、 「その例外がcatchされたとき、。。。」って書けよなあ。
948 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 02:10:42 ] 本当そう思う。 でもわかって良かった。
949 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 02:35:22 ] 要するにmainで全ての例外をcacheすればいいってことか。
950 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 02:40:10 ] そういうことになるね。こんな記事見つけた。 Stack Unwinding in the Event of an Uncaught Exception When an exception is thrown and no matching handler can be found for it, C++ invokes the function terminate(). By default, terminates invokes the function abort(). (ここまでは規格の話だろうね) Some compilers guarantee that at this point, the stack has been unwound, i.e., all local automatic objects have been fully destructed, streams have been flushed, and open files have been closed. Other compilers don't unwind the stack in this case. In other words, whether the stack is unwound in the case of an uncaught exception is platform-defined. Therefore, you should check your compiler's documentation to know how it behaves in the event of an uncaught exception.
951 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 04:16:27 ] testというクラスがあって、 test::test(){各変数の初期化}というコンストラクタがあった場合 test *p; p=new test [n]; とした場合も*p[0〜(n-1)]の全てがコンストラクタが実行されて初期化されますか?
952 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 04:32:25 ] 初期化されます
953 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 04:36:09 ] >>952 ありがとうございます。 かなり時間かけてクラス作ったのにコンストラクタ実行されなかったら泣くところだった
954 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 07:36:14 ] >>949 本当にそれした方がいいかどうかは分からんね。 どちらにしろ強制的に terminate される状況もあるわけだし、 よほど呼んでもらわないと困る処理は set_terminate 側で対処した方がいい気もする。
955 名前:951 mailto:sage [2008/02/04(月) 10:45:38 ] vector使った方が上手く処理できそうなのでvectorを使ってみたんですが、デバッグ で追いかけてみたところコンストラクタが実行されてません。 もしかしてvectorで確保した場合はコンストラクタ実行されないんでしょうか?
956 名前:デフォルトの名無しさん [2008/02/04(月) 10:49:29 ] STLのvectorでintとかdoubleなどの値を保持しているとき、それらの和は どうやって計算するのが一番よいですか? 自分は、boost::lambdaをつかってるんですが、なんかもっと他の書き方が ありそうな気がして。(自分的にはboostがインストールされてないとダメなのが 嫌なんだけど、和、積、など他の演算にも対応がしやすくていいと思ってる) int tmp = 0; for_each(v.begin(), v.end(), tmp += boost::lambda::_1); ここのスレの他の人のやり方を見せてください。
957 名前:デフォルトの名無しさん [2008/02/04(月) 10:54:39 ] ふつうは0からv.size()-1まで足すだろ
958 名前:デフォルトの名無しさん [2008/02/04(月) 11:24:24 ] >>957 そうか、、、。 そういわれると、そういう気もする。 なんだか956が恥ずかしいな。わすれてください。
959 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 11:29:25 ] しかもSTLにあるしなw tmp = accumulate(v.begin(), v.end(), 0);
960 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 11:44:37 ] >>955 コピーコンストラクタ書いてる?
961 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 11:45:08 ] a > b であるunsigned int同士の引き算 b - aの動作は仕様によると どうなるのでしょうか? それと、ビットシフト演算子が算術シフトか論理シフトになるかどうかは 環境依存であってますか?
962 名前:デフォルトの名無しさん [2008/02/04(月) 11:55:12 ] すみません。windowsXPで、eclipse+CDT+cygwinで勉強しています。 scanfなどで変数値を入力するプログラムを書いたとき、 事前に表示する「数字を入れてください」などの文章が出ず、 scanfに値を入力する待機状態になってしまいます。 どうしたらよいのでしょうか。 すみません。お教えください。
963 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 11:56:55 ] >>961 1) b - a + (UINT_MAX+1) 2) 左右シフトともに負の値のシフトに関して未定義。 いきなりエラーで落ちても文句は言えない。 C規格の専用スレもあるので活用してください。
964 名前:962 [2008/02/04(月) 12:11:12 ] すみません。自己解決しました。 putsなりprintfなりを書いた後、fflush(stdout)をしました。 失礼しました。
965 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 12:17:35 ] >>963 すばやい回答ありがとうございます。もうひとつ質問がありました。 たびたびすいません。 両方ともunsigned intであるa * bが表現可能な数値の範囲を超える場合、 仕様による動作は未定義であってますでしょうか? その動作に依存するコードを発見したので、書き直そうかどうか迷ってます。 ただ、画像処理(アルファブレンディング)に関するコードなので、書き直す と命令数が増大して遅くなってしまうので、躊躇してます。 >C規格の専用スレもあるので活用してください。 初心者お断りと書いてあるのですが、このような質問でも大丈夫 なのでしょうか?
966 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 12:20:57 ] >>965 a * b % (UINT_MAX+1) 符号なし整数型の算術演算の結果があらわせる範囲を超えた場合はループする 頭の悪いやつがつけたスレタイを気にする必要はない。
967 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 12:25:26 ] >>966 ループするのですね、ありがとうございます。 コード書き直す必要が無いとわかって助かりました。 今度からこのような質問は規格スレに持っていく事にします。
968 名前:デフォルトの名無しさん [2008/02/04(月) 12:26:25 ] >>959 <numeric>ですね。これほとんど使ってなかったんだよな。 恥ずかしいが、自分的にはaccumulateとか知ったからよかったよ。 ありがとう。
969 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 14:04:32 ] >>965 そもそもαブレンディングでオーバフローするような数字を扱うわけじゃないだろ。 そこを吟味せずにオーバフロー対策なんて意味ないぞ。 例えば、rgb各8ビットの画像から画素の値を取り出す場合は通常0-255の値域を取る。 そこで、unsigned intのr, g, b, ra, ga, baがあるとしたらr * raは何があってもオーバフローしないわけだ。
970 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 14:34:43 ] なんかずれてる気がするんだけどなあ。
971 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 17:34:53 ] 猫でもわかるC言語プログラミングという本で勉強し始めたのだが、 誤字脱字ありすぎで正直自分が悪いのか本が間違ってるのかコンパイラの問題なのかわからん。 Borland C++ Compiler 5.5 #include <stdio.h> #include <float.h> int main() { double pai = 3.14159265358979; int mon = 2; printf("%d\n", mon = 3); printf("%e\n", pai); printf("%05d\n", mon); printf("%20.18f\n", pai); return 0; } で 3 3.141593e+000 00003 3.141592653589790000 と表示されるらしいのだが、 @二行目が 3.141593e+00 、四行目が 3.141592653589790007 になる。 Aコンパイラが警告を出す。('mon'に代入した値は使われていない) どうしたらいいのか教えてください。
972 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 17:46:50 ] >>971 正常。浮動小数点演算は丸め込みとかでコンパイラによって結果が若干変わる場合がある gcc 3.2.2 [FreeBSD] 3 3.141593e+00 00003 3.141592653589790007 bcc32 5.6.4 3 3.141593e+00 00003 3.141592653589790007 cl(VC++) 13.00.9466 3 3.141593e+000 00003 3.141592653589790000 警告はint mon = 2;の後に値を読み出さずに3だを代入してるから出る。基本的に無害。
973 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 17:52:22 ] >>972 安心した、ありがとうございます。
974 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 18:03:21 ] >>969 コードは載せられませんが、アルファブレンディングは alpha*src + (1 - alpha)*dst になりますが、そのコードでは一時変数を嫌って、 alpha * ( src - dst ) + dst になってました。
975 名前:デフォルトの名無しさん mailto:age [2008/02/04(月) 22:20:29 ] 演算子オーバーロードのような感覚で、 クラスのインスタンス名を書いたときに、特定の処理結果を返すようにする方法はありませんか? 具体的には class ClassA{ int val; } ClassA ca; があったとして cout<<ca.val; と書くところを cout<<ca; で出来るようにするという事です。 宜しくお願いします。
976 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 22:22:42 ] >>975 <<演算子をオーバーロードしろよ
977 名前:975 mailto:sage [2008/02/04(月) 22:31:18 ] すみません、<<は確かにそうでした。 条件式に単独で入れたときにvalの値でboolに変換されるようには出来ませんか?
978 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 22:34:31 ] bool ClassA::isPlus(){ return val > 0; } とかじゃだめなん?
979 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 22:34:45 ] bool operator !()constと operator void *()constあたりを定義するのが常套手段だが。
980 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 22:39:46 ] operator bool をオーバーロードするだけじゃダメなのか?
981 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 22:40:27 ] intへの暗黙のキャストが許せるなら、それでもいい。
982 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 22:54:31 ] >>980 訳わかんねえことがいっぱい起こるから、やめといた方がいい。
983 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 23:00:47 ] 0xではこの辺の暗黙的型変換を禁止できるようになるんだよな、たしか。
984 名前:975 mailto:sage [2008/02/04(月) 23:19:06 ] 変換関数を定義しておけば良いんですね。 そういうものがあるというのは読んだんですが用途まで考えていませんでした…。 >>980 の方法で良さそうです。 >>979 のoperator void*でも上手くいきましたが 条件式の中身はboolにキャストされると思っていたんですが、 void*でも動くのはどういう意味なのか教えてもらえないでしょうか。
985 名前:975 mailto:sage [2008/02/04(月) 23:23:45 ] すみません、>>981 以降リロードしてませんでした…。
986 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 23:26:16 ] if( x )はif( x!=0 )と等価、というか。 void *m = malloc(len); if( m ) { return m; } else { abort(); } みたいな処理ってやったことないの?
987 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 23:27:42 ] >>984 982でも書いたが、operator boolのオーバーロードはやめとけ。 ClassA a, b; int c = a + b; int d = abs(a); みたいのがコンパイル通っちまう。 >>979 が常道。
988 名前:975 mailto:sage [2008/02/05(火) 00:02:09 ] わかってきました。 条件式に入るクラスは数値かポインタへの変換を持っていれば良くて、 operator void*を定義しておけばそちらに変換されると。 でintからboolよりもintからポインタの方が予期せぬ動作が少ないのでvoid*を使うべきと。 知識が足りてなくてレス読みつつググったりして勉強になりました。 どうもありがとうございました。
989 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:03:21 ] >>984 ポインタはboolへの暗黙の変換がある。 cinもそれを利用してif(cin)を可能にしている。 その方法が>>979 の方式だ。 boolへの暗黙の変換はおすすめできない。
990 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:03:40 ] >>987 bool 値として使用したいのならそんなもんじゃね? そうでないならそもそも演算子オーバーロードで解決すべきじゃないと思う。
991 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:23:35 ] boostは徹底してて、関数ポインタとか返してくるし(w
992 名前:デフォルトの名無しさん [2008/02/05(火) 00:31:24 ] int a = 123; bool b = !!a;
993 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:33:44 ] >>991 すごー。でもそのくらいの方が有り難い。 まえに operator bool()を定義してて、コンパイラがブッ壊れたかと思った。
994 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:44:42 ] >>991 つまり、関数呼べちゃうってことか? メンバポインタとかの方が良くね?
995 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:48:01 ] ・ ・ ・ ・ ・ ・ ・ ・ メンバ関数ポインタだぜ? そうそう呼べはしないとおもうが。
996 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:49:29 ] なんだ。メンバ関数ポインタか。 ならいいが。
997 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:19:14 ] 【初心者歓迎】C/C++室 Ver.48【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1202141921/
998 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:20:11 ] 【初心者歓迎】C/C++室 Ver.48【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1202141921/
999 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:22:10 ] さーて来週のスレは?
1000 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:24:41 ] お疲れ様でした。次週も環境依存コードをお楽しみください。
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。