[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 05/09 14:47 / Filesize : 148 KB / Number-of Response : 582
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.36【環境依存OK】



1 名前:デフォルトの名無しさん [2007/04/01(日) 23:01:13 ]
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.35【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1171888583/l50
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm


445 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 01:57:09 ]
例えば、素数を解くプログラムみたいなもので、
頭悪いプログラムと、効率化をほどこしたプログラムでは、
計算処理の実行時間が、どれほど違ってくるものか調べてみたいのですが、

その実行時間を調べるには、どうしたら良いのかがわかりません。
環境はLinuxでgccコンパイラを使ってます。 教えてください。

446 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 02:00:52 ]
>>445
プロファイラを使うのが一番。
gcc関連でプロファイラツールがなんかあったと思うからそれ探してみ。

447 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 02:03:55 ]
>>444
ヌルターミネートすればいい

448 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 04:17:19 ]
>>445
int t1 = タイム
・・・
int t2 = タイム
時間 = t2 - t1

ってやってる
1行ソース変えて性能うpしたかどうか程度ならベンピ

449 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 06:54:40 ]
>>445
つ[rdtsc]

>>448
time()使うなら、difftime()を使うべきかと。
#ま、どうでもいいといえばどうでもいいけど。

450 名前:ほんとの初心者 [2007/04/18(水) 11:44:16 ]
くだらない事で本当にすいません。VC++6.0、SP6です。

4バイト長の64k個のデータの配列を示すvoidポインタがあって、
そのデータを64k個のfloat型のデータとして読み込みたいだけ
なんですが、どうしてもうまくいきません。


#include "stdio.h"

void *buffer;//(ここに4バイト長のデータが64k個ある)
float val[0x10000];//64k個のfloat型の配列を用意した。

//val配列で、bufferの指し示すアドレスから始まる64k個のデータを受け取りたい。
for (i = 0 ; i < n ; i++)
{
val[i]= * (float*)(buffer + i);
}

どう直せばいいのでしょうか。すんませんが教えてください。
よろしくお願いします。

451 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 11:53:41 ]
「うまくいきません」を説明してください。

452 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 12:01:10 ]
>>451
あんたなんかむしむし

453 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 13:09:17 ]
((float*)buffer)[i]



454 名前:ほんとの初心者 [2007/04/18(水) 13:47:22 ]
>>453
ああ、そうやって書けばいいんですか。ありがとうございました。

本見てもググッても、voidポインタが配列を指し示している例がなかなか
見つからずに困っていました有難う。

455 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 14:59:47 ]
というか、ふつうは先に
float *buffer = (float*)void_buffer;
とかやると思うけどけどね

456 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 14:59:54 ]
ポインタがどういうものかが分かっていれば、
別に void ポインタが配列を指していない例からでも
このくらいは分かることだろう。

ここで、なぜそれでうまくいくのか、を深く考えておかないと、
後々また困ることになると思われる。

457 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 17:39:33 ]
C++でコメントをドキュメント化する際のデファクトスタンダードってなんでしょうか?
C#やJAVAみたいに言語レベルで存在しないので、何がよいか捜してます。

458 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 17:41:46 ]
有名どころはDoxygenかな

459 名前:ほんとの初心者 [2007/04/18(水) 18:22:59 ]
>>455-456
追加のアドバイス感謝します。本には配列が初めのアドレスを指すポインタ
だからポインタに配列名を代入してやれば良いとか、いろいろ書いてあって
書いてある事は読めばわかるのですが、まだなかなか応用は利きません。
今回のアドバイスでまた一つ勉強になりました。

460 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 18:34:28 ]
int a = 10, b = 20;

この2つの変数 a, b の値を一時変数を使わずに相互に
入れ替えるテクニックがあったとおもったけど
どんなんだったっけ?

461 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 18:35:45 ]
C99の規格書はどこかでダウンロードできませんか?


462 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 18:42:43 ]
>>460
#define SWAP(a, b) (a += b, b = a - b, a -= b)
でど?

463 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 18:45:13 ]
>>461
JIS X 3010 : 2003 が ISO/IEC 9899 : 1999 に相当する。
JISC のウェブサイトから入手できるはず。



464 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 18:47:21 ]
>>460
a ^= b, b ^= a, a ^= b;

465 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 18:47:37 ]
>>460
ttp://www.dd.iij4u.or.jp/~okuyamak/Information/xor_fixed_swapping.html

466 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 18:48:25 ]
>>461
www.jisc.go.jp/
JIS検索→規格番号 X3010

467 名前:457 mailto:sage [2007/04/18(水) 20:42:33 ]
>>458
DOxygenってJavaDocスタイルなんですね。
ちょっと使いやすいか確認してみます。

468 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 20:45:40 ]
Doxygen作ったやつは凄いと思う

469 名前:460 mailto:sage [2007/04/18(水) 21:00:16 ]
>>462
>>464
>>465
アリガd
無理に使う必要はないのね

470 名前:デフォルトの名無しさん [2007/04/18(水) 21:48:31 ]
XOpenDisplay()やってなかなか返って来ない時、タイムアウトさせるには
どしたらいいですか?

471 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 21:53:27 ]
>>465の例は極端すぎだな。
確かにC/C++でswapすることはあまり意味が無い。
だが、8bit程度の超小型マイコンではまだ現役だね。

472 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 22:35:06 ]
C++の文法についてなんですが
派生クラスで新たに作ったメソッドが基底クラスのプライベート属性にアクセス
できないのがどうも納得いかないというか。

派生クラスに何も書かなければ基底クラスと同じコードを書いたと見なされ、
違う機能だけ書き足せば良い、というのが継承だと解釈していたんですけど、
その解釈でいくとアクセスできる筈な気がして仕方がないです。
引数付きコンストラクタがそのままでは継承されないのもイマイチ意図が
わかりません。
何か根本的な継承の精神を誤解しているんでしょうか?

473 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 22:41:20 ]
>>472
じゃ、おまいが新しい完璧な言語を作ればいい



474 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 22:44:24 ]
>>472
そのためのpretectedだ。

protectedなメンバ変数はどの派生クラスでも書き換えられるのだが、
逆に言えばどこから書き換えられているのか把握しづらくなるということで、
実際のところグローバル変数と同様に推奨されていない。
(やるならせめてprotectedなアクセサ書けということだ)

475 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 22:45:48 ]
>>472
何言ってんだお前?

476 名前:475 mailto:sage [2007/04/18(水) 22:46:29 ]
ごめん
ちゃうねん
>>473 あてのつもりやってん
>>472 まじごめん

477 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 23:12:14 ]
そこで
#define private public
ですよ

478 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 23:14:30 ]
>>474
有難うございます
う〜ん、わかったようなわからないような…継承の設計意図

派生クラスで新たに作ったメソッドが基底クラスの属性の値を
書き換えはしなくても取得したくなることは良く出てきそうな気がして…
(実際にC++でまともに組んだことはまだ無いですが)

479 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 23:22:56 ]
protectedはテンプレートメソッドやファクトリメソッドといった
デザパタを意識した設計になると自然と出てくる。
abstractや空実装であることも多く、実装クラスに特性を与えるためによく使われる。

でも既存アプリのカスタマ屋さんあたりだと
バグがあったときに直しやすいからprivate禁止だ
という方針を立てる人もいる。
ケースバイケースってことでこれもアリかなと思う。

480 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 23:50:54 ]
>>472
よくクラスの継承を動物とか哺乳類とか犬に例えたりするけど、
どんな哺乳類だって動物の基本的な性質は変更できないわけで。

481 名前:デフォルトの名無しさん [2007/04/19(木) 00:13:02 ]
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3839.cpp
このプログラムをコンパイルするとこんなエラーがでてくるのですが↓

program.cpp: In function ‘int convert_vector_space(Vector, int, int, unsigned char*)’:
program.cpp:90: error: invalid types ‘unsigned char[int]’ for array subscript
program.cpp: In function ‘int convert_image_space(Vector, unsigned char*)’:
program.cpp:101: error: invalid types ‘unsigned char[int]’ for array subscript

どう修正すればいいでしょうか
コンパイラはGCC 4.1、OSはLinuxです

482 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 00:23:14 ]
>>481
pimage[y][x]と書こうとしても、pimageが只のunsigned charへのポインタなのでできない。
幅も関数に渡して、pimage[y * width + x]とすればいい。

483 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 00:24:19 ]
もし毎回書くのが嫌なら、static int offset(int x, int y, int width) {return y * width + x;}でも用意しておけばいい。



484 名前:デフォルトの名無しさん [2007/04/19(木) 00:36:19 ]
>>482-483
そういうことなんですか
ありがとうございます

485 名前:デフォルトの名無しさん [2007/04/19(木) 01:12:35 ]
VC++6.0(WTL7)にて。
COMオブジェクトを作成して使いたいんだが、方法が全くわからん。
DLLはregsvr32済みだとして、文字列かGUIDでインスタンスを生成したい。
参考サイトでもいいので教えてエロい人><

486 名前:481 [2007/04/19(木) 08:08:39 ]
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3840.cpp
直して途中にベクトルの成分を出力するルーチンを追加しました。
コンパイルの通るものができたのですが、

Width:256 Height:256
0 0 ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
0 0 ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
(以下省略)

と言う風に結果が反映されないようです。

Width:256 Height:256
0 0 252 47 19 86 35 109 33 48 100 67 65 62 81 56 51 10
4 0 250 43 11 80 31 101 31 41 105 65 68 59 88 67 41 8
(以下省略)

こんな感じの結果を出したいのですが、どう修正すればよいのでしょうか?

487 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 08:13:02 ]
> fprintf(fp,"%c ",vect[i].data[j]);
< fprintf(fp,"%d ",vect[i].data[j]);

違ったら済まん。

488 名前:481 [2007/04/19(木) 08:21:24 ]
>>481
サンクスです。

Width:256 Height:256
0 0 ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
0 0 ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@
(以下省略)

の中身は

Width:256 Height:256
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
(以下同様につき省略)

でした。
何がいけないんだろう・・・う〜ん

489 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 08:52:52 ]
たぶん、convert_vector_spaceの第一引数がダメぽ。
今のまんまだとvector[0...4095]をコピーして渡しちゃう。ポインタを渡さないと値を変更できない。
# で、あってる?

int convert_vector_space(Vector *vect,int offx,int offy,unsigned char *pimage);

/* 画像データをベクトル化する */
for(j=0; j<block_y; j++){
for(i=0; i<block_x; i++){
chk = convert_vector_space(&(vector[j*block_y+i]),4*i,4*j, image);
}
}


/* 4*4の画素ごとにブロック分割し、データを列ベクトル化する */
int convert_vector_space(Vector *vect,int offx,int offy,unsigned char *pimage){
int i,j;
vect->x_start = offx;
vect->y_start = offy;
for(j=0; j<4; j++){
for(i=0; i<4; i++){
vect->data[4*j+i] = pimage[(offy+j)*XLENG+(offx+i)];
}
}
return 0;
}

490 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 10:48:28 ]
>>485
C/C++と関係ないのでスレ違い

491 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 12:51:15 ]
>>490
スレ違いじゃねぇだろ
単純にCOMサーバ使うコーディングが分からないんだろ

>>485
#import でググれ


492 名前:デフォルトの名無しさん mailto:sage [2007/04/19(木) 21:25:54 ]
>>491
#importだとGoogleは#を無視してくれるので悲惨なことになる。

493 名前:デフォルトの名無しさん [2007/04/20(金) 14:44:09 ]
環境はVC6です。
ウィンドウのメッセージループ中でクラスを使用したい。
ボタンクリックでクラスのメンバー変数の値を変化させ、画面を閉じる際にそのメンバー変数の値により
処理を振り分ける。

こんな感じの処理を行いたいのですが、普通にクラスを定義すると頻繁にコンストラクタ処理が呼ばれ
負荷が大変なことになりそう・・・。

どういうふうに書けばいいのでしょうか?
アドバイスお願いします。




494 名前:デフォルトの名無しさん mailto:sage [2007/04/20(金) 14:48:02 ]
は?
頻繁に呼ばれるって
ループ中で宣言しなけりゃいいだけだろ・・・

495 名前:デフォルトの名無しさん mailto:sage [2007/04/20(金) 14:57:38 ]
フォームのメンバオブジェクトとしてそのクラス(A)を宣言し
メッセージ処理部分でAのメソッドを呼ばせるようにして
そいつから処理させればいいんじゃないの?

496 名前:デフォルトの名無しさん mailto:sage [2007/04/20(金) 20:14:08 ]
>>493
まずはWindowsアプリがどんな構造を持っているか、そもそもクラスとは何なのか理解するべき。
MFCを使わずに開発しているとしても話は全く変わらないから、
とりあえずメインウィンドウをクラスとして書き出してみ。

497 名前:デフォルトの名無しさん [2007/04/21(土) 00:57:44 ]
>>492
com import イベント でぐぐったら悲惨な目に会った経験があるぞw

498 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 11:48:44 ]
標準入力に関しての質問です。例えば名字と名前を別に入力させて表示したい場合、以
下のコードを考えました。

char s[NUM];

fgets(s, sizeof(s), stdin);
s[strlen(s) - 1] = '\0';
printf("strint1 =%s\n", s);

fgets(s, sizeof(s), stdin);
s[strlen(s) - 1] = '\0';
printf("strint2 =%s\n", s);

入力文字数がNUMを下回っていれば想定どおりの結果になるのですが、オーバーフローす
ると残りの分がストリームに残り、それが2回目のfgets()に渡ってしまいます。このよ
うな場合、一端ストリームをクリアするのが定石でしょうか?あるいは他に良く使われ
る方法があるのでしょうか?

499 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 12:12:51 ]
>>498
NUMが1024なら、1500文字打ったとき?

while( fgets(s, sizeof(s), stdin) )
{
  ・・・・
}

こんなかな?
超えたら2回動く
テキストファイル読むときは、↑みたいな感じで書いた

500 名前:デフォルトの名無しさん [2007/04/21(土) 14:21:02 ]
沖縄県の方へ(命に関わる注意事項です)

沖縄県での選挙ですが、どうか民主党だけは避けてください。県民の生命に関わる可能性があります。
民主党の最大の公約は一国二制度(※)ですが、一度「一国二制度 沖縄 三千万」で検索をお願いします。
この際、民主党のHPで調べても良いです。以下の注釈↓と矛盾することは書いてないはずですから…

※一国二制度
 簡単に言えば沖縄を中国と日本の共有物にし、そこに3000万人の中国人を入植させます。
 (つまり沖縄人口の 96% を中国人にして、実質、沖縄を中国人の居住地とします。)
 さらに「自主」の名の下、沖縄で有事が起きても自衛隊は干渉できません。
 3000万人の中国人が、少数派となった130万人の日本人に何をしても、です。
 そして反日教育を受けた中国人の反日感情の強さは、ほとんどの日本人の理解を超えるものです。

今回の選挙で民主党が勝った場合、「自主」「発展」を連呼しつつ段階的に進めていくことになります。
自主と言っても、自主を認めるのが「住人の96%が中国人となった」後だということに気をつけてください。
発展と言っても、新沖縄の少数派となった「少数民族日本人」の発展ではないことに気をつけてください。

501 名前:やっぱ名無しにすべきですか? mailto:sage [2007/04/21(土) 14:23:34 ]
えっと、asmキーワードの意味を教えていただきたいです。

502 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 14:27:33 ]
>>498
fgets()の代わりにこんなラッパーでも使えば?
>>498のように、行にN文字以上入力された場合
残りを切り捨てたいというケースにしか使えないが。

char *xfgets(char *s, size_t n, FILE *f)
{
    char *p;
    int c;
    if (!fgets(s, n, f))
        return 0;
    if ((p = strchr(s, '\n')))
        *p = 0;
    else
        while ((c = getchar()) != EOF && c != '\n')
            ;
    return s;
}

503 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 14:36:34 ]
構造体にクラスを入れられるのは規制して欲しいな。
うっかりゼロクリアしてることに気づかないとか悲しいことが未だにある。
構造体はデフォルトがパブリックなクラスであるって考えはヤバイ。



504 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 14:44:51 ]
>>501
環境が分からんのでなんとも

505 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 14:50:56 ]
asmキーワードは、以後のブロックの中身が、
インラインアセンブリ言語での記述であることを示す。

506 名前:498 mailto:sage [2007/04/21(土) 16:28:22 ]
>>499 >>502
回答ありがとうございます

>>502
なるほど!理解できました。こんなのを短時間に考え付くのは流石ですね。
たったこれだけの要求にこの泥臭さはいかにもCだなぁ。これは課題の中
から疑問点を抽出して質問したのですが、実際の現場でのこのような要求
はほとんどないということでしょうか?

あと、関数の型がポインタなら、"return 0"ではなく"return NULL"の方が
自然だと思ったのですが、この書き方でもいいのでしょうか?

507 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 16:54:03 ]
>503
>構造体にクラスを入れられるのは規制して欲しいな。

structのメンバとしてclass変数を指定することを言っている?
そんなのstructを使わなきゃいいじゃん。
structが残っているのはC/C++のコード流用性のためだけにあるものだと思うけど。
classの中にstructメンバが入るのはあり得るとして新規にstructを定義して
classメンバを入らなきゃならない状況ってあるか?
CのコードをC++として流用する場合ならpublicになってなきゃつじつまが合わなくなると思ぞ。


508 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 16:55:50 ]
>>507
他の人が作った struct を使う場合の話じゃね

509 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 16:56:03 ]
>>506
ポインタが必要な場面に現れた0は、ヌルポインタとして扱われる。


510 名前:502 mailto:sage [2007/04/21(土) 17:07:17 ]
あーすまん、>>502だがちと修正。
- while ((c = getchar()) != EOF && c != '\n')
+ while ((c = getc(f)) != EOF && c != '\n')

511 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 17:12:28 ]
CからC++ではなく、OO系言語からC++なら
std::stringとかメンバにする人もちらほらいるかと。

512 名前:498 mailto:sage [2007/04/21(土) 17:38:07 ]
>>509
それは理解していますが、可読性という意味ではNULLの方が上かな、
と思いまして。というのも、私が一瞬理解できなかったからです。
未熟と言われればそれまでですが。

>>502
そうか… fがstdinとは限らないからですね。


513 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 18:44:18 ]
>>511
レガシーC使いでもちゃんと勉強している人は構造体をmemset()する愚は理解しているものだが。
実際漏れの勤める会社でも構造体をmemset()する癖のある香具師がど填まりしていたよ。
#std::stringじゃなくてCStringってところがあれだけど。

で、当人曰く、「memset()できないなら危なくて使えないな」という間抜けっぷり。



514 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:01:39 ]
= { 0 }; で初期化すればゼロクリアになるけど、
コンパイラによっては警告が出て鬱陶しいんだよな。

515 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:10:20 ]
そこでboost::value_initializedですよ

516 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:13:05 ]
>>513
なんでダメなんだっけ?

517 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:23:14 ]
>>516
多分、内部でSysAllocStringを呼んでるのでわ?
CStringを0でセットすると取得した領域がゾンビになるのでわ?

518 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:28:06 ]
>>517
すまん。構造体の方。
いっつもゼロ埋めしてるんだけど、これがまずいなら
オレは今から全裸でコンビニに行かねばならん。

519 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:31:52 ]
>>518
する理由は?
百害あって一利なしなのだが。
#これから食事なので、百害の詳細については後程。

520 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:43:22 ]
そら言い過ぎ

521 名前:518 mailto:sage [2007/04/21(土) 19:44:43 ]
>>519
自分で構造体を使うとき、誕生時に全ての要素がゼロであるような
使い方というか設計をしてるから。
他人のライブラリのときは、どうでもいいけど保険でゼロ梅してる。

とりあえず、もう服は全部畳んだ。

522 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 19:51:47 ]
WinAPI に渡す専用の構造体とかは、memset で 0 クリアすることが多いな
ZeroMemory だけど

523 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 20:03:31 ]
初期化構文使って
struct Foo foo = { 0 };
で済ますほうが簡潔な上に、ポインタや浮動小数点数等もよろしくやってくれるな。
まーPODを単にビット的にゼロフィルすれば良いと分かっているケースでは
memset()/bzero()/ZeroMemory()の類でもいいんでないの。



524 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 20:03:45 ]
>>516
非PODでは、仮想関数テーブルなどソースコード上にないメンバが存在する可能性がある。
また、浮動小数点数の0やヌルポインタがビットパターン0の並びであることは保障されていないので、
PODでもmemsetでの0クリアはするな(初期化子でならOK)といわれる所以。

525 名前:518 mailto:sage [2007/04/21(土) 20:06:10 ]
>>524
>浮動小数点数の0やヌルポインタがビットパターン0の並びであることは保障されていない
あ、そうだった! なるほど・・・うかつであった。
以後気をつけます。

ではこのままコンビニに行ってきます。

526 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 20:35:57 ]
>>522
つーかWinにおけるMS定義の構造体はMS自身がサンプルコードやらでZeroMemoryしてるしなぁ
まぁ、他環境への移植性を考慮するなら安易なmemsetはヤメテオケってことかと

527 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 21:04:08 ]
他の部分でバリバリ環境依存なコードを書いてる状態なら、
構造体の部分だけ移植性気にしてもしゃーないわな。

528 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 21:04:42 ]
MSつーかVisualStudioでも、Debugビルドで折角ローカルなオブジェクトは異常値を埋めてくれているのに
それをわざわざ無にしてバグの発見を遅らせることになりかねないね。

529 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 21:09:14 ]
>>528
VisualStudioの動作する環境で0クリが問題になるのか?
vtbl壊してたらどっちみち動かないだろ?ん?

530 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 21:38:13 ]
コンビニから帰ってきました。 今日はなんかスースーしてて寒いね。

いまさら環境依存とかいっても、実際ヌルポインタが0じゃない環境って
冷静に考えたらまず無いよね。浮動小数点も。
ま、そーゆーアーキテクチャが現存してるなら、それに携わるときだけ
気をつければいっか。

531 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 21:42:59 ]
スースーしてて寒いのか
こっちゃ蒸し暑いぜ

532 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 22:45:07 ]
俺は金○を広げながら書いてます。
>>528
意味分からない。

533 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 22:47:00 ]
別に 0 クリアは、異常値を無にしてるんじゃなくて
必要な値として 0 を入れてるんだろ?



534 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 22:59:21 ]
>>533
それが本来あるべき姿なのだが、
現実には>>513のようにとりあえず常に0クリアするという奴が後を絶たない。

535 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 23:21:47 ]
宣言時に入る異常値なんて必要無いし

536 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 23:36:04 ]
わざわざクリアされて作られた0値だって必要ない

537 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 23:50:55 ]
0クリアに頼らずに自前でオブジェクトイニシャライザ用意しとけと言う事か

538 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 23:51:41 ]
つまり構造体にはコンストラクタを設けろと。

539 名前:デフォルトの名無しさん mailto:sage [2007/04/21(土) 23:54:36 ]
そして資源の漏れを防ぐためにデストラクタも設けろと
でRAII来たこれ

540 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 00:08:35 ]
そうしてクラスが出来上がっていく…

541 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 00:09:22 ]
ぶっちゃけC++にもBeanって言葉を導入してもいいかもなw

542 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 01:28:44 ]
データ構造とアルゴリズムの基本的なことを学ぶのに適した本を教えて下さい

543 名前:542 mailto:sage [2007/04/22(日) 01:30:25 ]
すみません、書き忘れました。C言語です



544 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 01:50:42 ]
>>539
そこまでするならクラスにしろよ、ってな話だな。

545 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 03:59:03 ]
VC++でウィンドウを表示して、その中でFLASHを再生したいのですが
どうすれば実現できるでしょうか

546 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 04:00:27 ]
>>545
IShockwaveFlash

547 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 04:07:22 ]
COM勉強してきます…orz

548 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 04:31:42 ]
>>538
つか、構造体は関数のない方がいいでしょ
使うときは通信とかの場合だし
32バイト単位とかで切ったりするんでしょ

>>542
C++じゃなく、C言語かね、理系?
30年前の凄い有名な本あるけど、・・・古い
Cアルゴリズム大百科、みたいなのがオススメ
中に、クイックソート、挿入ソート・・・、ニュートン法、ガウス・・・
とか載ってるヤツ

549 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 09:33:28 ]
WIN32の構造体だけはゼロクリアでいいと思うけどな。
MSがそういう使い方を推奨している以上そう使うのがどおり。
基本的にライブラリの実装者のやり方に合わせる。
それ以外ではいろいろ問題ありだから使わないけどね。

550 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 09:43:09 ]
「道理」(どうり)
「通り」(どおり)

551 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 11:14:29 ]
Win32の構造体は、いつもHOGE hoge = {sizeof hoge};で初期化している

552 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 11:33:55 ]
漏れは毎回毎回、menset か setmen で悩む

553 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 11:46:24 ]
構造体の初期化は
HOGE hoge = {0};がデフォ



554 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 11:54:00 ]
>>552
メーン、memはmenじゃないぜ〜

555 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 12:11:11 ]
要するに、アレだよな。

C言語コーダが
Hoge h = { 0 };
可能かどうかは自分で判断できるし、
作った時点では問題ないよな。

人様が作った構造体や、自作の構造体でもバカの一つ覚えで
memsetしちゃうのは問題アリじゃね。WinAPIで指定してる場合はともかく。

>>513 が言うように、個別の初期化は多少の手間は増えるけど
安全だし、それでいいと思うけどなあ。

#C++だって、わざわざ初期化リストを設けてるし(C++ならstructでも使えるよ)

556 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 12:13:03 ]
>>552 setmenって、男にナニをセットするんだ?
気になって気になって今日は良く寝れそうだ。

557 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 12:57:38 ]
setmenは男に何かをセットするんじゃなくて「セットする男達」だろ
常識的に考えて・・・

558 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 13:02:20 ]
YO! MEN!
いや、setmen は男を何かにセットする関数だろ
常識的に考えて・・・

559 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 13:10:18 ]
男の部分を何かにセットするわけか

エロいな

560 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 13:10:38 ]
>>551
そうしてたけど、最近の VC++ は警告出すから困る。
#pragma で抑制できるけど。

>>552
strcpy, strcat, strchr とか文字列に関するものは str が接頭辞になってる。
同じく、memset, memcpy, memmove とかメモリに関するものは mem が接頭辞になってる。
悩む必要性は無い。

561 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 13:35:11 ]
頻繁に使う構造体なら継承してコンストラクタ定義してしまえってじっちゃんが

562 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 13:44:51 ]
レガシーAPIに渡せないだろ

563 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 13:49:12 ]
こっちで変数定義したものを向こうへ渡すのなら、
アップキャスト(ポインタ・参照渡し)・スライシング(値渡し)が起こるだけで、
言語規格上問題ないだろ。

向こうでオブジェクトが作成され、自分はそれへのポインタを受け取るという場合に
派生クラスへのポインタで受けたら、言語規格上未定義にはなるだろうけどさ。



564 名前:552 mailto:sage [2007/04/22(日) 15:30:50 ]
>>560
そうなのか、memが初めなのか

脳内では、セット麺、麺セット、麺コピーって変換してた

565 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 16:13:33 ]
>>562
VC++ の CRect は RECT を継承したクラスなんだぜ。
でも、レガシーAPIに渡せるだろ?
仮想関数がないからな。

566 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 16:25:18 ]
>>565
仮装関数は関係ないだろ

567 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 16:25:32 ]
>>565
ちゃうちゃう。
CRectはRECTを継承してない。内部の最初に保持してるだけ。
is-aじゃなくてhas-aの関係
同様の方法でWinAPI32に引き渡せるMFCクラスあるでよ。

568 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 16:27:37 ]
>>567
CRectはRECTを継承しているよ

569 名前:567 mailto:sage [2007/04/22(日) 16:29:52 ]
>>565
ああ、ゴメン俺のまちがいだった。RECTの継承でよかったわ。

570 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 17:34:42 ]
レガシーAPIに渡せるってわざわざ自分で&付けてるのかよwwww
変換演算子あるんだから使えよカスwwwwww

571 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:06:24 ]
( ´д)ヒソ(´д`)ヒソ(д` )

572 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:06:58 ]
>>566
ああ、そうだ。関係なかった。すまん。

573 名前:デフォルトの名無しさん [2007/04/22(日) 18:24:12 ]
構造体をmallocしたときは初期化はどうしたらいい?
1.気にせずmemset
2.最近のmallocはゼロクリア保障なのでそれを信じる
3.地味に全部真面目に設定



574 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:32:22 ]
>>573
Cなんだよな。
1.自作の構造体で間違いないのならおk
2.保証されてるかどうかちゃんとCユーザーズマニュアルを見れ
3.一番安全

575 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:32:32 ]
一方ロシアはcallocを使った

576 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:32:57 ]
> 最近のmallocはゼロクリア保障
大嘘を付くな

577 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:41:35 ]
>>576
え、いや、ウソじゃないです。ごめんなさい。うそじゃないです。

578 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 18:55:40 ]
>>573
>最近のmallocはゼロクリア保障なのでそれを信じる
ってホントなの?どういう環境での話?

main() {
    for(;;) {
        struct { int i; } *s = malloc(sizeof *s);
        assert(s->i == 0);
    }
}

すぐに死ぬけど

579 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 19:05:37 ]
0 クリア保証してるのは calloc だろ。

580 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 20:38:22 ]
VC++2005で見た限りはvirtual関数があるとサイズが増えてるね。
#include <stdio.h>
struct TEST1 { int x; int y; };
struct TEST2 { int x; int y; void setXY(int x, int y) { this->x = x; this->y = y; }};
struct TEST3 { int x; int y; virtual void setXY(int x, int y) { this->x = x; this->y = y; }};
int main() { printf("%d %d %d\n", sizeof(TEST1), sizeof(TEST2), sizeof(TEST3));  return 0; }
結果
8 8 12


581 名前:デフォルトの名無しさん mailto:sage [2007/04/22(日) 21:05:10 ]
>580
だから?






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<148KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef