スレを勃てるまでもないC/C++の質問はここで 5
■ このスレッドは過去ログ倉庫に格納されています
過去ログ
スレを勃てるまでもないC/C++の質問はここで
http://pc11.2ch.net/test/read.cgi/tech/1167476845/
スレを勃てるまでもないC/C++の質問はここで 2
http://pc11.2ch.net/test/read.cgi/tech/1178503366/
スレを勃てるまでもないC/C++の質問はここで 3
http://pc11.2ch.net/test/read.cgi/tech/1187521676/
スレを勃てるまでもないC/C++の質問はここで 4
http://pc11.2ch.net/test/read.cgi/tech/1221633708/
0581デフォルトの名無しさん
2009/01/04(日) 03:46:110582デフォルトの名無しさん
2009/01/04(日) 03:48:03ポインタの正確な定義わ?
0583デフォルトの名無しさん
2009/01/04(日) 03:53:400584デフォルトの名無しさん
2009/01/04(日) 03:56:430585デフォルトの名無しさん
2009/01/04(日) 05:24:400586デフォルトの名無しさん
2009/01/04(日) 05:50:24異論は認めない
0587デフォルトの名無しさん
2009/01/04(日) 05:58:070588デフォルトの名無しさん
2009/01/04(日) 05:59:370589デフォルトの名無しさん
2009/01/04(日) 06:10:51ちゃ〜
0590デフォルトの名無しさん
2009/01/04(日) 06:21:280591デフォルトの名無しさん
2009/01/04(日) 06:33:260592デフォルトの名無しさん
2009/01/04(日) 06:33:540593デフォルトの名無しさん
2009/01/04(日) 06:39:500594デフォルトの名無しさん
2009/01/04(日) 06:44:36>>588と>>589はひどいなww
0595デフォルトの名無しさん
2009/01/04(日) 07:06:34bool
0596デフォルトの名無しさん
2009/01/04(日) 08:34:210597デフォルトの名無しさん
2009/01/04(日) 09:30:43void*
0598デフォルトの名無しさん
2009/01/04(日) 09:31:48特殊相対性理論における時間の遅れ、運動してる物体の速度を入力することによって
運動してる物体の時間の刻みを出すプログラムを作りたのですが、・・C言語で√は使えないのでしょうか・・?
0599デフォルトの名無しさん
2009/01/04(日) 09:34:48確かに特殊相対論は中学生でも理解できるが、お前は別の勉強をした方がいいよ
0600デフォルトの名無しさん
2009/01/04(日) 09:35:150601デフォルトの名無しさん
2009/01/04(日) 09:36:560602デフォルトの名無しさん
2009/01/04(日) 09:43:28サンクス
0603536
2009/01/04(日) 10:55:21丁寧にありがとうございます。
しかによくわからない点があります。
>変数に & を付ける事によって得られるポインタの型は、
>元の変数の型に * をつけた形で表現する。
つまりこれで先ほどの例だと
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型になるのでは?
0604536
2009/01/04(日) 10:57:59>char *c = (char*)p;
int *p = &n; としたのなら、
char*c = (char*)*p もしくはchar*c = (char)*p となるのではないのでしょうか?
0605デフォルトの名無しさん
2009/01/04(日) 11:04:190606536
2009/01/04(日) 11:10:16先ほどの例の場合
int型をchar型にする利点というか意味がわからないのですが
サイズが異なる構造体をキャストしたら中身が全然違うのに型を変えるとか想像がつきません
0607デフォルトの名無しさん
2009/01/04(日) 11:13:34>>580ではないけど、
その日本語だと君がどこまで理解できたのかが分からない
材料は揃ってるようだから、手を動かしたほうがいいよ。
問題の値をそれぞれprintf()してどうなったか、
試すくらいはしてから再度の質問はするものだ
0608デフォルトの名無しさん
2009/01/04(日) 11:18:19演算子の*を混同している・・・・?
0609デフォルトの名無しさん
2009/01/04(日) 11:20:100610デフォルトの名無しさん
2009/01/04(日) 11:28:42p の型は 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 に応じて
正しい型にキャストして使うことができる。
0611536
2009/01/04(日) 11:33:40一つのプログラムでintを宣言する変数なんてたくさんでてくるとおもうのですが、
この場合、intへのポイントとはどうなるのでしょうか?
0612デフォルトの名無しさん
2009/01/04(日) 11:43:30キャストもポインタもないこのコードは理解できる?
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;
}
もっとも共用体が分かるなら最初っから理解できているような気もするけど。
分からなかったら余計混乱する気がするんで無視してくれ。
0613デフォルトの名無しさん
2009/01/04(日) 11:49:45>一つのプログラムでintを宣言する変数なんてたくさんでてくるとおもうのですが、
>この場合、intへのポイントとはどうなるのでしょうか?
そうだね。だから色んな場所を指せるし、指し直したりできる。
char c1;
char c2;
int n;
char *p; /* どこも指してない */
p = &c1; /* c1 のアドレスを指す */
p = &c2; /* c2 のアドレスを指す */
p = (char*)&n; /* n は char型じゃないけどキャストして無理矢理 n の(先頭)アドレスを指す */
0614デフォルトの名無しさん
2009/01/04(日) 12:15:32|二|二|三|三|四|四|七|七|八|八|九|九|發|發|
|萬|萬|萬|萬|萬|萬|索|索|索|索|索|索| | |
これを一盃口を1かたまりで解釈すると二盃口と解釈できるし、
|二|二|三|三|四|四| |七|七|八|八|九|九| |發|發|
|萬|萬|萬|萬|萬|萬| |索|索|索|索|索|索| | | |
全部対子で解釈すると七対子と解釈できる。
|二|二| |三|三| |四|四| |七|七| |八|八| |九|九| |發|發|
|萬|萬| |萬|萬| |萬|萬| |索|索| |索|索| |索|索| | | |
そして、別に役とか関係無しに単に牌が 14 個並んでいるだけだと解釈することもできる。
|二| |二| |三| |三| |四| |四| |七| |七| |八| |八| |九| |九| |發| |發|
|萬| |萬| |萬| |萬| |萬| |萬| |索| |索| |索| |索| |索| |索| | | | |
0615デフォルトの名無しさん
2009/01/04(日) 12:16:14対子を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];
};
という構造体だと見なして解釈しているのに相当する。
0616デフォルトの名無しさん
2009/01/04(日) 12:16:36using 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と、表示されます・・
0617デフォルトの名無しさん
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("七対子として解釈可能です");
0618デフォルトの名無しさん
2009/01/04(日) 12:18:15負の値の平方根はできない
0619デフォルトの名無しさん
2009/01/04(日) 12:18:41ローレンツ変換の前に学ぶことがあると思うんだ。。
0620デフォルトの名無しさん
2009/01/04(日) 12:19:08>>614>>615>>617 の順で読んでくれ。
0621デフォルトの名無しさん
2009/01/04(日) 12:20:49ポインタFAQ用のテンプレとして、是非利用すべきだ
まったく読んでないけど
0622デフォルトの名無しさん
2009/01/04(日) 12:20:59#include <complex.h>
0623デフォルトの名無しさん
2009/01/04(日) 12:25:46cが時速なんで許容範囲のようだ
0624デフォルトの名無しさん
2009/01/04(日) 12:28:520625デフォルトの名無しさん
2009/01/04(日) 12:31:13ごめんなさい・・・
0626536
2009/01/04(日) 12:32:34sockaddrのほうはsa_family
inのほうはsin_family
共通してないきがするのですが、
キャストしても別に扱われるのでは?
0627デフォルトの名無しさん
2009/01/04(日) 12:36:00ファイルを新規に作成し書き込む場合に、
すでに同名のファイルが存在する場合や、ディレクトリーに書き込めない場合に
エラーを返すようにするにはどうすればよいでしょうか?
0628デフォルトの名無しさん
2009/01/04(日) 12:39:18c = 108000000なんで時速kmになってる
0629デフォルトの名無しさん
2009/01/04(日) 12:40:10struct 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)バイト
の領域をその値とする。
呼び方が違うだけで、同じデータ。
0630デフォルトの名無しさん
2009/01/04(日) 12:48:450631536
2009/01/04(日) 12:50:08struct 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)でもいいということかな
0632デフォルトの名無しさん
2009/01/04(日) 12:51:54おまえよっぽど暇なんだな
Cの入門書でも読んどけって、話はそれからだ
で済むと思うんだが
0633デフォルトの名無しさん
2009/01/04(日) 12:51:560634536
2009/01/04(日) 12:52:18麻雀はわからないのですが、*ryanpeko はどこをさしているのでしょうか?
0635デフォルトの名無しさん
2009/01/04(日) 12:52:54fopen_s()の戻り値で判断すればいいんじゃないの?
http://msdn.microsoft.com/ja-jp/library/z5hh6ee9(VS.80).aspx
http://msdn.microsoft.com/ja-jp/library/t3ayayh1(VS.80).aspx
0636デフォルトの名無しさん
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;}
}
0637デフォルトの名無しさん
2009/01/04(日) 12:54:01connect()のソース読めよ
話はそれからだ
0638デフォルトの名無しさん
2009/01/04(日) 12:54:32100% 完全な方法はないと思う。
1. "r" で開いて、開けたら fclose してエラーを返す。
2. "w+" で開いて、開けなかったらエラーを返す。
3. ファイルサイズが 0 でなければ fclose してエラーを返す。
4. "w" で freopen_s する。
がまだましな方法だとは思うが、
1 と 2 の僅かな間にサイズ 0 のファイルを作られたらチェックから漏れる。
0639デフォルトの名無しさん
2009/01/04(日) 12:56:13まあそんなところだ。
sizeof に関しては、sizeof (sockaddr) は危険。
sockaddr_in を渡しているのだから、sizeof (sockaddr_in) にすべき。
0640デフォルトの名無しさん
2009/01/04(日) 13:00:30vが光速より大きいと、v/cが1より大きくなる。そうすると(v/c) * (v/c)が1より大きくなる。
そうすると1.0000000 - (v/c) * (v/c)が負になる。そうすると1 / (1.0000000 - (v/c) * (v/c))が負になる。
そうするとsqrt()の引数が負になって定義域エラーになる。
0641536
2009/01/04(日) 13:02:42これだとなんとか理解できます。こんなめんどくさいことするのはconnectの決まりだからというわけですね。
0642デフォルトの名無しさん
2009/01/04(日) 13:05:20IP以外のプロトコルのアドレスも扱えるようにしてるんじゃないかな
0643デフォルトの名無しさん
2009/01/04(日) 13:12:24おや、話が半日前に戻ったぞw
進歩がないスレだな
0644デフォルトの名無しさん
2009/01/04(日) 13:13:54while(代入式)の人ですね?分かります
0645デフォルトの名無しさん
2009/01/04(日) 13:19:470646デフォルトの名無しさん
2009/01/04(日) 13:21:50無駄だと思うならこのスレに来るなよ馬鹿
0647デフォルトの名無しさん
2009/01/04(日) 13:24:40さあ、次の質問カマーーン!?
0648536
2009/01/04(日) 13:27:41char c2;
int n;
char *p; /* どこも指してない */
p = (char*)&n; /* n は char型じゃないけどキャストして無理矢理 n の(先頭)アドレスを指す */
よく考えたらpはchar *pと宣言しているからpはchar型じゃないか
だったら キャストなんてしなくてもいいんじゃないの?
char *p
p = &n; で
0649デフォルトの名無しさん
2009/01/04(日) 13:30:00自ら試すということをしないところに共通点が。
>>644
オレはレベルの低い質問については回答側だよ。
どっちも実験しようとすれば5分で結果出るじゃん。
初心者歓迎のスレは別にあるのにこのスレの存在意義が
わかんね。
0650デフォルトの名無しさん
2009/01/04(日) 13:34:24ここでそんなことしても意味ないから。
コンパイラへの明確な指示と人間の可読性を考えて
ソースは書くんだよ。
> char *p
> p = &n;
それコンパイル通してみた?
gccなら-Wallつけて、コンパイラがどう言うかちゃんと
向き合いながら勉強しなよ。
0651デフォルトの名無しさん
2009/01/04(日) 13:34:34&nはint*型だから。
それを代入する先の変数pはそれとは異なるchar*型。
そのため、キャストして&nをchar*型にしてやらないといけない。
0652デフォルトの名無しさん
2009/01/04(日) 13:37:310653デフォルトの名無しさん
2009/01/04(日) 13:44:33俺の若いころは、ちょっとバカな質問すると
逝ってよし!
半年ROMれ
とか言われたもんだが
0654デフォルトの名無しさん
2009/01/04(日) 13:47:03一番は、宿題スレ
0655デフォルトの名無しさん
2009/01/04(日) 13:54:22本当だ
初心者歓迎C/C++室の方がレベルが高いw
0656デフォルトの名無しさん
2009/01/04(日) 14:00:010657デフォルトの名無しさん
2009/01/04(日) 14:03:05アホも多いけどレベル高い人もちゃんといる。
0658デフォルトの名無しさん
2009/01/04(日) 14:46:51> 自ら試す
コンパイラが通せば正しいとは限らないんだが・・・
それを指摘されてファビョったキチガイですね?分かります。
0659デフォルトの名無しさん
2009/01/04(日) 14:47:270660デフォルトの名無しさん
2009/01/04(日) 14:50:27キャストしないとワーニングが出るよ
0661デフォルトの名無しさん
2009/01/04(日) 14:54:07正しい場合でもそれと分からないやつにはな・・・
0662デフォルトの名無しさん
2009/01/04(日) 14:56:08配列のサイズを増やしていく方法がわかりません
言語はC++です
このような事は可能なのでしょうか、また出来るなら
どのようにすればいいのかご教示願います
0663デフォルトの名無しさん
2009/01/04(日) 14:59:10std::vector か std::deque 使え。
0664デフォルトの名無しさん
2009/01/04(日) 14:59:240665デフォルトの名無しさん
2009/01/04(日) 15:00:060666デフォルトの名無しさん
2009/01/04(日) 15:04:3283%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
こいつで解決
これにて糸冬 了..._φ(゚∀゚ )
0667デフォルトの名無しさん
2009/01/04(日) 15:06:57URL長すぎ
書籍名を書け
0668662
2009/01/04(日) 15:07:08これで詰んでた課題が進めそうです
0669デフォルトの名無しさん
2009/01/04(日) 15:07:590670デフォルトの名無しさん
2009/01/04(日) 15:10:26amazon の URL を縮める方法も知らない奴は勘弁して欲しい。
http://www.amazon.co.jp/dp/B00008VCD1/
0671デフォルトの名無しさん
2009/01/04(日) 15:12:20今回だけは勘弁してやるから、URLの縮め方をここに書け
0672デフォルトの名無しさん
2009/01/04(日) 15:13:53>>666 と >>670 を見比べりゃ分かるだろ・・・。
0673デフォルトの名無しさん
2009/01/04(日) 15:15:26お前が分かるなら、お前がやり方を書け
0674デフォルトの名無しさん
2009/01/04(日) 15:17:24そうやって法則性を見つける努力を怠るからダメなんだよ。
0675デフォルトの名無しさん
2009/01/04(日) 15:18:18そんな無意味な煽りを書く暇があったら、さっさとやり方を書け
0676URLの気持ち
2009/01/04(日) 15:18:270677デフォルトの名無しさん
2009/01/04(日) 15:19:27そんな無意味な煽りを書く暇があったら、さっさとやり方を考えろ
0678デフォルトの名無しさん
2009/01/04(日) 15:20:230679デフォルトの名無しさん
2009/01/04(日) 15:20:31やり方は考えるものではなく、存在するものだ
解っているなら、さっさと書け
0680デフォルトの名無しさん
2009/01/04(日) 15:21:35やり方は存在するものではなく、考えるものだ
解らないなら、さっさと考えろ
■ このスレッドは過去ログ倉庫に格納されています