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


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

C++相談室 part56



1 名前:デフォルトの名無しさん [2007/07/26(木) 00:33:07 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

テンプレその他 >>2-15 付近参照

前スレ
class C++相談室lt;part56gt;
pc11.2ch.net/test/read.cgi/tech/1170343752/l50



52 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 12:16:54 ]
>>50
それって↓ここにある話だよね?
www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232

現行の規格では 1 も未定義動作と読めるから、ダメだと考えておいた
ほうがいいんじゃない?

53 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 12:22:51 ]
DirectX SDKに以下のクラスがあって
D3DVECTOR(Cバージョン。float x,y,zのみ)
D3DXVECTOR3(C++バージョン。上記にメンバ関数が付いた)

後者を引数として受け取る関数
func( D3DXVECTOR3 &v )
に前者D3DVECTORを渡そうとしているのですが、型が違うという
エラーがでるので、func( (D3DXVECTOR3)v )とキャストしています。

問題なく動いているのですが、こういうキャストって文法的に問題無い
のでしょうか?なんとなく違和感があって
func( *((D3DXVECTOR3*)&v) )
こっちに直そうかと思っているのですが…

54 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 12:32:14 ]
ちょっと試してみたのですが、メンバ変数が異なるクラスを
func( (D3DXVECTOR3)hoge );
とするとちゃんとエラーが出ますね。ということはコンパイラが
ちゃんとそこまで判断して通してくれているのでやはり合法
なのかな?

55 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 12:32:50 ]
>>52
あら、そうだったんだ。すまん。

56 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 12:38:55 ]
>>53
msdn2.microsoft.com/en-us/library/ms887536.aspx
D3DXVECTOR3 は D3DVECTOR からの変換コンストラクタを持っているので
(D3DXVECTOR3)v が static_cast 相当の働きになり、一時オブジェクトが作られる。

ただし標準では一時オブジェクトを非 const 参照には渡せないので、
func() の呼び出しがエラーになるはず。 VC 系は最新でも通るんだっけ?

>>54
メンバ変数が同じかどうかは関係ない。

57 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 13:06:23 ]
>>53
>>56
とりあえずVC7.1で試してみた感じだと、
「組み込み型では通らないけどユーザー定義型なら通る」っぽい。

58 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 13:55:59 ]
>>56>>57
なるほど、やぱり駄目な書き方なのですね。私も最初エラーになると
思ったのですが、動いてしまったのでむしろ驚きました。
ちなみにこちらは.NET2003です。

>メンバ変数が異なるクラスは駄目
ここら辺はVCの独自拡張なのかな?
とりあえず以下の書き方に直します。
func( *((D3DXVECTOR3*)&v) );

59 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 16:40:05 ]
どこをどうすればそこまで誤読できるんだ?

60 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 16:44:32 ]
>>59
それが説明できるくらいなら誤読しないだろ。



61 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 17:33:43 ]
あれ?誤読してます?
文法的に問題ないということでしょうか?

func()の引数にconst付ければ問題ないということです?

62 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 20:54:10 ]
無名構造体のコンストラクタ、デストラクタはどうすればじっそうできるの

63 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 21:19:58 ]
無名をやめればいい

64 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:00:17 ]
無名でなければならない時は?

65 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:03:48 ]
適当な名前を付けろ。

66 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:17:25 ]
>>64
どんなとき?

67 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:19:42 ]
  \ /   ヽ     l   |   /         \_人从__
    ヘ、    ヽ  _..≧=ヽ|Y〃/∠._      / }
\ ,′ \   >ヘ´     |  /   '⌒≦  /   ノ
  ヽ.     ///                 `X  <  く  V
  !. \   / ,    /   / |     j{  /ヽ   )  だ  I
  !.     /〃/   / / , 〃|l    U \ ヽ  `)  さ  P
      / {/   / / / /  || |l } lヽ   丶  <   い で
‐-  .   / { / 〃,′{ {  |l jl | |ハ     ヽ}  ヽ  ! や
_  ヽ、 { ハ{ { {/´≧x    x≦ヽハ\ ヽ〈  ノ、   っ
    ̄ ≧‐-{;;;\ヽ{ {:::{.j    {.j::} }|lヽ \ ハヽ=≦ヽ   て
   /  `八;;;;;;;;....|xx`~  _'_  `~xxjハヽ;;;;;;;;;;}ハ   }
-‐ァ'//´   ヽ:;;;;...{ヘ、   (  j   ノ ハl|;;;;;;;ハ   ̄ ノ     /
-/ // ,     \/⌒≧ーr---ァ≦'⌒ヽノ}|};;;/ハ  /⌒Y⌒ヽ{
7/ / /      〉\ }ノ'⌒ヽ //   | リノ       \
{  /       ノ厂 {{   }'⌒ヽ⌒ヽL_     \   \!
j/    /  f´/  ノ>ァ‐1   j|   l )        \  j
ハ    /    W 〃/   `ーく{  |{   \     \,'
ハ  /   /   l{ / イ  ー==- \\  Y  ヽ  \    /\
  ×     /   ノ // |          \ヽ \   ヽ   \ イ

68 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:27:57 ]
何故だ

69 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:29:49 ]
>>66
好きなものは好きと言える気持ち抱きしめてたいとき

70 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:37:43 ]
>>69
俺の胸に飛び込んで来い



71 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 23:01:58 ]
まんゆうき懐かしいな

72 名前:名無しさん@そうだ選挙に行こう [2007/07/29(日) 14:36:28 ]
perlだと1行でできた・・・

73 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:18:36 ]
C++始めたばかり何でちょっと分からないことがあります。
class C {
public:
int hoge;
};
class B {
C *c;
public:
B() : c(NULL) {}
virtual ~B() { if (c != NULL) { delete c; c = NULL; } }
void init() { c = new C; c->hoge = 4545; }
int Get() { return c->hoge; }
};
class A {
B b;
public:
B Get() { return b; }
void init() { b.init(); }
void print() { printf("%d\n", b.Get()); }
};
int main() {
A *a = new A;
a->init();
B b = a->Get();
printf("%d\n", b.Get());
a->print();
delete a;
return 0; }
このソースなんですが、Bクラスのデストラクタが2回呼ばれてエラーを吐きます。
私的には、delete a;した時に1回だけ呼ばれてほしいのですが、どうすればいいのでしょうか?
分かる方お願いします。

74 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:35:39 ]
代入演算かコピーコンストラクタか…その辺でググレば幸せかもしれない?

75 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:43:15 ]
>>73
エラーも吐かずに普通に実行できてしまった。
再現方法は?

76 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:46:38 ]
B b = a->Get();
↑これをポインタで受け取れば?

77 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:48:41 ]
返事ありがとうございます。

>>74
ちょっと調べてみます。

>>75
試しに、Releaseビルドで実行したら普通に実行できました・・・。
Debugビルドだとエラー吐きます・・・
一応環境は、VS2005 pro です。

>>76
ポインタで受け取ってみたらエラー吐かずに実行できました。

どういう事なんでしょうか??

78 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:51:32 ]
C++の初心者はnew/deleteを使わないほうがいいと思うんだ。

79 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:53:22 ]
問題はそっちじゃなくて、class BのCポインタが2回削除されていること。
#delete aと、B bがdeleteされるとき

メンバーポインタはけっこう難しいので、最初は使わないほうがよろしいかと。
boost::shared_ptrがお勧め

80 名前:79 mailto:sage [2007/07/29(日) 16:57:41 ]
あと、C++の場合は「このインスタンスの所有者は誰?」というのを常に意識すると良いよ。
あと、RAIIを調べると幸せになれるかも。



81 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:01:31 ]
ここで返したいのはprivateのBだよね?
B Get() {return b;}
これだとここでコピーが行われて新しくメモリ作られるよ

ポインタで返すようにして
B* Get() { return &b; }
こうやってポインタで受け取るべき
B* b = a->Get();


82 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:01:59 ]
>>78-80
返事ありがとうございます。

boost::shared_ptrですか、、聞いたこと無いな、、
ググってきます。

アドバイスなどありがとうございます。
参考にさせていただきます。

83 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:03:58 ]
>>81
>B Get() {return b;}
>これだとここでコピーが行われて新しくメモリ作られるよ

あっ、そういうことですか。
難しいですね、、
ありがとうございます。

84 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:11:24 ]
>>83
>難しいですね、、
だから、>78。
そもそも、なんでnew/deleteを使うのか理解している?
#Javaじゃあるまいし、new/delete[]と違ってnew/deleteの必然性なんてそんなにないだろうに。

85 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:14:37 ]
そんなにnew/delete使わせたくないならnew/deleteについて語れよ。

86 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:22:24 ]
こういうノウハウを覚え続けないとまともに使えないのがC++

87 名前:えいいち ◆GRGSIBERIA mailto:sage [2007/07/29(日) 17:22:56 ]
MS-DOSのようなコマンド入力を受け付けるようなプログラムを組んでいるのですが、

char name[20];
char *p;
int j = 0;

cin >> name;
p = name;

if(*p == 'a'){
j = 1;
}

p++;

if(*p == 'b'){
j = 1;
}

if(j == 1){
cout << "成功\n";
}else{
cout << "失敗\n";
}
return 0;

のように書くと、コマンドの文字数や種類が増えるにつれて何行もif文に費やされることになってしまいます。
簡略化できる方法を教えてください。

88 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:24:33 ]
>>73
コピーされては困るクラスでは代入演算子やコピーコンストラクタをprivateにしよう。

class B {
C *c;
public:

private:
B(const B&);//禁止
const B&operator=(const B&);//禁止
};

詳しくはEffective C++でも読んでくれ。


89 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:26:53 ]
new/delete使う使わないは好き嫌いの問題でおk?

90 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:27:26 ]
>>87
多重分岐→データテーブル→データファイル化



91 名前:えいいち ◆GRGSIBERIA mailto:sage [2007/07/29(日) 17:28:17 ]
修正

if(*p == 'b'){
j = 1;
}



if(*p != 'b'){
j = 0;
}

92 名前:79 mailto:sage [2007/07/29(日) 17:29:45 ]
new/deleteも便利だから、まったく使わないのはもったいない。

new/deleteで問題なのは所有者がはっきりしないことなので、そこに注意していればいい。
何だかんだ言って、boost::shared_ptr使うのが良いけどね。


93 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:31:47 ]
>87
つ Commandパターン

94 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:41:24 ]
shared_ptr便利そうだけど
STLだけでやりたい漏れはいらないや。。

95 名前:えいいち ◆GRGSIBERIA mailto:sage [2007/07/29(日) 17:44:12 ]
>>90,93
ありがとうございます。

96 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:50:08 ]
>>94 auto_ptr 使え。

97 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:56:30 ]
>>94
std::tr1::shared_ptr


98 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 18:04:17 ]
>94 そうすると、auto_ptr + 生ポインタかね。
ライセンス制限ないんだから素直にboost使えばいいんじゃね?とは思うけど。

99 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 18:05:02 ]
boostインスコめんどいよめんどいよ

100 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 18:48:13 ]
shared_ptrぐらいならビルドする必要ないだろ。
インクルードパスを通しておくだけ。



101 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 18:57:05 ]
このプログラムのエラーがわからなくて困っています

hash_set<string> h;
string s = "Hoge";

h.insert(s);

stringじゃないものを指定した場合にはinsertではエラーが出ないんですが、stringだと出てしまいます。
コンパイラはg++を使っています。
原因は何でしょうか?また、対応策はあるのでしょうか?わかる方がお願いします。

102 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 19:20:21 ]
>>101
エラーメッセージは?

103 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 19:31:22 ]
boostってライブラリとソース落としてこないと使えないでしょ?

104 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 19:39:55 ]
一部を除いてヘッダをインクルードするだけで使える

105 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 19:41:45 ]
>>101
>原因は何でしょうか?
ext/hash_fun.hに template <> struct hash<std::string> が定義されてないから

>対応策はあるのでしょうか?
たぶんこんなんで良いと思う
#include <string>
#include <ext/hash_set>
struct string_hash
{
size_t operator () (const std::string &p) const
{
return __gnu_cxx::hash <const char *> () (p.c_str ());
}
};
int main ()
{
__gnu_cxx::hash_set <std::string, string_hash> h;
std::string s = "Hoge";
h.insert(s);
}


106 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 19:46:06 ]
>>103
じゃ今後ともどんなプログラムも頑張って標準関数だけで書いていって下さい


107 名前:105 mailto:sage [2007/07/29(日) 19:49:47 ]
あぁ105では動くけど速くないかも知れんよ


108 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 19:59:10 ]
vs2008がboostのライブラリを2,3個破壊しないか心配

109 名前:名無しさん@そうだ選挙に行こう [2007/07/29(日) 20:09:15 ]
ヘッダファイルのみ(ソースファイルは無し)で
唯一の静的汎用クラスを作ろうとしてこうしたんだけど、
こういう書き方普通?一応うまくいってますが

//test.h
#include <windows.h>
class CTest{
   friend CTest* test();
   CTest(){}
   char *c; //実質静的メンバ変数(ソースで初期化する必要なし!)
public:
   void f1(){c="f1";MessageBox(0,c,0,0);}
   void f2(){c="f2";MessageBox(0,c,0,0);}
   void f3(){c="f3";MessageBox(0,c,0,0);}
};
static CTest* test(){ //ここからのみアクセスできる
   static CTest inst;
   return &inst;
}

//main.cpp
#include "test.h"
int main(){
   test()->f1();
   test()->f2();
   test()->f3();
}

110 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 20:13:23 ]
ポインタは遅いしいろいろ駄目だから
なるべく参照を使っているのですが、
戻り値に参照を使っているときに関数が失敗したときに
NULLは返せません。この場合どうすればいい?
exit(0)で強制終了するとか駄目だし・・・



111 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 20:13:45 ]
シングルスレッドならいいんじゃね

112 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 20:14:28 ]
>>109
2つのソースから include して使ってみろ。うまくいかない。

113 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 20:16:26 ]
>>109
> static CTest* test(){

このstaticは余計なんじゃねーの

114 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 20:16:37 ]
>>110
ポインタが遅いから参照ってのが大間違い。そんなの信じてるようじゃ
「いろいろ駄目」ってのも疑わしい。ヌル返したいなら素直にポインタ使え。

本当に参照が適切なら、失敗を例外で伝えるという手もある。

115 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 20:19:56 ]
ポインタって参照に比べて遅いの?
一番早い書き方は?

116 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 20:20:38 ]
>>103
Boost Consultingにインストーラあったと思ったが

117 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 20:21:47 ]
ポインタが遅いってなんだ?
エイリアスが無いと判断しにくいから最適化しにくいとかそういう話?

118 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 20:26:48 ]
>>113
コンストラクタがprivateなのにどうやってインスタンス化しろっての。


119 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 20:38:07 ]
>109
一昔前ならLoki::Singletonをお勧めしていたところだけど……
boostにSingletonあったっけ?


120 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 20:40:12 ]
つーかそもそもシングルトン、要るか?



121 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 20:41:02 ]
いらねーよ。今でも要らないシングルトンが量産されてるってのに。

122 名前:デフォルトの名無しさん [2007/07/29(日) 20:41:20 ]
    __    .__
   /|   \ /   |\
 /  |   /     |  \ Nentansoft
|  /\/ ^o^  /\/| 
|/\/     /\/ | J i n s e i O w a t a o 2 0 0 5
 \  |     /   |  /
   \|__/ \__|/

123 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 20:42:09 ]
>>118
それ static 関係ない。 friend が指定してある。

あれ? friend に内部リンケージの関数って不味くないか?

124 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 20:47:46 ]
それ、翻訳単位毎にtest関数とその中の
CTestのinstが存在することにならね?

125 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 20:52:14 ]
>>119
ttp://boost.cppll.jp/HEAD/libs/pool/doc/implementation/singleton.html

126 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 21:27:24 ]
>>109
テンプレートクラスなら普通にstaticなメンバ変数をヘッダ内に書ける(ODRに違反せずに「定義」できる)んじゃ無かったっけ?
それなら前にやったことがあるけど。
っていうかこれってどうやってるんだろう。やっぱリンカががんばってるんだろうか。

テンプレートじゃなきゃ、別にヘッダだけで収めようとしたことはないなぁ。


127 名前:デフォルトの名無しさん mailto:sage [2007/07/29(日) 22:16:17 ]
>>109 コピーコンストラクタを禁止しないのはまずいと思う

128 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 00:34:51 ]
>>116
いや、便利ライブラリが嫌いなんじゃなくって
STL以外だと会社にもってって使えないいんよね。
便利なパーツは単体で、尚且つインクルード/コピペするだけで
リンカの設定弄らなくてもさくっとコンパイルできるのがいい。

ソース管理されてる環境だとプロジェクトファイルすら弄れないしね。。

129 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 00:39:49 ]
>>128
同意

130 名前:デフォルトの名無しさん [2007/07/30(月) 00:45:12 ]
質問です

「あいうえお」と書いた外部ファイルを読み込んで1文字画面に出力するという操作を実装しようとしたら文字化けしてしまいました。

理由は文字コードが0x82A0なのに対し0x82までしか読み込んでなかったからみたいなのですが、

FILE* fp;
wint_t ch;
TCHAR s;
if( fopen_s(&fp, "word.dat", "r") )
{
MessageBox(NULL, TEXT("ファイルオープンに失敗"), NULL, MB_OK | MB_ICONSTOP);
exit(-1);
}
for(ch=fgetwc(fp); ch!=EOF; ch=fgetc(fp))
{
wsprintf(&s, TEXT("%d"), ch);
MessageBox(NULL, &s, NULL, MB_OK);
}
fclose(fp);

これだと1バイト分しか読み込まないのでしょうか?
また、2バイト読み込むにはどうしたらいいのでしょうか?

使ってる環境は、
WindowsXP Home Edition
VC++2005 Express Edition
です。



131 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 00:45:53 ]
BSTRかwchar_t使えば?

132 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 00:50:28 ]
>便利なパーツは単体で、尚且つインクルード/コピペするだけで
>リンカの設定弄らなくてもさくっとコンパイルできるのがいい。

Boostは大概インクルードだけで使えるけど……

133 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 00:53:04 ]
インスコで環境を変えないなら使う

134 名前:130 mailto:sage [2007/07/30(月) 00:56:53 ]
>>131

できませんでした。
wint_tも2バイト変数なのでfgetwcで2バイト読み込んでないということだと思うのですが、
fgetwcでは2バイト読み込むことは出来ないのでしょうか?

135 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:00:43 ]
>>130
C言語の上にバグ持ちのVC++8.0か

環境依存スレ向きの話題じゃないのか

136 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:08:11 ]
TCHAR s; //<--1バイト?2バイト?
wsprintf(&s, TEXT("%d"), ch);

TCHARってコンパイルの環境によって定義かわらない?

137 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:11:05 ]
TCHARの定義はUNICODEが定義されているかどうかで変わるし
fgetwc()とfgetc()を混ぜこぜにしてるし
> TCHAR s;
> wsprintf(&s, ...
って何だそら
ムチャクチャだ

138 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:14:30 ]
Cのwchar_tがらみの関数はsetlocale()を実行しておかないと
まともに動かん

VC++8.0の場合はバグのせいで、どっちみちw系のコンソール入出力が
腐るので諦めろ

139 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:17:31 ]
VC++8ってそうなのかw
TCHAR WCHARとかじゃなく
明示的にchar wchar_tとか書いてもだめなん?

140 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:19:18 ]
imbue



141 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:20:09 ]
>>139
有名な話だよ。SP1でも直ってない。
forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=250724&SiteID=7
参照。

142 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:23:53 ]
>>140
Cにはimbueも糞も無いんだが。
以下のコードがVC8.0では期待したように動かない。
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(void)
{
    wint_t c;
    setlocale(LC_CTYPE, "");
    while ((c = getwchar()) != WEOF)
        putwchar(c);
    return 0;
}

143 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:25:08 ]
ほんまやw
MSだせーな
BCC32マンセーしててしらんかったわw

144 名前:130 mailto:sage [2007/07/30(月) 01:38:26 ]
みなさんアドバイスありがとうございました。

VC++8.0にはバグがあったんですね…

bccでコンパイルしてみることにします。

145 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:39:52 ]
>>130
ざっくり見直してみたけどこれでどうよ?

FILE* fp;
wint_t ch;
wchar_t s[32]; //10進数の文字表現を格納する?

if( fopen(&fp, "word.dat", "r") )
{
MessageBoxW(NULL, L"ファイルオープンに失敗", NULL, MB_OK | MB_ICONSTOP);
exit(-1);
}
for(ch=fgetwc(fp); ch!=EOF; ch=fgetwc(fp))
{
wsprintf(s, L"%d", ch);
MessageBoxW(NULL, s, NULL, MB_OK);
}
fclose(fp);


146 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 01:41:26 ]
>>145
WEOFにしないと無限ループ

147 名前:145 mailto:sage [2007/07/30(月) 01:42:18 ]
ああスマン

148 名前:130 mailto:sage [2007/07/30(月) 02:07:48 ]
>>147

このソースでも文字コードが0x82と0xA0いうふうに分かれて表示されてしまいました

やはりBCCを使ったほうがいいということなのでしょうか…

149 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:09:19 ]
ん?もしかして
fopen/fcloseじゃなくて、wfopen/wfcloseじゃないとだめとかある?

150 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:09:55 ]
>>148
setlocale(LC_CTYPE, "");
をプログラムのドアタマで実行汁。



151 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 02:10:37 ]
>>149
関係ねー
それらはUTF-16なパス名でストリームを開く、というだけだ

152 名前:130 mailto:sage [2007/07/30(月) 02:30:11 ]
>>150

出来ました!
ロケールというものを設定しないといけなかったんですね!

ロケールについて調べてみたらよくわからなかったんですが、
ロケールとはパソコンの情報の表示形式みたいなものと考えていいのでしょうか?






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

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

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