[表示 : 全て 最新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


321 名前:オナニストガロア ◆HEfxsk5e3k mailto:sage [2007/04/15(日) 08:34:26 ]
c++ではNULLは整数型の0で定義されてますよっと。
今林先生の本読んでる

322 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 15:23:03 ]
SIMDって何て読むんですか?

323 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 15:38:40 ]
C++ではNULLではなく0を使うことが推奨されているわけだが。

324 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 16:29:54 ]
>>322
like "Ess, I'm Dee".

325 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 17:28:37 ]
>>324
どっちかというとEss, I aim Dee.

326 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 19:25:13 ]
>>321
誰も定義の話をしてないだろ
ちゃんと読めよ低脳

327 名前:286 mailto:sage [2007/04/15(日) 19:43:02 ]
>>287-290
ありがとうございました。
ちなみに試したわけではなく
純粋にどうなるのかと思った
だけでした。

328 名前:デフォルトの名無しさん [2007/04/15(日) 21:13:07 ]
vipからきました q(^-^)p

329 名前:デフォルトの名無しさん [2007/04/15(日) 21:29:29 ]
52.xmbs.jp/m3nshea2/

このサイトぶっ潰しませんか??
写メとか貼って気持ち悪いです。自分は初心者なんで潰し方がよく
分からないのでみなさんお願いします。



330 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 22:14:26 ]
void *m = 0;のとき、*(size_t*)&m!=0ということじゃね?

331 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 22:17:12 ]
>>329
お前を通報しました

332 名前:デフォルトの名無しさん mailto:sage [2007/04/15(日) 22:56:52 ]
C++の言語仕様ではヌルポインタは0なをだがな。

333 名前:デフォルトの名無しさん [2007/04/16(月) 00:56:11 ]
構造体の配列の配列を動的確保するにはどうしたらいいのでしょうか?
typedef struct {
char a;
char b;
} St;

void poo(int x, int y){
St **hoge;
hoge = (St **)malloc(sizeof(St*)*x);
for(int i=0;i<x;i++){
 hoge[i] = (St *)malloc(sizeof(St)*y);
}
}
これだと駄目でした。コンパイル通っても中身にアクセスしようとするとふっとびます。
hoge[3][5].a = 'T';
のように使いたいのですが。

334 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 01:04:23 ]
>>333
poo(3, 5); って呼び出してるって落ちでは?
こちらではpoo(4, 6)でちゃんと動く。

335 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 01:14:56 ]
>>334
poo(100,100)等と入れてるのでそういうわけではないみたいです。
他の部分との影響かもしれないのでもう少しいじくってみます。

336 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 01:25:55 ]
>>335
念のためCodeGuardを掛けてみたけど「解放されていません」の
警告以外はエラー出ないねやっぱり。

337 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 02:02:54 ]
コピーコンストラクタを使った初期化でauto_ptrで
メンバ関数を呼び出すとアクセス違反が発生しましたって
怒られるんですが、何が悪いんでしょうか。

class Circle : public Shape{
public:
Circle(int radius=0)throw();
Circle(const Circle& circle) throw();
virtual void draw() const throw();
virtual ShapePtr clone() const throw(bad_alloc);
virtual ShapePtr createSimilar() const throw(bad_alloc);
protected:
int radius_;
};
ShapePtr Circle::createSimilar() const throw(bad_alloc)
{ return new Circle(); }

ShapePtr Circle::clone() const throw(bad_alloc)
{ return new Circle(*this); }

void userCode(ShapePtr s ) throw(){
cout << "userCode() number1:";
s->draw();
ShapePtr copy = s->clone();
cout << "userCode() number2:";
copy->draw();
ShapePtr similar = s->createSimilar();
cout<< "userCode() number3:";
similar->draw();
}

338 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 02:10:10 ]
>>337
コードが足りない。症状が再現する最小のソースを貼って。

339 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 02:22:49 ]
#include <iostream>
#include <new>
#include <memory>
using namespace std;
class Shape;
typedef auto_ptr<Shape> ShapePtr;

class Shape{
public:
Shape() throw();
virtual ~Shape() throw();
virtual void draw() const throw() =0;
virtual ShapePtr clone() const throw(bad_alloc)=0;
virtual ShapePtr createSimilar() const throw(bad_alloc) =0;
protected:
int radius_;
};
Shape::Shape() throw(){}
Shape::~Shape() throw(){}

class Circle : public Shape{
public:
Circle(int radius=0)throw();
Circle(const Circle& circle) throw();
virtual void draw() const throw();
virtual ShapePtr clone() const throw(bad_alloc);
virtual ShapePtr createSimilar() const throw(bad_alloc);
protected:
int radius_;
};




340 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 02:23:28 ]
Circle::Circle(int radius)throw()
:Shape(), radius_(radius){}
Circle::Circle(const Circle& circle)throw()
{ this->radius_ = circle.radius_; }
void Circle::draw() const throw()
{ cout << "Circle: radius=" << radius_ << "\n"; }
ShapePtr Circle::createSimilar() const throw(bad_alloc)
{ return new Circle(); }
ShapePtr Circle::clone() const throw(bad_alloc)
{ return new Circle(*this); }
void userCode(ShapePtr s ) throw(){
cout << "userCode() number1:";
s->draw();
ShapePtr copy = s->clone();
cout << "userCode() number2:";
copy->draw();
ShapePtr similar = s->createSimilar();
cout<< "userCode() number3:";
similar->draw();
}
int _tmain(int argc, _TCHAR* argv[])
{
ShapePtr c(new Circle(42) );
cout << "main() number1:";
c->draw();
userCode(c);
return 0;
}
こんな感じです。
お願いします。

341 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 02:28:52 ]
ShapePtr Circle::createSimilar() const throw(bad_alloc)
{ return auto_ptr<Circle>(new Circle()); }
ShapePtr Circle::clone() const throw(bad_alloc)
{ return auto_ptr<Circle>(new Circle(*this)); }

これでどう?

342 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 02:31:57 ]
ShapePtr Circle::createSimilar() const throw(bad_alloc) {
return ShapePtr(new Circle());
}
ShapePtr Circle::clone() const throw(bad_alloc) {
return ShapePtr(new Circle(*this));
}

悪いこっちの方が見やすいね。

343 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 02:51:24 ]
うおお。
いけました。ありがとうございます。

なるほど、ちゃんとauto_ptrにして返さないと駄目だったんですね。



344 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 02:54:43 ]
>>343
簡単に言うとそういう事なんだけど、その前にコンパイルエラーに
ならなかった?

_tmain()とあるからVisual C++だと思うんだけど。

345 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 02:57:48 ]
ちなみにgcc(MinGW 3.4.2)だと

error_cc1.cpp:46: error: conversion from `Circle*' to non-scalar type `ShapePtr' requested

のようなエラーを返す。

346 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 12:19:02 ]
long long って、まだ現在の C++ の規格には入ってないの?

347 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 13:01:37 ]
どーでもいいけどlong longって
ちょっと、ちょっとちょっとレベルだよな

348 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 13:33:13 ]
DLLの関数を呼ぶときに

Func(p1,p2,p3,p4)
として呼び出した関数が、呼び出された側では
1: Func(謎の値, p1, p2, p3)
ってなっちゃうケースと、正しく
2: Func(p1,p2,p3,p4)
てなるのにその関数内でp4が破壊される(あたらしく宣言したローカル変数が上書きしてしまう)ケースがある。

デバッガでアセンブラを追ったところ、call Func の直前にpush p1 しているのは確認済み。
(呼び出し側はcdeclなのでp4から順に全てpush。)
callで呼ばれた関数に入った直後に、デバッガのスタックトレースウィンドウ内で上記現象を確認している。
(これってスタックを見てるのかな)

callと、call内部最初のステップとの間に、デバッガでは見えない何らかのバイナリがあるのかな。
もしくはDLLプロセス空間へ切り替わる(この辺じつはよく理解していない)際に、スタックポインタがおかしくなる(上記現象を説明できる仮説が立てられていない)とかそういうことかな。

DLL経由関数呼び出しの、バイナリレベルの挙動についてなにか知ってたら教えてくれ〜


349 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 13:48:24 ]
関数の宣言で何か(主に呼び出し規約を)ミスってんじゃないの?



350 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:00:01 ]
__stdcall とか __cdecl とか __pascal って書いてないの?

351 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:01:38 ]
謎の値というのはひょっとするとthisポインタの可能性もあるかも。
extern "C" で呼び出すようにし、C++の形式の関数は使わない
ようにするのが原則だけどそんな事は知ってるよね。

352 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:06:35 ]
呼び出し規約かthisポインタかどっちかの問題だと思う

353 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:07:44 ]
this 積むのは __thiscall かメンバ関数だと思うが…
C++ って標準は __stdcall だっけか?

354 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:22:23 ]
__stdcallを使うとCでも他の言語でも整合性がとれたスタックを
提供できる。

ただし、extern "C" を使った場合でもCならばC、C++ならC++で
受けないとthisポインタの絡みでずれてくる。

extern "C"は名前マングリングだけに関係する。

355 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:30:19 ]
呼び出し側も呼び出され側も _cdecl を明示的に指定している。
extern "C"はDLL側では指定してるが、呼び出し側はどこでどうやって指定すればいいのかわからんw
(GetProcAddress で関数ポインタで呼んでいる)

>>351
>>352
その場合、callの前に push this 的なものが入るんじゃないの?

さらに調べていたら、1のケースでも最後のパラメタは破壊されるようだ。

あと、Debugでビルドするとすべて正常に動く。


356 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:33:35 ]
メインプログラムもDLLもC++なの?
一度__stdcallにしてビルドしなおしてみてよ。
DEFファイルの書き方はわかるよね?これを書けば
extern "C"は不要になるので。

357 名前:348 mailto:sage [2007/04/16(月) 14:34:53 ]
あ、355は僕です スマソ

>Debugでビルドするとすべて正常に動く。

訂正。DLL側をDebugでビルドするとすべて正常に動く。


358 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:34:56 ]
>>355
typedef ret_type (__cdecl *pfunc) (arg_types...) PFUNC;

PFUNC pfn;
(FARPROC&)pfn = GetProcAddress();

アドレスを受ける変数に呼び出し規約を埋めるんだ

359 名前:348 mailto:sage [2007/04/16(月) 14:36:28 ]
>>358

んにゃ、 _cdecl はちゃんと指定しているよ。
extern "C"は呼び出し側は関係ないってことでいいんだよね?



360 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:39:35 ]
ああ
GetProcAddress() だけで完結した呼び出しなら
明示してるんだから extern "C" はイラネ-な。

361 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:40:12 ]
>>359
extern "C"はC++の名前マングリングを止めるもの。
メインもDLLも同じ処理系の同じC++で開発するなら必要ない。
(修飾名も同じになるから)

__declspec(ddexport)とか__declspec(dllimport)を使えば
DEFファイルは不要。

362 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:41:25 ]
GetProcAddressにはextern"C"付けておく必要がある。
なぜならWin32APIには名前マングリングが存在しないから。

それと
×ddexport
○dllexport

363 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:42:42 ]
まあwindows.hをインクルードしておけばextern "C"は自動的に
やってくれるので気にする必要はない。

364 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 14:51:18 ]
呼び出し規約以外にも、引数のサイズの不一致とかありそうだな
構造体を値渡ししてたり とか 可変引数だけど個数間違えたり とかしてない?

365 名前:348 mailto:sage [2007/04/16(月) 15:01:02 ]
引数の数が違うとやっぱり問題なのかな。

実は呼び出しは結構怪しいことになってて、
union DllVar { //4-byte generic container variable
HWND handle;
DWORD dword; //NULL
LPCSTR string; //String
bool boolean; //Boolean
float number; //Number
};
というのがまずあって、呼び出し側は
typedef LPCSTR (_stdcall *METHOD)(DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar,DllVar);
ってなってるが、受け取り側は必要な数しか受け取らない。

オーストラリア人の技術者が「これでOK」って言ってたので
(_cdeclでは呼び出し側がスタック破棄もするからその点で言っても問題なさそう)
信用してるんだが。

__stdcall 試してみるyo。



366 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 15:05:51 ]
それはまずいぞ。
stdcallは呼び出された側がスタックを破棄するので、
スタックにつまれた引数の数を正確に知らなくてはならない。
可変個引数を取る関数ではstdcallを使えない(指定してもcdeclと同じになる)のもこのため。

だからそういう関数ならcdeclにしておけ。

367 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 15:33:28 ]
sizeof(wchar_t) の大きさによって定義を変えたいのですが、
#if sizeof(wchar_t) == 4 も
#if sizeof(L'A') == 4 も
定数式では無いと、コンパイラが受け付けてくれません。
何かいい方法ありませんか?

368 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 16:36:22 ]
C++ならテンプレートを使ってごにょごにょ、
CならWCHAR_MAXの値を見るくらいしかないと思う。

369 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 16:43:58 ]
bccでは通った。



370 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 16:52:01 ]
でも規格上はプリプロセッサ内でsizeofは使えない仕様のはず

371 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 17:05:41 ]
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3828.txt

マルチスレッドで、ソケットプログラミングをしたいのですが、
winsock2.hをインクルードするだけでエラーが出てしまいます。
どうすればよいのでしょうか?

372 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 17:08:32 ]
どんなエラーが出てるのかくらい書けよ

373 名前:371 mailto:sage [2007/04/16(月) 17:11:58 ]
>>372
すみませんでした。
↓みたいなエラーが57個でます

c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock2.h(112) : error C2011: 'fd_set' : 'struct' 型の再定義
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock.h(54) : 'fd_set' の宣言を確認してください。
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock2.h(147) : warning C4005: 'FD_SET' : マクロが再定義されました。
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock.h(88) : 'FD_SET' の前の定義を確認してください
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock2.h(156) : error C2011: 'timeval' : 'struct' 型の再定義
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock.h(97) : 'timeval' の宣言を確認してください。
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock2.h(212) : error C2011: 'hostent' : 'struct' 型の再定義

374 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 17:19:58 ]
<winsock2.h>は<windows.h>よりも先に#includeする。

375 名前:371 mailto:sage [2007/04/16(月) 17:39:38 ]
>>374
ありがとうございましたm(_ _)m
無事解決しました!

376 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 18:30:52 ]
#define WIN32_LEAN_AND_MEAN
でもよかったとおもた。
Windows.hがwinsock.hもincludeするのが理由とか何とか

377 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 18:33:15 ]
WIN32_LEAN_AND_MEAN教えると、必要なヘッダがincludeされなくなってて、また泣き付かれることになるやもしれん。

378 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 18:38:20 ]
WIN32_LEAN_AND_MEAN はとりあえず無効化するね。

379 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 19:32:45 ]
どっちにしろホントに必要なヘッダはMSDN見ないとダメだからねー



380 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 20:32:14 ]
質問があります。
string str[] = {"aaa", "bbb", "ccc", ""};
を宣言して、

string *tmp = str;
while (*tmp->c_str()) {
printf("%s", tmp->c_str());
tmp++;
}
とやると、一応cccと表示されループを抜けるのですがこれは正しい処理なのでしょうか?
もし間違っているなら正しいやり方を教えてください。御願いします。

381 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 20:55:45 ]
>>368
>>369
>>370
sizeofが使えないのは不便ですよね^^
結局、WCHAR_MAXの値を使うことにしました。
ありがとうございました。

382 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 21:04:40 ]
>>380
for (string *tmp = str; !tmp->empty(): ++tmp) {
printf("%s", tmp->c_str());
}

自分ならこう書く

383 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 21:20:14 ]
!tmp.size()でもいいな

384 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 21:26:29 ]
気持ち悪い

385 名前:380 mailto:sage [2007/04/16(月) 21:29:02 ]
>>382-383
有り難うございます。
参考にさせて頂きます。

386 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 21:46:06 ]
C++なら余りポインタは使いたくないな・・・

std::vector<std::string> str;

str.push_back("aaa");
str.push_back("bbb");
str.push_back("ccc");

for (std::vector<std::string>::const_iterator pos = str.begin(); pos != str.end(); ++pos)
std::cout << pos->c_str() << std::endl;

と書いちゃうな・・・・

387 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 21:48:10 ]
std::copy(str.begin(), str.end(), std::ostream_iterator<std::string>(std::cout, "\n"));

388 名前:デフォルトの名無しさん mailto:sage [2007/04/16(月) 22:08:05 ]
>>383
tmp->size()では?
つまり論理が逆ではと思います。

389 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 00:13:19 ]
あるクラスのメンバ変数としてこんな定義があった場合、
class Neko {
 classA hoge1;
 classB hoge2;
}
コンストラクタは hoge1→hoge2、デストラクタはその逆の順番で
呼び出されているように見えますが、
これはC++の規格として保証されていますか?



390 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 00:14:58 ]
いいえ

391 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 00:24:31 ]
呼び出される順番は不定ということですね。
ありがとうございました。


392 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 00:30:01 ]
自分の処理系では保証されてるんだから
それでいいじゃんと思う俺ホビープログラマー

393 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 00:52:09 ]
ラベルをまたがなければ上から順、と決まってなかったっけ?

394 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 00:55:35 ]
つ[規格票]

これ以外の書き込みは嘘だと思え

395 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 01:02:18 ]
宣言順だったはずだけど

396 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 01:04:41 ]
あった

www.kuzbass.ru:8086/docs/isocpp/special.html#class.base.init
の-5-から

>Then, nonstatic data members shall be initialized
>in the order they were declared in the class definition
>(again regardless of the order of the mem-initializers).

非staticデータメンバはクラス定義での宣言順に初期化される。(メンバ初期化リストの順序は関係ない)

397 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 01:10:03 ]
ラベル云々って人は、メンバのメモリ配置と混同してるかな。

398 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 01:16:28 ]
>>389
保障されている。
staticでないメンバ変数は宣言どおりの順番でコンストラクタが呼び出され――12.6.2
デストラクタはその逆順で呼び出される――12.4.6

399 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 01:25:30 ]
規格で保障されているとはいえ、初期化順序をあてにしたコードは書きたくない。
エディタで宣言の順番を変えてしまうだけで動かなくなる不思議なコードになる。
とはいえ、そういう初期化順序を考慮したい場合もままあるわけで、そんなコードを書くなと主張するわけにも行かず。
せめて、書かないほうが良いと主張するのが精一杯。

>>390みたいに、C++プログラマ全員に、規格書をきっちり読んで置けというのも酷な話。



400 名前:デフォルトの名無しさん [2007/04/17(火) 01:25:42 ]
a=a++;

そろそろ、この類の事象を 不定だの未定義だの屁理屈並べずに
エラーにするか動作を定義するか どちらかにすべきだと思うんだ。

401 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 01:28:16 ]
>>400
参照が問題を複雑にしてくれるから、とりあえずエラーにするという選択肢じゃ解決にはならんだろうな。

402 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 01:29:03 ]
>>399
だったらC++なんか使うなよ

403 名前:391 mailto:sage [2007/04/17(火) 04:36:55 ]
ちゃんと規定があったんですね……改めてありがとうございました。
いくつかの値(hoge1とかhoge2とか)のポインタを保持しておいて、
デストラクタでファイルに書き出す、というクラスを
C++をやり始めた頃に作ってずっと使っていたのですが、
このクラスのデストラクタが呼び出されるよりも先に
hoge1やhoge2が破壊されてしまったらまずいじゃん、
ということに最近気付いたんです。

404 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 08:26:50 ]
>>403
親子関係だからセーフだね

親戚同士の順序依存するってーと >>389 での classB のコンストラクタに
classA のポインタとるようなやつとかかな

405 名前:391 mailto:sage [2007/04/17(火) 08:42:26 ]
書き方が悪かったんですが、実際そんな感じです
(コンストラクタではなくて、初期化ルーチンの中で
ClassB.AddItem()みたいな関数を使うのですが)。
C++はずっと独学でやってきていたので
すごく変な構造だったのではないかと不安だったんですが、
幸いにして(?)私にそこまでのオリジナリティーは
なかったようですね。ちょっと安心です。

406 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 08:50:19 ]
ifstream で デスクトップのファイルが読めません
ネットで検索すると同じ質問があるのですが解決してません
多分ファイル名の日本語がヤバそうなのです

環境はVC8のExpressで、Win32コンソールでCLR未使用
コマンドラインから使うタイプです
あとマルチバイトにしています
海外のソフトとかデスクトップ上のファイルが不可なので、日本語対応とかあるのでしょうか?

407 名前:オナニストガロア ◆HEfxsk5e3k mailto:sage [2007/04/17(火) 09:15:42 ]
rubyでは数値などもすべてobjectでしたがC++は違いますか?
C++が書けるとどういった利点がありますか?
ちなみに環境はVineLinux gccです

408 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 09:24:19 ]
基本型(int, double, char等のただの数値)はクラス(オブジェクト)じゃない。
正確に言うとコンストラクタは持っているけどC++の中で言うクラスではない。
当たり前の話だけど、利点はどう使うか、何に使うか、何と比べるかによる。

409 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 09:33:07 ]
・動作速度が速い
・静的型によるいくつかの利点(当然、静的型には欠点もある)
 ・オーバーロードが可能
 ・コンパイル時に型に関する大部分のバグを排除できる

とりあえず思いついたのはこのくらい。



410 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 09:41:34 ]
>>406
local.h

411 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 12:13:17 ]
>>406
WIn32は関数名の後ろにAが付いているものはANSI用で
感じはシフトJISとして扱われる。Wがついている物がUNICODE。

412 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 15:02:09 ]
ちなみにNT系でANSIなAPI呼ぶとUnicode変換されてWなAPIが呼ばれる

413 名前:348 mailto:sage [2007/04/17(火) 15:36:46 ]
デバッガ上でそう見えてただけで実際は正常だったyo
orz

エラーは別の原因。MFCのデバッグ版をリンクすると正常動作するのに、リリース版だと例外が発生。
うおーデバッグできねえ

414 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 15:47:23 ]
std::vector<int> v;
vに1, 3, 2, 3, 4がこの順番で入っているとします。
STLのremove()は処理後の有効な最後の要素を指すイテレータを返すので、
remove(v.begin(), v.end(), 3)とすると、返るイテレータは4を指していると思います。
だから、
v.erase(remove(v.begin(), v.end(), 3), v.end());
とすると、4から末尾まで消えてしまい、1, 2だけになる気がするのですが
どうしてならないのでしょうか?

415 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 15:51:16 ]
>>414
std::remove()は処理後の削除された無かった最後の要素の
"次の"位置を返す。つまりこの場合はv.end()を指している。

416 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 15:53:23 ]
チゴタ。3が削除され、それが4で上書きされる。

つまり、1, 2, 4, 4 となり、二つの4の最後の方を返す。

417 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 15:57:34 ]
これを見てもらえばremove()の動作がよくわかるはず。

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main()
{
 int a[] = {1, 2, 3, 4};
 std::vector<int> v(a, a + 4);

 std::vector<int>::iterator pos = std::remove(v.begin(), v.end(), 3);
 std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
 std::cout << std::endl;

 v.erase(pos, v.end());

 std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
 std::cout << std::endl;
}


418 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 16:08:43 ]
>>414
>v.erase(remove(v.begin(), v.end(), 3), v.end());
>とすると、4から末尾まで消えてしまい、1, 2だけになる気がするのですが

なになに、3が2つとも消えるって言いたいの?
1 3 2 3 4
0 1 2 3 4
^ ここしか消えないよ


419 名前:418 mailto:sage [2007/04/17(火) 16:09:46 ]
行頭のスペースがトリムされたorz
最後の行の^は3を指している。



420 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 16:13:46 ]
1, 3, 2, 3, 4ならこちらで

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main()
{
 int a[] = {1, 3, 2, 3, 4};
 std::vector<int> v(a, a + sizeof(a) / sizeof(a[0]));

 std::vector<int>::iterator pos = std::remove(v.begin(), v.end(), 3);
 std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
 std::cout << std::endl;

 v.erase(pos, v.end());

 std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
 std::cout << std::endl;
}

421 名前:414 mailto:sage [2007/04/17(火) 16:34:17 ]
つまり、
removeの返却値は、vの先頭部分に形成された「指定値が取り除かれた配列」の最後の要素を指す
のでは無くて、
「取り除かれた配列」の後に続く部分の最初の要素を指す
1,3,2,3,4の例でいうと、v[2]を指すイテレータではなく、v[3]を指すイテレータが返る
ということでしょうか?

422 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 16:41:12 ]
>>421
そういう事だね。
std::remove()のアルゴリズム自体は要素を削除するというのではなく
削除対象以外の要素を前に詰める働きをする。
そして削除対象の要素の先頭を返すのでそれをerase()にかけてやれば
うまく削除対象が無くなるわけだ。

423 名前:MSDN mailto:sage [2007/04/17(火) 16:43:52 ]
このテンプレート関数は、first を X に代入し、次のステートメントを実行します。

if (!(*(first + N) == val))
*X++ = *(first + N);
このステートメントは、範囲 [0, last - first) 内の各 N に対して実行されます。
この関数は、結果として X を返します。
つまり、述語 *(first + N) == val を真とする要素だけをシーケンスから除去し、残りの要素の相対的な順序を変更しません。
さらに、変更されたシーケンスの終端を指す反復子の値を返します。

いくつ条件にマッチしたかに関わらず、end() が返る でおk?

424 名前:414 mailto:sage [2007/04/17(火) 16:44:36 ]
良く分かりました。皆様ありがとうございました。

425 名前:406 mailto:sage [2007/04/17(火) 20:12:18 ]
>>411
まじで!あの”A”が謎だった
ほっぺたが落ちたよ!

426 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 20:28:48 ]
>>406
std::locale::global(std::locale(""));をmainの頭に書いてもだめか?

427 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 20:41:05 ]
Aが謎だったて、msdn見りゃ書いてあるし・・・
そうでなくてもSDKのヘッダ見りゃ#define UNICODEで分けてあるし・・・

428 名前:406 mailto:sage [2007/04/17(火) 21:01:38 ]
>>426
それで出来ました ( ・`ω・´)ノ

429 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 21:09:17 ]
winsockを使った簡単なメッセージ送信プログラムで、
クライアント側で接続ボタンを押すと、サーバに接続して
メッセージを取得してそれを表示するというものを作っています。

[クライアント側]
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3832.txt
[サーバー側]
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3833.txt

↑がソースです。コンパイルはできるのですが、
取得したメッセージが5文字目から文字化けしてしまいます。
どうすればよいのでしょうか?



430 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 21:13:16 ]
>>429
お前の環境じゃsizeof(char*) == 4だからだろ

431 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 21:17:32 ]
>>430
レスありがとうございます。
buf = (char *)malloc(11);
とかにしても、やはり5文字目から文字化けしてしまいます・・・

432 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 21:20:37 ]
recv(sock, buf, sizeof(buf), 0);
おいおい
bufがcharの固定配列ならありだけど・・・

433 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 21:35:49 ]
>>432
char *buf じゃなくて char buf[1024] にして文字化けが
解消されました。ありがとうございました!

434 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 22:08:25 ]
って、思ったんですが、1024も文字が送られてくることはめったにないのに、
それだけの領域を用意するってのはもったいなくないですか?
どうにかできないでしょうか?

435 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 22:15:05 ]
別に大したサイズじゃないしそれくらいどうってことない

436 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 22:39:51 ]
buf = (char *)malloc(sizeof(char *));
まずここがおかしい事に気づくべし。

#define BUFFERMAX 1024
buf = (char *)malloc(sizeof(char) * BUFFERMAX);

固定長文字列がイヤなら、最初に固定長数値型で文字数を取得しとくべし。

437 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 22:43:01 ]
sizeof()の結果はコンパイル時にきまるから
動的には求まらないから

438 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 22:57:28 ]
釣れますか?

439 名前:デフォルトの名無しさん mailto:sage [2007/04/17(火) 23:08:24 ]
えさが悪いよ。取り替えなさい。



440 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 00:12:15 ]
釣りではないんです・・・頭が悪いだけなんです・・・
とりあえず>>435で納得することにしました。新たに問題が・・・

ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3835.txt

サーバー側からメッセージを何回か受信し、受信するたびに改行して表示していきたいのですが、
lstrcatが上手く動作しません。lstrcatというよりもstrcpyの動作をしてるような感じです。
何が原因なのでしょうか?

441 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 00:22:01 ]
いろいろ言いたいことはあるソースだが、
受信データがヌルターミネートされてないオチとみた。

442 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 00:49:41 ]
つまり、受信に問題があるという事でしょうか?

443 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 01:00:10 ]
いや、あなたにはまだネットワーク以前に覚えなければいけないことが多々あるということ

444 名前:デフォルトの名無しさん mailto:sage [2007/04/18(水) 01:01:17 ]
GetWindowText(h2 , (PSTR)intxt , 32768);
GetWindowText(h1 , (PSTR)logtxt , 32768);
lstrcat((PSTR)logtxt, "\r\n");
lstrcat((PSTR)logtxt, (PSTR)intxt);
SetWindowText(h1 , (PSTR)logtxt);

とりあえず、エディットのウィンドウを2つ作って、↑のような形でlstrcatをやってみたら、
目的の表示を得ることができました。受信データがヌルターミネートされてない事が原因なら
どうすれば解決するのでしょうか?

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