トップページ⇒tech
1001コメント247KB

C言語なら俺に聞け(入門編)Part 66

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/06/12(土) 19:36:52
C言語の*入門者*向け解説スレッドです。
★前スレ
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:41
1  #include <stdio.h>
2  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
int (*say)(char const*)
じゃないの?

第一引数は関数のポインタです  って使い方っぽいのだが
0004デフォルトの名無しさん2010/06/13(日) 02:24:39
関数ポインタの必要性が分かりません。
ポインタ使わずに関数そのものをコールすれば済むことじゃないですか???
0005デフォルトの名無しさん2010/06/13(日) 02:30:11
配列に入れたときに力を発揮する。

switch(state)
{
  case TITLE:
    titile();
    break;
  case MENU:
    menu();
    break;
  case PLAY:
    play();
    break;
  (延々つづく)
}
================================
state = TITLE;

func[state];
0006デフォルトの名無しさん2010/06/13(日) 02:31:55
func[state]();の間違い
0007デフォルトの名無しさん2010/06/13(日) 02:34:44
>>5
たとえば
titile()とmenu()の関数の型が
int titile(void)
double menu(int)
とかになっていても

state = TITLE;
func[state];
これで実行させることができるの?
さすがに関数の型を合わさないといけないような気がしますが
0008デフォルトの名無しさん2010/06/13(日) 02:41:43
合わさないとダメだね
0009デフォルトの名無しさん2010/06/13(日) 02:44:39
そういうことやりたがるやつはむしろ素人だね。
使う利点なんて無いよ。
0010デフォルトの名無しさん2010/06/13(日) 02:48:28
昔は有効な書き方だったんだよ
今はコンパイラが勝手にテーブルにしたり、そこまで速度を気にしなくてもよくなったり
0011デフォルトの名無しさん2010/06/13(日) 02:51:55
じゃあ延々と条件分岐書いて無駄に残業してろ
0012デフォルトの名無しさん2010/06/13(日) 02:55:04
最初は5のようなコード組んでたが、あとで仕様変更が起こって
一部の関数の型を変えないといけなくなった。そうなったときに
こうなったとき修正がめっちゃやばそうなが気がします
0013デフォルトの名無しさん2010/06/13(日) 02:55:15
今でも究極のパフォーマンスを狙う用途では
速度を極力落とさずに分岐する手段として使うけどね。
0014デフォルトの名無しさん2010/06/13(日) 03:01:54
無いな。
0015デフォルトの名無しさん2010/06/13(日) 03:06:36
コールバック関数を使う利点はないと?
0016デフォルトの名無しさん2010/06/13(日) 03:27:04
とりあえず qsort 使ってみようぜ
0017デフォルトの名無しさん2010/06/13(日) 07:41:16
どうしてもstatic変数を排除出来ない式に成ったとき関数ポインタ使って回避する。
0018デフォルトの名無しさん2010/06/13(日) 08:48:28
>>13
今の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キャッシュに
乗る前がものすごく遅いだけで、一度L2キャッシュにテーブルが乗って
しまえば、以降の呼び出しは同じラインによって上書きされない限り
それほど気になるコストは掛からないと言える
0020デフォルトの名無しさん2010/06/13(日) 09:23:26
>>12
構造体を使わないからだよ
0021デフォルトの名無しさん2010/06/13(日) 10:51:21
>>9
つqsort()
0022デフォルトの名無しさん2010/06/13(日) 10:56:21
>>16
0023デフォルトの名無しさん2010/06/13(日) 11:03:22
不完全型へのポインタの一種でしかないんだが
見た目のグロさに過剰反応してしまう奴が後を絶たない
0024デフォルトの名無しさん2010/06/13(日) 13:02:15
早くC++まで勉強して競馬ゲー作りたいわ
0025デフォルトの名無しさん2010/06/13(日) 13:09:09
お前じゃ無理だろw
0026デフォルトの名無しさん2010/06/13(日) 13:21:39
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.cgi?mode=thr&no=9382

龍神録の9章を参考にコンフィグを作っています。
が、2P(player_flag==1)コンフィグ用の configpad.◯◯[1] に値が代入されません。
少々分かりづらくて恐縮ですが、対応策をお願いします。
また1P(player_flag==0)は問題なく動きます。
0027デフォルトの名無しさん2010/06/13(日) 13:28:56
>>25
それ言うためだけに書き込むのか・・・・・
0028デフォルトの名無しさん2010/06/13(日) 14:04:19
うん
0029デフォルトの名無しさん2010/06/13(日) 14:05:37
>>27
それ言うためだけに書き込むのか・・・・・
0030デフォルトの名無しさん2010/06/13(日) 14:28:56
>>29
それ言うためだけに書き込むのか・・・・・
0031デフォルトの名無しさん2010/06/13(日) 14:30:31
>>25みたいなカスのせいでスレが荒れるとか。煽りたいだけの中学生とか放っとけよ
0032デフォルトの名無しさん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
>>26
そのソースでない所にある、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
>>27-34
お前らまとめてどっか行けよ
0037デフォルトの名無しさん2010/06/13(日) 14:46:42
>>36
ワロタw
0038デフォルトの名無しさん2010/06/13(日) 14:47:22
ワロタのは>>36が>>25だと思ったから。違ったらごめんね
0039デフォルトの名無しさん2010/06/13(日) 14:52:09
間に26がいなかったら25からにしたかったのにw
0040デフォルトの名無しさん2010/06/13(日) 14:53:07
>>25を入れないとかワロタ
0041デフォルトの名無しさん2010/06/13(日) 14:54:25
>>36が指してるレスと>>36は同じじゃんw
0042デフォルトの名無しさん2010/06/13(日) 14:55:11
>>24-25,27-34,36-41
お前らいい加減にしろよ
0043デフォルトの名無しさん2010/06/13(日) 14:56:08
>>35
1pが動くときは

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
>>24-25,27-34,36-41,42
お前ら(ry

馬鹿すぎw
0045デフォルトの名無しさん2010/06/13(日) 15:03:18
でかいのがでた
0046デフォルトの名無しさん2010/06/13(日) 15:12:36
>>1-45
お前らどっかいけよ
0047デフォルトの名無しさん2010/06/13(日) 15:14:08
>>47
お前どっかいけよ
0048デフォルトの名無しさん2010/06/13(日) 15:16:36
俺がどっか行くぜ!
0049デフォルトの名無しさん2010/06/13(日) 15:26:17
いやいや俺が
0050デフォルトの名無しさん2010/06/13(日) 15:28:40
どうぞどうぞ
0051デフォルトの名無しさん2010/06/13(日) 16:23:17
ダチョウ切りしてすんません、ニコニコのこれなんだが
http://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;}
何処が間違ってるか教えて下さい!!
0052512010/06/13(日) 16:24:41
うpした人のと全く同じにしたツモリなんだが・・・
見辛くてすいませんがどうかヨロシクお願いします!
0053デフォルトの名無しさん2010/06/13(日) 16:25:25
死ね
0054デフォルトの名無しさん2010/06/13(日) 16:26:08
とりあえず
#include<math.h>
つけてみろカス
0055デフォルトの名無しさん2010/06/13(日) 16:28:34
warota
0056512010/06/13(日) 16:37:30
かー
ハズレの時に来ちゃったか

ありがとうございましたー
0057デフォルトの名無しさん2010/06/13(日) 16:40:54
scanf()の引数を良く見るんだ
warizan()のif(y==0)も怪しい
0058デフォルトの名無しさん2010/06/13(日) 16:44:31
はちゅねみくなのー
0059デフォルトの名無しさん2010/06/13(日) 18:36:58
for(x = 0;x < 10;x++)
scanf("%c",a[x]);

みたいに使えないんだけど
0060デフォルトの名無しさん2010/06/13(日) 18:46:21
なんだその態度は
0061デフォルトの名無しさん2010/06/13(日) 18:48:28
しらねーよ
0062デフォルトの名無しさん2010/06/13(日) 19:34:00
>>51
6行目のscanfの %記号
    scanf("%lf&lf",&a,&b);

        ↓

    scanf("%lf%lf",&a,&b);

0063デフォルトの名無しさん2010/06/13(日) 20:11:26
もう初心者に scanf 教えるのやめろよ。
全部 gets でやらせろ。
0064デフォルトの名無しさん2010/06/13(日) 20:16:13
そんな事したら質問数うなぎ登りだぞ
0065デフォルトの名無しさん2010/06/13(日) 20:22:39
scanf に文句ぬかす奴がハードわかんねえとか、もうアボカド
0066デフォルトの名無しさん2010/06/13(日) 21:13:57
gets言ってる時点でネタだからな
0067デフォルトの名無しさん2010/06/13(日) 21:15:48
|= で足してる(?)値って、引く事ってできますか?

0068デフォルトの名無しさん2010/06/13(日) 21:19:28
>>67
|= ~たしてる値
0069デフォルトの名無しさん2010/06/13(日) 21:20:53
ああ間違えた、すまん
&= ~たしてる値
0070デフォルトの名無しさん2010/06/13(日) 21:21:43
できるはず
a |= b;
a &= ~b;
0071デフォルトの名無しさん2010/06/13(日) 21:30:16
scanfもgetsも引数がポインタだからダメ。
何も知らない初心者にいきなりポインタ教えるのは酷というもの。
0072デフォルトの名無しさん2010/06/13(日) 21:31:40
でも、いつのまにか当たり前のように理解してるもんだよ
0073デフォルトの名無しさん2010/06/13(日) 22:25:54
>>71
gets()がダメな理由が、引数がポインタだからってことだったら、fgets()とかなにもかもダメだろ。
0074デフォルトの名無しさん2010/06/13(日) 22:33:27
getchar()で一文字ずつ読めってことか
0075デフォルトの名無しさん2010/06/13(日) 22:37:41
LOWモードでな。
0076デフォルトの名無しさん2010/06/13(日) 22:56:39
RAW だろ。
0077デフォルトの名無しさん2010/06/13(日) 23:08:36
getcharってchar型のデータを取り出すのに、戻り値がintになってるよ。
getintとすべきでは?
0078デフォルトの名無しさん2010/06/13(日) 23:11:42
>>77
1. 戻り値としてEOFの可能性がある。
2. 昔はchar型を戻り値とすることができなかった。
0079デフォルトの名無しさん2010/06/13(日) 23:16:20
glibみたいくlistやhashのあるライブラリってないですか?
0080デフォルトの名無しさん2010/06/13(日) 23:17:37
78
いわれてみれば戻り値がcharの標準関数ってみたことないな。
0081デフォルトの名無しさん2010/06/13(日) 23:23:00
なぜか void はあるんだが
0082デフォルトの名無しさん2010/06/14(月) 00:42:01
へえ
0083512010/06/14(月) 04:15:55
>>57さん>>62さん
わ 本当だ!
わざわざすんませんです(;^^)

イージーミス減らせる様頑張ります!
ありがとうございました!
0084デフォルトの名無しさん2010/06/14(月) 05:10:55
>>79
cstl
使ったことはないけどな!
0085デフォルトの名無しさん2010/06/14(月) 06:13:12
>>70
a=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
>>85
足した時点で足されてないのが原因では
0088デフォルトの名無しさん2010/06/14(月) 08:35:31
floatの絶対値をビット演算で求めたいんだけど

float a = -1.5;
long* t = (long*)&a;
t &= 0x7FFFFFFF; // これで a=1.5 になる

これは問題ある?
互換性とか
0089882010/06/14(月) 08:37:18
ごめん
誤)t &= 0x7FFFFFFF;
正)*t &= 0x7FFFFFFF;
0090デフォルトの名無しさん2010/06/14(月) 09:44:57
>>88
IEEE754ならそれでいいけど、他の浮動小数点フォーマットの場合も
多々あるので互換性はない
0091デフォルトの名無しさん2010/06/14(月) 10:56:49
>>88
x86みたいに実数演算プロセッサが別にある場合、一旦メインメモリに転送しないといけなくなるので無駄に遅くなる恐れがある。
そうでなくても、fabs()自体が高速に実行できるように実装されているはずだから特にメリットはない。
0092デフォルトの名無しさん2010/06/14(月) 10:59:17
glibの標準関数のソースみたときはフラグ用ビットいじる仕様だったな
0093デフォルトの名無しさん2010/06/14(月) 13:14:16
>>86
フラグ倒すだけならXOR使うでしょ普通。

>>87
え?
0094デフォルトの名無しさん2010/06/14(月) 16:44:29
>>93
え?
0095デフォルトの名無しさん2010/06/14(月) 17:05:06
>>93
> >>86
> フラグ倒すだけならXOR使うでしょ普通。
え?

> >>87
> え?
うん
0096デフォルトの名無しさん2010/06/14(月) 17:39:08
どうしてもポインタの意味がわからん。
これ使わなかったらどうなるの?関数を多用する時にとりあえず
*つけとけばいいんですか?
0097デフォルトの名無しさん2010/06/14(月) 17:47:08
とりあえず語尾に「にゃ」を付けておけばいいよ
0098デフォルトの名無しさん2010/06/14(月) 18:15:01
どうしてもポインタの意味がわからないにゃ。
これ使わなかったらどうなるにゃ?関数を多用する時にとりあえず
*つけとけばいいのかにゃ?
0099デフォルトの名無しさん2010/06/14(月) 18:20:59
きもい
0100デフォルトの名無しさん2010/06/14(月) 18:26:41
  /l、   
  (゚、 。`フ _ 
  _」、 "∨  
 └じl_r' ,)  
0101デフォルトの名無しさん2010/06/14(月) 18:30:15
>>96
例えば、printf("Hello!\n");と書いたとき、あんたは既にポインタを使っている。
■ このスレッドは過去ログ倉庫に格納されています