1 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 06:18:18 ] プログラミング言語C/C++についての、小心者向けスレです。質問・要望・雑談などどうぞ。 関連スレやURLは>>2 以降。 ■質問する人へ 質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。 ・ぐぐる ・マニュアルで探す ・FAQを読む 例えば www.bohyoh.com/CandCPP/FAQ/index.html 質問には以下を書くこと。へたくそな質問は再提出を要求される。 ・詳しい内容(「動きません」「うまくできません」では回答しようがない) ・エラーメッセージ(なるべくそのままで) ・実行環境(OS名、コンパイラ名) ・最終的にやりたいこと(もっとよい方法がある場合が多いので) 回答してくれた人には「ありがとう」のひとことをいってあげて。 ■回答する人へ 相手は小心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。 それができないならこないこと(だって小心者スレだもん)。 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。 宗教的な話題は禁止します。
762 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 09:50:12 ] 学校の課題で配列に10個の実数を入力して最大値と最小値を求める問題なんですが、最大値は正常に出力されますが、最小値がうまく出力されません。 #include<stdio.h> int main (void) { float x[11]; float max,min; int i; printf("実数を10個入力してください\n"); for ( i = 1; i <= 10; i++){ scanf("%f",& x[i]); } max = x[0]; for ( i = 1; i <= 10; i++){ if (x[i] > max){ max = x[i]; } } min = x[0]; for ( i = 1; i <= 10; i++){ if (x[i] < min){ min = x[i]; } } printf("最大値は%fです\n",max); printf("最小値は%fです\n",min); return 0; } どこが原因なんでしょうか?
763 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 09:56:55 ] x[0]が未初期化
764 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 12:59:46 ] すみません。複数のクラスを辿りループ処理をするプログラムで クラス毎に1度だけ変数の初期化をさせたい場合、 1.コンストラクタを使う (再初期化が必要になった場合、結局の後者いずれかが必要に・・?) 2.各クラスのグローバルスコープに初期化用のstatic boolを置いて処理 3.初期化用メソッドを別に作って纏めて管理 この3つが思い付くのですが、 どういう初期化が定番、もしくは設計的に無難だと思われますでしょうか?
765 名前:デフォルトの名無しさん mailto:sage [2010/01/08(金) 13:29:43 ] staticイニシャライザじゃダメなの?
766 名前:765 mailto:sage [2010/01/08(金) 13:30:28 ] ごめんJavaと勘違いしてました
767 名前:デフォルトの名無しさん mailto:sage [2010/01/09(土) 09:17:09 ] >764 辿るのはクラスなのオブジェクトなの? 初期化するのはクラス毎なのオブジェクト毎なの? どんな処理しようとしてるのかが良く分からない。 擬似コードでいいから書いてみてくれた方が答えやすい。 「クラス毎に1度だけ」の条件を抜いた上で感覚で答えれば、 それが本当に「初期化」ならコンストラクタにすると思う。 状態の再設定が必要なら reset() みたいなメソッドも作るだろうね。 >各クラスのグローバルスコープ 言いたいのはクラススコープじゃね?
768 名前:デフォルトの名無しさん mailto:sage [2010/01/10(日) 12:33:35 ] >>767 初期化じゃなくて再設定って言わないとですね; >各クラスのグローバルスコープ すみませんでした、そんなの無いですよね; つい完成するまでは1行で済むクラスの置いてるソースファイルのグローバルスコープにstatic boolを置く癖から。。 表現に注意します; そして、変数の再設定メソッドが良さそうですね・・ありがとうございました。
769 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 17:08:21 ] すみません。 「配列にはしたくない変数名の末尾」に数字を付けるのは、滅多に見ない気がするのですが、何か危険なのでしょうか? 以前はhennsuuA ..B ..C としていたのですが、最近はhennsuu1 ..2 ..3 とやっているのですが・・
770 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 17:10:45 ] そういう命名がふさわしい場合が滅多に無いから
771 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 17:16:39 ] a, b, c, 1, 2, 3 なんて機械的な命名ではなく、それぞれの変数の役目に合った意味のある名前を付けるべき いい名前が思い浮かばないのなら変数名スレに相談してみては
772 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 17:22:51 ] 単純に通し番号を振るのがふさわしいような場合は、普通は似たような処理をそれぞれ の変数に適用するだろうから、素直に配列にすることが多いだろ。 配列はふさわしくないが通し番号がふさわしい、という場面が滅多に無いから、そういう 命名も滅多に見ないだけ。 で、その言い方だと頻繁に通し番号を振ってるようだから、やはり命名がおかしいか、 よほど特殊なジャンルで活動しているか。まぁ、後者ならこんな質問は出ないだろうと 思うので、多分前者だろう。
773 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 17:24:18 ] たまに通し番号が多発しやすいジャンルもあるから、何を作っててそういうコードに なるのか知りたい気もする
774 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 18:12:39 ] >>770-773 ありがとうございます。危険性そのものは多分、無いのですね。 私のプログラミング能力の低さから来てる問題なのが大半だとは思います。 あとは、 変数1の値に応じて処理をわけ、変数2の値に応じて処理を分け と どっちも1桁の数値だから配列にして置いてても良いのですが、 一応種類が全く違う2つなので、名前を別にしたいのですが 違い過ぎると使い間違えそうになるので・・とりあえずa, b, c, 1, 2, 3 と やっちゃってました。 変数名スレッドなるものが有るんですね。 探して見てこようかと思います。 ありがとうございました。
775 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 19:05:36 ] まーゲームなんかだと変数名にシリアル振りたくなることはある でも今時そこまでガチに汚く組まないと困ることはコンシューマでも珍しい
776 名前:デフォルトの名無しさん mailto:sage [2010/01/15(金) 22:33:15 ] 意味は異なるが関連のある変数? なら構造体にするとか
777 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 17:07:00 ] ポインタを配列形式でアクセスするとき、添字に負の数を指定するのは文法上許されるのでしょうか。 int a[10]; int *p = a+5; p[-4] = 0;
778 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 17:10:40 ] >>777 値の正負は文法上の問題ではないので、非負の値が許されるなら当然、文法上は、有効。
779 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 00:43:20 ] けどすごい紛らわしい書き方だな…
780 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 12:01:30 ] まぁ素直に*(p-4)=0と書いた方がいいわな。1[p]とかと似たような空気を感じる。 どうでもいいけど、-4[p]=0は試してないけど有効じゃなさそうだな、優先順位的に。
781 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 18:13:26 ] 一連の流れでmalloc/freeを連想した
782 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 20:05:01 ] >>780 (-4)[p] なら大丈夫
783 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 20:17:49 ] そんな書き方、文法が許しても俺が許さん
784 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 20:38:04 ] コーディング規約とかで人のプログラミングスタイルを制限するのは ナンセンスだと思っている俺ですら>>782 はぶち殺したくなる
785 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 09:30:44 ] べつにいいやんw 一箇所だけとか、少ないときは。 きっと清涼剤のようにさわやかになれるぞ。
786 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 09:40:05 ] なれねーよw
787 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 21:22:34 ] マジックナンバーならまだ一目でわかるが int a[10]; int *p = a+5; int n = -4; /* 数十行のコード */ n[p] = 0; とかなってたら明確な悪意を感じる
788 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 20:40:13 ] すみません。 共通の変数50個を扱うデータクラスA(インスタンスは500個)に関連して 10種x1〜20の配列(ムラの激しい追加情報)が必要なのですが、 全部データクラスAに入れてしまうと、約190個x400インスタンス=76000個分ほどの変数は無駄になる計算で・・。 STLを使うなりクラスをバラにするなり考えているのですが こういう場合、どうデータを管理するのが定番、妥当なのでしょうか?
789 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 21:05:01 ] たかが76000個くらい気にしない、というのも一つの解決方法
790 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 21:24:38 ] 76000個のインスタンス一つは組み込み型程度なの? とりあえず気にしないで作ってだめそうだったら工夫するとか? 76000個をヒープに取ったらまずい?
791 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 21:44:52 ] 使うときに使う分だけ配列を確保すればいいんじゃね?
792 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 23:57:49 ] それは本当に配列でなければいけないの?
793 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 01:55:58 ] >788 >共通の変数50個 この段階でクラスの切り分け方ミスってるような気もするが。 追加情報については STL のコンテナ使うなり(コンテナの選択は追加、削除、検索の発生の仕方次第)、 適当なクラスにラップするなり、ケース次第だと思う。 追加情報に対して単なるコンテナ以上の操作が必要ならばクラスにラップするかもね。
794 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 19:56:01 ] >>789-793 ありがとうございます。巻き添えらしいアクセス制限で返事が遅れてすみません。 今は、言われてみれば数十KB位のようですし、そのままデータクラスAに入れて使う事にします。 問題になってきたらご助言を参考に改良したく思います。 ありがとうございました。
795 名前:デフォルトの名無しさん mailto:sage [2010/01/27(水) 13:10:49 ] すいません。 DIRECT法(DIviding RECTngle)のプログラムを組むことになったのですが、 どうにもとっかかりが無くて困っています。 おおよその理論は分かっているのですが、形にすることが全くできません。 ググって見たりはしたものの、それらしきプログラムソースは落ちていませんでした。 助けていただくことはできますでしょうか?
796 名前:デフォルトの名無しさん mailto:sage [2010/01/27(水) 13:36:39 ] >>795 ググると普通にあるけど…? ソースが欲しいって訳?
797 名前:デフォルトの名無しさん mailto:sage [2010/01/27(水) 18:44:46 ] >>796 ソースがあれば、いただけると幸いです。
798 名前:デフォルトの名無しさん [2010/01/29(金) 17:20:14 ] 795 どなたかお願いします。 書き忘れましたが、C++です。 本当に困ってます
799 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 17:43:15 ] 留年したまえ
800 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 17:53:41 ] >落ちていませんでした こういうこと書かれると手伝う気うせる
801 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 20:13:46 ] >>800 なんでだよw
802 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 20:25:14 ] >>801 なんでだよじゃねえだろ。失礼甚だしい
803 名前:801 mailto:sage [2010/01/29(金) 22:04:27 ] >>802 まあ・・・確かに落ちているという表現はあまり良くなかったかもしれんな。 ま、その辺は本人がきっと弁明するということで。
804 名前:デフォルトの名無しさん mailto:sage [2010/01/29(金) 22:32:16 ] >>803 お前がその本人だろ・・・ 何しれっと他人の振りしてんだよ
805 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 00:01:15 ] >>804 いや別人だから失敬な。 まあ何だっていいけど。 証明方法がないもんなぁ。
806 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 16:20:48 ] 795です。 ご指摘の通り「落ちている」という表現は悪かったと反省してます。 ただ本当に困っています。どなたか助けてくれる方いましたら 本当にお願いします。
807 名前:805 mailto:sage [2010/01/30(土) 16:26:09 ] >>806 このスレには低能力者しかいないから 別のスレ(ttp://pc12.2ch.net/test/read.cgi/tech/1263556932/とか) に行ってみたらどうでしょうか? > 証明方法 fusianasanがあったか。 でもまあ晒したくないからやめとこう。
808 名前:805 mailto:sage [2010/01/30(土) 18:03:11 ] >>806 言い忘れたが、常識で考えてくれ。 このままだとマルチポストになるぞ。 どっちかでは別スレに行ってきますと断りをいれましょう。
809 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 18:25:36 ] すいませんでした。別スレ行きます
810 名前:デフォルトの名無しさん mailto:sage [2010/01/30(土) 19:22:32 ] . ____ _ | (・∀・) | `)) | ̄ ̄ ̄ ̄ ´ ∧ <⌒> /⌒\ _________]皿皿[-∧-∧、 /三三三三三三∧_/\_|,,|「|,,,|「|ミ^!、 __| ̄田 ̄田 / ̄ ̄Π . ∩ |'|「|'''|「|||:ll;| /__,|==/\=ハ, ̄ ̄|「| ̄ ̄ ̄ ̄|「| ̄ ̄| /_| ロ ロ 「 ̄ ̄ ̄ | | 田 |「| 田 田 |「|[[[[| |ll.|ロ ロ,/| l⌒l.l⌒l.| | |「| |「|ミミミミミミ
811 名前:保守 [2010/02/06(土) 11:57:12 ] ttp://exlight.net/devel/cpp/string_initialize.html C++の初期化指定は複雑 C++の初期化は恐ろしく複雑になってて, struct S { int a; static int b; int c; } s = { 1, 3 }; と書いたらs.a = 1,s.c = 3と初期化されるなんてルールも決まっている.あんまり深入りしないでおこう….
812 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 13:12:32 ] 複雑というより落とし穴だらけ、という感じだな
813 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 14:04:51 ] >>811 まあねえ 静的メンバは外で定義しないといけないしね そうしないとコンパイラから叱られる
814 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 17:21:56 ] だが、スタティックメンバ変数程度で*恐ろしく*複雑ってのは、さすがにどうよ? そりゃCよりは複雑だけど、C++に限らず、いまどきの言語でクラス変数使ったら 同じような状況になるし、少なくともスタティックメンバ変数の初期化ルールは *恐ろしく*なんて形容されるほどじゃないと思うんだが。 ついでに聞きたいんだけど、C++に限らず、みんなが「こいつは複雑だ」と思った 言語仕様ってある? 例えば多重継承とかテンプレートとかは複雑?簡単?
815 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 17:49:22 ] テンプレートの部分特殊化のルールは複雑だと思う
816 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 17:50:05 ] あとADLは時々わけがわからなくなる STLが吐く長いエラーメッセージはさすがに慣れたけど
817 名前:デフォルトの名無しさん mailto:sage [2010/02/06(土) 17:55:31 ] ヘッダに const 定義しても ODR にならない場合のルールは複雑だ。
818 名前:デフォルトの名無しさん mailto:sage [2010/02/07(日) 11:35:00 ] そりゃわかにくく書こうと思えばわかりにくく書けるさ とにかく他人にも,そして自分にもわかりやすく書くだけ 忘れた頃に見ても
819 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 02:26:30 ] 座標入れようと思ってdouble[3]のvectorを作ったはいいが、push_backしたときにエラー出る。 仕方ないから struct XYZ{ double array[3]; XYZ(){} XYZ(const XYZ&xyz){memcpy(array, xyz.array, sizeof(double)*3);} ~XYZ(){} XYZ &operator[](unsigned int n){ return array[n]; } }; って作ったけど、もっと楽にできなかったのかなぁ?
820 名前:819 mailto:sage [2010/02/10(水) 02:32:51 ] あ、そんなの言うと、普通にvector<vector<double> >使えって言われそうだけど、 大量の要素を入れたかったんで、double配列いっこいっこに、mallocの管理領域使うのがもったいなかったんだ。 あと、vector<double>にしといて、[i][j]を[i*3+j]ってしたり、ループするときにイテレータ3個飛ばしにしてもよかったんだけど、 なんかそこらへんでコードが地味に複雑化するのが嫌だったんだ。
821 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 05:43:20 ] >>819 boost::array<double, 3>
822 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 07:02:33 ] 要素が3つくらいならboost::tupleとか。 配列っぽく扱える必要があるなら使えないが。
823 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 07:26:33 ] boost::arrayがせいかいじゃね?
824 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 10:25:35 ] >>819 POD型の配列にはコピーコンストラクタがないからエラーになるんだろ
825 名前:デフォルトの名無しさん mailto:sage [2010/02/10(水) 11:09:45 ] >>821 そんなのがあったのですね。トンクス
826 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 07:34:09 ] すみません。Visual C++ 2008 Express Editionで ブレークポイント(行の左に赤丸)を付けてデバッグ開始をした時に ・ちゃんと矢印が出て止まる状況 ・透明な円になり、黄色い△に!が付いて止まらない状況 の2パターンが起きるのは何故なのでしょうか? 以前はちゃんとブレークポイントを入れれば矢印で止まってくれたのですが、 今は止まってくれず、無理に手前のブレークポイントからステップインすると ソースを表示できない とか 逆アセンブル画面へ とかと出てしまいます。 どうすればコードを辿れるようになるでしょうか・・。
827 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 10:17:30 ] 変更したのにビルドされてない、とか別の場所のソースだったりとか
828 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 15:12:40 ] デバッグビルドにするとか
829 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 15:25:45 ] あーリリースビルドで最適化で消されてると中抜きの丸になるな
830 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 20:31:00 ] >>827-829 情報ありがとうございます。デバッグモードのままでこうなるのですが・・ 頂いた情報から調べてみようと思います。 ありがとうございました。
831 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 20:44:20 ] すみません。今まで殆どの定数を、 「ヘッダーファイルに#define」で作っていたのですが、 配列の要素数宣言などに使うわけでもなく、ただ1ソース内の複数メソッドで使う数値などは そのソースのグローバルスコープにstaticで作った方が良い気がしてきたのですが、 これはプログラミングの常識として、やらないべきなのでしょうか? やるべきなのでしょうか?
832 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:09:58 ] >>831 > そのソースのグローバルスコープにstaticで作った方が良い気がしてきたのですが、 C言語ならそのソースの頭で#defineすれば良い。 C++ならconst定数を使うべき。 いずれにせよやらないべき。 ↓↓C++にて↓↓ 今までは #define max_num 100 としていたところをヘッダに const int max_num = 100; と書けばよい。 ttp://www7b.biglobe.ne.jp/~robe/cpphtml/html01/cpp01042.html
833 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:18:11 ] >>831 1ファイルだけでしか使わないなら、そのファイルの先頭で定義するのは普通。 C++ならconst使え、とは832も言っているとおりだが。
834 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 00:11:02 ] >>832-833 ありがとうございます。用途に応じてconstを使うよう心がけようと思います。
835 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 00:36:35 ] 2つ質問させていただきます (1) char* x = "ABC"; *x = 'x'; を実行するとエラーになるのですが、なぜ2行目の代入はうまくいかないのでしょう (2) void test(const int n) { int a[n]; } int main() { test(5); } を実行すると、 定数式が必要です。 サイズが 0 の配列を割り当てまたは宣言しようとしました。 'a' : サイズが不明です。 というエラーが出てコンパイルできません。 testの仮引数を定数にしたので配列が作れると思ったのですがなぜだめなのでしょう。
836 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 02:03:41 ] >>835 (1) www.kouno.jp/home/c_faq/c1.html#32 (2) www.kouno.jp/home/c_faq/c11.html#8
837 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 02:58:24 ] >>836 ありがとうございます。(1)はわかりましたが、(2)に関しては const int n = 5; int a[n]; はコンパイルでき、違いがよくわかりません。 関数として用いる場合(>>835 の書き方)は事実上定数になっていない、ということでしょうか
838 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 03:21:53 ] >>837 それがコンパイルできるなら、たぶん C++ 使ってるんじゃないかと。
839 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 04:04:15 ] >>838 どこでCとC++の区別をつけるのかいまいちよくわかっていませんが、 C++のつもりで書いていました。
840 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 04:12:29 ] >>839 コンパイラが違う
841 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 04:24:55 ] >>839 CからC++が派生する過程で、constがついている変数は定数とみなすようにルールが変更された。 逆に言うと、constがなければ定数とはみなさない、というルールなので従うしかない。 VC系コンパイラなら、拡張子をcにすればconstがついていてもエラーになると思う。 これがgccだと>>835 の(2)すら通っちゃうんだが、言語仕様上はエラーになるのが正しい、はず。
842 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 04:28:04 ] >>841 gcc で通っちゃうのはおそらく C99 の仕業。たぶん const なくても通る。
843 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 04:41:14 ] C99制定前からのGCC独自拡張です
844 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 14:16:59 ] 質問です。 ttp://bal4u.dip.jp/mt/program/c-4/ ここの「数字変換 10進数を2進数に変換 dec2bin」を、 10進数から3進数へ変換するようにしたいのですが、うまくいきません。 どのようにしたらよいでしょうか。
845 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 14:43:18 ] >>844 どうしたらうまくいかなかったを書かないとなんともいえない。
846 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 15:32:41 ] 親クラス -(継承)-> 子クラス -(継承)-> 孫クラス というクラスで、孫クラスを親クラスに見立てて扱いたい(多態)と思い、 (親クラス型)孫クラス というふうにアップキャストしようとしたら、コンパイラに怒られました。 こういうの、って設計がマズいということでしょうか・・・
847 名前:844 mailto:sage [2010/02/27(土) 15:33:03 ] do { r = 0; non_zero = 0; for(i = dec_len - 1; i >= 0; i--) { d = tmp[ i ]; tmp[ i ] = d / 3; if(r > 0){tmp[ i ] += 3;} if(tmp[ i ] > 0){non_zero = 1;} switch(d) { case '0': r=0;break; case '1': r=1;break; case '2': r=2;break; case '3': r=0;break; case '4': r=1;break; case '5': r=2;break; case '6': r=0;break; case '7': r=1;break; case '8': r=2;break; case '9': r=0;break; } //r = d & 1; } bin[ bin_len++ ] = r; }while(non_zero); 主要部分を改造した物を上げて見ます。 ごらんの通り、答えが合いません。 全体的に訳が分かりません。(元のソースは理解できましたが……)
848 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 18:24:32 ] >>846 その変換は暗黙の変換で通るはず。 これ以上はエラーメッセージやソースを晒してもらわないとわかんない。
849 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 18:32:43 ] >>844 ,847 元のソースから変数名が適当で読みにくいソースだね。わけがわからないのはそのせいじゃない? 素直に一旦ふつうの整数値として取り出して3進の文字列に書き出すようにしたほうが 簡単だと思うよ。整数値に変換する部分は strtol() 使えば一発だし。
850 名前:844 mailto:sage [2010/02/27(土) 19:44:37 ] >>849 多倍長演算ってことになっているので、いったん数値に戻すっていうのも難しそう。 一応 50桁の10進数を3進数に変換したいと考えています。 他に簡単に10進 3進の相互変換が出来そうな仕組みはありませんかね。 とりあえず一桁の時の答えだけは合うようになった(笑)
851 名前:846 mailto:sage [2010/02/28(日) 15:24:38 ] >>848 すみません、何か勘違いしていたようです。 問題なく動きました。 失礼しました。
852 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 23:07:29 ] >>850 849 同様に俺も数値にした方がミスしにくいし応用も効くしいいと思うけどな 桁数多くてもgmp みたいなものもあるし,必要なら自分で class 作っても良いし まぁ目的に依るけどね >>844 のコードを変更することだけが目的ならしょうがないけどね
853 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 20:07:36 ] 初歩的な質問すみません、BYTE配列からDWORD型変数に数値をコピーした時、 1バイト分しかコピーできないのですが、(256以上が0…1…2… となってしまいます。) どうすれば8バイト分コピーできるのでしょうか。
854 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 20:49:47 ] > BYTE配列からDWORD型変数 C/C++にそんな型は存在しません。 MFCの用語はスレチな気がする。 ttp://pc12.2ch.net/test/read.cgi/tech/1250919279/ こことかか?
855 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 20:59:30 ] >854 MFC っていうか Win32 だと思われ。 書いてる事そのものは memcpy とか CopyMemory だけどそれが本当に自分のやりたい事かどうか 確認した方がいいかもしれない。
856 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 21:01:36 ] >>854 > C/C++にそんな型は存在しません。 小心者スレッドなんだからまあ良いではないか。 >>853 どんなコードでコピーしたの? そもそもBYTE型に256以上の値は入らないし、DWORDだったら4バイトだよね。
857 名前:854 mailto:sage [2010/03/07(日) 21:21:41 ] >>856 > 小心者スレッドなんだからまあ良いではないか。 一応 小心者 向けに多少はしたつもりだったんだが、 俺の言い方はやっぱまだ厳しかったか。 スマン
858 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 21:40:13 ] コード見たほうが早いなたぶん
859 名前:853 mailto:sage [2010/03/08(月) 00:08:15 ] >>854-858 ありがとうございます、memcpy使えば良かったですね、 他の事に気がいっててそんな事にも気付かなかった、 orz あとDWORDは4バイトだったんですね、ご指摘ありがとうございました。
860 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 10:55:08 ] 配列ならポインタを強引にキャストするだけでもよくね メモリ上の配置の把握が必要だけど、memcpyするにしてもそれは必要だし
861 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 12:43:22 ] >>860 エイリアシングルールというものがあってだな。 www.radiumsoftware.com/0304.html#030408
862 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 03:46:00 ] 8bit変数配列→32bit変数、ってだけならunion作れ 8bit変数配列→32bit変数配列、とかならどうしたもんだか