スレを勃てるまでもないC/C++の質問はここで 5at TECH
スレを勃てるまでもないC/C++の質問はここで 5 - 暇つぶし2ch315:デフォルトの名無しさん
09/01/01 23:11:36
こいつ病気だな。

316:デフォルトの名無しさん
09/01/01 23:12:34
>>315
wwwwwwwwww

317:デフォルトの名無しさん
09/01/01 23:12:49
315 :デフォルトの名無しさん:2009/01/01(木) 23:11:36
こいつ病気だな。

318:デフォルトの名無しさん
09/01/01 23:14:26
贈るほどでもない言葉


319:デフォルトの名無しさん
09/01/01 23:15:22
printf("俺様はプログラマーの卵だ!!");

320:デフォルトの名無しさん
09/01/01 23:17:09
これは酷い

321:デフォルトの名無しさん
09/01/01 23:17:31

贈るほどでもない言葉

322:デフォルトの名無しさん
09/01/01 23:18:34
#define loop while(1)

323: 【大吉】 【1003円】
09/01/01 23:29:13
C++はオブジェクト指向でいい

324:デフォルトの名無しさん
09/01/01 23:30:39
全角

325:デフォルトの名無しさん
09/01/01 23:31:42
だから何?

326:デフォルトの名無しさん
09/01/01 23:32:51
だから何?

327:デフォルトの名無しさん
09/01/01 23:34:07
なんか病気のコピペ厨が張り付いているんですけど

328:デフォルトの名無しさん
09/01/01 23:34:12
だから何?

329: 【だん吉】 【791円】
09/01/01 23:34:19
c++にするべきかな

330:デフォルトの名無しさん
09/01/01 23:34:44
するべき。

331:デフォルトの名無しさん
09/01/01 23:34:54
だから何?

332:デフォルトの名無しさん
09/01/01 23:49:10
壊れたラジオみたいだな

333:デフォルトの名無しさん
09/01/02 00:38:41
壊れかけ、ではなくて?

334:デフォルトの名無しさん
09/01/02 00:47:21
そう。壊れてる

335:デフォルトの名無しさん
09/01/02 00:49:37
センスない・・・

336:デフォルトの名無しさん
09/01/02 01:07:15
あきらめるな

337:デフォルトの名無しさん
09/01/02 09:00:22
>284
iostream、stringについては随分普及してきたと思う

でもvectorやsstream、fstream辺りは入門サイトだとなかなか出てこなくね?
この辺りが使えないと、配列やCライブラリを使わなきゃいけない場面が多くなる

個人的にはclass定義より詳細な文法より先に標準ライブラリやSTLの使い方だと思う
初っ端からSTL連発くらいのがC++初心者には良くないか?

338:デフォルトの名無しさん
09/01/02 09:39:43
>>332
学生さんだね。
社会に出ればわかるけど冤罪も罪のうち、疑わしきは罰するってのは法治国家の不文律だよ。

339:デフォルトの名無しさん
09/01/02 09:42:19
まぁ、とにかく動かしたいんだっていうならそっちのが早いだろうさ

340:デフォルトの名無しさん
09/01/02 11:02:06
>>337
その「入門サイト」とやらが、たまたま「class定義より詳細な文法より先に標準ライブラリやSTLの使い方」で「初っ端からSTL連発」なんだろ?

「初心者」がきちんとC++を学びたいなら、そんなわけのわからないサイトではなく、定評のある書籍や教育コースを受講した方がいいと思うけどね。

341:デフォルトの名無しさん
09/01/02 12:11:34
>>340
STLが、C++基本的構造(クラスなど)より先にあって
STLを実装するために、C++の基本構造が作られたんだ。
日本語を勉強するのに、文法的な構造から始めるか、
会話から始めるかという違いだろう。

342:デフォルトの名無しさん
09/01/02 12:21:35
STLのアーキテクチャの多くはアレクサンドル・ステパノフという一人の人物の手によって作られた。
1979年に彼はジェネリックプログラミングの初期アイデアを練り始め、そしてソフトウェア開発に革命をもたらす可能性を探究し始めた。
当時はジェネリックプログラミングを実際にサポートしているプログラミング言語がまだなかった。

1987年までにステパノフとマッサーはジェネリックプログラミングの研究成果としてAdaのリスト処理ライブラリを開発してリリースしていた。
しかしながらAdaは軍需産業以外ではあまり普及しておらず、
C++は当時まだ言語として未成熟ではあったものの(テンプレートはまだなく後から実装された)
より広く普及してジェネリックプログラミングの良好なサポートが提供される可能性が高いと考えられた。

ベル研究所のアンドリュー・コーニグがこの動きを察知して、1993年11月のANSI/ISOのC++標準化委員会に
アイデアを提出するように求めるようなことがもしなければ、この作業は間違いなく、さしあたっては研究プロジェクトとして、
あるいはヒューレット・パッカード研究所のプロプライエタリなライブラリとして継続されたであろう。
提案は委員会で全面的に賛同を得て、すぐさま1994年3月のミーティングでのコーニグからの正式なリクエストへとつながった。

Standard Template Library - Wikipediaの抜粋
URLリンク(ja.wikipedia.org)

343:デフォルトの名無しさん
09/01/02 12:33:51
>>341は、「STLを実装するため」に追加された機能だけが、「C++の基本構造」とでもいいたいのだろうか。
アホか。

344:デフォルトの名無しさん
09/01/02 12:52:10
STLとC++の開発が始まったのは調べたら1979年らしい。
これらは別々の人たち、場所で開発されていて、STLを実装するために
C++の開発に大きな影響を与えたこととおもうが。

345:デフォルトの名無しさん
09/01/02 13:03:19
らしい。
おもうが。

346:デフォルトの名無しさん
09/01/02 13:06:38
聞きかじりと妄想だけで断言口調のやつ、多いな。

347:デフォルトの名無しさん
09/01/02 13:19:57
これからC++を始めるならOOPを基本とすべき。

348:デフォルトの名無しさん
09/01/02 14:01:13
今さら入門書って思うレベルだけどAccelerrated C++を読んでみたい。

349:デフォルトの名無しさん
09/01/02 14:02:04
ぜひどうぞ

350:デフォルトの名無しさん
09/01/02 14:15:37
ア、、アク、アクセ・・・
俺には無理だった・・・

351:デフォルトの名無しさん
09/01/02 15:23:16
>348
その本はまさに「配列より先にvector」の本やね

352:デフォルトの名無しさん
09/01/02 15:29:02
vector は vector で、
< > って何なのとか、2次元配列はどうやってつくるのとか、
面倒臭い事もあるので、
vector を先にやった方がいいと言える程手軽な物でもない。
at を使わないと境界チェックもしてくれないし。
動的配列より先に vector ってのなら構わんがね。

353:デフォルトの名無しさん
09/01/02 15:32:05
>>348を読んでから言え馬鹿

354:デフォルトの名無しさん
09/01/02 15:41:03
C++では、
Cのcontainer_of()相当のことは標準で出来ないでしょうか?

355:デフォルトの名無しさん
09/01/02 15:57:08
カプセル化を前提とするC++で
そういうものが必要になる事自体設計がおかしいと思われる。
もちろん標準でそんなことはできない。

356:デフォルトの名無しさん
09/01/02 16:02:59
クラスの継承がそれに相当すると主張するのは無茶すぎますかね?

357:デフォルトの名無しさん
09/01/02 16:03:35
買いに行ったけど売ってなかった・・・(´;ω;)

DVDコピーとかの本ばっか。

358:デフォルトの名無しさん
09/01/02 16:06:04
>>356
ダウンキャストか。

359:デフォルトの名無しさん
09/01/02 16:16:43
>>355,356
返答ありがとうございます。
継承使えばいいのかとも考えたのですが、
継承ではクラス内にlistを3個とか複数持たせる
ことは出来ないと考えました。

クラス内にlistを複数持つという設計が良くない
のかもしれませんが、代替案が浮かびません。

360:デフォルトの名無しさん
09/01/02 16:19:56
list と何か関係あるのか?

361:デフォルトの名無しさん
09/01/02 16:22:21
>>356
煽りとかじゃなく純粋に質問。
それどういう意味?

362:デフォルトの名無しさん
09/01/02 16:26:14
>>360
説明不足すいません。
Cでは、構造体内にlistを複数持たせておいても
それぞれのlistについてcontainer_of()を使えば、
包含する構造体は求まるので、
それと同等のことをC++で行う方法を考えていました。

363:デフォルトの名無しさん
09/01/02 16:43:29
#include <iostream.h>

int main()
{
cout<<"こんにちわ。"<<endl;
return 0;
}
include ファイルを開けません。'iostream.h': No such file or directory



364:363
09/01/02 16:46:19
自己解決しました。

365:デフォルトの名無しさん
09/01/02 17:09:32
>>361
listを継承したクラスで, listにアップキャストしてリストを作る
それをダウンキャストしたら得られるだろ?

listっていってもSTLのではないぞ

366:!omikuji !dama
09/01/02 17:17:03
C++のコンパイラはやはり
Borland C++Compiler でよろしいのでしょうか

367:デフォルトの名無しさん
09/01/02 17:18:35
無料版の方だったら今時ありえない、よした方がいい

368:デフォルトの名無しさん
09/01/02 17:25:06
>>362
複数なら継承ではなく包含させればいい。
そして、listにそれを所有するオブジェクトへのポインタまたは参照を持たせる。

369:デフォルトの名無しさん
09/01/02 17:27:25
>>366
対応している規格がが古いからお勧めできない。VC++2088 expressを薦める

370:デフォルトの名無しさん
09/01/02 17:27:40
container_of()相当で聞いてるんだから
リンク用のポインタ以外もたないlistなんじゃねーの?

持たせてもいいんだろーか?

371:!omikuji !dama
09/01/02 17:34:36
>>367
>>369
サンクス

372:デフォルトの名無しさん
09/01/02 17:38:01
ググってみたけど、container_ofって危険じゃないか?
引数を間違えて、構造体のメンバじゃない変数を与えてもコンパイルエラーにならないんじゃない?


373:デフォルトの名無しさん
09/01/02 17:38:27
>>368,370
ありがとうございます。
とりあえずSTLのlistを使うことを考えていたのですが、
自前で作るかSTLのlistを継承したリストを
作ってそいつにポインタ持たせればいいということですね。


374:デフォルトの名無しさん
09/01/02 17:43:47
>>373
なにか恐ろしい事をやろうとしているように見える。
STL のクラスは継承する事を全艇に作ってないので
基本的には継承しちゃだめ。

そもそも、list からそれを持ってるクラスをとってこようとしている時点でおかしい。
list を持っているクラスを通して list を扱うのが基本だ。

375:デフォルトの名無しさん
09/01/02 18:45:24
>>373
listとポインタを所有するクラスを作ろう

376:デフォルトの名無しさん
09/01/02 19:53:32
$ cat c_sizeof.c

#include <stdio.h>

int main(void)
{
printf("sizeof(\'\\x80\') == %d\n", sizeof('\x80'));

return 0;
}

/* EOF */
$ gcc -Wall -std=c99 -o c_sizeof c_sizeof.c
$ ./c_sizeof
sizeof('\x80') == 4
$ cat cxx_sizeof.cxx

#include <iostream>

int main()
{
std::cout << "sizeof(\'\\x80\') == " << sizeof('\x80') << std::endl;

return 0;
}

// EOF
$ g++ -Wall -o cxx_sizeof cxx_sizeof.cxx
$ ./cxx_sizeof
sizeof('\x80') == 1

 なぜ、C言語ではシングルクォートが、4 Bytesであり、C++では、1 Byteなのですか。

377:デフォルトの名無しさん
09/01/02 19:59:46
>>376
Cではint型で
C++ではchar型だからです

C++でのオーバーロードとかの兼ね合いだろうね

378:デフォルトの名無しさん
09/01/02 20:06:19
1バイトって256種類のパターンを表現できるんだっけ

379:デフォルトの名無しさん
09/01/02 20:06:52
普通はそう
Cにおいては絶対ではないが

380:デフォルトの名無しさん
09/01/02 20:06:58
cher型は嫌いです

381:デフォルトの名無しさん
09/01/02 20:12:08
ちーあ?

382:デフォルトの名無しさん
09/01/02 20:22:07
>>377
 ありがとうございます。そういうことだったんですね。
C言語とC++は、こういう細かいところでも違うんですね。

383:デフォルトの名無しさん
09/01/02 20:26:19
なぁ、チーフって何だ?

384:デフォルトの名無しさん
09/01/02 22:20:53
牛肉だろ

385:デフォルトの名無しさん
09/01/02 22:51:07
ロベール先生にお世話になることにしました

386:デフォルトの名無しさん
09/01/03 03:20:44
2ch終わった
2ちゃんねる、海外企業に譲渡 ― 西村博之氏からPACKET MONSTER INC.へ譲渡完了
URLリンク(www.rbbtoday.com)

ニコニコに移行して2chは完全に切る気やな

387:デフォルトの名無しさん
09/01/03 03:30:31
2chが終わるってのも、思い込みすぎかも。まぁ、2chは巨大になったことだし
もし消滅するなら、また別の人がサーバーを運営するだろうね。
手法などは、既に2chのを参考にすれば済むことだし、著作権だの
知的財産権だの、抵触せずに似たものはいくらでも作れるし。

388:デフォルトの名無しさん
09/01/03 03:35:19
IP記録を始めたときも、終わったというやつは大勢いたが、今まで生き残っている。
少なくともユーザに見限られるということはないだろうとは言える。

389:デフォルトの名無しさん
09/01/03 03:37:26
国内しかも個人が代表に見える格好だと
裁判とか税金とかうるさいから、
スケープゴートとして海外企業に移したんでしょ。

ひろゆきとしては譲渡していいことずくめだろ

390:デフォルトの名無しさん
09/01/03 03:44:35
大雑把に言って、内容は不特定多数の人が書き込んで出来上がっているし、
その不特定多数が消滅しない限り、やはり何かしらこういったコミュニティーは
継続するだろうしね。運営者も費用も必要だが。掲示板そのものに
スタイルはいくつかあれど、誰でもやれることだし。ただ、一生をそんなことに
ささげるだけの覚悟はあるかい?

391:デフォルトの名無しさん
09/01/03 03:55:02
つーか、ガンガン機能追加するわけでもないしね。
運用するだけじゃん。こんな掲示板
アウトソースすればよろし
レスは1000までって制限も永遠と変わんないしw

392:デフォルトの名無しさん
09/01/03 05:38:23
複雑な機能なんていらん
掲示板として書き込み/読み込みというシンプルな機能だけで十分
肥大化して良い事なんて無いってのはC++でもいえる

393:デフォルトの名無しさん
09/01/03 08:35:35
2ちゃんねらーらしくもない話してるな
スルーしろよ

394:デフォルトの名無しさん
09/01/03 11:03:58
protected private継承の違いについて

395:デフォルトの名無しさん
09/01/03 11:12:01
int i,j;
i=0;
while(j=10-i++) ってのはありでつか?

396:デフォルトの名無しさん
09/01/03 11:14:57
ありだけど、キミが期待した通りかはわからん。

397:デフォルトの名無しさん
09/01/03 11:15:30
えぇ、変数って2個いっぺんに宣言できるの!?

ってかありなんじゃない

398:デフォルトの名無しさん
09/01/03 11:26:55
>>395
おそらく"ってのはありでつか?"がエラーになる


399:デフォルトの名無しさん
09/01/03 11:49:30
文法上問題は無いが、何か気持ちは悪い。

400:デフォルトの名無しさん
09/01/03 12:03:01
>>395
あり。そう書いたとおりに動く。

401:デフォルトの名無しさん
09/01/03 12:22:43
>>395の話がCの宿題スレでよく分からん議論になってる

402:デフォルトの名無しさん
09/01/03 12:28:17
少なくとも、読むときには困るコードだな

403:デフォルトの名無しさん
09/01/03 13:13:25
>>401
おそらく>>395が向こうで代入式!代入式!ってファビョってる奴だと思う。
追い詰められてこっちに助けを求めてきたんだろ。

404:デフォルトの名無しさん
09/01/03 13:20:32
printfでも入れてコンパイル&動かせばいいだけじゃん > ファビオジニオール

405:デフォルトの名無しさん
09/01/03 13:51:18
なるほど、宿題スレか。
宿題の回答としてはまずいと思うけどな。
わけもわからず写して動作聞かれたら困るべ。

406:デフォルトの名無しさん
09/01/03 13:52:50
>>403
お前がコンパイラが通すから良しといっている基地外だというこは分かったから、
いつまでも必死にファビョってなさいw

407:デフォルトの名無しさん
09/01/03 13:55:38
本人登場w

408:デフォルトの名無しさん
09/01/03 13:56:14
>>403
見えない敵と必死に戦う低レベル講師乙。コードを客観的に考えるのと、
主観ばかりで意見する相手に対して、罵詈雑言で返すだけの無能は
黙っていた方が墓穴を掘らなくて済むぞw

409:デフォルトの名無しさん
09/01/03 14:03:49
>>408
キモッ

410:デフォルトの名無しさん
09/01/03 14:12:17
>>408
お前の発言が主観ではなくなんだと言うのだ

411:デフォルトの名無しさん
09/01/03 14:14:20
408は自己紹介としては良く出来てると思うぜ。

412:デフォルトの名無しさん
09/01/03 14:21:00
ん?
>>408の日本語がよく分からんのだが、
"コードを客観的に考え"てるのが誰で
"主観ばかりで意見する"のが誰で
"罵詈雑言で返すだけの無能"が誰だって?

413:デフォルトの名無しさん
09/01/03 14:22:11
>>395は、くせぇくせぇ、○ンコの臭いがぷんぷんすんぜ、こりゃ~生っ粋のクソースだ。
間違いねぇ、クソ麻呂のクソースだぜ、ぷぷぷw

414:デフォルトの名無しさん
09/01/03 14:34:49
マジレスするとgccだとコンパイル通らないよ
警告: 真偽値として使われる代入のまわりでは、丸括弧の使用をお勧めします
だってさ

415:デフォルトの名無しさん
09/01/03 14:36:20
あっ、一応警告だけでコンパイルも実行もできた。
j=10 i=1

j=9 i=2

j=8 i=3

j=7 i=4

j=6 i=5

j=5 i=6

j=4 i=7

j=3 i=8

j=2 i=9

j=1 i=10



416:デフォルトの名無しさん
09/01/03 14:36:49
>>414
そりゃ、警告だ
コンパイルエラーじゃない

417:デフォルトの名無しさん
09/01/03 14:38:13
警告をエラーにするオプションを立てればエラーにはなる。一応。

418:デフォルトの名無しさん
09/01/03 14:42:41
質問です.
・ソース
#include <windows.h>
#include <time.h>
#include <stdio.h>
typedef struct
{
time_t time;
WORD namesum;
BYTE name[254];
} HEADER1;
typedef struct
{
time_t time;
WORD namesum;
// BYTE name[254];
} HEADER2;
main() {
BYTE name[254];
printf("HEADER1 = %d\n", sizeof(HEADER1));
printf("HEADER2 = %d\n", sizeof(HEADER2));
printf("name[254] = %d\n", sizeof(name));
printf("HEADER2 + name[254] = %d\n", sizeof(HEADER2) + sizeof(name));
}

・実行結果
HEADER1 = 260
HEADER2 = 8
name[254] = 254
HEADER2 + name[254] = 262

HEADER2 + name[254]はなんで260にならずに262になったのでしょうか?

419:デフォルトの名無しさん
09/01/03 14:44:07
関係ない部分を削ってから質問した方がいいよ

420:419
09/01/03 14:44:54
↑ 「ソースコードの」、関係ない部分を

421:デフォルトの名無しさん
09/01/03 14:45:49
ソースは全部あげたほうがいいだろ。
どこが「関係ない部分」かわかるくらいなら自分で問題解決できるって。

422:デフォルトの名無しさん
09/01/03 14:46:18
>>418
HEADER2 + name[254] = 8 + 254 = 262
ってそのまんだだと思うが

423:419
09/01/03 14:47:48
で、ソースを見たが、8 + 254 はどう考えても 262

424:デフォルトの名無しさん
09/01/03 14:47:54
足し算w

425:419
09/01/03 14:48:48
>>421
まぁそうか・・・HEADER1はどう考えても関係ないんだが。スマソ

426:デフォルトの名無しさん
09/01/03 14:48:54
なんで260になると思ったのか説明して欲しい。

427:デフォルトの名無しさん
09/01/03 14:49:19
>>418の頭の中のバグを直すのは難しいw
消防からやりなおせってとこか

428:デフォルトの名無しさん
09/01/03 14:49:23
パディングの話だろ。

429:デフォルトの名無しさん
09/01/03 14:49:28
>422
HEADER2はHEADER1のname[254]をコメントアウトしているので
HEADER2 + name[254] = HEADER1に何でならないのかと思いまして.

430:デフォルトの名無しさん
09/01/03 14:51:06
それぞれ全く無関係だから。

431:デフォルトの名無しさん
09/01/03 14:51:14
パディングとかアラインメントとかでググれ

432:デフォルトの名無しさん
09/01/03 14:52:31
なんかバカが紛れ込んでて話をややこしくしてるな。
>>422>>423>>424>>426>>427>>430 あたりは無視してよろしい。

433:デフォルトの名無しさん
09/01/03 14:53:03
いやいや、型の定義は (おまえの疑問とは) 関係ないよ。
printfで出力された値を見れば、ただ足し算するだけ。

定義のところに疑問があるなら、疑問を持つべきは最後のprintf文じゃないでしょ?

434:デフォルトの名無しさん
09/01/03 14:53:56
>>433
だから分からん奴は黙っとけ。

435:418
09/01/03 14:54:25
パディングでぐぐったら答えが出てきました.初めて知ったよ.
みなさんありがとう.

436:デフォルトの名無しさん
09/01/03 14:54:32
お前は代入式ってファビョってりゃいいんだよw

437:デフォルトの名無しさん
09/01/03 14:55:41
>>436
クソワロタ

438:デフォルトの名無しさん
09/01/03 14:57:26
パディングやアラインメントならsizeof(HEADER2)の値が6じゃないのを疑問に思うのが普通じゃね?

439:デフォルトの名無しさん
09/01/03 14:57:34
数字だけ言うんだもん、足し算の問題だと思うわ
結局日本語で理解できなかったよ

440:デフォルトの名無しさん
09/01/03 14:58:38
>>434
まぁ解決したからいいいけど、2個目のprintfでHEADER2のサイズが HEADER1 - 256
になってない時点で疑問に思うべきだってことだよ

441:デフォルトの名無しさん
09/01/03 15:20:54
>>436
きもいぃ~~~~はいっ、きっ、もっ、いっ、キモイ!きっ、もっ、いっ、キモイ!
キモイィ~~~~

442:デフォルトの名無しさん
09/01/03 15:25:47
なんか頭のおかしい基地外が、自分の不備を指摘されてファビョってまつねw
あのwhile文の中は、条件式が適切なのに、代入式で済ませているなんて、
プログラマー失格だろ。コンパイラが警告しているのに、アホ過ぎ。黙ってろよ、ド素人w

443:デフォルトの名無しさん
09/01/03 15:29:52
簡単な質問で申し訳ないのですが
visual stdio 2005 無償版でデバッグ開始してみたところ
「0x0040115d でハンドルされていない例外が発生しました: 0xC0000094: Integer division by zero」
というメッセージがでて実行中に強制終了してしまいました。

これってどうすればいいんでしょうか・・・?


444:デフォルトの名無しさん
09/01/03 15:30:39
Linuxでは代入が正解だ。
オープンソースも知らない素人は黙っとけよ。
恥ずかしい奴だな。

445:デフォルトの名無しさん
09/01/03 15:32:30
なんか一匹、年明け早々、必死に基地外っぷりを発揮していますね(^ー^)v
アァ~~キモッキモッ、きっと鏡を見ると、キモイ面が映っているんでしょうね。
現実に目を向けようぜ、こんな文字列ばかりのスレじゃなくて、さ?

446:デフォルトの名無しさん
09/01/03 15:33:00
>>443
ゼロで割ることはできない。

447:デフォルトの名無しさん
09/01/03 15:33:15
>>443
何かを0で割ったんじゃね?

448:デフォルトの名無しさん
09/01/03 15:34:57
代入式でも条件式でも「式」でありさえすればなんでもいいのがCの仕様。
バカが条件式限定だと思い込んで恥をさらしてファビョりまくってるのが現状。

449:デフォルトの名無しさん
09/01/03 15:35:13
パディングって、詰め物だっけ
コンパイラの最適化って、害悪だと思う

450:デフォルトの名無しさん
09/01/03 15:36:00
最適化がなかったら困ったことになると思うが。

451:デフォルトの名無しさん
09/01/03 15:36:44
>>449
もう一度勉強しようね

452:デフォルトの名無しさん
09/01/03 15:37:19
>>446-447さん
ありがとうございました。解決したみたいです。


453:デフォルトの名無しさん
09/01/03 15:37:28
>>443
デバッグ開始してるなら、中断とか継続とか出ると思う。
中断すれば該当行にカーソルが行く。
その行で割り算してて、割る数が0なんだろう。

変数にマウスカーソルあてると数値見えたりもする。

454:デフォルトの名無しさん
09/01/03 15:37:56
>>443
visual stdioなんか使うからだろ。
gcc使え。
gccなら0除算OKだ。
いまどき0除算もできないコンパイラなんてM$製くらいだ。
これだからドザは駄目なんだよ。

455:デフォルトの名無しさん
09/01/03 15:38:37
パディングってワード間隔でデータを区切って
実行速度を速める為の手法だっけ

456:デフォルトの名無しさん
09/01/03 15:38:42
>>442
式は値を持つんだから、なんの問題も無いだろ。
警告がいやなら、while ((j=0-i++)) とでもすればいい。
なにも知らないド素人は黙ってろよw

457:デフォルトの名無しさん
09/01/03 15:38:50
>>444
これって乱数で過去レスを切り貼りするスクリプトでしょ。

458:デフォルトの名無しさん
09/01/03 15:39:24
やたらからんでくる愚かものがいるなw
さすが、言語スレ

いつまでも、こんな言語仕様のスレみてるのなんて学生ばっかだっつーの

459:デフォルトの名無しさん
09/01/03 15:39:52
みんな親切だな。
英和辞書引け、でいいのに。

460:デフォルトの名無しさん
09/01/03 15:40:21
>>455
そう

461:デフォルトの名無しさん
09/01/03 15:40:44
>>455
基本的にはそうだが、
アラインメントされてないと
データを読めない CPU もある。

462:デフォルトの名無しさん
09/01/03 15:40:57
ビットフィールドってので、
手動でやる場合もある

463:デフォルトの名無しさん
09/01/03 15:41:00
>>454
0で割るってどういうことか知ってる?

464:デフォルトの名無しさん
09/01/03 15:41:49
>>463
宇宙の法則が乱れる

465:デフォルトの名無しさん
09/01/03 15:42:15
学生や初心者が見るスレだからこそ、間違った知識は叩かれねばならない。

466:デフォルトの名無しさん
09/01/03 15:44:34
>>463
visual stdioが破壊されるってことだろ。
素直にオープンソース使えって。
無理するな。

467:デフォルトの名無しさん
09/01/03 15:45:39
>>460-462
アラインメントをキーワードにググってみた。
説明ありがとー

468:デフォルトの名無しさん
09/01/03 16:21:15
>>458
おいっ、絡まれてまともにレス出来ないなら、お前がレスしなきゃ良くね?
だってここ、誰もお前個人を特定、指定してレスを求めているわけじゃないんだが
言うからには自分の発言に責任を持っているんだろうな?
ほれ、鏡を見ろよ。醜い酷い面が映っただろ?誰だよそれ?
そう、お・ま・え・だよ?分かる?それが現実。自分が見たものはどうこう言うくせに
自分で自分を見られる唯一の手段、何か姿を映し出すものを見た時
己の醜さを目の当たりにするのさ。今のあんたみたく。
あんたの発言、第三者から見れば、きんもぉ~★だぜ?

469:デフォルトの名無しさん
09/01/03 16:22:56
自身thisのアドレスをprintするメソッドを持つクラスを作成して
以下のようにvectorに追加する前のインスタンス
とvector内のインスタンスでprint()を実行したのですが、

addr=0x804b008
addr=0x804b018
と別のアドレスになります。
同じになると思っていたのですが、
これはvectorに登録する時点でインスタンスが
コピーされていると考えればいいのでしょうか?

またその場合オーバーヘ%8

470:デフォルトの名無しさん
09/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
09/01/03 16:24:46
>またその場合オーバーヘ%8
以降の続き

またその場合オーバーヘッドが気になるんですが、
皆さんどう対処してらっしゃいますか?

お願いします。

472:デフォルトの名無しさん
09/01/03 16:27:46
当然コピーが発生する。
ただ、
vector<MyClass*> vec;
vec.push_back(my);
みたいにアドレスをコピーする分には
インスタンスのコピーは発生しない。
ただ、メモリ管理を自分でしないといけなくなってしまう。
boost::ptr_vector を使うという手もある。

473:デフォルトの名無しさん
09/01/03 16:29:50
vectorは、メモリを確保してplacement newという機構とコピーコンストラクタ
で初期化される (記憶があいまいなのでちょっと違うかも)

で、言うとおりコピーはされる。ポインタのコピーに比べれば
効率は悪いけど、実際そんな小さなことが問題になることはほとんどない。

よっぽどでかいデータ構造をソートしまくるとかでない限り。

474:デフォルトの名無しさん
09/01/03 16:31:56
コピーのコストより、
コピーコンストラクタの実装がマズくて
問題が発生しないかチェックする方が重要だったりするよね。

475:デフォルトの名無しさん
09/01/03 16:47:54
いいよいいよー、そうやって自分を否定する者を否定し続けてなさい。
それぞ、井の中の蛙、大海を知らずと言ったものだ。視野が狭いんだよ、
ファビョっている基地外は。もちっとグローバルに、客観的に物事を見な。
自分が思ったことが全て正しい、そんなことを思っているのは、お子ちゃままで。
大人の世界は、いくら自分がそう思っても、現実は、事実とは違っていることなんて
いくらでもあると気づく。実行して見て、コードが間違っていないと思っていても
もっと効率が良いものが存在するだの、自分で考えたのに、後でおかしいと気づくことなんて
いくらでもある。ただ・・・

while(代入式) は不適切だ。

476:デフォルトの名無しさん
09/01/03 16:50:59
>>475
「いいよいいよー、そうやって自分を否定する者を否定し続けてなさい。
それぞ、井の中の蛙、大海を知らずと言ったものだ。視野が狭いんだよ、
ファビョっている基地外は。もちっとグローバルに、客観的に物事を見な。
自分が思ったことが全て正しい、そんなことを思っているのは、お子ちゃままで。
大人の世界は、いくら自分がそう思っても、現実は、事実とは違っていることなんて
いくらでもあると気づく。実行して見て、コードが間違っていないと思っていても
もっと効率が良いものが存在するだの、自分で考えたのに、後でおかしいと気づくことなんて
いくらでもある。」
ここまでそっくりそのままお前に返すよwww

477:469
09/01/03 16:59:01
>>472,473,474
ありがとうございます。
ポインタを使うのがしっくり来そうです


478:デフォルトの名無しさん
09/01/03 16:59:49
Cの規格に沿った構文解析器でも作ってみたら?
while(代入式)が不適切だろうがなんだろうが正しいんだから。

479:デフォルトの名無しさん
09/01/03 17:08:53
>>478
コンパイルできて規格合致であることは誰も否定していない。

480:デフォルトの名無しさん
09/01/03 17:11:38
>>479
まぁ確かに。
言いたかったのは、そこまで熱くならんでもいいんじゃね?ってこと。

481:デフォルトの名無しさん
09/01/03 17:13:34
>>480
478みたいな書き方だとまた話を蒸し返されそうな雰囲気だから勘弁してくれ。

482:デフォルトの名無しさん
09/01/03 17:13:44
>>479
いや、否定してる奴が約一名いるぞ
>>442 とか>>475 とか

483:デフォルトの名無しさん
09/01/03 17:15:22
>>481
失礼した。
書き方に気をつける。

484:デフォルトの名無しさん
09/01/03 17:16:04
while文の条件は条件式にするってのは良い心がけだと思うよ。
linuxなんかでは値があるものは何でもってくらい条件にしちゃうので、
経験積んだらそういうソースにも慣れると良い

485:デフォルトの名無しさん
09/01/03 17:33:25
条件式ではなく比較式と言ってくれ。

486:デフォルトの名無しさん
09/01/03 17:42:19
>>485
呂布かいでし

487:デフォルトの名無しさん
09/01/03 17:44:55
比較するとは限らんぜ

488:デフォルトの名無しさん
09/01/03 19:17:03
式・・・それは愛・・・・・・

489:デフォルトの名無しさん
09/01/03 19:59:08
>>485
そゆこと言ってるから、論理値をリテラルと比較する莫迦が後を絶たない。

490:デフォルトの名無しさん
09/01/03 20:05:45
お前、リテラルの意味分かってないだろ

491:デフォルトの名無しさん
09/01/03 20:58:12
>>489
if(hoge()!=0)...
とか?

あるいは、if((x<y)!=0)...
ということだろうか?


492:デフォルトの名無しさん
09/01/03 21:00:05
(is_hoge() == true) == trueのことだろ。

493:デフォルトの名無しさん
09/01/03 21:05:04
>>492
真理値型の無い言語だぞ?
巣に帰れよ。

494:デフォルトの名無しさん
09/01/03 21:16:20
リテラルってほらあれだ
前屈みになって腕を横に挙げるやつ

495:デフォルトの名無しさん
09/01/03 21:18:09
ボケがわかりにくい上につまんねーよw

496:デフォルトの名無しさん
09/01/03 21:19:33
どどんまい?

497:デフォルトの名無しさん
09/01/03 21:32:53
>>493
処理できた件数を返す関数hogeの場合、#define TRUE -1に対して、
if(hoge()){・・・}
if(hoge()==TRUE){・・・}
とか。

498:デフォルトの名無しさん
09/01/03 22:01:46
>>493
お前の頭はC89止まりか。

499:デフォルトの名無しさん
09/01/03 22:07:12
左辺が右辺より大きいとき

左辺が右辺以上の時
って何が違うんでしょうか?
>これと>=を使い分けたりすることってあるのでしょうか?

500:デフォルトの名無しさん
09/01/03 22:09:23
>>499
ちゅうがっこう から やりなおせば
わかると おもいます。

501:デフォルトの名無しさん
09/01/03 22:11:25
>>500
それいぜんに にぽーんごの もんだいかと
おもわれまっしゅる

502:デフォルトの名無しさん
09/01/03 22:12:31
  ヾヽ\ヾ\                           ////  //
 \丶\\                               ////
                 |・\  _____ /・>      ///
     / ̄ ̄ ̄ ̄\,,   ミ\.\ヽ|||liiiii||/ /./彡   ////
 |・\ /_____/・>     /\.\|||iii||l//彡  ノ(
ミ \.\ヽ|||liiiii||/ /./ノ(   / / (,-、 ,:‐、 ) \ ⌒ヽ
   \.\|||iii||l// | ⌒  .|/ ─////─   ヽ   |
    |(,-、 ,:‐、 )   6 l   |. ////─    |  .|    \\\
.   ////Vヽ  ,-′  ////'VVVヽ     |   l
  ////ェ∧/_ /ヽ . ////  γ    l    / /
 //// |/\/ l ^ ////  i∧ェェェ∧/  / /
//// |       |//// l━(t)━━┥

503:デフォルトの名無しさん
09/01/03 22:28:36
>>499
左辺==右辺の時に真になるか偽になるかの違い。
必要に応じて>と>=のふさわしい方を使う。

504:デフォルトの名無しさん
09/01/03 22:30:48
xが12より大きいとき
xが12以上の時

より・・以上・・そこにある違い・・それが問題ってことですよね?

505:デフォルトの名無しさん
09/01/03 22:30:52
面白い釣りだなあ。

506:デフォルトの名無しさん
09/01/03 22:32:36
>>503

x >= 10 == x > 10
は偽になるってことでしょうか?

507:デフォルトの名無しさん
09/01/03 22:34:12
さんすうのきょうかしょをよんでね

508:デフォルトの名無しさん
09/01/03 22:42:07
>>506
x==10のときだけ偽、それ以外は真。

509:デフォルトの名無しさん
09/01/03 22:42:37
優先順位は大丈夫か?

510:デフォルトの名無しさん
09/01/03 22:44:32
>>509
優先順位知らないんなら口出すなw

511:デフォルトの名無しさん
09/01/03 22:47:21
申し訳ございません

512:デフォルトの名無しさん
09/01/03 22:59:32
>>508
そ・・そうか!!
やっと理解できました!!!!

x < 10は10もは含まれないってことですよね!?
だから
int a;
cin>>a;
if("x < 10"){
cout<<”真"<<endl;
はxが10より小さいってことで
つまり10と入力しても偽になるわけだ!!!!!!!!!

513:デフォルトの名無しさん
09/01/03 23:16:33
while ("テュルー")

はどうなりますか?

514:デフォルトの名無しさん
09/01/03 23:17:47
無限ループ

515:デフォルトの名無しさん
09/01/03 23:17:50
突っ込みどころ満載w

516:デフォルトの名無しさん
09/01/03 23:18:13
・・・??

517:デフォルトの名無しさん
09/01/03 23:25:24
while("forever") ってしない?

518:デフォルトの名無しさん
09/01/03 23:27:07
しない

519:デフォルトの名無しさん
09/01/03 23:30:13
>>517
条件式じゃないと暴れだす奴がくるぞw

520:デフォルトの名無しさん
09/01/03 23:34:54
>>517
そのアイデア貰った

521:デフォルトの名無しさん
09/01/03 23:43:25
ちょ、それ古典w

522:デフォルトの名無しさん
09/01/03 23:43:49
俺も面白いと思った。

while("無限ループ")
{
  /* なんか */
}

まあ、しないけど

523:デフォルトの名無しさん
09/01/03 23:44:49
>>519
さすがにお前の粘着ぶりがキモイ

524:デフォルトの名無しさん
09/01/03 23:46:13
while(j=10-i++) を書いた奴が指摘されて、まだファビョってるのか?
基地外だろ、こいつ。指摘した方が言ってもいないことを思っているとか言い出すし。

525:デフォルトの名無しさん
09/01/03 23:49:41
whileの括弧の中が条件式でなければ駄目とは言っていないし、変数を用いて
0か否かで繰り返し条件を指定することもかのうだが、あの式は紛れもなく
代入式で、jの値を使うにしては、不適切だとコンパイラも指摘しているのだが・・・

526:デフォルトの名無しさん
09/01/03 23:51:04
プw

527:デフォルトの名無しさん
09/01/03 23:53:39
いやぁがんばってるね

528:デフォルトの名無しさん
09/01/03 23:55:30
while(*dst++=*src++);

529:デフォルトの名無しさん
09/01/04 00:00:53
>>525
>while文の括弧の中は、
>本来は条件式が入るんだが、それは代入だろ。例え括弧で代入式を括っても、
>それに対して条件式にあう措置をとるべき。

530:デフォルトの名無しさん
09/01/04 00:03:01
>>524
ファビョってるのは「while文の中は、条件式が適切なのに、代入式で…」うんぬん
いってる>>442だろ
ながれ読めよ

>>525
>>456 で結論出てるのにいつまでやってんの?

531:デフォルトの名無しさん
09/01/04 00:04:48
>>530
>>524=>>442で本人だからしょうがないんだよw

532:デフォルトの名無しさん
09/01/04 00:15:46
最近よく喧嘩するね

533:デフォルトの名無しさん
09/01/04 00:29:14
テュルー

534:デフォルトの名無しさん
09/01/04 00:29:51
冬休みだからしかたない

535:デフォルトの名無しさん
09/01/04 00:30:16
出た、「冬休み」

536:デフォルトの名無しさん
09/01/04 00:37:35
connect(sock,( struct sockaddr * ) &echoservaddr, sizeof(echoservadr))

この文の * が意味することがまったくわかりません
*の後に文字もないのですが、ポインタとしてありえなくないでしょうか?

537:デフォルトの名無しさん
09/01/04 00:38:30
ポインタ型でキャストしてるだけ

538:デフォルトの名無しさん
09/01/04 00:51:54
人はなぜ>>534のような発言をするのか。
それは「私は子供ではない」と誇示したいからである。

では、「私は大人だ」と主張する人間が「大人」なのだろうか。
答えは否、断じて否である。

539:デフォルトの名無しさん
09/01/04 00:56:57
で?

540:536
09/01/04 00:57:57
つまり&echoservaddr構造体のポインタを
sockaddr構造体のポインタとしてあつかうってことでしょうか?

まったく何をしているか理解できないのですが

541:デフォルトの名無しさん
09/01/04 00:58:58
>>539

542:デフォルトの名無しさん
09/01/04 01:00:57
>>540
その通りの事をやっている。
sockaddr_in 構造体を sockaddr 構造体であるかのように
無理矢理見なして渡している。
sockaddr_in 構造体と sockaddr 構造体はサイズが同じで、
かつ、こうやってキャストしてもいいと問題ないとされている。

543:デフォルトの名無しさん
09/01/04 01:02:07
connect()の第2引数はstruct sockddr *型(struct sockddr型へのポインタ)を取る。
そこで、&echoservaddr(echoservaddrのアドレス)をstruct sockddr *型(struct sockddr型へのポインタ)へキャストしている。

544:536
09/01/04 01:03:51
>>542
見なす理由がわからないのです。
sockaddr_inのほうが入ってる情報というか入力する情報は多いし
その情報はconnectする際に必要だと思います。
なのに、何故必要な情報がすべてあひってないsockaddr構造体とみなすのかがよくわかりません

545:デフォルトの名無しさん
09/01/04 01:07:27
URLリンク(www.linux.or.jp)

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

2番目の引数の型には、const struct sockaddr *が”必要”

546:536
09/01/04 01:08:58
必要な理由がわからないのです。
ていうか、入れてしまっては前述した疑問がわいてしまって

547:デフォルトの名無しさん
09/01/04 01:10:08
理由は、connect()がそういう仕様だから。
connect()を作った人間がそういう風に作ったから。

548:デフォルトの名無しさん
09/01/04 01:11:16
>必要な理由がわからないのです。

なんというか……

549:デフォルトの名無しさん
09/01/04 01:12:22
>>544
総称的な型として sockaddr を用意して、
connect は sockaddr* を受け取る汎用的な形にしておいて、
より詳細な構造体として sockaddr_in を用意し、
それをキャストして渡す、という風になってんじゃないのかね。
場合によっては sockaddr_in 以外のものも作るつもりだった、
あるいは将来作れるように、そういう風にしてんじゃない?
void* でいいような気もするけど、
それだと何でもキャスト無しに渡せちゃうから、
渡していい構造体なのかどうか注意して指定させるように、
キャスト無しでは渡せないようにしているんだと思う。
まあ、全部推測だけどね。

550:536
09/01/04 01:13:40
つまりsockaddr_in 構造体の中にある入力したアドレスに接続するわけですよね。
しかしsockaaddr構造体にはアドレスがない。それなのに、sockaddr構造体とみなしてしまっては、
アドレスないから接続できなくないのでは?ということです。



551:デフォルトの名無しさん
09/01/04 01:14:33
っていうか、全部が全部
現状が正しい前提で理由を付けなくてもいいと思うけど。
頭いいひとにありがちだよね。

552:デフォルトの名無しさん
09/01/04 01:16:41
後の改造のために凝った事やって、
結局改造なんてしなかった、
ってこともよくある話で。
互換性のために、とかもよくある話。

553:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/01/04 01:20:44
>>550
ああ、そういうことか。
sockaddr_inはsockaddrをIPv4に特化したもの。
sockaddr_inを使うのはIPv4だけだ。
connect()はIPv4以外でも使われる。

URLリンク(www.linux.or.jp)

AF_INETの他に
AF_APPLETALKとかあるだろ。

555:536
09/01/04 01:26:58
>>554
socketでAF_INETを指定しているのですが、
この場合だとIPv4でconnectしてるということでは?

556:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/01/04 01:36:55
>>550
sockaddrとしてもsa_familyが読み取れる。
そこがAF_INETならsockaddr_inにキャストしてアドレスを読み取るという風になっている。
ほかのAF_*にも対応するsockaddr_*が存在しうるという仕組み。

>>549
そういうことなんだろうけど、IPv6を収めるには小さすぎたのが惜しかった。

558:デフォルトの名無しさん
09/01/04 01:39:57
どうせサイズ渡してんだし、
sockaddr::sa_family だけでよかった気もする。

559:536
09/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
09/01/04 01:44:22
>sockaddrとしてもsa_familyが読み取れる。
>そこがAF_INETならsockaddr_inにキャストしてアドレスを読み取るという風になっている。

これだと、sockaaddrをキャストしてもsockaaddrにはポートやアドレス入力してなければ
読み取れないのでは?



561:デフォルトの名無しさん
09/01/04 01:45:14
4.2BSDのsockaddrはsa_lenは無くて、sa_familyだけだった。

562:デフォルトの名無しさん
09/01/04 01:46:55
IPv4として使う場合、
アドレスファミリをAF_INETにして
sockaddr_inにアドレス詰めて
connect()に渡すときはsockaddrにキャストして
connect()の内部ではsockaddr_inとしてアドレスを読み出す。

563:デフォルトの名無しさん
09/01/04 01:48:29
>>561
それが合理的だな。

>>560
sockaddr_in を渡すのなら
sa_family に AF_INET を入れないといけないし、
sa_family に AF_INET を入れるのなら
渡す物は sockaddr_in でなくてはいけない。
それ以外の使い方して変になっても
それはそんな変な使い方をした人が悪い。

564:デフォルトの名無しさん
09/01/04 01:48:51
>>560
入力してなければ読み取れないが、入力するためにsockaddr_inにしてポートやアドレスを入力するんだろ?
キャストしてもメモリの内容は変わらない。

565:デフォルトの名無しさん
09/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
09/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:デフォルトの名無しさん
09/01/04 02:00:32
空じゃなくてアドレス等を入力したものをsockaddrとみなして渡してる。
(( struct sockaddr * ) &echoservaddr)->sa_data[2]~[5]とか見れば納得するのかな?

568:デフォルトの名無しさん
09/01/04 02:04:55
>>566
connectに渡しているのは構造体のアドレス。内容は渡していない。

569:デフォルトの名無しさん
09/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
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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
09/01/04 02:34:31
>>571
お!
もしかして
sockaddr_inは、計16バイトでその情報はsockaddrに全て対応する
sa_family はsinfamilyに
sa_data[14]には残りの14バイトのアドレスが格納されるということになってるのかな

だとすると、どちらかの構造体だけ入力しとけばいいってのも納得できるのですが
これでいいのでしょうか?

574:デフォルトの名無しさん
09/01/04 02:46:42
>>573
いままでの回答全て無駄っぽい。
sockaddrはアドレスファミリーから見れば関係ないんだって。
例えばUNIX ドメインソケットなら sockaddr_un だし、
IPv4なら sockaddr_in がconnectには必要。
ただ、歴史的背景かなにかはしらないが、connect(2)のインターフェースが
「void *」ではなく、「sockaddr *」になってるってだけ。

575:536
09/01/04 02:56:41
>>574
つまり>>571ではないと?
ますますわけわかんなくなってきた

struct sockaddr* をキャストの型として &echoservaddrするってのがよくわからないのかなぁ

&echoservaddrには>>572にかいてあるようなin構造体のアドレスが入力ずみではあるけど
それをキャストすると、どう扱われるってのがよくわかんないかも

いや、本当にみなさんに色々教えてもらっているのに理解がたりなくて申し訳ないです。
キャストとかsockaaddrとかぐぐってるけど、いまいち理解できない・・・

576:デフォルトの名無しさん
09/01/04 03:01:20
>>575
>>571 であってる。
まず、>>569 が理解できるか確認してくれ。

577:536
09/01/04 03:11:36
>>576
すみません。まったくわかりません。
const unsigned char*)&n
char型(nの値が格納されている)アドレスへのポインタ

なんかもうわかりません

578:デフォルトの名無しさん
09/01/04 03:18:13
ま、深夜だし思う存分続けてくれたまえ

579:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/01/04 03:46:11
ポインタ……それは恋だ!

582:デフォルトの名無しさん
09/01/04 03:48:03
>>580
ポインタの正確な定義わ?

583:デフォルトの名無しさん
09/01/04 03:53:40
ボイン太、それはAVだ!

584:デフォルトの名無しさん
09/01/04 03:56:43
残念ながらボッシュートで~す

585:デフォルトの名無しさん
09/01/04 05:24:40
ってか、ぶっちゃけお前らの一番好きなC89基本型ってなんなの

586:デフォルトの名無しさん
09/01/04 05:50:24
int
異論は認めない

587:デフォルトの名無しさん
09/01/04 05:58:07
unsigned long int

588:デフォルトの名無しさん
09/01/04 05:59:37
size_t 異論 は 色ん なものがあるだろうから認める

589:デフォルトの名無しさん
09/01/04 06:10:51
char
ちゃ~

590:デフォルトの名無しさん
09/01/04 06:21:28
size_tって中身はint?

591:デフォルトの名無しさん
09/01/04 06:33:26
符号なしのint型が一般的らしい。time_tとかも。

592:デフォルトの名無しさん
09/01/04 06:33:54
grepすりゃすぐ判るかと

593:デフォルトの名無しさん
09/01/04 06:39:50
>>592 だから何?

594:デフォルトの名無しさん
09/01/04 06:44:36
にしても
>>588>>589はひどいなww

595:デフォルトの名無しさん
09/01/04 07:06:34
俺は断然


bool

596:デフォルトの名無しさん
09/01/04 08:34:21
し、bool……?

597:デフォルトの名無しさん
09/01/04 09:30:43
いやいやいや
void*

598:デフォルトの名無しさん
09/01/04 09:31:48
√とかはC言語で使えないのでしょうか・・?
特殊相対性理論における時間の遅れ、運動してる物体の速度を入力することによって
運動してる物体の時間の刻みを出すプログラムを作りたのですが、・・C言語で√は使えないのでしょうか・・?


599:デフォルトの名無しさん
09/01/04 09:34:48
>>598
確かに特殊相対論は中学生でも理解できるが、お前は別の勉強をした方がいいよ

600:デフォルトの名無しさん
09/01/04 09:35:15
#include <math.h>


601:デフォルトの名無しさん
09/01/04 09:36:56
あえて俺はLPVOIDと書く

602:デフォルトの名無しさん
09/01/04 09:43:28
>>600-601
サンクス

603:536
09/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
09/01/04 10:57:59
あと、もう1点ですが
>char *c = (char*)p;

int *p = &n;  としたのなら、
char*c = (char*)*p もしくはchar*c = (char)*p となるのではないのでしょうか?

605:デフォルトの名無しさん
09/01/04 11:04:19
二段ダブルベット

606:536
09/01/04 11:10:16
すみません、もうひとつ
先ほどの例の場合

int型をchar型にする利点というか意味がわからないのですが
サイズが異なる構造体をキャストしたら中身が全然違うのに型を変えるとか想像がつきません



607:デフォルトの名無しさん
09/01/04 11:13:34
>>603
>>580ではないけど、
その日本語だと君がどこまで理解できたのかが分からない
材料は揃ってるようだから、手を動かしたほうがいいよ。

問題の値をそれぞれprintf()してどうなったか、
試すくらいはしてから再度の質問はするものだ


608:デフォルトの名無しさん
09/01/04 11:18:19
型宣言の *と
演算子の*を混同している・・・・?

609:デフォルトの名無しさん
09/01/04 11:20:10
C言語でおk

610:デフォルトの名無しさん
09/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
09/01/04 11:33:40
int へのポインタ型。ってのがよくわからないのですが
一つのプログラムでintを宣言する変数なんてたくさんでてくるとおもうのですが、
この場合、intへのポイントとはどうなるのでしょうか?

612:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/01/04 12:15:32
麻雀は分かるか? 二盃口は七対子と見た目は同じだよね。

|二|二|三|三|四|四|七|七|八|八|九|九|發|發|
|萬|萬|萬|萬|萬|萬|索|索|索|索|索|索|  |  |

これを一盃口を1かたまりで解釈すると二盃口と解釈できるし、

|二|二|三|三|四|四|  |七|七|八|八|九|九|  |發|發|
|萬|萬|萬|萬|萬|萬|  |索|索|索|索|索|索|  |  |  |

全部対子で解釈すると七対子と解釈できる。

|二|二|  |三|三|  |四|四|  |七|七|  |八|八|  |九|九|  |發|發|
|萬|萬|  |萬|萬|  |萬|萬|  |索|索|  |索|索|  |索|索|  |  |  |

そして、別に役とか関係無しに単に牌が 14 個並んでいるだけだと解釈することもできる。

|二|  |二|  |三|  |三|  |四|  |四|  |七|  |七|  |八|  |八|  |九|  |九|  |發|  |發|
|萬|  |萬|  |萬|  |萬|  |萬|  |萬|  |索|  |索|  |索|  |索|  |索|  |索|  |  |  |  |

615:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/01/04 12:18:15
>>616
負の値の平方根はできない

619:デフォルトの名無しさん
09/01/04 12:18:41
とりあえず、「速さ」の単位は「km」じゃないよ。
ローレンツ変換の前に学ぶことがあると思うんだ。。



620:デフォルトの名無しさん
09/01/04 12:19:08
割り込まれてしまったが、
>>614>>615>>617 の順で読んでくれ。

621:デフォルトの名無しさん
09/01/04 12:20:49
すげーな、この流れは
ポインタFAQ用のテンプレとして、是非利用すべきだ
まったく読んでないけど

622:デフォルトの名無しさん
09/01/04 12:20:59
>>616
#include <complex.h>


623:デフォルトの名無しさん
09/01/04 12:25:46
>>619
cが時速なんで許容範囲のようだ

624:デフォルトの名無しさん
09/01/04 12:28:52
年速じゃないの?

625:デフォルトの名無しさん
09/01/04 12:31:13
>>619
ごめんなさい・・・

626:536
09/01/04 12:32:34
>>610
sockaddrのほうはsa_family
inのほうはsin_family

共通してないきがするのですが、
キャストしても別に扱われるのでは?

627:デフォルトの名無しさん
09/01/04 12:36:00
fopen_sとfclose関数を用いてファイルの読み書きするプログラムを作成しているのですが、
ファイルを新規に作成し書き込む場合に、
すでに同名のファイルが存在する場合や、ディレクトリーに書き込めない場合に
エラーを返すようにするにはどうすればよいでしょうか?


628:デフォルトの名無しさん
09/01/04 12:39:18
>>624
c = 108000000なんで時速kmになってる

629:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/01/04 12:48:45
そもそも長さと速さの単位の違いを分かっているのだろうか。

631:536
09/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:デフォルトの名無しさん
09/01/04 12:51:54
こんな教えて君に付き合うなんて
おまえよっぽど暇なんだな
Cの入門書でも読んどけって、話はそれからだ
で済むと思うんだが

633:デフォルトの名無しさん
09/01/04 12:51:56
にゃ~ん

634:536
09/01/04 12:52:18
>>617
麻雀はわからないのですが、*ryanpeko はどこをさしているのでしょうか?



635:デフォルトの名無しさん
09/01/04 12:52:54
>>627
fopen_s()の戻り値で判断すればいいんじゃないの?

URLリンク(msdn.microsoft.com)(VS.80).aspx
URLリンク(msdn.microsoft.com)(VS.80).aspx

636:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/01/04 12:54:01
>>631
connect()のソース読めよ
話はそれからだ

638:デフォルトの名無しさん
09/01/04 12:54:32
>>627
100% 完全な方法はないと思う。

1. "r" で開いて、開けたら fclose してエラーを返す。
2. "w+" で開いて、開けなかったらエラーを返す。
3. ファイルサイズが 0 でなければ fclose してエラーを返す。
4. "w" で freopen_s する。

がまだましな方法だとは思うが、
1 と 2 の僅かな間にサイズ 0 のファイルを作られたらチェックから漏れる。

639:デフォルトの名無しさん
09/01/04 12:56:13
>>631
まあそんなところだ。
sizeof に関しては、sizeof (sockaddr) は危険。
sockaddr_in を渡しているのだから、sizeof (sockaddr_in) にすべき。

640:デフォルトの名無しさん
09/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
09/01/04 13:02:42
なるほど。>>631みたいな感じなのですか。
これだとなんとか理解できます。こんなめんどくさいことするのはconnectの決まりだからというわけですね。



642:デフォルトの名無しさん
09/01/04 13:05:20
>>641
IP以外のプロトコルのアドレスも扱えるようにしてるんじゃないかな

643:デフォルトの名無しさん
09/01/04 13:12:24
>>641,642
おや、話が半日前に戻ったぞw
進歩がないスレだな

644:デフォルトの名無しさん
09/01/04 13:13:54
>>643
while(代入式)の人ですね?分かります

645:デフォルトの名無しさん
09/01/04 13:19:47
while君と教えて君が出現するとスレが無駄に進む

646:デフォルトの名無しさん
09/01/04 13:21:50
>>645
無駄だと思うならこのスレに来るなよ馬鹿

647:デフォルトの名無しさん
09/01/04 13:24:40
いや進めよう、いざ進め
さあ、次の質問カマーーン!?

648:536
09/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:デフォルトの名無しさん
09/01/04 13:30:00
while君もcast解らん君も
自ら試すということをしないところに共通点が。

>>644
オレはレベルの低い質問については回答側だよ。
どっちも実験しようとすれば5分で結果出るじゃん。
初心者歓迎のスレは別にあるのにこのスレの存在意義が
わかんね。

650:デフォルトの名無しさん
09/01/04 13:34:24
>>648
ここでそんなことしても意味ないから。
コンパイラへの明確な指示と人間の可読性を考えて
ソースは書くんだよ。
> char *p
> p = &n;
それコンパイル通してみた?

gccなら-Wallつけて、コンパイラがどう言うかちゃんと
向き合いながら勉強しなよ。


651:デフォルトの名無しさん
09/01/04 13:34:34
>>648
&nはint*型だから。
それを代入する先の変数pはそれとは異なるchar*型。
そのため、キャストして&nをchar*型にしてやらないといけない。

652:デフォルトの名無しさん
09/01/04 13:37:31
教えたがりが殺到してわけわからなくなってるな。

653:デフォルトの名無しさん
09/01/04 13:44:33
つーか、最近の2chは微温くなったもんだな。
俺の若いころは、ちょっとバカな質問すると
逝ってよし!
半年ROMれ
とか言われたもんだが

654:デフォルトの名無しさん
09/01/04 13:47:03
ここは、二番目にバカな質問を受け付けるハコだからな。
一番は、宿題スレ

655:デフォルトの名無しさん
09/01/04 13:54:22
>>654 thx
本当だ
初心者歓迎C/C++室の方がレベルが高いw

656:デフォルトの名無しさん
09/01/04 14:00:01
宿題スレにだけは足を踏み入れる気がしない。

657:デフォルトの名無しさん
09/01/04 14:03:05
宿題スレだってピンからキリまでだよ。
アホも多いけどレベル高い人もちゃんといる。

658:デフォルトの名無しさん
09/01/04 14:46:51
>>649
> 自ら試す
コンパイラが通せば正しいとは限らないんだが・・・
それを指摘されてファビョったキチガイですね?分かります。

659:デフォルトの名無しさん
09/01/04 14:47:27
もう秋田

660:デフォルトの名無しさん
09/01/04 14:50:27
>>648
キャストしないとワーニングが出るよ


661:デフォルトの名無しさん
09/01/04 14:54:07
>>658
正しい場合でもそれと分からないやつにはな・・・

662:デフォルトの名無しさん
09/01/04 14:56:08
配列のサイズを指定せず、配列に数値を格納して行く度に
配列のサイズを増やしていく方法がわかりません
言語はC++です
このような事は可能なのでしょうか、また出来るなら
どのようにすればいいのかご教示願います

663:デフォルトの名無しさん
09/01/04 14:59:10
>>662
std::vector か std::deque 使え。

664:デフォルトの名無しさん
09/01/04 14:59:24
STLのvectorでresize()を使うのはいかがでしょうか?

665:デフォルトの名無しさん
09/01/04 15:00:06
push_back や insert でいいだろ

666:デフォルトの名無しさん
09/01/04 15:04:32
URLリンク(www.amazon.co.jp)
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:デフォルトの名無しさん
09/01/04 15:06:57
>>666
URL長すぎ
書籍名を書け

668:662
09/01/04 15:07:08
皆さんありがとうございました
これで詰んでた課題が進めそうです

669:デフォルトの名無しさん
09/01/04 15:07:59
iStudy BB for IT Skills C言語プログラミング基礎 パーフェクトP

670:デフォルトの名無しさん
09/01/04 15:10:26
>>666
amazon の URL を縮める方法も知らない奴は勘弁して欲しい。
URLリンク(www.amazon.co.jp)

671:デフォルトの名無しさん
09/01/04 15:12:20
>>670
今回だけは勘弁してやるから、URLの縮め方をここに書け

672:デフォルトの名無しさん
09/01/04 15:13:53
>>671
>>666>>670 を見比べりゃ分かるだろ・・・。

673:デフォルトの名無しさん
09/01/04 15:15:26
>>672
お前が分かるなら、お前がやり方を書け

674:デフォルトの名無しさん
09/01/04 15:17:24
>>673
そうやって法則性を見つける努力を怠るからダメなんだよ。

675:デフォルトの名無しさん
09/01/04 15:18:18
>>674
そんな無意味な煽りを書く暇があったら、さっさとやり方を書け

676:URLの気持ち
09/01/04 15:18:27
俺なんのために付属されたんだろう・・・orz

677:デフォルトの名無しさん
09/01/04 15:19:27
>>675
そんな無意味な煽りを書く暇があったら、さっさとやり方を考えろ

678:デフォルトの名無しさん
09/01/04 15:20:23
暇な奴って怖いなまで読んだ

679:デフォルトの名無しさん
09/01/04 15:20:31
>>677
やり方は考えるものではなく、存在するものだ
解っているなら、さっさと書け

680:デフォルトの名無しさん
09/01/04 15:21:35
>>679
やり方は存在するものではなく、考えるものだ
解らないなら、さっさと考えろ

681:デフォルトの名無しさん
09/01/04 15:21:50
よーしパパがんばって教えちゃうぞー
って仕事の電話が
すまん今はダメのようだ

682:デフォルトの名無しさん
09/01/04 15:22:41
よーしパパがんばってID出しちゃうぞー☆

683:デフォルトの名無しさん
09/01/04 15:23:27
質問に答えない、無意味な質問スレッド

死ね

684:デフォルトの名無しさん
09/01/04 15:27:13
教えて欲しいなら下手に出ろよw

685:デフォルトの名無しさん
09/01/04 15:29:06
下手に出ても教えないけどな。
見りゃすぐ解る事を教える事ほど害悪なことは無い。

686:デフォルトの名無しさん
09/01/04 15:33:12
ワカラン → 教えろカス → 嫌 → 氏ね
小学生ですね
わかります

687:デフォルトの名無しさん
09/01/04 15:34:01
>>683
おめーに答える義務はねー

688:デフォルトの名無しさん
09/01/04 15:40:37
3分LifeHacking:Amazonの長いURLを短縮表示する - ITmedia Biz.ID
URLリンク(www.itmedia.co.jp)

689:デフォルトの名無しさん
09/01/04 15:42:37
>>684
死ね

>>685
死ね

>>686
死ね

>>687
死ね

>>688
ありがとう

690:デフォルトの名無しさん
09/01/04 15:43:20
>>688
死ね

691:デフォルトの名無しさん
09/01/04 16:05:14
URLリンク(www.amazon.co.jp)
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

URLリンク(www.amazon.co.jp)

え?これの区別も一人で解決できないの?
辞めたほうがいいよ 君
てか こないで

692:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/01/04 16:10:46
>>689
URLリンク(wktk.vip2ch.com)

694:デフォルトの名無しさん
09/01/04 16:12:04
>>692
先ず、Cでは文字列をどう表わすか知ってる?

695:デフォルトの名無しさん
09/01/04 16:12:55
>>692
void perror( const char *string );
文字列の先頭のアドレスを指定します

何の問題もありません

696:デフォルトの名無しさん
09/01/04 16:14:58
>>692
char *aiueo = "あいうえお";
myprint(aiueo);

void myprint(char *str)
{
 printf("%s\n", str);
}

何かおかしい?

697:デフォルトの名無しさん
09/01/04 16:19:26
>>696
ポインタ使う必要があるのでしょうか?

698:デフォルトの名無しさん
09/01/04 16:21:02
>>697
それでは、逆にポインタを使わなければどうなるのでしょうか?

699:デフォルトの名無しさん
09/01/04 16:21:48
>>698
ポインタ使う場合は、下記の文になる
使わないとできない

void mputs(char *p)
{
while(*p);
printf("&c", *p);
p++;
}
printf("\n");
}

mputs("エラーです”);

700:デフォルトの名無しさん
09/01/04 16:31:26
string aiueo("あいうえお");
myprint(aiueo);

void myprint(string str)
{
 cout << str << endl;
}

701:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/01/04 16:40:35
だとしたら、こんな文でするよりそっちでしたほうがいいってことですよね
こんな文は使い道ないということかな

void mputs(char *p)
{
while(*p);
printf("&c", *p);
p++;
}
printf("\n");
}

mputs("エラーです”);


703:デフォルトの名無しさん
09/01/04 16:43:37
>>701
システムがメモリーを確保して、そこに"あいうえお"と言う文字列定数を配置。
その先頭アドレスをchar型へのポインタ変数aiueoに代入。

aiueoが示すのは"あいうえお"の先頭だけ。
ただし、コンパイラはaiueoを使うときには、char単位に操作することを知っている。(char *と宣言したから)

704:デフォルトの名無しさん
09/01/04 16:48:13
なんでaiueoには先頭アドレスしかはいってないのに
void myprint(char *str)
{
 printf("%s\n", str);
}
これで、全部表示されるかがわかりません。
引数としてmyprintに渡すのは先頭アドレス。
その先頭アドレスをchar *str でどう処理しているのでしょうか?

705:デフォルトの名無しさん
09/01/04 16:51:28
>>704
Cの文字列について勉強するといいかも。

それから、↓の6.2を読んでみるとわかるかも。
URLリンク(www.kouno.jp)

706:デフォルトの名無しさん
09/01/04 16:59:27
こういうので、ネットでいちいち質問してたら効率悪すぎるよ。
適当な入門書でも読んでみたら?

707:デフォルトの名無しさん
09/01/04 17:00:04
ダメだ全然わからない
なんでポインタの文字を一気に表示できるんだ



708:デフォルトの名無しさん
09/01/04 17:00:21
>>706
独習Cよんでるがわからない

709:デフォルトの名無しさん
09/01/04 17:01:10
文字列と配列 - 文字列 - C言語 入門
URLリンク(www.cppdrive.jp)

710:デフォルトの名無しさん
09/01/04 17:01:20
そういうもんだって深く考えずに受け入れることも大事。

711:デフォルトの名無しさん
09/01/04 17:02:14
>>707
ポインタの指してるとことから連続で並んでるからだろ。

712:デフォルトの名無しさん
09/01/04 17:04:41
なんで、*strじゃなくてstr

713:デフォルトの名無しさん
09/01/04 17:06:18
>>704の疑問がすべて>>702に書かれているというのに…

714:デフォルトの名無しさん
09/01/04 17:12:21
過去を振り返っては駄目です

715:デフォルトの名無しさん
09/01/04 17:13:26
>>658
俺はwhile君じゃないよ。回答側と言っている
お前はここ来るまえに日本語からやりなおせ

716:デフォルトの名無しさん
09/01/04 17:14:36
宿題スレと統合したら?
結局、皆さんのおかげで課題が進みそうってw

717:デフォルトの名無しさん
09/01/04 17:17:08
宿題スレは課題丸投げ用

718:デフォルトの名無しさん
09/01/04 17:19:07
宿題テンプレも埋めるのが面倒臭いから、こっちに投げてんだろ。
テンプレ強制になっても、他に飛び火するだけ。

719:デフォルトの名無しさん
09/01/04 17:23:15
文字列を作成すると自動的に末尾に\0が付加される
char *str = "あいうえお"
とすると
正確には あいうえお\0となっている
ので先頭の str[0] のアドレスさえ分かっていれば
\0がくるか0がくるまで その内容は何かしらの意味を持った文字列だと認識する

自分でもやってるだろ?
デバッカで
char *str = "あいうえお";
の内容を見てみれば分かる

720:デフォルトの名無しさん
09/01/04 17:43:06
>>719
わかりました。
\0が出てくるまでが文字列ということですね。

721:デフォルトの名無しさん
09/01/04 17:49:04
>>640
非常に解りやすい!!!
サンクスです

722:デフォルトの名無しさん
09/01/04 18:20:00
ウィンドウに貼り付けたプッシュボタンのWM_NCHITTESTメッセージをキャッチするには
サブクラス化するしかないのでしょうか?

723:デフォルトの名無しさん
09/01/04 18:49:02
そうだね。

724:デフォルトの名無しさん
09/01/04 19:02:04
今リスト構造やってるんですが、ポインタが非常に分かりづらい;
どなたかおすすめのポインタ解説サイト知ってましたら
教えていただけないでしょうか

725:デフォルトの名無しさん
09/01/04 19:33:56
小数点のより右の数字だけを取る方法はないでしょうか?
x * y =200.1となったら0.1にしてしまうような

726:デフォルトの名無しさん
09/01/04 19:37:41
z = x * y;
z = z - (int)z;

727:デフォルトの名無しさん
09/01/04 19:38:38
>>726
ハイパーサンクス!!

728:デフォルトの名無しさん
09/01/04 19:38:45
trunc

729:デフォルトの名無しさん
09/01/04 19:42:53
>726 の方法だとzがintの範囲をオーバーフローしてるときにおかしくなるね


730:デフォルトの名無しさん
09/01/04 19:56:28
それと負の数も考えて、floorつかえばいいさ

731:デフォルトの名無しさん
09/01/04 19:57:05
floorじゃだめか負の数

732:デフォルトの名無しさん
09/01/04 19:58:39
modf使えよカス

733:デフォルトの名無しさん
09/01/04 20:02:34
倍精度でも仮数部が52bitだから
64bit整数型使えば精度的に大丈夫のはず

734:デフォルトの名無しさん
09/01/04 20:23:28
だから0方向切り捨てなんだからtrunc一発で終わりなんだって

735:デフォルトの名無しさん
09/01/04 21:47:38
クラスは分かったけど配列クラスで詰んだ…
他にも同じような人いそうだな…
またこれが使えるようになった人ってのはやっぱり
テキスト熟読してやっとの事で理解出来たんだろうか

736:デフォルトの名無しさん
09/01/04 21:50:54
>735
「配列クラス」というのは何のことだ
vector等のことか、それともオブジェクトの配列なのか

737:デフォルトの名無しさん
09/01/04 22:26:27
grwinで三角形を任意の角度回転させて表示するってのを作ってるんですが
三角形の中心を求めて原点に置き、回転させる方法が分かりません・・
どなたかご教授おねがいしまう

738:デフォルトの名無しさん
09/01/04 22:53:34
>>737
教授なんかできるか。
1. ググれない事情がある。
2. それらしい解説ページは見つけたが、言葉の意味が解らない。
3. 意味は解るが、コードに落とせない。
どれだ?

739:デフォルトの名無しさん
09/01/04 23:06:20
>>738
そんな書き込み要らないから

740:デフォルトの名無しさん
09/01/04 23:07:59
>>737
三角形の中心って外心?
重心なら簡単なんだけど。

741:デフォルトの名無しさん
09/01/04 23:09:05
高校の数学の教科書でも見直せばいいんじゃね?

742:デフォルトの名無しさん
09/01/04 23:26:06
普通に考えて慣性モーメントが最低の軸、つまり重心を通る軸じゃね?

743:デフォルトの名無しさん
09/01/04 23:35:11
なるほど。
でも軸なの?
重心を中心にして点対称に回転させるんじゃないの?

ともかく「三角形の中心」を決めないと。
内心?外心?垂心?重心?傍心?

744:デフォルトの名無しさん
09/01/04 23:41:57
中心が決まったら、あとは「アフィン変換」「回転行列」「クォータニオン」辺りで。

745:デフォルトの名無しさん
09/01/05 00:38:14
>>737
>三角形の中心
中心は5つほどありますが、どれになさいますか

746:デフォルトの名無しさん
09/01/05 00:44:06
傍心は中心じゃないだろw

747:デフォルトの名無しさん
09/01/05 00:48:56
>>746

三角形の中心(さんかくけいのちゅうしん)とは、任意の三角形から一意的に求めることができる点の総称である。単に心または芯とも呼ばれる。

「五心」と呼ばれる点(内心・外心・重心・垂心・傍心)が一般的に広く知られている。


748:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/01/05 00:59:39
まるちうぜえ

750:デフォルトの名無しさん
09/01/05 01:06:24
>文字列や小数などが入り混じったchar型の変数の配列

751:デフォルトの名無しさん
09/01/05 01:19:51
取り出す前に、どうやって入れたのか知りたい

752:デフォルトの名無しさん
09/01/05 01:27:54
そうだな
小数入れる前に構造体にしてフラグ立てとけよカス

753:デフォルトの名無しさん
09/01/05 01:45:18
for(int i = 0; i < 4; i++){
 if(name[i].isFloat())
  name[i].toFile();
}

754:デフォルトの名無しさん
09/01/05 02:49:45
規格書高ぇ・・・

755:デフォルトの名無しさん
09/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:デフォルトの名無しさん
09/01/05 07:10:05
つ wprintf


757:デフォルトの名無しさん
09/01/05 07:20:54
TCHAR 使うんなら _tprintf だろ・・・。
それに、_UNICODE を定義するのなら tchar.h をインクルードする前っつーか、
プロジェクトファイルの設定をいじれ。
_MBCS が定義されてるかもしんないし、混乱の原因になる。

758:デフォルトの名無しさん
09/01/05 07:24:04
(^ー゚)テヘッ

759:デフォルトの名無しさん
09/01/05 08:29:01
か   わ   い   い

760:デフォルトの名無しさん
09/01/05 11:46:49
>>754
X3010なら俺の上でアンアン言ってるぜ

761:デフォルトの名無しさん
09/01/05 13:15:32
それ規格書じゃなくて魔導書じゃね?

762:デフォルトの名無しさん
09/01/05 20:33:37
インデックスか

763:デフォルトの名無しさん
09/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以上の構造体を作ったとしても、どこかの演算に影響を及ぼしてしまうようです。
これは一つの構造体の大きさに上限があるということなのでしょうか?
また、これを解決し、多くのメンバを持つ構造体を宣言する方法などがあれば教えてください。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch