5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

スレを勃てるまでもないC/C++の質問はここで 9

1 :デフォルトの名無しさん:2009/04/18(土) 11:46:21
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

過去ログ
スレを勃てるまでもないC/C++の質問はここで
http://pc11.2ch.net/test/read.cgi/tech/1167476845/
スレを勃てるまでもないC/C++の質問はここで 2
http://pc11.2ch.net/test/read.cgi/tech/1178503366/
スレを勃てるまでもないC/C++の質問はここで 3
http://pc11.2ch.net/test/read.cgi/tech/1187521676/
スレを勃てるまでもないC/C++の質問はここで 4
http://pc11.2ch.net/test/read.cgi/tech/1221633708/
スレを勃てるまでもないC/C++の質問はここで 5
http://pc11.2ch.net/test/read.cgi/tech/1230516307/
スレを勃てるまでもないC/C++の質問はここで 6
http://pc11.2ch.net/test/read.cgi/tech/1231564903/
スレを勃てるまでもないC/C++の質問はここで 7
http://pc11.2ch.net/test/read.cgi/tech/1232983248/
スレを勃てるまでもないC/C++の質問はここで 8
http://pc12.2ch.net/test/read.cgi/tech/1235921779/

2 :デフォルトの名無しさん:2009/04/18(土) 12:03:41
   お     つ      だ     よ
  ∧,,∧    ∧,,∧    ∧,,▲   ∧,,∧
  (,,・∀・)   ミ,,・∀・ミ   (;;・∀・)   ミ,,・∀・ミ
〜(_u,uノ @ミ_u,,uミ @(;;;;uuノ 〜ミ_u,,uミ

3 :デフォルトの名無しさん:2009/04/18(土) 12:47:01
   ま     つ      た     け
  ∧,,∧    ∧,,∧    ∧,,▲   ∧,,∧
  (,,・∀・)   ミ,,・∀・ミ   (;;・∀・)   ミ,,・∀・ミ
〜(_u,uノ @ミ_u,,uミ @(;;;;uuノ 〜ミ_u,,uミ

4 :デフォルトの名無しさん:2009/04/18(土) 13:25:02
   ペ     二      ス     
  ∧,,∧    ∧,,∧    ∧,,▲   ∧,,∧
  (,,・∀・)   ミ,,・∀・ミ   (;;・∀・)   ミ,,・∀・ミ
〜(_u,uノ @ミ_u,,uミ @(;;;;uuノ 〜ミ_u,,uミ

5 :デフォルトの名無しさん:2009/04/18(土) 13:43:56
   こ     ん      ま     お     
  ∧,,∧    ∧,,∧    ∧,,▲   ∧,,∧
  (,,・∀・)   ミ,,・∀・ミ   (;;・∀・)   ミ,,・∀・ミ
〜(_u,uノ @ミ_u,,uミ @(;;;;uuノ 〜ミ_u,,uミ

6 :デフォルトの名無しさん:2009/04/18(土) 15:32:08
あやせはるかちゃんのおまんこは臭いかな?


7 :デフォルトの名無しさん:2009/04/18(土) 15:37:07
>>1乙!

8 :デフォルトの名無しさん:2009/04/18(土) 15:50:41
勢いでスレたててしまったが…。
ちょっぴり反省してみるorz

どこでもよいかもだけど
前スレの>>998
ソースの最後(どうでもよい)に
rewind(stdin);
getchar();
書くと入力待ちで止まるよ…

てかどうやってコンパイルしたのかな
IDEかな…

9 :デフォルトの名無しさん:2009/04/18(土) 16:01:03
rewind(stdin);を実行した結果は標準Cでは定義されていない

10 :デフォルトの名無しさん:2009/04/18(土) 16:04:37
Windows環境ならconio.hの
getch()が一番使いやすいと思うんだけど。


11 :デフォルトの名無しさん:2009/04/18(土) 17:27:15
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以外の数を入力したら下の顔文字が出力される。
と思ったらそうはなりません。
何処が間違ってるのでしょうか?
||ってこういう風には使えないのでしょうか?

13 :デフォルトの名無しさん:2009/04/18(土) 23:14:32
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
>>13
でけたー
ありがとー(o^_^o)

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()が終わっても自動的に閉じないようにするには、いったいどうすればいいのでしょう?
初歩の初歩の私ですが、どうかご教授をお願いします。

17 :デフォルトの名無しさん:2009/04/18(土) 23:23:42
スパゲッティが食べたくなった

18 :デフォルトの名無しさん:2009/04/18(土) 23:31:32
どっから突っ込んでいいやら・・・

まず人のソースを見て真似るところから始めれ
そんなソース書く奴今まで見たことないぞ

19 :デフォルトの名無しさん:2009/04/18(土) 23:47:57
>>16
最後の閉じないってのは単純にコマンドライン上でそのプログラムを実行すればいいんじゃね

20 :デフォルトの名無しさん:2009/04/18(土) 23:54:17
サンプルソース

#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;
}

21 :デフォルトの名無しさん:2009/04/19(日) 00:26:34
>>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上に存在する)

この場合ネットワーク越しにアクセス可能な共有メモリが
欲しくなってしまったのですが、ググってもズバリなページを
見つけることが出来ませんでした。
どなたかヒントになるような知識をお持ちの方、
お教え願えないでしょうか?

23 :デフォルトの名無しさん:2009/04/19(日) 00:47:12


24 :デフォルトの名無しさん:2009/04/19(日) 00:59:58
>>22
本当に共有メモリをネットワーク透過で使いたい場合、敢て挙げるなら分散共有メモリとか。
そうじゃなけりゃ分散オブジェクトとかでググれば?

25 :デフォルトの名無しさん:2009/04/19(日) 01:47:36
スレ違いだったらごめんなさい。
今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について一通り習いました。
考えたんですが、オセロとかは難しすぎますかね?

27 :デフォルトの名無しさん:2009/04/19(日) 01:59:38
「アドレス」は+1ずつ変化するとは限らんよ。
pが charへのポインタなら +1だけど、shortへのポインタなら +2される。

一般的に書くと、sizeof(ポインタが指す先の型)だけ変化する。

28 :25:2009/04/19(日) 02:04:35
>>27
理解はしていましたが文章の書き方がまずかったです(^^;)
ご指摘ありがとうございます。
他にはいかがでしょうか…?

29 :デフォルトの名無しさん:2009/04/19(日) 02:26:19
>>25
間違ってるところはない。

30 :デフォルトの名無しさん:2009/04/19(日) 02:26:49
>>26
俺もオセロ作ったけどCPUなしなら1か月もかからなかった

31 :デフォルトの名無しさん:2009/04/19(日) 02:27:08
>>28
コンパイラあるんなら自分でそれぐらい確認出来るだろ
エアコンパイラ状態?

32 :デフォルトの名無しさん:2009/04/19(日) 06:02:56
プログラム内で使う std::exception 派生の例外用のクラスを作って、throw(…) なんかも
きっちり書いてみたんですけど、でも例えば関数内で new に失敗して std::bad_alloc が
発生するようなケースを考えていると、結局は全て throw(std::exception) と書かなきゃ
いけないような気がします。throw の宣言はどう書くのが一般的 (慣例的になるか?) なんでしょうか。

33 :デフォルトの名無しさん:2009/04/19(日) 06:21:34
ANSI ではポインタをバイト単位のリニアな数値だなんて規定はしていなかったと思うが。
だから a と b が NULL 以外の同じメモリブロックを差していても a==b が true になる
保証はないし、当然ポインタ同士の減算結果も保証してない。具体的には DOS のような
16bit マシン上のラージメモリモデルなんかは ++ が sizeof(型) 増える保証なんてない。

34 :デフォルトの名無しさん:2009/04/19(日) 06:26:06
同じ集成体上のオブジェクトを差しているポインタ同士の減算は定義されていて、
要素数にしていくつ離れているかを返すことになっている。

35 :デフォルトの名無しさん:2009/04/19(日) 06:36:00
集成体って配列の事? 構造体も含む?
まぁ ANSI で正確にはどう規定されているかとかまでは知らんけど。

36 :デフォルトの名無しさん:2009/04/19(日) 06:42:21
構造体の中身は要素同士が連続してる保証がないから、構造体メンバのポインタの減算はできないはず。

37 :デフォルトの名無しさん:2009/04/19(日) 06:53:00
far ポインタナツカシス

38 :14,16:2009/04/19(日) 10:48:17
>>20-21
丁寧にありがとうございます。書いてないけど知りたかった改行の方法まで書かれてて、本当に助かります。
ところで、「%*c」というのはどういう意味なのでしょうか?

39 :デフォルトの名無しさん:2009/04/19(日) 10:49:01
ポインタの概念はわかるんですが、じゃあ何に使うの?って感じです。

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;
}

41 :デフォルトの名無しさん:2009/04/19(日) 10:57:04
>>38
ttp://ja.wikipedia.org/wiki/Scanf

42 :デフォルトの名無しさん:2009/04/19(日) 11:34:03


43 :デフォルトの名無しさん:2009/04/19(日) 11:34:45
>>40
ありがとうございます。

44 :デフォルトの名無しさん:2009/04/19(日) 11:41:37
すまんが質問させてくれ

今とあるクラス(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クラスの方が早いんだよね

みなさんならどうしますか?

45 :デフォルトの名無しさん:2009/04/19(日) 11:43:52
>>44
std::list使う。

46 :デフォルトの名無しさん:2009/04/19(日) 11:47:13
オブジェクト指向なら、Aが前後のインスタンスを意識するのは不自然じゃね?

47 :デフォルトの名無しさん:2009/04/19(日) 11:54:49
>>45-46
レス有難うございます

>>45
std::listですが、これはランダムアクセスが遅い為に考慮しませんでした
ランダムアクセスでも高速で取得出来る様な独自のリスト処理を
AクラスかBクラスのどちらかに追加しようと思っています

>>46
うーん、そうでしょうか?
オブジェクト指向だからこそ、Aクラス自信のインスタンスは
Aクラスで処理するものだと考えております

48 :デフォルトの名無しさん:2009/04/19(日) 12:07:31
原則としてAは自分自身のことだけ知っているべきで、自分がどう管理されるかは
管理するオブジェクトが知っていればいいんじゃないかな?
自分自身に next,prevがひっついてるとリスト構造を強要されるけど、
無ければ配列やハッシュマップなど他の管理方法をとることもできる。
あくまで原則論で、高速化などのために崩すこともあるけど。

49 :デフォルトの名無しさん:2009/04/19(日) 12:15:53
>>47
>ランダムアクセスでも高速で取得
なら、std::vectorを使えば?

50 :デフォルトの名無しさん:2009/04/19(日) 12:26:33
>32
どうせ役に立たないから書いたとしても throw() 以外書かない、が一般的。

Boost なら Avoid exception-specifications. ってなってる。
ttp://www.boost.org/development/requirements.html#Guidelines
C++ Coding Standards (Herb Sutter他著)でも Avoid exception specifications って節がある。

51 :デフォルトの名無しさん:2009/04/19(日) 12:43:47
>>48-49
レス有難うございます

>原則としてAは自分自身のことだけ知っているべきで、自分がどう管理されるかは
>管理するオブジェクトが知っていればいいんじゃないかな?
そうですね。有難うございます。
Bクラスの方にすることに決めました

>>49
Aクラスの情報を引き出す際にインデックスは勿論ですが
文字列名や保持してるデータと称号して、該当するデータを引き出すため
std::vectorでも相性が合わないため、考慮しませんでした。

レス下さった方々本当に有難うございました。

52 :デフォルトの名無しさん:2009/04/19(日) 13:18:11
自分のクラスにリスト頻繁に交える俺は間違ってたか…
tmp=getCreateAddress();
tmp->setData();
ってな感じ。自己拡張で便利何だけどな

53 :デフォルトの名無しさん:2009/04/19(日) 16:10:10
STLのbitsetで質問があります。

std::bitset<5> hoge;

これで5ビットの長さのビット配列が確保できると思いますが
これを実行時に決めたいのです。

どのようにすればいいのでしょうか?

54 :デフォルトの名無しさん:2009/04/19(日) 16:33:54
>>53

boost ライブラリでダイナミックに使えるやつがあるっぽいよ

ttp://www.kmonos.net/alang/boost/classes/dynamic_bitset.html

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;
}

望むような結果すら得られない。多分入力された整数と浮動小数点数を表示したいんだろうけどな。


57 :デフォルトの名無しさん:2009/04/19(日) 23:12:16
何という間違い探し
4ヶ所ほど見つけたけどめんどいから指摘しない
赤ペンで画面に書けるなら楽だけどw

58 :デフォルトの名無しさん:2009/04/19(日) 23:14:10
int main()
scanf("%lf",&d);
printf("%d\n",nan);
printf("%f\n",d);

59 :デフォルトの名無しさん:2009/04/19(日) 23:15:33
MDCでオフスクリーン描画して色々図形が忙しく動き回るプログラムなんですが
20秒ほど実行したところで、ウィンドウの×ボタンとかが変なところに表示され
一見動きが止まってしまいます
しかしALT+F4等ではちゃんと終了できる状態なんですが
これってどういう事なんでしょうか

60 :デフォルトの名無しさん:2009/04/19(日) 23:19:26
C言語を勉強しだしたタイミングも、勉強した時間も同じなんだけどなぁ…
といっても、俺もあまり変わらないくらいのものしか書けないんだけどな。

あと、この友人には英語の勉強が必要な気がする。
「numはnumberの略なんだよ」っていうのを聞いてこの友人が書いたのが「nan」だからな。
ちなみに昨日はritan 0;って書いてたし。


同じような処理のものを書いてみたらどうなるんだろうと自分でも書いてみたけど、最初のコンパイルでいきなりエラーが出て泣きたくなった。

61 :デフォルトの名無しさん:2009/04/19(日) 23:39:08
>>50
ありがとうございます。使いどころについてあれこれ思案してみたんですけど、
「宣言外 (つまり想定外) の例外は全部 abort ルーチンに行けば良い作り」という
限定的な状況で有用なものですよね。

呼び出し上位の try-catch で自前例外も汎用 std::exception も対応している設計だと
throw(何とか) 宣言はあまり意味がなさそうです。

62 :デフォルトの名無しさん:2009/04/20(月) 00:52:21
>>61
あと、いちいちチェックしないといけないのでthrow()以外の例外指定を使うと性能面で不利という話もあったはず。

63 :デフォルトの名無しさん:2009/04/20(月) 01:12:03
>>32
その関数のなかでstd::bad_allocを回収して対処ができるならcatchすればいいし、
メモリアロケートに失敗したらもうお手上げだって言うなら、上位のハンドラに任せればいい。

64 :デフォルトの名無しさん:2009/04/20(月) 01:18:13
参照について質問です。
const Telegram& telegram = *PriorityQ.begin();
BaseGameEntity* pReceiver = EntityMgr->GetEntityFromId(telegram.Receiver);

Telegram構造体の参照 telegramに対してtd::set<Telegram> PriorityQのbegin()に
間接参照演算子をつけて代入しています。
ここをconst Telegram&にする理由がわかりません。
const Telegramにしてもコンパイル通るのですが、どういう違いがあるんでしょうか?


65 :デフォルトの名無しさん:2009/04/20(月) 11:14:10
const Telegram&だとアドレスコピー
const Telegramだと代入コピー

const Telegram& telegramの方だと
*PriorityQ.begin()の中身が変わっても、telegramの参照先は中身が変わる
const Telegram telegramの方だと
*PriorityQ.begin()の中身が変わっても、telegramの参照先は代入コピーされた時のまま、つまり中身は変わらない

66 :デフォルトの名無しさん:2009/04/20(月) 11:16:53
おっと、文法を間違えた
×*PriorityQ.begin()の中身が変わっても、telegramの参照先は代入コピーされた時のまま、つまり中身は変わらない
○*PriorityQ.begin()の中身が変わっても、telegramの中身は代入コピーされた時のままなので、*PriorityQ.begin()が変わっても反映されない

67 :デフォルトの名無しさん:2009/04/20(月) 12:08:08
>>59
リソースリークしててどんどんリソース消費してると
そういう現象になる場合があるよ

68 :デフォルトの名無しさん:2009/04/20(月) 15:29:05
現在文法を覚えた段階でこれからwindowsアプリを勉強しようと考えているのですが
APIやら.NETやら色々あってよく分かりません
最終的にはDirectXに触れたいのですが全く理解できませんでした
まずなにからやればよいのでしょうか?

69 :デフォルトの名無しさん:2009/04/20(月) 15:52:02
C言語で配列の境界チェックを行うようなオプションを備えたコンパイラはありませんか?
今はVC++2008を使っています。

70 :デフォルトの名無しさん:2009/04/20(月) 15:57:36
>>65
なるほど!よくわかりました。ありがとうございます。

71 :デフォルトの名無しさん:2009/04/20(月) 16:11:29
>>69
C++Builder2009付属品のCodeGear C++ Compilerを使えば
CodeGuardオプション-vGを付けてコンパイルすればアクセスオーバーラン
を実行時に検出してログを出力してくれる

72 :デフォルトの名無しさん:2009/04/20(月) 16:20:38
>>68
Windows SDKから学ぶといいよ

73 :デフォルトの名無しさん:2009/04/20(月) 16:38:45
>>71
ありがとうございます

74 :デフォルトの名無しさん:2009/04/20(月) 16:48:43
今も昔も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)); みたいな感じのほうがいいよねっ!!

なにか深い理由があって今のようになったのか、なんとなくなのか
仕様策定当時、反対意見はあったのか、なかったのか知りたいです


76 :デフォルトの名無しさん:2009/04/20(月) 17:22:29
>>69
VC++だったら、/GS オプション。


77 :デフォルトの名無しさん:2009/04/20(月) 20:40:20
知識ゼロなんだが何から始めればいいのか教えてくれないか

78 :デフォルトの名無しさん:2009/04/20(月) 20:51:43
>>77
知識ゼロならまずパソコンの電源のON・OFFからだな。
それからマウスの使い方と…(ry

…んでプログラミングをしたくなったら、
どのくらいになりたいかを決めるべき。
1.単なる遊びや趣味(職業プログラマではない)&&実用を求めない
2.単なる遊びや趣味(職業プログラマではない)&&実用を求める。
3.職業ではないが、フリーソフトを公開するなど準プロレベルで相当やり込みたい。
4.職業プログラマになりたい。
5.神級ハッカーになりたい。


79 :デフォルトの名無しさん:2009/04/20(月) 20:54:06
適当な入門書買ってきてそれを一通りこなせ。
なるべく高いヤツ買うと、途中で投げ出すのがもったいなくって続くかも。

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++ばっかなんだよ。。。


83 :デフォルトの名無しさん:2009/04/20(月) 21:10:42
doubleのfはfloat
intのdは何の略か教えて

84 :デフォルトの名無しさん:2009/04/20(月) 21:16:20
digitかな?

85 :デフォルトの名無しさん:2009/04/20(月) 21:25:16
>>83
digitだという説と、あとなんか別のd****だっていう説を聞いた気がする。
でも忘れた。

86 :デフォルトの名無しさん:2009/04/20(月) 21:26:23
decimalだろう。
対照的に%iは八進・十六進でも入力できる指定なのだから。
(printf系では%dと%iで違いはないけど)

87 :デフォルトの名無しさん:2009/04/20(月) 21:39:29
>>86
decimalって小数点って意味じゃない?
と思いきや10進数decimal numberのことか。

88 :77:2009/04/20(月) 21:40:03
2kぐらいの分かりやすそうな本買ってきた

C言語超入門って技術論社の奴だ

勉強してみるよ

89 :デフォルトの名無しさん:2009/04/20(月) 22:07:28
std::vector<hogehoge *> hoge;

のようにstd::vectorでクラスポインタの連結を使用としたんですが
hoge.push_back( new hogehoge( ) );
と書くと、push_back時に勝手に(new hogehoge( ))が更にコピーされる為
new hogehoge( )の分がメモリリークしてしまうんですが

これは大人しく
std::vector<hogehoge> hoge;
と書くべきでしょうか?

↑だと沢山連結しようとすると何か遅い気がするのですが
そうでもないでしょうか?

90 :デフォルトの名無しさん:2009/04/20(月) 22:33:01
>>89
boost::ptr_vector使え

解放すると勝手にデストラクタを呼び出す

91 :デフォルトの名無しさん:2009/04/20(月) 22:34:39
>>89
あとクラスhogehogeのコピーコンストラクタを正しく書け

92 :デフォルトの名無しさん:2009/04/20(月) 22:42:50
>>89はメモリリークする原因を勘違いしてたんじゃないか?

93 :77:2009/04/20(月) 23:00:31
コマンドプロンプトに三角形の面積計算させるまでは出来たんだが
ここの住人はコンパイル作業コマンドプロンプトでやってるのか?

94 :デフォルトの名無しさん:2009/04/20(月) 23:10:23
>>93
環境によってそれぞれだろ。

95 :デフォルトの名無しさん:2009/04/20(月) 23:10:54
>>90-92
有難うございます
コピーコンストラクタは書いていませんでした

>>89はメモリリークする原因を勘違いしてたんじゃないか?
std::vectorに渡したクラスのアドレスと
vectorから引き出したクラスアドレスは異なっていましたので
vectorに渡す際のnew hogehoge( );は解放されずリークしていました

96 :デフォルトの名無しさん:2009/04/20(月) 23:17:24
>>95
vectorに渡したポインタが取り出すときに違うってのは、ないと思うんで、
どっかでバグってるんじゃないの?

97 :デフォルトの名無しさん:2009/04/20(月) 23:31:27
hogehoge*をvectorに入れたら
デストラクタが明示的に呼ばれないけどちゃんと消してる?

98 :デフォルトの名無しさん:2009/04/21(火) 00:06:06
scanf()で浮動小数点を入力して、printf()で浮動小数点を出力してるんだけど、どうしても12.3600000000みたいになるんだけど…。12.36みたいにする方法って無いの?

99 :デフォルトの名無しさん:2009/04/21(火) 00:06:25
%g

100 :デフォルトの名無しさん:2009/04/21(火) 00:07:21
>>93
メインはIDEでやるにせよ、簡単なクラスの単体テストとかはコマンドでやることが多いかな。
でも人それぞれだな。

101 :デフォルトの名無しさん:2009/04/21(火) 00:11:16
>>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クラスが大丈夫なほうかだめな方かはソースを見ている君にしか分からない。




103 :デフォルトの名無しさん:2009/04/21(火) 00:19:24
ポインタだけをコンテナに入れているのに「さらにコピー」とかおかしいよな

104 :デフォルトの名無しさん:2009/04/21(火) 00:37:12
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;
}


105 :デフォルトの名無しさん:2009/04/21(火) 00:38:19
>>98
printf("d=%.2f\n", d);

106 :デフォルトの名無しさん:2009/04/21(火) 00:39:16
コンパイラはinlineキーワードを無視できる
実際にinlineが適用されているかどうかはデバッガで
コンパイラが吐き出したコードを覗いてみるしか知る方法が無い

107 :デフォルトの名無しさん:2009/04/21(火) 00:49:32
まぁ、やってみろ。

108 :77:2009/04/21(火) 01:00:03
いまの店員シミちゃんだろ

109 :デフォルトの名無しさん:2009/04/21(火) 01:14:48
for文を使って2の0乗から10乗まで全て足していくプログラムはどうやって作りますか?

110 :デフォルトの名無しさん:2009/04/21(火) 01:16:52
int num = 0;
for(int i=0; i<=10; i++) num += (1 << i);


111 :デフォルトの名無しさん:2009/04/21(火) 01:20:15
printf("%d", 0x7FF);

112 :デフォルトの名無しさん:2009/04/21(火) 03:46:45
関数内で static 宣言された変数の領域ってマルチスレッド環境でスレッドごとに別になりますか?

113 :デフォルトの名無しさん:2009/04/21(火) 04:02:46
よく考えたらそんなわけないですね。スレッド固有のメモリ領域を使いたい場合は malloc で動的に
確保しなきゃだめですか? itoa() とかどうやってるんだろ。

114 :デフォルトの名無しさん:2009/04/21(火) 04:16:00
atoi() は内部の static なバッファを返しているのかとカンチガイしていました orz

115 :デフォルトの名無しさん:2009/04/21(火) 04:18:30
×atoi()
○itoa()

もう寝るぽ…

116 :デフォルトの名無しさん:2009/04/21(火) 05:02:07
例外で throw されるオブジェクトのスコープって catch ブロック内まで有効なんですか?
throw しているブロックのスタックが巻き戻されたら無効になりそうなんですけどどういう
仕組みになってるんですか?

try{
  foo();
} catch(const my_exception& ex){...}

foo(){
  throw my_exception();
}

117 :デフォルトの名無しさん:2009/04/21(火) 12:03:04
modelクラスからViewクラスに幾つかの値を渡したいのですが
やりとりする値を格納するData構造体をmodel内に所有させて
Data* GetData();
というGetterで渡して覗き見させてたのですが
modelの派生クラスで扱う値が増えた場合
Data構造体も派生させるとview側でダウンキャストが必要になりあまり良くない気がしますし
Data構造体に全ての値を持たせると親クラスでは使わないデータも持たせることになりこれもきれいじゃない気がします
MODELとViewを連携させる良い仕組みは無いでしょうか

また、派生して拡張、という行為自体がis-aに相応しくない気がするのですが
こういう場合はどういうクラス構造にしたらよいでしょうか

118 :デフォルトの名無しさん:2009/04/21(火) 12:06:22
使わないデータを持つのは普通かと

119 :デフォルトの名無しさん:2009/04/21(火) 12:26:55
>>117
派生クラスで追加したい変数は Dataの外にメンバ変数として持たせればいいのでは?
getメソッドも新たに追加した変数ごとに追加する。

120 :デフォルトの名無しさん:2009/04/21(火) 13:09:14
拡張部分は所有させれば良いのだろうが
今度は多態的に利用するときに、拡張部分へアクセスできるインターフェイスをどうするかで悩むんだりする

121 :デフォルトの名無しさん:2009/04/21(火) 13:17:38
多態的な利用をする際には、拡張部分にアクセスする必要は無いんじゃないかな。
もしそのインスタンスに拡張部分があることを知ってるのならば、子クラスのインスタンスだ
とわかってるはずなんだし。

122 :デフォルトの名無しさん:2009/04/21(火) 13:45:35
>>113
環境による
スレッドローカルで調べてみては

123 :デフォルトの名無しさん:2009/04/21(火) 20:58:34
32.0f
ってあった場合、末尾のfって何を表してるんでしょうか?

124 :デフォルトの名無しさん:2009/04/21(火) 20:59:51
>>122
ありがとうございます。やっぱりプラットフォーム固有の方法になりますよね。

125 :デフォルトの名無しさん:2009/04/21(火) 21:02:19
>>123
float型リテラル

126 :デフォルトの名無しさん:2009/04/21(火) 21:45:59
>>123
32.0だとdouble型定数扱い。
ところが32.0fって言う風にfを付けるとfloat型定数扱いにしろっていう意味になる。

127 :123:2009/04/21(火) 22:35:07
>>125-126
ありがとうございます!


128 :デフォルトの名無しさん:2009/04/21(火) 22:53:31
double型の変数をchara型の配列に変換するのでかっこいい方法ありませんか?
sprintfとかそんな関数できるだけ使わずにforとかビット演算とか出来るなら再帰関数
を使ってカッコよく書きたい

129 :デフォルトの名無しさん:2009/04/21(火) 22:59:11
(char*)&d;

130 :デフォルトの名無しさん:2009/04/21(火) 23:21:01
>>128
union
>>129
それじゃポインタだろう

131 :デフォルトの名無しさん:2009/04/21(火) 23:21:44
難しさで並べると

クラス1 C++
クラス2 C
クラス3 Java
クラス4 C#
クラス5 PHP

これであってますか?

132 :デフォルトの名無しさん:2009/04/21(火) 23:33:28
クラス1 C++
クラス2 C
クラス3 C#
クラス4 Java
クラス5 PHP

133 :デフォルトの名無しさん:2009/04/22(水) 00:20:56
言語それぞれに違った難しさがあると思う

C    メモリー管理が大変、変数が関数の先頭にあるので読みづらい
C++   テンプレートゴリゴリ使われたらデバッグ大変かも
C#   つかったことないけどマイクロソフト仕様で苦労するかも GUI向け?
Java  ライブラリ覚えるまで苦労しそう、開発環境整えるのに一苦労?
PHP   セキュリティー面の心配とHTMLと混じると読みづらいとか?

正直C++以外わからんヽ(´ー`)ノ

134 :デフォルトの名無しさん:2009/04/22(水) 01:05:00
>C    メモリー管理が大変、変数が関数の先頭にあるので読みづらい
それは書いている奴がロートルなのか、ロートルに教わった不勉強の所為。
普通は、適宜ブロック内で定義するから関数の先頭に纏まる訳ではない。
それと、C#も.Netの関数を把握するまでは思うように使いこなせないと思う。
尤も、Cだとそう言った便利な関数が殆どないから全部手作りになるけど。

135 :デフォルトの名無しさん:2009/04/22(水) 01:21:09
変数定義は関数の最初にまとめる方式の方が
どこで定義してるかわかりやすくなっていい

136 :デフォルトの名無しさん:2009/04/22(水) 01:23:27
なるほど、余程だらだらと長い関数を書いているんでしょうね。

137 :デフォルトの名無しさん:2009/04/22(水) 01:29:38
変数の寿命は短く、とコードコンプリート様は言っておられる。

138 :デフォルトの名無しさん:2009/04/22(水) 01:30:08
変数定義の場所探すのなんかIDEに頼れよ

139 :デフォルトの名無しさん:2009/04/22(水) 01:57:48
定義場所をわかりやすく表示してくれるIDEがない。

140 :デフォルトの名無しさん:2009/04/22(水) 02:02:21
君の言う分かりやすさとは?

141 :デフォルトの名無しさん:2009/04/22(水) 02:28:58
コード読まなくてもわかること。

142 :デフォルトの名無しさん:2009/04/22(水) 03:18:09
関数の先頭に書かれていても読まなきゃ何もわからんわ

143 :デフォルトの名無しさん:2009/04/22(水) 05:32:51
>>135
え?
時代に逆行しすぎだろw

144 :デフォルトの名無しさん:2009/04/22(水) 07:13:43
DATA DIVISION.
WORKING-STORAGE SECTION.

145 :デフォルトの名無しさん:2009/04/22(水) 09:28:53
全部ブローバルで宣言しとけ

146 :デフォルトの名無しさん:2009/04/22(水) 09:35:33
char* buffer;
char *buffer;

* をどっちよりに付けるか人によって違うけど何か違うの?

147 :デフォルトの名無しさん:2009/04/22(水) 10:02:00
char *p;
は昔ながらの記述方式。今でも標準

char* p;
は比較的新しい記述方式

char* p1, p2;
と書くとp1はchar*だけど、p2はcharなので注意

typedef p_char char*;
p_char p1, p2;
と書くとp1, p2ともchar*

俺は場面によってどちらが見やすいかで使い分けてるけどな

148 :デフォルトの名無しさん:2009/04/22(水) 10:42:34
>>147
これはひどい

149 :デフォルトの名無しさん:2009/04/22(水) 10:49:02
64bit 環境になると C/C++ のポインタが 64bit になったりするの?
今 Java のオブジェクトに C のポインタをハンドラとして持たせようとしているんだけど
long にするか int で良いのか迷ってます。

150 :デフォルトの名無しさん:2009/04/22(水) 10:50:31
>typedef p_char char*;
>p_char p1, p2;
これはマジ辞めてくれ。for文の中でgotoで無理やりループを見たときと同じ衝撃だ

151 :デフォルトの名無しさん:2009/04/22(水) 10:53:19
LPSTRでも衝撃受けたのかw

152 :デフォルトの名無しさん:2009/04/22(水) 11:05:58
ま、必要以上にtypedefされたら読みにくくてしょうがない
常にIDEでソースを読むわけじゃないし

ttp://ja.wikipedia.org/wiki/Typedef

・批判
一部の人々は、typedefを広範に使用することに反対している。
ほとんどの議論は、typedefは単に変数の実際のデータ型を隠すだけであるという考えに集中する。
例えば、Linuxカーネルハッカーであり、ドキュメント作成を行っているGreg Kroah-Hartmanは、
関数プロトタイプ宣言を除いて、typedefの使用をやめさせようとしている。
彼は、typedefを使用することが、必要以上にコードを混乱させるだけでなく、
プログラマが巨大な構造体を単純な型と誤認識して使用してしまうことがあると主張している。

153 :デフォルトの名無しさん:2009/04/22(水) 11:12:20
>>151
衝撃受けたな。WinSDKの構造体やらはポインタは全てLP***ってなってるけど
俺は使うときは必ずTCHA *pszHoge;とかにしてるよ。LP***は絶対に使わない

154 :デフォルトの名無しさん:2009/04/22(水) 11:14:29
へえ、
>gotoで無理やりループを見たときと同じ
衝撃なのか、変なやつだな。

155 :デフォルトの名無しさん:2009/04/22(水) 11:15:36
API(やヘッダファイル)の指定とわざわざ違うように定義すると他人が読みづらいよな。

156 :デフォルトの名無しさん:2009/04/22(水) 11:19:50
time_t変数を足して2で割って、早々に2038年問題を引き起こして大トラブルになった事例があったな
time_tがlongでtypedefされてることを意識してればあるいは防げたかもしらん

157 :デフォルトの名無しさん:2009/04/22(水) 11:20:27
LPSTR は衝撃的だった。というか LP〜 が本当に有用なら * なんて記号使わないで
言語仕様がそうなるんじゃ。

158 :デフォルトの名無しさん:2009/04/22(水) 11:23:02
LPのLってlongかな(large, linearかもしらんが)
nearポインタとかfarポインタの名残りっぽいけど
いつまで引っ張るんだよw

159 :デフォルトの名無しさん:2009/04/22(水) 11:23:07
なんだ、ハンガリアン記法も知らない新人かよ
有用性は置いておくとして

160 :デフォルトの名無しさん:2009/04/22(水) 11:25:13
最近はまたポインタのサイズを気にしないとならなくなってきてるな。
混在することはまずないんだけど。

161 :デフォルトの名無しさん:2009/04/22(水) 11:37:11
真っ黒ソフトが先走って/Wp64コンパイラオプションを導入したけど
すでに廃止される予定とか、混乱の悪寒

162 :デフォルトの名無しさん:2009/04/22(水) 12:04:41
>>153
( ・∀・)人(・∀・ )ナカーマ
俺もLPシリーズはイライラするので使わない。

163 :デフォルトの名無しさん:2009/04/22(水) 12:28:44
LPなんとかに限らないが、Windowsの方言使うのは、Windowsとのインタフェース部分だけにしてほしい。
Windowsと関係ないアプリケーションのコアは普通のC/C++で書いてくれ。

164 :デフォルトの名無しさん:2009/04/22(水) 12:56:31
LP〜よりもTCHARの方がイヤだな
あれのおかげで余計な手間が増えた気がする

165 :デフォルトの名無しさん:2009/04/22(水) 12:59:46
Cで_T("hoge")とかL"hoge"するくらいなら
スパッとJavaに移行したい

166 :デフォルトの名無しさん:2009/04/22(水) 13:45:25
java は変数名や関数名に漢字が使えるのが便利でいいよね。

167 :デフォルトの名無しさん:2009/04/22(水) 13:50:55
漢字識別子は IME の切り替えが面倒だし、目が全角と半角でコード部分と
コメント/文字リテラル部分を見分けるように慣れてしまっているから、
意外と辛い。定数くらいならなじみのない英単語や妙ちくりんなローマ字を
こねくり回さなくて済むので便利だが。

168 :デフォルトの名無しさん:2009/04/22(水) 13:52:09
最近は変数名や関数名に漢字使うのが流行なのか?

169 :デフォルトの名無しさん:2009/04/22(水) 14:08:19
C/C++に関係あんのか?

170 :デフォルトの名無しさん:2009/04/22(水) 14:08:57
ある

171 :デフォルトの名無しさん:2009/04/22(水) 15:18:49
プログラミング言語「は」なら漢字の識別子が使えたはず

172 :デフォルトの名無しさん:2009/04/22(水) 15:47:27
ara-rieki とか uriage とかよりも 幼女 とか 雌豚 とかの方が断然いい。

173 :デフォルトの名無しさん:2009/04/22(水) 15:52:20
そこは 粗利 とか 売上 にしとけよw

174 :デフォルトの名無しさん:2009/04/22(水) 16:40:55
>>20のサンプルソースで、入力待ちするのに「scanf("%*c");」だけを書いてるが、これってどういうことなんだ?
これを使ったときって、うまくいくときといかないときがあるんだが…。
char c; scanf("%c%*c",&c);をやると、二回エンターを押さなきゃいけないときと一回でいいときとあるし…。これはどういう要因でなるの?



175 :デフォルトの名無しさん:2009/04/22(水) 17:12:48
>>149
一応書いておくと、64ビットアプリではポインタも64ビットになるのが普通。

176 :デフォルトの名無しさん:2009/04/22(水) 17:42:56
配列と再帰データ型とはどうちがうのでしょうか?


177 :デフォルトの名無しさん:2009/04/22(水) 17:55:01
>>176
配列はしょせん有限の要素数しかない。
再帰データ型はその名の通り、理論上はどこまでも続くように値を構成できる。

178 :デフォルトの名無しさん:2009/04/22(水) 18:37:55
IE8を結構使ってます
そして履歴が残るはずなんですが
新しくタブを開いたとき、前の履歴が表示されるはずなんですが
これが消えてます
こんな感じで ひとつの履歴は残ってるんですが
残りふたつの履歴が残っていないのです
http://jun.2chan.net:81/b/src/1240381925587.jpg

キャッシュも十分な領域を確保しました

PC板は使えない連中なので
すいません

179 :デフォルトの名無しさん:2009/04/22(水) 18:39:32
>>178
死ね

180 :デフォルトの名無しさん:2009/04/22(水) 18:42:52
板違い。
あー、Win板にもIE8スレとかあるけどそっちはどう?

181 :デフォルトの名無しさん:2009/04/22(水) 18:45:14
>>178
あー予想通りやっぱりバグってるな
バグフィックスされるまでIE7で様子見だな

182 :デフォルトの名無しさん:2009/04/22(水) 19:02:13
やっぱIE8にしなければよかった

183 :デフォルトの名無しさん:2009/04/22(水) 19:10:12
恋のインクリメントはまだですか?

184 :デフォルトの名無しさん:2009/04/22(水) 19:14:34
int i = 0;
while(i)
i++;

たいへんなコードです!
いつまでも放置しているととても危険です!

185 :デフォルトの名無しさん:2009/04/22(水) 19:53:10
一瞬で終わるだろw

186 :デフォルトの名無しさん:2009/04/22(水) 19:56:45
int i = 1; ですた

187 :デフォルトの名無しさん:2009/04/22(水) 19:57:29
1にしてもたいして時間かからずに終了するだろ

188 :デフォルトの名無しさん:2009/04/22(水) 19:58:34
for(int i=strlen(str)-1; i>=0; i++)

189 :デフォルトの名無しさん:2009/04/22(水) 20:12:51
オーバーフローで負になるから、すぐにとまる

190 :デフォルトの名無しさん:2009/04/22(水) 20:16:17
まぁオーバフロー自体未定義動作なんだからあながち間違ってはいない
実際はともかく

191 :デフォルトの名無しさん:2009/04/22(水) 21:48:10
ところで、配列の終わりのひとつ後へのインクリメントは有効とK&Rに書いてあるんdeathが
配列のはじめのひとつ前へのデクリメントは有効なのでしょうか?
(どちらもポインタの指す値が無意味なのは承知の上ですが…)

char s[10];

char *p
p = &s[9];
++p; // 有効

p = &s[0];
--p; // ←コレ

192 :デフォルトの名無しさん:2009/04/22(水) 21:53:49
>>191
それはダメよん

C++のSTLもその当たりを考慮してわざわざリバース・イテレータ
というものを提供している

193 :デフォルトの名無しさん:2009/04/22(水) 22:11:04
すまん質問させてくれ
hogecls &(hogecls::operator=)(const hogecls &obj)
{
if(this != &obj)
{
this->hoge = obj.getHogehoge( );
}
return *this;
}

上のように代入コピーを行ってるんだが
gccやborlandではビルド成功して動作するのに
VCだけ、const hogehoge &がthisポインタとして動作しないようなエラーが発生する
((hogehoge *)&obj)->getHogehoge( );
だとビルドは成功するが、勿論不正落ち

どうしたらいいだろうか・・・

194 :デフォルトの名無しさん:2009/04/22(水) 22:32:52
関数のアドレスを取得するのに、
関数名と&関数名のどっちが正しいの?
例えば
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++ではどっちも通るんだけど。。。


195 :デフォルトの名無しさん:2009/04/22(水) 22:37:36
>>193
いやそれだけでどうしろと・・

>>194
どっちでもいいと正式に定められてる

196 :デフォルトの名無しさん:2009/04/22(水) 22:42:14
>>194
どちらでも正しいです。関数名は関数のアドレスを返すという規約なので。
ちなみに、クラスのメンバ関数も修飾::名前でアドレスを返すはずなんですが
VC++2009では&をつけないとエラーになります。不思議です。

197 :デフォルトの名無しさん:2009/04/22(水) 22:42:48
>>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);
これはどれでも良いってのはしってる。
でも状況次第で何故かだめなことがある気がするのだが・・・
今更ながら、全コンパイラが標準仕様を守っているわけではないと言うことか。

199 :デフォルトの名無しさん:2009/04/22(水) 22:51:34
>>197
そりゃさすがにエラーになったぞ

200 :デフォルトの名無しさん:2009/04/22(水) 22:52:03
C89すら満足できないようなコンパイラ使ってるなら、今すぐマシンごと窓から投げ捨てるべき。

201 :デフォルトの名無しさん:2009/04/22(水) 23:08:40
前はあるコンパイラの独自仕様だったのが、便利だからそれがひろまったって聞いたんだけど。

202 :デフォルトの名無しさん:2009/04/23(木) 01:39:36
>>192
ありがとうございます。ということは、巻き戻し処理の時は
先頭でぴったりとまるような条件分岐にする必要があるっていうことですよね・・・うーむ。

203 :デフォルトの名無しさん:2009/04/23(木) 05:44:40
といっても、参照するのは問題外だからおいとくとして

先頭をこえるデインクリメントは
オーバーフローする危険があるからだめ→オーバーフロー後は未定義動作
って話なので、実際のところ一つ前を指しても問題は起こらないけどね


204 :デフォルトの名無しさん:2009/04/23(木) 07:19:57
たった一つのダミーエリアを設けるだけで安全なのに?

205 :デフォルトの名無しさん:2009/04/23(木) 13:56:37
0 と -0 は違うのでしょうか?

206 :デフォルトの名無しさん:2009/04/23(木) 14:01:04
同じ

207 :デフォルトの名無しさん:2009/04/23(木) 14:07:21
2の補数表現で考えれば0と-0はビットパターンが同じになる

208 :デフォルトの名無しさん:2009/04/23(木) 14:10:06
質問です。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 の配列があります。
--

209 :デフォルトの名無しさん:2009/04/23(木) 14:30:07
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の値が分からないからね。

210 :デフォルトの名無しさん:2009/04/23(木) 14:33:42
>>205
IEEE754の話?
ビットパターンとしては符号ビットがセットされているものとされてないものという区別があるけど本質的にはどちらもゼロの意味。

211 :デフォルトの名無しさん:2009/04/23(木) 16:54:41
IEEE754が何かは知りませんが
00000000(2) と 10000000(2) の2種類が存在しますよね?

ためしに
int i = 0;
int j = -0;
やってメモリも見ましたが 同じ0x00000000 でした

この場合10000000(2) は表現できないのでしょうか?

これといった使い道は思いあたりませんが
技術的興味からです

あえていえば 10000000(2) を右シフトして -0 から値を生成するとかどうでしょうかね?

212 :デフォルトの名無しさん:2009/04/23(木) 16:59:48
>>209
レスありがとう。
そんな書き方できるとは思いませんでした。
enumでいけるんですねぇ。汎用性考えてEnumのほう使ってみます。
助かりました。

213 :デフォルトの名無しさん:2009/04/23(木) 17:01:57
>>211
2の補数でぐぐれ
8bitの整数だとして
10000000 は -128 だボケ死ね

214 :デフォルトの名無しさん:2009/04/23(木) 17:02:37
>>211
その問題は数学者に聞いたほうが良い解がもらえそう。
コンピュータ的には0が2個あるといろいろ不便だと思う。
IEEE754は浮動少数の国際規格だっけ??

215 :デフォルトの名無しさん:2009/04/23(木) 17:03:36
Cのintは2の補数だから-0は表現できない
つか1の補数を表現するような言語は身近にないかも

216 :デフォルトの名無しさん:2009/04/23(木) 17:12:52
>>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;
}

217 :デフォルトの名無しさん:2009/04/23(木) 17:44:32
>>215
いや、Cに2の補数でないといけないなんて縛りはないぞ。
見かけないのは2の補数以外を使うアーキテクチャが絶滅しかけているため。

218 :デフォルトの名無しさん:2009/04/23(木) 17:51:35
だって1の補数だったら!0 == -0になって困るじゃん

219 :デフォルトの名無しさん:2009/04/23(木) 18:12:10
1の補数でも!0!=-0だろ

220 :デフォルトの名無しさん:2009/04/23(木) 18:15:06
>>218
偽になる整数値が+0と-0の二種類になるだけでは?

221 :デフォルトの名無しさん:2009/04/23(木) 18:40:05
まぁ ゆっくり精進しよう

222 :デフォルトの名無しさん:2009/04/23(木) 22:45:35
ところで、一平見てるか?

223 :デフォルトの名無しさん:2009/04/24(金) 01:50:11
>>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;
}

224 :デフォルトの名無しさん:2009/04/24(金) 02:15:59
staticなグローバル変数で10KBの領域取って使うのと
ヒープで10KBの領域とって使うのって
どっちが高速なんでしょうか?
ログをまとめて吐くためのバッファにしようとしてます。

225 :デフォルトの名無しさん:2009/04/24(金) 02:22:34
>>224
MBとかGB単位でメモリ積んでいるパソコンなら違いはないと断言しよう。
その他の利点・欠点を勘定して決めろ。

226 :デフォルトの名無しさん:2009/04/24(金) 02:23:49
了解しますた

227 :デフォルトの名無しさん:2009/04/24(金) 11:23:55
テキストファイルを一行ずつ読んで
それぞれの行で空白やカンマを区切りに分割して色々処理したいときに
strtokとか使わないc++ぽい一番簡潔な方法を教えて下さい

228 :デフォルトの名無しさん:2009/04/24(金) 11:27:10
>>227
Boost使う。


229 :デフォルトの名無しさん:2009/04/24(金) 11:31:02
>>228
Boostのなんですか正規表現ですか

230 :デフォルトの名無しさん:2009/04/24(金) 11:35:46
ちょっとぐらいはぐぐってくれ。
Boostは次世代C++に取り込まれるライブラリを目指して開発されている。
実際にBoostから標準に採用されているものもある。
で、boost::tokenizerが貴方にぴったりでしょう。

231 :デフォルトの名無しさん:2009/04/24(金) 11:38:45
>>230
どうもです
標準だけじゃ簡単にはいかんということですか

232 :デフォルトの名無しさん:2009/04/24(金) 11:51:37
標準が良いなら以下のような記事を見つけた。ちょっとしたハックだな。ちなみに、ぐぐって一件目。。。
ttp://d.hatena.ne.jp/t_suwa/20070113

俺は文字処理あんまり得意じゃないけど、STLつかってSplitくらいは実装できると思うよ。
だからがんばれ!

233 :デフォルトの名無しさん:2009/04/24(金) 11:55:32
>>232
良い記事をありがとう
空白のあとカンマ区切りなんですぐ応用できそうです


234 :デフォルトの名無しさん:2009/04/24(金) 11:56:15
一方私はsscanf()を使った切り出し関数を用意している。
C99版は可変長配列を使っているし、C++版はstd::vectorを使っている。

235 :デフォルトの名無しさん:2009/04/24(金) 13:03:25
boostとか他人のライブラリ使うのは抵抗があるな
boostって便利なのか?

236 :デフォルトの名無しさん:2009/04/24(金) 13:06:40
>>235
俺もできるだけ使いたくない。
けど、正規表現のためだけに使ってる。

237 :デフォルトの名無しさん:2009/04/24(金) 13:11:50
出来ることならC++標準の範囲内ですませたいよねぇ
いつでもboostとか使えるとは限らないし

238 :デフォルトの名無しさん:2009/04/24(金) 13:13:34
>>235
boostは抵抗があって、glibc(つーか標準関数)は抵抗ないの?
例えばGUIライブラリは? socketは?
boostに入っていると言うだけで、ある程度は「枯れて」いるんだから
自分で書くよりも余程楽できると思うんだけどね。

239 :デフォルトの名無しさん:2009/04/24(金) 13:20:52
>>238
俺はむしろboostの方を信頼するんだけど。

いつでも使えるとは限らないけど、正直 俺自身が書いたコードよりは信用できると思っているwww

240 :デフォルトの名無しさん:2009/04/24(金) 13:22:13
>>239
ごめん
× >俺はむしろb…(ry
○ >俺も君と同じ意見で、むしろb…(ry
だな。

241 :デフォルトの名無しさん:2009/04/24(金) 13:26:45
int number=10;
ここで
for( ; number > 0 ; --number ){〜}
と等価な処理を簡潔に書こうと思って
while(number--){〜}
としたら。ループ脱出時のnumberの値が前者が0,後者が-1となり等価にかけなかった。

前者と等価でより簡潔なループ書ける人いたら教えてください。
なお、シングルスレッドで、{〜}の中ではnumberの値は変化しません。

242 :デフォルトの名無しさん:2009/04/24(金) 13:36:19
for (; number > 0; --number) printf("%d\n", number);
++number; while (--number) printf("%d\n", number);
do printf("%d\n", number); while (--number);

243 :デフォルトの名無しさん:2009/04/24(金) 13:37:13
金になる儲けられるC/C++のコードを教えてくれ

244 :デフォルトの名無しさん:2009/04/24(金) 13:40:46
printf("hello, world");

245 :デフォルトの名無しさん:2009/04/24(金) 13:43:46
ほぉ、まずは挨拶からか。プログラム言語としてではなく、人間の言葉として
重みのあるコードだったぜ、やるね、あんた。

246 :デフォルトの名無しさん:2009/04/24(金) 13:48:54
>>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なら大丈夫だな。
ありがとう

248 :デフォルトの名無しさん:2009/04/24(金) 14:00:27
素直にforループでいいじゃん。

249 :239:2009/04/24(金) 14:13:17
>>246
一理ある理屈だな。


250 :デフォルトの名無しさん:2009/04/24(金) 16:12:58
>>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とか、バグがなくて実績があって安定していてどんなに優秀であろうが、
フリーである以上、自己責任で使うことになるから、バグのイイワケに使えなくなる。
だから、仕事じゃ、俺は、極力、使いたくない。


253 :デフォルトの名無しさん:2009/04/24(金) 16:21:55
>>252
シェアウェアなら言い訳になるのかい?
ライセンスを読んでみると言い訳には到底使えなさそうなことが書いてあると思うのだが。
そもそもWindowsとかOS自身が実質無保証じゃね?

254 :デフォルトの名無しさん:2009/04/24(金) 16:22:09
極力使わないのはいいが、それしか(有名なのは)ないんだったら
それを使う方がバグは減るだろう。商用可能なら

255 :デフォルトの名無しさん:2009/04/24(金) 16:28:51
どっちにしろバグはでるから言い分けしやすいように余計なものは使わないという考え
標準から外れたことをするとその分不利になるし

256 :デフォルトの名無しさん:2009/04/24(金) 16:45:59
ぶっちゃけ、「それはMSの仕様だからしょーがない」は、客も納得するのだよ。
フリーのライブラリだと、「なんで、そんなもの使った?別のもの使えよ!
さもなくば、自分で作れ!」って言われることが多いのだよ。

257 :253:2009/04/24(金) 16:54:05
>>256
ああ、あれか、一般企業で言うと、

ウイルスバスターを入れていたのに感染したんです。
じゃあしょうがないね

的なノリか。
分かった気がする。

258 :デフォルトの名無しさん:2009/04/24(金) 16:54:19
それは選ぶやつが駄目。
そいつが一から作った物は、もっと悪くなることが予想できる。

259 :デフォルトの名無しさん:2009/04/24(金) 17:03:00
MFCやらSTLやら使ってバグっても、MSのバグですで済むことなんてないな。

260 :デフォルトの名無しさん:2009/04/24(金) 17:03:44
そういうわけで、TR1のおかげでBoost入れなくてもshared_ptrや
正規表現が使えるようになったのはかなり嬉しいことだと思わないか?

261 :デフォルトの名無しさん:2009/04/24(金) 17:06:54
でもSTLport入れる気なくしたよ

262 :デフォルトの名無しさん:2009/04/24(金) 17:18:41
>>259
下っ端プログラマなら、何がどうなろうが、
なんらかの対策をして直すなりなんなりしなくてはならない話だから、
関係ない話だ。

もっと上のレベルでの期間とか金とか信頼・信用とか契約の
話で、だいぶ違うし、かなり重要なところ。

つまり、下っ端なら下っ端ほど、バグがでにくくて安定してて楽に作れる
優秀な有名どころのフリーのものを使いたがるが、
上の立場になればなるほど、そう言うのは使いたくなくなってくる。

まぁ、俺の経験則からみた見解だ

263 :デフォルトの名無しさん:2009/04/24(金) 17:25:42
>>261
一理あるね。わざわざシェアの他企業のフレームワークを使ってる会社もある
そのフレームワークにもバグが合った話を聞いた時は噴いたな

264 :デフォルトの名無しさん:2009/04/24(金) 17:26:42
アンカーミスった
>>262ねw

265 :デフォルトの名無しさん:2009/04/24(金) 17:29:23
プロジェクトによってはboostインストールさせてくれない。
でもインストールしてもいいならじゃんじゃん使う。

GoF本にも書いてあったじゃないか。
経験のある設計者は一から問題を解こうとしない。
ウェブにあるプログラムを再開発しないと書いてあったのは
達人プログラマだったっけ?

まぁそんなとこ。先人は偉いなぁ。

266 :デフォルトの名無しさん:2009/04/24(金) 17:32:31
バグ入りのソースでも平気でインクルードするのが経験者か?

267 :デフォルトの名無しさん:2009/04/24(金) 17:35:30
結局のところ、バグはバグ。
自分が作って自分がテストしたコードも
誰かが作って多くのユーザーがテストをし続けているコードも
どっちにもバグは発生する。

「コードをネコが食べちゃった」ですむのならご自由にどうぞ
というのが達人プログラマの教え。

僕?僕は君よりもアンドリューハントの言うことを信じるなぁ。
そんだけ。所詮は宗教かな。

268 :デフォルトの名無しさん:2009/04/24(金) 19:43:01
>>267
意味が分かりません

269 :デフォルトの名無しさん:2009/04/24(金) 20:13:16
達人プログラマー読めれ。

270 :デフォルトの名無しさん:2009/04/24(金) 20:29:14
C++で書いてg++で最適化オプション-O2で
コンパイルしたプログラムなんだけど、

ソースコードの無駄な改行のあるなしの違いだけで
はき出すバイナリが違う物になるんだが、
どうして?


271 :デフォルトの名無しさん:2009/04/24(金) 20:34:11
__LINE__

272 :デフォルトの名無しさん:2009/04/24(金) 20:39:54
>>270
コンパイラ製作者に聞いて

273 :デフォルトの名無しさん:2009/04/24(金) 21:09:44
>>271-272

そうか。
ありがとう。


274 :デフォルトの名無しさん:2009/04/24(金) 23:03:52
C/C++でライブラリと言ったら、どういう物を指すの?
単体では動作せず、複数のプログラムから再利用できる汎用性が高いものっていう認識なんだが、
そうだとすると例えばマクロだけで書いた物もライブラリという呼び名が適用できる?

275 :デフォルトの名無しさん:2009/04/24(金) 23:08:20
>>274
C/C++の標準関数(stdio.h、stdlib.h>もライブラリだよ
>単体では動作せず、複数のプログラムから再利用できる汎用性が高いものっていう認識なんだが
この認識で基本はおk
マクロだけはライブラリとは呼べないと思う
何故ならマクロはビルド時に置換するだけだから

276 :デフォルトの名無しさん:2009/04/24(金) 23:16:38
<cassert> って確か中身マクロじゃなかったっけ?

277 :274:2009/04/24(金) 23:17:39
>>275-276

なるほど、そんな感じかぁ。
ありがと。

278 :デフォルトの名無しさん:2009/04/25(土) 01:57:30
文字列クラスがあります

operator!=(const hoge_str&, const hoge_str&)

こんなコード書く奴をどうやって制裁すべきでしょうか

279 :デフォルトの名無しさん:2009/04/25(土) 02:21:22
>>278
何でもかんでもフレンド関数にすんなと言っとけ

280 :デフォルトの名無しさん:2009/04/25(土) 07:42:00
operator=(const hoge_str&, const char *)

中身の実装によるだろうけど
これやばいよね?シナコードに大量に含まれてるんだが


281 :デフォルトの名無しさん:2009/04/25(土) 07:44:16
どうやばいの?

282 :デフォルトの名無しさん:2009/04/25(土) 10:08:07
>>278 これってなにがまずいの?

283 :デフォルトの名無しさん:2009/04/25(土) 11:07:54
operator=で、最初の引数がconst&ならどう考えてもコピー代入オペレータです本当に(ry
だからそもそも意味がわからないし、コンパイラにぶっちされるんでないか?

284 :デフォルトの名無しさん:2009/04/25(土) 14:35:02
長い文章で2行になっちゃうときには
printf("スレを立てるまでもない-
-質問\n");
というように、- の記号で繋いでやればいいのではないのでしょうか?
何故か全部エラーになってしまうのですが。
お願いします。

285 :デフォルトの名無しさん:2009/04/25(土) 14:50:24
printf("スレを立てるまでもない"
"質問¥n");

で良いんじゃね? どこで覚えたのそれ。

286 :デフォルトの名無しさん:2009/04/25(土) 14:57:43
>>279
フレンドにする必要もないだろ。
bool operator!=(const hoge_str& lhs, const hoge_str& rhs)
{
return !(lhs == rhs);
}
で、278はBoost.Operators使えって言いたいんでしょ(違

287 :デフォルトの名無しさん:2009/04/25(土) 15:48:03
>>284
新しい発想過ぎて驚きだな。-演算子でつなぐなんて、一体全体誰が言ったの?
そんなやつは早々に見切り付けてついて行かない方が良いよ。

288 :284:2009/04/25(土) 19:14:56
レスありがとうございます。
なんか自分が勘違いして覚えてしまってたのかもしれません。
>>285さんの方法で無事できました。
ありがとうございました。

289 :デフォルトの名無しさん:2009/04/25(土) 19:47:01
配列double d[2500];があるとして、d[0]から埋めていきd[2499]まで全て埋まって
しまったら一番古いのをd[0]に2番目に古いのをd[1]…とずらして一番新しいのを
d[2499]に入れるようにどんどんずらしていきたいんですが、どのように書けばいいですか?

290 :デフォルトの名無しさん:2009/04/25(土) 20:01:15
for(i=1; i<2500; i++) d[i-1] = d[i];
でできるけど、追加するたびにいちいち詰めるのは無駄だな。

291 :デフォルトの名無しさん:2009/04/25(土) 20:08:35
配列を使わずに
push_backするときにある値以上のサイズならpop_frontするようなdequeを作る

292 :デフォルトの名無しさん:2009/04/25(土) 20:11:44
ローリングさせる方が速い。

293 :デフォルトの名無しさん:2009/04/25(土) 20:15:55
リングバッファっぽい?

294 :デフォルトの名無しさん:2009/04/25(土) 20:23:47
どのようにと言われても
そのようにとしか

295 :デフォルトの名無しさん:2009/04/25(土) 20:34:47
ローリングってなんですか?

296 :デフォルトの名無しさん:2009/04/25(土) 20:36:08
d for(i=1; i<2500; i++) d[i-1] = d[i]; の書き方がまだいいのね
なんども繰り返す処理だからもっと軽い方法があったらそれでいこうと思ってたけど
これでずらすことにします

297 :デフォルトの名無しさん:2009/04/25(土) 20:57:34
いや、やめろよ・・・

298 :デフォルトの名無しさん:2009/04/25(土) 21:02:47
リストとかにしろ

299 :デフォルトの名無しさん:2009/04/25(土) 21:03:42
もしくはmemmoveつかえよ
計64KBまでにしたほうがいいが

300 :デフォルトの名無しさん:2009/04/25(土) 21:08:29
ありがとうリストにすることにする
STL全然勉強してないんだけどやっぱりSTL覚えておいたほうが良いよね

301 :デフォルトの名無しさん:2009/04/25(土) 21:11:21
STLはC言語より易しいと思う。 どんどん使うべき。
同様のことをC言語で自作したらそうとうくたびれる。
どうしても速度を追求したい人が、C言語やアセンブラを検討する。

302 :デフォルトの名無しさん:2009/04/25(土) 21:13:45
ここはサンプルのってて、直ぐ使えるようになる
http://www5c.biglobe.ne.jp/~ecb/cpp/07_08.html

303 :デフォルトの名無しさん:2009/04/25(土) 21:19:28
>>300
そもそもSTL禁止なC++なんて、ほとんど有用性ないだろ。

304 :デフォルトの名無しさん:2009/04/25(土) 21:20:33
用途によってはdequeも考慮する。 配列として扱える。 ただし追加と削除が鈍くなる可能性はある。

305 :デフォルトの名無しさん:2009/04/25(土) 22:12:55
STLはvectorしか使ってないな。何か抵抗ある

306 :デフォルトの名無しさん:2009/04/25(土) 22:26:11
めっちゃ便利だと思うが。
std::stackとかもなかなか。

厳密にはSTLじゃないがstd::stringは使うよな。

307 :デフォルトの名無しさん:2009/04/25(土) 22:34:51
boost以外使うな
STL遅い

308 :デフォルトの名無しさん:2009/04/25(土) 22:42:32
そんなことはない。 STLはboostより良い物が多い。 実装次第。

309 :デフォルトの名無しさん:2009/04/25(土) 22:45:06
STLは規格にあった物を誰でも作れる。 改善できる。
boostは現在、各人が勝手に作っているだけ。規格が定まっていない。

310 :デフォルトの名無しさん:2009/04/25(土) 22:56:01
何でおまいらはほっとくと雑談を始めるのか。

311 :デフォルトの名無しさん:2009/04/25(土) 23:02:20
2chだからいいじゃん。何が悪いのか?

312 :デフォルトの名無しさん:2009/04/25(土) 23:06:02
>>307
何言ってんだちゃんと実測しろ
doubleとか構造体をstd::sortに掛けると
qsort()より早いぞ
バイトコピーである必要がないしな

313 :デフォルトの名無しさん:2009/04/25(土) 23:11:25
なんでqsortとくらべてんの?

314 :デフォルトの名無しさん:2009/04/25(土) 23:22:38
STLは遅いというから一例を挙げただけさ

315 :デフォルトの名無しさん:2009/04/26(日) 00:06:09
ある程度完成したソースの中で、
const付けられるもの(付けられると気付いた物)に機械的にconst付けていったら
まぶしいくらいconstだらけになった。
そんなもん?


316 :デフォルトの名無しさん:2009/04/26(日) 00:07:21
const 汚染と呼んでいる。

317 :デフォルトの名無しさん:2009/04/26(日) 00:08:37
const-correctnessに気をつけてコード書いてりゃ、
至る所constだらけになるのは普通。

318 :デフォルトの名無しさん:2009/04/26(日) 00:09:13
じゃあむしろ上達したと考えていいのか。

ありがとう。

319 :デフォルトの名無しさん:2009/04/26(日) 00:09:20
今更だけど、bind1stやauto_ptrよりはBoostのbindやscoped_ptr/shared_ptrのほうが便利。TR1もマジお勧め。

320 :デフォルトの名無しさん:2009/04/26(日) 00:11:00
>>314
圧倒的に遅いものと比べて、それより速かったからといって、
「遅くない」という結論は導けないと思うのだけど。

321 :デフォルトの名無しさん:2009/04/26(日) 00:15:09
>>319
tr1がstd::に入って、大手を振って使えるようになる日がちゃんとくるのだろうか。
本当に今年中に来るんだろうなC++0x

322 :デフォルトの名無しさん:2009/04/26(日) 00:20:38
C++にて
みんなunionって使う?
使いどころが今ひとつわからない代物なんだが。

classと比べて勝っている点は何?メモリの拙訳以外には役立つの?

323 :デフォルトの名無しさん:2009/04/26(日) 00:25:01
>>320
そういう話をしているんじゃない
「STLは遅い」と言うから反例を一例上げただけだ

324 :デフォルトの名無しさん:2009/04/26(日) 00:26:41
ネットワークでよく使うような LTD (Length-Type-Data) 形式のバイナリ扱う時は楽。

325 :デフォルトの名無しさん:2009/04/26(日) 00:36:11
>>323
反例になってないといってるんだが

326 :デフォルトの名無しさん:2009/04/26(日) 00:42:22
反例として認めたくないだけだろ

327 :デフォルトの名無しさん:2009/04/26(日) 01:06:27
>>325
反例になってるじゃないか
ヴォケかお前は

328 :デフォルトの名無しさん:2009/04/26(日) 01:10:19
クソども他でやれ

329 :デフォルトの名無しさん:2009/04/26(日) 03:33:15
>>328
boost参考ページが少ないもん

330 :322:2009/04/26(日) 08:27:44
>>324
なるほど、そういった使い方か。
やっぱそこまで多用する物ではないのか。

331 :デフォルトの名無しさん:2009/04/26(日) 08:59:08
 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があるから表示とサイズがずれるだろ。

333 :デフォルトの名無しさん:2009/04/26(日) 09:30:32
>>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でいいんだった

335 :デフォルトの名無しさん:2009/04/26(日) 09:44:31
>>334
そうだよね。
ありがとう。

336 :デフォルトの名無しさん:2009/04/26(日) 09:45:29
9だと、9-3=6個しかコピーされないんだった。
全部コピーの場合はstring str(s.begin(), s.end() );だからな。 
s.size() = s.end() - s.begin() だ。

337 :デフォルトの名無しさん:2009/04/26(日) 11:14:39
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){
・・・
}
}
と書くと括弧で混乱する元。

340 :デフォルトの名無しさん:2009/04/26(日) 11:20:41
return 〜;

でいいんじゃないか?

341 :337:2009/04/26(日) 11:27:01
>>338-340
分かりました。
ありがとうございます。

342 :デフォルトの名無しさん:2009/04/26(日) 11:28:42
ちなみに
if(A && B){ ・・・}

if(A) if(B){・・・}

だと、前者が速いことが多かった。

前者は式の計算量が多くなるけど、分岐予測があったとしても後者の方が駄目ね。

343 :デフォルトの名無しさん:2009/04/26(日) 11:37:09
>>342
面白い経験則だな。

344 :デフォルトの名無しさん:2009/04/26(日) 13:16:14
>>342
ショートサーキットがあるから、前者で計算量が多くなるわけがない。

345 :デフォルトの名無しさん:2009/04/26(日) 13:19:37
>>342
いや同じだよ

346 :デフォルトの名無しさん:2009/04/26(日) 13:20:46
そういうのは逆汗したもので語ろうぜ。

347 :デフォルトの名無しさん:2009/04/26(日) 13:21:18
コンパイラが阿呆なら、速度に差が出るということも、まああり得るだろうが

348 :デフォルトの名無しさん:2009/04/26(日) 13:27:35
実際に計算はしてるんだから、わずかでも計算に時間掛かっている。
たとえば、1と、1&&1&&1&&1だったらこっちが時間掛かる。
分岐予測と、ショートサーキットは同じではない。
実際には、計算してまとめた方が速いよ。

349 :デフォルトの名無しさん:2009/04/26(日) 13:29:39
複数の文を最適化するより、単一の式を最適化するほうが簡単だからじゃね。
前者のほうが比較的簡単な最適化でも効率のいいコードを吐きやすいってだけだろ。


350 :デフォルトの名無しさん:2009/04/26(日) 13:41:37
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

351 :デフォルトの名無しさん:2009/04/26(日) 13:49:16
なんで常に 0 を返してるんだ?
関数がインライン最適化されてないか?

352 :デフォルトの名無しさん:2009/04/26(日) 13:50:15
あ、ret があるからインライン最適化はされてないか
じゃ、なんなんだろう

353 :350:2009/04/26(日) 13:50:46
ごめん。呼び出し側の引数を定数でやってたから最適化がかかってた。
引数を変数にしたらaaaもbbbも同じコードになってた。

354 :デフォルトの名無しさん:2009/04/26(日) 13:52:01
ということで、全く同じという結論になりましたね。

355 :デフォルトの名無しさん:2009/04/26(日) 13:52:41
なんでaaaではその最適化がかからなかったんだろうか
面白い違いだな

356 :デフォルトの名無しさん:2009/04/26(日) 13:53:45
ifを分けるとより高度なフロー解析が必要になるってことだろうか

357 :デフォルトの名無しさん:2009/04/26(日) 13:56:24
一段ならできて二段になるとできなくなるのか。
なんというか情けない話だな。

358 :デフォルトの名無しさん:2009/04/26(日) 13:57:59
なんか俺達がまだ見抜いていない、二段だと適用できなくなるような理由があるんじゃね?

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 :デフォルトの名無しさん:2009/04/26(日) 14:10:03
ええと、ごめん、馬鹿な俺には分からない。
みんな結局どういうのよりどういうのが速いって結論になってるの?

363 :デフォルトの名無しさん:2009/04/26(日) 14:13:12
>>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); }
}

365 :デフォルトの名無しさん:2009/04/26(日) 14:21:11
逆汗しろよ。コンパイラも書かずに、計った結果だけ貼られても何の意味もない。

366 :デフォルトの名無しさん:2009/04/26(日) 14:23:53
アセンブラの出力方法がわからん。

367 :デフォルトの名無しさん:2009/04/26(日) 14:24:50
そもそも計った結果すら書いてないしな
読んでる方からすると、有意な差があるのか誤差の範囲なのかすらわからない

368 :デフォルトの名無しさん:2009/04/26(日) 14:25:06
マジレスするとコンパイラの性能の差

369 :デフォルトの名無しさん:2009/04/26(日) 14:26:10
コピペして自分の環境で確かめて貰おうという趣旨です

370 :デフォルトの名無しさん:2009/04/26(日) 14:31:52
>>369
肝心なのはコンパイラがどこまで最適化をしてるかで、
時間を計ることには、ほとんど意味がないんだって。

371 :デフォルトの名無しさん:2009/04/26(日) 14:32:35
>>359
VC8ではどっちのループも同じコードを出力して、
実行すると、後に実行したループが実行時間が短かった。
(ループの順番を入れ替えても)

372 :デフォルトの名無しさん:2009/04/26(日) 14:52:07
gcc-4.2.4で-O3付けてゲロらせたものではどちらも判定部分でcmp3回使って判定してた

373 :デフォルトの名無しさん:2009/04/26(日) 16:01:08
結論:>>348は逆アセもできない初心者

374 :348:2009/04/26(日) 16:03:13
結論:>>373は逆アセも知らない初心者

375 :デフォルトの名無しさん:2009/04/26(日) 16:09:57
そもそも、条件について何の過程もない状態だと、よほど狂ったコンパイラでない限り、
ifを繰り返すのと&&で繋ぐので何の違いも出ないはずだよね。

問題となるのは条件がコンパイル時に評価できる場合に、
どこまで最適化できるかじゃないかな?

376 :デフォルトの名無しさん:2009/04/26(日) 16:27:53
>>374
悔しかったの?w

377 :デフォルトの名無しさん:2009/04/26(日) 18:54:05
【中国】「わが国でデジタル家電など売りたいなら、ソースコードを強制的に開示してもらう」 中国、制度強行へ★12
http://tsushima.2ch.net/test/read.cgi/newsplus/1240733623/

378 :デフォルトの名無しさん:2009/04/26(日) 20:59:42
C++で無駄にコピーコンストラクタ走ったとか
チェックするツールってありますか?

379 :デフォルトの名無しさん:2009/04/26(日) 23:34:59
そんなツールたしかに欲しいね。
俺的にはconst付けられるものを判別して
const付けられるよって教えてくれるツールも欲しいんだけど、無い?


380 :デフォルトの名無しさん:2009/04/26(日) 23:39:36
全部constつけて、エラーが起きたらconst外す。

381 :デフォルトの名無しさん:2009/04/26(日) 23:46:40
いつまで前方参照と宣言の煩わしさを引きずるんだろ。クラス内とか前方参照関係ないのに。

382 :デフォルトの名無しさん:2009/04/26(日) 23:52:14
includeする時
共通関数のファイルは冒頭
局所関数は使用する直前でいいのでしょうか

383 :デフォルトの名無しさん:2009/04/26(日) 23:58:35
読み手としては include は全部ファイルの先頭がいいと思う。

winapi 系はとくに、ほかの include とのしがらみがあったりするので・・・
前後関係を一望できるようにしておいたほうが、後で困らない。

384 :デフォルトの名無しさん:2009/04/27(月) 00:02:45
VC++ 2008 Express を落として見たけど vsnprintf() が unsafe という警告が出るのは何で?

385 :デフォルトの名無しさん:2009/04/27(月) 00:09:58
引数リストがアドレス渡しだからじゃないかな?

386 :デフォルトの名無しさん:2009/04/27(月) 00:12:44
バッファの最後に'\0'が書き込まれるとは限らないから、という理由だと思う。
strncatなんかはその理由でstrncat_sが用意されている。

387 :デフォルトの名無しさん:2009/04/27(月) 00:17:42
どうも。
何か strncpy() なんかも同じような警告が出るみたい。オーバーランの検知できる _s 付き使えって意味かな。
わざわざ長さ指定の n 付き関数使ってんのに。

388 :デフォルトの名無しさん:2009/04/27(月) 00:34:24
_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMESとか使えばいいと思うよ。
いっそC++へダイブ(ry

389 :デフォルトの名無しさん:2009/04/27(月) 00:43:48
CとC++の機能的な違いは検索したらうっすらわかったような気がするんですけど、これって両方現場で使われてるのでしょうか?
使われてるとしたらどういう使い分けされてるのでしょうか?
今からCかC++はじめようと思ってるんですがどっちに手を付ければいいかわからないです

390 :デフォルトの名無しさん:2009/04/27(月) 00:47:27
>>389
Cの方がずっと使われている
C++は理解するのが面倒だとかリストが読みにくいとか
適当な理由を付けてなかなか使われない

本当は大規模開発になればなるほどオブジェクト指向
が生きてくるんだがな

391 :デフォルトの名無しさん:2009/04/27(月) 00:51:49
>>389
基本C++で、Cが選ばれる理由としては
・Cコンパイラしかないから
・現場リーダがC++を信用してないから
・もともとCで書かれたものの改修だから
・C++の機能を使いたくないから(他言語とのインタフェースなどで)
ってところだな。

C++やってれば、CはC++の機能限定版と思えるよ。

392 :デフォルトの名無しさん:2009/04/27(月) 00:57:59
俺の場合、C から C++ へ行こうとして挫折した。よく分からない部分は C に逃げれちゃうから
なかなか C++ の OO を生かした書き方が習得できないんだよな。んで次に Java 行って逃げ道の
ない OO たたき込まれて帰ってきたら C++ が使えるようになっていた。

393 :デフォルトの名無しさん:2009/04/27(月) 02:51:36
CからC++の関数を呼ぶプログラムで、C言語のソースをgccでコンパイルし、
C++言語のソースをg++でコンパイルします。その後で各オブジェクトファイルを
リンケージするために、gccで行うとundefined referenceとエラーが出るのは
何故でしょうか?

394 :デフォルトの名無しさん:2009/04/27(月) 03:15:06
単純に名前解決ができないからみたいですね。失礼しました。

395 :デフォルトの名無しさん:2009/04/27(月) 07:52:26
>>393
gcc は標準Cライブラリをリンクする。
g++ は標準C++ライブラリをリンクする。
C++のプログラムがC++のライブラリを少しでも使っていたら
(newを使った時点でアウト) gcc ではリンク通らなくなる。

396 :デフォルトの名無しさん:2009/04/27(月) 09:47:20
>>395
つ[-lstdc++]

397 :デフォルトの名無しさん:2009/04/27(月) 09:53:07
エラー原因となるシンボル名を/usr/lib等のファイルをnmしてgrepするスクリプトを作ると便利

398 :デフォルトの名無しさん:2009/04/27(月) 16:48:03
>>392
> んで次に Java 行って逃げ道の
> ない OO たたき込まれて帰ってきたら C++ が使えるようになっていた。
そんな人もいるのか。
Javaは言語が尻拭いしてくれるからそれになれていると
C++でミスに気付かなそうだが。
油断しているとすぐ未定義の動作になっちゃうし。

399 :デフォルトの名無しさん:2009/04/27(月) 17:15:42
それは C やらないで Java から C++ に来た人でしょ。
C の言語機構に C++ がどう乗っかってるかだけ押さえてれば C++ を安全に扱うのは難しくはない。
でもそれはどう OO を生かして綺麗な設計ができるかとは別の話。

400 :デフォルトの名無しさん:2009/04/27(月) 17:22:30
>>399
> それは C やらないで Java から C++ に来た人でしょ。
ああ、確かにC言語やってあるって言ってるな。
君の言う通りだった。
> でもそれはどう OO を生かして綺麗な設計ができるかとは別の話。
C++の綺麗なクラス設計ってあこがれるわー。
俺がクラス設計やるとやっつけになりやすいんだよねぇ。
申し訳程度にpimplとか使ってみるだけで。


401 :デフォルトの名無しさん:2009/04/27(月) 20:06:54
friend指定はOO的にあまりよろしくないと言うことですが有効な使い所はあるのでしょうか?

自分はFactory系のクラス以外に初期化関数を触らせたくない時くらいしか使わないのですが・・・

402 :デフォルトの名無しさん:2009/04/27(月) 20:12:49
ある機能を全部使おうと考えずに、シンプルイズベストだと思ってるよ。
俺は、friendなんか使わん。

403 :デフォルトの名無しさん:2009/04/27(月) 20:14:05
ある機能を実現するためにいくつかのクラスが裏で協調動作しなければならないような場合。
Factory なんかはまさにそんな感じ。
friend じゃなくて rape ってキーワードにすれば良かったのに。

404 :デフォルトの名無しさん:2009/04/27(月) 20:21:53
friendっていう割りには一方的なんだよな
もうすこしキーワードを練って欲しかった

405 :デフォルトの名無しさん:2009/04/27(月) 20:25:45
Java のパッケージプライベートみたいに同じ名前空間に属しているスコープでのみ
参照可能ってのが良かった。

406 :デフォルトの名無しさん:2009/04/27(月) 20:28:18
Dのプライベートインポートが欲しいです。

407 :デフォルトの名無しさん:2009/04/27(月) 20:30:18
friendってえらい嫌われようだけど、publicでstaticなメンバ関数と機能的にはかわらんよね。
呼ぶとき、クラス名の修飾が必要かどうかくらいしか違わない。

408 :デフォルトの名無しさん:2009/04/27(月) 20:34:10
staticにするとthis参照できないけど、friendならメンバにアクセスできる。だったと思う。

409 :408:2009/04/27(月) 20:35:23
ってなんか変なこと言ってる気がしてきた。。。

410 :デフォルトの名無しさん:2009/04/27(月) 20:46:32
インスタンスを渡せばメンバにアクセスできるし、渡さなければアクセスできない。
ってことでしょ? 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);
}

412 :デフォルトの名無しさん:2009/04/27(月) 21:21:45
publicならできんじゃない

413 :デフォルトの名無しさん:2009/04/27(月) 22:20:34
あぁ、いや。
protectedのD()にアクセスできてるってことね。

414 :デフォルトの名無しさん:2009/04/28(火) 02:29:45
アクセス制限はクラス単位であってインスタンス単位じゃないからね。
staticだろうと何だろうと、クラスのメンバであれば、そのクラスのprivateなメンバに自由にアクセスできる。

415 :デフォルトの名無しさん:2009/04/28(火) 06:55:10
C++で性能あげるために役立つ本ってありますか?
洋書でも論文でもオーケーです

416 :デフォルトの名無しさん:2009/04/28(火) 07:41:17
>>413
そりゃ、おなじメンバならできるだろ

417 :デフォルトの名無しさん:2009/04/28(火) 23:29:56
コピーコンストラクって何回も走ると遅くなるのですか?



418 :デフォルトの名無しさん:2009/04/29(水) 00:10:41
>>414
>>416
そうなんか、初めて知った。

でもやっぱstaticメンバ関数は普通のメンバ関数とは違って
privateやprotectedなメンバ変数にはアクセスできないよね。


419 :デフォルトの名無しさん:2009/04/29(水) 00:17:21
>>417
いかなる関数も何回も走ったら遅くなるに決まっている。
走らせると処理が速くなる関数なんて存在し得ないだろ。
あと、コピーコンストラクタが何度も走る設計は普通見直しの余地あり。

420 :デフォルトの名無しさん:2009/04/29(水) 00:22:37

なんでデストラクタはいちいち virtual にするのかのぉ?

421 :デフォルトの名無しさん:2009/04/29(水) 00:23:46
>>419
自分はそう思うのですが
ここでコピーコンストラクタ3回走りますよっていっても
いや代入だからとか意味不明なこと言われて修正案却下される

バカでも明示的遅くなるのがわかる方法ってないですかね?

422 :デフォルトの名無しさん:2009/04/29(水) 00:27:26
>>421
究極の亜ふぉだな。
優秀な君たちが一斉に退社すれば
バカでも分かるんじゃないかな。
そういう末期な上司は治らないから。末期がんと同じで対症療法的に緩和していくしかない。

423 :デフォルトの名無しさん:2009/04/29(水) 00:46:21
それは数値で出さないお前が悪い。

424 :デフォルトの名無しさん:2009/04/29(水) 00:58:32
>>418
できるよ

425 :デフォルトの名無しさん:2009/04/29(水) 02:00:55
>>421
コピーコンストラクタの中にTimer呼んで10秒ほど固まるコードでも
入れてやれよ

426 :デフォルトの名無しさん:2009/04/29(水) 09:20:31
>>420
継承対策

427 :デフォルトの名無しさん:2009/04/29(水) 09:32:53
>>425
いいねそれ。
出来るだけばれないようにこっそり継承で呼び出して・・・。

428 :デフォルトの名無しさん:2009/04/29(水) 11:48:08
>>426
コンストラクタは virtual にしなくていいのですか?

429 :デフォルトの名無しさん:2009/04/29(水) 12:12:37
>>428
オブジェクト作成のときにどのクラスなのかは自明だからな。

430 :デフォルトの名無しさん:2009/04/29(水) 12:22:50
多重継承の動きを覚えるのが嫌になりました

431 :デフォルトの名無しさん:2009/04/29(水) 12:41:49
>>429
コンストラクタは virtual にしないで、
デストラクタは virtual にする。

その理由は継承対策だということですが、
デストラクタがどのクラスに対して呼ばれるのかが自明でない場合ってどういうときでしょうか?

432 :デフォルトの名無しさん:2009/04/29(水) 13:32:08
>>431

お前基礎からやりなおせ
継承使ったこともないのに適当に質問するな

433 :デフォルトの名無しさん:2009/04/29(水) 13:34:02
>>431
C++の禁忌に触れると闇の世界に引きずり込まれるぞ・・・

434 :デフォルトの名無しさん:2009/04/29(水) 15:08:50
参照を返す関数は、
return *this;
と書けばいいの?

435 :デフォルトの名無しさん:2009/04/29(水) 15:30:09
>>431
試しにデストラクタにvirutalを付けての継承と、virutalを付けずに継承した時の
デストラクタの呼ばれ具合を見るといいよ

>>434
そうだよ

436 :デフォルトの名無しさん:2009/04/29(水) 15:30:54
×virutal
○virtual

ね。寝ぼけてるな…

437 :デフォルトの名無しさん:2009/04/29(水) 16:22:36
#define new new(__FILE__,__LINE__)

のようにnew/deleteを置き換えてメモリ状況を見たりしてるんだが
std::vectorを使うと0x00000000をdeleteするんだが、これは仕様?
vectorに何も入れず、宣言するだけで上のようになる

438 :デフォルトの名無しさん:2009/04/29(水) 16:59:22
仕様というか実装の都合だろう
0x0をdeleteするのは有効で問題ない、これは仕様

439 :デフォルトの名無しさん:2009/04/29(水) 19:04:36
>>438
サンクス!
今までnew/deleteで出力したログの改行数でリークしてるか判断してたが
大量に0x0がdeleteされるから、面倒になってしまった

440 :デフォルトの名無しさん:2009/04/29(水) 22:26:46
>>431
まてまて、ポリモーフィズムって知ってる?
そもそも基底クラスって知ってる?ポインタって知ってる?暗黙の型変換とか動的な型とか知ってる?

441 :デフォルトの名無しさん:2009/04/29(水) 23:54:36
こんなに著しく知識が欠落してる人間が開発メンバーに入ってくると、最悪だな。
他人に迷惑を掛けるなら、メンバーから外してもらう。

442 :デフォルトの名無しさん:2009/04/30(木) 00:13:08
ポリモーフィズムとは
いつの間にか別の男のティンコが
嫁にマウントされてるって事です。

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 をつけようがつけまいが変わりません。おっしゃりたいのはどういうことでしょうか?

444 :デフォルトの名無しさん:2009/04/30(木) 00:43:25
初心者だからって嘘教えるんじゃねーよw
正しく動いてるだろボケ

445 :デフォルトの名無しさん:2009/04/30(木) 00:45:54
>>440
Yes
Yes、Yes、Yes、No です。
C++ って動的な型使えるのですか?


446 :デフォルトの名無しさん:2009/04/30(木) 01:01:02
>>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 にしろという
あまり本質とも思えない慣習を広めた、というわけかな。

448 :デフォルトの名無しさん:2009/04/30(木) 01:57:11
>>447
s/だから本来は/だったら本来は/

449 :デフォルトの名無しさん:2009/04/30(木) 02:02:27
>>447
いやいやいや。
そもそもA*型のポインタは、基本的にどの型のインスタンスを指してるか分からないわけ。
Aのインスタンスを指してるかもしれないし、Bのインスタンスを指してるかもしれない。
でもそれはどうでもよくて、「Aかその(publicな)派生クラスのインスタンスを指してるんだろう」
ということだけで問題なくプログラミングできるわけさ。

>>447みたいにできるならば、そもそもポリモーフィズムということの意味が全く無い。
いつでも(B*)にキャストして使えるなら、最初からB*型にすればいいじゃないか。

450 :デフォルトの名無しさん:2009/04/30(木) 02:32:15
>>449
> 最初からB*型にすればいいじゃないか。

確かにそうですね。丁寧にありがとうございました。


以下ざれごと。
これってC風ポインタを引きずっている弊害でこうなってしまったというか、
ポインタは確かに早くて概念もわかりやすいかもしれないが、
オブジェクトを指すには向いていないと思う。

オブジェクトって「自分がなにであるかを知っているデータ構造」なわけど、
ポインタで指すとわからなくなっちゃうわけで。
Java みたいなやりかたはスマートだと思うな。

451 :デフォルトの名無しさん:2009/04/30(木) 02:42:07
ポインタなんてのは見た目だけの問題だから、慣れれば気にならないと思うよ

452 :デフォルトの名無しさん:2009/04/30(木) 03:17:10
void* 使いまくりの C++ とか萎える。

453 :440:2009/04/30(木) 06:44:31
>>450
俺の言っていたポリモーフィズムはまさに基底クラスのポインタで派生クラスをまとめて操作できるという話。
もう知ったんだろうからいいけど。

>>450
> オブジェクトって「自分がなにであるかを知っているデータ構造」なわけど、
→→そんなことあるか?
> ポインタで指すとわからなくなっちゃうわけで。
> Java みたいなやりかたはスマートだと思うな。
→→Javaの発想はいいけど、所詮Javaのスピードしか出ない。
polymorphicな使い方しない場合だってあるわけで、
C++の根底にあるスピード重視思想を考慮すれば
別に不思議な仕様じゃないと思うよ。


454 :デフォルトの名無しさん:2009/04/30(木) 07:18:19
マクロで {…} で囲めば良さそうな物を do{…}while(0); でやってるのって何で?

455 :デフォルトの名無しさん:2009/04/30(木) 07:34:43
void *があればいいだろ

456 :デフォルトの名無しさん:2009/04/30(木) 09:22:27
画面のエフェクトを追加したり削除したりしたいのですが
decoratorで随時エフェクトの登録や削除を行うにはどういう実装をしたらよいでしょうか?

457 :デフォルトの名無しさん:2009/04/30(木) 09:26:03
>>456
それのどこがc/c++の質問なのかkwsk

>>455
質問なら質問らしく、聞きたいポイントを絞ってくれ。
回答のつもりなら、多態性について少しは勉強してからにしてくれ。

>>454
そのマクロを例えばif (...) macro(0); else macro(1);という文脈で使いたいから。但し、最後のセミコロンは不要。

458 :デフォルトの名無しさん:2009/04/30(木) 09:27:14
>>453
> 俺の言っていたポリモーフィズムはまさに基底クラスのポインタで派生クラスをまとめて操作

一般にオブジェクト指向の文脈では多相性はポインタとは直接関係ないですからね。
実は C++独自の解釈ですね。

> →→そんなことあるか?
はい。

> スピード重視思想を考慮すれば別に不思議な仕様じゃないと思うよ。

C++ってスピード重視なの?スピード重視ならCで書いちゃいますが。
C++ の仕様の統一感のなさは Stroustrap のセンスの問題だと思いますよ。

それが当たり前になってる人はクラスベースオブジェクト指向以外の他の言語を調べると
いろいろ発見があるかもしれません。

459 :デフォルトの名無しさん:2009/04/30(木) 09:39:15
汎用でパソコンが扱えるメモリの最小単位は8bitですか? 1や4は無理ですか?
物理的なアクセスの事です。

460 :デフォルトの名無しさん:2009/04/30(木) 09:42:48
>>454
確実に有効範囲を括弧内にしたいからでは。 単に{・・・}では心配になるからでは。
ループなら経験上安心できるのでは

461 :デフォルトの名無しさん:2009/04/30(木) 09:42:49
>>459
>汎用でパソコンが扱えるメモリの最小単位は8bitですか? 1や4は無理ですか?
8の時点で既に無理です。

462 :デフォルトの名無しさん:2009/04/30(木) 09:44:27
>>460
>457

463 :デフォルトの名無しさん:2009/04/30(木) 09:46:30
charは8bitです。 
ここ数年の一般的な家庭用のパソコンについて知りたいのですが8bitごとの物理的なアクセスは出来ませんか?
内部では32bit、64bitを分割してアクセスしてるんですか?

464 :デフォルトの名無しさん:2009/04/30(木) 09:48:45
>C++ってスピード重視なの?スピード重視ならCで書いちゃいますが。
その通り。C++はextern "C"でC風に出来る事も失敗の基ってプロジェクトのリーダも行ってたな
クラス内部の関数は__thiscallっていう呼出規約で呼ぶから、スピード感はCに劣る
thisの分よけいにpushしてcallするからね

465 :デフォルトの名無しさん:2009/04/30(木) 09:57:39
>>458
えっと、450と同じ人?とりあえず手軽に突っ込める範囲で書いておくけど。

「ポインタ」であることはそもそも本質的な問題ではない。ポインタだろうが参照だろうが同じ話でしょ。
例えばJavaならJavaで、>>449の「A*のポインタ」とか「B*」とかを全部Javaにおけるオブジェクト変数に
置き換えたところで、本質的な話は変わらない。
ただ、Javaではdeleteをしないしvirtual指定もしないから、元々の「デストラクタをvirtualに」って話とは
直接関わってこないだけのこと。

あと、スピード重視って言い方は語弊があるかもしれんが(まあそれは俺が書いたんじゃないが)
C++には「ゼロ・オーバーヘッド」という原則があることを知っておくといい。
これは、「新たに付け加えられた機能によって、その機能を使わない人が余計な悪影響を受けない」
ということ。C++における仮想関数の実装にはオーバーヘッドがあるが、仮想関数のメカニズムを全く使う
つもりのない人は、そのオーバーヘッドを全く気にせず使える。
そのためには、「デストラクタは常にvirtualになる」みたいな仕様にする訳にはいかなかった。
だから、使用者が必要に応じてデストラクタにvirtualをつけないといけないことになってるんだ。

466 :デフォルトの名無しさん:2009/04/30(木) 09:58:24
秘技、ファストコール!!でリンカエラーの嵐

467 :デフォルトの名無しさん:2009/04/30(木) 10:03:10
今時炊飯ジャーのマイコン用でもなければスタックの push pop なんてどうでも良いけどな。

468 :名無しさん@お腹いっぱい。:2009/04/30(木) 10:09:19
>>463
物理的なアクセスってどういうレベルで言ってんの?

一般的な家庭用パソコン = x86なので
メモリバス上で8bit幅のアクセスなんてものは不可能だが
レジスタ上では8bitだけ使うということは可能。


469 :デフォルトの名無しさん:2009/04/30(木) 10:10:01
お米をpush、お水をpush、ご飯をpop。

470 :デフォルトの名無しさん:2009/04/30(木) 10:19:56
ゼロオーバーヘッドの観点から考えれば継承とオーバーロードによる動的多態を使ったOOPより
テンプレートによる静的多態を使ったジェネリックプログラミングの方がC++的ということになるのかねぇ

471 :デフォルトの名無しさん:2009/04/30(木) 10:23:40
>>470
俺もそう思うよ。
OOPLとしては消極的すぎ。

472 :デフォルトの名無しさん:2009/04/30(木) 10:40:50
>>468
メモリを読みに行くときの最小単位は32bitってことですか?
ランダムアクセスのときは、レジスタにロードして8bitに区切るから32bitアクセスより鈍くなりますか?

473 :デフォルトの名無しさん:2009/04/30(木) 10:45:11
>>458
君はただしいよ
ただそういうC++の暗黒面を何も思わないC++脳も多いので
2chは話し半分に聞くといい

474 :デフォルトの名無しさん:2009/04/30(木) 11:09:39
>>472
今時のx86CPUだと特定の1バイト書き出すためには先ず、
その周辺のメモリ空間を64バイト(または128バイト)読み込んで、
該当の1バイトを書き換えてから、メモリ空間に書き込む。

従って、本当にランダムなメモリアクセスを行なうと、毎回
キャッシュミスしてDRAMからデータを取ってくるために大変遅くなってしまう。
しかし、ある程度予測できるアクセスパターンならキャッシュ管理の妙で
巧いこと先読みを行なえるので、連続アクセスと大きくは変わらない。

質問の目的がよく判らないから何とも言えないが、もし仮にCのデータ型の話をしたいのなら、
charの配列を使おうがintの配列を使おうが、アクセスパターンが同じなら速度的には大差ないということになる。

475 :デフォルトの名無しさん:2009/04/30(木) 11:13:24
そうですか。ありがとうございます。

476 :デフォルトの名無しさん:2009/04/30(木) 11:53:12
スペアナが作りたいんですがフーリエ変換だと
入力よりちょっと遅れてしまいますよね?
どうしたらいいでしょうか?

477 :456:2009/04/30(木) 12:22:50
間違って投稿してしまったようなので然るべき所で聞いてきます
スレ汚し失礼しました

478 :453:2009/04/30(木) 19:07:01
>>458
C++はともかく他の言語に関しては釈迦に説法的な状況だったのか。すまんね。
助言に従い多言語ももうちょっと前向きに学んでみるわ。
>クラスベースオブジェクト指向以外の他の言語を調べると
>いろいろ発見があるかもしれません。
例えば俺は何をやると良いと思う?
C/C++以外でお願いしたい。

479 :デフォルトの名無しさん:2009/04/30(木) 20:06:10
>>464
void f(hoge_t*, int);なCの関数と、hogeクラスのvoid f(int);というメンバ関数を呼ぶのでは同コストだろうよ。
thisが要らないなら、静的にすればいいし。

480 :デフォルトの名無しさん:2009/04/30(木) 20:53:43
クラス関数の静的って__cdeclで呼ばれるんだっけ?

481 :デフォルトの名無しさん:2009/04/30(木) 20:56:03
>>480
cdeclの前についてるアンダースコアは何のためのものだと思う?

482 :デフォルトの名無しさん:2009/04/30(木) 20:58:13
>>481
即レスサンクス。cdeclか

483 :デフォルトの名無しさん:2009/04/30(木) 21:02:08
( ゚д゚)゚д゚)゚д゚) ジェットストリームポカーン

484 :デフォルトの名無しさん:2009/04/30(木) 23:30:08
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
オマエラてさ、朝から寝る直前までパソコンなの?


487 :デフォルトの名無しさん:2009/05/01(金) 01:17:16
ん、よくわかったな。

488 :デフォルトの名無しさん:2009/05/01(金) 05:43:56
オマエってさ、朝から寝る直前まで外出なの?

489 :デフォルトの名無しさん:2009/05/01(金) 05:49:41
朝から寝る直前まで中出ししたいです。

490 :478:2009/05/01(金) 05:57:14
>>485
さんくす
試してみるわ

491 :デフォルトの名無しさん:2009/05/01(金) 21:58:11
どのC言語の本を読んでもヌルは0だ。だから偽になるんだって書いてあるんだけどさ、
ヌルはヌルだろ?0じゃないじゃん。
どゆことなん?

492 :デフォルトの名無しさん:2009/05/01(金) 21:58:34
nilだよ

493 :デフォルトの名無しさん:2009/05/01(金) 22:35:05
・リンクリストがあります。
・リンクリスト内の 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備え付けのコマンドプロンプトを使っています。

495 :デフォルトの名無しさん:2009/05/01(金) 22:45:43
>>494
int main

496 :デフォルトの名無しさん:2009/05/01(金) 22:51:07
>>495
mainの前にintを付けるということですか?
やってみたけど、できません。
ちなみに大学の授業で2・3回習っただけの初心者ですorz

497 :デフォルトの名無しさん:2009/05/01(金) 22:56:16
int main() {で初めて、
最後の}の前に一行、return 0;も付けれ。

498 :デフォルトの名無しさん:2009/05/01(金) 23:03:41
>>497
return 0; はいらない
C++ではreturn 0; を省略すると書いてあるものとみなされる

499 :デフォルトの名無しさん:2009/05/01(金) 23:08:08
なんとおおお? マジか!w

500 :デフォルトの名無しさん:2009/05/01(金) 23:10:08
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
これってコンパイラの問題ですか?
プログラム自体は間違っている感じじゃないんだけど・・・。

502 :デフォルトの名無しさん:2009/05/01(金) 23:18:08
エラーメッセージ貼れ

503 :デフォルトの名無しさん:2009/05/01(金) 23:20:44
>>501
そうかも。

ウチの環境ではコンパイルできたわ。
g++ (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)

504 :デフォルトの名無しさん:2009/05/01(金) 23:22:33
>>494
同じくbcc6.1.0でコンパイル&実行できました

505 :デフォルトの名無しさん:2009/05/01(金) 23:23:15
パスが通ってないとかじゃねーの?

506 :デフォルトの名無しさん:2009/05/01(金) 23:24:56
このコンパイラは右クリック使えないw
はずれ引いてしまったのか・・。
503のコンパイルにしたほうがいいですよね?

507 :デフォルトの名無しさん:2009/05/01(金) 23:26:37
っていうかエラーメッセージ貼れよ。

508 :デフォルトの名無しさん:2009/05/01(金) 23:26:44
VC9EEにしろよ

bcc5.5なんて時代の遺物は使うな

509 :デフォルトの名無しさん:2009/05/01(金) 23:27:26
コンパイラ右クリック?ww

510 :デフォルトの名無しさん:2009/05/01(金) 23:28:57
釣りくさいな

511 :デフォルトの名無しさん:2009/05/01(金) 23:29:47
コンソールのコピペのしかた知らないんだろ。

512 :デフォルトの名無しさん:2009/05/01(金) 23:31:16
いや、釣りじゃないです。
コマンドプロンプトは左クリックでカーソル移動しないし、
右クリック押しても何も起こらない・・

初心者にオススメのコンパイラって何ですか?

513 :デフォルトの名無しさん:2009/05/01(金) 23:32:56
>>512
コマンドプロンプトの左上にアイコンがついてるよな?
そいつをクリックして、編集→範囲指定→(゚Д゚)ウマー

514 :デフォルトの名無しさん:2009/05/01(金) 23:33:08
プログラムはあきらめろ

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 ***

お!ありがとうございます。

516 :デフォルトの名無しさん:2009/05/01(金) 23:35:22
F1003
このメッセージは,#error 指令がソースファイルで処理されるときに表示されます。

'message' は,#error 指令の文字列です。

517 :デフォルトの名無しさん:2009/05/01(金) 23:37:01
>>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
で、お前らは一体どんなプログラムつくってるの?

520 :デフォルトの名無しさん:2009/05/02(土) 00:53:59
VisualStudioから使えばすごい使いやすい言語なのに
なんでlinusとかからネガキャンされんだろ

521 :デフォルトの名無しさん:2009/05/02(土) 00:56:37
>>520
linusは自己顕示欲が強すぎんだよ
「俺がGPLでタダで使いやすい環境を揃えてやってるのに
なんで皆金はらって商業ベースのOSばかり使いたがるんだ」

522 :デフォルトの名無しさん:2009/05/02(土) 01:03:51
だいたい GPL 自体が汚染拡大モデルの宗教

523 :デフォルトの名無しさん:2009/05/02(土) 01:12:47
どれ使おうが、大体やれることは同じなので
後はなれでしょ

524 :デフォルトの名無しさん:2009/05/02(土) 01:35:42
VisualStudio 使いにくい。。。Emacs のほうが100倍便利だよ

525 :デフォルトの名無しさん:2009/05/02(土) 01:39:37
makefile作るのがめんどいじゃん。エディタはviが最強だけど。

526 :デフォルトの名無しさん:2009/05/02(土) 08:46:16
面倒だからmakefile作るんだが・・・

527 :デフォルトの名無しさん:2009/05/02(土) 09:36:24
linusはメンヘルだよまじで基地外だよ
1時間ぐらい話せば解る



528 :デフォルトの名無しさん:2009/05/02(土) 10:45:47
コンパイルオプションやらイミフな呪文てんこ盛りな makefile のメンテナンスはかなり悲惨。
設定事の管理はゴリゴリ書かないで IDE に任せておくもの道理だけどな。

529 :デフォルトの名無しさん:2009/05/02(土) 10:52:11
linux(笑)はちょっといかれちゃってるからねぇ


530 :デフォルトの名無しさん:2009/05/02(土) 11:27:08
>>528
IDE のプロパティだの何だのをあちこちいじってメンテするのとあまり変わらん気が。

よっぽど小さい規模じゃなきゃ、さすがに手で Makefile 書く機会も減ってきているしな。

531 :デフォルトの名無しさん:2009/05/02(土) 11:50:38
C言語でゲームで会話シーン作ったらずっと
printfと(と"と"と)と;との応酬で、時によっては\nを入れるっていうパターンになっちゃうんでしょうか?
printfをコピペするだけでも疲れてきたんですけど。
括弧閉じもしないといけないし。

532 :デフォルトの名無しさん:2009/05/02(土) 11:52:52
会話データを保存したファイルを作って、そっから読み込む。

533 :デフォルトの名無しさん:2009/05/02(土) 11:57:55
>>531
Cでゲーム用のスクリプトのインタプリタを書いて、
そのスクリプトでセリフやら書くのが普通。


534 :デフォルトの名無しさん:2009/05/02(土) 12:13:31
俺が作るなら面倒だから適当にdefineして書く量を減らすか
関数作ってそっちに文字列を渡すと文字数に応じて勝手に改行してくれるようにする

535 :デフォルトの名無しさん:2009/05/02(土) 12:50:12
>>531
ですが、なるほど勉強になりました。
ファイル読み込んでputcharとかで表示させればいいんですかね。
多分上手く行かないだろうけど作ってみます。


536 :デフォルトの名無しさん:2009/05/02(土) 12:51:41
でも皆頭いいね。自分が知らなさ過ぎるって言うのもあるんだろうけど。

537 :デフォルトの名無しさん:2009/05/02(土) 13:09:10
>>535
printf でやったほうが君には可能

538 :デフォルトの名無しさん:2009/05/02(土) 13:10:40
>>535
吉里吉里とかすでにADVツール無料であるけど
車輪の再開発する気なの?

539 :デフォルトの名無しさん:2009/05/02(土) 13:15:08
趣味でやってるなら再発明でもいい。

540 :デフォルトの名無しさん:2009/05/03(日) 02:44:27
cygwin の g++ でコンパイルした実行ファイルのサイズが
単に iostream を include しただけで main で何もしない内容でも 400k を超えてたんですが、
もっと小さくするにはどうしたらいいでしょう?


541 :デフォルトの名無しさん:2009/05/03(日) 02:50:44
gccプログラミング工房

542 :デフォルトの名無しさん:2009/05/03(日) 09:20:49
>>540
DLL(so)にすると30〜40Kほどに縮む

543 :デフォルトの名無しさん:2009/05/03(日) 09:21:31
>>540
ああ言い忘れたSTLportな

544 :デフォルトの名無しさん:2009/05/03(日) 12:58:06
リンク先のライブラリがたまに stderr にメッセージを吐くんですけど、あいにく
コンソールを持たないプログラムなんでこっちが用意したメモリ上のバッファか
何かに出力させたいんです (リダイレクトやファイルは使えません)。

何かうまい方法はないですかね?

545 :デフォルトの名無しさん:2009/05/03(日) 12:59:59
>>544
プログラムの最初のほうで、

stderr = fopen("log.txt", "w");


546 :デフォルトの名無しさん:2009/05/03(日) 13:02:36
freopen("log.txt","w",stderr);
じゃね?

547 :デフォルトの名無しさん:2009/05/03(日) 13:10:30
やっぱりファイル使わないとダメですかね?

548 :デフォルトの名無しさん:2009/05/03(日) 13:16:46
子プロセスのstderrをとる方法もあるから、stderrを取りたいプログラムを
起動してそのstderrをとるコードを書くとか。
面倒だな。

549 :デフォルトの名無しさん:2009/05/03(日) 13:38:48
>>544
パイプのバッファが溢れない程度のメッセージなら、
パイプに溜めておく、という手もある

int fd[2];
pipe(fd);
dup2(fd[1], 2);

ライブラリ呼ぶ

fds[0]を読む

550 :デフォルトの名無しさん:2009/05/03(日) 13:39:25
バッファで足りなくなったらどうするつもりなんだ?

551 :デフォルトの名無しさん:2009/05/03(日) 13:39:42
s/fds[0]を読む/fd[0]を読む/

552 :デフォルトの名無しさん:2009/05/03(日) 13:41:31
>>550
だから大丈夫な場合ってことわってる
何Kbyteも出すわけじゃないだろう

553 :デフォルトの名無しさん:2009/05/03(日) 15:30:43
>>552
いや、>>550>>549を見る前に書いた

554 :デフォルトの名無しさん:2009/05/03(日) 17:16:44
クラス内関数を別スレッドとして動かしたいんですが
m_hThread = (HANDLE)_beginthread(&hoge::hogeloop,0,NULL); //スレッド1作成
1 番目の引数を 'void (__thiscall hoge::* )(LPVOID)' から 'void (__cdecl *)(void *)' に変換できません。
って言われるんですが、何かヒントでいいので教えてもらえないでしょうか

555 :デフォルトの名無しさん:2009/05/03(日) 17:20:50
>>554
メンバ関数ポインタがまったく理解できてない
メンバ関数ポインタでぐぐって出てくるページでも読んどけ

556 :デフォルトの名無しさん:2009/05/03(日) 17:26:14
>>554
クラス内で別スレッドを持たせる場合、間に静的のクラス関数を噛ませないと駄目
その静的クラス関数にthisポインタを渡せば、beginthreadで渡されるから

557 :デフォルトの名無しさん:2009/05/03(日) 17:31:59
×その静的クラス関数にthisポインタを渡せば、beginthreadで渡されるから
○beginthreadに静的クラス関数を指定して、その際thisポインタを渡せばおk

558 :デフォルトの名無しさん:2009/05/03(日) 17:47:44
なるほど、最初?って思いましたがやってみながら考えたら納得できました。
ありがとうございました

559 :デフォルトの名無しさん:2009/05/03(日) 20:11:20
ビット演算で ある変数の第iビットだけ反転することはできますか?

560 :デフォルトの名無しさん:2009/05/03(日) 20:33:54
できます

561 :デフォルトの名無しさん:2009/05/03(日) 20:39:04
((x & ~(1 << i)) | (~x & (1 << i)))

562 :デフォルトの名無しさん:2009/05/03(日) 20:39:07
#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);
}

563 :デフォルトの名無しさん:2009/05/03(日) 20:51:02
559です

では

ある変数のiビット目をある変数のiビット目に代入する方法はありますか?

564 :デフォルトの名無しさん:2009/05/03(日) 20:53:53
あんまり甘やかすのもどうかと思うね

565 :デフォルトの名無しさん:2009/05/03(日) 20:59:04
>>563
あります

566 :デフォルトの名無しさん:2009/05/03(日) 21:00:07
そう思うので、ヒントだけ。

>>563
ビットフィールドつかえ。

567 :デフォルトの名無しさん:2009/05/03(日) 21:04:41
>>566
えー?

568 :デフォルトの名無しさん:2009/05/03(日) 21:12:02
ありますか?
と問われているんだから
あります
と答えればいいんでない?

569 :デフォルトの名無しさん:2009/05/03(日) 21:44:26
y |= (x & (1 << i));

570 :デフォルトの名無しさん:2009/05/03(日) 21:46:32
それじゃ代入にゃならん

571 :デフォルトの名無しさん:2009/05/03(日) 21:49:22
あそっか。

y = (y & ~(1 << i)) | (x & (1 << i))

572 :デフォルトの名無しさん:2009/05/03(日) 22:17:10
おかしくねぇか

573 :デフォルトの名無しさん:2009/05/03(日) 22:20:10
いやあってるか。すまん

574 :デフォルトの名無しさん:2009/05/03(日) 23:05:21
巨大な2次元行列の積に関してなんですが、BLASなどの専用ライブラリを使ったほうが
for文を使って計算させるよりも早いんですか? どうしてですか?

575 :デフォルトの名無しさん:2009/05/03(日) 23:11:14
>>574
Expression Template 。

letsboost::uBLAS
ttp://www.kmonos.net/alang/boost/classes/ublas.html


576 :デフォルトの名無しさん:2009/05/03(日) 23:11:28
そのライブラリはぜんぜんしらんけど、ふつーは専用ライブラリがはやいな。
アセンブラとか使ってカリカリにチューンしてあるとか、アルゴリズムがすごいとか。


577 :575:2009/05/03(日) 23:17:37
ああ、uBALSじゃなくてBALSか。
BALSはFortranで書かれているから単にその速さの違いなんじゃね?
あと、天才がアルゴリズム組んでるとか。


578 :デフォルトの名無しさん:2009/05/03(日) 23:36:56
575よ、BLASな

キャッシュとか考えてメモリアクセスを最適化してるからだと思うが

579 :575:2009/05/03(日) 23:39:15
>>578
みなまで言うな、分かっておる。

580 :デフォルトの名無しさん:2009/05/03(日) 23:40:21
これ以上はBALSがFortranで書かれているならFortranスレ行ってもらおう。


581 :デフォルトの名無しさん:2009/05/04(月) 08:41:19
バルス

582 :デフォルトの名無しさん:2009/05/04(月) 10:10:26
目がぁ〜

583 :デフォルトの名無しさん:2009/05/04(月) 10:37:40
40秒でデバグしな

584 :デフォルトの名無しさん:2009/05/04(月) 10:47:44
むりです・・・

585 :デフォルトの名無しさん:2009/05/04(月) 11:27:42
Xさんが著作権を持つ修正BSDライセンスのライブラリXを使ってプログラムYを作ると、
著作権表示、ライセンス条文、無保証
を表示しなければなりませんよね。
後ろ二者はいいとして、著作権表示をすると
Yに関する著作権は全てXの物になるのですか?
それともYの中のXを使っている部分に関してのみXの物になるのですか?

586 :デフォルトの名無しさん:2009/05/04(月) 11:35:17
それのどこがC/C++の質問なんだ

587 :デフォルトの名無しさん:2009/05/04(月) 11:56:01
>>586
それもそうなんですが、
他に聞けそうなスレが無くて。。。
ソフトウェアライセンス相談
ttp://pc12.2ch.net/test/read.cgi/software/1240377611/1-100
ここはちょっと違うような・・・

588 :デフォルトの名無しさん:2009/05/04(月) 11:59:14
unix板とかlinux板あたりにライセンスの詳しい人がいそう。


589 :デフォルトの名無しさん:2009/05/04(月) 12:08:25
他人の著作仏の著作権を奪い取れるようなソフトウェアライセンスなんて聞いたことねぇよ。

590 :デフォルトの名無しさん:2009/05/04(月) 12:11:29
著作の仏

591 :585:2009/05/04(月) 12:15:25
>>588-590
そうですか、
ありがとうございます。

592 :デフォルトの名無しさん:2009/05/04(月) 12:23:55
> 著作の仏
尊んでいるのか、けなしているのか・・・

593 :デフォルトの名無しさん:2009/05/04(月) 14:58:16
すいません

本を購入しさっそくコンパイラでもダウソしてみようかと思ったのですが、
みなさんもBorland C++ Compiler 5.5を使っておられるのですか?
また、みなさんいちいちユーザー登録をしているのですか?

594 :デフォルトの名無しさん:2009/05/04(月) 15:00:50
「みなさんも使っておられますか?」みたいなアンケートを始めると収拾がつかなくなるかもしれんが
とりあえず俺は使ってない。

595 :デフォルトの名無しさん:2009/05/04(月) 15:01:34
つかってない
してる

596 :デフォルトの名無しさん:2009/05/04(月) 15:02:28
普通はVC++を使います

597 :デフォルトの名無しさん:2009/05/04(月) 15:05:31
そうですか、いやいちいち登録とかめんどくせぇなって思っただけなんですけどね
ありがとうございます

598 :デフォルトの名無しさん:2009/05/04(月) 15:07:38
>>593
初心者ならbccでもVCでもgccでも同じだと思う。
bcc5.5.1はC++のちょっと高度なテンプレート周りが
とんでもなく標準準拠性悪いけど、別に最初は関係ない。
初心者のうちはエラーメッセージが日本語な
bccやVCがいいかもね。

599 :デフォルトの名無しさん:2009/05/04(月) 15:08:40
>>598
ども、そうしときます。

600 :デフォルトの名無しさん:2009/05/04(月) 15:09:51
初心者向けのコンパイラ(リンカ含む)で有用なのは
Windowsで、
bcc, vc, gcc以外になんかある?


601 :デフォルトの名無しさん:2009/05/04(月) 15:20:27
bcc使ってるって初心者多いな。
どっかのサイトとかでお勧めでもしてるのかね。

602 :デフォルトの名無しさん:2009/05/04(月) 15:25:17
>>601
俺も最初はbccから入った。でも何でbccを選んだのか分からない。
今はgccとvcしか使っていないが。

603 :デフォルトの名無しさん:2009/05/04(月) 15:29:56
bccは使っちゃいかんだろ


604 :デフォルトの名無しさん:2009/05/04(月) 15:31:01
大学のプログラミングの講義の例題がbccだとコンパイルできないので
がんばってgcc(MinGW)を入れた。 

605 :598:2009/05/04(月) 15:36:13
だめじゃんbcc
って思えるようなレベルに到達するまでは好きにすればいいと思う。
まあgccだってwchar_tらへんは弱いし。


606 :デフォルトの名無しさん:2009/05/04(月) 15:38:26
bccで画像をリソースにして実行ファイルに埋め込もうとしたらあるサイズを超えた段階でリソースコンパイラが意味不明のエラーを吐くということを経験してから一度も使ってない

607 :デフォルトの名無しさん:2009/05/04(月) 15:42:26
初心者にとっては、最近のIDEとコンソールはどっちが敷居がたかいんだろうね。
DOSの時代のTurboCとか、適当にソースを打ち込んでF5で実行できたから、
すごい簡単だったけど。

608 :デフォルトの名無しさん:2009/05/04(月) 15:46:30
>>601
VisialStudioより前に無料配布を始めてるはず。
だから古くからあるサイトとか、そういうサイトで学習したところでは、
bcc使った開発方法を載せてるところがある。

609 :デフォルトの名無しさん:2009/05/04(月) 15:59:30
今でも初心者質問のスレではLSI C-86試食版の人みかけるよねw

610 :デフォルトの名無しさん:2009/05/04(月) 16:27:58
>>604
某大学でプログラミング実習のTAやってますが、担当の先生が推奨する
コンパイラがあればそれを使うのが吉かと。うちの先生はfor文を
  for (int i = 0; i < n; i++)
みたいに書くので、家で宿題をやろうとしてC99未対応のコンパイラを
使って悩む学生さんが毎年出ます。

>>609
LSI-C試食版はそろそろ絶滅してほしいですね。今年出たトラ技別冊の
C入門書(大学生協に山積みされてた)がこれを使っているせいか、今年も
これを素直にインストールした人がいるようです。
http://www.cqpub.co.jp/trs/index.htm

611 :デフォルトの名無しさん:2009/05/04(月) 16:33:34
Fラン大学程度だと
VC環境は悪だとか言ってる人もいますよ


612 :デフォルトの名無しさん:2009/05/04(月) 16:43:28
>>611
嘘言え。Fラン大学生がVC環境とかそんな高度な日本語発言できるわけがないだろ。
F「ぱそこん?ぷれすてじゃね〜の?」
だろw


613 :デフォルトの名無しさん:2009/05/04(月) 16:49:32
>>610
先生にそれ止めれって言うなりよ
コンパイラは学校が教材として生徒に提供するなりよ
いまはゆとり教職多いんだな。
ゆとり教職がゆとり学生を教えるゆとり時代になったんだな。

614 :デフォルトの名無しさん:2009/05/04(月) 17:04:05
ゆとりって言いたいだけなんちゃうんかと

615 :デフォルトの名無しさん:2009/05/04(月) 17:04:19
>>613
甘やかしすぎ。それくらい学生自身で解決させろよ。
講義中、習ってない数学の定理を使われるようなのは日常茶飯事だったぞ。

616 :デフォルトの名無しさん:2009/05/04(月) 17:13:00
ゆとりゆとり言うやつは真のゆとりを知らないただのゆとり

617 :デフォルトの名無しさん:2009/05/04(月) 17:13:09
>>615
今そんなことすると、親御さんから大学事務局へ苦情
さらに教授会で締め上げられるよw


618 :デフォルトの名無しさん:2009/05/04(月) 17:15:56
>>615
F大学じゃ、そういうもんだろ

619 :デフォルトの名無しさん:2009/05/04(月) 17:41:47
>>611
お前がFランだと自己紹介しなくて良いから

620 :デフォルトの名無しさん:2009/05/04(月) 17:42:25
すみません。便乗で質問です。
VC++無料版のコンパイラは性能どうなんですか?
昔、インストールした時、
性能に制限があるとかないとかよくわかりませんでした。

621 :デフォルトの名無しさん:2009/05/04(月) 17:44:22
>>612
お前は自分が専門学校程度のバカだと自己紹介しなくて良いから
少し黙ってな。

>>613
http://ja.wikipedia.org/wiki/%E3%82%86%E3%81%A8%E3%82%8A%E4%B8%96%E4%BB%A3
ゆとり世代でもう教授だの、授業を担当している講師がどんだけいると?
お前の頭がゆとり過ぎる、少し黙ってろ

622 :デフォルトの名無しさん:2009/05/04(月) 17:44:38
コンパイラの性能を気にするのはまだ早いと思うよ。

623 :デフォルトの名無しさん:2009/05/04(月) 17:47:36
>>620
VC2008EEでも最適化のO2ができる。
WinApiも標準で持ってるしC++/CLIもできる。
趣味用途なら決定版だと思うぞ。商用もたしかできる。

最近の商売のネタはチームのコミュニケーションとかコラボレーションとかそういう部類で食ってるみたいだからね。


624 :デフォルトの名無しさん:2009/05/04(月) 17:49:06
>>620
性能に違いはなかったはず。
機能の違いについては、MSのサイトで詳しく説明されている。

625 :620:2009/05/04(月) 17:53:36
>>622
性能を気にするレベルでないのは、ご指摘どおりです。
ありがとうございます。

>>623
WinApiに対応できてるのは知りませんでした。
ありがとうございます。

>>624
すみません。最近チェックしてませんでした。
ありがとうございます。

626 :デフォルトの名無しさん:2009/05/04(月) 18:40:15
Expressにないのは、プロファイルに基づく最適化、OpenMP、x64/IA-64版、/analyzeあたりだな。
どれも、あると嬉しいが無くても困らないという感じがする。

627 :デフォルトの名無しさん:2009/05/04(月) 18:46:44
MFC

628 :デフォルトの名無しさん:2009/05/04(月) 19:11:00
プラグインもな

629 :デフォルトの名無しさん:2009/05/04(月) 19:13:18
誰か頭の弱い俺に
>>for (int i = 0; i < n; i++)
の何が悪いのか教えてくれ

630 :デフォルトの名無しさん:2009/05/04(月) 19:13:37
OpenMPは別途SDKのライブラリリンクすれば使えるよ

631 :デフォルトの名無しさん:2009/05/04(月) 19:17:01
>>629
C99以前のコンパイラでは通らない。
int宣言しながらforまわそうとしてるから。

632 :デフォルトの名無しさん:2009/05/04(月) 19:17:44
あ、以前じゃなくて未満か。

633 :デフォルトの名無しさん:2009/05/04(月) 19:17:46
>>629
C++では問題ないけどCってこの書きかた出来たっけ?

634 :デフォルトの名無しさん:2009/05/04(月) 19:19:26
あっ、一足違いで>>631-632でもう答えが出てたのか

635 :デフォルトの名無しさん:2009/05/04(月) 19:20:21
問題ないス。

636 :デフォルトの名無しさん:2009/05/04(月) 19:21:58
ああ、そういうことか

コンパイラのVer違いまで把握するほど玄人じゃないから、ありがとう

637 :デフォルトの名無しさん:2009/05/04(月) 19:24:19
昔の VC++ だと for の初期化文で宣言した変数って for 内でしか使えないくせに
for 外で同じ名前の変数使おうとすると変数の重複でエラーになったんだよな。
しかも J++ でも同じような事になっていた。
今のはどうなんだろう。

for(int i=0; ...; ...){...}
for(int i=0; ...; ...){...}  // ← i は宣言されていますとか何とか

638 :デフォルトの名無しさん:2009/05/04(月) 19:50:11
>>637
2005以降は直ってる

639 :デフォルトの名無しさん:2009/05/04(月) 21:00:03
>>621
なんで、ゆとりをゆとり世代と勝手に解釈してるんだ?
これがゆとりなのか

640 :デフォルトの名無しさん:2009/05/04(月) 21:45:10
その理屈は苦しい

641 :デフォルトの名無しさん:2009/05/04(月) 23:14:28
>>610
学校ではC99を教えているのか? で、なんでLSI-C試食版が絶滅して欲しい?
C99対応コンパイラじゃないから?

642 :デフォルトの名無しさん:2009/05/04(月) 23:57:40
610じゃないが、あまりメジャーじゃない開発環境だと、質問される側も困ることが多いかな。
どうせなら実際に現場で使われてる環境で学習した方が後々の効率もいいだろうし。
組み込みじゃ、試食版じゃないLSI-Cってそんなに使われてるの?

643 :デフォルトの名無しさん:2009/05/05(火) 00:02:47
LSI-Cが市場の54%占めてるよ

644 :610:2009/05/05(火) 00:22:12
>>641
LSI-C試食版ですが、そもそもC99の構文を使うとコンパイルできませんし、
x86のスモールモデルしか対応していないので、C99の構文を避けたとして
も、宿題のプログラムが動かないこともあるからです。

宿題を自宅パソコンでやりたかったら、Linuxか何かを使うか、MinGWか
Cygwinを入れてgcc 4.0以上を使えるようにしておけと案内しているのですが。

645 :デフォルトの名無しさん:2009/05/05(火) 00:34:08
for文の初期化子に宣言を書くのは普通に使ってるけど、gccだとわざわざ
-std=c99と書かなくてはならないのが面倒だよね。さっさとデフォルトで
使えるようになってほしいんだけどな。

646 :デフォルトの名無しさん:2009/05/05(火) 00:54:21
>>644
LSI-C試食版が絶滅して欲しいのは自分(達)の都合が悪いからってこと?
自分達の都合が悪いと絶滅して欲しいと...

647 :デフォルトの名無しさん:2009/05/05(火) 01:32:10
Win98は絶滅して欲しいってのと同じだろ?

648 :デフォルトの名無しさん:2009/05/05(火) 02:03:42
試食版ってint2バイトだっけ?

649 :デフォルトの名無しさん:2009/05/05(火) 08:36:11
64bit版Windowsが普通になれば
LSICはコンパイラも作った実行ファイルも
そのままじゃ動かないから自然に消えるだろうけどなあ

>>646
はっきり言って知らずに使ってる人が不幸だから
なくなってほしいと思うよ

650 :デフォルトの名無しさん:2009/05/05(火) 08:38:34
>>649
LSICはWindows7に対応するだろ
嘘を付くな嘘を

651 :デフォルトの名無しさん:2009/05/05(火) 08:52:34
64bitって言ったんだけど

652 :デフォルトの名無しさん:2009/05/05(火) 10:00:13
std::lessとかstd::greaterとかが何の宣言もなく出てきている様に思えるんだけど、
これはどの標準ライブラリに含まれているものなの?

653 :デフォルトの名無しさん:2009/05/05(火) 10:11:35
>>646
逆に、今現在LSIC試食版でC言語の学習をするメリットってなに?
簡単に使える無料コンパイラが無かった当時は貴重な存在だったのは認めるが、
今ならもっといい開発環境が無料で手に入るんだし。

654 :デフォルトの名無しさん:2009/05/05(火) 10:44:36
C++にて、コンストラクタにexplicitを付けることの利点を学びました。
MyClass::MyClass(int i)
などは付ける意味があるのは分かりましたが、
コピーコンストラクタ
MyClass::MyClass(const MyClass& i)
にも付けることの意味ってありますか?


655 :デフォルトの名無しさん:2009/05/05(火) 12:37:13
LSI-Cより、C99書式をつかう先生をなんとかした方がいい気がする

656 :デフォルトの名無しさん:2009/05/05(火) 12:49:26
LSI-C と C99 書式を使う先生が居たらどう考えても何とかした方が良いのは前者だろ。
くみこも専門学校なら兎も角。

657 :デフォルトの名無しさん:2009/05/05(火) 12:49:50
C++とちゃんぽんになってるだけなんじゃね?

658 :デフォルトの名無しさん:2009/05/05(火) 12:52:26
今だとスタック4kではまる人もたまにいるしなあ

659 :デフォルトの名無しさん:2009/05/05(火) 12:53:38
>>655
LSI-C販売元乙

660 :デフォルトの名無しさん:2009/05/05(火) 12:59:46
今の話題は試食版だし、販売元は関係ないだろう

661 :デフォルトの名無しさん:2009/05/05(火) 13:11:10
今の時代にC++じゃないCを教える意味ってあるかなあ?
それこそ組み込み系ぐらいだよね

662 :デフォルトの名無しさん:2009/05/05(火) 13:24:58
生のメモリはCじゃないと見えにくいと思う。そういうモデル構築のためには必要だと思う。
C++だと誰かが書いたアロケータですんでしまうからなぁ。

663 :デフォルトの名無しさん:2009/05/05(火) 13:30:48
なにその C++ だとポインタ使わなくても済むみたいな言い草。

664 :デフォルトの名無しさん:2009/05/05(火) 13:35:35
>>663
デンジャーなところはクラスがラップしてくれるから生のポインタはあんまり触らないな。
ポリモーフィズムもあんまりやらないせいなのかもしれんが。
個人的にはVectorあれば大体片付くからね。
特に、Sizeメソッドとインデックサあればアウトオブレンジはほとんど無い。

665 :デフォルトの名無しさん:2009/05/05(火) 13:42:20
Cはほどよく抽象度が低いところが教育的なんじゃないかと。
情報系学科の学生さんなら、基本的なアルゴリズムやデータ構造を
一度くらい自分で実装したりする機会もあっていいのでは。


666 :デフォルトの名無しさん:2009/05/05(火) 13:54:05
ですよねー

667 :デフォルトの名無しさん:2009/05/05(火) 14:04:35
あとパソコンじゃなくマイコンでやるべきだね
OSとかないほうがいい

668 :デフォルトの名無しさん:2009/05/05(火) 14:12:27
自分は大学で最初に習ったのがPascal(VAX-11 4.2BSD上)とPDP-11の
機械語(OSなし)で、いろいろやって不満を感じたころにCluという言語を
習って目から鱗が落ちた経験があります。
今でも最初にCあたりでスタートしてから高レベルな言語に移るのもあり
ではないでしょうかね。

669 :デフォルトの名無しさん:2009/05/05(火) 14:14:30
CのあとにPerlやったら目から鱗だった俺みたいなもんか

670 :デフォルトの名無しさん:2009/05/05(火) 14:20:29
>>654
実はコピーコンストラクタではありませんというとんでもないクラスならexplicit付けておけ。
ようするに、コピーコンストラクタにexplicit付ける理由はない。

671 :654:2009/05/05(火) 14:51:45
>>670
意味ないのですね。
ありがとうございます。

672 :デフォルトの名無しさん:2009/05/05(火) 16:37:34
char s[200]ってのがありまして、

sprintf(s, "%s hoge", s)みたいにするのっていいのでしょうか。


673 :デフォルトの名無しさん:2009/05/05(火) 17:03:09
動作未定義っぽい気がする。それなら strcat(s, " hoge") だな。

674 :デフォルトの名無しさん:2009/05/05(火) 17:03:51
>>672
それは簡単にセキュリティを阻害できるのであんまり好ましくないが、変換には便利なので利用される。
調べてみたらセキュリティ強化版のsprintf_sというのがC99から導入されたようだ。
コンパイラが対応してるならそっちを使ったほうがいいのかもしれん。

675 :674:2009/05/05(火) 17:05:11
あ、おかしなこと言ってるな。すまん。
俺も未定義なきがする。

676 :デフォルトの名無しさん:2009/05/05(火) 17:07:49
>>653
俺は学習するメリットとかについては何も言っていない。
>>644の俺の分析は
自分の担当学生が言うことを聞かずにLSI-C試食版を入れる。
そのサポートが大変で困っている。
これはLSI-C試食版存在するのが原因である。
だから絶滅して欲しい。

俺思うに真の原因は指定を無視してLSI-Cを入れた学生だろ。
その学生にこそお前氏ねといったほうが良いんじゃないのかと思ったんだ。
でも、TAはLSI-C試食版氏ね。

677 :デフォルトの名無しさん:2009/05/05(火) 17:15:25
>>672
いかにも未定義臭い書き方だなぁ。

678 :デフォルトの名無しさん:2009/05/05(火) 17:26:35
ポインタが重ならなければ大丈夫だよ

679 :デフォルトの名無しさん:2009/05/05(火) 17:31:42
だからそういうのを未定義とか実装依存とか言うんだよ。

680 :デフォルトの名無しさん:2009/05/05(火) 17:32:48
それは違うぜ、ぼうや

681 :デフォルトの名無しさん:2009/05/05(火) 17:34:22
>>677
そのとおりだな。
VC8じゃstrcatになった。
BCC6.1じゃsの上書きでsは hoge のみ


682 :デフォルトの名無しさん:2009/05/05(火) 17:39:32
おいおい、sprintfのドキュメントも読んでないのか

683 :デフォルトの名無しさん:2009/05/05(火) 17:45:08
ドキュメント?
Cの仕様書かい?

684 :デフォルトの名無しさん:2009/05/05(火) 20:08:06
STLのコンテナをメンバに持つクラスがあったとします。
このとき、コンテナをポインタとして持つのか、それともそのまま持つのか
どちらにするべきなんでしょうか?

つまり
class HogeA {
// ...
private:
std::vector<int> vec;
};

なのか
class HogeB {
// ...
private:
std::vector<int> *vec;
};

のどちらが良いか、ということです。

任意のタイミングで初期化する必要がなければ、
HogeAの方が楽ですし、deleteし忘れもないので良いと思うのですが
HogeBならばvectorをincludeしなくてよいため、ヘッダの依存関係が無くなって良いかも?と思うのです。
(STLのようなライブラリをincludeする場合は、気にしなくても良いのかもしれませんが…)

検索しても関係ないものがひっかかってモヤモヤしております。


685 :デフォルトの名無しさん:2009/05/05(火) 20:13:23
>>684
HogeBの場合、
pimplイディオムが味方になってくれそうな状況だな。

c++ ? ありえるえりあ
ttp://dev.ariel-networks.com/Members/matsuyama/categories/c
この辺とか
pimplまとめとか - プログラマブル俺
ttp://d.hatena.ne.jp/portown/20090318/1237389062
この辺とかかな。

あと他にpimplについて分かりやすく説明しているサイトを
知っているお方が居たら教えてくださいな、俺も知りたい。

686 :684:2009/05/05(火) 20:21:41
>>685
ありがとうございます。pimplイディオムで検索して色々調べてみようと思います。
C++は奥が深そうですね。

687 :デフォルトの名無しさん:2009/05/05(火) 20:23:16
奥が深いっつうか、増築に増築を重ねて迷路みたいになった古旅館みたいなもんだが。

688 :デフォルトの名無しさん:2009/05/05(火) 20:31:21
>>687
>増築に増築を重ねて
まあまさにそのとおりだな。
でもC++の魔力ってあるよねやっぱ・・・学んでて面白い俺は変態か?


689 :デフォルトの名無しさん:2009/05/05(火) 21:04:50
C++の隅から隅まで知ろう、そして使い倒そう、人に講釈しよう
と一つでも思い始めたら変態です。気おつけましょう

690 :デフォルトの名無しさん:2009/05/05(火) 21:07:20
>>687
おっと大沢温泉の悪口はそこまでだ

691 :デフォルトの名無しさん:2009/05/05(火) 21:09:29
>>689
残念ながら
「TMPってすげー!でもやるのはめんどうだな、他の人にやってもらおう、俺は利用するだけでいいや」
と思っている程度の俺は変態じゃないのか。

早く変態にならなければ。


692 :デフォルトの名無しさん:2009/05/05(火) 21:12:17
あのー他にC++のイディオムってどんなのが
あるのでしょうか。すごく知りたいです

693 :デフォルトの名無しさん:2009/05/05(火) 21:20:07
日本語版More C++ Idioms - Wikibooks
ttp://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms
英語版More C++ Idioms - Wikibooks, collection of open-content textbooks
ttp://en.wikibooks.org/wiki/More_C%2B%2B_Idioms
でも正直読みづらいと思う。
やっぱりなんかの成書が一番だろうか。
もっとお詳しい方プリーズ

694 :デフォルトの名無しさん:2009/05/05(火) 21:21:26
伝説巨人

695 :デフォルトの名無しさん:2009/05/05(火) 23:47:08
コピーコンストラクタを生成しないように
するための最善策というと何があるのでしょうか

696 :デフォルトの名無しさん:2009/05/05(火) 23:55:23
コピーコンストラクタの中でabortする。

697 :デフォルトの名無しさん:2009/05/05(火) 23:58:00
ええええ

698 :デフォルトの名無しさん:2009/05/05(火) 23:59:29
ウェイト 10 秒

699 :デフォルトの名無しさん:2009/05/06(水) 00:08:24
>>695
コピーコンストラクタってプレイベートにしても効果あったっけ??わすれちゃった。

700 :デフォルトの名無しさん:2009/05/06(水) 00:20:14
letsboost::noncopyable
ttp://www.kmonos.net/alang/boost/classes/noncopyable.html


701 :デフォルトの名無しさん:2009/05/06(水) 00:50:58
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を比較して大きかったほうが最大値。
こちらのプログラムに似せた形で作れるならばそれで作りたいです。
大きいもの二つだと急に複雑になってしまいよくわからなくなりました。

702 :デフォルトの名無しさん:2009/05/06(水) 01:12:24
>>701
std::maxという関数がC++標準であってだな、AとBくわせて戻り値とCを食わせると最大値が得られる。
std::minという関数もあってだな、AとBを食わせて戻り値とCを食わせれば最小が得られる。
この場合はminで最小を求めてほかの2個を出力するほうが楽かもしれん。
swap関数って言うのもあるんだが、
AとB比較して昇順か降順にスワップして、BとCを同じように比較してスワップしてAとCも同じように比較してスワップすれば、いけそうな気がする。
絡まってきたら関数にくくりだすのが良いと思うよ。

俺の場合はifが滅茶苦茶になりかけたら破棄して書き直すなぁ。

703 :デフォルトの名無しさん:2009/05/06(水) 01:14:13
スワップのあたりは間違ってるような気がしてきた・。・

704 :デフォルトの名無しさん:2009/05/06(水) 01:17:57
配列につっこんでstd::sortとかやりだすと一番楽だけど
元のコードと何一つ似てる点がなくなるw

705 :デフォルトの名無しさん:2009/05/06(水) 02:05:59
ありえる順序は 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
でいいんじゃね?(同じ値が入る場合は、適当に処理するとして)

706 :デフォルトの名無しさん:2009/05/06(水) 02:13:12
>>687
Perlにも言えそう

707 :デフォルトの名無しさん:2009/05/06(水) 09:23:21
minmaxとタプル使えば2,3行で書けそうだな

708 :デフォルトの名無しさん:2009/05/06(水) 09:29:57
正解の条件がアイマイだと途端に面倒になるいい例だね

709 :デフォルトの名無しさん:2009/05/06(水) 11:00:06
int max;
max = (a >= b) ? a : b;
max = (c > max) ? c : max;
printf("最大値は %d\n", max);

こんなんでよくね?

710 :デフォルトの名無しさん:2009/05/06(水) 11:01:19
お前は何を言ってるんだw

711 :デフォルトの名無しさん:2009/05/06(水) 11:05:12
フヒヒwwwwwサーセンwwwwwwww

712 :デフォルトの名無しさん:2009/05/06(水) 15:04:57
>>708
最大値を求めて、残りの中から最大値を求める。
最小値を求めて、それ以外を出力する。

713 :デフォルトの名無しさん:2009/05/06(水) 19:29:47
maximumとsecondを用意すれば元のコードを活かせるだろうけど
まあ、配列利用するのが楽だよなあ

714 :デフォルトの名無しさん:2009/05/06(水) 21:14:58
もとのようにやるなら
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);
}

715 :デフォルトの名無しさん:2009/05/06(水) 21:23:37
もっとも、実際にそんなコード書く奴はセンスが無いと判断するけどねぇ。

716 :デフォルトの名無しさん:2009/05/06(水) 21:38:40
実際には書かないけど、すぐ書けるor読んですぐ解るくらいの能力は必要。

717 :デフォルトの名無しさん:2009/05/06(水) 21:51:05
なまじそういう能力があるから力技で糞コードを生産するという事実も

718 :デフォルトの名無しさん:2009/05/06(水) 22:26:03
>>701 からの流れを読んで、
プログラマって数学出来る奴とできない奴に分かれるなってよくわかった。
無論 >>701 以降はすべてできない奴だが。

a > b == c とかどうすんだ。

719 :デフォルトの名無しさん:2009/05/06(水) 22:29:36
テストの問題も読めないようなバカはすっこんでろよ。

720 :デフォルトの名無しさん:2009/05/06(水) 22:31:03
昇順にソートして2番目と3番目の数値
表示するのはダメでつか?


721 :デフォルトの名無しさん:2009/05/06(水) 22:33:35
>>718
「大きい二つの数を表示」だからあまり問題ないと思うよ。

722 :デフォルトの名無しさん:2009/05/06(水) 22:39:18
>>718
ほほう、その場合何が困るのか説明してもらおうか

723 :デフォルトの名無しさん:2009/05/06(水) 23:01:26
要は問題が ill-formed なんだが、まあそれはこのスレのレベルの低さとは直接は関係ない。

>>719
うんうん、よかったね

>>721
本気で言ってるのか?w

>>722
少しは自分で考えてみ

724 :デフォルトの名無しさん:2009/05/06(水) 23:02:56
要約: 説明できません

725 :デフォルトの名無しさん:2009/05/06(水) 23:04:25
特に C/C++ をやっている人間って二極化してて、
曲がりなりにも情報科学をちゃんと勉強してて数学も出来る香具師と、
専門学校レベル出で、反復と経験だけでプログラムできるようになってる香具師がいるってこった。

726 :デフォルトの名無しさん:2009/05/06(水) 23:05:06
>>724
ヒントは書いたからな。それでわからんような香具師に付き合う時間はないよ

727 :デフォルトの名無しさん:2009/05/06(水) 23:06:21
こういう他人を見下す奴に限ってたいしたこと無いんだよな

728 :デフォルトの名無しさん:2009/05/06(水) 23:09:05
情報科学(笑)
木構造でも使うべきなのか

729 :デフォルトの名無しさん:2009/05/06(水) 23:12:11
>>718
プログラミング初心者にありがちな間違いだな。

730 :デフォルトの名無しさん:2009/05/06(水) 23:15:07
情報科学と数学が出来る>>718の解答マダー?(・∀・ )っ/凵 ⌒☆チンチン

731 :デフォルトの名無しさん:2009/05/06(水) 23:22:21
ケース漏れ詮索ばかりやってるから肝心の目的を読んでなかっただけだろ。
もう逃亡宣言もしたんだし許してあげなよw

732 :デフォルトの名無しさん:2009/05/06(水) 23:22:58
>>718
a > b == c は a > b かつ c == 1 のときと a <= b かつ c == 0 のとき真

733 :デフォルトの名無しさん:2009/05/06(水) 23:23:54
>>732
正直その発想はなかった

734 :デフォルトの名無しさん:2009/05/06(水) 23:38:11
バカ宣言して逃亡ww
どこの中学生が紛れ込んだんだよwwwwww

735 :デフォルトの名無しさん:2009/05/06(水) 23:44:00
>>718
初心者のよくする間違い乙。
職もないし未来もない。
この上2chでまでいじめられるとはwww
でもまあいいじゃん、色んな生き方があるさw


736 :デフォルトの名無しさん:2009/05/06(水) 23:46:58
>>718
どうもしない。
特に指定がない場合はaとb(=c)の2つを表示するだけ。

737 :デフォルトの名無しさん:2009/05/06(水) 23:50:02
>>734
きっと無能市立無能中学校じゃないかな?


738 :デフォルトの名無しさん:2009/05/07(木) 00:20:01
見逃してた何かがあったのかとワクワクして読み進めたのに逃亡かよ。
3 年 ROM ってろ。

739 :デフォルトの名無しさん:2009/05/07(木) 00:28:53
横だが、

>>736
それ題意満たしてるか?

じゃあ
a=b=cの場合と
a=b>cの場合は?

数学的にってことは、
a,b,c が相異なるのか、そうでないかに場合わけして考える必要があるのと、
「m個の中の上位n個を選択する」というより一般化した解答を書けってことじゃないの?

740 :デフォルトの名無しさん:2009/05/07(木) 00:30:38
あのーソートして上位2個選んじゃ
ダメなのでしょうか?

741 :デフォルトの名無しさん:2009/05/07(木) 00:31:27
仕様書を勝手に誇大解釈する奴がプロジェクトに居ると苦労する。

742 :デフォルトの名無しさん:2009/05/07(木) 00:35:58
>>740
a,b,cが相異なるならそれでいいと思うが、そうでない場合困る。

たとえば、成績上位2人に御褒美をあげたいからそういうプログラム書いてって仕様の時、
全員同じ点数だったら3人目がカワイソス。

743 :デフォルトの名無しさん:2009/05/07(木) 00:37:39
なんか場合分けで解けっていう縛りがあるみたい
入門書でよくあるパターンの三回の比較・交換(バブルソート)で終了だとつまらないから
別のやり方でってことなんかな?

744 :デフォルトの名無しさん:2009/05/07(木) 00:39:32
>>741
このケースは、あいまいな仕様をきちんと詰めて確認しないSEに問題があるケースだろうな。
プログラムかけないSEとかいるとほんと苦労するぜ

745 :デフォルトの名無しさん:2009/05/07(木) 00:40:20
「数を表示するプログラム」って書いてあるのが見えず、行間を必死に読もうとしているバカって何なの?

746 :デフォルトの名無しさん:2009/05/07(木) 00:42:06
所々全角に変えても自己弁護に戻ってきたのバレバレだな。

747 :デフォルトの名無しさん:2009/05/07(木) 00:43:38
>>739
こういう問題は全部違う数であることは暗黙の了解。
例外な場合は特に指定がない場合は考えない。

748 :デフォルトの名無しさん:2009/05/07(木) 00:45:51
>>745
その「数」が何かってのが問題なんだろう。
ユニークな数なのか、数の組が意味があるのか。
>>739 の前半参照

この仕様はあいまいだと思うぜ。

749 :デフォルトの名無しさん:2009/05/07(木) 00:47:29
>>747
> こういう問題は全部違う数であることは暗黙の了解。

うーん、残念ながら君はこのままでは一人前のプログラマにはなれないと思うよ。
ベントリー本とかで勉強してみたら?

750 :デフォルトの名無しさん:2009/05/07(木) 00:47:31
妄想ふくらませすぎて勝手に自分仕様追加してるだけじゃん…
どこの PG 一年生だよ。

751 :デフォルトの名無しさん:2009/05/07(木) 00:50:20
>>749
前提は701のソースなんだが、上位2つが同じときとか、3つ全部等しいときに例外処理してるか?
お前がバカなのは十分わかったから少しだまってろよw

752 :デフォルトの名無しさん:2009/05/07(木) 00:52:21
>>751
前提は >>701 の問題文であってソースは前提ではないな。わかるか?

753 :デフォルトの名無しさん:2009/05/07(木) 00:54:27
というか、今日は釣れまくっとるw

50レスか。低学歴馬鹿にするのもたまにはいいな。みんなごめんねwww

754 :デフォルトの名無しさん:2009/05/07(木) 00:55:29
後釣り宣言==敗北宣言w

755 :デフォルトの名無しさん:2009/05/07(木) 00:58:15
>>748
数は数。何の提示も示唆もないのに数値が生徒情報その他とリレーションを持ってるケースを
想定して曖昧だなんて アフォ も良いとこ。厨二プログラマにありがちな解釈の暴走だな。

756 :デフォルトの名無しさん:2009/05/07(木) 00:59:43
真っ赤な顔して釣り宣言してもバカは隠せませんよ。

757 :デフォルトの名無しさん:2009/05/07(木) 01:02:14
黙って >>726 で消えてれば良かったのにバカな奴w

758 :デフォルトの名無しさん:2009/05/07(木) 01:11:24
>>755
> 数は数。
>>739 の前半の解答を紙に書いてみて。

たぶん必死になってるのは一人だと思うが、

- 自分勝手な暗黙の了解を仮定する
- 条件提示がない場合に自分に都合のよい選択肢を選ぶ
- 例外は考えない

社会に出たら、デスマーチへようこそ、ですよw
じゃあね

759 :デフォルトの名無しさん:2009/05/07(木) 01:14:59
こんなもん外国なら問題が悪いで終わるのに
必死になってやろうとするのもアホだよなぁw

760 :デフォルトの名無しさん:2009/05/07(木) 01:15:12
こんな単純なif分岐問題で例外とかバカ言ってるのはお前一人だけだw

761 :デフォルトの名無しさん:2009/05/07(木) 01:20:17
>>758
底辺コーダーがデスマーチのしすぎで脳が破壊されたか?w

762 :デフォルトの名無しさん:2009/05/07(木) 01:20:38
> 横だが

バカかこいつ

763 :デフォルトの名無しさん:2009/05/07(木) 01:21:24
>>762
本人は他人の振りができてると思ってるんだから、そっとしといてやれよw

764 :デフォルトの名無しさん:2009/05/07(木) 01:35:30
>>758
- 自分勝手な暗黙の了解を仮定する
>「m個の中の上位n個を選択する」というより一般化した解答を書けってことじゃないの?

- 条件提示がない場合に自分に都合のよい選択肢を選ぶ
> 前提は >>701 の問題文であってソースは前提ではないな。

- 例外は考えない
> たぶん必死になってるのは一人だと思うが、

社会に出てからずっとデスマーチやってるんだろうなこの人。

765 :デフォルトの名無しさん:2009/05/07(木) 01:37:19
#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;
}

こんなんでいいんじゃないっすかね

766 :デフォルトの名無しさん:2009/05/07(木) 02:14:42
>>758
おまいは「同値が含まれる場合の『上から2つ』があいまい」、例えば (a=2,b=1,c=2) の時に
(2,2) を出せば良いのか (2,1) を出せば良いのか不確定と言いたいのだろうけど、問題は「『3つの
入力値の中から』上2つ」だから (2,2) で良い。

「仕様が曖昧だから作れない!」って言いたいだけのお年頃か知らんが、含みを持たせるならもっと
サプライズがないとバカが出し惜しみしただけにしか見えないぞ。

767 :デフォルトの名無しさん:2009/05/07(木) 02:27:34
最初に出した例とかを見ると、勘違いで一度逃亡した後にそういう設定を思いついたんだと思うが。

768 :デフォルトの名無しさん:2009/05/07(木) 02:41:03
引っ張った割にしょぼいオチで莫迦さ加減倍増www

769 :デフォルトの名無しさん:2009/05/07(木) 02:44:32
712
> 3つの数を入力してその中で大きい二つの数を表示するプログラムを作りたいのです。
1つ目の数を入力したら、2だった。
2つ目のは4だった。
ここまでで、4は出力されることが決まった。
3つ目の数が5なら、2は出力されない。
3つ目の数が3なら、2は出力されない。
3つ目の数が4なら、2は出力されるかされないか。

770 :デフォルトの名無しさん:2009/05/07(木) 06:47:43
>>769
帰れ

771 :デフォルトの名無しさん:2009/05/07(木) 07:36:56
>>760 以降
必死すぎてワラタ

772 :デフォルトの名無しさん:2009/05/07(木) 07:52:33
レベルの低い質問にはレベルの低い回答者が群がるってのは本当だなぁ。
>>766
まあ一人なのかもしれないが、こいつほんと馬鹿だなw

> 問題は「『3つの入力値の中から』上2つ」だから

勝手に読み替えちゃだめだろう。お前の脳がサプライズだよ。
問題は『3つの数を入力してその中で大きい二つの数を表示する』だ。
3つの入力値の中からとは書いてない。

上で 「数は数」 とか抜かしてる奴がいたがそれに従えば
もし入力が 3, 3, 2 なら、
出力は数として上から二つとると 3,2 になってしまうな。

773 :デフォルトの名無しさん:2009/05/07(木) 07:56:09
3,2,2ならいずれにせよ3と2じゃね?

774 :デフォルトの名無しさん:2009/05/07(木) 08:12:42
こんなどうでもいいことにここまで必死になれる情熱がうらやましい

775 :デフォルトの名無しさん:2009/05/07(木) 08:30:05
>>772
フーン

で、それがどう情報科学や数学と
関係あったのか教えてもらおうか

776 :デフォルトの名無しさん:2009/05/07(木) 08:33:08
>>772
「3つの数を入力してその中で大きい二つの数」を選ぶのに、
3つの入力値の中からじゃないってのはどういう意味だ?w

777 :?:2009/05/07(木) 08:38:27
 

778 :デフォルトの名無しさん:2009/05/07(木) 08:50:35
重複を許すか許さないか明示されていないからどちらでも正しいよ。
その点で言い争っても結論は出ない。

779 :デフォルトの名無しさん:2009/05/07(木) 09:06:59
705 708 が結論を出してるのに丸一日無意味な殴り合いお疲れって事だね

780 :デフォルトの名無しさん:2009/05/07(木) 09:09:35
718が一人で暴れてただけw

781 :デフォルトの名無しさん:2009/05/07(木) 09:20:18
プログラマなら数が同じ場合はどうしますか?
って聞いて終わりだろ。

782 :デフォルトの名無しさん:2009/05/07(木) 09:20:38
おまいら私がアクセス制限されている間に楽しそうにしやがってw
で、>718はもう来ないのかな?

783 :デフォルトの名無しさん:2009/05/07(木) 09:32:13
>>781
だな。まずその疑問が出てこないとプログラマじゃない。

上は全部落第だよ。得意げな >>705 とか笑える。

784 :デフォルトの名無しさん:2009/05/07(木) 09:55:03
>>783
それじゃ、この辺りで模範解答を宜しく。

785 :デフォルトの名無しさん:2009/05/07(木) 09:58:45
>>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);
}

786 :デフォルトの名無しさん:2009/05/07(木) 10:16:08
こんなんで一々入れ替えのロジック組まれたら溜まったもんじゃないけどねぇ。

787 :デフォルトの名無しさん:2009/05/07(木) 11:49:30
#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は素晴しい…

788 :デフォルトの名無しさん:2009/05/07(木) 11:58:05
>>787
なんか変態コードの一歩前見たなコードだな。
これってBoost?

789 :デフォルトの名無しさん:2009/05/07(木) 12:01:23
>>788
boostじゃなくね?名前空間もインクルードファイルもライブラリ名もboostにない物な気がする。


790 :デフォルトの名無しさん:2009/05/07(木) 12:05:08
ovenだっていってるがな。

791 :デフォルトの名無しさん:2009/05/07(木) 12:49:41
ぐぐってみた。Boostじゃないな。
パイプがちょっとイレギュラーな使い方のような印象。

792 :デフォルトの名無しさん:2009/05/07(木) 12:59:15
>>772
だから (a, b, c) = (3, 3, 2) の集合から値の大きい 2 つを選んでみろよw
勝手に読み替えちゃだめだろw

793 :デフォルトの名無しさん:2009/05/07(木) 13:39:04
この釣りどこまで引っ張る気?

794 :デフォルトの名無しさん:2009/05/07(木) 14:46:34
等値ケース思い付いて天才数学者気取りだったのか…

795 :デフォルトの名無しさん:2009/05/07(木) 23:07:46
つーか、>>701読みにくい
インデントちゃんといれてくらはい

796 :デフォルトの名無しさん:2009/05/07(木) 23:34:58
100近くも引っ張るネタだったのか
というか701出てこいよ

797 :デフォルトの名無しさん:2009/05/07(木) 23:51:25
Cの参考書中の例題(文字列の配列の動的な確保)について質問です。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9141.txt

このプログラム中の、
(1) char (*p)[15]; はどういう意味(どういう意図のコード)でしょうか?
  http://kmaebashi.com/programmer/pointer.html を見ると
  pはcharの配列(要素数15)へのポインタである ということだと思うのですが、
  いまいちイメージできません。解説をお願いします。

(2)p = (char (*)[15])malloc(num * 15); の(char (*)[15]) はどういう意味(どういう意図のコード)でしょうか?
  解説をお願いします。

798 :デフォルトの名無しさん:2009/05/08(金) 00:24:00
>>787
これすげーな。
C++ でこんな関数型言語の真似ごとみたいなことが出来るのか。
ごてごてとした冗長さもC++らしいわw

まあ Ruby とかでやったら

irb> [x, y, z].sort.drop(1)

だけですんじゃうんだけどね。

799 :デフォルトの名無しさん:2009/05/08(金) 00:34:01
まあね。
ああいうのはC++でやることに意義があるという構えでいないとやっていられないと思う。

800 :デフォルトの名無しさん:2009/05/08(金) 00:37:11
>>788-791
RanceExの一部として、そのうちBoost化されるのが決まっているらしい。

801 :デフォルトの名無しさん:2009/05/08(金) 00:42:52
>>797
とりあえずその参考書でイモでも焼いて、K&RかH&Sあたりのまともな
本を読むことをおすすめします。

802 :デフォルトの名無しさん:2009/05/08(金) 00:58:31
>>797
pは要素数15のchar型の配列へのポインタを表す

すなわち p++; とすると、pは +1 されるのではなく +15 される

803 :デフォルトの名無しさん:2009/05/08(金) 02:05:13
何を基準に+15なのか明確にしないと、混乱するだけだろ

804 :デフォルトの名無しさん:2009/05/08(金) 02:23:44
sizeof(char) * 15

805 :デフォルトの名無しさん:2009/05/08(金) 03:32:34
1、3行での説明とか困難な話になるよね
そして>>801は糞

806 :デフォルトの名無しさん:2009/05/08(金) 05:48:30
どこが困難?

char p[num][15]; をヒープメモリに確保した。
「添え字に変数」 と 「ヒープメモリに確保」 の実現に malloc を使わない記述だと
実現困難か例よりさらに変体的に成る。

807 :デフォルトの名無しさん:2009/05/08(金) 09:14:33
>>806
日本語でおk

808 :デフォルトの名無しさん:2009/05/08(金) 22:31:19
>>807
>>806の日本語理解できないのか?(お前の日本語でおkよりはるかに良いぞ)
もし、そうならお前、ド低脳だぞ


809 :デフォルトの名無しさん:2009/05/08(金) 22:36:42
>>806-808
流れが面白いw

とりあえず806は意味不。

810 :808:2009/05/08(金) 23:12:25
>>809
ほんとに何を>>806が言っていることが分からないのか。
言っていることのどこが分らんのよ?たった、2行文だぜ
低脳の俺ですら言っていること分るんだが....
分らないなら、ゆとり丸出しだぞ。(ただ言っていることが正しいのか、低脳の俺には分らんが)

811 :デフォルトの名無しさん:2009/05/08(金) 23:14:50
>>806の文章は意味を理解したくない文だね
きもいしw

812 :デフォルトの名無しさん:2009/05/08(金) 23:21:58
てめーら喧嘩すんな、身のある話をしろ。


813 :808:2009/05/08(金) 23:23:29
>>812
>>806の言っていることは正しいのか?

814 :デフォルトの名無しさん:2009/05/08(金) 23:27:54
うん

815 :808:2009/05/08(金) 23:31:01
そうか。ありがと

816 :デフォルトの名無しさん:2009/05/08(金) 23:31:26
厳密には間違ってるけどなw

817 :812:2009/05/08(金) 23:38:23
>>813
わからん。そもそも読む気にならないし俺がなんと言ってもアンチ意見が沸くだろうし。。
適当な落としどころをつけてくれよ。それでいいじゃないか。

818 :デフォルトの名無しさん:2009/05/08(金) 23:41:12
mallocを使わずcallocでも使えばいいじゃない

819 :デフォルトの名無しさん:2009/05/08(金) 23:41:40
>>806
>どこが困難?

おまえの日本語だw

820 :デフォルトの名無しさん:2009/05/09(土) 01:10:00
callocはなんか無意味に直交性捨ててるようで嫌だ。

821 :デフォルトの名無しさん:2009/05/09(土) 03:10:21
/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 機なんでバイト順序の入れ替えなしでも正しくは動くんですけど。

822 :デフォルトの名無しさん:2009/05/09(土) 04:12:49
質問です
C++で関数を作ったときに引数を省略する書き方があるとおもうんですけど
int型なら 引数xがあったときに x=0 と書いて置けば良いと思うのですが
自分で定義した構造体を引数にとる場合、それを省略させるためにはどのように書けばよいのでしょうか
例えば以下のような場合です.
?の所には何をいれればよいのでしょうか・・・


kansuu.h-----

typedef struct tagAAA{
int a;
int b;
}AAA;

void TEST( int x = 0, AAA Aaa = ? );

823 :デフォルトの名無しさん:2009/05/09(土) 04:17:07
なんで C++ なのに C ライクな記述をするのかしらんと思いつつも
それはさておいて、AAAのコンストラクタが許すものならなんでも書けます。
例えばデフォルトコンストラクタなら

AAA Aaa = AAA()

のように。

824 :デフォルトの名無しさん:2009/05/09(土) 04:27:00
>>823
ありがとうございました orz ぺこぺこ

関数内で計算したデータをほかでも使う必要がでてきて、構造体の形で取り出したかったもので
たまにしか使わないし、どうしようと思いながら・・・
こういう場合は他にもいい方法があるのでしょうかアウアウ

825 :デフォルトの名無しさん:2009/05/09(土) 08:08:12
>>824
>関数内で計算したデータをほかでも使う必要がでてきて、構造体の形で取り出したかったもので
おいおいAaaに結果を返すのか?
参照かポインタを渡さないと取り出せないぞ?

ポインタならデフォルト引数をNULLにしておいて、
関数内で判定してNULLなら使わなければよい。

それか素直にオーバーロードして、
void TEST( int x = 0, AAA& Aaa);

void TEST( int x = 0);
を作ればよい。

>こういう場合は他にもいい方法があるのでしょうかアウアウ

TESTが他の戻り値を返す必要がないなら、
AAAを返すのが一番自然だと思うぞ。


826 :デフォルトの名無しさん:2009/05/09(土) 08:16:31
メンバ変数で状態を返すコンストラクタ駆動の関数オブジェクトと考えれば何の問題もないだろ?

827 :デフォルトの名無しさん:2009/05/09(土) 11:37:26
あるクラスのメソッド内でbad_allocが投げられたときはそのメソッド内でcatch処理をするべきでしょうか?
それともその外で処理するべきでしょうか?

828 :デフォルトの名無しさん:2009/05/09(土) 11:40:41
>>827
>それともその外で処理するべきでしょうか?
それはつまりクラスのユーザーに処理を任せるって事でしょ?
いわば丸投げだよね。
もしそのメソッド内で処理できるんならそれが最高じゃない?


829 :デフォルトの名無しさん:2009/05/09(土) 11:48:25
ハンドラを関数オブジェクトの形で渡して貰うようにする方法もあるぞ
指定されなければデフォルトのハンドラでメソッド内でcatchとか

830 :デフォルトの名無しさん:2009/05/09(土) 13:28:48
だいたいの場合は、bad_allocはそのまま外に投げちゃっていいと思うけどね。

「bad_allocが発生しちゃうような場合でも、何とかして処理を正常に完了させることができる」
ような関数なら、bad_allocをcatchして適切に処理し、外に出さないことはできる。
でも、そんな芸当ができる関数は少ないと思う。

831 :デフォルトの名無しさん:2009/05/09(土) 16:04:01
そもそも回復可能なbad_allocってどんなのだろうか
そういうのに当たったことがない無知な俺に誰か教えてくれ

832 :デフォルトの名無しさん:2009/05/09(土) 16:29:40
・出来る限り巨大なバッファ確保
・ヒープ上のキャッシュをクリアして再試行

833 :デフォルトの名無しさん:2009/05/09(土) 16:38:38
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;
}

834 :デフォルトの名無しさん:2009/05/09(土) 16:41:33
new T[0xffffffff]のように明らかにおかしな(大きすぎる)要素数を指定した場合とか?

835 :デフォルトの名無しさん:2009/05/09(土) 16:43:17
forの条件を hp1>0 && hp2>0 でどうかな?
検証してないけど。。。

836 :デフォルトの名無しさん:2009/05/09(土) 16:43:56
(hp1<=0)||(hp2<=0)が真のときにforの中身が実行される

837 :デフォルトの名無しさん:2009/05/09(土) 16:49:33
>>835>>836
ああ、ありがとうございます!!
単純にforの始動条件()?勘違いしてました、吸いませんでした

838 :デフォルトの名無しさん:2009/05/09(土) 16:51:02
あはぁん。もっとすってぇ。
あ〜、らめ〜。

839 :デフォルトの名無しさん:2009/05/09(土) 16:51:56
ちゅっちゅっ

840 :デフォルトの名無しさん:2009/05/09(土) 17:16:54
>>834
OSによっては、newは成功するけど実際にメモリ使ってるときに落ちるって挙動になりそうな気がする。

841 :デフォルトの名無しさん:2009/05/09(土) 17:33:39
>>840
そんなOSでもアドレス空間が足りなくてbad_allocという展開を考えた。

842 :デフォルトの名無しさん:2009/05/09(土) 19:34:35
コンストラクタでは例外をなるべく投げない、デストラクタでは例外を投げないようにするべき、というのをどこかのサイトで見たんですけど
ということはコンストラクタ内でnewしないで、alloc()とかほかのメソッドを作っていちいち呼び出したほうがいいんでしょうか?

843 :デフォルトの名無しさん:2009/05/09(土) 19:37:53
>>842
うんそれが正しいw

844 :デフォルトの名無しさん:2009/05/09(土) 19:41:01
コンストラクタさんかわいそうです

845 :デフォルトの名無しさん:2009/05/09(土) 19:52:34
コンストラクタで例外起こすと、newで得られたポインタをdeleteにかけていいのかわからないから。
ってのが理由だった気がするんだけど、今でもそんな曖昧な仕様なの?

846 :デフォルトの名無しさん:2009/05/09(土) 19:54:17
newして成功してメモリアドレスを貰っても
確保に失敗する場合もあるしな

847 :デフォルトの名無しさん:2009/05/09(土) 20:19:11
malloc(sizeof(int)*10)とcalloc(10, sizeof(int))って0で初期化される以外に違いある?

848 :デフォルトの名無しさん:2009/05/09(土) 20:23:01
>>847
ない

849 :デフォルトの名無しさん:2009/05/09(土) 20:32:40
A a = new A(); とした時に 1)メモリ確保、2)コンストラクタ実行、3)aへアドレス代入、
の順序になるから、コンストラクタで例外が発生した場合、アロケートしたアドレスを
ロストして確実にメモリリークになる。

というのは Turbo C++ (96'頃) の知識なんだけど今の規格はどうか知らん。

850 :デフォルトの名無しさん:2009/05/09(土) 20:50:02
mallocとcallocで思い出したけど一般的にはどちらを使うんだろう?
本とかだとmallocが多い気がするんだよな。
mallocのほうが処理が高速なのだろうか?

851 :デフォルトの名無しさん:2009/05/09(土) 20:56:28
ゼロクリアが無い分、mallocの方が高速なのは間違いない。
クリアが必要ならそのあとmemsetすればいいだけだしな。

852 :デフォルトの名無しさん:2009/05/09(土) 20:57:29
でもalloc()作って〜とすると継承するとき困るような

853 :デフォルトの名無しさん:2009/05/09(土) 21:02:26
クリアが必要な場合にmalloc+memsetとcallocのどっちが速いかが問題だろ。

854 :デフォルトの名無しさん:2009/05/09(土) 21:05:09
new/deleteを使うと遅くなるから
C++でもmalloc/free使う方がいいよ

855 :デフォルトの名無しさん:2009/05/09(土) 21:07:20
自分のプログラムの基本的な書き方についてなのですが・・
問題点ってありますでしょうか・・


まずは、クラス、メンバー変数・関数を書いて、インターフェイスとして管理メンバー関数
を作ります。
上流では流れを分かりやすくして、処理は管理メンバー関数に委譲する書き方をします。

例えば、ひとつのオブジェクトのみ生成する必要がある際、
メンバー変数・関数は全てprivateで実装し、インターフェイスのみstatic publicにします。
インターフェイス内で自己classのオブジェクトを生成。既に生成されていれば既存の
オブジェクトを返す。


という様な使い方をしています。

856 :デフォルトの名無しさん:2009/05/09(土) 21:08:28
>>849
03ではコンストラクタでthrowされたとき、デアロケータが実行されるはず。
placement newの場合は各自で面倒見てください。

857 :デフォルトの名無しさん:2009/05/09(土) 21:17:31
>>855
なんでインタフェースがstatic?

858 :デフォルトの名無しさん:2009/05/09(土) 21:31:44
>>857
ただのsingletonパターンだろ


859 :デフォルトの名無しさん:2009/05/09(土) 21:37:48
singletonでインスタンス取得する関数だけstaticにするのならわかるけど、
インタフェースをstaticにする意味がわからん。
あと、管理メンバー関数というのも、どういうものなのかよくわからん。

860 :デフォルトの名無しさん:2009/05/09(土) 21:39:05
すいません。例が非常に悪かったです;;

上でインターフェイス部分を羅列せずに、管理関数内部で一連の処理を行う。
というのは通常使用されるのか、また、自分としては見やすいというメリットが
あるのですが、デメリットもあるのかなと・・
一人で作ってる分には特に不便を感じないもので;

861 :デフォルトの名無しさん:2009/05/09(土) 22:21:32
責務の分配ってやつでしょ
再利用性を高めるためにはいいと思う

再利用なんて一生しないんだけどな!

862 :デフォルトの名無しさん:2009/05/09(土) 22:39:20
>>860
いまいちよくわからんが、オブジェクトを管理する機能と管理されるオブジェクトが同一クラスに入っている
ということであれば、オブジェクトを管理するクラスは管理されるオブジェクトと別のクラス
にするのが一般的。

863 :デフォルトの名無しさん:2009/05/09(土) 22:43:52
>>862
ありがとうございます。まさにその通りです;;
自分の中でもちゃんと纏まってないから駄目なんですね;;

なるほど、確かにその方がより良いですね。
その際に、継承するのか、オブジェクトを取り込むのかは
やはり状況しだいなんでしょうか。


864 :デフォルトの名無しさん:2009/05/09(土) 22:54:55
管理するオブジェクトは管理されるオブジェクトではない(is-a関係ではない)
管理するオブジェクトは管理されるオブジェクトを持つ(has-a関係である)
と考えると、
普通は管理するオブジェクトの中に管理されるオブジェクトを持たせるはず。

865 :しつもーん:2009/05/09(土) 22:57:26
以下のようなコードを書いたのですが
#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に汁にはどうすればいいですか?

866 :デフォルトの名無しさん:2009/05/09(土) 23:01:47
template <class T = double>

867 :しつもーん:2009/05/09(土) 23:12:46
#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だけだとエラー)
で合ってますよね

868 :デフォルトの名無しさん:2009/05/09(土) 23:17:31
>>864
ありがとうございます。オブジェクト指向の基本で読みました;;
幾ばくかすっきりしました。
分かりにくい説明に答えて下さってありがとうございます。

869 :デフォルトの名無しさん:2009/05/09(土) 23:42:24
>>867
その通りだね

後残る手段はdoubleの特殊化しかない
この場合引数をちゃんと小数点を付けて指定しないと
うまくいかないかもしれないな

870 :しつもーん:2009/05/09(土) 23:47:33
ありがとうございました

871 :デフォルトの名無しさん:2009/05/10(日) 20:10:15
Extended STLってどうなんすか?

872 :デフォルトの名無しさん:2009/05/10(日) 22:14:02
C++0xの発表と同時に潰れるだろ

873 :デフォルトの名無しさん:2009/05/10(日) 22:19:19
C++0xは一生でないね

874 :デフォルトの名無しさん:2009/05/10(日) 22:36:19
C++0aとか言われてるしなwww

875 :デフォルトの名無しさん:2009/05/10(日) 22:38:56
>>873
C++98だって出ないと言われていたんだぞ
STLを仕様に取り入れた事で2000年超えると言われてたし

876 :デフォルトの名無しさん:2009/05/10(日) 22:42:33
64bit 機が主流になったら int が 64bit、long long が 128bit とかなると思うんですが、
short の身の振り方で 16bit または 32bit サイズの整数型がなくなっちゃいますよね?
16bit は wchar_t で代用するんですか?

877 :デフォルトの名無しさん:2009/05/10(日) 22:42:44
>>874
だから八進数でaは…

878 :デフォルトの名無しさん:2009/05/10(日) 22:43:56
>>876
なんのためにstdint作ったのか…

879 :デフォルトの名無しさん:2009/05/10(日) 23:09:18
64bit環境でもintは32bitのままが普通。
Windowsなんかlongも32bitのままだぞ。

880 :デフォルトの名無しさん:2009/05/10(日) 23:09:19
0x出るの2015年ぐらいでしょ
来年はあり得ないね


881 :デフォルトの名無しさん:2009/05/10(日) 23:28:47
0xなんて16進の接頭辞として何かにこじつけておけばいい

882 :デフォルトの名無しさん:2009/05/10(日) 23:39:34
>>880
規格は固まるかもしれないがコンパイラがすぐには出ない

883 :デフォルトの名無しさん:2009/05/10(日) 23:45:15
今時C++コンパイラとして使われてるのはgccだけだし、
割とスムーズに対応するんじゃないの?

884 :デフォルトの名無しさん:2009/05/10(日) 23:47:24
へぇ

885 :デフォルトの名無しさん:2009/05/11(月) 00:20:27
gccはキチ○イみたいなメンバーがたくさんいるみたいだしな
規格が出たらすぐにでも対応しそう

886 :デフォルトの名無しさん:2009/05/11(月) 00:51:03
程度はともかくVC++も次で少しは対応するというのが嬉しい、VC++使いなんで。

887 :デフォルトの名無しさん:2009/05/11(月) 00:59:47
一度下位互換性を捨てて言語仕様を整理して欲しいよ。C++ 出だしの頃のように
最初はトランスレータで良いからさ。

888 :デフォルトの名無しさん:2009/05/11(月) 03:18:39
Cに対しては上位互換、旧規格に対しては後方互換のような気がしなくもないけど
それはさておいて、もうすでにC(99)との互換性もないしなぁ。

889 :デフォルトの名無しさん:2009/05/11(月) 03:25:16
互換性無くていいならDでもなんでも使えばいいだけ

890 :デフォルトの名無しさん:2009/05/11(月) 09:17:43
2つの構造体のメンバを1つの配列の要素にして間接的に操作することはできますか?
for文で順番に値を入れられるようにできたら良いなと思ったんですが、方法があったら教えてください。

891 :デフォルトの名無しさん:2009/05/11(月) 09:20:46
構造体どうしは = で丸ごとコピーが可能。

892 :デフォルトの名無しさん:2009/05/11(月) 10:13:10
>>890
構造体のメンバーを最初から配列にするんじゃダメなの?

893 :890:2009/05/11(月) 10:56:19
>>892
すみませんいまいちわからないです・・・。

ttp://www.wdic.org/w/TECH/%E5%85%B1%E7%94%A8%E4%BD%93
のサイトの使用例のようにアドレスをビット単位で操作するために構造体になっていて、
2つのアドレスの上位4ビットずつの8ビットと
下位4ビットずつの8ビットでそれぞれ1つの動作をするようになっているんでまとめなおしたいんです

894 :デフォルトの名無しさん:2009/05/11(月) 10:58:36
もしかして、union使いたいとか?

895 :デフォルトの名無しさん:2009/05/11(月) 11:05:51
配列でイジリたい型の参照配列かポインタ配列を用意してクラスかマクロで構造体から要素を取り出して突っ込む。

896 :デフォルトの名無しさん:2009/05/11(月) 11:11:23
ってリンク先がunionの説明だったのか・・・

897 :デフォルトの名無しさん:2009/05/11(月) 17:42:48
リンク先で説明されるような union の使い方って普通にされてるけど
結果は環境依存だから、K&Rとかではやっちゃらめってことになってるんだよね。

898 :デフォルトの名無しさん:2009/05/11(月) 17:49:11
>>897
struct S s;
fwrite(&s, sizeof s, 1, fp);

みたいな構造体をそのまま読み書きするのも、キモイから
やめてほしい。
CからC#にやってきて、C#はこれができないって憤慨してた
やつを見たことある。あほか。

899 :デフォルトの名無しさん:2009/05/11(月) 17:55:56
そうだな、Serializable属性でできるのにな

900 :デフォルトの名無しさん:2009/05/11(月) 18:40:20
環境依存であることがわかっていればいいんじゃないか。
>>898 みたいなことは構造体の表現やエンディアンが固定なら
問題なくできるし、それができるのがCのうれしいところじゃない。

構造体を引数や返値とするのも、頑にいやがる人がいるよね。
コピーされるからだろうけど、あまりでかくなければコンパイラが
頑張ってくれて遅くならないんだけどね。

901 :デフォルトの名無しさん:2009/05/11(月) 18:53:28
>>900
昔のCでできないことをいやがる人ってどこにでもいる気がする。
古いコンパイラにも対応しなければならないのならともかく。

いいかげん、「ブロック内の変数宣言は文の後には書けない」
などと学生に教えるのはやめていただきたいものである>先生方

902 :デフォルトの名無しさん:2009/05/11(月) 18:57:54
月面の重力は地球の約17%です。
自分の体重を入力すると月での実効体重を
計算し、表示するプログラムを作成してくだ
さい。

これ誰か組んでください↑
勉強してもまったく分りません



903 :デフォルトの名無しさん:2009/05/11(月) 19:00:44
>>902
宿題スレ行けよ。

904 :デフォルトの名無しさん:2009/05/11(月) 19:07:48
自分の体重17%にすりゃいいんじゃないの?
重力係数とかよくわからんが

905 :デフォルトの名無しさん:2009/05/11(月) 19:09:26
>>902
釣りだろ
釣りじゃないなら宿題スレ

906 :デフォルトの名無しさん:2009/05/11(月) 19:11:44
>>902
ttp://pc12.2ch.net/test/read.cgi/tech/1238087817/914
マルチか。
残念ながらここは友達居ない人が書き込むスレじゃないんで。

907 :デフォルトの名無しさん:2009/05/11(月) 20:57:13
>>906


908 :デフォルトの名無しさん:2009/05/11(月) 23:18:49
>>898
バイナリ形式でデータやりとりする時には普通にやるけど。
構造体の内容からバイト配列を生成して、それを出力
とか面倒くさくてやってられない。

909 :デフォルトの名無しさん:2009/05/11(月) 23:53:04
>>908
たいしてめんどくさくないだろ。

もうすこし移植性に気をつかってほしいよ。

910 :デフォルトの名無しさん:2009/05/12(火) 00:35:47
>>908
padding や endian の問題を無視できるならそれも楽だよね。

911 :デフォルトの名無しさん:2009/05/12(火) 00:36:54
ヘッダファイルにtypedefで構造体の型を定義したんですが
別のヘッダファイルに新しく構造体を宣言し、そのメンバとしてtypedefした
型を定義したんですが、型として認識してくれません

型名が必要だと言われます
どうすれば認識してくれるんでしょうか?

912 :911:2009/05/12(火) 00:43:21
すいません、自己解決しました
申し訳ありませんでした

913 :デフォルトの名無しさん:2009/05/12(火) 00:56:07
再現する最小限のソースを。
ちゃんと第二のヘッダから第一のヘッダをインクルードしてるの? ぐらいしか言えない。

914 :デフォルトの名無しさん:2009/05/12(火) 01:05:13
将来的な移植の希望 (予定ですらない) がある程度なら pack してマジックナンバーでも
付けときゃ良い。つかファイル形式は LE 固定で良い。

915 :デフォルトの名無しさん:2009/05/12(火) 01:55:54
3DゲームのスキンやMODを作りたいのですが、何から学べばよいのでしょうか?
C言語とC++、Java などの違いすらわかりません!
これだけは買っとけって入門書ありますでしょうか?

916 :デフォルトの名無しさん:2009/05/12(火) 01:57:06
検索エンジンの使い方から学ぶべき

917 :デフォルトの名無しさん:2009/05/12(火) 09:22:42
英語も必要だな

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
難しくて覚えられなんだが どうすればいいんだ

921 :デフォルトの名無しさん:2009/05/12(火) 13:39:07
>>920
俺は作って覚えた。
既存のゲームを移植してみれば良いよ。テトリスとかさ。
ロジックは自分で考える。

922 :デフォルトの名無しさん:2009/05/12(火) 16:05:11
テンプレートライブラリを書く練習にSTLのアルゴリズムみたいなのを作ろうと思っています。
とりあえず
please_if
only_if
って二つのアルゴリズムの名前を思いついたのですが、肝心の機能をどうすればいいのやらさっぱりです。
この名前に見合うアルゴリズムはどういう動作をするように設計すべきでしょうか?

923 :デフォルトの名無しさん:2009/05/12(火) 16:17:38
アルゴリズムを考えてから名前をつけような

924 :デフォルトの名無しさん:2009/05/12(火) 16:38:59
バロス

925 :デフォルトの名無しさん:2009/05/12(火) 16:49:37
ガーン
今度からは先にアルゴリズムを考えるようにします。
ありがとうございました。

926 :デフォルトの名無しさん:2009/05/12(火) 16:53:29
いや、アルゴリズムじゃなくて処理で名前をつけるだろ。

927 :デフォルトの名無しさん:2009/05/12(火) 16:56:36
なんかずれてるw

928 :デフォルトの名無しさん:2009/05/12(火) 16:58:48
名前なんか後からそれっぽいの付ければいいだけ

929 :デフォルトの名無しさん:2009/05/12(火) 17:05:10
qsort()とか、クイックソートっぽいのにクイックソートとは限らないって
ダサい状況になってるじゃん。
やっぱアルゴリズムで名前付けちゃいけないよ。

930 :デフォルトの名無しさん:2009/05/12(火) 17:21:30
結論ありきの主張

931 :デフォルトの名無しさん:2009/05/12(火) 17:27:21
自然な意見ですね。

932 :デフォルトの名無しさん:2009/05/12(火) 17:28:50
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を引数として渡してそこに詰めさせるか

どれがよいでしょうか?

933 :デフォルトの名無しさん:2009/05/12(火) 18:40:54
どこかでnewに失敗したらとにかくプログラム終了、とする場合
CMainとかを作って

try{
CMain *p;
p = new CMain;
p->run();
delete p;
}
catch(bad_alloc){
owata();
}

でいいんですかね?
それともクラスごとにいちいち終了処理を書くべきでしょうか?

934 :デフォルトの名無しさん:2009/05/12(火) 18:51:02
operator newを再定義した方が楽

935 :デフォルトの名無しさん:2009/05/12(火) 19:00:16
int main()
{
try {
...;
} catch (bad_alloc) {
owata();
}
return 0;
}

936 :デフォルトの名無しさん:2009/05/12(火) 22:05:00
>>928
LUMとかATALUとかな。

937 :デフォルトの名無しさん:2009/05/12(火) 22:09:40
RPGゲームの戦闘部分を作っています
HPは味方がmHP[n]、敵がtHP[n]と配列に格納していますが、
HP[n][m]などと多次元配列にし、mで敵/味方フラグを立てる感じの方が良いでしょうか

938 :デフォルトの名無しさん:2009/05/12(火) 22:12:54
別がいいでしょう

939 :デフォルトの名無しさん:2009/05/12(火) 22:27:11
そうですか、ありがとうございます

もう一つ質問です。
ダメージの計算式は簡単に、HP-攻撃力とします。
mHP[n]、tHP[n]、mKO[n]、tKO[n](味方攻撃力、敵攻撃力とします)とあるとき、

if(順番が回ってきた物が味方である時)
tHP[n]-=mKO[n];
と全体の処理をifで括るのではなく、

( (順番が回ってきたのが味方である) ? mHP[n]:tHP[n] ) -= (順番が回ってきたのが味方である) ? mKO[n]:mKO[n] )

のように要所要所を条件演算子で判別させたほうが良いですよね?
日本語ばっかりで分かりにくくてすいません

940 :デフォルトの名無しさん:2009/05/12(火) 22:30:21
ソースの密度が上がるとそれはそれで見にくいが、縦に伸びすぎるのも読みにくい。
バランスが大事ですよ。

941 :デフォルトの名無しさん:2009/05/12(火) 22:33:22
これは経験をつまないと分からなさそうですねw
とりあえず何か作ってみることにします
ありがとうございました

942 :デフォルトの名無しさん:2009/05/12(火) 22:43:35
分かりやすいのが一番重要。分かりやすくなるのであればgoto文もグローバル変数も使っていいしオブジェクト指向やデザパタも気にしなくて良い

943 :デフォルトの名無しさん:2009/05/13(水) 00:48:13
最初にc++を学んどけばたいていの言語に応用できるというのは本当ですか?

944 :デフォルトの名無しさん:2009/05/13(水) 00:50:37
うそです

945 :デフォルトの名無しさん:2009/05/13(水) 01:11:08
最初にC++って・・・

なんと言う拷問

946 :デフォルトの名無しさん:2009/05/13(水) 01:21:11
とりあえずCやってコンピュータのプログラムってなんじゃ?と言うのを学んで
C++やってオブジェクト指向ってなによ?ってのをやるのはいいと思うよ
いきなりC++は多分やめたくなると思う
本当はその前にアセンブラが入るともっといいと思うけど

947 :デフォルトの名無しさん:2009/05/13(水) 01:25:22
屁理屈かもしれんが、C++による手続き型プログラミングから入るのは別にいいと思うぞ。
C++はオブジェクト指向しかできない言語ってわけではない。

948 :デフォルトの名無しさん:2009/05/13(水) 01:43:59
基底クラスから派生クラスのメソッドて呼び出し出来ないですか?
#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);
}

949 :デフォルトの名無しさん:2009/05/13(水) 01:50:14
>>948
できると思うんだけどなんかエラー出るの?

950 :デフォルトの名無しさん:2009/05/13(水) 01:51:51
もうひとつ。
メソッドをオーバーライドすると、同じ関数名は全てオーバーロードが必要ですか?
#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();
}

951 :デフォルトの名無しさん:2009/05/13(水) 01:53:55
>>950
それは抽象クラスの純粋仮想関数だけ

952 :デフォルトの名無しさん:2009/05/13(水) 01:57:52
>>948
多態的なオーバーライドを行いたければ、Animalのspeakの宣言にvirtualを付ける。
virutal void speak();

>>950
混乱を防ぐため、Dogのspeak()によって、Animalのすべてのspeakは隠蔽される。
class Dogの中でusing Animal::speak;と書くと、dog.speak(2);もコンパイル可能となる。

953 :>>948 = >>950:2009/05/13(水) 02:30:12
>>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;

954 :>>948 = >>950:2009/05/13(水) 02:35:38
>>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();
}

955 :しつもーん:2009/05/13(水) 05:41:46
atexit関数は何の役に立つの?

956 :デフォルトの名無しさん:2009/05/13(水) 06:31:56
プログラム終了時に何かやらせたいとき。
大抵は、後片付け処理が入る。

957 :しつもーん:2009/05/13(水) 06:50:23
登録しとけばメイン終了後に呼ばれるのはわかるのだが、特にどうしても「メインの後に」やらせたい後片付けの例とは?
最も短いプログラムで例文を書いてくれると嬉スィ

958 :デフォルトの名無しさん:2009/05/13(水) 07:17:03
exitでプログラムを終了させたばあいでも、atexitで登録された関数は実行される。


959 :デフォルトの名無しさん:2009/05/13(水) 07:19:41
あとは、ライブラリが(たとえユーザから明示的に呼び出されなくても)
プログラム終了時に終了処理を走らせたいときとか。

960 :デフォルトの名無しさん:2009/05/13(水) 12:29:19
俺いきなりC++やって本買ったが半分でまだclassが出てこないんだが
どんくらいである程度覚えられんだ

961 :デフォルトの名無しさん:2009/05/13(水) 12:31:45
>>960
なんの本かはわからないけど、C++でclassまで覚えるのに人にも
よるが半年ほどかかると思う

templateまで完全に覚えるとなるとこれは年単位だな

962 :デフォルトの名無しさん:2009/05/13(水) 12:59:00
Cにどっぷり漬かってる期間が長ければ
C++のクラスの必要性に疑問視を抱くはず

963 :デフォルトの名無しさん:2009/05/13(水) 13:01:59
>>962
疑問視は抱けない

964 :デフォルトの名無しさん:2009/05/13(水) 13:08:38
classは無理に使わなくてOKです

965 :デフォルトの名無しさん:2009/05/13(水) 13:10:04
×疑問視を抱く
○疑問を抱く

966 :デフォルトの名無しさん:2009/05/13(水) 13:30:50
>>962
>Cにどっぷり漬かってる期間が長ければ
デストラクタや例外、void* 等の弱い型付けに頼らない
安全なカプセル化手法等が欲しい、と思う局面は
幾らでもあった筈。

967 :デフォルトの名無しさん:2009/05/13(水) 13:42:09
>>962
Cにどっぷりつかると、
class使わなくてもオブジェクト指向プログラム組むようになるから
っていうのなら同意。

968 :デフォルトの名無しさん:2009/05/13(水) 13:44:35
>>966
一理あるが、カプセル化は厳密では無いが
近い事をCの関数や構造体のみでも実装は出来るでしょ
俺は最初classの必要性に?を感じてたけど、今では使いまくってるよ

969 :デフォルトの名無しさん:2009/05/13(水) 13:45:05
C++はD言語みたいに興味本位で作られた言語ではなく
禿がCのプログラマの不満を解消するために作った言語だからな

ただtemplateだけはどう考えても趣味っぽいけど

970 :デフォルトの名無しさん:2009/05/13(水) 13:46:43
いやまてよあれはBoostの連中が悪いんだ
元々templateは関数マクロを撤廃するために作られたもの
これがクラステンプレートが出てきた頃から怪しくなった

971 :デフォルトの名無しさん:2009/05/13(水) 13:49:12
当時から禿げてたのか?

972 :デフォルトの名無しさん:2009/05/13(水) 13:55:59
>>971
どうだろうねえ禿げてたんじゃねーの?w

しかし言語仕様にSTLを入れた事でPL/I並みの巨大さに
なっちまってプログラマが尻込みしてるしな

皆JavaやPHPやスプリクト言語に逃げた

973 :デフォルトの名無しさん:2009/05/13(水) 13:57:33
JavaやPHPもたいがい巨大だけどな。
C++のほうがまだ小回りが利く。

974 :デフォルトの名無しさん:2009/05/13(水) 14:01:53
templateはもともとコンテナのために作られたんでしょ。
Javaみたいに、全クラスを Object みたいなクラスのサブクラスにする発想は以前の言語からあったが、
コンテナが Object を格納するとなると、取り出すときにダウンキャストが必要になったりして嫌だから
テンプレート機能を作った、ってのがテンプレート誕生のきっかけだったはず。
テンプレートがいろいろアレな方向にも使えるねって話が出てくるのは、その後の話。

975 :デフォルトの名無しさん:2009/05/13(水) 14:04:18
あと、禿はもともとSimulaを利用していた人物で、Simulaのパフォーマンスに不満があって
それで、Cをベースにしてクラス機能を導入したらどうか?って方向に行ったんでしょ。
「Cのプログラマの不満を解消」ってのは少しずれてる。

976 :デフォルトの名無しさん:2009/05/13(水) 14:05:36
D&Eを読めばその辺りの経緯がよくわかるな

977 :デフォルトの名無しさん:2009/05/13(水) 14:18:32
Cでオブジェクト指向プログラミングなんてできないよ。
できると称して、そういうテクニックを披露してるやつがよくいるけど、
つかえそうなのは、抽象データ型くらいまでで、継承とか多態まで
いくと、それってムリがあるだろってツッコミいれたくなるような
感じのばっかり。
ああいうのマに受ける初心者がいるから、広めるのはやめてほしい。

978 :デフォルトの名無しさん:2009/05/13(水) 14:34:17
継承は子構造体の先頭に親構造体を配置するようなほうほうでやってた記憶があるなぁ。
多態に関しては関数ポインタで実現。

979 :デフォルトの名無しさん:2009/05/13(水) 14:43:11
オブジェクト指向にむいてないCでむりやりオブジェクト指向を、っていう発想がそもそもエレガントじゃない気がする

980 :しつもーん:2009/05/13(水) 14:54:40
型情報を表示さしたいのだが、俺の環境だと表示が何か変だ。これってなんで?
--(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
にならないんだ!?

981 :デフォルトの名無しさん:2009/05/13(水) 15:09:44
>>980
VS2008での実行結果

int
double
class Test

982 :デフォルトの名無しさん:2009/05/13(水) 15:11:14
>>980
http://ml.tietew.jp/cppll/cppll/article/5705

型名が返るとは限らないみたい。

983 :しつもーん:2009/05/13(水) 15:21:34
俺はマック+g++だが、OSに依るのだろうか?コンパイラに依るのだろうか?
i
d
4Test

のi、dは頭文字だと予想出来るが、Testの前は何なんだろう?
解釈可能?それとも全く意味不明?

984 :デフォルトの名無しさん:2009/05/13(水) 15:30:22
いろいろやってみたが、内部の名前だね。
で、数字は名前の文字数。

985 :デフォルトの名無しさん:2009/05/13(水) 15:30:32
typeidを使う実装はかなりの確率で
クソ設計になっていると思うが
その点は大丈夫か?
>>983
> 俺はマック+g++だが、OSに依るのだろうか?コンパイラに依るのだろうか?
いやだから実装に寄るんだろ。
例えば同じOSと同じコンパイラだとしても
絶対に同じ文字列が返るとは言い切れないんじゃない?



986 :デフォルトの名無しさん:2009/05/13(水) 15:35:50
>>983
実際に何がしたいのか分からんが、
TMPのデバッグ中に型名を確かめたいときは
abi::__cxa_demangle()が役に立つかもしれない。

987 :しつもーん:2009/05/13(水) 15:44:39
おぉ!数字は文字数だったか。気付かなかった。。ありがとう!
ではそろそろ寝ます。おやすみ
( ゚o゚ )オ(゚▽゚)ヤ( ゚・゚ )ス(゚━゚)/~ミー

988 :デフォルトの名無しさん:2009/05/13(水) 15:44:53
>>982
typeidは違う型はname()が絶対に違う、という事だけしか
規格票では保証されていないな

989 :しつもーん:2009/05/13(水) 15:46:40
そうなんだ。。変なの。でも勉強になった、ありがとう

990 :デフォルトの名無しさん:2009/05/13(水) 16:20:09
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;
}


991 :デフォルトの名無しさん:2009/05/13(水) 16:29:42
一週間寝ないで考えてから出直してください

992 :デフォルトの名無しさん:2009/05/13(水) 17:17:09
一週間は待てなそうなのでググったらでてきたぞ
#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;
}

993 :デフォルトの名無しさん:2009/05/13(水) 17:20:09
いやこれ1週間考えても無理だって。
>>990
こうfriend宣言するとコンパイルして実行までいける。
template<class U>
friend std::ostream& operator <<(std::ostream& stream, const Test<U>& a);
http://msdn.microsoft.com/en-us/library/f1b2td24.aspx

UではなくTのままでもVC++ではコンパイルできるが、
g++では外側のTと被ると怒られる。

994 :デフォルトの名無しさん:2009/05/13(水) 17:39:01
うは
BCCだとコンパイラの内部エラーだと
腐ってる

995 :デフォルトの名無しさん:2009/05/13(水) 18:19:11
なに、コンパイラの内部エラーなんてよくある話だ。
俺も昨日CUDAのコンパイラがcatastorophe errorとか吐いて落ちたからな。

996 :990:2009/05/14(木) 01:52:38
>>993
出来るようになりました。有り難うございました。
猿真似的に実行出来るようになりましたが、内容が理解できてません。
なぜテンプレートクラス内に別のテンプレートの宣言(Tとは違うU)が必要になるのでしょうか?

997 :デフォルトの名無しさん:2009/05/14(木) 02:39:03
>>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
このコードも今となっては駄目だったが。

998 :デフォルトの名無しさん:2009/05/14(木) 11:16:55
.

999 :デフォルトの名無しさん:2009/05/14(木) 11:17:36
.

1000 :小倉優子 ◆YUKOH0W58Q :2009/05/14(木) 11:18:30
1000ならジュースでも飲むか

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

225 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)