【初心者歓迎】C/C++室 Ver.22【環境依存OK】
>>947 いずれすべて、UNICODEになるさ。
NTカーネルでは、ANSIのAPIは、ワイド文字に変換して、丸投げだからな。
でもなぜXPでもGetAddrInfoW()がないんだろう……。
>>949,951
普通にキャストできたんですね。ただの勘違いでした。
ありがとうございました。
VB.NETになると強制UNICODEだからな
>948
エラーになるのは訳があるわけだが、ちゃんと理解してるのか?
const_castが必要というのは、基本的に設計が悪い。
自分じゃなくライブラリの設計が悪いことも多いがな。、
958 :
948:2005/11/10(木) 17:07:22
>>956 constをポインタに付けると、そのポインタを介した値を書き換えようとした時にコンパイラが警告を出す、で正しいでしょうか。
確かに設計に問題があると思ったので既に改善しましたが、気になったので質問させていただきました。
>>946 あ、ホントだ…
全然、全く、知りませんでした…orz
ところで、また根本的な質問なんですけど、
TCHAR と _TCHAR では基本的に同じものと考えて良いのですか?
どう定義されてるか見ればいいだろ。
質問です。
operator new と operator new[] をオーバーライドしているのですが、
char *p = new char [4];
が
とあるクラスの中ではoperator new に飛び、
とあるクラスの中ではoperator new[] に飛びます。
特に不具合は起きていないのですが、なんとも気味が悪いです。
原因の心当たりがある方はいらっしゃいませんでしょうか。
charの配列のため、生成しようとしているもののoperator newがオーバーロードされているわけでもありませんし…。
この現象が起こるのはVC6.0です。
友達の環境(すいません、聞きそびれました)では両方new []に飛んだそうです。
>>962 直ちにVC6.0を使うのを止めて下さい。
なんつーか、VC6ってアホなバグが多いよな
サービスパックが6まで出てて、バグフィックスされてないの?
もれはvc6からvc7.1に最近入れ替えたんだが
コンパイラの最適化の度合いが全然違うぞw
換えてよかったと思ってる
不満点はvc7.1のintellisenseが循環参照してる定義があるとフリーズすることぐらいだよ
何その糞定義
>>961 同じwchar_tですね。
ええ。同じだと分かりました。
>>960 TCHARは<Windows.h>の中の中でインクルードされる<WinNT.h>の中で
UNICODEが定義されているかどうかでcharかwchar_tからtypedefされる。
_TCHARは<tchar.h>の中で_UNICODEが定義されているかどうかでcharかwchar_tからtypedefされる。
ところどころでUNICODEが定義されていれば_UNICODEを定義し、
_UNICODEを定義が定義されていればUNICODEを定義するように書かれているから両者はごっちゃにしても差し支えない。
実質的にTCHARと_TCHARも同一視して良いと思われる。
>>969 え?
>>970 なるほど。一応別物なんですね。
取りあえずごっちゃにしても大丈夫そうだということなのは分かりました(笑)
どうもありがとうございます。
どこをどうしたら別物になるのか・・・
>>972 ありゃ?
どこでtypedefされてるかで違うんじゃないんですか?
>>970さんが言っているのは、
どこでUNICODEが定義されているかの違いがあるが、
別々(charとwchar_t)のものを指すことはないから同じと見て問題がない
という意味だと思ったのですけど。
…んまぁ 同じなのか。
難しく考えないようにします。(そんなに考えられるような知恵無いしw)
命令一覧表とかってどっかないの?
>>973 UNICODE/_UNICODEを定義するのは自身。
ソースコードでは#ifdefなどで切り分けているだけ。
>>974 C/C++に命令などありませんがなにか。
printf
とかって命令じゃないの?
それは関数
へ〜
>>795命令っていう言葉を辞書で100回調べて来てからその発言をしろ
preprocessor directiveはあるけど他に命令なんてあったっけ?
これって合法?駄目なケースとかある?
class Base {
public:
Base();
virtual ~Base();
};
class Derived : public Base {
public:
Derived();
virtual ~Derived();
};
void
foo(Derived& arg)
{
Base local(arg);
}
983 :
デフォルトの名無しさん:2005/11/11(金) 03:59:12
C++の例外処理には3種類あると聞き、困惑しています。
(catch(Exception *e){}) が当然だと思っていたのですが
ポインタで受ける(catch(Exception *e){})
コピーして受ける(catch(Exception e){})
参照で受ける(catch(Exception &e){})
の3種があると聞きました…。
この3つの使い分けって何でしょうか?
また、どれを使用するのが望ましいのでしょうか。
初心者房ですみませんがよろしくお願いします。
>>983 効率の問題。
ポインタで受けるには、アドレスを投げる必要があるので面倒。
実体で受けると、例外オブジェクトが大きい場合、コピーコンストラクタの
処理が重くなる。
従って、参照で受けると良い。例外オブジェクトの変更の必要がなければ、
const参照で受ける。
アドレスというか、newしたオブジェクトをポインタで受けるわけだ。
だから、catch節で、deleteしないといけないし。
次のようなお馬鹿なコードは見たことがないが、deleteの必要がない。それだけ。
#include <iostream>
#include <exception>
#include <memory>
class A {
public:
static char* what() {
return "class A";
}
};
int main()
{
try {
throw std::auto_ptr<A>(new A);
}
catch (std::auto_ptr<A> a) {
std::cout << a->what() << std::endl;
}
}
>>985 アドレスを投げるのが面倒って、バカじゃねーの?
VS 2005のExpress Editionは事実上,無償提供へ
って本当ですか?
これ、仕事にも使っても大丈夫ですよね?
VCTKの時みたいに、最適化コンパイラのままであって欲しいねぇ。
>>990 うわーいと言いたいところだけど、最近2003買ったばっかりなんだよね(´・ω・`)
994 :
デフォルトの名無しさん:2005/11/11(金) 13:00:38
float fp;
fp = new float [5];
のようにfloat型へのポインタに5つの配列を宣言しました
この時はfp[0]...fp[4]まで初期化しないとおかしな数値が入っているのでしょうか?
printf("%f", fp[i]);のようにforでまわしてみたところ-44556.0000みたいになっておりました。
それとも値の参照の仕方が違うのでしょうか?
995 :
994:2005/11/11(金) 13:01:54
最初の行は
float *fp; でした
・領域確保時の値内容はプラットフォーム依存だろ
・参照の仕方はそれでいい
まぁ、確保時に明示的に0で埋めておくのが一番安全だろう
997 :
994:2005/11/11(金) 14:12:14
ありがとうございます!
初期化って大切ですね(´・ω・`)
これに気づかず数時間も悩んでました
>>997 vectorがおすすめ
994相当のことをして100で初期化するとすると
vector <float> fp (5, 100);
///
printf("%f", fp[i]);
こんな感じ
999 :
994:2005/11/11(金) 15:02:01
ウホッ!いい初期化!
ありがとうございます
vector使うだけで見た目も量もいいですねぇ
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。