スレを勃てるまでもないC/C++の質問はここで 9
2 :
デフォルトの名無しさん :2009/04/18(土) 12:03:41
お つ だ よ ∧,,∧ ∧,,∧ ∧,,▲ ∧,,∧ (,,・∀・) ミ,,・∀・ミ (;;・∀・) ミ,,・∀・ミ 〜(_u,uノ @ミ_u,,uミ @(;;;;uuノ 〜ミ_u,,uミ
ま つ た け ∧,,∧ ∧,,∧ ∧,,▲ ∧,,∧ (,,・∀・) ミ,,・∀・ミ (;;・∀・) ミ,,・∀・ミ 〜(_u,uノ @ミ_u,,uミ @(;;;;uuノ 〜ミ_u,,uミ
4 :
デフォルトの名無しさん :2009/04/18(土) 13:25:02
ペ 二 ス ∧,,∧ ∧,,∧ ∧,,▲ ∧,,∧ (,,・∀・) ミ,,・∀・ミ (;;・∀・) ミ,,・∀・ミ 〜(_u,uノ @ミ_u,,uミ @(;;;;uuノ 〜ミ_u,,uミ
こ ん ま お ∧,,∧ ∧,,∧ ∧,,▲ ∧,,∧ (,,・∀・) ミ,,・∀・ミ (;;・∀・) ミ,,・∀・ミ 〜(_u,uノ @ミ_u,,uミ @(;;;;uuノ 〜ミ_u,,uミ
6 :
デフォルトの名無しさん :2009/04/18(土) 15:32:08
あやせはるかちゃんのおまんこは臭いかな?
勢いでスレたててしまったが…。
ちょっぴり反省してみるorz
どこでもよいかもだけど
前スレの
>>998 ソースの最後(どうでもよい)に
rewind(stdin);
getchar();
書くと入力待ちで止まるよ…
てかどうやってコンパイルしたのかな
IDEかな…
rewind(stdin);を実行した結果は標準Cでは定義されていない
Windows環境ならconio.hの getch()が一番使いやすいと思うんだけど。
scanfより fgetsとsscanfを使う方がいいと思うよ
12 :
デフォルトの名無しさん :2009/04/18(土) 23:12:14
int main(void) { int a=0; while(1){ scanf("%d",&a); if(a==1||2) continue; printf("(tAt)ノ\n"); } return 0; } 1または2以外の数を入力したら下の顔文字が出力される。 と思ったらそうはなりません。 何処が間違ってるのでしょうか? ||ってこういう風には使えないのでしょうか?
if(a==1||a==2)
14 :
デフォルトの名無しさん :2009/04/18(土) 23:19:21
先ほど、C#スレに誤爆してしまいました。ですが気を改めて… 先日、C言語の勉強を始めた者です。まだまだ参考書の始めの方なのですが、エラーが起きてよくわからないことになってしまいました。 いまだにキーボードから数値を入力させて、それを表示する程度のものの自己流改変なのですが、なぜか二つ目を入力した後にエラーが起きて止まってしまいます。 それと、途中でプログラムの流れを止める方法がわからないので、それも出来れば教えていただけませんでしょうか? とりあえず理想としては、エンターを押してからもう一度押す迄 変数X + 1の答えを変数Xに代入し続けるようなプログラムが作りたいのです。 一応、ソースを書いておきます。 #include <stdio.h> int main(void) { int PS; float PS2; float PS3; printf("まずは整数を入力してください。"); scanf("%d",PS); printf("次は、小数を入力してください。"); scanf("%f",PS2); printf("最後にもう一度、小数を入力してください。"); scanf("%f",PS3); int end; printf("では、なにか数字を入力してエンターを押すと、結果が表示されます。"); scanf("%d",end);
15 :
デフォルトの名無しさん :2009/04/18(土) 23:19:29
16 :
デフォルトの名無しさん :2009/04/18(土) 23:20:47
printf("最初の整数は %d ですよね?",PS); ; printf("そして次は少数一回目は %f ですよね?",PS2); ; printf("そして最後は、 %f となっておりますよね?",PS3); ; int red; printf("最後に、面白いものを見せましょう。適当に数字を入れてエンターを押してください。"); scanf("%d",red); printf("exeファイルのダブルクリックをしていなければ、適当に入れてもらった数字を足した数を「%d」内に表示しておきます。では、さようなら。",end + red); return 0; } 最後のprintf()が終わっても自動的に閉じないようにするには、いったいどうすればいいのでしょう? 初歩の初歩の私ですが、どうかご教授をお願いします。
スパゲッティが食べたくなった
どっから突っ込んでいいやら・・・ まず人のソースを見て真似るところから始めれ そんなソース書く奴今まで見たことないぞ
19 :
デフォルトの名無しさん :2009/04/18(土) 23:47:57
>>16 最後の閉じないってのは単純にコマンドライン上でそのプログラムを実行すればいいんじゃね
サンプルソース #include <stdio.h> int main() { double d; printf("浮動小数点数を入力してください。"); scanf("%lf%*c", &d); printf("入力した値=%f\n", d); printf("Hit any key\n"); scanf("%*c"); return 0; }
>>14 ※1.return 0; の前に入力を待つには、char cc; scanf("%c%*c", &cc);
※2.C++でなくてCのはずなのに、実行文の途中で変数を宣言している。
※3.scanfで変数に値を入れるのは、scanf("%d", &変数名);
※4.デバッグ&コンパイルして実行してみると改行が無い。
printf(".....\n", ....);
22 :
デフォルトの名無しさん :2009/04/19(日) 00:40:50
複数のPCが一つの共有メモリを参照しながら動作するような システムがあるとします。 (共有メモリはどれか一つのPC上に存在する) この場合ネットワーク越しにアクセス可能な共有メモリが 欲しくなってしまったのですが、ググってもズバリなページを 見つけることが出来ませんでした。 どなたかヒントになるような知識をお持ちの方、 お教え願えないでしょうか?
あ
>>22 本当に共有メモリをネットワーク透過で使いたい場合、敢て挙げるなら分散共有メモリとか。
そうじゃなけりゃ分散オブジェクトとかでググれば?
スレ違いだったらごめんなさい。 今C言語のポインタを勉強しているのですが、 p : pの指すアドレスを参照 p+1 : pの指すアドレスを+1 p++, p=p+1 : pにpの指すアドレス+1を代入 *(p++), *p++ : pの指すアドレスの内容を参照後にpの指すアドレスを+1 *(++p), *++p : pの指すアドレスを+1した後にpの指すアドレスの内容を参照 *p : pの指すアドレスの内容を参照 *p+1, (*p)+1 : pの指すアドレスの内容に+1 *(p+1) : pの指すアドレスを+1した内容を参照 (*p)++ : pの指すアドレスの内容を参照後にpの指すアドレスの内容を+1 ++(*p) : pの指すアドレスの内容を+1した後にpの指すアドレスの内容を参照 &p : ポインタ変数p自体のアドレス このような解釈でよいのでしょうか? 自分で色々と試したのですが、認識の確認のため投稿させて頂きました。 誤りや他の記述方法があれば教えてください。 よろしくお願いします。
26 :
デフォルトの名無しさん :2009/04/19(日) 01:59:18
質問です。 3〜4か月かけて、なおかつ3人ぐらいの人数で役割分担して作れるプログラミングってなんでしょうか? ちなみに、Cプログラムで、習い始めて半年くらい。 Cについて一通り習いました。 考えたんですが、オセロとかは難しすぎますかね?
「アドレス」は+1ずつ変化するとは限らんよ。 pが charへのポインタなら +1だけど、shortへのポインタなら +2される。 一般的に書くと、sizeof(ポインタが指す先の型)だけ変化する。
28 :
25 :2009/04/19(日) 02:04:35
>>27 理解はしていましたが文章の書き方がまずかったです(^^;)
ご指摘ありがとうございます。
他にはいかがでしょうか…?
>>26 俺もオセロ作ったけどCPUなしなら1か月もかからなかった
>>28 コンパイラあるんなら自分でそれぐらい確認出来るだろ
エアコンパイラ状態?
32 :
デフォルトの名無しさん :2009/04/19(日) 06:02:56
プログラム内で使う std::exception 派生の例外用のクラスを作って、throw(…) なんかも きっちり書いてみたんですけど、でも例えば関数内で new に失敗して std::bad_alloc が 発生するようなケースを考えていると、結局は全て throw(std::exception) と書かなきゃ いけないような気がします。throw の宣言はどう書くのが一般的 (慣例的になるか?) なんでしょうか。
ANSI ではポインタをバイト単位のリニアな数値だなんて規定はしていなかったと思うが。 だから a と b が NULL 以外の同じメモリブロックを差していても a==b が true になる 保証はないし、当然ポインタ同士の減算結果も保証してない。具体的には DOS のような 16bit マシン上のラージメモリモデルなんかは ++ が sizeof(型) 増える保証なんてない。
同じ集成体上のオブジェクトを差しているポインタ同士の減算は定義されていて、 要素数にしていくつ離れているかを返すことになっている。
集成体って配列の事? 構造体も含む? まぁ ANSI で正確にはどう規定されているかとかまでは知らんけど。
構造体の中身は要素同士が連続してる保証がないから、構造体メンバのポインタの減算はできないはず。
far ポインタナツカシス
38 :
14,16 :2009/04/19(日) 10:48:17
>>20-21 丁寧にありがとうございます。書いてないけど知りたかった改行の方法まで書かれてて、本当に助かります。
ところで、「%*c」というのはどういう意味なのでしょうか?
ポインタの概念はわかるんですが、じゃあ何に使うの?って感じです。
40 :
デフォルトの名無しさん :2009/04/19(日) 10:53:30
>>39 ポインタの使用例:
#include <stdio.h>
void f(int *p) { *p = 3; }
int main(void)
{
int i;
i = 100;
printf("%d\n", i);
f(&i);
printf("%d\n", i);
return 0;
}
42 :
デフォルトの名無しさん :2009/04/19(日) 11:34:03
あ
すまんが質問させてくれ 今とあるクラス(Aと過程)を更に別のクラス(Bと過程)で使おうとしてるんだが Bクラスの中では、Aクラスを可変で使おうと思ってる そこでAクラス内部にリスト処理を追加しようか、Bクラス内部で追加しようかで悩んでる 具体的には Aクラスを↓のように追加するか class AClass { private: AClass *next,*prev; }; Bクラスで class BClass { private: typedef struct _tag_hogehoge{ AClass *pA; struct _tag_hogehoge *next, *prev; } hogehoge; }; 果たしてどちらがいいだろうか? オブジェクト指向ならAクラスに追加だけど 高速性を重視にしてるから、Bクラスの方が早いんだよね みなさんならどうしますか?
オブジェクト指向なら、Aが前後のインスタンスを意識するのは不自然じゃね?
>>45-46 レス有難うございます
>>45 std::listですが、これはランダムアクセスが遅い為に考慮しませんでした
ランダムアクセスでも高速で取得出来る様な独自のリスト処理を
AクラスかBクラスのどちらかに追加しようと思っています
>>46 うーん、そうでしょうか?
オブジェクト指向だからこそ、Aクラス自信のインスタンスは
Aクラスで処理するものだと考えております
原則としてAは自分自身のことだけ知っているべきで、自分がどう管理されるかは 管理するオブジェクトが知っていればいいんじゃないかな? 自分自身に next,prevがひっついてるとリスト構造を強要されるけど、 無ければ配列やハッシュマップなど他の管理方法をとることもできる。 あくまで原則論で、高速化などのために崩すこともあるけど。
49 :
デフォルトの名無しさん :2009/04/19(日) 12:15:53
>>47 >ランダムアクセスでも高速で取得
なら、std::vectorを使えば?
>>48-49 レス有難うございます
>原則としてAは自分自身のことだけ知っているべきで、自分がどう管理されるかは
>管理するオブジェクトが知っていればいいんじゃないかな?
そうですね。有難うございます。
Bクラスの方にすることに決めました
>>49 Aクラスの情報を引き出す際にインデックスは勿論ですが
文字列名や保持してるデータと称号して、該当するデータを引き出すため
std::vectorでも相性が合わないため、考慮しませんでした。
レス下さった方々本当に有難うございました。
自分のクラスにリスト頻繁に交える俺は間違ってたか… tmp=getCreateAddress(); tmp->setData(); ってな感じ。自己拡張で便利何だけどな
STLのbitsetで質問があります。 std::bitset<5> hoge; これで5ビットの長さのビット配列が確保できると思いますが これを実行時に決めたいのです。 どのようにすればいいのでしょうか?
55 :
53 :2009/04/19(日) 16:44:04
>>54 おお!そのものずばりですね!ありがとうございます。
56 :
デフォルトの名無しさん :2009/04/19(日) 23:05:34
これ、俺の友人が送ってきたCのソースファイルなんだが… #include <stdio.h> void main() { int nan; double d; printf("整数を入れてください:"); scanf("%d",&nan); printf("浮動少数点:"); scanf("%d",&d); printf("%D",nan); printf("%d",d); return 0; } 望むような結果すら得られない。多分入力された整数と浮動小数点数を表示したいんだろうけどな。
何という間違い探し 4ヶ所ほど見つけたけどめんどいから指摘しない 赤ペンで画面に書けるなら楽だけどw
int main() scanf("%lf",&d); printf("%d\n",nan); printf("%f\n",d);
MDCでオフスクリーン描画して色々図形が忙しく動き回るプログラムなんですが 20秒ほど実行したところで、ウィンドウの×ボタンとかが変なところに表示され 一見動きが止まってしまいます しかしALT+F4等ではちゃんと終了できる状態なんですが これってどういう事なんでしょうか
60 :
デフォルトの名無しさん :2009/04/19(日) 23:19:26
C言語を勉強しだしたタイミングも、勉強した時間も同じなんだけどなぁ… といっても、俺もあまり変わらないくらいのものしか書けないんだけどな。 あと、この友人には英語の勉強が必要な気がする。 「numはnumberの略なんだよ」っていうのを聞いてこの友人が書いたのが「nan」だからな。 ちなみに昨日はritan 0;って書いてたし。 同じような処理のものを書いてみたらどうなるんだろうと自分でも書いてみたけど、最初のコンパイルでいきなりエラーが出て泣きたくなった。
>>50 ありがとうございます。使いどころについてあれこれ思案してみたんですけど、
「宣言外 (つまり想定外) の例外は全部 abort ルーチンに行けば良い作り」という
限定的な状況で有用なものですよね。
呼び出し上位の try-catch で自前例外も汎用 std::exception も対応している設計だと
throw(何とか) 宣言はあまり意味がなさそうです。
>>61 あと、いちいちチェックしないといけないのでthrow()以外の例外指定を使うと性能面で不利という話もあったはず。
>>32 その関数のなかでstd::bad_allocを回収して対処ができるならcatchすればいいし、
メモリアロケートに失敗したらもうお手上げだって言うなら、上位のハンドラに任せればいい。
参照について質問です。 const Telegram& telegram = *PriorityQ.begin(); BaseGameEntity* pReceiver = EntityMgr->GetEntityFromId(telegram.Receiver); Telegram構造体の参照 telegramに対してtd::set<Telegram> PriorityQのbegin()に 間接参照演算子をつけて代入しています。 ここをconst Telegram&にする理由がわかりません。 const Telegramにしてもコンパイル通るのですが、どういう違いがあるんでしょうか?
const Telegram&だとアドレスコピー const Telegramだと代入コピー const Telegram& telegramの方だと *PriorityQ.begin()の中身が変わっても、telegramの参照先は中身が変わる const Telegram telegramの方だと *PriorityQ.begin()の中身が変わっても、telegramの参照先は代入コピーされた時のまま、つまり中身は変わらない
おっと、文法を間違えた ×*PriorityQ.begin()の中身が変わっても、telegramの参照先は代入コピーされた時のまま、つまり中身は変わらない ○*PriorityQ.begin()の中身が変わっても、telegramの中身は代入コピーされた時のままなので、*PriorityQ.begin()が変わっても反映されない
>>59 リソースリークしててどんどんリソース消費してると
そういう現象になる場合があるよ
現在文法を覚えた段階でこれからwindowsアプリを勉強しようと考えているのですが APIやら.NETやら色々あってよく分かりません 最終的にはDirectXに触れたいのですが全く理解できませんでした まずなにからやればよいのでしょうか?
C言語で配列の境界チェックを行うようなオプションを備えたコンパイラはありませんか? 今はVC++2008を使っています。
>>65 なるほど!よくわかりました。ありがとうございます。
>>69 C++Builder2009付属品のCodeGear C++ Compilerを使えば
CodeGuardオプション-vGを付けてコンパイルすればアクセスオーバーラン
を実行時に検出してログを出力してくれる
今も昔もWindowsの基本はプログラミングWindowsとAdvancedWindows・・・のはず・・・
75 :
デフォルトの名無しさん :2009/04/20(月) 17:09:14
質問っていうか、愚痴なんだけど 戻り値の型とかはすべて左側によっていたほうが読みやすいよな常考 void (*signal(int sig, void (*func)(int)))(int); より (void *(int)) signal(int sig, void (*func)(int)); みたいな感じのほうがいいよねっ!! なにか深い理由があって今のようになったのか、なんとなくなのか 仕様策定当時、反対意見はあったのか、なかったのか知りたいです
77 :
デフォルトの名無しさん :2009/04/20(月) 20:40:20
知識ゼロなんだが何から始めればいいのか教えてくれないか
>>77 知識ゼロならまずパソコンの電源のON・OFFからだな。
それからマウスの使い方と…(ry
…んでプログラミングをしたくなったら、
どのくらいになりたいかを決めるべき。
1.単なる遊びや趣味(職業プログラマではない)&&実用を求めない
2.単なる遊びや趣味(職業プログラマではない)&&実用を求める。
3.職業ではないが、フリーソフトを公開するなど準プロレベルで相当やり込みたい。
4.職業プログラマになりたい。
5.神級ハッカーになりたい。
適当な入門書買ってきてそれを一通りこなせ。 なるべく高いヤツ買うと、途中で投げ出すのがもったいなくって続くかも。
80 :
77 :2009/04/20(月) 20:56:14
パソコンの知識は大丈夫だ^p^ C言語に慣れる目的で友人と2Dゲー作ろうとしているんだ 今のところは趣味レベル目的でう
81 :
77 :2009/04/20(月) 20:57:40
入門書のオヌヌメとかあったら教えてくれないか 書店で少し見たんだがどれを買えばいいのか分からない
82 :
78 :2009/04/20(月) 21:09:10
ここでCの書籍に詳しくない俺が 無責任にオススメを語るのは 悪い気がするから、他の人にお願いします。 俺はもうC++ばっかなんだよ。。。
doubleのfはfloat intのdは何の略か教えて
digitかな?
>>83 digitだという説と、あとなんか別のd****だっていう説を聞いた気がする。
でも忘れた。
decimalだろう。 対照的に%iは八進・十六進でも入力できる指定なのだから。 (printf系では%dと%iで違いはないけど)
>>86 decimalって小数点って意味じゃない?
と思いきや10進数decimal numberのことか。
88 :
77 :2009/04/20(月) 21:40:03
2kぐらいの分かりやすそうな本買ってきた C言語超入門って技術論社の奴だ 勉強してみるよ
std::vector<hogehoge *> hoge; のようにstd::vectorでクラスポインタの連結を使用としたんですが hoge.push_back( new hogehoge( ) ); と書くと、push_back時に勝手に(new hogehoge( ))が更にコピーされる為 new hogehoge( )の分がメモリリークしてしまうんですが これは大人しく std::vector<hogehoge> hoge; と書くべきでしょうか? ↑だと沢山連結しようとすると何か遅い気がするのですが そうでもないでしょうか?
>>89 boost::ptr_vector使え
解放すると勝手にデストラクタを呼び出す
>>89 あとクラスhogehogeのコピーコンストラクタを正しく書け
>>89 はメモリリークする原因を勘違いしてたんじゃないか?
93 :
77 :2009/04/20(月) 23:00:31
コマンドプロンプトに三角形の面積計算させるまでは出来たんだが ここの住人はコンパイル作業コマンドプロンプトでやってるのか?
>>90-92 有難うございます
コピーコンストラクタは書いていませんでした
>
>>89 はメモリリークする原因を勘違いしてたんじゃないか?
std::vectorに渡したクラスのアドレスと
vectorから引き出したクラスアドレスは異なっていましたので
vectorに渡す際のnew hogehoge( );は解放されずリークしていました
>>95 vectorに渡したポインタが取り出すときに違うってのは、ないと思うんで、
どっかでバグってるんじゃないの?
hogehoge*をvectorに入れたら デストラクタが明示的に呼ばれないけどちゃんと消してる?
98 :
デフォルトの名無しさん :2009/04/21(火) 00:06:06
scanf()で浮動小数点を入力して、printf()で浮動小数点を出力してるんだけど、どうしても12.3600000000みたいになるんだけど…。12.36みたいにする方法って無いの?
%g
>>93 メインはIDEでやるにせよ、簡単なクラスの単体テストとかはコマンドでやることが多いかな。
でも人それぞれだな。
>>95 あ、もちろん代入演算子も書いとけよ
クラス内でnew/deleteする場合はコピーコンストラクタと代入演算子を
ちゃんと書いておかないとメモリリークを引き起こしたり二重deleteなどの
問題を引き起こす
102 :
100 :2009/04/21(火) 00:15:49
>>95 >push_back時に勝手に(new hogehoge( ))が更にコピーされる為
と
>new hogehoge( )の分がメモリリークしてしまうんですが
ってのが意味的につながらない気がする。
「更にコピー」ってなんだ?
hogehoge* p=new hogehoge( );
でこのまま放置するとメモリリークすることは知ってるよね?
最後にdeleteするんですよ。
>コピーコンストラクタは書いていませんでした
いや、書いてないかどうかというのが問題なわけではないのでは?
書かなくても(コンパイラが自動生成する物で)大丈夫なクラスは大丈夫だし、
だめなものはダメ。
そしてhogehogeクラスが大丈夫なほうかだめな方かはソースを見ている君にしか分からない。
ポインタだけをコンテナに入れているのに「さらにコピー」とかおかしいよな
inline 関数って関数マクロと同等の処理速度を望めるかと 思ったのですが、違うのでしょうか? #include <stdio.h> #include <time.h> #define addMacro(a,b) ((a)+(b)) int addFunc(int a, int b) { return a + b; } inline int inlineFunc(int a, int b) { return a + b; } void test1() { for ( int i = 0; i < 10000000; i++ ) addMacro(a,b); } void test2() { for ( int i = 0; i < 10000000; i++ ) addFunc(a,b); } void test3() { for ( int i = 0; i < 10000000; i++ ) inlineFunc(a,b); } int main( int argc, char **argv) { clock_t s; s = clock(); test1(); printf("test1:%ld\n", clock() - s); s = clock(); test2(); printf("test2:%ld\n", clock() - s); s = clock(); test3(); printf("test3:%ld\n", clock() - s); return 0; }
>>98 printf("d=%.2f\n", d);
コンパイラはinlineキーワードを無視できる 実際にinlineが適用されているかどうかはデバッガで コンパイラが吐き出したコードを覗いてみるしか知る方法が無い
まぁ、やってみろ。
108 :
77 :2009/04/21(火) 01:00:03
いまの店員シミちゃんだろ
109 :
デフォルトの名無しさん :2009/04/21(火) 01:14:48
for文を使って2の0乗から10乗まで全て足していくプログラムはどうやって作りますか?
int num = 0; for(int i=0; i<=10; i++) num += (1 << i);
printf("%d", 0x7FF);
関数内で static 宣言された変数の領域ってマルチスレッド環境でスレッドごとに別になりますか?
よく考えたらそんなわけないですね。スレッド固有のメモリ領域を使いたい場合は malloc で動的に 確保しなきゃだめですか? itoa() とかどうやってるんだろ。
atoi() は内部の static なバッファを返しているのかとカンチガイしていました orz
×atoi() ○itoa() もう寝るぽ…
例外で throw されるオブジェクトのスコープって catch ブロック内まで有効なんですか? throw しているブロックのスタックが巻き戻されたら無効になりそうなんですけどどういう 仕組みになってるんですか? try{ foo(); } catch(const my_exception& ex){...} foo(){ throw my_exception(); }
modelクラスからViewクラスに幾つかの値を渡したいのですが やりとりする値を格納するData構造体をmodel内に所有させて Data* GetData(); というGetterで渡して覗き見させてたのですが modelの派生クラスで扱う値が増えた場合 Data構造体も派生させるとview側でダウンキャストが必要になりあまり良くない気がしますし Data構造体に全ての値を持たせると親クラスでは使わないデータも持たせることになりこれもきれいじゃない気がします MODELとViewを連携させる良い仕組みは無いでしょうか また、派生して拡張、という行為自体がis-aに相応しくない気がするのですが こういう場合はどういうクラス構造にしたらよいでしょうか
使わないデータを持つのは普通かと
>>117 派生クラスで追加したい変数は Dataの外にメンバ変数として持たせればいいのでは?
getメソッドも新たに追加した変数ごとに追加する。
拡張部分は所有させれば良いのだろうが 今度は多態的に利用するときに、拡張部分へアクセスできるインターフェイスをどうするかで悩むんだりする
多態的な利用をする際には、拡張部分にアクセスする必要は無いんじゃないかな。 もしそのインスタンスに拡張部分があることを知ってるのならば、子クラスのインスタンスだ とわかってるはずなんだし。
>>113 環境による
スレッドローカルで調べてみては
32.0f ってあった場合、末尾のfって何を表してるんでしょうか?
>>122 ありがとうございます。やっぱりプラットフォーム固有の方法になりますよね。
>>123 32.0だとdouble型定数扱い。
ところが32.0fって言う風にfを付けるとfloat型定数扱いにしろっていう意味になる。
127 :
123 :2009/04/21(火) 22:35:07
double型の変数をchara型の配列に変換するのでかっこいい方法ありませんか? sprintfとかそんな関数できるだけ使わずにforとかビット演算とか出来るなら再帰関数 を使ってカッコよく書きたい
(char*)&d;
難しさで並べると クラス1 C++ クラス2 C クラス3 Java クラス4 C# クラス5 PHP これであってますか?
クラス1 C++ クラス2 C クラス3 C# クラス4 Java クラス5 PHP
言語それぞれに違った難しさがあると思う C メモリー管理が大変、変数が関数の先頭にあるので読みづらい C++ テンプレートゴリゴリ使われたらデバッグ大変かも C# つかったことないけどマイクロソフト仕様で苦労するかも GUI向け? Java ライブラリ覚えるまで苦労しそう、開発環境整えるのに一苦労? PHP セキュリティー面の心配とHTMLと混じると読みづらいとか? 正直C++以外わからんヽ(´ー`)ノ
>C メモリー管理が大変、変数が関数の先頭にあるので読みづらい それは書いている奴がロートルなのか、ロートルに教わった不勉強の所為。 普通は、適宜ブロック内で定義するから関数の先頭に纏まる訳ではない。 それと、C#も.Netの関数を把握するまでは思うように使いこなせないと思う。 尤も、Cだとそう言った便利な関数が殆どないから全部手作りになるけど。
変数定義は関数の最初にまとめる方式の方が どこで定義してるかわかりやすくなっていい
なるほど、余程だらだらと長い関数を書いているんでしょうね。
変数の寿命は短く、とコードコンプリート様は言っておられる。
変数定義の場所探すのなんかIDEに頼れよ
定義場所をわかりやすく表示してくれるIDEがない。
君の言う分かりやすさとは?
コード読まなくてもわかること。
関数の先頭に書かれていても読まなきゃ何もわからんわ
DATA DIVISION. WORKING-STORAGE SECTION.
全部ブローバルで宣言しとけ
char* buffer; char *buffer; * をどっちよりに付けるか人によって違うけど何か違うの?
char *p; は昔ながらの記述方式。今でも標準 char* p; は比較的新しい記述方式 char* p1, p2; と書くとp1はchar*だけど、p2はcharなので注意 typedef p_char char*; p_char p1, p2; と書くとp1, p2ともchar* 俺は場面によってどちらが見やすいかで使い分けてるけどな
64bit 環境になると C/C++ のポインタが 64bit になったりするの? 今 Java のオブジェクトに C のポインタをハンドラとして持たせようとしているんだけど long にするか int で良いのか迷ってます。
>typedef p_char char*; >p_char p1, p2; これはマジ辞めてくれ。for文の中でgotoで無理やりループを見たときと同じ衝撃だ
LPSTRでも衝撃受けたのかw
ま、必要以上にtypedefされたら読みにくくてしょうがない
常にIDEでソースを読むわけじゃないし
ttp://ja.wikipedia.org/wiki/Typedef ・批判
一部の人々は、typedefを広範に使用することに反対している。
ほとんどの議論は、typedefは単に変数の実際のデータ型を隠すだけであるという考えに集中する。
例えば、Linuxカーネルハッカーであり、ドキュメント作成を行っているGreg Kroah-Hartmanは、
関数プロトタイプ宣言を除いて、typedefの使用をやめさせようとしている。
彼は、typedefを使用することが、必要以上にコードを混乱させるだけでなく、
プログラマが巨大な構造体を単純な型と誤認識して使用してしまうことがあると主張している。
>>151 衝撃受けたな。WinSDKの構造体やらはポインタは全てLP***ってなってるけど
俺は使うときは必ずTCHA *pszHoge;とかにしてるよ。LP***は絶対に使わない
へえ、 >gotoで無理やりループを見たときと同じ 衝撃なのか、変なやつだな。
API(やヘッダファイル)の指定とわざわざ違うように定義すると他人が読みづらいよな。
time_t変数を足して2で割って、早々に2038年問題を引き起こして大トラブルになった事例があったな time_tがlongでtypedefされてることを意識してればあるいは防げたかもしらん
LPSTR は衝撃的だった。というか LP〜 が本当に有用なら * なんて記号使わないで 言語仕様がそうなるんじゃ。
LPのLってlongかな(large, linearかもしらんが) nearポインタとかfarポインタの名残りっぽいけど いつまで引っ張るんだよw
なんだ、ハンガリアン記法も知らない新人かよ 有用性は置いておくとして
最近はまたポインタのサイズを気にしないとならなくなってきてるな。 混在することはまずないんだけど。
真っ黒ソフトが先走って/Wp64コンパイラオプションを導入したけど すでに廃止される予定とか、混乱の悪寒
>>153 ( ・∀・)人(・∀・ )ナカーマ
俺もLPシリーズはイライラするので使わない。
LPなんとかに限らないが、Windowsの方言使うのは、Windowsとのインタフェース部分だけにしてほしい。 Windowsと関係ないアプリケーションのコアは普通のC/C++で書いてくれ。
LP〜よりもTCHARの方がイヤだな あれのおかげで余計な手間が増えた気がする
Cで_T("hoge")とかL"hoge"するくらいなら スパッとJavaに移行したい
java は変数名や関数名に漢字が使えるのが便利でいいよね。
漢字識別子は IME の切り替えが面倒だし、目が全角と半角でコード部分と コメント/文字リテラル部分を見分けるように慣れてしまっているから、 意外と辛い。定数くらいならなじみのない英単語や妙ちくりんなローマ字を こねくり回さなくて済むので便利だが。
最近は変数名や関数名に漢字使うのが流行なのか?
C/C++に関係あんのか?
ある
プログラミング言語「は」なら漢字の識別子が使えたはず
ara-rieki とか uriage とかよりも 幼女 とか 雌豚 とかの方が断然いい。
そこは 粗利 とか 売上 にしとけよw
174 :
デフォルトの名無しさん :2009/04/22(水) 16:40:55
>>20 のサンプルソースで、入力待ちするのに「scanf("%*c");」だけを書いてるが、これってどういうことなんだ?
これを使ったときって、うまくいくときといかないときがあるんだが…。
char c; scanf("%c%*c",&c);をやると、二回エンターを押さなきゃいけないときと一回でいいときとあるし…。これはどういう要因でなるの?
>>149 一応書いておくと、64ビットアプリではポインタも64ビットになるのが普通。
配列と再帰データ型とはどうちがうのでしょうか?
>>176 配列はしょせん有限の要素数しかない。
再帰データ型はその名の通り、理論上はどこまでも続くように値を構成できる。
178 :
デフォルトの名無しさん :2009/04/22(水) 18:37:55
板違い。 あー、Win板にもIE8スレとかあるけどそっちはどう?
>>178 あー予想通りやっぱりバグってるな
バグフィックスされるまでIE7で様子見だな
やっぱIE8にしなければよかった
恋のインクリメントはまだですか?
int i = 0; while(i) i++; たいへんなコードです! いつまでも放置しているととても危険です!
一瞬で終わるだろw
int i = 1; ですた
1にしてもたいして時間かからずに終了するだろ
for(int i=strlen(str)-1; i>=0; i++)
オーバーフローで負になるから、すぐにとまる
まぁオーバフロー自体未定義動作なんだからあながち間違ってはいない 実際はともかく
ところで、配列の終わりのひとつ後へのインクリメントは有効とK&Rに書いてあるんdeathが 配列のはじめのひとつ前へのデクリメントは有効なのでしょうか? (どちらもポインタの指す値が無意味なのは承知の上ですが…) char s[10]; char *p p = &s[9]; ++p; // 有効 p = &s[0]; --p; // ←コレ
>>191 それはダメよん
C++のSTLもその当たりを考慮してわざわざリバース・イテレータ
というものを提供している
すまん質問させてくれ hogecls &(hogecls::operator=)(const hogecls &obj) { if(this != &obj) { this->hoge = obj.getHogehoge( ); } return *this; } 上のように代入コピーを行ってるんだが gccやborlandではビルド成功して動作するのに VCだけ、const hogehoge &がthisポインタとして動作しないようなエラーが発生する ((hogehoge *)&obj)->getHogehoge( ); だとビルドは成功するが、勿論不正落ち どうしたらいいだろうか・・・
関数のアドレスを取得するのに、 関数名と&関数名のどっちが正しいの? 例えば int my_func(int num){return num;} void func_ptr_arg_test(int(*p)(int)){} これで func_ptr_arg_test(my_func); func_ptr_arg_test(&my_func); どっちが正しいの? g++ではどっちも通るんだけど。。。
>>194 どちらでも正しいです。関数名は関数のアドレスを返すという規約なので。
ちなみに、クラスのメンバ関数も修飾::名前でアドレスを返すはずなんですが
VC++2009では&をつけないとエラーになります。不思議です。
>>194 勿論、func_ptr_arg_test(&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&my_func)でもいい。
198 :
194 :2009/04/22(水) 22:50:24
なる。 あと、呼び出しまで含めて int(*p)(int); p=my_func; p(10); (*p)(10); p=&my_func; p(10); (*p)(10); これはどれでも良いってのはしってる。 でも状況次第で何故かだめなことがある気がするのだが・・・ 今更ながら、全コンパイラが標準仕様を守っているわけではないと言うことか。
C89すら満足できないようなコンパイラ使ってるなら、今すぐマシンごと窓から投げ捨てるべき。
前はあるコンパイラの独自仕様だったのが、便利だからそれがひろまったって聞いたんだけど。
>>192 ありがとうございます。ということは、巻き戻し処理の時は
先頭でぴったりとまるような条件分岐にする必要があるっていうことですよね・・・うーむ。
といっても、参照するのは問題外だからおいとくとして 先頭をこえるデインクリメントは オーバーフローする危険があるからだめ→オーバーフロー後は未定義動作 って話なので、実際のところ一つ前を指しても問題は起こらないけどね
たった一つのダミーエリアを設けるだけで安全なのに?
205 :
デフォルトの名無しさん :2009/04/23(木) 13:56:37
0 と -0 は違うのでしょうか?
同じ
2の補数表現で考えれば0と-0はビットパターンが同じになる
質問です。VC9EEで以下のようなコードを書きました。で、結果としてエラーが出ました。 const定数で配列の要素を初期化できるとふんでいたのですが、クラスの場合不可能なのでしょうか? ちなみにBをグローバルにするとコンパイルは通りました。 -- class A{ static const int B; int C[B]; }; const int A::B=32; int main(){ A a;} -- error C2057: 定数式が必要です。 warning C4200: 非標準の拡張機能が使用されています : 構造体または共用体中にサイズが 0 の配列があります。 --
int C[B]; よりも前にBの値が分かっていないといけない。この場合は class A{ static const int B = 32; int C[B]; }; と書けばよい。VC++2008ならこれでいいが、この書き方を認めないコンパイラもあり、その場合は class A{ enum { B = 32 }; int C[B]; }; とする(enumハックと呼ばれる。) ちなみにBをグローバルにする場合も const int B = 32; class A{ int C[B]; }; ならいいが extern const int B; class A{ int C[B]; }; ではだめだ。int C[B]; のところでBの値が分からないからね。
>>205 IEEE754の話?
ビットパターンとしては符号ビットがセットされているものとされてないものという区別があるけど本質的にはどちらもゼロの意味。
IEEE754が何かは知りませんが 00000000(2) と 10000000(2) の2種類が存在しますよね? ためしに int i = 0; int j = -0; やってメモリも見ましたが 同じ0x00000000 でした この場合10000000(2) は表現できないのでしょうか? これといった使い道は思いあたりませんが 技術的興味からです あえていえば 10000000(2) を右シフトして -0 から値を生成するとかどうでしょうかね?
>>209 レスありがとう。
そんな書き方できるとは思いませんでした。
enumでいけるんですねぇ。汎用性考えてEnumのほう使ってみます。
助かりました。
>>211 2の補数でぐぐれ
8bitの整数だとして
10000000 は -128 だボケ死ね
>>211 その問題は数学者に聞いたほうが良い解がもらえそう。
コンピュータ的には0が2個あるといろいろ不便だと思う。
IEEE754は浮動少数の国際規格だっけ??
Cのintは2の補数だから-0は表現できない つか1の補数を表現するような言語は身近にないかも
>>211 あかんFPUが2の補数モードにセットされてしまっている
union nz {
int i;
char c[4];
};
int main(void)
{
union nz z;
z.c[0] = z.c[1] = z.c[2] = 0;
z.c[3] = 0x80;
printf("%d\n", z.i);
return 0;
}
>>215 いや、Cに2の補数でないといけないなんて縛りはないぞ。
見かけないのは2の補数以外を使うアーキテクチャが絶滅しかけているため。
だって1の補数だったら!0 == -0になって困るじゃん
1の補数でも!0!=-0だろ
>>218 偽になる整数値が+0と-0の二種類になるだけでは?
まぁ ゆっくり精進しよう
222 :
デフォルトの名無しさん :2009/04/23(木) 22:45:35
ところで、一平見てるか?
>>216 こうだろ。ちゃんと -0.000000 と表示するじゃないか
union nz {
double d;
char c[8];
};
int main(void)
{
union nz z;
z.c[0] = z.c[1] = z.c[2] = z.c[3] = z.c[4] = z.c[5] = z.c[6] = 0;
z.c[7] = 0x80;
printf("%f\n", z.d);
return 0;
}
staticなグローバル変数で10KBの領域取って使うのと ヒープで10KBの領域とって使うのって どっちが高速なんでしょうか? ログをまとめて吐くためのバッファにしようとしてます。
>>224 MBとかGB単位でメモリ積んでいるパソコンなら違いはないと断言しよう。
その他の利点・欠点を勘定して決めろ。
了解しますた
227 :
デフォルトの名無しさん :2009/04/24(金) 11:23:55
テキストファイルを一行ずつ読んで それぞれの行で空白やカンマを区切りに分割して色々処理したいときに strtokとか使わないc++ぽい一番簡潔な方法を教えて下さい
229 :
デフォルトの名無しさん :2009/04/24(金) 11:31:02
ちょっとぐらいはぐぐってくれ。 Boostは次世代C++に取り込まれるライブラリを目指して開発されている。 実際にBoostから標準に採用されているものもある。 で、boost::tokenizerが貴方にぴったりでしょう。
231 :
デフォルトの名無しさん :2009/04/24(金) 11:38:45
>>230 どうもです
標準だけじゃ簡単にはいかんということですか
233 :
デフォルトの名無しさん :2009/04/24(金) 11:55:32
>>232 良い記事をありがとう
空白のあとカンマ区切りなんですぐ応用できそうです
一方私はsscanf()を使った切り出し関数を用意している。 C99版は可変長配列を使っているし、C++版はstd::vectorを使っている。
boostとか他人のライブラリ使うのは抵抗があるな boostって便利なのか?
>>235 俺もできるだけ使いたくない。
けど、正規表現のためだけに使ってる。
出来ることならC++標準の範囲内ですませたいよねぇ いつでもboostとか使えるとは限らないし
>>235 boostは抵抗があって、glibc(つーか標準関数)は抵抗ないの?
例えばGUIライブラリは? socketは?
boostに入っていると言うだけで、ある程度は「枯れて」いるんだから
自分で書くよりも余程楽できると思うんだけどね。
>>238 俺はむしろboostの方を信頼するんだけど。
いつでも使えるとは限らないけど、正直 俺自身が書いたコードよりは信用できると思っているwww
>>239 ごめん
× >俺はむしろb…(ry
○ >俺も君と同じ意見で、むしろb…(ry
だな。
int number=10; ここで for( ; number > 0 ; --number ){〜} と等価な処理を簡潔に書こうと思って while(number--){〜} としたら。ループ脱出時のnumberの値が前者が0,後者が-1となり等価にかけなかった。 前者と等価でより簡潔なループ書ける人いたら教えてください。 なお、シングルスレッドで、{〜}の中ではnumberの値は変化しません。
for (; number > 0; --number) printf("%d\n", number); ++number; while (--number) printf("%d\n", number); do printf("%d\n", number); while (--number);
金になる儲けられるC/C++のコードを教えてくれ
printf("hello, world");
ほぉ、まずは挨拶からか。プログラム言語としてではなく、人間の言葉として 重みのあるコードだったぜ、やるね、あんた。
>>238 GUIライブラリ(WinSDKやら)は使わざる終えないから気にせず使ってる
でもGDI+は使わない。何故なら、GDI+で実装できることはWinSDKを用いれば自分で作れるから
C/C++の標準関数も気にしない。C/C++を知ってる人が見れば誰でも分かるだろうから
boostはC++知ってても知らない人は知らないライブラリだから、俺は抵抗があるの
247 :
241 :2009/04/24(金) 13:55:48
>>242 あ、なるほど。
do whileだとnumberがもし0だった時に困ったことになりそうだが、10なら大丈夫だな。
ありがとう
素直にforループでいいじゃん。
249 :
239 :2009/04/24(金) 14:13:17
>>246 なんだかなぁ。WinSDKになくてGDI+にある関数はどうするんだろうとか、
C/C++の標準関数と言っても例えばtzset()みたいな関数が誰でも分かるとは思い難いし、
ましてstd::replace_copy_if()なんて突然出てきたらboost::ptr_vectorより面食らいそうだし、
言い訳がましく聞こえるだけなんだけどねぇ。
251 :
デフォルトの名無しさん :2009/04/24(金) 16:19:42
多くの人が動かして動作が確認できている物は使う
252 :
デフォルトの名無しさん :2009/04/24(金) 16:19:53
boostとか、バグがなくて実績があって安定していてどんなに優秀であろうが、 フリーである以上、自己責任で使うことになるから、バグのイイワケに使えなくなる。 だから、仕事じゃ、俺は、極力、使いたくない。
>>252 シェアウェアなら言い訳になるのかい?
ライセンスを読んでみると言い訳には到底使えなさそうなことが書いてあると思うのだが。
そもそもWindowsとかOS自身が実質無保証じゃね?
254 :
デフォルトの名無しさん :2009/04/24(金) 16:22:09
極力使わないのはいいが、それしか(有名なのは)ないんだったら それを使う方がバグは減るだろう。商用可能なら
どっちにしろバグはでるから言い分けしやすいように余計なものは使わないという考え 標準から外れたことをするとその分不利になるし
ぶっちゃけ、「それはMSの仕様だからしょーがない」は、客も納得するのだよ。 フリーのライブラリだと、「なんで、そんなもの使った?別のもの使えよ! さもなくば、自分で作れ!」って言われることが多いのだよ。
257 :
253 :2009/04/24(金) 16:54:05
>>256 ああ、あれか、一般企業で言うと、
ウイルスバスターを入れていたのに感染したんです。
じゃあしょうがないね
的なノリか。
分かった気がする。
258 :
デフォルトの名無しさん :2009/04/24(金) 16:54:19
それは選ぶやつが駄目。 そいつが一から作った物は、もっと悪くなることが予想できる。
MFCやらSTLやら使ってバグっても、MSのバグですで済むことなんてないな。
そういうわけで、TR1のおかげでBoost入れなくてもshared_ptrや 正規表現が使えるようになったのはかなり嬉しいことだと思わないか?
でもSTLport入れる気なくしたよ
>>259 下っ端プログラマなら、何がどうなろうが、
なんらかの対策をして直すなりなんなりしなくてはならない話だから、
関係ない話だ。
もっと上のレベルでの期間とか金とか信頼・信用とか契約の
話で、だいぶ違うし、かなり重要なところ。
つまり、下っ端なら下っ端ほど、バグがでにくくて安定してて楽に作れる
優秀な有名どころのフリーのものを使いたがるが、
上の立場になればなるほど、そう言うのは使いたくなくなってくる。
まぁ、俺の経験則からみた見解だ
>>261 一理あるね。わざわざシェアの他企業のフレームワークを使ってる会社もある
そのフレームワークにもバグが合った話を聞いた時は噴いたな
プロジェクトによってはboostインストールさせてくれない。 でもインストールしてもいいならじゃんじゃん使う。 GoF本にも書いてあったじゃないか。 経験のある設計者は一から問題を解こうとしない。 ウェブにあるプログラムを再開発しないと書いてあったのは 達人プログラマだったっけ? まぁそんなとこ。先人は偉いなぁ。
バグ入りのソースでも平気でインクルードするのが経験者か?
結局のところ、バグはバグ。 自分が作って自分がテストしたコードも 誰かが作って多くのユーザーがテストをし続けているコードも どっちにもバグは発生する。 「コードをネコが食べちゃった」ですむのならご自由にどうぞ というのが達人プログラマの教え。 僕?僕は君よりもアンドリューハントの言うことを信じるなぁ。 そんだけ。所詮は宗教かな。
達人プログラマー読めれ。
C++で書いてg++で最適化オプション-O2で コンパイルしたプログラムなんだけど、 ソースコードの無駄な改行のあるなしの違いだけで はき出すバイナリが違う物になるんだが、 どうして?
__LINE__
C/C++でライブラリと言ったら、どういう物を指すの? 単体では動作せず、複数のプログラムから再利用できる汎用性が高いものっていう認識なんだが、 そうだとすると例えばマクロだけで書いた物もライブラリという呼び名が適用できる?
>>274 C/C++の標準関数(stdio.h、stdlib.h>もライブラリだよ
>単体では動作せず、複数のプログラムから再利用できる汎用性が高いものっていう認識なんだが
この認識で基本はおk
マクロだけはライブラリとは呼べないと思う
何故ならマクロはビルド時に置換するだけだから
<cassert> って確か中身マクロじゃなかったっけ?
277 :
274 :2009/04/24(金) 23:17:39
文字列クラスがあります operator!=(const hoge_str&, const hoge_str&) こんなコード書く奴をどうやって制裁すべきでしょうか
>>278 何でもかんでもフレンド関数にすんなと言っとけ
operator=(const hoge_str&, const char *) 中身の実装によるだろうけど これやばいよね?シナコードに大量に含まれてるんだが
どうやばいの?
operator=で、最初の引数がconst&ならどう考えてもコピー代入オペレータです本当に(ry だからそもそも意味がわからないし、コンパイラにぶっちされるんでないか?
284 :
デフォルトの名無しさん :2009/04/25(土) 14:35:02
長い文章で2行になっちゃうときには printf("スレを立てるまでもない- -質問\n"); というように、- の記号で繋いでやればいいのではないのでしょうか? 何故か全部エラーになってしまうのですが。 お願いします。
printf("スレを立てるまでもない" "質問¥n"); で良いんじゃね? どこで覚えたのそれ。
>>279 フレンドにする必要もないだろ。
bool operator!=(const hoge_str& lhs, const hoge_str& rhs)
{
return !(lhs == rhs);
}
で、278はBoost.Operators使えって言いたいんでしょ(違
>>284 新しい発想過ぎて驚きだな。-演算子でつなぐなんて、一体全体誰が言ったの?
そんなやつは早々に見切り付けてついて行かない方が良いよ。
288 :
284 :2009/04/25(土) 19:14:56
レスありがとうございます。
なんか自分が勘違いして覚えてしまってたのかもしれません。
>>285 さんの方法で無事できました。
ありがとうございました。
配列double d[2500];があるとして、d[0]から埋めていきd[2499]まで全て埋まって しまったら一番古いのをd[0]に2番目に古いのをd[1]…とずらして一番新しいのを d[2499]に入れるようにどんどんずらしていきたいんですが、どのように書けばいいですか?
for(i=1; i<2500; i++) d[i-1] = d[i]; でできるけど、追加するたびにいちいち詰めるのは無駄だな。
配列を使わずに push_backするときにある値以上のサイズならpop_frontするようなdequeを作る
ローリングさせる方が速い。
リングバッファっぽい?
どのようにと言われても そのようにとしか
ローリングってなんですか?
d for(i=1; i<2500; i++) d[i-1] = d[i]; の書き方がまだいいのね なんども繰り返す処理だからもっと軽い方法があったらそれでいこうと思ってたけど これでずらすことにします
いや、やめろよ・・・
298 :
デフォルトの名無しさん :2009/04/25(土) 21:02:47
リストとかにしろ
299 :
デフォルトの名無しさん :2009/04/25(土) 21:03:42
もしくはmemmoveつかえよ 計64KBまでにしたほうがいいが
ありがとうリストにすることにする STL全然勉強してないんだけどやっぱりSTL覚えておいたほうが良いよね
301 :
デフォルトの名無しさん :2009/04/25(土) 21:11:21
STLはC言語より易しいと思う。 どんどん使うべき。 同様のことをC言語で自作したらそうとうくたびれる。 どうしても速度を追求したい人が、C言語やアセンブラを検討する。
302 :
デフォルトの名無しさん :2009/04/25(土) 21:13:45
>>300 そもそもSTL禁止なC++なんて、ほとんど有用性ないだろ。
304 :
デフォルトの名無しさん :2009/04/25(土) 21:20:33
用途によってはdequeも考慮する。 配列として扱える。 ただし追加と削除が鈍くなる可能性はある。
STLはvectorしか使ってないな。何か抵抗ある
めっちゃ便利だと思うが。 std::stackとかもなかなか。 厳密にはSTLじゃないがstd::stringは使うよな。
boost以外使うな STL遅い
308 :
デフォルトの名無しさん :2009/04/25(土) 22:42:32
そんなことはない。 STLはboostより良い物が多い。 実装次第。
309 :
デフォルトの名無しさん :2009/04/25(土) 22:45:06
STLは規格にあった物を誰でも作れる。 改善できる。 boostは現在、各人が勝手に作っているだけ。規格が定まっていない。
何でおまいらはほっとくと雑談を始めるのか。
2chだからいいじゃん。何が悪いのか?
>>307 何言ってんだちゃんと実測しろ
doubleとか構造体をstd::sortに掛けると
qsort()より早いぞ
バイトコピーである必要がないしな
なんでqsortとくらべてんの?
STLは遅いというから一例を挙げただけさ
ある程度完成したソースの中で、 const付けられるもの(付けられると気付いた物)に機械的にconst付けていったら まぶしいくらいconstだらけになった。 そんなもん?
const 汚染と呼んでいる。
const-correctnessに気をつけてコード書いてりゃ、 至る所constだらけになるのは普通。
じゃあむしろ上達したと考えていいのか。 ありがとう。
今更だけど、bind1stやauto_ptrよりはBoostのbindやscoped_ptr/shared_ptrのほうが便利。TR1もマジお勧め。
>>314 圧倒的に遅いものと比べて、それより速かったからといって、
「遅くない」という結論は導けないと思うのだけど。
>>319 tr1がstd::に入って、大手を振って使えるようになる日がちゃんとくるのだろうか。
本当に今年中に来るんだろうなC++0x
C++にて みんなunionって使う? 使いどころが今ひとつわからない代物なんだが。 classと比べて勝っている点は何?メモリの拙訳以外には役立つの?
>>320 そういう話をしているんじゃない
「STLは遅い」と言うから反例を一例上げただけだ
ネットワークでよく使うような LTD (Length-Type-Data) 形式のバイナリ扱う時は楽。
反例として認めたくないだけだろ
>>325 反例になってるじゃないか
ヴォケかお前は
クソども他でやれ
330 :
322 :2009/04/26(日) 08:27:44
>>324 なるほど、そういった使い方か。
やっぱそこまで多用する物ではないのか。
const char * const p="0123456789"; const char * const first=p+3; const char * const last=p+10; ここで std::string(イテレータ始め、イテレータ終わり) というコンストラクタがあるので、これを利用するつもりで std::string str(first,last); と書いたらstrが"3456789"になった。 これで一見動作は良さそうなのだが、 lastが指す先が配列の次の文字になっていそうでGPFになるんじゃないかと不安だ。 大丈夫かね? 実際には末尾にヌル文字があるから大丈夫なのか?
332 :
デフォルトの名無しさん :2009/04/26(日) 09:22:12
+9にしとけ。最後に0があるから表示とサイズがずれるだろ。
>>332 しかし
const char * const last=p+9;
だと
std::string str(first,last);
と書いた時strが"345678"になってしまう。
俺としてはstr="345679"を得たいのだ。
lastすなわちp+9が指すのは文字'9'のところのアドレスだから、
イテレータとして渡すとその1文字前までがstrの内容になってしまうため。
const char * const last=p+10;
は必須だよね?
334 :
デフォルトの名無しさん :2009/04/26(日) 09:43:16
string s;に対して s.end() = s.begin() + s.size(); だから、 もしsをまるまるコピーするならば、 s.size() 個必要だから +10でいいんだった
336 :
デフォルトの名無しさん :2009/04/26(日) 09:45:29
9だと、9-3=6個しかコピーされないんだった。 全部コピーの場合はstring str(s.begin(), s.end() );だからな。 s.size() = s.end() - s.begin() だ。
if(〜){return 1;} else{return 0;} と if(〜){return 1;} return 0; は動作が等価だと思うのですが、どちらが速く動作しますか?
338 :
デフォルトの名無しさん :2009/04/26(日) 11:18:00
どっちも同じだろ。厳密に測定してないが。 後者を推奨するが。 if(!A) continue; if(!B) continue; ・・・ という書き方は、ifの有効範囲を間違えることが無くなっていい。
339 :
デフォルトの名無しさん :2009/04/26(日) 11:19:12
if(A){ if(B){ ・・・ } } と書くと括弧で混乱する元。
return 〜; でいいんじゃないか?
341 :
337 :2009/04/26(日) 11:27:01
342 :
デフォルトの名無しさん :2009/04/26(日) 11:28:42
ちなみに if(A && B){ ・・・} if(A) if(B){・・・} だと、前者が速いことが多かった。 前者は式の計算量が多くなるけど、分岐予測があったとしても後者の方が駄目ね。
>>342 ショートサーキットがあるから、前者で計算量が多くなるわけがない。
そういうのは逆汗したもので語ろうぜ。
コンパイラが阿呆なら、速度に差が出るということも、まああり得るだろうが
348 :
デフォルトの名無しさん :2009/04/26(日) 13:27:35
実際に計算はしてるんだから、わずかでも計算に時間掛かっている。 たとえば、1と、1&&1&&1&&1だったらこっちが時間掛かる。 分岐予測と、ショートサーキットは同じではない。 実際には、計算してまとめた方が速いよ。
複数の文を最適化するより、単一の式を最適化するほうが簡単だからじゃね。 前者のほうが比較的簡単な最適化でも効率のいいコードを吐きやすいってだけだろ。
VC8でコンパイルしてみると。 ---------- int aaa(int a, int b) { if (a) if (b) return 0; return 1; } xor eax, eax cmp DWORD PTR _b$[esp-4], eax sete al ret 0 ---------- int bbb(int a, int b) { if (a && b) return 0; return 1; } xor eax, eax ret 0
なんで常に 0 を返してるんだ? 関数がインライン最適化されてないか?
あ、ret があるからインライン最適化はされてないか じゃ、なんなんだろう
353 :
350 :2009/04/26(日) 13:50:46
ごめん。呼び出し側の引数を定数でやってたから最適化がかかってた。 引数を変数にしたらaaaもbbbも同じコードになってた。
ということで、全く同じという結論になりましたね。
なんでaaaではその最適化がかからなかったんだろうか 面白い違いだな
ifを分けるとより高度なフロー解析が必要になるってことだろうか
一段ならできて二段になるとできなくなるのか。 なんというか情けない話だな。
なんか俺達がまだ見抜いていない、二段だと適用できなくなるような理由があるんじゃね?
359 :
348 :2009/04/26(日) 14:04:10
まとめた方が常に鈍くなった #include<stdio.h> #include<stdlib.h> #include<time.h> #define N 200000000 int main(){ unsigned int m,n,cl,s; char p[1024],q[1024],r[1024]; for(n=0;n<1024;n++){p[n]=rand()&1; q[n]=rand()&1; r[n]=rand()&1;} s=0;cl=clock(); for(n=0;n<N;n++){m=n&1023; if(p[m])if(q[m])if(r[m])s++; } cl=clock()-cl; printf("clock=%d\nsum=%d\n",cl,s); s=0;cl=clock(); for(n=0;n<N;n++) {m=n&1023; if(p[m]&&q[m]&&r[m])s++; } cl=clock()-cl; printf("clock=%d\nsum=%d\n",cl,s); }
360 :
348 :2009/04/26(日) 14:07:55
何度やっても、ifを分けた方が速いな。 CPUの性能に依存してそうだ。
361 :
348 :2009/04/26(日) 14:09:31
そんなことは無かった。 先にまとめた方を計算するとこちらが速いや。
ええと、ごめん、馬鹿な俺には分からない。 みんな結局どういうのよりどういうのが速いって結論になってるの?
>>362 コードの意味として等価である以上、実行速度はオプティマイズしやすい平易な表現であるかどうかに左右される
364 :
348 :2009/04/26(日) 14:17:01
やっぱ分解したほうがはやいや。 #include<stdio.h> #include<stdlib.h> #include<time.h> #define N 200000000 int main(){ unsigned char p[256],q[256],r[256]; srand(clock()); for(unsigned int n=0;n<256;n++){p[n]=rand()&1; q[n]=rand()&1; r[n]=rand()&1;} { unsigned int s=0,m,cl=clock(); for(unsigned int n=0; n<N; n++) { m=n&255; if(p[m]&&q[m]&&r[m]) s++; } cl=clock()-cl; printf("clock=%d\nsum=%d\n",cl,s); } { unsigned int s=0,m,cl=clock(); for(unsigned int n=0;n<N;n++){ m=n&255; if(p[m])if(q[m])if(r[m])s++; } cl=clock()-cl; printf("clock=%d\nsum=%d\n",cl,s); } }
逆汗しろよ。コンパイラも書かずに、計った結果だけ貼られても何の意味もない。
366 :
デフォルトの名無しさん :2009/04/26(日) 14:23:53
アセンブラの出力方法がわからん。
そもそも計った結果すら書いてないしな 読んでる方からすると、有意な差があるのか誤差の範囲なのかすらわからない
マジレスするとコンパイラの性能の差
369 :
デフォルトの名無しさん :2009/04/26(日) 14:26:10
コピペして自分の環境で確かめて貰おうという趣旨です
>>369 肝心なのはコンパイラがどこまで最適化をしてるかで、
時間を計ることには、ほとんど意味がないんだって。
>>359 VC8ではどっちのループも同じコードを出力して、
実行すると、後に実行したループが実行時間が短かった。
(ループの順番を入れ替えても)
gcc-4.2.4で-O3付けてゲロらせたものではどちらも判定部分でcmp3回使って判定してた
374 :
348 :2009/04/26(日) 16:03:13
そもそも、条件について何の過程もない状態だと、よほど狂ったコンパイラでない限り、 ifを繰り返すのと&&で繋ぐので何の違いも出ないはずだよね。 問題となるのは条件がコンパイル時に評価できる場合に、 どこまで最適化できるかじゃないかな?
C++で無駄にコピーコンストラクタ走ったとか チェックするツールってありますか?
そんなツールたしかに欲しいね。 俺的にはconst付けられるものを判別して const付けられるよって教えてくれるツールも欲しいんだけど、無い?
全部constつけて、エラーが起きたらconst外す。
いつまで前方参照と宣言の煩わしさを引きずるんだろ。クラス内とか前方参照関係ないのに。
includeする時 共通関数のファイルは冒頭 局所関数は使用する直前でいいのでしょうか
読み手としては include は全部ファイルの先頭がいいと思う。 winapi 系はとくに、ほかの include とのしがらみがあったりするので・・・ 前後関係を一望できるようにしておいたほうが、後で困らない。
VC++ 2008 Express を落として見たけど vsnprintf() が unsafe という警告が出るのは何で?
引数リストがアドレス渡しだからじゃないかな?
バッファの最後に'\0'が書き込まれるとは限らないから、という理由だと思う。 strncatなんかはその理由でstrncat_sが用意されている。
どうも。 何か strncpy() なんかも同じような警告が出るみたい。オーバーランの検知できる _s 付き使えって意味かな。 わざわざ長さ指定の n 付き関数使ってんのに。
_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMESとか使えばいいと思うよ。 いっそC++へダイブ(ry
CとC++の機能的な違いは検索したらうっすらわかったような気がするんですけど、これって両方現場で使われてるのでしょうか? 使われてるとしたらどういう使い分けされてるのでしょうか? 今からCかC++はじめようと思ってるんですがどっちに手を付ければいいかわからないです
>>389 Cの方がずっと使われている
C++は理解するのが面倒だとかリストが読みにくいとか
適当な理由を付けてなかなか使われない
本当は大規模開発になればなるほどオブジェクト指向
が生きてくるんだがな
>>389 基本C++で、Cが選ばれる理由としては
・Cコンパイラしかないから
・現場リーダがC++を信用してないから
・もともとCで書かれたものの改修だから
・C++の機能を使いたくないから(他言語とのインタフェースなどで)
ってところだな。
C++やってれば、CはC++の機能限定版と思えるよ。
俺の場合、C から C++ へ行こうとして挫折した。よく分からない部分は C に逃げれちゃうから なかなか C++ の OO を生かした書き方が習得できないんだよな。んで次に Java 行って逃げ道の ない OO たたき込まれて帰ってきたら C++ が使えるようになっていた。
393 :
デフォルトの名無しさん :2009/04/27(月) 02:51:36
CからC++の関数を呼ぶプログラムで、C言語のソースをgccでコンパイルし、 C++言語のソースをg++でコンパイルします。その後で各オブジェクトファイルを リンケージするために、gccで行うとundefined referenceとエラーが出るのは 何故でしょうか?
単純に名前解決ができないからみたいですね。失礼しました。
>>393 gcc は標準Cライブラリをリンクする。
g++ は標準C++ライブラリをリンクする。
C++のプログラムがC++のライブラリを少しでも使っていたら
(newを使った時点でアウト) gcc ではリンク通らなくなる。
エラー原因となるシンボル名を/usr/lib等のファイルをnmしてgrepするスクリプトを作ると便利
>>392 > んで次に Java 行って逃げ道の
> ない OO たたき込まれて帰ってきたら C++ が使えるようになっていた。
そんな人もいるのか。
Javaは言語が尻拭いしてくれるからそれになれていると
C++でミスに気付かなそうだが。
油断しているとすぐ未定義の動作になっちゃうし。
それは C やらないで Java から C++ に来た人でしょ。 C の言語機構に C++ がどう乗っかってるかだけ押さえてれば C++ を安全に扱うのは難しくはない。 でもそれはどう OO を生かして綺麗な設計ができるかとは別の話。
>>399 > それは C やらないで Java から C++ に来た人でしょ。
ああ、確かにC言語やってあるって言ってるな。
君の言う通りだった。
> でもそれはどう OO を生かして綺麗な設計ができるかとは別の話。
C++の綺麗なクラス設計ってあこがれるわー。
俺がクラス設計やるとやっつけになりやすいんだよねぇ。
申し訳程度にpimplとか使ってみるだけで。
friend指定はOO的にあまりよろしくないと言うことですが有効な使い所はあるのでしょうか? 自分はFactory系のクラス以外に初期化関数を触らせたくない時くらいしか使わないのですが・・・
ある機能を全部使おうと考えずに、シンプルイズベストだと思ってるよ。 俺は、friendなんか使わん。
ある機能を実現するためにいくつかのクラスが裏で協調動作しなければならないような場合。 Factory なんかはまさにそんな感じ。 friend じゃなくて rape ってキーワードにすれば良かったのに。
friendっていう割りには一方的なんだよな もうすこしキーワードを練って欲しかった
Java のパッケージプライベートみたいに同じ名前空間に属しているスコープでのみ 参照可能ってのが良かった。
Dのプライベートインポートが欲しいです。
friendってえらい嫌われようだけど、publicでstaticなメンバ関数と機能的にはかわらんよね。 呼ぶとき、クラス名の修飾が必要かどうかくらいしか違わない。
staticにするとthis参照できないけど、friendならメンバにアクセスできる。だったと思う。
409 :
408 :2009/04/27(月) 20:35:23
ってなんか変なこと言ってる気がしてきた。。。
インスタンスを渡せばメンバにアクセスできるし、渡さなければアクセスできない。 ってことでしょ? friendもstaticも。
411 :
408 :2009/04/27(月) 21:19:16
以下のようなコードをVC9EEに通したら通った。staticでもメンバにアクセスできるのは知らなかった。 #include <stdio.h> class A{ public: static void B(A& in){ in.D(); } friend void C(A& in); protected: void D(){ puts("you Access to D!"); } }; void C(A& in){ in.D(); } int main(){ A a; a.B(a); C(a); }
publicならできんじゃない
あぁ、いや。 protectedのD()にアクセスできてるってことね。
アクセス制限はクラス単位であってインスタンス単位じゃないからね。 staticだろうと何だろうと、クラスのメンバであれば、そのクラスのprivateなメンバに自由にアクセスできる。
C++で性能あげるために役立つ本ってありますか? 洋書でも論文でもオーケーです
コピーコンストラクって何回も走ると遅くなるのですか?
>>414 >>416 そうなんか、初めて知った。
でもやっぱstaticメンバ関数は普通のメンバ関数とは違って
privateやprotectedなメンバ変数にはアクセスできないよね。
>>417 いかなる関数も何回も走ったら遅くなるに決まっている。
走らせると処理が速くなる関数なんて存在し得ないだろ。
あと、コピーコンストラクタが何度も走る設計は普通見直しの余地あり。
なんでデストラクタはいちいち virtual にするのかのぉ?
>>419 自分はそう思うのですが
ここでコピーコンストラクタ3回走りますよっていっても
いや代入だからとか意味不明なこと言われて修正案却下される
バカでも明示的遅くなるのがわかる方法ってないですかね?
>>421 究極の亜ふぉだな。
優秀な君たちが一斉に退社すれば
バカでも分かるんじゃないかな。
そういう末期な上司は治らないから。末期がんと同じで対症療法的に緩和していくしかない。
それは数値で出さないお前が悪い。
>>421 コピーコンストラクタの中にTimer呼んで10秒ほど固まるコードでも
入れてやれよ
>>425 いいねそれ。
出来るだけばれないようにこっそり継承で呼び出して・・・。
>>426 コンストラクタは virtual にしなくていいのですか?
>>428 オブジェクト作成のときにどのクラスなのかは自明だからな。
多重継承の動きを覚えるのが嫌になりました
>>429 コンストラクタは virtual にしないで、
デストラクタは virtual にする。
その理由は継承対策だということですが、
デストラクタがどのクラスに対して呼ばれるのかが自明でない場合ってどういうときでしょうか?
>>431 お前基礎からやりなおせ
継承使ったこともないのに適当に質問するな
>>431 C++の禁忌に触れると闇の世界に引きずり込まれるぞ・・・
参照を返す関数は、 return *this; と書けばいいの?
>>431 試しにデストラクタにvirutalを付けての継承と、virutalを付けずに継承した時の
デストラクタの呼ばれ具合を見るといいよ
>>434 そうだよ
×virutal ○virtual ね。寝ぼけてるな…
#define new new(__FILE__,__LINE__) のようにnew/deleteを置き換えてメモリ状況を見たりしてるんだが std::vectorを使うと0x00000000をdeleteするんだが、これは仕様? vectorに何も入れず、宣言するだけで上のようになる
仕様というか実装の都合だろう 0x0をdeleteするのは有効で問題ない、これは仕様
>>438 サンクス!
今までnew/deleteで出力したログの改行数でリークしてるか判断してたが
大量に0x0がdeleteされるから、面倒になってしまった
>>431 まてまて、ポリモーフィズムって知ってる?
そもそも基底クラスって知ってる?ポインタって知ってる?暗黙の型変換とか動的な型とか知ってる?
こんなに著しく知識が欠落してる人間が開発メンバーに入ってくると、最悪だな。 他人に迷惑を掛けるなら、メンバーから外してもらう。
ポリモーフィズムとは いつの間にか別の男のティンコが 嫁にマウントされてるって事です。
443 :
431 :2009/04/30(木) 00:39:45
ありゃ、ここって初心者スレじゃなかったの?
>>435 class A {
public:
~A() {cout << "A destroyed" << endl;};
};
class B : A {
public:
~B() {cout << "B destroyed" << endl;}
};
int main(){
A a;
B b;
}
というコードを走らせると、
B destroyed
A destroyed
A destroyed
という結果が返ってきてちゃんと動いているように見えます。
virtual をつけようがつけまいが変わりません。おっしゃりたいのはどういうことでしょうか?
初心者だからって嘘教えるんじゃねーよw 正しく動いてるだろボケ
>>440 Yes
Yes、Yes、Yes、No です。
C++ って動的な型使えるのですか?
>>443 class B : public A {にして、
int main(){
A *b = new B();
delete b;
}
こういうときに問題になる
447 :
431 :2009/04/30(木) 01:55:58
>>446 なるほど、理解できました。ありがとうございます。
C++ のような静的型付き言語で多相性を利用するとき、
派生クラスを基底クラスのポインタで指さなきゃいけないわけだが、
delete するときにはポインタは自分を基底クラスだとおもっているので、
基底クラスのデストラクタしか呼ばれない。
だから本来は、以下のようにタイプキャストでもしてやればいいんじゃないの?
int main() {
A* b = new B;
delete (B*)b;
}
でもこれって面倒だから、むしろデストラクタを virtual にしろという
あまり本質とも思えない慣習を広めた、というわけかな。
>>447 いやいやいや。
そもそもA*型のポインタは、基本的にどの型のインスタンスを指してるか分からないわけ。
Aのインスタンスを指してるかもしれないし、Bのインスタンスを指してるかもしれない。
でもそれはどうでもよくて、「Aかその(publicな)派生クラスのインスタンスを指してるんだろう」
ということだけで問題なくプログラミングできるわけさ。
>>447 みたいにできるならば、そもそもポリモーフィズムということの意味が全く無い。
いつでも(B*)にキャストして使えるなら、最初からB*型にすればいいじゃないか。
>>449 > 最初からB*型にすればいいじゃないか。
確かにそうですね。丁寧にありがとうございました。
以下ざれごと。
これってC風ポインタを引きずっている弊害でこうなってしまったというか、
ポインタは確かに早くて概念もわかりやすいかもしれないが、
オブジェクトを指すには向いていないと思う。
オブジェクトって「自分がなにであるかを知っているデータ構造」なわけど、
ポインタで指すとわからなくなっちゃうわけで。
Java みたいなやりかたはスマートだと思うな。
ポインタなんてのは見た目だけの問題だから、慣れれば気にならないと思うよ
void* 使いまくりの C++ とか萎える。
453 :
440 :2009/04/30(木) 06:44:31
>>450 俺の言っていたポリモーフィズムはまさに基底クラスのポインタで派生クラスをまとめて操作できるという話。
もう知ったんだろうからいいけど。
>>450 > オブジェクトって「自分がなにであるかを知っているデータ構造」なわけど、
→→そんなことあるか?
> ポインタで指すとわからなくなっちゃうわけで。
> Java みたいなやりかたはスマートだと思うな。
→→Javaの発想はいいけど、所詮Javaのスピードしか出ない。
polymorphicな使い方しない場合だってあるわけで、
C++の根底にあるスピード重視思想を考慮すれば
別に不思議な仕様じゃないと思うよ。
マクロで {…} で囲めば良さそうな物を do{…}while(0); でやってるのって何で?
void *があればいいだろ
画面のエフェクトを追加したり削除したりしたいのですが decoratorで随時エフェクトの登録や削除を行うにはどういう実装をしたらよいでしょうか?
>>456 それのどこがc/c++の質問なのかkwsk
>>455 質問なら質問らしく、聞きたいポイントを絞ってくれ。
回答のつもりなら、多態性について少しは勉強してからにしてくれ。
>>454 そのマクロを例えばif (...) macro(0); else macro(1);という文脈で使いたいから。但し、最後のセミコロンは不要。
>>453 > 俺の言っていたポリモーフィズムはまさに基底クラスのポインタで派生クラスをまとめて操作
一般にオブジェクト指向の文脈では多相性はポインタとは直接関係ないですからね。
実は C++独自の解釈ですね。
> →→そんなことあるか?
はい。
> スピード重視思想を考慮すれば別に不思議な仕様じゃないと思うよ。
C++ってスピード重視なの?スピード重視ならCで書いちゃいますが。
C++ の仕様の統一感のなさは Stroustrap のセンスの問題だと思いますよ。
それが当たり前になってる人はクラスベースオブジェクト指向以外の他の言語を調べると
いろいろ発見があるかもしれません。
汎用でパソコンが扱えるメモリの最小単位は8bitですか? 1や4は無理ですか? 物理的なアクセスの事です。
460 :
デフォルトの名無しさん :2009/04/30(木) 09:42:48
>>454 確実に有効範囲を括弧内にしたいからでは。 単に{・・・}では心配になるからでは。
ループなら経験上安心できるのでは
>>459 >汎用でパソコンが扱えるメモリの最小単位は8bitですか? 1や4は無理ですか?
8の時点で既に無理です。
charは8bitです。 ここ数年の一般的な家庭用のパソコンについて知りたいのですが8bitごとの物理的なアクセスは出来ませんか? 内部では32bit、64bitを分割してアクセスしてるんですか?
>C++ってスピード重視なの?スピード重視ならCで書いちゃいますが。 その通り。C++はextern "C"でC風に出来る事も失敗の基ってプロジェクトのリーダも行ってたな クラス内部の関数は__thiscallっていう呼出規約で呼ぶから、スピード感はCに劣る thisの分よけいにpushしてcallするからね
>>458 えっと、450と同じ人?とりあえず手軽に突っ込める範囲で書いておくけど。
「ポインタ」であることはそもそも本質的な問題ではない。ポインタだろうが参照だろうが同じ話でしょ。
例えばJavaならJavaで、
>>449 の「A*のポインタ」とか「B*」とかを全部Javaにおけるオブジェクト変数に
置き換えたところで、本質的な話は変わらない。
ただ、Javaではdeleteをしないしvirtual指定もしないから、元々の「デストラクタをvirtualに」って話とは
直接関わってこないだけのこと。
あと、スピード重視って言い方は語弊があるかもしれんが(まあそれは俺が書いたんじゃないが)
C++には「ゼロ・オーバーヘッド」という原則があることを知っておくといい。
これは、「新たに付け加えられた機能によって、その機能を使わない人が余計な悪影響を受けない」
ということ。C++における仮想関数の実装にはオーバーヘッドがあるが、仮想関数のメカニズムを全く使う
つもりのない人は、そのオーバーヘッドを全く気にせず使える。
そのためには、「デストラクタは常にvirtualになる」みたいな仕様にする訳にはいかなかった。
だから、使用者が必要に応じてデストラクタにvirtualをつけないといけないことになってるんだ。
秘技、ファストコール!!でリンカエラーの嵐
今時炊飯ジャーのマイコン用でもなければスタックの push pop なんてどうでも良いけどな。
>>463 物理的なアクセスってどういうレベルで言ってんの?
一般的な家庭用パソコン = x86なので
メモリバス上で8bit幅のアクセスなんてものは不可能だが
レジスタ上では8bitだけ使うということは可能。
お米をpush、お水をpush、ご飯をpop。
ゼロオーバーヘッドの観点から考えれば継承とオーバーロードによる動的多態を使ったOOPより テンプレートによる静的多態を使ったジェネリックプログラミングの方がC++的ということになるのかねぇ
>>470 俺もそう思うよ。
OOPLとしては消極的すぎ。
>>468 メモリを読みに行くときの最小単位は32bitってことですか?
ランダムアクセスのときは、レジスタにロードして8bitに区切るから32bitアクセスより鈍くなりますか?
>>458 君はただしいよ
ただそういうC++の暗黒面を何も思わないC++脳も多いので
2chは話し半分に聞くといい
>>472 今時のx86CPUだと特定の1バイト書き出すためには先ず、
その周辺のメモリ空間を64バイト(または128バイト)読み込んで、
該当の1バイトを書き換えてから、メモリ空間に書き込む。
従って、本当にランダムなメモリアクセスを行なうと、毎回
キャッシュミスしてDRAMからデータを取ってくるために大変遅くなってしまう。
しかし、ある程度予測できるアクセスパターンならキャッシュ管理の妙で
巧いこと先読みを行なえるので、連続アクセスと大きくは変わらない。
質問の目的がよく判らないから何とも言えないが、もし仮にCのデータ型の話をしたいのなら、
charの配列を使おうがintの配列を使おうが、アクセスパターンが同じなら速度的には大差ないということになる。
そうですか。ありがとうございます。
スペアナが作りたいんですがフーリエ変換だと 入力よりちょっと遅れてしまいますよね? どうしたらいいでしょうか?
477 :
456 :2009/04/30(木) 12:22:50
間違って投稿してしまったようなので然るべき所で聞いてきます スレ汚し失礼しました
478 :
453 :2009/04/30(木) 19:07:01
>>458 C++はともかく他の言語に関しては釈迦に説法的な状況だったのか。すまんね。
助言に従い多言語ももうちょっと前向きに学んでみるわ。
>クラスベースオブジェクト指向以外の他の言語を調べると
>いろいろ発見があるかもしれません。
例えば俺は何をやると良いと思う?
C/C++以外でお願いしたい。
>>464 void f(hoge_t*, int);なCの関数と、hogeクラスのvoid f(int);というメンバ関数を呼ぶのでは同コストだろうよ。
thisが要らないなら、静的にすればいいし。
クラス関数の静的って__cdeclで呼ばれるんだっけ?
>>480 cdeclの前についてるアンダースコアは何のためのものだと思う?
( ゚д゚)゚д゚)゚д゚) ジェットストリームポカーン
OpenSSLでBN_bin2bn関数を使うとアクセス違反が起こるのは何なの?死ぬの?
485 :
458 :2009/04/30(木) 23:43:22
>>465 ゼロオーバーヘッドの原則ですか。参考になりました。ありがとうございます。
自由さを標榜しながら必要に応じて virual を「つけないといけない」という矛盾点に、
後方互換性と機能追加の狭間で苦悩する C++ の一端がうかがえました。
0x にすこし期待。
>>478 なんかスレちな気もするので、手短に回答。
ほんとは Smalltalk とか CLOS …といいたいところだけど、
今からやっても全く益にはならないと思いますんで、以下をあげておきます。
Javascript
=> 世間ではPHPなどと一緒くたにされ単なるWeb向けの簡易スクリプト言語と思われているが、
実は意外に奥が深く、クラスベースOOの呪縛から逃れるにはよい教材。
Python
=> 動的OO が如何に自由であるかを学べる上に、普段の作業のお供にも。
あと CLisp か Scheme あたりをちょっとまじめにやってクロージャーを理解すれば、
オブジェクトを裏側から見ることができるでしょう。
486 :
284 :2009/05/01(金) 01:15:15
オマエラてさ、朝から寝る直前までパソコンなの?
ん、よくわかったな。
オマエってさ、朝から寝る直前まで外出なの?
朝から寝る直前まで中出ししたいです。
490 :
478 :2009/05/01(金) 05:57:14
491 :
デフォルトの名無しさん :2009/05/01(金) 21:58:11
どのC言語の本を読んでもヌルは0だ。だから偽になるんだって書いてあるんだけどさ、 ヌルはヌルだろ?0じゃないじゃん。 どゆことなん?
nilだよ
・リンクリストがあります。 ・リンクリスト内の 1 要素を指しているポインタがあります。 この場合、ポインタの指している要素がリンクリスト内の何番目かを取得するために 先頭の要素から == で比較して決定するのはポインタ演算的に大丈夫なんでしょうか?
494 :
デフォルトの名無しさん :2009/05/01(金) 22:44:07
#include <iostream> using namespace std; main(){ int i = 1; while (i < 50) { cout << i << "\n"; if (i % 3 == 0) { cout << "アホ\n"; } i++; } } これがコンパイル出来ないのですが、原因は何でしょうか。 ちなみにコンパイルにはBorland C++ Compiler 5.5をダウンロードして、 win備え付けのコマンドプロンプトを使っています。
496 :
デフォルトの名無しさん :2009/05/01(金) 22:51:07
>>495 mainの前にintを付けるということですか?
やってみたけど、できません。
ちなみに大学の授業で2・3回習っただけの初心者ですorz
int main() {で初めて、 最後の}の前に一行、return 0;も付けれ。
>>497 return 0; はいらない
C++ではreturn 0; を省略すると書いてあるものとみなされる
なんとおおお? マジか!w
C99とC++98では、main関数に限り、そのmain関数の戻り値の型がintであればreturn 0;があったと見なされる (X3010 9頁 5.1.2.2.3、X3014 35頁 3.6.1 5節参照) らしいね。
501 :
デフォルトの名無しさん :2009/05/01(金) 23:15:34
これってコンパイラの問題ですか? プログラム自体は間違っている感じじゃないんだけど・・・。
エラーメッセージ貼れ
>>501 そうかも。
ウチの環境ではコンパイルできたわ。
g++ (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
>>494 同じくbcc6.1.0でコンパイル&実行できました
パスが通ってないとかじゃねーの?
506 :
デフォルトの名無しさん :2009/05/01(金) 23:24:56
このコンパイラは右クリック使えないw はずれ引いてしまったのか・・。 503のコンパイルにしたほうがいいですよね?
っていうかエラーメッセージ貼れよ。
VC9EEにしろよ bcc5.5なんて時代の遺物は使うな
コンパイラ右クリック?ww
釣りくさいな
コンソールのコピペのしかた知らないんだろ。
512 :
デフォルトの名無しさん :2009/05/01(金) 23:31:16
いや、釣りじゃないです。 コマンドプロンプトは左クリックでカーソル移動しないし、 右クリック押しても何も起こらない・・ 初心者にオススメのコンパイラって何ですか?
>>512 コマンドプロンプトの左上にアイコンがついてるよな?
そいつをクリックして、編集→範囲指定→(゚Д゚)ウマー
プログラムはあきらめろ
515 :
デフォルトの名無しさん :2009/05/01(金) 23:34:14
C:\borland\WORK>bcc32 book001.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland book001.c: 致命的エラー F1003 c:\Borland\Bcc55\include\stdcomp.h 5: error 指令: Must use C+ + for STDCOMP.H *** 1 errors in Compile *** お!ありがとうございます。
F1003 このメッセージは,#error 指令がソースファイルで処理されるときに表示されます。 'message' は,#error 指令の文字列です。
>>515 そーいうときは、「致命的エラー F1003 」でぐぐる!
ぐぐる
↓
Q. Borland C++ 5.5 でコンパイルしましたが、以下のエラーが出てコンパイル出来ません。
致命的エラー F1003 C:\BORLAND\BCC55\include\stdcomp.h 5: error 指令: Must use C++ for STDCOMP.H
*** 1 errors in Compile ***
A. おそらく、ソースファイルの中に C++ のプログラムでしか使用できない記述があるものと思われます。
ソースファイルの拡張子を .cpp にして保存してから、コンパイルしてください。
コンパイラはソースの拡張子をたよりに、それが C なのか C++ なのかを判別しています。
↓
(゚Д゚)ウマー
518 :
デフォルトの名無しさん :2009/05/01(金) 23:50:19
>>517 本当にありがとうございました!!
これでプログラミングを家でも出来るようになりました。
皆さまお世話になりました。
519 :
デフォルトの名無しさん :2009/05/02(土) 00:43:26
で、お前らは一体どんなプログラムつくってるの?
VisualStudioから使えばすごい使いやすい言語なのに なんでlinusとかからネガキャンされんだろ
>>520 linusは自己顕示欲が強すぎんだよ
「俺がGPLでタダで使いやすい環境を揃えてやってるのに
なんで皆金はらって商業ベースのOSばかり使いたがるんだ」
だいたい GPL 自体が汚染拡大モデルの宗教
どれ使おうが、大体やれることは同じなので 後はなれでしょ
VisualStudio 使いにくい。。。Emacs のほうが100倍便利だよ
makefile作るのがめんどいじゃん。エディタはviが最強だけど。
面倒だからmakefile作るんだが・・・
linusはメンヘルだよまじで基地外だよ 1時間ぐらい話せば解る
コンパイルオプションやらイミフな呪文てんこ盛りな makefile のメンテナンスはかなり悲惨。 設定事の管理はゴリゴリ書かないで IDE に任せておくもの道理だけどな。
linux(笑)はちょっといかれちゃってるからねぇ
>>528 IDE のプロパティだの何だのをあちこちいじってメンテするのとあまり変わらん気が。
よっぽど小さい規模じゃなきゃ、さすがに手で Makefile 書く機会も減ってきているしな。
531 :
デフォルトの名無しさん :2009/05/02(土) 11:50:38
C言語でゲームで会話シーン作ったらずっと printfと(と"と"と)と;との応酬で、時によっては\nを入れるっていうパターンになっちゃうんでしょうか? printfをコピペするだけでも疲れてきたんですけど。 括弧閉じもしないといけないし。
会話データを保存したファイルを作って、そっから読み込む。
>>531 Cでゲーム用のスクリプトのインタプリタを書いて、
そのスクリプトでセリフやら書くのが普通。
俺が作るなら面倒だから適当にdefineして書く量を減らすか 関数作ってそっちに文字列を渡すと文字数に応じて勝手に改行してくれるようにする
535 :
デフォルトの名無しさん :2009/05/02(土) 12:50:12
>>531 ですが、なるほど勉強になりました。
ファイル読み込んでputcharとかで表示させればいいんですかね。
多分上手く行かないだろうけど作ってみます。
536 :
デフォルトの名無しさん :2009/05/02(土) 12:51:41
でも皆頭いいね。自分が知らなさ過ぎるって言うのもあるんだろうけど。
>>535 printf でやったほうが君には可能
>>535 吉里吉里とかすでにADVツール無料であるけど
車輪の再開発する気なの?
趣味でやってるなら再発明でもいい。
cygwin の g++ でコンパイルした実行ファイルのサイズが 単に iostream を include しただけで main で何もしない内容でも 400k を超えてたんですが、 もっと小さくするにはどうしたらいいでしょう?
gccプログラミング工房
>>540 DLL(so)にすると30〜40Kほどに縮む
リンク先のライブラリがたまに stderr にメッセージを吐くんですけど、あいにく コンソールを持たないプログラムなんでこっちが用意したメモリ上のバッファか 何かに出力させたいんです (リダイレクトやファイルは使えません)。 何かうまい方法はないですかね?
>>544 プログラムの最初のほうで、
stderr = fopen("log.txt", "w");
freopen("log.txt","w",stderr); じゃね?
やっぱりファイル使わないとダメですかね?
子プロセスのstderrをとる方法もあるから、stderrを取りたいプログラムを 起動してそのstderrをとるコードを書くとか。 面倒だな。
>>544 パイプのバッファが溢れない程度のメッセージなら、
パイプに溜めておく、という手もある
int fd[2];
pipe(fd);
dup2(fd[1], 2);
ライブラリ呼ぶ
fds[0]を読む
バッファで足りなくなったらどうするつもりなんだ?
s/fds[0]を読む/fd[0]を読む/
>>550 だから大丈夫な場合ってことわってる
何Kbyteも出すわけじゃないだろう
クラス内関数を別スレッドとして動かしたいんですが m_hThread = (HANDLE)_beginthread(&hoge::hogeloop,0,NULL); //スレッド1作成 1 番目の引数を 'void (__thiscall hoge::* )(LPVOID)' から 'void (__cdecl *)(void *)' に変換できません。 って言われるんですが、何かヒントでいいので教えてもらえないでしょうか
>>554 メンバ関数ポインタがまったく理解できてない
メンバ関数ポインタでぐぐって出てくるページでも読んどけ
>>554 クラス内で別スレッドを持たせる場合、間に静的のクラス関数を噛ませないと駄目
その静的クラス関数にthisポインタを渡せば、beginthreadで渡されるから
×その静的クラス関数にthisポインタを渡せば、beginthreadで渡されるから ○beginthreadに静的クラス関数を指定して、その際thisポインタを渡せばおk
なるほど、最初?って思いましたがやってみながら考えたら納得できました。 ありがとうございました
ビット演算で ある変数の第iビットだけ反転することはできますか?
できます
((x & ~(1 << i)) | (~x & (1 << i)))
#include <stdio.h> int main() { int i = 0x8B; int j = 6, k, l, m; k = (i>>j)&1, k = !k, k = k << j; l = 1<<j; m = i & ~l, m = m | k; printf("%08X %08X %08X %08X\n", i, k, l, m); }
559です では ある変数のiビット目をある変数のiビット目に代入する方法はありますか?
あんまり甘やかすのもどうかと思うね
そう思うので、ヒントだけ。
>>563 ビットフィールドつかえ。
ありますか? と問われているんだから あります と答えればいいんでない?
y |= (x & (1 << i));
それじゃ代入にゃならん
あそっか。 y = (y & ~(1 << i)) | (x & (1 << i))
おかしくねぇか
いやあってるか。すまん
巨大な2次元行列の積に関してなんですが、BLASなどの専用ライブラリを使ったほうが for文を使って計算させるよりも早いんですか? どうしてですか?
そのライブラリはぜんぜんしらんけど、ふつーは専用ライブラリがはやいな。 アセンブラとか使ってカリカリにチューンしてあるとか、アルゴリズムがすごいとか。
577 :
575 :2009/05/03(日) 23:17:37
ああ、uBALSじゃなくてBALSか。 BALSはFortranで書かれているから単にその速さの違いなんじゃね? あと、天才がアルゴリズム組んでるとか。
575よ、BLASな キャッシュとか考えてメモリアクセスを最適化してるからだと思うが
579 :
575 :2009/05/03(日) 23:39:15
これ以上はBALSがFortranで書かれているならFortranスレ行ってもらおう。
バルス
目がぁ〜
40秒でデバグしな
むりです・・・
Xさんが著作権を持つ修正BSDライセンスのライブラリXを使ってプログラムYを作ると、 著作権表示、ライセンス条文、無保証 を表示しなければなりませんよね。 後ろ二者はいいとして、著作権表示をすると Yに関する著作権は全てXの物になるのですか? それともYの中のXを使っている部分に関してのみXの物になるのですか?
それのどこがC/C++の質問なんだ
unix板とかlinux板あたりにライセンスの詳しい人がいそう。
他人の著作仏の著作権を奪い取れるようなソフトウェアライセンスなんて聞いたことねぇよ。
著作の仏
591 :
585 :2009/05/04(月) 12:15:25
> 著作の仏 尊んでいるのか、けなしているのか・・・
すいません 本を購入しさっそくコンパイラでもダウソしてみようかと思ったのですが、 みなさんもBorland C++ Compiler 5.5を使っておられるのですか? また、みなさんいちいちユーザー登録をしているのですか?
「みなさんも使っておられますか?」みたいなアンケートを始めると収拾がつかなくなるかもしれんが とりあえず俺は使ってない。
つかってない してる
普通はVC++を使います
そうですか、いやいちいち登録とかめんどくせぇなって思っただけなんですけどね ありがとうございます
>>593 初心者ならbccでもVCでもgccでも同じだと思う。
bcc5.5.1はC++のちょっと高度なテンプレート周りが
とんでもなく標準準拠性悪いけど、別に最初は関係ない。
初心者のうちはエラーメッセージが日本語な
bccやVCがいいかもね。
初心者向けのコンパイラ(リンカ含む)で有用なのは Windowsで、 bcc, vc, gcc以外になんかある?
bcc使ってるって初心者多いな。 どっかのサイトとかでお勧めでもしてるのかね。
>>601 俺も最初はbccから入った。でも何でbccを選んだのか分からない。
今はgccとvcしか使っていないが。
bccは使っちゃいかんだろ
大学のプログラミングの講義の例題がbccだとコンパイルできないので がんばってgcc(MinGW)を入れた。
605 :
598 :2009/05/04(月) 15:36:13
だめじゃんbcc って思えるようなレベルに到達するまでは好きにすればいいと思う。 まあgccだってwchar_tらへんは弱いし。
bccで画像をリソースにして実行ファイルに埋め込もうとしたらあるサイズを超えた段階でリソースコンパイラが意味不明のエラーを吐くということを経験してから一度も使ってない
初心者にとっては、最近のIDEとコンソールはどっちが敷居がたかいんだろうね。 DOSの時代のTurboCとか、適当にソースを打ち込んでF5で実行できたから、 すごい簡単だったけど。
>>601 VisialStudioより前に無料配布を始めてるはず。
だから古くからあるサイトとか、そういうサイトで学習したところでは、
bcc使った開発方法を載せてるところがある。
今でも初心者質問のスレではLSI C-86試食版の人みかけるよねw
>>604 某大学でプログラミング実習のTAやってますが、担当の先生が推奨する
コンパイラがあればそれを使うのが吉かと。うちの先生はfor文を
for (int i = 0; i < n; i++)
みたいに書くので、家で宿題をやろうとしてC99未対応のコンパイラを
使って悩む学生さんが毎年出ます。
>>609 LSI-C試食版はそろそろ絶滅してほしいですね。今年出たトラ技別冊の
C入門書(大学生協に山積みされてた)がこれを使っているせいか、今年も
これを素直にインストールした人がいるようです。
http://www.cqpub.co.jp/trs/index.htm
Fラン大学程度だと VC環境は悪だとか言ってる人もいますよ
>>611 嘘言え。Fラン大学生がVC環境とかそんな高度な日本語発言できるわけがないだろ。
F「ぱそこん?ぷれすてじゃね〜の?」
だろw
>>610 先生にそれ止めれって言うなりよ
コンパイラは学校が教材として生徒に提供するなりよ
いまはゆとり教職多いんだな。
ゆとり教職がゆとり学生を教えるゆとり時代になったんだな。
ゆとりって言いたいだけなんちゃうんかと
>>613 甘やかしすぎ。それくらい学生自身で解決させろよ。
講義中、習ってない数学の定理を使われるようなのは日常茶飯事だったぞ。
ゆとりゆとり言うやつは真のゆとりを知らないただのゆとり
>>615 今そんなことすると、親御さんから大学事務局へ苦情
さらに教授会で締め上げられるよw
>>611 お前がFランだと自己紹介しなくて良いから
すみません。便乗で質問です。 VC++無料版のコンパイラは性能どうなんですか? 昔、インストールした時、 性能に制限があるとかないとかよくわかりませんでした。
コンパイラの性能を気にするのはまだ早いと思うよ。
>>620 VC2008EEでも最適化のO2ができる。
WinApiも標準で持ってるしC++/CLIもできる。
趣味用途なら決定版だと思うぞ。商用もたしかできる。
最近の商売のネタはチームのコミュニケーションとかコラボレーションとかそういう部類で食ってるみたいだからね。
>>620 性能に違いはなかったはず。
機能の違いについては、MSのサイトで詳しく説明されている。
625 :
620 :2009/05/04(月) 17:53:36
>>622 性能を気にするレベルでないのは、ご指摘どおりです。
ありがとうございます。
>>623 WinApiに対応できてるのは知りませんでした。
ありがとうございます。
>>624 すみません。最近チェックしてませんでした。
ありがとうございます。
Expressにないのは、プロファイルに基づく最適化、OpenMP、x64/IA-64版、/analyzeあたりだな。 どれも、あると嬉しいが無くても困らないという感じがする。
MFC
プラグインもな
誰か頭の弱い俺に >>for (int i = 0; i < n; i++) の何が悪いのか教えてくれ
OpenMPは別途SDKのライブラリリンクすれば使えるよ
>>629 C99以前のコンパイラでは通らない。
int宣言しながらforまわそうとしてるから。
あ、以前じゃなくて未満か。
>>629 C++では問題ないけどCってこの書きかた出来たっけ?
問題ないス。
ああ、そういうことか コンパイラのVer違いまで把握するほど玄人じゃないから、ありがとう
昔の VC++ だと for の初期化文で宣言した変数って for 内でしか使えないくせに for 外で同じ名前の変数使おうとすると変数の重複でエラーになったんだよな。 しかも J++ でも同じような事になっていた。 今のはどうなんだろう。 for(int i=0; ...; ...){...} for(int i=0; ...; ...){...} // ← i は宣言されていますとか何とか
>>621 なんで、ゆとりをゆとり世代と勝手に解釈してるんだ?
これがゆとりなのか
その理屈は苦しい
>>610 学校ではC99を教えているのか? で、なんでLSI-C試食版が絶滅して欲しい?
C99対応コンパイラじゃないから?
610じゃないが、あまりメジャーじゃない開発環境だと、質問される側も困ることが多いかな。 どうせなら実際に現場で使われてる環境で学習した方が後々の効率もいいだろうし。 組み込みじゃ、試食版じゃないLSI-Cってそんなに使われてるの?
LSI-Cが市場の54%占めてるよ
644 :
610 :2009/05/05(火) 00:22:12
>>641 LSI-C試食版ですが、そもそもC99の構文を使うとコンパイルできませんし、
x86のスモールモデルしか対応していないので、C99の構文を避けたとして
も、宿題のプログラムが動かないこともあるからです。
宿題を自宅パソコンでやりたかったら、Linuxか何かを使うか、MinGWか
Cygwinを入れてgcc 4.0以上を使えるようにしておけと案内しているのですが。
for文の初期化子に宣言を書くのは普通に使ってるけど、gccだとわざわざ -std=c99と書かなくてはならないのが面倒だよね。さっさとデフォルトで 使えるようになってほしいんだけどな。
>>644 LSI-C試食版が絶滅して欲しいのは自分(達)の都合が悪いからってこと?
自分達の都合が悪いと絶滅して欲しいと...
Win98は絶滅して欲しいってのと同じだろ?
試食版ってint2バイトだっけ?
64bit版Windowsが普通になれば
LSICはコンパイラも作った実行ファイルも
そのままじゃ動かないから自然に消えるだろうけどなあ
>>646 はっきり言って知らずに使ってる人が不幸だから
なくなってほしいと思うよ
>>649 LSICはWindows7に対応するだろ
嘘を付くな嘘を
64bitって言ったんだけど
std::lessとかstd::greaterとかが何の宣言もなく出てきている様に思えるんだけど、 これはどの標準ライブラリに含まれているものなの?
>>646 逆に、今現在LSIC試食版でC言語の学習をするメリットってなに?
簡単に使える無料コンパイラが無かった当時は貴重な存在だったのは認めるが、
今ならもっといい開発環境が無料で手に入るんだし。
C++にて、コンストラクタにexplicitを付けることの利点を学びました。 MyClass::MyClass(int i) などは付ける意味があるのは分かりましたが、 コピーコンストラクタ MyClass::MyClass(const MyClass& i) にも付けることの意味ってありますか?
LSI-Cより、C99書式をつかう先生をなんとかした方がいい気がする
LSI-C と C99 書式を使う先生が居たらどう考えても何とかした方が良いのは前者だろ。 くみこも専門学校なら兎も角。
C++とちゃんぽんになってるだけなんじゃね?
今だとスタック4kではまる人もたまにいるしなあ
今の話題は試食版だし、販売元は関係ないだろう
今の時代にC++じゃないCを教える意味ってあるかなあ? それこそ組み込み系ぐらいだよね
生のメモリはCじゃないと見えにくいと思う。そういうモデル構築のためには必要だと思う。 C++だと誰かが書いたアロケータですんでしまうからなぁ。
なにその C++ だとポインタ使わなくても済むみたいな言い草。
>>663 デンジャーなところはクラスがラップしてくれるから生のポインタはあんまり触らないな。
ポリモーフィズムもあんまりやらないせいなのかもしれんが。
個人的にはVectorあれば大体片付くからね。
特に、Sizeメソッドとインデックサあればアウトオブレンジはほとんど無い。
Cはほどよく抽象度が低いところが教育的なんじゃないかと。 情報系学科の学生さんなら、基本的なアルゴリズムやデータ構造を 一度くらい自分で実装したりする機会もあっていいのでは。
ですよねー
あとパソコンじゃなくマイコンでやるべきだね OSとかないほうがいい
自分は大学で最初に習ったのがPascal(VAX-11 4.2BSD上)とPDP-11の 機械語(OSなし)で、いろいろやって不満を感じたころにCluという言語を 習って目から鱗が落ちた経験があります。 今でも最初にCあたりでスタートしてから高レベルな言語に移るのもあり ではないでしょうかね。
CのあとにPerlやったら目から鱗だった俺みたいなもんか
>>654 実はコピーコンストラクタではありませんというとんでもないクラスならexplicit付けておけ。
ようするに、コピーコンストラクタにexplicit付ける理由はない。
671 :
654 :2009/05/05(火) 14:51:45
>>670 意味ないのですね。
ありがとうございます。
char s[200]ってのがありまして、 sprintf(s, "%s hoge", s)みたいにするのっていいのでしょうか。
動作未定義っぽい気がする。それなら strcat(s, " hoge") だな。
>>672 それは簡単にセキュリティを阻害できるのであんまり好ましくないが、変換には便利なので利用される。
調べてみたらセキュリティ強化版のsprintf_sというのがC99から導入されたようだ。
コンパイラが対応してるならそっちを使ったほうがいいのかもしれん。
675 :
674 :2009/05/05(火) 17:05:11
あ、おかしなこと言ってるな。すまん。 俺も未定義なきがする。
>>653 俺は学習するメリットとかについては何も言っていない。
>>644 の俺の分析は
自分の担当学生が言うことを聞かずにLSI-C試食版を入れる。
そのサポートが大変で困っている。
これはLSI-C試食版存在するのが原因である。
だから絶滅して欲しい。
俺思うに真の原因は指定を無視してLSI-Cを入れた学生だろ。
その学生にこそお前氏ねといったほうが良いんじゃないのかと思ったんだ。
でも、TAはLSI-C試食版氏ね。
ポインタが重ならなければ大丈夫だよ
だからそういうのを未定義とか実装依存とか言うんだよ。
それは違うぜ、ぼうや
>>677 そのとおりだな。
VC8じゃstrcatになった。
BCC6.1じゃsの上書きでsは hoge のみ
おいおい、sprintfのドキュメントも読んでないのか
ドキュメント? Cの仕様書かい?
STLのコンテナをメンバに持つクラスがあったとします。 このとき、コンテナをポインタとして持つのか、それともそのまま持つのか どちらにするべきなんでしょうか? つまり class HogeA { // ... private: std::vector<int> vec; }; なのか class HogeB { // ... private: std::vector<int> *vec; }; のどちらが良いか、ということです。 任意のタイミングで初期化する必要がなければ、 HogeAの方が楽ですし、deleteし忘れもないので良いと思うのですが HogeBならばvectorをincludeしなくてよいため、ヘッダの依存関係が無くなって良いかも?と思うのです。 (STLのようなライブラリをincludeする場合は、気にしなくても良いのかもしれませんが…) 検索しても関係ないものがひっかかってモヤモヤしております。
686 :
684 :2009/05/05(火) 20:21:41
>>685 ありがとうございます。pimplイディオムで検索して色々調べてみようと思います。
C++は奥が深そうですね。
奥が深いっつうか、増築に増築を重ねて迷路みたいになった古旅館みたいなもんだが。
>>687 >増築に増築を重ねて
まあまさにそのとおりだな。
でもC++の魔力ってあるよねやっぱ・・・学んでて面白い俺は変態か?
C++の隅から隅まで知ろう、そして使い倒そう、人に講釈しよう と一つでも思い始めたら変態です。気おつけましょう
>>689 残念ながら
「TMPってすげー!でもやるのはめんどうだな、他の人にやってもらおう、俺は利用するだけでいいや」
と思っている程度の俺は変態じゃないのか。
早く変態にならなければ。
あのー他にC++のイディオムってどんなのが あるのでしょうか。すごく知りたいです
伝説巨人
コピーコンストラクタを生成しないように するための最善策というと何があるのでしょうか
コピーコンストラクタの中でabortする。
ええええ
ウェイト 10 秒
>>695 コピーコンストラクタってプレイベートにしても効果あったっけ??わすれちゃった。
3つの数を入力してその中で大きい二つの数を表示するプログラムを作りたいのです。 (3つの数の中から最大値を表示するプログラム) int a,b,c; scanf("%d",&a); scanf("%d",&b); scanf("%d",&c); if(a>b){ if(a>c) { printf("%d\n",a); } else { prinf("%d\n",c); } else{ if(b>c){ printf("%d\n",b); } else { printf("%d\n",c); } } まずa とbを比較する。大きかったほうとcを比較して大きかったほうが最大値。 こちらのプログラムに似せた形で作れるならばそれで作りたいです。 大きいもの二つだと急に複雑になってしまいよくわからなくなりました。
>>701 std::maxという関数がC++標準であってだな、AとBくわせて戻り値とCを食わせると最大値が得られる。
std::minという関数もあってだな、AとBを食わせて戻り値とCを食わせれば最小が得られる。
この場合はminで最小を求めてほかの2個を出力するほうが楽かもしれん。
swap関数って言うのもあるんだが、
AとB比較して昇順か降順にスワップして、BとCを同じように比較してスワップしてAとCも同じように比較してスワップすれば、いけそうな気がする。
絡まってきたら関数にくくりだすのが良いと思うよ。
俺の場合はifが滅茶苦茶になりかけたら破棄して書き直すなぁ。
スワップのあたりは間違ってるような気がしてきた・。・
配列につっこんでstd::sortとかやりだすと一番楽だけど 元のコードと何一つ似てる点がなくなるw
ありえる順序は abc, acb, bac, bca, cab, cbaの6とおり。したがって、 a > b かつ b > c => a,b a > c かつ c > b => a,c b > a かつ a > c => b,a b > c かつ c > a => b,c c > a かつ a > b => c,a c > b かつ b > a => c,b でいいんじゃね?(同じ値が入る場合は、適当に処理するとして)
minmaxとタプル使えば2,3行で書けそうだな
正解の条件がアイマイだと途端に面倒になるいい例だね
int max; max = (a >= b) ? a : b; max = (c > max) ? c : max; printf("最大値は %d\n", max); こんなんでよくね?
お前は何を言ってるんだw
フヒヒwwwwwサーセンwwwwwwww
>>708 最大値を求めて、残りの中から最大値を求める。
最小値を求めて、それ以外を出力する。
maximumとsecondを用意すれば元のコードを活かせるだろうけど まあ、配列利用するのが楽だよなあ
もとのようにやるなら if(a > b) { if(a > c) { if( c > b) printf("%d %d\n", a, c); else printf("%d %d", a, b); } else printf("%d %d", c, a); } else { if(b > c) { if( a > c) printf("%d %d\n", b, a); else printf("%d %d", b, c); } else printf("%d %d", c, b); }
もっとも、実際にそんなコード書く奴はセンスが無いと判断するけどねぇ。
実際には書かないけど、すぐ書けるor読んですぐ解るくらいの能力は必要。
なまじそういう能力があるから力技で糞コードを生産するという事実も
>>701 からの流れを読んで、
プログラマって数学出来る奴とできない奴に分かれるなってよくわかった。
無論
>>701 以降はすべてできない奴だが。
a > b == c とかどうすんだ。
テストの問題も読めないようなバカはすっこんでろよ。
昇順にソートして2番目と3番目の数値 表示するのはダメでつか?
>>718 「大きい二つの数を表示」だからあまり問題ないと思うよ。
>>718 ほほう、その場合何が困るのか説明してもらおうか
要は問題が ill-formed なんだが、まあそれはこのスレのレベルの低さとは直接は関係ない。
>>719 うんうん、よかったね
>>721 本気で言ってるのか?w
>>722 少しは自分で考えてみ
要約: 説明できません
特に C/C++ をやっている人間って二極化してて、 曲がりなりにも情報科学をちゃんと勉強してて数学も出来る香具師と、 専門学校レベル出で、反復と経験だけでプログラムできるようになってる香具師がいるってこった。
>>724 ヒントは書いたからな。それでわからんような香具師に付き合う時間はないよ
こういう他人を見下す奴に限ってたいしたこと無いんだよな
情報科学(笑) 木構造でも使うべきなのか
>>718 プログラミング初心者にありがちな間違いだな。
情報科学と数学が出来る
>>718 の解答マダー?(・∀・ )っ/凵 ⌒☆チンチン
ケース漏れ詮索ばかりやってるから肝心の目的を読んでなかっただけだろ。 もう逃亡宣言もしたんだし許してあげなよw
>>718 a > b == c は a > b かつ c == 1 のときと a <= b かつ c == 0 のとき真
バカ宣言して逃亡ww どこの中学生が紛れ込んだんだよwwwwww
>>718 初心者のよくする間違い乙。
職もないし未来もない。
この上2chでまでいじめられるとはwww
でもまあいいじゃん、色んな生き方があるさw
>>718 どうもしない。
特に指定がない場合はaとb(=c)の2つを表示するだけ。
>>734 きっと無能市立無能中学校じゃないかな?
見逃してた何かがあったのかとワクワクして読み進めたのに逃亡かよ。 3 年 ROM ってろ。
横だが、
>>736 それ題意満たしてるか?
じゃあ
a=b=cの場合と
a=b>cの場合は?
数学的にってことは、
a,b,c が相異なるのか、そうでないかに場合わけして考える必要があるのと、
「m個の中の上位n個を選択する」というより一般化した解答を書けってことじゃないの?
あのーソートして上位2個選んじゃ ダメなのでしょうか?
仕様書を勝手に誇大解釈する奴がプロジェクトに居ると苦労する。
>>740 a,b,cが相異なるならそれでいいと思うが、そうでない場合困る。
たとえば、成績上位2人に御褒美をあげたいからそういうプログラム書いてって仕様の時、
全員同じ点数だったら3人目がカワイソス。
なんか場合分けで解けっていう縛りがあるみたい 入門書でよくあるパターンの三回の比較・交換(バブルソート)で終了だとつまらないから 別のやり方でってことなんかな?
>>741 このケースは、あいまいな仕様をきちんと詰めて確認しないSEに問題があるケースだろうな。
プログラムかけないSEとかいるとほんと苦労するぜ
「数を表示するプログラム」って書いてあるのが見えず、行間を必死に読もうとしているバカって何なの?
所々全角に変えても自己弁護に戻ってきたのバレバレだな。
>>739 こういう問題は全部違う数であることは暗黙の了解。
例外な場合は特に指定がない場合は考えない。
>>745 その「数」が何かってのが問題なんだろう。
ユニークな数なのか、数の組が意味があるのか。
>>739 の前半参照
この仕様はあいまいだと思うぜ。
>>747 > こういう問題は全部違う数であることは暗黙の了解。
うーん、残念ながら君はこのままでは一人前のプログラマにはなれないと思うよ。
ベントリー本とかで勉強してみたら?
妄想ふくらませすぎて勝手に自分仕様追加してるだけじゃん… どこの PG 一年生だよ。
>>749 前提は701のソースなんだが、上位2つが同じときとか、3つ全部等しいときに例外処理してるか?
お前がバカなのは十分わかったから少しだまってろよw
というか、今日は釣れまくっとるw 50レスか。低学歴馬鹿にするのもたまにはいいな。みんなごめんねwww
後釣り宣言==敗北宣言w
>>748 数は数。何の提示も示唆もないのに数値が生徒情報その他とリレーションを持ってるケースを
想定して曖昧だなんて アフォ も良いとこ。厨二プログラマにありがちな解釈の暴走だな。
真っ赤な顔して釣り宣言してもバカは隠せませんよ。
黙って
>>726 で消えてれば良かったのにバカな奴w
>>755 > 数は数。
>>739 の前半の解答を紙に書いてみて。
たぶん必死になってるのは一人だと思うが、
- 自分勝手な暗黙の了解を仮定する
- 条件提示がない場合に自分に都合のよい選択肢を選ぶ
- 例外は考えない
社会に出たら、デスマーチへようこそ、ですよw
じゃあね
こんなもん外国なら問題が悪いで終わるのに 必死になってやろうとするのもアホだよなぁw
こんな単純なif分岐問題で例外とかバカ言ってるのはお前一人だけだw
>>758 底辺コーダーがデスマーチのしすぎで脳が破壊されたか?w
> 横だが バカかこいつ
>>762 本人は他人の振りができてると思ってるんだから、そっとしといてやれよw
>>758 - 自分勝手な暗黙の了解を仮定する
>「m個の中の上位n個を選択する」というより一般化した解答を書けってことじゃないの?
- 条件提示がない場合に自分に都合のよい選択肢を選ぶ
> 前提は
>>701 の問題文であってソースは前提ではないな。
- 例外は考えない
> たぶん必死になってるのは一人だと思うが、
社会に出てからずっとデスマーチやってるんだろうなこの人。
#include <boost/tuple/tuple.hpp> #include <boost/tuple/tuple_io.hpp> #include <iostream> boost::tuple<int, int, int> sort3(const int x, const int y, const int z) { int x_ = x, y_ = y, z_ = z; if (x_ > y_) std::swap(x_, y_); if (y_ > z_) std::swap(y_, z_); if (x_ > y_) std::swap(x_, y_); return boost::make_tuple(x_, y_, z_); } boost::tuple<int, int> midHigh(boost::tuple<int, int, int> const& arg) { return boost::make_tuple(arg.get<1>(), arg.get<2>()); } int main() { int x = 214, y = 88, z = 13; // std::cin >> x >> y >> z; std::cout << midHigh(sort3(x, y, z)) << std::endl; } こんなんでいいんじゃないっすかね
>>758 おまいは「同値が含まれる場合の『上から2つ』があいまい」、例えば (a=2,b=1,c=2) の時に
(2,2) を出せば良いのか (2,1) を出せば良いのか不確定と言いたいのだろうけど、問題は「『3つの
入力値の中から』上2つ」だから (2,2) で良い。
「仕様が曖昧だから作れない!」って言いたいだけのお年頃か知らんが、含みを持たせるならもっと
サプライズがないとバカが出し惜しみしただけにしか見えないぞ。
最初に出した例とかを見ると、勘違いで一度逃亡した後にそういう設定を思いついたんだと思うが。
引っ張った割にしょぼいオチで莫迦さ加減倍増www
712 > 3つの数を入力してその中で大きい二つの数を表示するプログラムを作りたいのです。 1つ目の数を入力したら、2だった。 2つ目のは4だった。 ここまでで、4は出力されることが決まった。 3つ目の数が5なら、2は出力されない。 3つ目の数が3なら、2は出力されない。 3つ目の数が4なら、2は出力されるかされないか。
レベルの低い質問にはレベルの低い回答者が群がるってのは本当だなぁ。
>>766 まあ一人なのかもしれないが、こいつほんと馬鹿だなw
> 問題は「『3つの入力値の中から』上2つ」だから
勝手に読み替えちゃだめだろう。お前の脳がサプライズだよ。
問題は『3つの数を入力してその中で大きい二つの数を表示する』だ。
3つの入力値の中からとは書いてない。
上で 「数は数」 とか抜かしてる奴がいたがそれに従えば
もし入力が 3, 3, 2 なら、
出力は数として上から二つとると 3,2 になってしまうな。
3,2,2ならいずれにせよ3と2じゃね?
こんなどうでもいいことにここまで必死になれる情熱がうらやましい
>>772 フーン
で、それがどう情報科学や数学と
関係あったのか教えてもらおうか
>>772 「3つの数を入力してその中で大きい二つの数」を選ぶのに、
3つの入力値の中からじゃないってのはどういう意味だ?w
777 :
? :2009/05/07(木) 08:38:27
重複を許すか許さないか明示されていないからどちらでも正しいよ。 その点で言い争っても結論は出ない。
705 708 が結論を出してるのに丸一日無意味な殴り合いお疲れって事だね
718が一人で暴れてただけw
プログラマなら数が同じ場合はどうしますか? って聞いて終わりだろ。
おまいら私がアクセス制限されている間に楽しそうにしやがってw で、>718はもう来ないのかな?
>>781 だな。まずその疑問が出てこないとプログラマじゃない。
上は全部落第だよ。得意げな
>>705 とか笑える。
>>783 それじゃ、この辺りで模範解答を宜しく。
>>765 はOK
#include <stdio.h>
void swap(int *a, int *b) {
int t;
t=*a,*a=*b,*b=t;
}
int sort3(int x, int y, int z) {
int t;
if(x>y) swap(&x,&y);
if(y>z) swap(&y,&z);
if(x>y) swap(&x,&y);
printf("%d %d %d\n", x, y, z);
}
int main() {
sort3(1,2,3);
sort3(2,1,3);
sort3(1,3,2);
sort3(3,1,2);
sort3(2,3,1);
sort3(3,2,1);
}
こんなんで一々入れ替えのロジック組まれたら溜まったもんじゃないけどねぇ。
#include <pstade/oven/sorted.hpp> #include <pstade/oven/dropped.hpp> #include <iostream> #include <pstade/oven/initial_values.hpp> #include <pstade/oven/io.hpp> #include <pstade/oven/identities.hpp> int main() { namespace ov = pstade::oven; int x = 0, y = 0, z =0; std::cin >> x >> y >> z; std::cout << (ov::initial_values(x, y, z)|ov::sorted|ov::dropped(1)|ov::identities) << std::endl; } ovenは素晴しい…
>>787 なんか変態コードの一歩前見たなコードだな。
これってBoost?
>>788 boostじゃなくね?名前空間もインクルードファイルもライブラリ名もboostにない物な気がする。
ovenだっていってるがな。
ぐぐってみた。Boostじゃないな。 パイプがちょっとイレギュラーな使い方のような印象。
>>772 だから (a, b, c) = (3, 3, 2) の集合から値の大きい 2 つを選んでみろよw
勝手に読み替えちゃだめだろw
この釣りどこまで引っ張る気?
等値ケース思い付いて天才数学者気取りだったのか…
つーか、
>>701 読みにくい
インデントちゃんといれてくらはい
100近くも引っ張るネタだったのか というか701出てこいよ
>>787 これすげーな。
C++ でこんな関数型言語の真似ごとみたいなことが出来るのか。
ごてごてとした冗長さもC++らしいわw
まあ Ruby とかでやったら
irb> [x, y, z].sort.drop(1)
だけですんじゃうんだけどね。
まあね。 ああいうのはC++でやることに意義があるという構えでいないとやっていられないと思う。
>>788-791 RanceExの一部として、そのうちBoost化されるのが決まっているらしい。
>>797 とりあえずその参考書でイモでも焼いて、K&RかH&Sあたりのまともな
本を読むことをおすすめします。
>>797 pは要素数15のchar型の配列へのポインタを表す
すなわち p++; とすると、pは +1 されるのではなく +15 される
何を基準に+15なのか明確にしないと、混乱するだけだろ
sizeof(char) * 15
1、3行での説明とか困難な話になるよね
そして
>>801 は糞
どこが困難? char p[num][15]; をヒープメモリに確保した。 「添え字に変数」 と 「ヒープメモリに確保」 の実現に malloc を使わない記述だと 実現困難か例よりさらに変体的に成る。
>>807 >>806 の日本語理解できないのか?(お前の日本語でおkよりはるかに良いぞ)
もし、そうならお前、ド低脳だぞ
810 :
808 :2009/05/08(金) 23:12:25
>>809 ほんとに何を
>>806 が言っていることが分からないのか。
言っていることのどこが分らんのよ?たった、2行文だぜ
低脳の俺ですら言っていること分るんだが....
分らないなら、ゆとり丸出しだぞ。(ただ言っていることが正しいのか、低脳の俺には分らんが)
>>806 の文章は意味を理解したくない文だね
きもいしw
てめーら喧嘩すんな、身のある話をしろ。
813 :
808 :2009/05/08(金) 23:23:29
うん
815 :
808 :2009/05/08(金) 23:31:01
そうか。ありがと
厳密には間違ってるけどなw
817 :
812 :2009/05/08(金) 23:38:23
>>813 わからん。そもそも読む気にならないし俺がなんと言ってもアンチ意見が沸くだろうし。。
適当な落としどころをつけてくれよ。それでいいじゃないか。
mallocを使わずcallocでも使えばいいじゃない
callocはなんか無意味に直交性捨ててるようで嫌だ。
/usr/local/include/openusb.h:650: 警告: inline function ‘uint16_t openusb_le16_to_cpu(uint16_t)’ used but never defined inline uint16_t openusb_le16_to_cpu(uint16_t data); // 650行目 実体のない inline 関数は引数をそのまま返す仕様なんですか? LE 機なんでバイト順序の入れ替えなしでも正しくは動くんですけど。
質問です C++で関数を作ったときに引数を省略する書き方があるとおもうんですけど int型なら 引数xがあったときに x=0 と書いて置けば良いと思うのですが 自分で定義した構造体を引数にとる場合、それを省略させるためにはどのように書けばよいのでしょうか 例えば以下のような場合です. ?の所には何をいれればよいのでしょうか・・・ kansuu.h----- typedef struct tagAAA{ int a; int b; }AAA; void TEST( int x = 0, AAA Aaa = ? );
なんで C++ なのに C ライクな記述をするのかしらんと思いつつも それはさておいて、AAAのコンストラクタが許すものならなんでも書けます。 例えばデフォルトコンストラクタなら AAA Aaa = AAA() のように。
>>823 ありがとうございました orz ぺこぺこ
関数内で計算したデータをほかでも使う必要がでてきて、構造体の形で取り出したかったもので
たまにしか使わないし、どうしようと思いながら・・・
こういう場合は他にもいい方法があるのでしょうかアウアウ
>>824 >関数内で計算したデータをほかでも使う必要がでてきて、構造体の形で取り出したかったもので
おいおいAaaに結果を返すのか?
参照かポインタを渡さないと取り出せないぞ?
ポインタならデフォルト引数をNULLにしておいて、
関数内で判定してNULLなら使わなければよい。
それか素直にオーバーロードして、
void TEST( int x = 0, AAA& Aaa);
と
void TEST( int x = 0);
を作ればよい。
>こういう場合は他にもいい方法があるのでしょうかアウアウ
TESTが他の戻り値を返す必要がないなら、
AAAを返すのが一番自然だと思うぞ。
メンバ変数で状態を返すコンストラクタ駆動の関数オブジェクトと考えれば何の問題もないだろ?
あるクラスのメソッド内でbad_allocが投げられたときはそのメソッド内でcatch処理をするべきでしょうか? それともその外で処理するべきでしょうか?
>>827 >それともその外で処理するべきでしょうか?
それはつまりクラスのユーザーに処理を任せるって事でしょ?
いわば丸投げだよね。
もしそのメソッド内で処理できるんならそれが最高じゃない?
ハンドラを関数オブジェクトの形で渡して貰うようにする方法もあるぞ 指定されなければデフォルトのハンドラでメソッド内でcatchとか
だいたいの場合は、bad_allocはそのまま外に投げちゃっていいと思うけどね。 「bad_allocが発生しちゃうような場合でも、何とかして処理を正常に完了させることができる」 ような関数なら、bad_allocをcatchして適切に処理し、外に出さないことはできる。 でも、そんな芸当ができる関数は少ないと思う。
そもそも回復可能なbad_allocってどんなのだろうか そういうのに当たったことがない無知な俺に誰か教えてくれ
・出来る限り巨大なバッファ確保 ・ヒープ上のキャッシュをクリアして再試行
RPGの戦闘シーンのようなものを作っています。 HP1(1プレイヤー体力)HP2(2プレイヤー体力)、kou1(1プレイヤー攻撃力)、kou2(2プレイヤー攻撃力)と設定しているつもりです HP1からkou2を引き、その時に「1はkou2のダメージ!」などと表示させたいのです ですが何も表示されないままプログラムが終わってしまいます。どうすればよいでしょうか? cout<<"test"; を一行目に入れた場合はtestは表示されます。 forがどうしても分かりません・・ヒントだけでも教えてください、お願いします。 #include <iostream> using namespace std; int main() { int hp1, hp2,kou1,kou2,bo1,bo2,un1,un2; hp1=100; hp2=100; kou1=50; kou2=30; bo1=40; bo2=60; un1=10; un2=30; for(int i=1; (hp1<=0)||(hp2<=0); i++) { hp1= hp1-kou2; cout<<"1は"<<kou2<<"のダメージ!\n"; hp2= hp2-kou1; cout<<"2は"<<kou1<<"のダメージ!\n"; } return 0; }
new T[0xffffffff]のように明らかにおかしな(大きすぎる)要素数を指定した場合とか?
forの条件を hp1>0 && hp2>0 でどうかな? 検証してないけど。。。
(hp1<=0)||(hp2<=0)が真のときにforの中身が実行される
>>835 >>836 ああ、ありがとうございます!!
単純にforの始動条件()?勘違いしてました、吸いませんでした
あはぁん。もっとすってぇ。 あ〜、らめ〜。
ちゅっちゅっ
>>834 OSによっては、newは成功するけど実際にメモリ使ってるときに落ちるって挙動になりそうな気がする。
>>840 そんなOSでもアドレス空間が足りなくてbad_allocという展開を考えた。
コンストラクタでは例外をなるべく投げない、デストラクタでは例外を投げないようにするべき、というのをどこかのサイトで見たんですけど ということはコンストラクタ内でnewしないで、alloc()とかほかのメソッドを作っていちいち呼び出したほうがいいんでしょうか?
コンストラクタさんかわいそうです
コンストラクタで例外起こすと、newで得られたポインタをdeleteにかけていいのかわからないから。 ってのが理由だった気がするんだけど、今でもそんな曖昧な仕様なの?
newして成功してメモリアドレスを貰っても 確保に失敗する場合もあるしな
malloc(sizeof(int)*10)とcalloc(10, sizeof(int))って0で初期化される以外に違いある?
A a = new A(); とした時に 1)メモリ確保、2)コンストラクタ実行、3)aへアドレス代入、 の順序になるから、コンストラクタで例外が発生した場合、アロケートしたアドレスを ロストして確実にメモリリークになる。 というのは Turbo C++ (96'頃) の知識なんだけど今の規格はどうか知らん。
mallocとcallocで思い出したけど一般的にはどちらを使うんだろう? 本とかだとmallocが多い気がするんだよな。 mallocのほうが処理が高速なのだろうか?
ゼロクリアが無い分、mallocの方が高速なのは間違いない。 クリアが必要ならそのあとmemsetすればいいだけだしな。
でもalloc()作って〜とすると継承するとき困るような
クリアが必要な場合にmalloc+memsetとcallocのどっちが速いかが問題だろ。
new/deleteを使うと遅くなるから C++でもmalloc/free使う方がいいよ
自分のプログラムの基本的な書き方についてなのですが・・ 問題点ってありますでしょうか・・ まずは、クラス、メンバー変数・関数を書いて、インターフェイスとして管理メンバー関数 を作ります。 上流では流れを分かりやすくして、処理は管理メンバー関数に委譲する書き方をします。 例えば、ひとつのオブジェクトのみ生成する必要がある際、 メンバー変数・関数は全てprivateで実装し、インターフェイスのみstatic publicにします。 インターフェイス内で自己classのオブジェクトを生成。既に生成されていれば既存の オブジェクトを返す。 という様な使い方をしています。
>>849 03ではコンストラクタでthrowされたとき、デアロケータが実行されるはず。
placement newの場合は各自で面倒見てください。
singletonでインスタンス取得する関数だけstaticにするのならわかるけど、 インタフェースをstaticにする意味がわからん。 あと、管理メンバー関数というのも、どういうものなのかよくわからん。
すいません。例が非常に悪かったです;; 上でインターフェイス部分を羅列せずに、管理関数内部で一連の処理を行う。 というのは通常使用されるのか、また、自分としては見やすいというメリットが あるのですが、デメリットもあるのかなと・・ 一人で作ってる分には特に不便を感じないもので;
責務の分配ってやつでしょ 再利用性を高めるためにはいいと思う 再利用なんて一生しないんだけどな!
>>860 いまいちよくわからんが、オブジェクトを管理する機能と管理されるオブジェクトが同一クラスに入っている
ということであれば、オブジェクトを管理するクラスは管理されるオブジェクトと別のクラス
にするのが一般的。
>>862 ありがとうございます。まさにその通りです;;
自分の中でもちゃんと纏まってないから駄目なんですね;;
なるほど、確かにその方がより良いですね。
その際に、継承するのか、オブジェクトを取り込むのかは
やはり状況しだいなんでしょうか。
管理するオブジェクトは管理されるオブジェクトではない(is-a関係ではない) 管理するオブジェクトは管理されるオブジェクトを持つ(has-a関係である) と考えると、 普通は管理するオブジェクトの中に管理されるオブジェクトを持たせるはず。
以下のようなコードを書いたのですが #include <iostream> using namespace std; template <class T> class Test { private: T x; T y; public: Test(T a = 0, T b = 0): x(a), y(b) {}; void getter(); }; template <class T> void Test<T>::getter() { cout << x << endl; cout << y << endl; } int main() { Test<int> a(2, 4); a.getter(); return 0; } テンプレートクラスを使用するときは Test<int> a(2, 4); Test<double> d(4.0, 9.0); みたいにクラス名の後に<型名>を指定する必要があります これを指定しなかった場合はデフォルトでdoubleに汁にはどうすればいいですか?
template <class T = double>
#include <iostream> using namespace std; template <class T = double> class Test { private: T x; T y; public: Test(T a = 0, T b = 0): x(a), y(b) {}; void getter(); }; template <class T> void Test<T>::getter() { cout << x << endl; cout << y << endl; } int main() { Test<> a(2, 4); a.getter(); return 0; } クラス側と関数側両方に指定したらエラーになった あとTest a(2, 4)もエラーになった 以下のようにしたらコンパイル通りました (1)template <class T = double>はクラス側にだけ指定する (2)宣言時はTest<>のようにしないと駄目(Testだけだとエラー) で合ってますよね
>>864 ありがとうございます。オブジェクト指向の基本で読みました;;
幾ばくかすっきりしました。
分かりにくい説明に答えて下さってありがとうございます。
>>867 その通りだね
後残る手段はdoubleの特殊化しかない
この場合引数をちゃんと小数点を付けて指定しないと
うまくいかないかもしれないな
ありがとうございました
Extended STLってどうなんすか?
C++0xの発表と同時に潰れるだろ
C++0xは一生でないね
C++0aとか言われてるしなwww
>>873 C++98だって出ないと言われていたんだぞ
STLを仕様に取り入れた事で2000年超えると言われてたし
64bit 機が主流になったら int が 64bit、long long が 128bit とかなると思うんですが、 short の身の振り方で 16bit または 32bit サイズの整数型がなくなっちゃいますよね? 16bit は wchar_t で代用するんですか?
64bit環境でもintは32bitのままが普通。 Windowsなんかlongも32bitのままだぞ。
0x出るの2015年ぐらいでしょ 来年はあり得ないね
0xなんて16進の接頭辞として何かにこじつけておけばいい
>>880 規格は固まるかもしれないがコンパイラがすぐには出ない
今時C++コンパイラとして使われてるのはgccだけだし、 割とスムーズに対応するんじゃないの?
へぇ
gccはキチ○イみたいなメンバーがたくさんいるみたいだしな 規格が出たらすぐにでも対応しそう
程度はともかくVC++も次で少しは対応するというのが嬉しい、VC++使いなんで。
一度下位互換性を捨てて言語仕様を整理して欲しいよ。C++ 出だしの頃のように 最初はトランスレータで良いからさ。
Cに対しては上位互換、旧規格に対しては後方互換のような気がしなくもないけど それはさておいて、もうすでにC(99)との互換性もないしなぁ。
互換性無くていいならDでもなんでも使えばいいだけ
890 :
デフォルトの名無しさん :2009/05/11(月) 09:17:43
2つの構造体のメンバを1つの配列の要素にして間接的に操作することはできますか? for文で順番に値を入れられるようにできたら良いなと思ったんですが、方法があったら教えてください。
構造体どうしは = で丸ごとコピーが可能。
>>890 構造体のメンバーを最初から配列にするんじゃダメなの?
893 :
890 :2009/05/11(月) 10:56:19
もしかして、union使いたいとか?
配列でイジリたい型の参照配列かポインタ配列を用意してクラスかマクロで構造体から要素を取り出して突っ込む。
ってリンク先がunionの説明だったのか・・・
リンク先で説明されるような union の使い方って普通にされてるけど 結果は環境依存だから、K&Rとかではやっちゃらめってことになってるんだよね。
>>897 struct S s;
fwrite(&s, sizeof s, 1, fp);
みたいな構造体をそのまま読み書きするのも、キモイから
やめてほしい。
CからC#にやってきて、C#はこれができないって憤慨してた
やつを見たことある。あほか。
そうだな、Serializable属性でできるのにな
環境依存であることがわかっていればいいんじゃないか。
>>898 みたいなことは構造体の表現やエンディアンが固定なら
問題なくできるし、それができるのがCのうれしいところじゃない。
構造体を引数や返値とするのも、頑にいやがる人がいるよね。
コピーされるからだろうけど、あまりでかくなければコンパイラが
頑張ってくれて遅くならないんだけどね。
>>900 昔のCでできないことをいやがる人ってどこにでもいる気がする。
古いコンパイラにも対応しなければならないのならともかく。
いいかげん、「ブロック内の変数宣言は文の後には書けない」
などと学生に教えるのはやめていただきたいものである>先生方
月面の重力は地球の約17%です。 自分の体重を入力すると月での実効体重を 計算し、表示するプログラムを作成してくだ さい。 これ誰か組んでください↑ 勉強してもまったく分りません
自分の体重17%にすりゃいいんじゃないの? 重力係数とかよくわからんが
907 :
デフォルトの名無しさん :2009/05/11(月) 20:57:13
>>898 バイナリ形式でデータやりとりする時には普通にやるけど。
構造体の内容からバイト配列を生成して、それを出力
とか面倒くさくてやってられない。
>>908 たいしてめんどくさくないだろ。
もうすこし移植性に気をつかってほしいよ。
>>908 padding や endian の問題を無視できるならそれも楽だよね。
ヘッダファイルにtypedefで構造体の型を定義したんですが 別のヘッダファイルに新しく構造体を宣言し、そのメンバとしてtypedefした 型を定義したんですが、型として認識してくれません 型名が必要だと言われます どうすれば認識してくれるんでしょうか?
912 :
911 :2009/05/12(火) 00:43:21
すいません、自己解決しました 申し訳ありませんでした
再現する最小限のソースを。 ちゃんと第二のヘッダから第一のヘッダをインクルードしてるの? ぐらいしか言えない。
将来的な移植の希望 (予定ですらない) がある程度なら pack してマジックナンバーでも 付けときゃ良い。つかファイル形式は LE 固定で良い。
3DゲームのスキンやMODを作りたいのですが、何から学べばよいのでしょうか? C言語とC++、Java などの違いすらわかりません! これだけは買っとけって入門書ありますでしょうか?
検索エンジンの使い方から学ぶべき
英語も必要だな
918 :
デフォルトの名無しさん :2009/05/12(火) 10:15:28
Rebarとツールバーを使ったサンプルコードを探しています。 どこにありますか?
919 :
918 :2009/05/12(火) 10:47:14
CodeProjectでWin32++を見つけました。これを参考にがんばります。
920 :
デフォルトの名無しさん :2009/05/12(火) 12:59:55
難しくて覚えられなんだが どうすればいいんだ
>>920 俺は作って覚えた。
既存のゲームを移植してみれば良いよ。テトリスとかさ。
ロジックは自分で考える。
テンプレートライブラリを書く練習にSTLのアルゴリズムみたいなのを作ろうと思っています。 とりあえず please_if only_if って二つのアルゴリズムの名前を思いついたのですが、肝心の機能をどうすればいいのやらさっぱりです。 この名前に見合うアルゴリズムはどういう動作をするように設計すべきでしょうか?
アルゴリズムを考えてから名前をつけような
バロス
ガーン 今度からは先にアルゴリズムを考えるようにします。 ありがとうございました。
いや、アルゴリズムじゃなくて処理で名前をつけるだろ。
なんかずれてるw
名前なんか後からそれっぽいの付ければいいだけ
qsort()とか、クイックソートっぽいのにクイックソートとは限らないって ダサい状況になってるじゃん。 やっぱアルゴリズムで名前付けちゃいけないよ。
結論ありきの主張
自然な意見ですね。
classAはa・b・cの文字列を、classBはe・f・gの文字列をもっていて この6つの文字列を1つのstd::list<string> abcefgにまとめたいのですが std::string Getabc(int param) std::string Getefg(int param)というGet関数から、パラメータに対応するabcdefを返させる std::list<std::string> Getabc() std::list<std::string> Getefg()を用意して二つのlistを連結させるか void Getabc(std::list<std::string>* pList) void Getefg(std::list<std::string>* pList)としてstd::list<string> abcefgを引数として渡してそこに詰めさせるか どれがよいでしょうか?
どこかでnewに失敗したらとにかくプログラム終了、とする場合 CMainとかを作って try{ CMain *p; p = new CMain; p->run(); delete p; } catch(bad_alloc){ owata(); } でいいんですかね? それともクラスごとにいちいち終了処理を書くべきでしょうか?
operator newを再定義した方が楽
int main() { try { ...; } catch (bad_alloc) { owata(); } return 0; }
RPGゲームの戦闘部分を作っています HPは味方がmHP[n]、敵がtHP[n]と配列に格納していますが、 HP[n][m]などと多次元配列にし、mで敵/味方フラグを立てる感じの方が良いでしょうか
別がいいでしょう
そうですか、ありがとうございます もう一つ質問です。 ダメージの計算式は簡単に、HP-攻撃力とします。 mHP[n]、tHP[n]、mKO[n]、tKO[n](味方攻撃力、敵攻撃力とします)とあるとき、 if(順番が回ってきた物が味方である時) tHP[n]-=mKO[n]; と全体の処理をifで括るのではなく、 ( (順番が回ってきたのが味方である) ? mHP[n]:tHP[n] ) -= (順番が回ってきたのが味方である) ? mKO[n]:mKO[n] ) のように要所要所を条件演算子で判別させたほうが良いですよね? 日本語ばっかりで分かりにくくてすいません
ソースの密度が上がるとそれはそれで見にくいが、縦に伸びすぎるのも読みにくい。 バランスが大事ですよ。
これは経験をつまないと分からなさそうですねw とりあえず何か作ってみることにします ありがとうございました
分かりやすいのが一番重要。分かりやすくなるのであればgoto文もグローバル変数も使っていいしオブジェクト指向やデザパタも気にしなくて良い
最初にc++を学んどけばたいていの言語に応用できるというのは本当ですか?
うそです
最初にC++って・・・ なんと言う拷問
とりあえずCやってコンピュータのプログラムってなんじゃ?と言うのを学んで C++やってオブジェクト指向ってなによ?ってのをやるのはいいと思うよ いきなりC++は多分やめたくなると思う 本当はその前にアセンブラが入るともっといいと思うけど
屁理屈かもしれんが、C++による手続き型プログラミングから入るのは別にいいと思うぞ。 C++はオブジェクト指向しかできない言語ってわけではない。
基底クラスから派生クラスのメソッドて呼び出し出来ないですか? #include <iostream> using namespace std; class Animal { public: void speak(int n); void speak(){cout<<"ギャー";} }; void Animal::speak(int n){ for( ; n>0; n--) speak(); } class Dog : public Animal { public: // void speak(){cout<<"ワン";} }; int main(void) { Dog dog; dog.speak(2); }
>>948 できると思うんだけどなんかエラー出るの?
もうひとつ。 メソッドをオーバーライドすると、同じ関数名は全てオーバーロードが必要ですか? #include <iostream> using namespace std; class Animal { public: void speak(int n); void speak(){cout<<"ギャー";} }; void Animal::speak(int n){ for( ; n>0; n--) speak(); } class Dog : public Animal { public: void speak(){cout<<"ワン";} }; int main(void) { Dog dog; // dog.speak(2); dog.speak(); }
>>948 多態的なオーバーライドを行いたければ、Animalのspeakの宣言にvirtualを付ける。
virutal void speak();
>>950 混乱を防ぐため、Dogのspeak()によって、Animalのすべてのspeakは隠蔽される。
class Dogの中でusing Animal::speak;と書くと、dog.speak(2);もコンパイル可能となる。
>>948 どうも、「ワンワンとするのは」無理なようです。
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
test.cpp:
エラー E2227 test.cpp 22: Dog::speak() の呼び出しに余分なパラメータがある(関数 main() )
*** 1 errors in Compile ***
>>950 純粋仮想関数を持つクラスを抽象クラスと呼ぶでしたか?
勉強します。
>>952 有難うございます。
public:の後ですね、using Animal::speak;
>>949 できました、有難うございました。
#include <iostream>
using namespace std;
class Animal {
public:
void speak(int n);
// void speak(){cout<<"ギャー";}
virtual void speak() = 0;
};
void Animal::speak(int n){
for( ; n>0; n--)
speak();
}
class Dog : public Animal {
public:
using Animal::speak;
void speak(){cout<<"ワン";}
};
int main(void) {
Dog dog;
dog.speak(2);
dog.speak();
}
atexit関数は何の役に立つの?
プログラム終了時に何かやらせたいとき。 大抵は、後片付け処理が入る。
登録しとけばメイン終了後に呼ばれるのはわかるのだが、特にどうしても「メインの後に」やらせたい後片付けの例とは? 最も短いプログラムで例文を書いてくれると嬉スィ
exitでプログラムを終了させたばあいでも、atexitで登録された関数は実行される。
あとは、ライブラリが(たとえユーザから明示的に呼び出されなくても) プログラム終了時に終了処理を走らせたいときとか。
960 :
デフォルトの名無しさん :2009/05/13(水) 12:29:19
俺いきなりC++やって本買ったが半分でまだclassが出てこないんだが どんくらいである程度覚えられんだ
>>960 なんの本かはわからないけど、C++でclassまで覚えるのに人にも
よるが半年ほどかかると思う
templateまで完全に覚えるとなるとこれは年単位だな
Cにどっぷり漬かってる期間が長ければ C++のクラスの必要性に疑問視を抱くはず
classは無理に使わなくてOKです
965 :
デフォルトの名無しさん :2009/05/13(水) 13:10:04
×疑問視を抱く ○疑問を抱く
>>962 >Cにどっぷり漬かってる期間が長ければ
デストラクタや例外、void* 等の弱い型付けに頼らない
安全なカプセル化手法等が欲しい、と思う局面は
幾らでもあった筈。
>>962 Cにどっぷりつかると、
class使わなくてもオブジェクト指向プログラム組むようになるから
っていうのなら同意。
>>966 一理あるが、カプセル化は厳密では無いが
近い事をCの関数や構造体のみでも実装は出来るでしょ
俺は最初classの必要性に?を感じてたけど、今では使いまくってるよ
C++はD言語みたいに興味本位で作られた言語ではなく 禿がCのプログラマの不満を解消するために作った言語だからな ただtemplateだけはどう考えても趣味っぽいけど
いやまてよあれはBoostの連中が悪いんだ 元々templateは関数マクロを撤廃するために作られたもの これがクラステンプレートが出てきた頃から怪しくなった
当時から禿げてたのか?
>>971 どうだろうねえ禿げてたんじゃねーの?w
しかし言語仕様にSTLを入れた事でPL/I並みの巨大さに
なっちまってプログラマが尻込みしてるしな
皆JavaやPHPやスプリクト言語に逃げた
JavaやPHPもたいがい巨大だけどな。 C++のほうがまだ小回りが利く。
templateはもともとコンテナのために作られたんでしょ。 Javaみたいに、全クラスを Object みたいなクラスのサブクラスにする発想は以前の言語からあったが、 コンテナが Object を格納するとなると、取り出すときにダウンキャストが必要になったりして嫌だから テンプレート機能を作った、ってのがテンプレート誕生のきっかけだったはず。 テンプレートがいろいろアレな方向にも使えるねって話が出てくるのは、その後の話。
あと、禿はもともとSimulaを利用していた人物で、Simulaのパフォーマンスに不満があって それで、Cをベースにしてクラス機能を導入したらどうか?って方向に行ったんでしょ。 「Cのプログラマの不満を解消」ってのは少しずれてる。
D&Eを読めばその辺りの経緯がよくわかるな
Cでオブジェクト指向プログラミングなんてできないよ。 できると称して、そういうテクニックを披露してるやつがよくいるけど、 つかえそうなのは、抽象データ型くらいまでで、継承とか多態まで いくと、それってムリがあるだろってツッコミいれたくなるような 感じのばっかり。 ああいうのマに受ける初心者がいるから、広めるのはやめてほしい。
継承は子構造体の先頭に親構造体を配置するようなほうほうでやってた記憶があるなぁ。 多態に関しては関数ポインタで実現。
オブジェクト指向にむいてないCでむりやりオブジェクト指向を、っていう発想がそもそもエレガントじゃない気がする
型情報を表示さしたいのだが、俺の環境だと表示が何か変だ。これってなんで? --(practice.cpp)-- #include <iostream> //#include <typeinfo> <-あってもなくても結果は同じみたいだ class Test { }; int main() { int a; double b; Test t; std::cout << typeid(a).name() << std::endl; std::cout << typeid(b).name() << std::endl; std::cout << typeid(t).name() << std::endl; return 0; } (結果) i d 4Test なんで、 int double Test にならないんだ!?
>>980 VS2008での実行結果
int
double
class Test
俺はマック+g++だが、OSに依るのだろうか?コンパイラに依るのだろうか? i d 4Test のi、dは頭文字だと予想出来るが、Testの前は何なんだろう? 解釈可能?それとも全く意味不明?
いろいろやってみたが、内部の名前だね。 で、数字は名前の文字数。
typeidを使う実装はかなりの確率で
クソ設計になっていると思うが
その点は大丈夫か?
>>983 > 俺はマック+g++だが、OSに依るのだろうか?コンパイラに依るのだろうか?
いやだから実装に寄るんだろ。
例えば同じOSと同じコンパイラだとしても
絶対に同じ文字列が返るとは言い切れないんじゃない?
>>983 実際に何がしたいのか分からんが、
TMPのデバッグ中に型名を確かめたいときは
abi::__cxa_demangle()が役に立つかもしれない。
おぉ!数字は文字数だったか。気付かなかった。。ありがとう! ではそろそろ寝ます。おやすみ ( ゚o゚ )オ(゚▽゚)ヤ( ゚・゚ )ス(゚━゚)/~ミー
>>982 typeidは違う型はname()が絶対に違う、という事だけしか
規格票では保証されていないな
そうなんだ。。変なの。でも勉強になった、ありがとう
friend関数をテンプレートで定義したいのですが、こんぱいるエラーになります。 どこを修正すればいいかおしえてください もう2日寝てません #include <iostream> template <class T = double> class Test { private: T x; T y; public: Test (T a = 0, T b = 0): x(a), y(b) {} friend std::ostream& operator << (std::ostream&, Test); }; template <class T> std::ostream& operator << (std::ostream& stream, const Test<T>& a) { stream << a.x << " + " << a.y << "j\n"; return stream; } int main() { Test<float> t1(4, 7); std::cout << t1; return 0; }
一週間寝ないで考えてから出直してください
一週間は待てなそうなのでググったらでてきたぞ #include <iostream> template<class T> class Test; template<class T> std::ostream& operator << (std::ostream& stream, const Test<T>& a); template <class T = double> class Test { private: T x; T y; public: Test (T a = 0, T b = 0): x(a), y(b) {} friend std::ostream& operator << <>(std::ostream&, const Test<T>&); }; template <class T> std::ostream& operator << (std::ostream& stream, const Test<T>& a) { stream << a.x << " + " << a.y << "j\n"; return stream; } int main() { Test<float> t1(4, 7); std::cout << t1; return 0; }
うは BCCだとコンパイラの内部エラーだと 腐ってる
なに、コンパイラの内部エラーなんてよくある話だ。 俺も昨日CUDAのコンパイラがcatastorophe errorとか吐いて落ちたからな。
996 :
990 :2009/05/14(木) 01:52:38
>>993 出来るようになりました。有り難うございました。
猿真似的に実行出来るようになりましたが、内容が理解できてません。
なぜテンプレートクラス内に別のテンプレートの宣言(Tとは違うU)が必要になるのでしょうか?
>>996 実は990のコードを実行可能にする方法はもう1つある。
friendの中のTestをconst Test&にして外でこんな関数を作る。
std::ostream& operator << (std::ostream& stream, const Test<float>& a) {
stream << a.x << " + " << a.y << "j\n";
return stream;
}
>>993 では、template<class U>によってoperator <<が関数テンプレートだと解釈された。
無いと上のようにテンプレートでない関数と解釈される。
ここを見てそうだと思った(ちょっと書いてあること違うけど)。
http://www.fides.dti.ne.jp/~oka-t/cpplab-template-1.html このコードも今となっては駄目だったが。
.
.
1000ならジュースでも飲むか
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。