C言語なら俺に聞け(入門編)Part 66
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/06/12(土) 19:36:52★前スレ
C言語なら俺に聞け(入門編)Part 65
http://pc12.2ch.net/test/read.cgi/tech/1274976173/
★過去スレ
http://makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000
★初心者、初級者の方は他の質問スレのほうが良いかもしれません。
例えば
【初心者歓迎】C/C++室 Ver.73【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1274395127/
とか
★教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 136代目
http://pc12.2ch.net/test/read.cgi/tech/1274827528/
★C++言語については避けてください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
# 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
# サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
0002デフォルトの名無しさん
2010/06/12(土) 19:57:412 static int foo(
3 int (*say)(char const*),
4 char const*message
5 ) {
6 return say(message);
7 }
8 static int bar(
9 int say(char const*),
10 char const*message) {
11 return say(message);
12 }
13
14 static int baz(char const*message) {
15 return puts(message);
16 }
17 int main(void) {
18 foo(baz, "hello");
19 bar(baz, "world");
20 return 0;
21 }
9行目のsayは、C言語の規格としてはなんと呼ばれていますか
規格のセクションを引用して答えてください
一応、環境とか
cc -Wall -std=c89 -pedantic-errors -c foo.c
cc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48)
0003デフォルトの名無しさん
2010/06/12(土) 20:08:49じゃないの?
第一引数は関数のポインタです って使い方っぽいのだが
0004デフォルトの名無しさん
2010/06/13(日) 02:24:39ポインタ使わずに関数そのものをコールすれば済むことじゃないですか???
0005デフォルトの名無しさん
2010/06/13(日) 02:30:11switch(state)
{
case TITLE:
titile();
break;
case MENU:
menu();
break;
case PLAY:
play();
break;
(延々つづく)
}
================================
state = TITLE;
func[state];
0006デフォルトの名無しさん
2010/06/13(日) 02:31:550007デフォルトの名無しさん
2010/06/13(日) 02:34:44たとえば
titile()とmenu()の関数の型が
int titile(void)
double menu(int)
とかになっていても
state = TITLE;
func[state];
これで実行させることができるの?
さすがに関数の型を合わさないといけないような気がしますが
0008デフォルトの名無しさん
2010/06/13(日) 02:41:430009デフォルトの名無しさん
2010/06/13(日) 02:44:39使う利点なんて無いよ。
0010デフォルトの名無しさん
2010/06/13(日) 02:48:28今はコンパイラが勝手にテーブルにしたり、そこまで速度を気にしなくてもよくなったり
0011デフォルトの名無しさん
2010/06/13(日) 02:51:550012デフォルトの名無しさん
2010/06/13(日) 02:55:04一部の関数の型を変えないといけなくなった。そうなったときに
こうなったとき修正がめっちゃやばそうなが気がします
0013デフォルトの名無しさん
2010/06/13(日) 02:55:15速度を極力落とさずに分岐する手段として使うけどね。
0014デフォルトの名無しさん
2010/06/13(日) 03:01:540015デフォルトの名無しさん
2010/06/13(日) 03:06:360016デフォルトの名無しさん
2010/06/13(日) 03:27:040017デフォルトの名無しさん
2010/06/13(日) 07:41:160018デフォルトの名無しさん
2010/06/13(日) 08:48:28今のCPUのようにパイプライン段数が深くなったCPUでは、関数ポインタの
呼び出しの時に一度パイプラインをフラッシュして投機実行も破棄してしま
うのでパフォーマンスは落ちる
C++の仮想関数も同じ仕組みを使っているから、パフォーマンスを最大限に
追求する場面では仮想関数はあまり使わない
http://gigo.retrogames.com/t_lab/chapter2.html
でも上記のようなURLを見るとあまり関係ないようである
実際Cのqsort()とC++のsort()ではsort()の方が速いが、それは関数ポインタ
による物ではなく、主にデータのコピー方法によるものである
qsort()はバイト単位でコピーするが、sort()はtemplateを使っているので
それぞれのデータ型に最も適した方法でコピーするから速いのである
0019デフォルトの名無しさん
2010/06/13(日) 08:50:21乗る前がものすごく遅いだけで、一度L2キャッシュにテーブルが乗って
しまえば、以降の呼び出しは同じラインによって上書きされない限り
それほど気になるコストは掛からないと言える
0020デフォルトの名無しさん
2010/06/13(日) 09:23:26構造体を使わないからだよ
0021デフォルトの名無しさん
2010/06/13(日) 10:51:21つqsort()
0022デフォルトの名無しさん
2010/06/13(日) 10:56:210023デフォルトの名無しさん
2010/06/13(日) 11:03:22見た目のグロさに過剰反応してしまう奴が後を絶たない
0024デフォルトの名無しさん
2010/06/13(日) 13:02:150025デフォルトの名無しさん
2010/06/13(日) 13:09:090026デフォルトの名無しさん
2010/06/13(日) 13:21:39龍神録の9章を参考にコンフィグを作っています。
が、2P(player_flag==1)コンフィグ用の configpad.◯◯[1] に値が代入されません。
少々分かりづらくて恐縮ですが、対応策をお願いします。
また1P(player_flag==0)は問題なく動きます。
0027デフォルトの名無しさん
2010/06/13(日) 13:28:56それ言うためだけに書き込むのか・・・・・
0028デフォルトの名無しさん
2010/06/13(日) 14:04:190029デフォルトの名無しさん
2010/06/13(日) 14:05:37それ言うためだけに書き込むのか・・・・・
0030デフォルトの名無しさん
2010/06/13(日) 14:28:56それ言うためだけに書き込むのか・・・・・
0031デフォルトの名無しさん
2010/06/13(日) 14:30:310032デフォルトの名無しさん
2010/06/13(日) 14:35:01マジで一言多いから自重してほしい
0033デフォルトの名無しさん
2010/06/13(日) 14:38:49煽るだけで何もできない奴と
余計な一言付ける奴とがいる
0034デフォルトの名無しさん
2010/06/13(日) 14:40:09アドバイスはちゃんとしてるのに余計なこと付け加えるヤツと、>>25みたいなのが居るよな
0035デフォルトの名無しさん
2010/06/13(日) 14:41:04そのソースでない所にある、configpad.◯◯[1]に代入してる所でミスってるんじゃないかな
if(player_flag==0){return pad_2.key[Handle}
else if(player_flag==1){return pad_2.key[Handle}
どっちもpad_2.key返してるけど、ここも気になる
0036デフォルトの名無しさん
2010/06/13(日) 14:45:15お前らまとめてどっか行けよ
0037デフォルトの名無しさん
2010/06/13(日) 14:46:42ワロタw
0038デフォルトの名無しさん
2010/06/13(日) 14:47:220039デフォルトの名無しさん
2010/06/13(日) 14:52:090040デフォルトの名無しさん
2010/06/13(日) 14:53:070041デフォルトの名無しさん
2010/06/13(日) 14:54:250042デフォルトの名無しさん
2010/06/13(日) 14:55:11お前らいい加減にしろよ
0043デフォルトの名無しさん
2010/06/13(日) 14:56:081pが動くときは
if(player_flag==0){return pad.key[Handle}
else if(player_flag==1){return pad_2.key[Handle}
こうなってます。確認のため一時的にpad_2にしましたすいません。
>そのソースでない所にある、configpad.◯◯[1]に代入してる所でミスってるんじゃないかな
その通りでした。
5時間くらいずっと悩んでましたがおかげさまでうまくいきました。
以下を書き足したらすんなりと・・・。
configpad.down[1]=0;
configpad.left[1]=1;
configpad.right[1]=2;
configpad.up[1]=3;
configpad.bom[1]=4;
configpad.shot[1]=5;
configpad.slow[1]=11;
configpad.start[1]=13;
configpad.change[1]=6;
ありがとうございました。
0044デフォルトの名無しさん
2010/06/13(日) 14:56:30お前ら(ry
馬鹿すぎw
0045デフォルトの名無しさん
2010/06/13(日) 15:03:180046デフォルトの名無しさん
2010/06/13(日) 15:12:36お前らどっかいけよ
0047デフォルトの名無しさん
2010/06/13(日) 15:14:08お前どっかいけよ
0048デフォルトの名無しさん
2010/06/13(日) 15:16:360049デフォルトの名無しさん
2010/06/13(日) 15:26:170050デフォルトの名無しさん
2010/06/13(日) 15:28:400051デフォルトの名無しさん
2010/06/13(日) 16:23:17http://www.nicovideo.jp/watch/nm6415611
自分でやったんだけど何故か除算が表示されないんです。↓
#include<stdio.h>
double tasizan(double x, double y);
double hikizan(double x, double y);
double kakezan(double x, double y);
double warizan(double x, double y);
int main(void){double a,b;scanf("%lf&lf",&a,&b);
printf("加算:%f\n",tasizan(a,b));printf("減算:%f\n",hikizan(a,b));
printf("乗算:%f\n",kakezan(a,b));printf("除算:%f\n",warizan(a,b));return 0;}
double tasizan(double x,double y){
double answer;
answer=x+y;
return answer;}
double hikizan(double x,double y){
double answer;
answer=x-y;
return answer;}
double kakezan(double x,double y){
double answer;
answer=x*y;
return answer;}
double warizan(double x,double y){
double answer;
if(y==0){
printf("ゼロ除算エラー\n");
answer=0.0;}else{answer=x/y;}return answer;}
何処が間違ってるか教えて下さい!!
005251
2010/06/13(日) 16:24:41見辛くてすいませんがどうかヨロシクお願いします!
0053デフォルトの名無しさん
2010/06/13(日) 16:25:250054デフォルトの名無しさん
2010/06/13(日) 16:26:08#include<math.h>
つけてみろカス
0055デフォルトの名無しさん
2010/06/13(日) 16:28:34005651
2010/06/13(日) 16:37:30ハズレの時に来ちゃったか
ありがとうございましたー
0057デフォルトの名無しさん
2010/06/13(日) 16:40:54warizan()のif(y==0)も怪しい
0058デフォルトの名無しさん
2010/06/13(日) 16:44:310059デフォルトの名無しさん
2010/06/13(日) 18:36:58scanf("%c",a[x]);
みたいに使えないんだけど
0060デフォルトの名無しさん
2010/06/13(日) 18:46:210061デフォルトの名無しさん
2010/06/13(日) 18:48:280062デフォルトの名無しさん
2010/06/13(日) 19:34:006行目のscanfの %記号
scanf("%lf&lf",&a,&b);
↓
scanf("%lf%lf",&a,&b);
0063デフォルトの名無しさん
2010/06/13(日) 20:11:26全部 gets でやらせろ。
0064デフォルトの名無しさん
2010/06/13(日) 20:16:130065デフォルトの名無しさん
2010/06/13(日) 20:22:390066デフォルトの名無しさん
2010/06/13(日) 21:13:570067デフォルトの名無しさん
2010/06/13(日) 21:15:480068デフォルトの名無しさん
2010/06/13(日) 21:19:28|= ~たしてる値
0069デフォルトの名無しさん
2010/06/13(日) 21:20:53&= ~たしてる値
0070デフォルトの名無しさん
2010/06/13(日) 21:21:43a |= b;
a &= ~b;
0071デフォルトの名無しさん
2010/06/13(日) 21:30:16何も知らない初心者にいきなりポインタ教えるのは酷というもの。
0072デフォルトの名無しさん
2010/06/13(日) 21:31:400073デフォルトの名無しさん
2010/06/13(日) 22:25:54gets()がダメな理由が、引数がポインタだからってことだったら、fgets()とかなにもかもダメだろ。
0074デフォルトの名無しさん
2010/06/13(日) 22:33:270075デフォルトの名無しさん
2010/06/13(日) 22:37:410076デフォルトの名無しさん
2010/06/13(日) 22:56:390077デフォルトの名無しさん
2010/06/13(日) 23:08:36getintとすべきでは?
0078デフォルトの名無しさん
2010/06/13(日) 23:11:421. 戻り値としてEOFの可能性がある。
2. 昔はchar型を戻り値とすることができなかった。
0079デフォルトの名無しさん
2010/06/13(日) 23:16:200080デフォルトの名無しさん
2010/06/13(日) 23:17:37いわれてみれば戻り値がcharの標準関数ってみたことないな。
0081デフォルトの名無しさん
2010/06/13(日) 23:23:000082デフォルトの名無しさん
2010/06/14(月) 00:42:010084デフォルトの名無しさん
2010/06/14(月) 05:10:55cstl
使ったことはないけどな!
0085デフォルトの名無しさん
2010/06/14(月) 06:13:12a=1;
b=1;
a|=b; // a == 1;
a&=~b; // a == 0;
足したのを引いたつもりがずいぶん引かれてしまったように見える。
質問があいまいだからこれでもよかったのかもしれないし、違った(足す前の状態に戻したかった)のかもしれない。
0086デフォルトの名無しさん
2010/06/14(月) 07:20:15前のに戻したいなら前のを覚えとけ
0087デフォルトの名無しさん
2010/06/14(月) 07:40:38足した時点で足されてないのが原因では
0088デフォルトの名無しさん
2010/06/14(月) 08:35:31float a = -1.5;
long* t = (long*)&a;
t &= 0x7FFFFFFF; // これで a=1.5 になる
これは問題ある?
互換性とか
008988
2010/06/14(月) 08:37:18誤)t &= 0x7FFFFFFF;
正)*t &= 0x7FFFFFFF;
0090デフォルトの名無しさん
2010/06/14(月) 09:44:57IEEE754ならそれでいいけど、他の浮動小数点フォーマットの場合も
多々あるので互換性はない
0091デフォルトの名無しさん
2010/06/14(月) 10:56:49x86みたいに実数演算プロセッサが別にある場合、一旦メインメモリに転送しないといけなくなるので無駄に遅くなる恐れがある。
そうでなくても、fabs()自体が高速に実行できるように実装されているはずだから特にメリットはない。
0092デフォルトの名無しさん
2010/06/14(月) 10:59:170093デフォルトの名無しさん
2010/06/14(月) 13:14:16フラグ倒すだけならXOR使うでしょ普通。
>>87
え?
0094デフォルトの名無しさん
2010/06/14(月) 16:44:29え?
0095デフォルトの名無しさん
2010/06/14(月) 17:05:06> >>86
> フラグ倒すだけならXOR使うでしょ普通。
え?
> >>87
> え?
うん
0096デフォルトの名無しさん
2010/06/14(月) 17:39:08これ使わなかったらどうなるの?関数を多用する時にとりあえず
*つけとけばいいんですか?
0097デフォルトの名無しさん
2010/06/14(月) 17:47:080098デフォルトの名無しさん
2010/06/14(月) 18:15:01これ使わなかったらどうなるにゃ?関数を多用する時にとりあえず
*つけとけばいいのかにゃ?
0099デフォルトの名無しさん
2010/06/14(月) 18:20:590100デフォルトの名無しさん
2010/06/14(月) 18:26:41(゚、 。`フ _
_」、 "∨
└じl_r' ,)
0101デフォルトの名無しさん
2010/06/14(月) 18:30:15例えば、printf("Hello!\n");と書いたとき、あんたは既にポインタを使っている。
■ このスレッドは過去ログ倉庫に格納されています