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


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

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



1 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:18:41 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.47【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1200464091/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm


184 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 23:43:11 ]
>>181
UTF-16 でも出るがな。

185 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 00:17:28 ]
他で聞いてきます

186 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 00:20:35 ]
fatal error LNK1104:コンパイラは、ファイルd3d9.libを開けません
とでてしまいビルドできません
手動でリンカにd3d9.libを設定しましたが無理でした
どうすればよいのか

187 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 00:33:08 ]
ファイルはあるの?

188 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 00:40:25 ]
pathの設定はしたか?

189 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 01:58:17 ]
More Exceptional C++が届いたんだが
いきなり最初のコードがコンパイルできねえ
一気にやる気失くした。やっぱ古い本はこんな
もんかねえ。

190 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 02:00:08 ]
ちなみにコレ
VC++2008 g++ 4.0 でも不可

#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char* argv[])
{

(argc > 2
   ? ofstream(argv[2], ios::out | ios::binary)
   : cout)
<<
 (argc > 1
    ? ifstream(argv[1], ios::in | ios::binary)
    : cin )
.rdbuf();

 return 0;

}



191 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 02:06:46 ]
全く問題ないけど。まさかとは思うが、>190って2バイト空白入れたままで悪態ついているお馬鹿さん?

192 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 02:15:25 ]
コンパイルできないときはエラーメッセージを書こう

なんてのは宿題スレでも徹底されてるような気がする。



193 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 02:17:41 ]
gcc 4 で通らないな。
まあ当たり前だな。
右辺値の ofstream と左辺値の ostream(cout) だと
片方が右辺値なので右辺値にキャストして型を揃えようとするが、
この2つじゃどうやっても型を揃えられない。

194 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 02:20:34 ]
VC だと右辺値の ofstream を
テンポラリオブジェクトを作成して ofstream& にキャストしてしまえるから(拡張機能)
コンパイル通るかもしれん。

195 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 04:37:38 ]
たぶん、ここでしか聞けないのかなと思い書き込みさせてください!
File1.cppで定義・使用している複数配列 double a[10][5] を他の
ファイル(File2.cpp)でも共有して使用したいときって

(File2.cpp)
void CGridDlg::OnGdraw() //中で使用したい関数です
{
  extern double a[10][5];
 ・・・・・・・・
}

と定義すれば使用できるものなのでしょうか。単配列(a[10]等)の時は同様の
方法で使用できたのですが。複数配列になると上記ではリンクエラー
(LNK2001)がでてしまいます。環境はVC6++(MFCダイヤログベース)です。
超初心者です。Cの本を見てポインタなり、externなりが関係しそうかなと思った
のですが、なかなかいい兆しが見えなくて助けを借りたい次第です。

196 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 07:49:02 ]
>>191
ここに見やすく貼るために全角にしてるんよ

>>192
VC++2008でのエラーメッセージだがprivateメンバーにアクセスしようとしてる
らしい。
error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : private メンバ
(クラス 'std::basic_ios<_Elem,_Traits>' で宣言されている) にアクセスで
きません。

>>193
ostream(cout)の意味が分からないんですが。3項演算子 A ? B : C
のBがrvalueでCがlvalueだからC(ここではcout)を右辺値にしようと
するということかな?

>>194
昔の規格なりコンパイラではOKだったのかもしれんです。


197 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 08:25:12 ]
>>191

198 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 08:27:28 ]
空白orタブ <-> /**/
の置換スクリプトを希望

199 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 08:28:26 ]
>>197
>昔の規格なりコンパイラではOKだったのかもしれんです。

200 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 08:55:15 ]
>>196
左辺値の ostream の値である cout って意味ね。
エラーの理由はそれで問題ない。

201 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 09:50:51 ]
>>195
externで共有させるのはお勧めしない。
他の関数で配列を参照させるためには、ポインタを渡せばよい。
関数内のローカル変数へのポインタは、その関数実行中にしか有効にならないから、一時的にしか参照・共有できない。


202 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 09:59:52 ]
>>195
CGridDlg の private メンバ変数にして、
a の取得関数を用意すれ。

class CGridDlg {
public:
typedef double Hoge[5];
Hoge* GetA() { return m_a; }
const Hoge* GetA() const { return m_a; }
private:
Hoge m_a[10];
};

Hoge* a = grid_dlg.GetA();
a[0][0] = 1;



203 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 10:37:35 ]
猫でもわかるを買ったんですが、
超初心者の俺にはさっぱりわかりません。
何かわかりやすい本などあったら教えてください。お願いします。

204 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 10:39:09 ]
>>203
ちなみにC言語です。よろしくお願いします。

205 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 10:41:09 ]
>>203
その本で分かりにくいとかじゃなくて
さっぱり分からないというのであれば無理です、あきらめてください

それより多少分かりやすいと評判のものもありますが、大差はありません


それとも環境が用意できないとかそういうことですか?

206 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 11:54:33 ]
>>203
その本は読んだ事はないが、サンプルをぽちぽち手で入力して実行してみなされ。

手で入力して試すのが肝心。

付属CDとかダウンロードをクリックして終わりじゃ絶対に理解できない。


207 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 13:26:37 ]
>>200
なるほど。3項演算子は片方がrvalueのときは結果もrvalueになるという
ことですね。
試したところでは、static_cast<ostream>(cout)やostream obj(cout);
はできないみたいでが、そもそもostreamオブジェクトは生成できないも
のなんですか?だとしたらostreamオブジェクトであるcoutはどのように
作成されたのですかね?

208 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 13:37:27 ]
コピーしようとすると見るエラーだな

209 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 13:55:53 ]
>>207
ostreamやistreamには、引数を取るコンストラクタがある。
coutやcinはそれを使って作られるんだろう。

210 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 14:04:36 ]
>>207
static_cast<ostream&>(cout) とか ostream out(cout.rdbuf()); ならできる

211 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 15:06:27 ]
>>209
>>210
ストリームとストリームバッファには弱い結合(ストリームバッファの同期)
と強い結合(ストリームバッファの共有)ってのがあるみたいですね。
おそらく、コンソールデバイスに関連付けられたストリームバッファ
(例えばcdevという名前だったとして)というのがシステムには存在し
ていてcoutは、ostream cout(&cdev); というふうに定義されてる
んでしょうね。ストリームオブジェクトをコピーできない理由は
無制限にストリームバッファをコピーしたり(メモリの浪費)、
暗黙のうちに共有できたりしたら問題が起こるからかなと思いました。

212 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 15:07:47 ]
ストリームオブジェクトをコピーできない理由は
無制限にストリームバッファをコピーしたり(メモリの浪費)、
暗黙のうちに共有できたりしたら問題が起こるからかなと思いました。

>>208さんへのレスでした。



213 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 15:24:28 ]
coutをコピーするというのは意味がわからん、ってのもあるかもね
コンソール自体が2個に増えるわけじゃあるまいし

214 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 15:33:48 ]
>>198
つかってやってください
ttp://pc11.2ch.net/test/read.cgi/unix/997605845/55

215 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 16:41:15 ]
>>205
環境が用意できないです。
それでもあきらめた方がいいですか?

216 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 16:49:08 ]
>>203
そのままの意味が分からないけど、HDVも圧縮された素材ですよ。
H.264とは異なる方式で。

ttp://ja.wikipedia.org/wiki/HDV

217 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 16:52:43 ]
あ、なんかすげー誤爆ってた。失礼orz

218 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 16:58:08 ]
環境が用意できないっつー意味がわからん。
Macしか持ってないのにWin32前提の入門書買っちゃったってことかね?

219 名前:203 mailto:sage [2008/02/09(土) 17:03:06 ]
すいません。アフォで…
自分は今、第二章で止まってます。
と言うのも、いきなり「では、ソースを見てみましょう」となり、
「開発環境によってコンパイルの手順が異なります」
↑この時点でわかりません。

自分には向いてないのかな…orz

220 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:05:32 ]
void hoge(const char* name){ char* piyo = name + (sizeof(char) * 5); }

こんなようなことはなんで出来ないんでしょうか?
文字列nameの5文字目のポインタ(&(name[4]))をpiyoに格納したいです

error C2440: '=' : 'const char *' から 'char *' に変換できません。
このようなエラーが出るのですが正直ここでなんでこのエラーがでるんだ?といった感じです

221 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:12:11 ]
const char *piyo 

222 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:13:49 ]
>>220
書き換え可能なポインタ(char *)に書き換え不能なポインタ(const char *)を代入しようとしているからです。
void hoge(const char * name)
{
char const * piyo = & name[4];
}
こう書けば問題ありません。



223 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:14:36 ]
char *のconst性を除去してるから。入れたいならpiyoもconst char *にする。
hoge内で文字列を弄りたいなら引数をchar *にするべき。
引数は変えられず、どうしてもchar *が必要ならconst_cast<char *>(最後の手段)

224 名前:220 mailto:sage [2008/02/09(土) 17:17:20 ]
>>221-223
ありがとうございます。
よく考えたらいじる必要はないのでpiyo側をconstにしました


225 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:18:01 ]
>>219
とりあえず、なにか揮発環境は持っているのか?


226 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:18:34 ]
> name + (sizeof(char) * 5)
彼は大丈夫だろうか。

227 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:19:23 ]
>>225
はい。
ジクロルボスは揮発するので大丈夫です。

228 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:22:30 ]
俺のチームのメンバも先週揮発したぜ。

229 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:23:57 ]
ちょっと待て、それは「蒸発」じゃないのか?

230 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:24:28 ]
>>226
それって問題あるのか?パッと見わからん

231 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:26:23 ]
>>230
char であるときには問題にはならないが int とかになると…

232 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:26:24 ]
>>230
>220にはこう書いてある。
>文字列nameの5文字目のポインタ(&(name[4]))をpiyoに格納したいです



233 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:26:31 ]
>>229
そうだな。揮発は性質で、蒸発は現象だからな。

234 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:27:47 ]
>>231
いや、だいじょうぶだろw
ちゃんとintの大きさに対応してくれるよw

235 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:27:55 ]
>>230
ポインタは自動的にそのサイズ分進むから、sizeofを掛ける必要はない、とかかな?

236 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:28:25 ]
>>234
ごめん間違えた

237 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:28:46 ]
ConceptGCCで、190のコードのofstreamとifstreamを
ostream&&とifstream&&にstatic_castしたものを食わせたらどうなるかと試してみたが、
エラーだったorz。右辺値参照はライブラリまで及んでいなかった。

238 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:29:06 ]
sizeof(*name)にするべきとか。

239 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:29:46 ]
>>238
阿呆ですか?

240 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:30:00 ]
>>219
適当に c 入門 初心者とかでぐぐれば環境の入れ方から説明してるとこがきっと見つかるよ

241 名前:203 mailto:sage [2008/02/09(土) 17:46:21 ]
>>225
>>240
すいません。もう一度調べなおしてみます。

242 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:47:29 ]
>>238-239
&5[name] でいいだろ。



243 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:49:48 ]
>>242
>232

244 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:58:03 ]
char ch='a';
cout <<(int) ch << '\n'; // 97
int dt=97;
cout << (char)dt<< '\n'; // 'a'
とできるのに、

wchar_t ch1='あ';
cout <<(int) ch1 << '\n'; // 33340
int dt1=33440;
cout << (wchar_t)dt1<< '\n'; // 0x82a0

と'あ'がでないで、82a0が出るのはなぜですか?
(82a0は33440の16進です)

245 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:03:03 ]
class test{
 char* str;
 int len;
public:
 test(const char* str);
};
test::test(const char* str0){
 len = strlen(str0);
 str = new char[len+1];
}

とすると
(msvcr80d.dll) でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xccccccc0 を読み込み中にアクセス違反が発生しました。
こんなようなエラーがでます、いろいろとコメントアウトして試してみていたのですが
str = new char[len+1];部分でエラーが出ているようです、これを
str = new char[256];のようにするとエラーはでないのですが、定数でなければならないとかないですよね?
一体なんででしょうか?

246 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:10:38 ]
書いてないところのバグを見つけろって言う話?

247 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:10:39 ]
>>245
そういう時は先ず、str0の長さが実際にいくつだったのかを確認しましょう。

248 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:10:53 ]
>>245
その部分は問題ないように見える。
256にするとエラーが出ないところからみて、
どこかでバッファオーバーフローしてるんじゃない?

249 名前:245 mailto:sage [2008/02/09(土) 18:12:34 ]
>>246-247
えっとすみません、str0には固定の文字を入れるようにして試しています
16文字の文字列でして、コンストラクタ内でlenの長さを表示させるときちんと16文字になっています。
また、同じくコンストラクタ内でstr0を表示させるときちんと渡した16文字の文字列が表示されます

250 名前:245 mailto:sage [2008/02/09(土) 18:15:42 ]
main内に
char* buff = "abcdefghijklmnop";
test hoge(buff);
これだけです
余計な部分を全てコメントアウトしてるのでこれでコードは全てです

251 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:16:08 ]
実行部分をみせろ。
test test1("abcdabcdabcdabcd");
ならまったく問題ないはず。

252 名前:251 mailto:sage [2008/02/09(土) 18:22:16 ]
ごめん、違うな



253 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:23:47 ]
>>245
そこを変えたら動くからといって、バグの出元がそこだとは限らない
ぜんぜん関係なさそうな別の場所も疑う必要がある

254 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:24:42 ]
strにはアクセスしないの?
test内でstrcpyしなくていいのか?
なにがやりたいんだ?

255 名前:245 mailto:sage [2008/02/09(土) 18:36:41 ]
>>253
提示した部分以外をコメントアウトしているのですがエラーが出る状態です

>>254
その部分が原因かとも疑ってコメントアウトさせているのですがエラーが出る状態です

test::test(const char* str0){
 len = strlen(str0);
 str = new char[len+1];
 strcpy_s(str, len+1, str0);
 printf("%s\n", str0);
 printf("%d\n", len);
 printf("%s\n", str);
}
こんな具合にしますと
abcdefghijklmnop
16
abcdefghijklmnop
と表示されますがしっかりエラーがでます

256 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:44:34 ]
mainってことは、MFCとかは使ってないわけか……
リビルドしたら直るとか言う落ちはないよな?

257 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:44:45 ]
>>255
余計なincludeもコメントアウト。
さらにエラーが無くなるまでコメントアウト。
新規プロジェクトと作成して、必要なコードだけ貼り付けて動かしてみる。

258 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:44:52 ]
おかしいなあ、ちゃんと動くぞよ。

259 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:46:07 ]
class test{
 char* str;
 int len;
public:
 test(const char* str);
};
test::test(const char* str0){
 len = strlen(str0);
 str = new char[len+1];
}

int main(int, char**)
{
char* buff = "abcdefghijklmnop";
test hoge(buff);
return 0;
}

これで、エラーになるって事?

260 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:53:05 ]
少なくともうちでは落ちない。

VC++ 2005 Express Edition SP1 + Win2KSP4

261 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 18:59:59 ]
>>255
どの行で例外発生してるか突き止めたのか?

262 名前:244 mailto:sage [2008/02/09(土) 19:00:55 ]
こちらもヨロ



263 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:02:03 ]
>>262
wchar_tがただのtypedefの環境ではそうなる。
VC++6とか。

264 名前:244 mailto:sage [2008/02/09(土) 19:05:57 ]
>>263
はい、VC++2005EEですので、
そういうものなのですね。
どうもでした。

265 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:06:46 ]
2005はさすがにtypedefじゃないんじゃないか?

266 名前:244 mailto:sage [2008/02/09(土) 19:10:30 ]
どうすれば確かめられますか?

267 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:14:15 ]
>>266
wchat_tとsizeofが一致するいろんな組み込み型とで、オーバーロードしてみる。

268 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:15:47 ]
wchar_tを組み込み型として扱うコンパイルオプションがあったはず

269 名前:244 mailto:sage [2008/02/09(土) 19:25:45 ]
>>267
すいません、よくわかりません。
>>268
MSDN
------
Visual C++ コンパイラ オプション
/Zc:wchar_t (wchar_t をネイティブ型として認識)
/Zc:wchar_t を指定しない場合は、wchar_t を定義するか、または
wchar_t が定義された多数のヘッダー ファイルのいずれか
(wchar.h など) をインクルードする必要があります。
通常、wchar_t は unsigned short として定義されます。
----
とあったので、このオプションをON/OFFしてみましたが、
結果は変わりませんでした。

270 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:50:27 ]
namespace hoge
{
 int main(int argc, char *argv[])
 {

 }
}

これをコンパイルすると、↓と言われます。どうすればいいですか?
error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。


271 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:51:37 ]
>>244
coutはワイド文字に対応していない。
wcoutを使えば良い。

wcout.imbue(locale(""));
wchar_t ch1= L'あ';
wcout << (int)ch1 << L'\n';
int dt1 = 12354;
wcout << (wchar_t)dt1 << L'\n';

272 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 19:52:06 ]
>>270 何がしたいのか考え直すといいです。



273 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:03:51 ]
>>270

namespace hoge
{
 extern "C" int main(int argc, char *argv[])
 {

 }
}

274 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:18:31 ]
テラ反則w

275 名前:244 mailto:sage [2008/02/09(土) 20:24:00 ]
>>271
動きました。
私のだと、いろいろな点で駄目でしたね。
ありがとうございました!

276 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:29:58 ]
ちょっとお尋ねしたいのですが、
char *p
というポインタに、なにかしらのアドレスが格納されていて、
cout << p;
とした時に、仮に
ss[100] = {a b, c ...}; (ss[100] = \0 とする)
p = ss;
だった場合は、ss[0]から順に\0が出てくるまで走査して、
cout << p;
で、abc... と表示するわけですよね。つまり配列の要素100個分順番に読み込んでるってことですよね。

では、もしポインタpに格納されているアドレスが普通の変数のアドレス
p = &a
みたいな場合だった時は、
cout << p;
では、単純に変数aのアドレスが出力されるだけですよね。

で、ここで疑問なのですが、
p = &a;
cout << p;
だった時、処理系はどうやってpが「変数」のポインタだと判断するのでしょうか??
「配列」のポインタの場合もあるので、何かしらの方法で判断していると思うのですが、
「メモリを順番に走査して\0が出てこなかったら変数のポインタ」だとしたら
毎回\0が出てくるまで番地を順番に走査していかなくてはならないので(\0が出て来ないかもしれないのに(変数の場合))何か違う気がします。
ポインタには、アドレスや型の情報だけではなくて、そのアドレスが変数のアドレスか、それとも配列の先頭アドレスかという情報も入っているんでしょうか?

277 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:30:49 ]
>>274
正しい。

278 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:43:53 ]
>>276
単に何の型のポインタになっているかで決まる。
型が char* のときとそれ以外の T* について
operator<< のオーバーロードが違うだけ。

  char a = 'A';
  char* p = &a;
  cout << p << '\n'
とすると確保されていない領域まで突き抜けて文字列が表示される (はず) 。


279 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:43:57 ]
>>276
コンパイルするときに決まる。
それがconst char*だったら文字列、void*だったらアドレスを表示する。
その他のポインタ型は多重定義解決の規則に従って、上のどっちかに振り分けられる。

280 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:47:05 ]
>>276

> p = &a
> cout << p;
> では、単純に変数aのアドレスが出力されるだけですよね。

(aがたとえば int であるとして。)
それは間違い。

> p = &a
これをやった時点でコンパイラは型が違うとエラーにする。
p = reinterpret_cast<&a>として無理やりキャストをしてpに int * の値を入れることは可能。

>処理系はどうやってpが「変数」のポインタだと判断するのでしょうか??
pを宣言する際に、その型を char* と指定しているから、pが実際にさす先に実際にあるものが
charの配列であっても、int型の値であっても、コンパイラはcharの文字列であると扱う。

aの値がたまたま有効な文字の文字コードと'\0'が並んだ物となっていれば、該当する文字列として表示されるし、
そうでなければ制御コードを出力したり文字化けしたりする。



281 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 20:58:25 ]
>>276は一貫してpをchar*として話しているのでは。
そうすると、
> p = &a
> みたいな場合だった時は、
> cout << p;
> では、単純に変数aのアドレスが出力されるだけですよね。
は間違い。
aが存在するメモリ位置から始めて、それ以降にたまたま存在するデータを、
無理やり文字列と解釈して出力するだけ。

282 名前:176 mailto:sage [2008/02/09(土) 21:37:59 ]
そーかそもそも文字列を扱うのはchar型だけだから、
<< がオーバーロードを利用してconst char*型だけ特別に扱うようにしている、ということですね。
ありがとうございましたm(_ _)m




283 名前:デフォルトの名無しさん [2008/02/09(土) 23:57:11 ]
こんにちは。角度の比較のよい方法が思いつかずに苦労しています。
 
角度A,B,Cがあって、BがAとCの中に入っているがを判定する式で悩んでいます。

角度系は時計の3時が0度、反時計回りに360まであります。
(CはAから見て反時計方向に92度離れています)

単純な比較式
A<B && B<C
とすると、A=350度、B=0度、C=30度のときうまく成立しません。

A,B,Cそれぞれがどの象限にいるかによって
判別式を変えることも考えたのですが、組み合わせを考えるとあまりスマートな方法とも思えません。

何か簡単な式などでBがはさまれていることを知る方法があれば教えていただけませんか?


284 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 00:00:30 ]
>>283
そもそもどんな値を入れたってぐるっと回ってくれば挟まれてると言えるが?
AとCの作る角の小さい方にBがあるかどうかを判定するってことでいいのか?
その場合、AとCが180度離れていればBはどのような値であっても挟まれていないと考えていいのか?






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

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

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