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


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文字目から文字化けしてしまいます・・・






[ 続きを読む ] / [ 携帯版 ]

前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