2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

c言語初心者の俺

1 :デフォルトの名無しさん:2006/07/02(日) 23:27:25
c言語初心者の俺に教えてくれ
まず俺のPCでcを組めるようにしたいんだが

2 :デフォルトの名無しさん:2006/07/02(日) 23:32:30
VC++2005EEを薦めるべきかBC++を薦めるべきか

3 :デフォルトの名無しさん:2006/07/02(日) 23:34:09
cはちょこっとできるんが

4 :デフォルトの名無しさん:2006/07/03(月) 00:11:52
白が好きならVCで黒が好きならBCでいいよ

5 :デフォルトの名無しさん:2006/07/03(月) 00:12:24
>>4


6 :デフォルトの名無しさん:2006/07/03(月) 00:17:10
>>4
よくわからんが分かった

てか、一応学校でcは勉強してるんだ
だから家のPCでcを組めるようにしたんだ

7 :デフォルトの名無しさん:2006/07/03(月) 00:19:33
じゃあ次は参考書だな。
「はじめてのC」下さい、って成人誌コーナーの店員に聞くときっと勘違いされるよ!

8 :デフォルトの名無しさん:2006/07/03(月) 08:04:23
>>6
学校の実行環境に合わせるのがよいぞえ


9 :デフォルトの名無しさん:2006/07/03(月) 13:01:24
初心者こそ金を出して、まともな開発環境を購入すべき。

10 :デフォルトの名無しさん:2006/07/03(月) 18:20:20
なぜ学校の先生に相談しないんだ?

11 :デフォルトの名無しさん:2006/07/03(月) 20:10:52
>>1
お前さんにぴったりのソフトとを見つけてきてやったぞ。
ありがたく思え
ttp://www.4gamer.net/patch/demo/pokemon/pokemon.shtml

これが終わったら検索の練習をすると良いぞ。

12 :デフォルトの名無しさん:2006/07/18(火) 20:42:06
過疎ってるようなので初心者の俺がチラシの裏

今日一日ずっとK&Rの下のところが理解できずに悩んでた

(int (*)(void *,void *))(numeric ? numcmp : strcmp)

やるならこうなんじゃないかと

(int (*(numeric ? numcmp : strcmp))(void *,void *))

ぐぐったら全く同じこと考えてた人までいた
結局関数の引数(の型)をキャストしてるらしいってことで理解
単純に(int)〜とか(double)〜だけだと思ってたが、キャストっていろいろできるんだなぁ…

チラシの裏終り

13 :デフォルトの名無しさん:2006/07/18(火) 21:58:11
後者はエラーになるような

14 :デフォルトの名無しさん:2006/07/18(火) 23:29:18
>>12
間違っている。それは、関数ポインタにキャストしているのであって引き数リストをキャストしているわけではない。
いずれにしても、本来そんなキャストは書かないでいいようにプログラミングするべきだとは思うのだが。

15 :デフォルトの名無しさん:2006/07/19(水) 00:29:38
まさかレスつくとは思わなかった…おまいらありがとうございます
>>13
そう、エラーになるからなんでかなーって。

>>14
>関数ポインタに〜
えっとつまり、このキャストで関数としての宣言自体を変更させてるってこと?

>いずれにしても〜
バイブルとか言われているらしいし模範例はこういう書き方なのなんだなと感心した俺って一体…

16 :14:2006/07/19(水) 00:55:49
文脈読んでないから判らんが、キャストは最後の手段と思ったほうがいい。
それが理由で、C++にはわざわざ長い名前のキャスト演算子が追加されたのだし。

17 :12:2006/07/19(水) 01:14:42
ああそっか、ポインタってポインタ型なわけか…
>>16
後半はC++やってないから分からないけど、言いたいことはわかったよ、夜更けにthx。

18 :デフォルトの名無しさん:2006/07/19(水) 02:21:14
今でいうところの関数テンプレートだよ

int numcmp(void *, void *);

int strcmp(void *, void *);

の二つを numeric の値によって動的に使い分けている


19 :デフォルトの名無しさん:2006/07/19(水) 10:11:58
どうやら理解できてなかったようだ…orz
#include <stdio.h>
char f();
int main(){
void (*fp)();
fp=(int *())f;
return 0;}
char f(){return 0;}

キャストできねーよヴォケ、だそうです。
俺の存在以外の何が悪いんでしょうか。

20 :デフォルトの名無しさん:2006/07/19(水) 10:15:08
ああ書き間違えた、5行目は
fp=(char *())f; だった
voidは他のポインタをキャスト可能ってあるんだけどなぁ…

21 :14:2006/07/19(水) 10:18:19
>>19
頭。
fpはどんな関数ポインタか、fはどんな関数か、どんな関数ポインタにキャストしているのか考えよ。
これから出勤するからお昼頃までに答えを出しておくように。

22 :デフォルトの名無しさん:2006/07/19(水) 11:18:12
#include <stdio.h>

char f();

int main()
{
void (*fp)();
fp = (void (*)())f;
fp();
return 0;
}

char f()
{
printf("f");
return 1;
}

23 :デフォルトの名無しさん:2006/07/19(水) 11:30:56
#include <stdio.h>

char f();

int main()
{
void (*fp)();
fp = (void (*)())f;
fprintf(stdout, "%d", ((char (*)())fp)());
return 0;
}

char f()
{
printf("f");
return 1;
}

24 :デフォルトの名無しさん:2006/07/19(水) 11:34:13
また間違えてる、>>20は書くならfp=(char *())f; じゃないか…ってこれでもだめか
>>21
fpはvoidを返す関数への関数ポインタで、fはcharを返す関数
で、fp=(void *())f;/*charのところvoidに訂正*/としてfのアドレスをvoidを返す関数のアドレスにキャストする
という動作のつもり、でも通らない
試しにfp=fとすると型が違いますって警告出るけど通るってことは描き方が間違っているのかな


と思ったら>>22キタ━━━━(゚∀゚)━━━━ッ!!

そっかfp=(char (*)())f;って*を更に括弧で括って関数を逆参照していることを明示しないといけなかったのか!
おまいらなんてやさしいんだー

25 :デフォルトの名無しさん:2006/07/19(水) 11:36:14
だからfp=(char (*)())f;じゃねぇよfp=(void (*)())f;だよ何度間違えれば気が済むんだ俺はorz
>>23
試してみる

26 :12=25:2006/07/19(水) 12:02:18
>>23はまずvoid型の関数への関数ポインタfpを定義する
次にfをvoidを返す関数のアドレスにキャストしてから、関数ポインタfpに代入する
さらにその関数ポインタfpをchar型の関数への関数ポインタにキャストすることで
関数fを呼び出せるようにして、関数fを実行し、その返り値がfprintfで整数値として出力される

でいいのかな

27 :14:2006/07/19(水) 12:45:27
お、大分進んだじゃん。
「void型の関数」、「voidを返す関数」とか「char型の関数」が微妙だけど。
あと、「アドレスにキャスト」も変だな。
ポインタのキャストの場合、一般的に型は変わっても値そのものは変わらないわけだから。
呼び出しの下りはこんな感じかな。
戻り値のない関数へのポインタであるfpを、戻り値がchar型である関数へのポインタとしてキャストすることで
戻り値がchar型である関数と見なして呼び出し、その戻り値をint型に暗黙の型変換してfprintf()への引き数とする。
#実際には引き数リストも宣言すべきだから、typedefを使って型を定義しておくのが無難なんだけどね。
##それ以前に必要のないキャストは……って、これは前に書いたか。

28 :デフォルトの名無しさん:2006/07/19(水) 12:58:02
(void (*)()) にキャストすることは不必要とは言えない

オブジェクト指向で言うところのアブストラクトクラスみたいなもの

29 :12:2006/07/19(水) 13:01:33
>>27
f元々は関数だからごちゃごちゃ表現を付け加えいいわけですね

>>26の二行目を直すと
fを何も返さない関数にキャストし、その値をfpに代入する

あ、確かにこっちの方が分かりやすい

チラシの裏書いただけなのに、誤解が解けただけじゃなくすごい理解深まったよ
このスレ永久保存にする、おまいらありがとうございました

30 :デフォルトの名無しさん:2006/07/19(水) 13:02:15
>>28
単にキャストせずに初めから型を揃えておけって話だろ。
>14に既にそう書かれている。

31 :12:2006/07/19(水) 13:09:51
>>30でやっと意味分かった
まあこれは関数ポインタのキャストを自分なりに理解しようとして書いたことなので…
>>14については>>18さんの言うとおり引数の方はともかく関数の返り値の型は統一されてます
あそこだけ抜き出したから俺が勘違いの元生んでる、スマソ

32 :デフォルトの名無しさん:2006/07/19(水) 13:10:25
ここは勉強になるスレですね

33 :デフォルトの名無しさん:2006/07/19(水) 13:12:05
>>12
qsort の定義を見てみるのもいいよ


34 :デフォルトの名無しさん:2006/07/19(水) 13:13:21

void qsort(void *base, size_t num, size_t size, int (*compare)(const void*, const void*));



35 :12:2006/07/19(水) 13:40:58
>>33-34
ありがとう
(引数にvoid*をもつ)関数ポインタをqsortに使う比較関数の仮引数の定義に使うことで
どんな比較関数も代入できるようにしたって風に理解しますた
size_tはまだ学んでないのでその内…

>>32
いや全く。

36 :デフォルトの名無しさん:2006/07/19(水) 14:14:19
>>12

問題の numeric ? 云々は

qsort(array, len, sizeof(), (int (*)(void *,void *))(numeric ? numcmp : strcmp));

っていう風に使うんじゃないの?



37 :12:2006/07/19(水) 14:56:15
>>36
うん、numericが1か0かによって関数numcmpかstrcmpを評価して
それを(引数としてvoid *を二つ持つ)戻り値がint型である関数、のポインタにキャストする
で今度こそ納得、したはず。

(int (*(numeric ? numcmp : strcmp))(引数 , 引数))
みたいな書き方だと*がすぐ隣のカッコの逆参照になり(引数,引数)を巻き込めない
だから全体が関数を指し示していることにならず、結局syntaxエラーになるから間違い
でいいのかな

11 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)