08/06/18 02:42:14
>>117
バグかと思ってたんだけど、仕様らしい。
URLリンク(connect.microsoft.com)
めんどくさいけど標準ライブラリにマルチバイト文字を処理させようと思ったら
プログラム起動時に std::locale::global(std::locale("")) しとくのが正解みたい。
138:デフォルトの名無しさん
08/06/18 03:48:48
VC++2005でstlで使用する場合
全体の設定はデフォルトのまま"C"にしておく。
std::locale::global(std::locale("C"))
iostream系を使う場合は個々にロケールを設定する。
std::wcout.imbue(std::locale(""))
std::wcin.imbue(std::locale(""))
VC++2008では確認した限り直ってる
139:デフォルトの名無しさん
08/06/18 10:13:21
>>136
ctype以外のカテゴリをグローバルロケールに設定なんてしたくないよ
sstreamの数値フォーマッティングとかにまで影響があるし
やるならctypeだけに絞る
どっちみちWin32ならファイル名はUTF-16なんだから
ファイル名はUTF-16で扱っとかないと、「とりあえず日本語のファイルが開ける」
ようになるだけじゃん
140:91
08/06/18 12:57:25
レス遅くなってすみません。ありがとうございました。
色々方法はあることがわかりました。
オブジェクト指向的にどれが正しいか…と考えるとよくわからなくなってしまいます。
privateメンバの中に書いてしまう方式で行こうかと思っています。
141:デフォルトの名無しさん
08/06/18 13:39:48
> 134
なるほど。
ありがとう、やってみる。
char dat[8] = "message";
HANDLE pipe_r;
HANDLE pipe_w;
BOOL res = CreatePipe(&pipe_r, &pipe_w, NULL, sizeof(dat));
DWORD dwSize = sizeof(dat);
DWORD dwResult;
WriteFile(pipe_w, (LPCVOID)dat, dwSize, &dwResult, NULL);
int hCrt = _open_osfhandle((long)pipe_r, _O_TEXT);
FILE * fp;
fp = _fdopen(hCrt, "rb");
int n;
while((n = fgetc(fp)) != '\0'){
putchar(n);
}
fclose(fp);
// CloseHandle(pipe_r);
CloseHandle(pipe_w);
これでいいんかね?
この場合
CloseHandle(pipe_r);
するとエラーが出るんだけどfcloseが代替してくれてると思っていいのかな?
142:デフォルトの名無しさん
08/06/18 16:55:20
>>141
> するとエラーが出るんだけどfcloseが代替してくれてると思っていいのかな?
そういうこと。
_open_osfhandleの説明には、_closeが中でCloseHandleする、
_fdopenではfcloseが中で_closeすると書いてある。
あと、_open_osfhandleと_fdopenでモードの指定が食い違っているのと、
_open_osfhandleでのハンドルの型は、longではなく
intptr_t(またはINT_PTR)になっているということが気になった。
143:デフォルトの名無しさん
08/06/18 17:13:35
#include <iostream>
class intl{
public:
int il;
void setil(int &i){il=i;}
};
int main(){
int *i = new int;
*i = 1;
intl i_intl;
i_intl.setil(*i);
delete i;
std::cout << i_intl.il;
return 0;
}
というようなことをやると、1が出力されます。
私の理解ではintl::setil()は参照仮引数なので、呼び出し時に*iのアドレス、
つまりポインタiが渡され、*iとilが同一のメモリ領域を表すようになるのではと思います。
従ってiをdeleteしてしまうとilも消えるのではと思うのですが、そうなっていないようです。
私の考えのどこが間違っているでしょうか。よろしくお願いします。
144:デフォルトの名無しさん
08/06/18 17:24:12
ii_intl.ilが参照でもポインタでもないから、
setilの中では、iからilへ値がコピーされている。
145:デフォルトの名無しさん
08/06/18 17:24:59
deleteってのはオブジェクトをもう使わない、とシステムに返す命令。
中身をクリアするわけじゃない。
直後に i を参照すれば、その間に何の処理も行われないからメモリ上は前の値が残っている。
それを参照しているだけ。
いつどのタイミングで、このiの値が書き換えられるかは、誰にも予想できない。
146:デフォルトの名無しさん
08/06/18 17:26:08
げ、恥ずかしい。
144のいうとおりだった。
145は早とちり。
147:143
08/06/18 17:35:28
レスありがとうございます。
クラスintlの定義を変えて
class intl{
public:
int *il;
void setil(int &i){*il=i;}
};
とした場合はやはりdelete後もilが残り、
class intl{
public:
int *il;
void setil(int &i){il=&i;}
};
とした場合はdeleteによってilも消えるようです。
>>144によれば、iが参照渡しでかつilがポインタであっても
*il = i;
の場合はiのコピーが渡されるということのようですね…。
この場合、il自身はインスタンスi_intlが消えるまで生き残るということですよね?
うーん、ややこしい気がする…。
148:143
08/06/18 17:35:56
sage忘れすみません。
149:デフォルトの名無しさん
08/06/18 17:58:20
> int *il;
> void setil(int &i){*il=i;}
初期化してないポインタ il が指す場所に値を入れてるのでダメ。
150:デフォルトの名無しさん
08/06/18 18:58:58
参照をポインタと似たようなもんだと思っていたら訳ワカメになるよ。
どうやらポインタのほうも理解していないようなので、
まずポインタとメモリの動的確保をきっちり勉強したほうがいいね。
151:デフォルトの名無しさん
08/06/18 20:19:58
巷じゃMozilla Firefox 3.0の話題でもちきりだが、4.0世代はC++で開発するんだな・・・
152:デフォルトの名無しさん
08/06/18 20:20:52
いまままではCC??
153:デフォルトの名無しさん
08/06/18 20:45:48
memcpyは第三引数が0であっても正常に動作する事が保証されていますか?
154:デフォルトの名無しさん
08/06/18 22:06:29
規格に 0 だとダメとか特に書いてないから 0 でも大丈夫。
155:デフォルトの名無しさん
08/06/18 22:07:42
派生の質問だけど、第3引数が 0 で第1第2引数が NULL の場合はどうなんだろ。
memcpy の規格には領域が重なってるときは未定義ってことしか書いてないけど・・・。
156:デフォルトの名無しさん
08/06/18 22:10:46
そういや、いつの間にか規格が文書内検索できるようになってた。
結構文句きてたんだろうな。
157:デフォルトの名無しさん
08/06/18 22:22:31
Foxit Readerで見れなくなっちまった。