【初心者歓迎】C/C++室 Ver.22【環境依存OK】

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2005/11/10(木) 16:00:42
>>950
うにうにしてて(´・д・`) ヤダ
953デフォルトの名無しさん:2005/11/10(木) 16:02:25
>>947
いずれすべて、UNICODEになるさ。
NTカーネルでは、ANSIのAPIは、ワイド文字に変換して、丸投げだからな。

でもなぜXPでもGetAddrInfoW()がないんだろう……。
954デフォルトの名無しさん:2005/11/10(木) 16:03:15
>>949,951
普通にキャストできたんですね。ただの勘違いでした。
ありがとうございました。
955デフォルトの名無しさん:2005/11/10(木) 16:05:02
VB.NETになると強制UNICODEだからな
956デフォルトの名無しさん:2005/11/10(木) 16:23:25
>948
エラーになるのは訳があるわけだが、ちゃんと理解してるのか?
const_castが必要というのは、基本的に設計が悪い。
957デフォルトの名無しさん:2005/11/10(木) 16:25:47
自分じゃなくライブラリの設計が悪いことも多いがな。、
958948:2005/11/10(木) 17:07:22
>>956
constをポインタに付けると、そのポインタを介した値を書き換えようとした時にコンパイラが警告を出す、で正しいでしょうか。
確かに設計に問題があると思ったので既に改善しましたが、気になったので質問させていただきました。
959デフォルトの名無しさん:2005/11/10(木) 17:29:32
>>946
あ、ホントだ…
全然、全く、知りませんでした…orz
960デフォルトの名無しさん:2005/11/10(木) 17:42:26
ところで、また根本的な質問なんですけど、
TCHAR と _TCHAR では基本的に同じものと考えて良いのですか?
961デフォルトの名無しさん:2005/11/10(木) 17:42:56
どう定義されてるか見ればいいだろ。
962デフォルトの名無しさん:2005/11/10(木) 17:53:38
質問です。
operator new と operator new[] をオーバーライドしているのですが、
char *p = new char [4];

とあるクラスの中ではoperator new に飛び、
とあるクラスの中ではoperator new[] に飛びます。
特に不具合は起きていないのですが、なんとも気味が悪いです。
原因の心当たりがある方はいらっしゃいませんでしょうか。

charの配列のため、生成しようとしているもののoperator newがオーバーロードされているわけでもありませんし…。
この現象が起こるのはVC6.0です。

友達の環境(すいません、聞きそびれました)では両方new []に飛んだそうです。
963デフォルトの名無しさん:2005/11/10(木) 18:06:45
>>962
直ちにVC6.0を使うのを止めて下さい。
964デフォルトの名無しさん:2005/11/10(木) 18:11:03
なんつーか、VC6ってアホなバグが多いよな
965デフォルトの名無しさん:2005/11/10(木) 18:15:13
サービスパックが6まで出てて、バグフィックスされてないの?
966デフォルトの名無しさん:2005/11/10(木) 18:22:06
もれはvc6からvc7.1に最近入れ替えたんだが
コンパイラの最適化の度合いが全然違うぞw
換えてよかったと思ってる
不満点はvc7.1のintellisenseが循環参照してる定義があるとフリーズすることぐらいだよ
967デフォルトの名無しさん:2005/11/10(木) 18:23:06
何その糞定義
968デフォルトの名無しさん:2005/11/10(木) 18:24:34
>>961
同じwchar_tですね。
ええ。同じだと分かりました。
969デフォルトの名無しさん:2005/11/10(木) 18:54:42
>>968
おい
970デフォルトの名無しさん:2005/11/10(木) 20:44:12
>>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も同一視して良いと思われる。
971デフォルトの名無しさん:2005/11/10(木) 21:41:53
>>969
え?

>>970
なるほど。一応別物なんですね。
取りあえずごっちゃにしても大丈夫そうだということなのは分かりました(笑)
どうもありがとうございます。
972デフォルトの名無しさん:2005/11/10(木) 21:47:12
どこをどうしたら別物になるのか・・・
973デフォルトの名無しさん:2005/11/10(木) 22:04:38
>>972
ありゃ?
どこでtypedefされてるかで違うんじゃないんですか?
>>970さんが言っているのは、
どこでUNICODEが定義されているかの違いがあるが、
別々(charとwchar_t)のものを指すことはないから同じと見て問題がない
という意味だと思ったのですけど。

…んまぁ 同じなのか。
難しく考えないようにします。(そんなに考えられるような知恵無いしw)
974デフォルトの名無しさん:2005/11/10(木) 23:42:51
命令一覧表とかってどっかないの?


975デフォルトの名無しさん:2005/11/11(金) 00:05:21
>>973
UNICODE/_UNICODEを定義するのは自身。
ソースコードでは#ifdefなどで切り分けているだけ。

>>974
C/C++に命令などありませんがなにか。
976デフォルトの名無しさん:2005/11/11(金) 00:10:38
printf
とかって命令じゃないの?
977デフォルトの名無しさん:2005/11/11(金) 00:12:22
それは関数
978デフォルトの名無しさん:2005/11/11(金) 00:16:40
へ〜
979デフォルトの名無しさん:2005/11/11(金) 00:50:23
>>795命令っていう言葉を辞書で100回調べて来てからその発言をしろ
980デフォルトの名無しさん:2005/11/11(金) 00:58:41
preprocessor directiveはあるけど他に命令なんてあったっけ?
981デフォルトの名無しさん:2005/11/11(金) 02:49:26
これって合法?駄目なケースとかある?

class Base {
 public:
    Base();
    virtual ~Base();
};

class Derived : public Base {
 public:
    Derived();
    virtual ~Derived();
};

void
foo(Derived& arg)
{
    Base local(arg);
}
982デフォルトの名無しさん:2005/11/11(金) 02:54:02
>>981
メンバ関数を仮想関数にすれば行ける。
983デフォルトの名無しさん:2005/11/11(金) 03:59:12
C++の例外処理には3種類あると聞き、困惑しています。

(catch(Exception *e){}) が当然だと思っていたのですが

ポインタで受ける(catch(Exception *e){})
コピーして受ける(catch(Exception e){})
参照で受ける(catch(Exception &e){})

の3種があると聞きました…。

この3つの使い分けって何でしょうか?
また、どれを使用するのが望ましいのでしょうか。
初心者房ですみませんがよろしくお願いします。
984デフォルトの名無しさん:2005/11/11(金) 04:07:52
>>876
sched_yield()
985デフォルトの名無しさん:2005/11/11(金) 05:13:33
>>983
効率の問題。
ポインタで受けるには、アドレスを投げる必要があるので面倒。
実体で受けると、例外オブジェクトが大きい場合、コピーコンストラクタの
処理が重くなる。

従って、参照で受けると良い。例外オブジェクトの変更の必要がなければ、
const参照で受ける。
986デフォルトの名無しさん:2005/11/11(金) 05:38:11
アドレスというか、newしたオブジェクトをポインタで受けるわけだ。
だから、catch節で、deleteしないといけないし。
987デフォルトの名無しさん:2005/11/11(金) 05:45:56
次のようなお馬鹿なコードは見たことがないが、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;
 }
}
988デフォルトの名無しさん:2005/11/11(金) 08:52:18
>>985
アドレスを投げるのが面倒って、バカじゃねーの?
989デフォルトの名無しさん:2005/11/11(金) 11:17:51
990デフォルトの名無しさん:2005/11/11(金) 12:10:21
VS 2005のExpress Editionは事実上,無償提供へ

って本当ですか?
これ、仕事にも使っても大丈夫ですよね?
991デフォルトの名無しさん:2005/11/11(金) 12:19:35
>>990
商用利用も可だったはず。
992デフォルトの名無しさん:2005/11/11(金) 12:48:01
VCTKの時みたいに、最適化コンパイラのままであって欲しいねぇ。
993デフォルトの名無しさん:2005/11/11(金) 12:50:35
>>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みたいになっておりました。
それとも値の参照の仕方が違うのでしょうか?
995994:2005/11/11(金) 13:01:54
最初の行は
float *fp; でした
996デフォルトの名無しさん:2005/11/11(金) 13:28:48
・領域確保時の値内容はプラットフォーム依存だろ
・参照の仕方はそれでいい

まぁ、確保時に明示的に0で埋めておくのが一番安全だろう
997994:2005/11/11(金) 14:12:14
ありがとうございます!
初期化って大切ですね(´・ω・`)
これに気づかず数時間も悩んでました
998デフォルトの名無しさん:2005/11/11(金) 14:30:57
>>997
vectorがおすすめ
994相当のことをして100で初期化するとすると

vector <float> fp (5, 100);
///
printf("%f", fp[i]);

こんな感じ
999994:2005/11/11(金) 15:02:01
ウホッ!いい初期化!

ありがとうございます
vector使うだけで見た目も量もいいですねぇ
1000デフォルトの名無しさん:2005/11/11(金) 15:37:29
次スレ
【初心者歓迎】C/C++室 Ver.24【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1131691023/
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。