c言語初心者の俺
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/07/02(日) 23:27:25まず俺のPCでcを組めるようにしたいんだが
0002デフォルトの名無しさん
2006/07/02(日) 23:32:300003デフォルトの名無しさん
2006/07/02(日) 23:34:090004デフォルトの名無しさん
2006/07/03(月) 00:11:520005デフォルトの名無しさん
2006/07/03(月) 00:12:24?
0006デフォルトの名無しさん
2006/07/03(月) 00:17:10よくわからんが分かった
てか、一応学校でcは勉強してるんだ
だから家のPCでcを組めるようにしたんだ
0007デフォルトの名無しさん
2006/07/03(月) 00:19:33「はじめてのC」下さい、って成人誌コーナーの店員に聞くときっと勘違いされるよ!
0008デフォルトの名無しさん
2006/07/03(月) 08:04:23学校の実行環境に合わせるのがよいぞえ
0009デフォルトの名無しさん
2006/07/03(月) 13:01:240010デフォルトの名無しさん
2006/07/03(月) 18:20:200011デフォルトの名無しさん
2006/07/03(月) 20:10:52お前さんにぴったりのソフトとを見つけてきてやったぞ。
ありがたく思え
ttp://www.4gamer.net/patch/demo/pokemon/pokemon.shtml
これが終わったら検索の練習をすると良いぞ。
0012デフォルトの名無しさん
2006/07/18(火) 20:42:06今日一日ずっとK&Rの下のところが理解できずに悩んでた
(int (*)(void *,void *))(numeric ? numcmp : strcmp)
やるならこうなんじゃないかと
(int (*(numeric ? numcmp : strcmp))(void *,void *))
ぐぐったら全く同じこと考えてた人までいた
結局関数の引数(の型)をキャストしてるらしいってことで理解
単純に(int)〜とか(double)〜だけだと思ってたが、キャストっていろいろできるんだなぁ…
チラシの裏終り
0013デフォルトの名無しさん
2006/07/18(火) 21:58:110014デフォルトの名無しさん
2006/07/18(火) 23:29:18間違っている。それは、関数ポインタにキャストしているのであって引き数リストをキャストしているわけではない。
いずれにしても、本来そんなキャストは書かないでいいようにプログラミングするべきだとは思うのだが。
0015デフォルトの名無しさん
2006/07/19(水) 00:29:38>>13
そう、エラーになるからなんでかなーって。
>>14
>関数ポインタに〜
えっとつまり、このキャストで関数としての宣言自体を変更させてるってこと?
>いずれにしても〜
バイブルとか言われているらしいし模範例はこういう書き方なのなんだなと感心した俺って一体…
001614
2006/07/19(水) 00:55:49それが理由で、C++にはわざわざ長い名前のキャスト演算子が追加されたのだし。
0018デフォルトの名無しさん
2006/07/19(水) 02:21:14int numcmp(void *, void *);
int strcmp(void *, void *);
の二つを numeric の値によって動的に使い分けている
0019デフォルトの名無しさん
2006/07/19(水) 10:11:58#include <stdio.h>
char f();
int main(){
void (*fp)();
fp=(int *())f;
return 0;}
char f(){return 0;}
キャストできねーよヴォケ、だそうです。
俺の存在以外の何が悪いんでしょうか。
0020デフォルトの名無しさん
2006/07/19(水) 10:15:08fp=(char *())f; だった
voidは他のポインタをキャスト可能ってあるんだけどなぁ…
002114
2006/07/19(水) 10:18:19頭。
fpはどんな関数ポインタか、fはどんな関数か、どんな関数ポインタにキャストしているのか考えよ。
これから出勤するからお昼頃までに答えを出しておくように。
0022デフォルトの名無しさん
2006/07/19(水) 11:18:12char f();
int main()
{
void (*fp)();
fp = (void (*)())f;
fp();
return 0;
}
char f()
{
printf("f");
return 1;
}
0023デフォルトの名無しさん
2006/07/19(水) 11:30:56char f();
int main()
{
void (*fp)();
fp = (void (*)())f;
fprintf(stdout, "%d", ((char (*)())fp)());
return 0;
}
char f()
{
printf("f");
return 1;
}
0024デフォルトの名無しさん
2006/07/19(水) 11:34:13>>21
fpはvoidを返す関数への関数ポインタで、fはcharを返す関数
で、fp=(void *())f;/*charのところvoidに訂正*/としてfのアドレスをvoidを返す関数のアドレスにキャストする
という動作のつもり、でも通らない
試しにfp=fとすると型が違いますって警告出るけど通るってことは描き方が間違っているのかな
と思ったら>>22キタ━━━━(゚∀゚)━━━━ッ!!
そっかfp=(char (*)())f;って*を更に括弧で括って関数を逆参照していることを明示しないといけなかったのか!
おまいらなんてやさしいんだー
0025デフォルトの名無しさん
2006/07/19(水) 11:36:14>>23
試してみる
002612=25
2006/07/19(水) 12:02:18次にfをvoidを返す関数のアドレスにキャストしてから、関数ポインタfpに代入する
さらにその関数ポインタfpをchar型の関数への関数ポインタにキャストすることで
関数fを呼び出せるようにして、関数fを実行し、その返り値がfprintfで整数値として出力される
でいいのかな
002714
2006/07/19(水) 12:45:27「void型の関数」、「voidを返す関数」とか「char型の関数」が微妙だけど。
あと、「アドレスにキャスト」も変だな。
ポインタのキャストの場合、一般的に型は変わっても値そのものは変わらないわけだから。
呼び出しの下りはこんな感じかな。
戻り値のない関数へのポインタであるfpを、戻り値がchar型である関数へのポインタとしてキャストすることで
戻り値がchar型である関数と見なして呼び出し、その戻り値をint型に暗黙の型変換してfprintf()への引き数とする。
#実際には引き数リストも宣言すべきだから、typedefを使って型を定義しておくのが無難なんだけどね。
##それ以前に必要のないキャストは……って、これは前に書いたか。
0028デフォルトの名無しさん
2006/07/19(水) 12:58:02オブジェクト指向で言うところのアブストラクトクラスみたいなもの
002912
2006/07/19(水) 13:01:33f元々は関数だからごちゃごちゃ表現を付け加えいいわけですね
>>26の二行目を直すと
fを何も返さない関数にキャストし、その値をfpに代入する
あ、確かにこっちの方が分かりやすい
チラシの裏書いただけなのに、誤解が解けただけじゃなくすごい理解深まったよ
このスレ永久保存にする、おまいらありがとうございました
0030デフォルトの名無しさん
2006/07/19(水) 13:02:15単にキャストせずに初めから型を揃えておけって話だろ。
>14に既にそう書かれている。
003112
2006/07/19(水) 13:09:51まあこれは関数ポインタのキャストを自分なりに理解しようとして書いたことなので…
>>14については>>18さんの言うとおり引数の方はともかく関数の返り値の型は統一されてます
あそこだけ抜き出したから俺が勘違いの元生んでる、スマソ
0032デフォルトの名無しさん
2006/07/19(水) 13:10:250033デフォルトの名無しさん
2006/07/19(水) 13:12:05qsort の定義を見てみるのもいいよ
0034デフォルトの名無しさん
2006/07/19(水) 13:13:21void qsort(void *base, size_t num, size_t size, int (*compare)(const void*, const void*));
003512
2006/07/19(水) 13:40:58ありがとう
(引数にvoid*をもつ)関数ポインタをqsortに使う比較関数の仮引数の定義に使うことで
どんな比較関数も代入できるようにしたって風に理解しますた
size_tはまだ学んでないのでその内…
>>32
いや全く。
0036デフォルトの名無しさん
2006/07/19(水) 14:14:19問題の numeric ? 云々は
qsort(array, len, sizeof(), (int (*)(void *,void *))(numeric ? numcmp : strcmp));
っていう風に使うんじゃないの?
003712
2006/07/19(水) 14:56:15うん、numericが1か0かによって関数numcmpかstrcmpを評価して
それを(引数としてvoid *を二つ持つ)戻り値がint型である関数、のポインタにキャストする
で今度こそ納得、したはず。
(int (*(numeric ? numcmp : strcmp))(引数 , 引数))
みたいな書き方だと*がすぐ隣のカッコの逆参照になり(引数,引数)を巻き込めない
だから全体が関数を指し示していることにならず、結局syntaxエラーになるから間違い
でいいのかな
■ このスレッドは過去ログ倉庫に格納されています