- 1 名前: ◆h6A7qfFFu6 mailto:sage [2008/12/29(月) 11:05:07 ]
- スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。
過去ログ スレを勃てるまでもないC/C++の質問はここで pc11.2ch.net/test/read.cgi/tech/1167476845/ スレを勃てるまでもないC/C++の質問はここで 2 pc11.2ch.net/test/read.cgi/tech/1178503366/ スレを勃てるまでもないC/C++の質問はここで 3 pc11.2ch.net/test/read.cgi/tech/1187521676/ スレを勃てるまでもないC/C++の質問はここで 4 pc11.2ch.net/test/read.cgi/tech/1221633708/
- 427 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 14:49:19 ]
- >>418の頭の中のバグを直すのは難しいw
消防からやりなおせってとこか
- 428 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 14:49:23 ]
- パディングの話だろ。
- 429 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 14:49:28 ]
- >422
HEADER2はHEADER1のname[254]をコメントアウトしているので HEADER2 + name[254] = HEADER1に何でならないのかと思いまして.
- 430 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 14:51:06 ]
- それぞれ全く無関係だから。
- 431 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 14:51:14 ]
- パディングとかアラインメントとかでググれ
- 432 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 14:52:31 ]
- なんかバカが紛れ込んでて話をややこしくしてるな。
>>422>>423>>424>>426>>427>>430 あたりは無視してよろしい。
- 433 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 14:53:03 ]
- いやいや、型の定義は (おまえの疑問とは) 関係ないよ。
printfで出力された値を見れば、ただ足し算するだけ。 定義のところに疑問があるなら、疑問を持つべきは最後のprintf文じゃないでしょ?
- 434 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 14:53:56 ]
- >>433
だから分からん奴は黙っとけ。
- 435 名前:418 mailto:sage [2009/01/03(土) 14:54:25 ]
- パディングでぐぐったら答えが出てきました.初めて知ったよ.
みなさんありがとう.
- 436 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 14:54:32 ]
- お前は代入式ってファビョってりゃいいんだよw
- 437 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 14:55:41 ]
- >>436
クソワロタ
- 438 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 14:57:26 ]
- パディングやアラインメントならsizeof(HEADER2)の値が6じゃないのを疑問に思うのが普通じゃね?
- 439 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 14:57:34 ]
- 数字だけ言うんだもん、足し算の問題だと思うわ
結局日本語で理解できなかったよ
- 440 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 14:58:38 ]
- >>434
まぁ解決したからいいいけど、2個目のprintfでHEADER2のサイズが HEADER1 - 256 になってない時点で疑問に思うべきだってことだよ
- 441 名前:デフォルトの名無しさん [2009/01/03(土) 15:20:54 ]
- >>436
きもいぃ〜〜〜〜はいっ、きっ、もっ、いっ、キモイ!きっ、もっ、いっ、キモイ! キモイィ〜〜〜〜
- 442 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:25:47 ]
- なんか頭のおかしい基地外が、自分の不備を指摘されてファビョってまつねw
あのwhile文の中は、条件式が適切なのに、代入式で済ませているなんて、 プログラマー失格だろ。コンパイラが警告しているのに、アホ過ぎ。黙ってろよ、ド素人w
- 443 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:29:52 ]
- 簡単な質問で申し訳ないのですが
visual stdio 2005 無償版でデバッグ開始してみたところ 「0x0040115d でハンドルされていない例外が発生しました: 0xC0000094: Integer division by zero」 というメッセージがでて実行中に強制終了してしまいました。 これってどうすればいいんでしょうか・・・?
- 444 名前:デフォルトの名無しさん [2009/01/03(土) 15:30:39 ]
- Linuxでは代入が正解だ。
オープンソースも知らない素人は黙っとけよ。 恥ずかしい奴だな。
- 445 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:32:30 ]
- なんか一匹、年明け早々、必死に基地外っぷりを発揮していますね(^ー^)v
アァ〜〜キモッキモッ、きっと鏡を見ると、キモイ面が映っているんでしょうね。 現実に目を向けようぜ、こんな文字列ばかりのスレじゃなくて、さ?
- 446 名前:デフォルトの名無しさん [2009/01/03(土) 15:33:00 ]
- >>443
ゼロで割ることはできない。
- 447 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:33:15 ]
- >>443
何かを0で割ったんじゃね?
- 448 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:34:57 ]
- 代入式でも条件式でも「式」でありさえすればなんでもいいのがCの仕様。
バカが条件式限定だと思い込んで恥をさらしてファビョりまくってるのが現状。
- 449 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:35:13 ]
- パディングって、詰め物だっけ
コンパイラの最適化って、害悪だと思う
- 450 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:36:00 ]
- 最適化がなかったら困ったことになると思うが。
- 451 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:36:44 ]
- >>449
もう一度勉強しようね
- 452 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:37:19 ]
- >>446-447さん
ありがとうございました。解決したみたいです。
- 453 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:37:28 ]
- >>443
デバッグ開始してるなら、中断とか継続とか出ると思う。 中断すれば該当行にカーソルが行く。 その行で割り算してて、割る数が0なんだろう。 変数にマウスカーソルあてると数値見えたりもする。
- 454 名前:デフォルトの名無しさん [2009/01/03(土) 15:37:56 ]
- >>443
visual stdioなんか使うからだろ。 gcc使え。 gccなら0除算OKだ。 いまどき0除算もできないコンパイラなんてM$製くらいだ。 これだからドザは駄目なんだよ。
- 455 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:38:37 ]
- パディングってワード間隔でデータを区切って
実行速度を速める為の手法だっけ
- 456 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:38:42 ]
- >>442
式は値を持つんだから、なんの問題も無いだろ。 警告がいやなら、while ((j=0-i++)) とでもすればいい。 なにも知らないド素人は黙ってろよw
- 457 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:38:50 ]
- >>444
これって乱数で過去レスを切り貼りするスクリプトでしょ。
- 458 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:39:24 ]
- やたらからんでくる愚かものがいるなw
さすが、言語スレ いつまでも、こんな言語仕様のスレみてるのなんて学生ばっかだっつーの
- 459 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:39:52 ]
- みんな親切だな。
英和辞書引け、でいいのに。
- 460 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:40:21 ]
- >>455
そう
- 461 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:40:44 ]
- >>455
基本的にはそうだが、 アラインメントされてないと データを読めない CPU もある。
- 462 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:40:57 ]
- ビットフィールドってので、
手動でやる場合もある
- 463 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:41:00 ]
- >>454
0で割るってどういうことか知ってる?
- 464 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:41:49 ]
- >>463
宇宙の法則が乱れる
- 465 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:42:15 ]
- 学生や初心者が見るスレだからこそ、間違った知識は叩かれねばならない。
- 466 名前:デフォルトの名無しさん [2009/01/03(土) 15:44:34 ]
- >>463
visual stdioが破壊されるってことだろ。 素直にオープンソース使えって。 無理するな。
- 467 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 15:45:39 ]
- >>460-462
アラインメントをキーワードにググってみた。 説明ありがとー
- 468 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 16:21:15 ]
- >>458
おいっ、絡まれてまともにレス出来ないなら、お前がレスしなきゃ良くね? だってここ、誰もお前個人を特定、指定してレスを求めているわけじゃないんだが 言うからには自分の発言に責任を持っているんだろうな? ほれ、鏡を見ろよ。醜い酷い面が映っただろ?誰だよそれ? そう、お・ま・え・だよ?分かる?それが現実。自分が見たものはどうこう言うくせに 自分で自分を見られる唯一の手段、何か姿を映し出すものを見た時 己の醜さを目の当たりにするのさ。今のあんたみたく。 あんたの発言、第三者から見れば、きんもぉ〜★だぜ?
- 469 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 16:22:56 ]
- 自身thisのアドレスをprintするメソッドを持つクラスを作成して
以下のようにvectorに追加する前のインスタンス とvector内のインスタンスでprint()を実行したのですが、 addr=0x804b008 addr=0x804b018 と別のアドレスになります。 同じになると思っていたのですが、 これはvectorに登録する時点でインスタンスが コピーされていると考えればいいのでしょうか? またその場合オーバーヘ%8
- 470 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 16:23:26 ]
- #include <iostream>
#include <vector> using namespace std; class MyClass { public: MyClass() {}; ~MyClass() {}; void print() { cout << "addr=" << this <<endl; } }; int main(int ac, char *av[]) { vector<MyClass> vec; MyClass *my = new MyClass(); vec.push_back(*my); my->print(); vec.at(0).print(); delete my; return 0; }
- 471 名前:469 mailto:sage [2009/01/03(土) 16:24:46 ]
- >またその場合オーバーヘ%8
以降の続き またその場合オーバーヘッドが気になるんですが、 皆さんどう対処してらっしゃいますか? お願いします。
- 472 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 16:27:46 ]
- 当然コピーが発生する。
ただ、 vector<MyClass*> vec; vec.push_back(my); みたいにアドレスをコピーする分には インスタンスのコピーは発生しない。 ただ、メモリ管理を自分でしないといけなくなってしまう。 boost::ptr_vector を使うという手もある。
- 473 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 16:29:50 ]
- vectorは、メモリを確保してplacement newという機構とコピーコンストラクタ
で初期化される (記憶があいまいなのでちょっと違うかも) で、言うとおりコピーはされる。ポインタのコピーに比べれば 効率は悪いけど、実際そんな小さなことが問題になることはほとんどない。 よっぽどでかいデータ構造をソートしまくるとかでない限り。
- 474 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 16:31:56 ]
- コピーのコストより、
コピーコンストラクタの実装がマズくて 問題が発生しないかチェックする方が重要だったりするよね。
- 475 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 16:47:54 ]
- いいよいいよー、そうやって自分を否定する者を否定し続けてなさい。
それぞ、井の中の蛙、大海を知らずと言ったものだ。視野が狭いんだよ、 ファビョっている基地外は。もちっとグローバルに、客観的に物事を見な。 自分が思ったことが全て正しい、そんなことを思っているのは、お子ちゃままで。 大人の世界は、いくら自分がそう思っても、現実は、事実とは違っていることなんて いくらでもあると気づく。実行して見て、コードが間違っていないと思っていても もっと効率が良いものが存在するだの、自分で考えたのに、後でおかしいと気づくことなんて いくらでもある。ただ・・・ while(代入式) は不適切だ。
- 476 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 16:50:59 ]
- >>475
「いいよいいよー、そうやって自分を否定する者を否定し続けてなさい。 それぞ、井の中の蛙、大海を知らずと言ったものだ。視野が狭いんだよ、 ファビョっている基地外は。もちっとグローバルに、客観的に物事を見な。 自分が思ったことが全て正しい、そんなことを思っているのは、お子ちゃままで。 大人の世界は、いくら自分がそう思っても、現実は、事実とは違っていることなんて いくらでもあると気づく。実行して見て、コードが間違っていないと思っていても もっと効率が良いものが存在するだの、自分で考えたのに、後でおかしいと気づくことなんて いくらでもある。」 ここまでそっくりそのままお前に返すよwww
- 477 名前:469 mailto:sage [2009/01/03(土) 16:59:01 ]
- >>472,473,474
ありがとうございます。 ポインタを使うのがしっくり来そうです
- 478 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 16:59:49 ]
- Cの規格に沿った構文解析器でも作ってみたら?
while(代入式)が不適切だろうがなんだろうが正しいんだから。
- 479 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 17:08:53 ]
- >>478
コンパイルできて規格合致であることは誰も否定していない。
- 480 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 17:11:38 ]
- >>479
まぁ確かに。 言いたかったのは、そこまで熱くならんでもいいんじゃね?ってこと。
- 481 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 17:13:34 ]
- >>480
478みたいな書き方だとまた話を蒸し返されそうな雰囲気だから勘弁してくれ。
- 482 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 17:13:44 ]
- >>479
いや、否定してる奴が約一名いるぞ >>442 とか>>475 とか
- 483 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 17:15:22 ]
- >>481
失礼した。 書き方に気をつける。
- 484 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 17:16:04 ]
- while文の条件は条件式にするってのは良い心がけだと思うよ。
linuxなんかでは値があるものは何でもってくらい条件にしちゃうので、 経験積んだらそういうソースにも慣れると良い
- 485 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 17:33:25 ]
- 条件式ではなく比較式と言ってくれ。
- 486 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 17:42:19 ]
- >>485
呂布かいでし
- 487 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 17:44:55 ]
- 比較するとは限らんぜ
- 488 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 19:17:03 ]
- 式・・・それは愛・・・・・・
- 489 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 19:59:08 ]
- >>485
そゆこと言ってるから、論理値をリテラルと比較する莫迦が後を絶たない。
- 490 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 20:05:45 ]
- お前、リテラルの意味分かってないだろ
- 491 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 20:58:12 ]
- >>489
if(hoge()!=0)... とか? あるいは、if((x<y)!=0)... ということだろうか?
- 492 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 21:00:05 ]
- (is_hoge() == true) == trueのことだろ。
- 493 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 21:05:04 ]
- >>492
真理値型の無い言語だぞ? 巣に帰れよ。
- 494 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 21:16:20 ]
- リテラルってほらあれだ
前屈みになって腕を横に挙げるやつ
- 495 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 21:18:09 ]
- ボケがわかりにくい上につまんねーよw
- 496 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 21:19:33 ]
- どどんまい?
- 497 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 21:32:53 ]
- >>493
処理できた件数を返す関数hogeの場合、#define TRUE -1に対して、 if(hoge()){・・・} if(hoge()==TRUE){・・・} とか。
- 498 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:01:46 ]
- >>493
お前の頭はC89止まりか。
- 499 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:07:12 ]
- 左辺が右辺より大きいとき
と 左辺が右辺以上の時 って何が違うんでしょうか? >これと>=を使い分けたりすることってあるのでしょうか?
- 500 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:09:23 ]
- >>499
ちゅうがっこう から やりなおせば わかると おもいます。
- 501 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:11:25 ]
- >>500
それいぜんに にぽーんごの もんだいかと おもわれまっしゅる
- 502 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:12:31 ]
- ヾヽ\ヾ\ //// //
\丶\\ //// |・\ _____ /・> /// / ̄ ̄ ̄ ̄\,, ミ\.\ヽ|||liiiii||/ /./彡 //// |・\ /_____/・> /\.\|||iii||l//彡 ノ( ミ \.\ヽ|||liiiii||/ /./ノ( / / (,-、 ,:‐、 ) \ ⌒ヽ \.\|||iii||l// | ⌒ .|/ ─////─ ヽ | |(,-、 ,:‐、 ) 6 l |. ////── | .| \\\ . ////Vヽ ,-′ ////'VVVヽ | l ////ェ∧/_ /ヽ . //// γ l / / //// |/\/ l ^ //// i∧ェェェ∧/ / / //// | |//// l━━(t)━━━━┥
- 503 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:28:36 ]
- >>499
左辺==右辺の時に真になるか偽になるかの違い。 必要に応じて>と>=のふさわしい方を使う。
- 504 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:30:48 ]
- xが12より大きいとき
xが12以上の時 より・・以上・・そこにある違い・・それが問題ってことですよね?
- 505 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:30:52 ]
- 面白い釣りだなあ。
- 506 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:32:36 ]
- >>503
x >= 10 == x > 10 は偽になるってことでしょうか?
- 507 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:34:12 ]
- さんすうのきょうかしょをよんでね
- 508 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:42:07 ]
- >>506
x==10のときだけ偽、それ以外は真。
- 509 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:42:37 ]
- 優先順位は大丈夫か?
- 510 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:44:32 ]
- >>509
優先順位知らないんなら口出すなw
- 511 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:47:21 ]
- 申し訳ございません
- 512 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 22:59:32 ]
- >>508
そ・・そうか!! やっと理解できました!!!! x < 10は10もは含まれないってことですよね!? だから int a; cin>>a; if("x < 10"){ cout<<”真"<<endl; はxが10より小さいってことで つまり10と入力しても偽になるわけだ!!!!!!!!!
- 513 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:16:33 ]
- while ("テュルー")
はどうなりますか?
- 514 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:17:47 ]
- 無限ループ
- 515 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:17:50 ]
- 突っ込みどころ満載w
- 516 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:18:13 ]
- ・・・??
- 517 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:25:24 ]
- while("forever") ってしない?
- 518 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:27:07 ]
- しない
- 519 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:30:13 ]
- >>517
条件式じゃないと暴れだす奴がくるぞw
- 520 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:34:54 ]
- >>517
そのアイデア貰った
- 521 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:43:25 ]
- ちょ、それ古典w
- 522 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:43:49 ]
- 俺も面白いと思った。
while("無限ループ") { /* なんか */ } まあ、しないけど
- 523 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:44:49 ]
- >>519
さすがにお前の粘着ぶりがキモイ
- 524 名前:デフォルトの名無しさん [2009/01/03(土) 23:46:13 ]
- while(j=10-i++) を書いた奴が指摘されて、まだファビョってるのか?
基地外だろ、こいつ。指摘した方が言ってもいないことを思っているとか言い出すし。
- 525 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:49:41 ]
- whileの括弧の中が条件式でなければ駄目とは言っていないし、変数を用いて
0か否かで繰り返し条件を指定することもかのうだが、あの式は紛れもなく 代入式で、jの値を使うにしては、不適切だとコンパイラも指摘しているのだが・・・
- 526 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:51:04 ]
- プw
- 527 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:53:39 ]
- いやぁがんばってるね
- 528 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:55:30 ]
- while(*dst++=*src++);
- 529 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:00:53 ]
- >>525
>while文の括弧の中は、 >本来は条件式が入るんだが、それは代入だろ。例え括弧で代入式を括っても、 >それに対して条件式にあう措置をとるべき。
- 530 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:03:01 ]
- >>524
ファビョってるのは「while文の中は、条件式が適切なのに、代入式で…」うんぬん いってる>>442だろ ながれ読めよ >>525 >>456 で結論出てるのにいつまでやってんの?
- 531 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:04:48 ]
- >>530
>>524=>>442で本人だからしょうがないんだよw
- 532 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:15:46 ]
- 最近よく喧嘩するね
- 533 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:29:14 ]
- テュルー
- 534 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:29:51 ]
- 冬休みだからしかたない
- 535 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:30:16 ]
- 出た、「冬休み」
- 536 名前:デフォルトの名無しさん [2009/01/04(日) 00:37:35 ]
- connect(sock,( struct sockaddr * ) &echoservaddr, sizeof(echoservadr))
この文の * が意味することがまったくわかりません *の後に文字もないのですが、ポインタとしてありえなくないでしょうか?
- 537 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:38:30 ]
- ポインタ型でキャストしてるだけ
- 538 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:51:54 ]
- 人はなぜ>>534のような発言をするのか。
それは「私は子供ではない」と誇示したいからである。 では、「私は大人だ」と主張する人間が「大人」なのだろうか。 答えは否、断じて否である。
- 539 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:56:57 ]
- で?
- 540 名前:536 [2009/01/04(日) 00:57:57 ]
- つまり&echoservaddr構造体のポインタを
sockaddr構造体のポインタとしてあつかうってことでしょうか? まったく何をしているか理解できないのですが
- 541 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 00:58:58 ]
- >>539
- 542 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:00:57 ]
- >>540
その通りの事をやっている。 sockaddr_in 構造体を sockaddr 構造体であるかのように 無理矢理見なして渡している。 sockaddr_in 構造体と sockaddr 構造体はサイズが同じで、 かつ、こうやってキャストしてもいいと問題ないとされている。
- 543 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:02:07 ]
- connect()の第2引数はstruct sockddr *型(struct sockddr型へのポインタ)を取る。
そこで、&echoservaddr(echoservaddrのアドレス)をstruct sockddr *型(struct sockddr型へのポインタ)へキャストしている。
- 544 名前:536 [2009/01/04(日) 01:03:51 ]
- >>542
見なす理由がわからないのです。 sockaddr_inのほうが入ってる情報というか入力する情報は多いし その情報はconnectする際に必要だと思います。 なのに、何故必要な情報がすべてあひってないsockaddr構造体とみなすのかがよくわかりません
- 545 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:07:27 ]
- www.linux.or.jp/JM/html/LDP_man-pages/man2/connect.2.html
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 2番目の引数の型には、const struct sockaddr *が”必要”
- 546 名前:536 [2009/01/04(日) 01:08:58 ]
- 必要な理由がわからないのです。
ていうか、入れてしまっては前述した疑問がわいてしまって
- 547 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:10:08 ]
- 理由は、connect()がそういう仕様だから。
connect()を作った人間がそういう風に作ったから。
- 548 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:11:16 ]
- >必要な理由がわからないのです。
なんというか……
- 549 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:12:22 ]
- >>544
総称的な型として sockaddr を用意して、 connect は sockaddr* を受け取る汎用的な形にしておいて、 より詳細な構造体として sockaddr_in を用意し、 それをキャストして渡す、という風になってんじゃないのかね。 場合によっては sockaddr_in 以外のものも作るつもりだった、 あるいは将来作れるように、そういう風にしてんじゃない? void* でいいような気もするけど、 それだと何でもキャスト無しに渡せちゃうから、 渡していい構造体なのかどうか注意して指定させるように、 キャスト無しでは渡せないようにしているんだと思う。 まあ、全部推測だけどね。
- 550 名前:536 [2009/01/04(日) 01:13:40 ]
- つまりsockaddr_in 構造体の中にある入力したアドレスに接続するわけですよね。
しかしsockaaddr構造体にはアドレスがない。それなのに、sockaddr構造体とみなしてしまっては、 アドレスないから接続できなくないのでは?ということです。
- 551 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:14:33 ]
- っていうか、全部が全部
現状が正しい前提で理由を付けなくてもいいと思うけど。 頭いいひとにありがちだよね。
- 552 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:16:41 ]
- 後の改造のために凝った事やって、
結局改造なんてしなかった、 ってこともよくある話で。 互換性のために、とかもよくある話。
- 553 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:18:58 ]
- >>546
int connect(int sockfd, const void *addr, socklen_t addrlen); なら、キャストする必要はないが、connect の第二引数が struct sockaddr である以上、 キャストする必要がある。 ここではキャストする型が重要なのではなく、socket作成時に指定したプロトコルファイミリーが重要。 プロトコルファミリーごとにconnectに必要な情報量は異なり、 kernelでもプロトコルファミリーごとに呼ばれるconnecが異なる。 kernelではaddrlen分ユーザー空間からメモリをコピーし、 所望の処理を行うので、struct sockaddr が重要なのではない。
- 554 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:20:44 ]
- >>550
ああ、そういうことか。 sockaddr_inはsockaddrをIPv4に特化したもの。 sockaddr_inを使うのはIPv4だけだ。 connect()はIPv4以外でも使われる。 www.linux.or.jp/JM/html/LDP_man-pages/man2/socket.2.html AF_INETの他に AF_APPLETALKとかあるだろ。
- 555 名前:536 [2009/01/04(日) 01:26:58 ]
- >>554
socketでAF_INETを指定しているのですが、 この場合だとIPv4でconnectしてるということでは?
- 556 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:34:20 ]
- >>555
そう。 sockaddr_inを使うのはsockaddrを使うより便利だから。 IPv4を使う場合でもsockaddrにアドレスを設定してもいいよ。でも面倒だよ。 ともかく、connect()が必要とするのはsockaddr_inではなくsockaddrなの。 /usr/include/sys/socket.h にstruct sockaddrとstruct sockaddr_inの定義があるから見比べてみてよ。
- 557 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:36:55 ]
- >>550
sockaddrとしてもsa_familyが読み取れる。 そこがAF_INETならsockaddr_inにキャストしてアドレスを読み取るという風になっている。 ほかのAF_*にも対応するsockaddr_*が存在しうるという仕組み。 >>549 そういうことなんだろうけど、IPv6を収めるには小さすぎたのが惜しかった。
- 558 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:39:57 ]
- どうせサイズ渡してんだし、
sockaddr::sa_family だけでよかった気もする。
- 559 名前:536 [2009/01/04(日) 01:42:07 ]
- struct sockaddr {
u_short sa_family; char sa_data[14]; }; sockaaddr構造体はこのようになっているが、何も入力していない struct sockaddr_in{ short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; inのほうはこのようになっていて、アドレスはポートやファミリーは入力している。 で、このinの方を struct sockaddr { u_short sa_family; char sa_data[14]; }; これとして扱う。しかし、ここにはアドレスが入っていない。 だとしたら、どうやってサーバーに接続する?という疑問がわきます。 けれど、inに入力したファミリーがsockaaddrに引き継がれて、 sockaddrのファミリがわかって、そこからまた、inの構造体を参照?するのでしょうか どうやって参照するかがまた謎ですが
- 560 名前:536 [2009/01/04(日) 01:44:22 ]
- >sockaddrとしてもsa_familyが読み取れる。
>そこがAF_INETならsockaddr_inにキャストしてアドレスを読み取るという風になっている。 これだと、sockaaddrをキャストしてもsockaaddrにはポートやアドレス入力してなければ 読み取れないのでは?
- 561 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:45:14 ]
- 4.2BSDのsockaddrはsa_lenは無くて、sa_familyだけだった。
- 562 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:46:55 ]
- IPv4として使う場合、
アドレスファミリをAF_INETにして sockaddr_inにアドレス詰めて connect()に渡すときはsockaddrにキャストして connect()の内部ではsockaddr_inとしてアドレスを読み出す。
- 563 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:48:29 ]
- >>561
それが合理的だな。 >>560 sockaddr_in を渡すのなら sa_family に AF_INET を入れないといけないし、 sa_family に AF_INET を入れるのなら 渡す物は sockaddr_in でなくてはいけない。 それ以外の使い方して変になっても それはそんな変な使い方をした人が悪い。
- 564 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:48:51 ]
- >>560
入力してなければ読み取れないが、入力するためにsockaddr_inにしてポートやアドレスを入力するんだろ? キャストしてもメモリの内容は変わらない。
- 565 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:50:49 ]
- echoservaddr.sin_family = AF_INET;
echoservaddr.sin_port = xxx; echoservaddr.sin_port = yyy; connect(sock,( struct sockaddr * ) &echoservaddr, sizeof(echoservadr)) ――connectの中 int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) { if (addr->sa_family == AF_INET) { const const struct sockaddr *addr_in = (const const struct sockaddr *)addr; だいたいこんな感じのはず。 ここでaddr_in->sin_portを読めばxxxだし、addr_in->sin_addrからはもちろんyyyが読み取れる。
- 566 名前:536 [2009/01/04(日) 01:58:56 ]
- >connect()に渡すときはsockaddrにキャストして
>connect()の内部ではsockaddr_inとしてアドレスを読み出す。 つまり、connectに渡す情報は、空の struct sockaddr { u_short sa_family; char sa_data[14]; }; これであって、特に決まりで中に何も入力されてなくても意味はない。 で、内部でどこのアドレスに接続するか処理するのが、 struct sockaddr_in{ short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; この入力しておいたinの方。ってことでいいのでしょうか。 inをsockaddrにキャストしても入力しておいた値で共通する変数名とかないですもんね だからキャストしても??
- 567 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 02:00:32 ]
- 空じゃなくてアドレス等を入力したものをsockaddrとみなして渡してる。
(( struct sockaddr * ) &echoservaddr)->sa_data[2]〜[5]とか見れば納得するのかな?
- 568 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 02:04:55 ]
- >>566
connectに渡しているのは構造体のアドレス。内容は渡していない。
- 569 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 02:10:06 ]
- #include <stdio.h>
void print_bytewise(const unsigned char *buf, size_t size) { size_t i; for (i = 0; i < size; i++) { printf("%02X ", buf[i]); } putchar('\n'); } int main(void) { int n = 0x12345678; print_bytewise((const unsigned char*)&n, sizeof n); return 0; } これとやってる事は本質的に同じ。
- 570 名前:536 [2009/01/04(日) 02:13:08 ]
- >>567
struct sockaddr_in { u_short sa_family; char sa_data[14]; [0]short sin_family; [1]unsigned short sin_port [2]struct in_addr sin_addr [3]char sin_zero[8]; }; つまり、イメージ的にはこうなのかな?
- 571 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 02:17:05 ]
- こう。
sa_family ⇔ sin_family (2 バイト) sa_data[0]〜sa_data[1] ⇔ sin_port (2 バイト) sa_data[2]〜sa_data[5] ⇔ sin_addr (4 バイト) sa_data[6]〜sa_data[13] ⇔ sin_zero (8 バイト)
- 572 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 02:23:51 ]
- connect(2)ってだいたいこんな感じで使うだろ。
struct sockaddr_in addr = { .sin_family = AF_INET, .sin_port = htons(80), .sin_addr = { .s_addr = inet_aton("192.168.1.1") } }; connect(skfd, (struct sockaddr *)&addr, sizeof(addr); >>536はなにか勘違いしてる気がしてならない。
- 573 名前:536 [2009/01/04(日) 02:34:31 ]
- >>571
お! もしかして sockaddr_inは、計16バイトでその情報はsockaddrに全て対応する sa_family はsinfamilyに sa_data[14]には残りの14バイトのアドレスが格納されるということになってるのかな だとすると、どちらかの構造体だけ入力しとけばいいってのも納得できるのですが これでいいのでしょうか?
- 574 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 02:46:42 ]
- >>573
いままでの回答全て無駄っぽい。 sockaddrはアドレスファミリーから見れば関係ないんだって。 例えばUNIX ドメインソケットなら sockaddr_un だし、 IPv4なら sockaddr_in がconnectには必要。 ただ、歴史的背景かなにかはしらないが、connect(2)のインターフェースが 「void *」ではなく、「sockaddr *」になってるってだけ。
- 575 名前:536 [2009/01/04(日) 02:56:41 ]
- >>574
つまり>>571ではないと? ますますわけわかんなくなってきた struct sockaddr* をキャストの型として &echoservaddrするってのがよくわからないのかなぁ &echoservaddrには>>572にかいてあるようなin構造体のアドレスが入力ずみではあるけど それをキャストすると、どう扱われるってのがよくわかんないかも いや、本当にみなさんに色々教えてもらっているのに理解がたりなくて申し訳ないです。 キャストとかsockaaddrとかぐぐってるけど、いまいち理解できない・・・
- 576 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 03:01:20 ]
- >>575
>>571 であってる。 まず、>>569 が理解できるか確認してくれ。
- 577 名前:536 [2009/01/04(日) 03:11:36 ]
- >>576
すみません。まったくわかりません。 const unsigned char*)&n char型(nの値が格納されている)アドレスへのポインタ なんかもうわかりません
- 578 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 03:18:13 ]
- ま、深夜だし思う存分続けてくれたまえ
- 579 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 03:27:31 ]
- >>577
典型的な「ポインタを理解していない」状態だね。 まあ、初心者は大抵一度は通る道だ。 ポインタを理解するのは簡単だ。メモリを理解すれば良い。ただそれだけだ。 変数とかの中身はメモリに置かれている。 メモリは1バイト単位に分割されていて、それぞれのバイトに住所が割り振られている。 [0番地][1番地][2番地]・・・ でも、例えば int とかのサイズは1バイトではない。現在は4バイトが主流だね。 こういうのは、メモリ上の連続した領域を占有することになる。 そして、int 型の変数(例えば >>569 の n)に & をつけると、 この連続した4バイトの領域の先頭のバイトの住所が取得できる。 [----------------------- int n ------------------------] [12938100番地][12938101番地][12938102番地][12938103番地] (住所は一例) ↑ 先頭 &n == 12938100番地 でも、別にこの4バイトの領域を int の値と見なさなくてはいけないわけではない。 例えば勝手に char 4要素の配列だと見なしても構わないわけだ。 [-- char [0] --][-- char [1] --][-- char [2] --][-- char [3] --] [12938100番地][12938101番地][12938102番地][12938103番地] んで、この char 4要素の配列の先頭要素の住所もやっぱり12938100番地なわけだ。 こういう解釈の変更を行っているのが、 (const char*)&n みたいなキャストになるわけだ。
- 580 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 03:39:44 ]
- ポインタってのは2つの属性から構成されている。
1つはメモリ上の占有している領域の先頭の住所(アドレス)と、 そしてそのアドレスにある値を「何の型の値だと見なすか」だ。 ある変数のポインタは、変数に & をつけることで得られる。 変数に & を付ける事によって得られるポインタの型は、 元の変数の型に * をつけた形で表現する。 ポインタは基本的にただアドレスなんつー単なる値を保持するだけのもんなので、 ポインタを保持する変数なんかも作る事ができる。 例えばこんな感じだ。 int *p = &n; 変数 p は n のアドレス、例えば12938100番地などといったような値を保持しているわけだ。 んでさらに、p は int* という型なわけだが、 この int って部分は、12938100番地から始まる領域を int 型の値だと見なすよ、って意味を持っている。 これを char 型の値だと見なしたい場合は、char* にキャストしてしまえばいい。 char *c = (char*)p; これで、やっぱり変数 c には p に入れられていた領域と同じ場所を指すアドレスが入れられるわけだけど、 c の型は char* なんで、その領域を char 型の値だと見なすようになるわけだ。 この話の int と char を sockaddr_in と sockaddr に置き換えれば、 connect に関する話も分かるはず。
- 581 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 03:46:11 ]
- ポインタ……それは恋だ!
- 582 名前:デフォルトの名無しさん [2009/01/04(日) 03:48:03 ]
- >>580
ポインタの正確な定義わ?
- 583 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 03:53:40 ]
- ボイン太、それはAVだ!
- 584 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 03:56:43 ]
- 残念ながらボッシュートで〜す
- 585 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 05:24:40 ]
- ってか、ぶっちゃけお前らの一番好きなC89基本型ってなんなの
- 586 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 05:50:24 ]
- int
異論は認めない
- 587 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 05:58:07 ]
- unsigned long int
- 588 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 05:59:37 ]
- size_t 異論 は 色ん なものがあるだろうから認める
- 589 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 06:10:51 ]
- char
ちゃ〜
- 590 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 06:21:28 ]
- size_tって中身はint?
- 591 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 06:33:26 ]
- 符号なしのint型が一般的らしい。time_tとかも。
- 592 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 06:33:54 ]
- grepすりゃすぐ判るかと
- 593 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 06:39:50 ]
- >>592 だから何?
- 594 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 06:44:36 ]
- にしても
>>588と>>589はひどいなww
- 595 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 07:06:34 ]
- 俺は断然
bool
- 596 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 08:34:21 ]
- し、bool……?
- 597 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 09:30:43 ]
- いやいやいや
void*
- 598 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 09:31:48 ]
- √とかはC言語で使えないのでしょうか・・?
特殊相対性理論における時間の遅れ、運動してる物体の速度を入力することによって 運動してる物体の時間の刻みを出すプログラムを作りたのですが、・・C言語で√は使えないのでしょうか・・?
- 599 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 09:34:48 ]
- >>598
確かに特殊相対論は中学生でも理解できるが、お前は別の勉強をした方がいいよ
- 600 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 09:35:15 ]
- #include <math.h>
- 601 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 09:36:56 ]
- あえて俺はLPVOIDと書く
- 602 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 09:43:28 ]
- >>600-601
サンクス
- 603 名前:536 [2009/01/04(日) 10:55:21 ]
- >>580
丁寧にありがとうございます。 しかによくわからない点があります。 >変数に & を付ける事によって得られるポインタの型は、 >元の変数の型に * をつけた形で表現する。 つまりこれで先ほどの例だと int n; という宣言が先に必ずある int *p = &n; その上で、元の変数の型はint n よりint型であることがわかっているので p の型はintにしないといけない。よって、nのアドレスが格納されているpは、 (元の変数の型)intに*をつけて int *pとあらわすということですよね。 しかしよくわからないのですが、p = &n; とint *p = &nの違いがわかりません 前者はpにはnのアドレスの値が入っている。 後者はpにはnのアドレスの値が入っているのではないのでしょうか? 前者だと先にint p; と宣言しておけばp はint型になるのでは?
- 604 名前:536 [2009/01/04(日) 10:57:59 ]
- あと、もう1点ですが
>char *c = (char*)p; int *p = &n; としたのなら、 char*c = (char*)*p もしくはchar*c = (char)*p となるのではないのでしょうか?
- 605 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 11:04:19 ]
- 二段ダブルベット
- 606 名前:536 [2009/01/04(日) 11:10:16 ]
- すみません、もうひとつ
先ほどの例の場合 int型をchar型にする利点というか意味がわからないのですが サイズが異なる構造体をキャストしたら中身が全然違うのに型を変えるとか想像がつきません
- 607 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 11:13:34 ]
- >>603
>>580ではないけど、 その日本語だと君がどこまで理解できたのかが分からない 材料は揃ってるようだから、手を動かしたほうがいいよ。 問題の値をそれぞれprintf()してどうなったか、 試すくらいはしてから再度の質問はするものだ
- 608 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 11:18:19 ]
- 型宣言の *と
演算子の*を混同している・・・・?
- 609 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 11:20:10 ]
- C言語でおk
- 610 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 11:28:42 ]
- >p の型はintにしないといけない。よって、nのアドレスが格納されているpは、
p の型は int へのポインタ型。 >しかしよくわからないのですが、p = &n; とint *p = &nの違いがわかりません >前者だと先にint p; と宣言しておけばp はint型になるのでは? int *p; と宣言してあれば両者はほぼ同じ。 int* っていうのは「int へのポインタ」っていう「型」だってのは OK? ポインタと元の型はきちんと区別するべき。 >int *p = &n; としたのなら、 >char*c = (char*)*p もしくはchar*c = (char)*p となるのではないのでしょうか? c は char へのポインタ型。p は int へのポインタ型。*p は int 型。 (char*)*p だと int 型を char へのポインタという型に変換している(c と型は一致するが普通意味を持たない)。 (char)*p だと int 型を char 型へ変換している(c と型が違うのでコンパイルできない)。 >int型をchar型にする利点というか意味がわからないのですが >サイズが異なる構造体をキャストしたら中身が全然違うのに型を変えるとか想像がつきません int へのポインタ型を char へのポインタ型にしても大抵メリットはない。 sockaddr 型と sockaddr_in 型は >571 の通り sa_family の部分は共通しているので >557 の通り sockaddr へのポインタ型を経由して sa_family を読み出し、AF_INET だったら実は sockaddr_in を指していたんだとして キャストしてきちんと読み出すことができる。 つまり関数の引数の型としては sockaddr へのポインタ型としてまとめておいて、実際には sa_family に応じて 正しい型にキャストして使うことができる。
- 611 名前:536 [2009/01/04(日) 11:33:40 ]
- int へのポインタ型。ってのがよくわからないのですが
一つのプログラムでintを宣言する変数なんてたくさんでてくるとおもうのですが、 この場合、intへのポイントとはどうなるのでしょうか?
- 612 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 11:43:30 ]
- >536
キャストもポインタもないこのコードは理解できる? sockaddr, sockaddr_in, connect() についても本質的にはこのコードみたいなことをしている(type が sa_family)。 #include <stdio.h> struct Any { enum { CHAR, INT, DOUBLE } type; union { char c; int n; double d; } u; }; void print(struct Any a) { if(a.type == CHAR) printf("%c\n", a.u.c); if(a.type == INT) printf("%d\n", a.u.n); if(a.type == DOUBLE) printf("%f\n", a.u.d); } int main(void) { struct A a; a.type = CHAR; a.u.c = '>'; print(a); a.type = INT; a.u.n = 536; print(a); return 0; } もっとも共用体が分かるなら最初っから理解できているような気もするけど。 分からなかったら余計混乱する気がするんで無視してくれ。
- 613 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 11:49:45 ]
- >611
>一つのプログラムでintを宣言する変数なんてたくさんでてくるとおもうのですが、 >この場合、intへのポイントとはどうなるのでしょうか? そうだね。だから色んな場所を指せるし、指し直したりできる。 char c1; char c2; int n; char *p; /* どこも指してない */ p = &c1; /* c1 のアドレスを指す */ p = &c2; /* c2 のアドレスを指す */ p = (char*)&n; /* n は char型じゃないけどキャストして無理矢理 n の(先頭)アドレスを指す */
- 614 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:15:32 ]
- 麻雀は分かるか? 二盃口は七対子と見た目は同じだよね。
|二|二|三|三|四|四|七|七|八|八|九|九|發|發| |萬|萬|萬|萬|萬|萬|索|索|索|索|索|索| | | これを一盃口を1かたまりで解釈すると二盃口と解釈できるし、 |二|二|三|三|四|四| |七|七|八|八|九|九| |發|發| |萬|萬|萬|萬|萬|萬| |索|索|索|索|索|索| | | | 全部対子で解釈すると七対子と解釈できる。 |二|二| |三|三| |四|四| |七|七| |八|八| |九|九| |發|發| |萬|萬| |萬|萬| |萬|萬| |索|索| |索|索| |索|索| | | | そして、別に役とか関係無しに単に牌が 14 個並んでいるだけだと解釈することもできる。 |二| |二| |三| |三| |四| |四| |七| |七| |八| |八| |九| |九| |發| |發| |萬| |萬| |萬| |萬| |萬| |萬| |索| |索| |索| |索| |索| |索| | | | |
- 615 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:16:14 ]
- ここで、1つの牌を1バイトと考え、
対子を2バイトの toitsu_t 型で、 一盃口を6バイトの ipeko_t 型で表せるとする。 役とは関係無しにただ牌が 14 個並んでいると解釈している時は手牌を char tehai[14]; というただの char 配列で眺めているのに相当する。 二盃口と解釈している時は手牌を struct ryanpeko_t { ipeko_t ipeko[2]; toitsu_t toitsu; }; という構造体だと見なして解釈しているのに相当する。 七対子と解釈している時は手牌を struct chitoitsu_t { toitsu_t toitsu[7]; }; という構造体だと見なして解釈しているのに相当する。
- 616 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:16:36 ]
- #include <iostream>
using namespace std; #include <math.h> void atai(); int main() { cout<<"こんにちわ。"<< endl; atai(); return 0; } void atai() { double v;/*v=物体の速さ*/ double undou;/*運動する物体の時間の刻み*/ double c = 108000000;/*光の速さ*/ cout<<"物体の速さ入力:(km)"; cin>>v; double ruto; ruto = sqrt(1 / (1.0000000 - (v/c) * (v/c))); undou = ruto; cout<<"物体の時間の刻み"<<undou<<endl; cout<<"静止している物体が1年間すごしている間"<<endl; cout<<"運動している物体は"<<1 / ruto<<"年間過ごしてる"<<endl; } 光の速さより大きい数字を入力すると-1.#INDと、表示されます・・
- 617 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:17:38 ]
- 役が成り立っているか脳内で判定してると思うが、
まあそういう役が成り立っているかを判定する関数があるとする。 int check_toitsu(const toitsu_t *toitsu); /* ちゃんと対子として成り立っていれば 1 を、そうでなければ 0 を返す */ int check_ipeko(const ipeko_t *ipeko); /* ちゃんと一盃口として成り立っていれば 1 を、そうでなければ 0 を返す */ これを使って ryanpeko_t 型の値が本当に二盃口として成り立っているのかをチェックする関数を作ると、こうなって、 int check_ryanpeko(const ryanpeko_t *ryanpeko) { return check_ipeko(&ryanpeko->ipeko[0]) && check_ipeko(&ryanpeko->ipeko[1]) && check_toitsu(&ryanpeko->toitsu); } chitoitsu_t 型の値が本当に七対子として成り立っているのかをチェックする関数を作ると、こうなる。 int check_chitoitsu(const chitoitsu_t *chitoitsu) { int i; for (i = 0; i < 7; i++) if (!check_toitsu(chitoitsu->toitsu[i])) return 0; return 1; } んで、手牌 tehai をこのチェック関数に渡すには、こんな感じになるわけだ。 if (check_ryanpeko((const ryanpeko_t*)&tehai)) puts("二盃口として解釈可能です"); if (check_chitoitsu((const chitoitsu_t*)&tehai)) puts("七対子として解釈可能です");
- 618 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:18:15 ]
- >>616
負の値の平方根はできない
- 619 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:18:41 ]
- とりあえず、「速さ」の単位は「km」じゃないよ。
ローレンツ変換の前に学ぶことがあると思うんだ。。
- 620 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:19:08 ]
- 割り込まれてしまったが、
>>614>>615>>617 の順で読んでくれ。
- 621 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:20:49 ]
- すげーな、この流れは
ポインタFAQ用のテンプレとして、是非利用すべきだ まったく読んでないけど
- 622 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:20:59 ]
- >>616
#include <complex.h>
- 623 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:25:46 ]
- >>619
cが時速なんで許容範囲のようだ
- 624 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:28:52 ]
- 年速じゃないの?
- 625 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:31:13 ]
- >>619
ごめんなさい・・・
- 626 名前:536 [2009/01/04(日) 12:32:34 ]
- >>610
sockaddrのほうはsa_family inのほうはsin_family 共通してないきがするのですが、 キャストしても別に扱われるのでは?
- 627 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:36:00 ]
- fopen_sとfclose関数を用いてファイルの読み書きするプログラムを作成しているのですが、
ファイルを新規に作成し書き込む場合に、 すでに同名のファイルが存在する場合や、ディレクトリーに書き込めない場合に エラーを返すようにするにはどうすればよいでしょうか?
- 628 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:39:18 ]
- >>624
c = 108000000なんで時速kmになってる
- 629 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:40:10 ]
- char mem[sizeof(sockaddr)];
struct sockaddr *sad = (struct sockaddr *)mem; struct sockaddr_in *sadi = (struct sockaddr_in *)mem; とすると、 sad->sa_familyは、memの0バイト目からsizeof(u_short)バイト sadi->sin_familyは、memの0バイト目からsizeof(short)バイト の領域をその値とする。 呼び方が違うだけで、同じデータ。
- 630 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:48:45 ]
- そもそも長さと速さの単位の違いを分かっているのだろうか。
- 631 名前:536 [2009/01/04(日) 12:50:08 ]
- てことは、つまりsockaadr_inにあった各変数がキャストした型にあてはめられる?
struct sockaddrn{ u_short sa_family = sin_family; char sa_data[2]; = short sin_port; char sa_data[4]; = in_addr sin_addr; char sa_data[4]; = sin_zero[8]; }; こういうことになるということでしょうか? あと、sizeof(sockaddr)をするとなんでsockaddr_inのサイズもわかるのかわかりません。 これは、sockaddrとsockaddr_inの構造体のサイズが同じだから 別にsizeof(sockaddr_in)でもいいということかな
- 632 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:51:54 ]
- こんな教えて君に付き合うなんて
おまえよっぽど暇なんだな Cの入門書でも読んどけって、話はそれからだ で済むと思うんだが
- 633 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:51:56 ]
- にゃ〜ん
- 634 名前:536 [2009/01/04(日) 12:52:18 ]
- >>617
麻雀はわからないのですが、*ryanpeko はどこをさしているのでしょうか?
- 635 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:52:54 ]
- >>627
fopen_s()の戻り値で判断すればいいんじゃないの? msdn.microsoft.com/ja-jp/library/z5hh6ee9(VS.80).aspx msdn.microsoft.com/ja-jp/library/t3ayayh1(VS.80).aspx
- 636 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:53:22 ]
- 修正
#include <iostream> using namespace std; #include <math.h> void atai(); int main() { cout<<"こんにちわ。"<< endl; atai(); return 0; } void atai() { double v;/*v=物体の速さ*/ double undou;/*運動する物体の時間の刻み*/ double c = 1080000000;/*光の速さ*/ cout<<"物体の速さ入力:(km/h)"; cin>>v; if(1 <= v && v <= 1080000000 ){ double ruto; ruto = sqrt(1 / (1.0000000 - (v/c) * (v/c))); undou = ruto; cout<<"物体の時間の刻み"<<undou<<endl; cout<<"静止している物体が1年間すごしている間"<<endl; cout<<"運動している物体は"<<1 / ruto<<"年間過ごしてる"<<endl; } else{ cout<<"光の速さを超えることはできません"<<endl;} }
- 637 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:54:01 ]
- >>631
connect()のソース読めよ 話はそれからだ
- 638 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:54:32 ]
- >>627
100% 完全な方法はないと思う。 1. "r" で開いて、開けたら fclose してエラーを返す。 2. "w+" で開いて、開けなかったらエラーを返す。 3. ファイルサイズが 0 でなければ fclose してエラーを返す。 4. "w" で freopen_s する。 がまだましな方法だとは思うが、 1 と 2 の僅かな間にサイズ 0 のファイルを作られたらチェックから漏れる。
- 639 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:56:13 ]
- >>631
まあそんなところだ。 sizeof に関しては、sizeof (sockaddr) は危険。 sockaddr_in を渡しているのだから、sizeof (sockaddr_in) にすべき。
- 640 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 13:00:30 ]
- >>636
vが光速より大きいと、v/cが1より大きくなる。そうすると(v/c) * (v/c)が1より大きくなる。 そうすると1.0000000 - (v/c) * (v/c)が負になる。そうすると1 / (1.0000000 - (v/c) * (v/c))が負になる。 そうするとsqrt()の引数が負になって定義域エラーになる。
- 641 名前:536 [2009/01/04(日) 13:02:42 ]
- なるほど。>>631みたいな感じなのですか。
これだとなんとか理解できます。こんなめんどくさいことするのはconnectの決まりだからというわけですね。
- 642 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 13:05:20 ]
- >>641
IP以外のプロトコルのアドレスも扱えるようにしてるんじゃないかな
- 643 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 13:12:24 ]
- >>641,642
おや、話が半日前に戻ったぞw 進歩がないスレだな
- 644 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 13:13:54 ]
- >>643
while(代入式)の人ですね?分かります
- 645 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 13:19:47 ]
- while君と教えて君が出現するとスレが無駄に進む
- 646 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 13:21:50 ]
- >>645
無駄だと思うならこのスレに来るなよ馬鹿
- 647 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 13:24:40 ]
- いや進めよう、いざ進め
さあ、次の質問カマーーン!?
- 648 名前:536 [2009/01/04(日) 13:27:41 ]
- char c1;
char c2; int n; char *p; /* どこも指してない */ p = (char*)&n; /* n は char型じゃないけどキャストして無理矢理 n の(先頭)アドレスを指す */ よく考えたらpはchar *pと宣言しているからpはchar型じゃないか だったら キャストなんてしなくてもいいんじゃないの? char *p p = &n; で
- 649 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 13:30:00 ]
- while君もcast解らん君も
自ら試すということをしないところに共通点が。 >>644 オレはレベルの低い質問については回答側だよ。 どっちも実験しようとすれば5分で結果出るじゃん。 初心者歓迎のスレは別にあるのにこのスレの存在意義が わかんね。
- 650 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 13:34:24 ]
- >>648
ここでそんなことしても意味ないから。 コンパイラへの明確な指示と人間の可読性を考えて ソースは書くんだよ。 > char *p > p = &n; それコンパイル通してみた? gccなら-Wallつけて、コンパイラがどう言うかちゃんと 向き合いながら勉強しなよ。
- 651 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 13:34:34 ]
- >>648
&nはint*型だから。 それを代入する先の変数pはそれとは異なるchar*型。 そのため、キャストして&nをchar*型にしてやらないといけない。
- 652 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 13:37:31 ]
- 教えたがりが殺到してわけわからなくなってるな。
- 653 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 13:44:33 ]
- つーか、最近の2chは微温くなったもんだな。
俺の若いころは、ちょっとバカな質問すると 逝ってよし! 半年ROMれ とか言われたもんだが
- 654 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 13:47:03 ]
- ここは、二番目にバカな質問を受け付けるハコだからな。
一番は、宿題スレ
- 655 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 13:54:22 ]
- >>654 thx
本当だ 初心者歓迎C/C++室の方がレベルが高いw
- 656 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 14:00:01 ]
- 宿題スレにだけは足を踏み入れる気がしない。
- 657 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 14:03:05 ]
- 宿題スレだってピンからキリまでだよ。
アホも多いけどレベル高い人もちゃんといる。
- 658 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 14:46:51 ]
- >>649
> 自ら試す コンパイラが通せば正しいとは限らないんだが・・・ それを指摘されてファビョったキチガイですね?分かります。
- 659 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 14:47:27 ]
- もう秋田
- 660 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 14:50:27 ]
- >>648
キャストしないとワーニングが出るよ
- 661 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 14:54:07 ]
- >>658
正しい場合でもそれと分からないやつにはな・・・
- 662 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 14:56:08 ]
- 配列のサイズを指定せず、配列に数値を格納して行く度に
配列のサイズを増やしていく方法がわかりません 言語はC++です このような事は可能なのでしょうか、また出来るなら どのようにすればいいのかご教示願います
- 663 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 14:59:10 ]
- >>662
std::vector か std::deque 使え。
- 664 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 14:59:24 ]
- STLのvectorでresize()を使うのはいかがでしょうか?
- 665 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:00:06 ]
- push_back や insert でいいだろ
- 666 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:04:32 ]
- www.amazon.co.jp/iStudy-BB-Skills-C%E8%A8%80%E8%AA%9E%E3%83%97%E3%
83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%9F%BA%E7%A4%8 E-%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88P/dp/B00008V CD1/ref=sr_1_3?ie=UTF8&s=software&qid=1231048974&sr=8-3 こいつで解決 これにて糸冬 了..._φ(゚∀゚ )
- 667 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:06:57 ]
- >>666
URL長すぎ 書籍名を書け
- 668 名前:662 mailto:sage [2009/01/04(日) 15:07:08 ]
- 皆さんありがとうございました
これで詰んでた課題が進めそうです
- 669 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:07:59 ]
- iStudy BB for IT Skills C言語プログラミング基礎 パーフェクトP
- 670 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:10:26 ]
- >>666
amazon の URL を縮める方法も知らない奴は勘弁して欲しい。 www.amazon.co.jp/dp/B00008VCD1/
- 671 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:12:20 ]
- >>670
今回だけは勘弁してやるから、URLの縮め方をここに書け
- 672 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:13:53 ]
- >>671
>>666 と >>670 を見比べりゃ分かるだろ・・・。
- 673 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:15:26 ]
- >>672
お前が分かるなら、お前がやり方を書け
- 674 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:17:24 ]
- >>673
そうやって法則性を見つける努力を怠るからダメなんだよ。
- 675 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:18:18 ]
- >>674
そんな無意味な煽りを書く暇があったら、さっさとやり方を書け
- 676 名前:URLの気持ち mailto:sage [2009/01/04(日) 15:18:27 ]
- 俺なんのために付属されたんだろう・・・orz
- 677 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:19:27 ]
- >>675
そんな無意味な煽りを書く暇があったら、さっさとやり方を考えろ
- 678 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:20:23 ]
- 暇な奴って怖いなまで読んだ
- 679 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:20:31 ]
- >>677
やり方は考えるものではなく、存在するものだ 解っているなら、さっさと書け
- 680 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:21:35 ]
- >>679
やり方は存在するものではなく、考えるものだ 解らないなら、さっさと考えろ
- 681 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:21:50 ]
- よーしパパがんばって教えちゃうぞー
って仕事の電話が すまん今はダメのようだ
- 682 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:22:41 ]
- よーしパパがんばってID出しちゃうぞー☆
- 683 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:23:27 ]
- 質問に答えない、無意味な質問スレッド
死ね
- 684 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:27:13 ]
- 教えて欲しいなら下手に出ろよw
- 685 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:29:06 ]
- 下手に出ても教えないけどな。
見りゃすぐ解る事を教える事ほど害悪なことは無い。
- 686 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:33:12 ]
- ワカラン → 教えろカス → 嫌 → 氏ね
小学生ですね わかります
- 687 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:34:01 ]
- >>683
おめーに答える義務はねー
- 688 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:40:37 ]
- 3分LifeHacking:Amazonの長いURLを短縮表示する - ITmedia Biz.ID
www.itmedia.co.jp/bizid/articles/0805/13/news065.html
- 689 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:42:37 ]
- >>684
死ね >>685 死ね >>686 死ね >>687 死ね >>688 ありがとう
- 690 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 15:43:20 ]
- >>688
死ね
- 691 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 16:05:14 ]
- www.amazon.co.jp/iStudy-BB-Skills-C%E8%A8%80%E8%AA%9E%E3%83%97%E3%
83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%9F%BA%E7%A4%8 E-%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88P/dp/B00008V CD1/ref=sr_1_3?ie=UTF8&s=software&qid=1231048974&sr=8-3 www.amazon.co.jp/dp/B00008VCD1/ え?これの区別も一人で解決できないの? 辞めたほうがいいよ 君 てか こないで
- 692 名前:デフォルトの名無しさん [2009/01/04(日) 16:05:54 ]
- void error(char * errormessage)
{ perror(errormessage); exit(1); } error("エラーです") これを実行するとエラーです と表示されますよね でも、 void mputs(char *p) { while(*p); printf("&c", *p); p++; } printf("\n"); } mputs("エラーです”); 前者と後者では表示される文字は同じですよね。 後者だと変数pが指定する領域を1バイトのchar型として、読み取るので1文字ずつループしていってますよね でも前者だとそのようなループがないのに、1バイトのchar型として一度に全部の文字を表示しているって おかしくないでしょうか?
- 693 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 16:10:46 ]
- >>689
wktk.vip2ch.com/vipper0531.jpg
- 694 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 16:12:04 ]
- >>692
先ず、Cでは文字列をどう表わすか知ってる?
- 695 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 16:12:55 ]
- >>692
void perror( const char *string ); 文字列の先頭のアドレスを指定します 何の問題もありません
- 696 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 16:14:58 ]
- >>692
char *aiueo = "あいうえお"; myprint(aiueo); void myprint(char *str) { printf("%s\n", str); } 何かおかしい?
- 697 名前:デフォルトの名無しさん [2009/01/04(日) 16:19:26 ]
- >>696
ポインタ使う必要があるのでしょうか?
- 698 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 16:21:02 ]
- >>697
それでは、逆にポインタを使わなければどうなるのでしょうか?
- 699 名前:デフォルトの名無しさん [2009/01/04(日) 16:21:48 ]
- >>698
ポインタ使う場合は、下記の文になる 使わないとできない void mputs(char *p) { while(*p); printf("&c", *p); p++; } printf("\n"); } mputs("エラーです”);
- 700 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 16:31:26 ]
- string aiueo("あいうえお");
myprint(aiueo); void myprint(string str) { cout << str << endl; }
- 701 名前:デフォルトの名無しさん [2009/01/04(日) 16:38:39 ]
- char *aiueo = "あいうえお";
myprint(aiueo); void myprint(char *str) { printf("%s\n", str); } 変数aieuoに文字列 あいうえお を代入 char[0]にあ char[1]にい char[2]にう を入れる。 つまり、aiueoが指すアドレス領域はすべてchar型だと で、aiueoを指定するとchar[0]のアドレスが得られる。 そのアドレスを引数にして関数に渡す。渡された関数でも同じことをし str配列の中身を全て表示する ということでしょうか
- 702 名前:デフォルトの名無しさん [2009/01/04(日) 16:40:35 ]
- だとしたら、こんな文でするよりそっちでしたほうがいいってことですよね
こんな文は使い道ないということかな void mputs(char *p) { while(*p); printf("&c", *p); p++; } printf("\n"); } mputs("エラーです”);
- 703 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 16:43:37 ]
- >>701
システムがメモリーを確保して、そこに"あいうえお"と言う文字列定数を配置。 その先頭アドレスをchar型へのポインタ変数aiueoに代入。 aiueoが示すのは"あいうえお"の先頭だけ。 ただし、コンパイラはaiueoを使うときには、char単位に操作することを知っている。(char *と宣言したから)
- 704 名前:デフォルトの名無しさん [2009/01/04(日) 16:48:13 ]
- なんでaiueoには先頭アドレスしかはいってないのに
void myprint(char *str) { printf("%s\n", str); } これで、全部表示されるかがわかりません。 引数としてmyprintに渡すのは先頭アドレス。 その先頭アドレスをchar *str でどう処理しているのでしょうか?
- 705 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 16:51:28 ]
- >>704
Cの文字列について勉強するといいかも。 それから、↓の6.2を読んでみるとわかるかも。 www.kouno.jp/home/c_faq/c6.html
- 706 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 16:59:27 ]
- こういうので、ネットでいちいち質問してたら効率悪すぎるよ。
適当な入門書でも読んでみたら?
- 707 名前:デフォルトの名無しさん [2009/01/04(日) 17:00:04 ]
- ダメだ全然わからない
なんでポインタの文字を一気に表示できるんだ
- 708 名前:デフォルトの名無しさん [2009/01/04(日) 17:00:21 ]
- >>706
独習Cよんでるがわからない
- 709 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 17:01:10 ]
- 文字列と配列 - 文字列 - C言語 入門
www.cppdrive.jp/cstart/string/index1.html
- 710 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 17:01:20 ]
- そういうもんだって深く考えずに受け入れることも大事。
- 711 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 17:02:14 ]
- >>707
ポインタの指してるとことから連続で並んでるからだろ。
- 712 名前:デフォルトの名無しさん [2009/01/04(日) 17:04:41 ]
- なんで、*strじゃなくてstr
- 713 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 17:06:18 ]
- >>704の疑問がすべて>>702に書かれているというのに…
- 714 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 17:12:21 ]
- 過去を振り返っては駄目です
- 715 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 17:13:26 ]
- >>658
俺はwhile君じゃないよ。回答側と言っている お前はここ来るまえに日本語からやりなおせ
- 716 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 17:14:36 ]
- 宿題スレと統合したら?
結局、皆さんのおかげで課題が進みそうってw
- 717 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 17:17:08 ]
- 宿題スレは課題丸投げ用
- 718 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 17:19:07 ]
- 宿題テンプレも埋めるのが面倒臭いから、こっちに投げてんだろ。
テンプレ強制になっても、他に飛び火するだけ。
- 719 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 17:23:15 ]
- 文字列を作成すると自動的に末尾に\0が付加される
char *str = "あいうえお" とすると 正確には あいうえお\0となっている ので先頭の str[0] のアドレスさえ分かっていれば \0がくるか0がくるまで その内容は何かしらの意味を持った文字列だと認識する 自分でもやってるだろ? デバッカで char *str = "あいうえお"; の内容を見てみれば分かる
- 720 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 17:43:06 ]
- >>719
わかりました。 \0が出てくるまでが文字列ということですね。
- 721 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 17:49:04 ]
- >>640
非常に解りやすい!!! サンクスです
- 722 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 18:20:00 ]
- ウィンドウに貼り付けたプッシュボタンのWM_NCHITTESTメッセージをキャッチするには
サブクラス化するしかないのでしょうか?
- 723 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 18:49:02 ]
- そうだね。
- 724 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 19:02:04 ]
- 今リスト構造やってるんですが、ポインタが非常に分かりづらい;
どなたかおすすめのポインタ解説サイト知ってましたら 教えていただけないでしょうか
- 725 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 19:33:56 ]
- 小数点のより右の数字だけを取る方法はないでしょうか?
x * y =200.1となったら0.1にしてしまうような
- 726 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 19:37:41 ]
- z = x * y;
z = z - (int)z;
- 727 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 19:38:38 ]
- >>726
ハイパーサンクス!!
- 728 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 19:38:45 ]
- trunc
- 729 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 19:42:53 ]
- >726 の方法だとzがintの範囲をオーバーフローしてるときにおかしくなるね
- 730 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 19:56:28 ]
- それと負の数も考えて、floorつかえばいいさ
- 731 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 19:57:05 ]
- floorじゃだめか負の数
- 732 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 19:58:39 ]
- modf使えよカス
- 733 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 20:02:34 ]
- 倍精度でも仮数部が52bitだから
64bit整数型使えば精度的に大丈夫のはず
- 734 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 20:23:28 ]
- だから0方向切り捨てなんだからtrunc一発で終わりなんだって
- 735 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 21:47:38 ]
- クラスは分かったけど配列クラスで詰んだ…
他にも同じような人いそうだな… またこれが使えるようになった人ってのはやっぱり テキスト熟読してやっとの事で理解出来たんだろうか
- 736 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 21:50:54 ]
- >735
「配列クラス」というのは何のことだ vector等のことか、それともオブジェクトの配列なのか
- 737 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 22:26:27 ]
- grwinで三角形を任意の角度回転させて表示するってのを作ってるんですが
三角形の中心を求めて原点に置き、回転させる方法が分かりません・・ どなたかご教授おねがいしまう
- 738 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 22:53:34 ]
- >>737
教授なんかできるか。 1. ググれない事情がある。 2. それらしい解説ページは見つけたが、言葉の意味が解らない。 3. 意味は解るが、コードに落とせない。 どれだ?
- 739 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 23:06:20 ]
- >>738
そんな書き込み要らないから
- 740 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 23:07:59 ]
- >>737
三角形の中心って外心? 重心なら簡単なんだけど。
- 741 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 23:09:05 ]
- 高校の数学の教科書でも見直せばいいんじゃね?
- 742 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 23:26:06 ]
- 普通に考えて慣性モーメントが最低の軸、つまり重心を通る軸じゃね?
- 743 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 23:35:11 ]
- なるほど。
でも軸なの? 重心を中心にして点対称に回転させるんじゃないの? ともかく「三角形の中心」を決めないと。 内心?外心?垂心?重心?傍心?
- 744 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 23:41:57 ]
- 中心が決まったら、あとは「アフィン変換」「回転行列」「クォータニオン」辺りで。
- 745 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 00:38:14 ]
- >>737
>三角形の中心 中心は5つほどありますが、どれになさいますか
- 746 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 00:44:06 ]
- 傍心は中心じゃないだろw
- 747 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 00:48:56 ]
- >>746
三角形の中心(さんかくけいのちゅうしん)とは、任意の三角形から一意的に求めることができる点の総称である。単に心または芯とも呼ばれる。 「五心」と呼ばれる点(内心・外心・重心・垂心・傍心)が一般的に広く知られている。
- 748 名前:デフォルトの名無しさん [2009/01/05(月) 00:59:00 ]
- 下の例のような文字列や小数などが入り混じったchar型の変数の配列があります。
これから小数だけを取り出してファイル出力したいのですが、何かいい方法はあるでしょうか? char name[0]=frame char name[1]=0.123 ←取り出したい char name[2]=23 char name[3]=1.234 ←取り出したい
- 749 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 00:59:39 ]
- まるちうぜえ
- 750 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 01:06:24 ]
- >文字列や小数などが入り混じったchar型の変数の配列
- 751 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 01:19:51 ]
- 取り出す前に、どうやって入れたのか知りたい
- 752 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 01:27:54 ]
- そうだな
小数入れる前に構造体にしてフラグ立てとけよカス
- 753 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 01:45:18 ]
- for(int i = 0; i < 4; i++){
if(name[i].isFloat()) name[i].toFile(); }
- 754 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 02:49:45 ]
- 規格書高ぇ・・・
- 755 名前:デフォルトの名無しさん [2009/01/05(月) 06:54:50 ]
- Unicode対応プログラムの作成練習してるけどしょっぱなからつまずいた…
#include<stdio.h> #include<tchar.h> #define _UNICODE #define UNICODE int main(void){ TCHAR uni[]=_T("UnicodeTest"); printf("%s\n",uni); return 0; } 上記のコードを実行するとUしか出力されません。原因はUの2バイト目が00なので ヌル文字と勘違いしてしまうからだと予想しますがforで回すしか回避方法はないのでしょうか?
- 756 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 07:10:05 ]
- つ wprintf
- 757 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 07:20:54 ]
- TCHAR 使うんなら _tprintf だろ・・・。
それに、_UNICODE を定義するのなら tchar.h をインクルードする前っつーか、 プロジェクトファイルの設定をいじれ。 _MBCS が定義されてるかもしんないし、混乱の原因になる。
- 758 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 07:24:04 ]
- (^ー゚)テヘッ
- 759 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 08:29:01 ]
- か わ い い
- 760 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 11:46:49 ]
- >>754
X3010なら俺の上でアンアン言ってるぜ
- 761 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 13:15:32 ]
- それ規格書じゃなくて魔導書じゃね?
- 762 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 20:33:37 ]
- インデックスか
- 763 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 20:34:35 ]
- vs2003を使っている者です。
ヘッダで構造体を struct fff{ double a; double b; double c; double d; double e; double f; double g; double h; double i; double j; }; struct fff ggg[2]={ {0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0} }; こういった形で宣言・初期化しているのですが、 double型のメンバの数を11個以上に増やすと、この構造体と全く関係のない処理でおかしな動きをしてしまうのです。 例えば、プログラム内で全く使われない、double型のメンバ数11以上の構造体を作ったとしても、どこかの演算に影響を及ぼしてしまうようです。 これは一つの構造体の大きさに上限があるということなのでしょうか? また、これを解決し、多くのメンバを持つ構造体を宣言する方法などがあれば教えてください。
- 764 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 20:45:14 ]
- >>762
イ、禁書目録?
- 765 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 20:53:17 ]
- >>763
>ヘッダで構造体を宣言・初期化している 「そのヘッダをいろんなファイルで読み込んでいる」に500ガバス
- 766 名前:デフォルトの名無しさん [2009/01/05(月) 21:02:01 ]
- >>756
>>757 サンクス
- 767 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 21:03:27 ]
- レイテンシ
- 768 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 21:06:07 ]
- >>763
メンバ数の上限がそんなに低いところにあるとは考えられない。何か勘違いをしていると思われ。 問題の再現する最小限のソースを貼りたまえ。
- 769 名前:デフォルトの名無しさん [2009/01/05(月) 21:08:49 ]
- 0x0040とは一体どういう意味なのでしょうか?
0xがつくから16進数かと思ってたけど違いますよね? あとif文で、 変数 & 0x0040 == 0 とかいった文がありますが これはどういう意味なのでしょうか? この場合、変数には絶対0x0040のような値がはいるということでしょうか また==0 で何を判定しているのでしょうか? よろしくお願いいたします。
- 770 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 21:11:11 ]
- テキストファイルを読み込み、行数を数えるプログラムを作れ(C言語)
との課題が出ました。 テキストファイルを読み込み配列(構造体で定義)に格納するところまでできたのですが 行数をカウントするプログラムがうまくいきません。 現在 char *strText(構造体で定義) for (Count = 0; Count < TextVol(構造体で定義); i++) { if (strText[Count] == 0x0D) EnterCount++; } という感じです。 これだと 「abc□ d□ ef□ g」 (□==改行) という行は3行とカウントされてしまいます。(希望は4行) ちなみにテキストファイルを読み込む関数と、カウントする関数は別で作れといわれています。 どうすれば最後
- 771 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 21:11:54 ]
- > 0xがつくから16進数かと思ってたけど違いますよね?
まず、どうしてそう思うのか説明してくれ
- 772 名前:770 mailto:sage [2009/01/05(月) 21:12:06 ]
- とぎれてしまいました
どうすれば最後の行が空でない場合カウントさせることができるでしょう?
- 773 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 21:13:30 ]
- >>772
+1すればいいじゃん。
- 774 名前:770 mailto:sage [2009/01/05(月) 21:22:28 ]
- >>773
その場合、 「abc□ d□ ef□ g□ 」 を5行とカウントしてしまいます。 空白行はカウントせずに最終行が空白行じゃない場合のみカウントさせたいのですが、いい方法はありませんか?
- 775 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 21:26:09 ]
- >>769
0x0040は16進数で、10進数にすると64 >この場合、変数には絶対0x0040のような値がはいるということでしょうか 何も入りません >また==0 で何を判定しているのでしょうか? >よろしくお願いいたします。 面倒だからいやだ、以上
- 776 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 21:27:57 ]
- >>775
文字コード あるいは アスキーコード でググってみ
- 777 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 21:29:18 ]
- >>765
>>768 先程いろいろ弄っていたら何故かこのバグが起きなくなってしまいました。 再現することすらできなくなってしまいました。 昨晩からずっと悩まされていた問題だったのに何故なんでしょう・・・ でもメンバ数を増やしただけで全く関係ないような演算におかしな結果が出たのは確かなんですよ 何はともあれ解決したので良かったです。助言ありがとうございました。
- 778 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 21:31:24 ]
- >>773
行頭の1文字目が改行かどうかも判断したら良いんじゃね ちょっと疑問なのは、最終行じゃなくて途中に空行があったらどうするつもり?
- 779 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 21:31:40 ]
- >>774
最終行が空と言うか、改行で終わってるだけだから、 それを判定すれば・・・
- 780 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 21:32:15 ]
- >>776
ただのビットフラグの判定がどう関係するんだ?
- 781 名前:770 mailto:sage [2009/01/05(月) 21:37:58 ]
- >>778
すみません TextVol はテキストファイルの大きさなので、 ただいまのカタチですと「行の先頭」との比較ができません。 途中の空白行がカウントされるのは問題ありません。 >>779 現在ですと 「abc□ d□ ef□ g□ 」 が4行 「abc□ d□ ef□ g」 が3行とカウントされてしまうのでソコをなおしたいです。
- 782 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 21:41:37 ]
- >>780
すまん、0x0040だけみて文字の判定かと思った。
- 783 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 21:49:02 ]
- >>781
改行文字の次の文字が、次の行の先頭だよ
- 784 名前:769 [2009/01/05(月) 21:50:51 ]
- すみません、お願いします・・・
- 785 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 21:53:17 ]
- >>781
ファイルの終端に改行文字が何文字連続してるか数えれば、 最後に空白行が何行あるかわかる
- 786 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 21:54:22 ]
- >>781
そのforを抜けた後にcount番目の文字が改行文字でなければ1行増やす。
- 787 名前:785 mailto:sage [2009/01/05(月) 22:01:18 ]
- 言葉足りなかった
改行文字の数+1で空白行も含めた行数が分かる。 そこから最後の空白行だけ引けばいい んで最後に空白行が何行あるかは785
- 788 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:01:24 ]
- お前ら、Cの演算子の優先順記憶してるの?
- 789 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:04:34 ]
- >>784
まず2進数⇔10進数⇔16進数の変換ができるようになれ そしたら「C言語 ビットシフト」でぐぐれ
- 790 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:06:10 ]
- ビットシフトじゃなくてビットフラグ
- 791 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:06:28 ]
- >>788
時々一覧を見るよ。 基本的には、括弧とかで確実にするよ。
- 792 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:08:15 ]
- >>788
可読性を上げるためにも括弧をつかいます
- 793 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:12:31 ]
- >>785
>>787 参考にしてもう少し考えて見ます。ありがとうございます >>786 あ、これでいけそうですね?やってみます。
- 794 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:33:48 ]
- 年初にあたり優先順記憶しようと思ったけど、サンプル数0/3(自分含む)という事で
無理そうだから止めたっと。
- 795 名前:デフォルトの名無しさん [2009/01/05(月) 22:34:22 ]
- 0x0001 & 0x1000 これの値は0 なのか、それとも0000000000000000 なのでしょうか?
また、同じく 0x1000 & 0x1000 の値は、0001000000000000なのか 1000000000000 どちらなのでしょうか?
- 796 名前:763 mailto:sage [2009/01/05(月) 22:44:31 ]
- >>763,777ですが、結局また同じ問題が発生してしまいました。
今度は具体的に説明させてください。 今、ピンボールのプログラムをdirectX3Dを使って作っております。 下の構造体はある障害物の座標を表すもので、ヘッダに記述されているものです。 struct circle{ float x0; float y0; float x1; float y1; double angle; float r; float centx; float centy; }circle[]={ {-10,0,10,0,PI,0,0,0,0} {0,0,0,0,0,0,0,0} }; この中に新しくdouble qwerty(変数名は適当)を作ります。 そしてこの初期化部分でqwertyに0を代入します。 すると、「特定の壁の当たり判定が消えてボールがすり抜ける」という事態が起きてしまいます。 その壁の当たり判定というのはこの構造体とは全く関係のないものです。 次にdouble qwertyのdoubleをintに変えてみます。 すると、先程のバグは起きなくなります。 また、この上記の文をコピーして、構造体の名前を適当なものに変えます。 そして同様にdouble型のメンバを増やすと同じバグが発生してしまいます。プログラムで一切使われていない構造体なのにも関わらずです。 以上のことから考えると、構造体の大きさが原因で、「ある一定以上の大きさの構造体を宣言するとバグが発生する」ということになっているのではないかと思われます。 いったいこれはどういうことなのでしょうか?全く見当がつきません。
- 797 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:44:47 ]
- >>795
君には早すぎるってのがわからんかな ここで説明したところで理解できないよ 0と0000000000000000は同じ 0001000000000000と1000000000000も同じ
- 798 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:45:51 ]
- どっちも同じじゃん。
普段 10 進数で 123 とか 372 とか言ってるけど、 それより上の桁は、実際には全て 0 で埋められているけど 単に省略して表現しているに過ぎない。
- 799 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:53:22 ]
- >>796
無関係の配列やポインタを扱っている部分で バグにより適切な領域を越えた所へと書き込んだり読み込んだりしている部分があり、 その領域がたまたま qwerty のあたりにあったんだろう。 そのあたりの値が常に 0 で初期化されている時のみ たまたま変な事が起きているんだろう。 >「ある一定以上の大きさの構造体を宣言するとバグが発生する」 のではなく、 >「バグ持ちだが、qwerty がないとそれが目に見える形で現れない」 だけに過ぎない。
- 800 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:58:09 ]
- >>796
circle[0]の初期化で、構造体の要素数をこえてしまってるけど、 初期化でミスってない? つか、これってコンパイルできてるの?
- 801 名前:763 mailto:sage [2009/01/05(月) 23:05:40 ]
- >>799
ということは、この構造体に問題があるのではなく、 「当たり判定が消えてしまう特定の壁」の方にあるということなのでしょうか。 >適切な領域を越えた所へと書き込んだり読み込んだりしている部分 適切な領域を越えたところを弄ってしまうというのは例えばどのような処理をしたときに起こるんですか? >>800 宣言部分と初期化部分を分離して struct circle circle[2]={ {-10,0,10,0,PI,0,0,0,0}, {0,0,0,0,0,0,0,0} }; としても結果は同じでした。 >>796の記述でもコンパイルはできてます。
- 802 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 23:05:48 ]
- >>796
だからオーバーフローしてんじゃねぇの? それから、ヘッダでグローバル変数を宣言するのは勝手だが、externを使うような機構にしろ。 そんで何度も初期化されるような記述はやめろ。 DirectXとか以前に、C言語の基本だぞ。
- 803 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 23:10:34 ]
- >>801
>ということは、この構造体に問題があるのではなく、 >「当たり判定が消えてしまう特定の壁」の方にあるということなのでしょうか。 その可能性もあるが、そうでない可能性もある。 バッファオーバーフローは全く予期しない所に影響を与えうるからな。 >適切な領域を越えたところを弄ってしまうというのは例えばどのような処理をしたときに起こるんですか? int n[10]; if (n[100] == 0) { n[1000] = 9; } int a; n[a] = 10;
- 804 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 23:12:18 ]
- >>801
いや、言いたいのは circleの要素はx0〜centyの8個でしょ でも circle[0]の初期化で9個の値を入れてるってこと
- 805 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 23:13:58 ]
- 適当に今サンプルコード書いただけなんじゃね?
普通要素多かったらコンパイル通らんだろ。
- 806 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 23:15:32 ]
- バグとか以前の問題だな。
- 807 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 23:16:56 ]
- >>805
>>796の書き方からして、コピペしたんじゃないかと思って。
- 808 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 23:20:49 ]
- >>802
これが何度も初期化されるような記述だということがまずわかっていませんでした。 externでやってみます。 >>803 ありがとうございます。 ソースを確認してみます。 >>804 すいません、いろいろ弄っている途中だったのでコピペミスってしまいました ちゃんと8個の値で初期化しても駄目でした。
- 809 名前:802 mailto:sage [2009/01/05(月) 23:24:35 ]
- >>808
言い方がきつかったが、要は構造体を定義したヘッダファイル内でその変数も宣言・初期化するってことは、 そのヘッダファイルを読み込んだソースファイルの各々について宣言・初期化が行われるだろ? ヘッダでそういう書き方をしてるってことは、そういうことが起こっているんじゃないかって思ったわけ。 断定的に書いちゃったけど、自分で確かめてみて。
- 810 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 23:33:03 ]
- >>809
なるほど。確かめてみます。 助言ありがとうございました。
- 811 名前:763 mailto:sage [2009/01/06(火) 00:24:28 ]
- 原因が見つかりました。
宣言した配列の大きさ以上の領域を弄っていたようです。 そこを直したところ解決しました。 みなさんありがとうございました。助かりました。
- 812 名前:デフォルトの名無しさん [2009/01/06(火) 00:43:17 ]
- こちらで質問させて頂きます。
5年ほど、ACCESSのVBAでOracleやMySQLのDB操作を行い、 生産管理ツールなどを作成してきました。 そろそろ、C言語にも手を出してみようと思い、現在 C++Bilderか、VC++のどちらにしようか迷っています。 やりたいことは、ACCESSで言うフォーム上からDBのデータを表示したり、 進捗を入力したりしたいと思っています。 雑な質問で恐縮なのですが、C++Bilder2009とVC++では どちらがとっつきやすいでしょうか?
- 813 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 00:50:03 ]
- >>812
Bilderじゃね?
- 814 名前:813 mailto:sage [2009/01/06(火) 00:50:55 ]
- >>813
Bilder? Builderのことだな。
- 815 名前:812 mailto:sage [2009/01/06(火) 00:59:41 ]
- すいません。Builderでしたね。。。
確かに、SQLServer使ってるわけでもないので、 VC++である必要もなさそうですね。
- 816 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 01:16:10 ]
- 「プログラマーは報酬さえ得ることが出来ればどんな事でもするって言うのか!」
- 817 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 01:27:03 ]
- >>816
便所でも掃除する
- 818 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 01:27:51 ]
- >>817
舌で
- 819 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 01:30:23 ]
- >>818
報酬による
- 820 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 06:00:40 ]
- >>819
ecx.images-amazon.com/images/I/5102gOf6cgL._SS500_.jpg 君の報酬はコレだ 働いてくれるな?
- 821 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 06:08:19 ]
- >>820
実は表紙だけで、中身は普通のJIS X3010なんだろ?
- 822 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 06:11:07 ]
- そっちのほうがよっぽどほしいわww
- 823 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 06:33:57 ]
- >>821
それ、むしろ欲しいよ!
- 824 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 11:16:19 ]
- なんでC言語なんて覚えてんだろ・・?
- 825 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 12:45:28 ]
- 2chブラウザ作りたいんですが、
他の2chブラウザって、書き込み処理とかは、ここのフォームを偽装して作ってるんですか?
- 826 名前:825 mailto:sage [2009/01/06(火) 12:48:43 ]
- pc11.2ch.net/test/read.cgi/tech/1180406037/
ここに、 20 :デフォルトの名無しさん:2007/06/10(日) 21:26:21 まじめな話DATをダウンロードして表示して保管して 書き込みはbbs.cgiを呼んでやるだけでしょ大雑把に言って って書いてましたが、そうなんですか?
- 827 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 13:03:52 ]
- >>826
基本、そんな感じ。それにプラスするとしたら、画像表示、検索、あぼん、コテ管理、DAT管理、書き込み管理と言ったところか。 書き込みフォームは偽装するよりもオリジナルで作った方が使い易いと思われ。 あー、Cookieの管理とか板トップ表示なんかも必要か。
- 828 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 13:06:43 ]
- >>825
こっちのほうが詳しいぞ。 pc11.2ch.net/test/read.cgi/tech/1224449899/
- 829 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 13:23:18 ]
- 暇でライブラリでも作ろうかと思ってるんで何かお題ください
- 830 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 13:26:49 ]
- >>829
Cでスパイダーツール書くのに使えるヤツ
- 831 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 13:28:54 ]
- スパイダーツールって何?
- 832 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 13:33:25 ]
- >>831
こんな www.amazon.co.jp/dp/4873111870
- 833 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 13:52:48 ]
- なるほど
あんまり興味ないけど作って見ます
- 834 名前:デフォルトの名無しさん [2009/01/06(火) 22:25:03 ]
- デバッグ作業でよく発見する間違いってどんなのでしょうか?
- 835 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 22:34:20 ]
- >>834
コーディング段階で発見できない間違いの殆ど全て。
- 836 名前:デフォルトの名無しさん [2009/01/06(火) 22:42:28 ]
- どういうのが発見できないのでしょうか?
- 837 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 22:43:50 ]
- というか全部発見しようとするのがデバッグってもんじゃないかww
- 838 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 22:45:50 ]
- 仕様の誤解釈、typo、不注意、思い込み、&c...
- 839 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 23:06:11 ]
- デバッガのバグとかも
- 840 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 23:57:59 ]
- >>834
配列とかポインタでアクセスしたらいけないところにアクセスしてるのが多い
- 841 名前:デフォルトの名無しさん [2009/01/07(水) 01:35:17 ]
- C++(gcc4.1.2使っています)で、
下記のJAVAのように、 メソッド内で同一クラス内のメソッドを利用するにはどうしたらよいのでしょうか。 public class Greeting { public void sayHello() { this.hello(); } private void hello() { System.out.println("Hello"); } }
- 842 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 01:37:40 ]
- this->hello();}
- 843 名前:デフォルトの名無しさん [2009/01/07(水) 01:43:30 ]
- >>842
できました。ありがとうございます。
- 844 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 10:19:30 ]
- 質問です( VC++ 2008EE )
クラステンプレート使用時、staticなconstメンバ変数の定義でエラーになってしまいます。 <ヘッダー> template <typename T> class samp{ private: T number; static const double db; public: ... void disp() const { std::cout << "db = " << db << std::endl; } }; <cpp> template <typename T> const double samp<T>::db = 1.35; このクラスのオブジェクトを生成して disp() をコールすると db の外部参照が未解決と出てしまいます。 どう修正すべきでしょうか?
- 845 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 10:29:20 ]
- 定義が無いもの、定義書けばいいだろ
- 846 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 10:43:00 ]
- VS2008で問題出ないけどなあ、それ。
- 847 名前:844 mailto:sage [2009/01/07(水) 11:00:00 ]
- >>845
<cpp>での定義の事でしょうか? const double samp<int>::db = 1.35; const double samp<char>::db = 1.35; とかやれば通るんですがテンプレートの意味ないですよね・・・ >>846 マジですか?! クラスの宣言と定義だけなら通るんですが、main にて samp<int> smp; smp.disp(); // ここでエラー になってしまいます
|

|