スレを勃てるまでもな ..
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
それ規格書じゃなくて魔導書じゃね?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5371日前に更新/192 KB
担当:undef