- 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/
- 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
|

|