C言語なら俺に聞け(入門編)Part 66at TECH
C言語なら俺に聞け(入門編)Part 66 - 暇つぶし2ch2:デフォルトの名無しさん
10/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)

3:デフォルトの名無しさん
10/06/12 20:08:49
int (*say)(char const*)
じゃないの?

第一引数は関数のポインタです  って使い方っぽいのだが

4:デフォルトの名無しさん
10/06/13 02:24:39
関数ポインタの必要性が分かりません。
ポインタ使わずに関数そのものをコールすれば済むことじゃないですか???

5:デフォルトの名無しさん
10/06/13 02:30:11
配列に入れたときに力を発揮する。

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

func[state];

6:デフォルトの名無しさん
10/06/13 02:31:55
func[state]();の間違い

7:デフォルトの名無しさん
10/06/13 02:34:44
>>5
たとえば
titile()とmenu()の関数の型が
int titile(void)
double menu(int)
とかになっていても

state = TITLE;
func[state];
これで実行させることができるの?
さすがに関数の型を合わさないといけないような気がしますが

8:デフォルトの名無しさん
10/06/13 02:41:43
合わさないとダメだね

9:デフォルトの名無しさん
10/06/13 02:44:39
そういうことやりたがるやつはむしろ素人だね。
使う利点なんて無いよ。


10:デフォルトの名無しさん
10/06/13 02:48:28
昔は有効な書き方だったんだよ
今はコンパイラが勝手にテーブルにしたり、そこまで速度を気にしなくてもよくなったり

11:デフォルトの名無しさん
10/06/13 02:51:55
じゃあ延々と条件分岐書いて無駄に残業してろ

12:デフォルトの名無しさん
10/06/13 02:55:04
最初は5のようなコード組んでたが、あとで仕様変更が起こって
一部の関数の型を変えないといけなくなった。そうなったときに
こうなったとき修正がめっちゃやばそうなが気がします

13:デフォルトの名無しさん
10/06/13 02:55:15
今でも究極のパフォーマンスを狙う用途では
速度を極力落とさずに分岐する手段として使うけどね。

14:デフォルトの名無しさん
10/06/13 03:01:54
無いな。

15:デフォルトの名無しさん
10/06/13 03:06:36
コールバック関数を使う利点はないと?

16:デフォルトの名無しさん
10/06/13 03:27:04
とりあえず qsort 使ってみようぜ

17:デフォルトの名無しさん
10/06/13 07:41:16
どうしてもstatic変数を排除出来ない式に成ったとき関数ポインタ使って回避する。

18:デフォルトの名無しさん
10/06/13 08:48:28
>>13
今のCPUのようにパイプライン段数が深くなったCPUでは、関数ポインタの
呼び出しの時に一度パイプラインをフラッシュして投機実行も破棄してしま
うのでパフォーマンスは落ちる

C++の仮想関数も同じ仕組みを使っているから、パフォーマンスを最大限に
追求する場面では仮想関数はあまり使わない

URLリンク(gigo.retrogames.com)

でも上記のようなURLを見るとあまり関係ないようである
実際Cのqsort()とC++のsort()ではsort()の方が速いが、それは関数ポインタ
による物ではなく、主にデータのコピー方法によるものである

qsort()はバイト単位でコピーするが、sort()はtemplateを使っているので
それぞれのデータ型に最も適した方法でコピーするから速いのである

19:デフォルトの名無しさん
10/06/13 08:50:21
結局関数ポインタが遅いのは一度目の呼び出しでL2キャッシュに
乗る前がものすごく遅いだけで、一度L2キャッシュにテーブルが乗って
しまえば、以降の呼び出しは同じラインによって上書きされない限り
それほど気になるコストは掛からないと言える

20:デフォルトの名無しさん
10/06/13 09:23:26
>>12
構造体を使わないからだよ

21:デフォルトの名無しさん
10/06/13 10:51:21
>>9
つqsort()

22:デフォルトの名無しさん
10/06/13 10:56:21
>>16

23:デフォルトの名無しさん
10/06/13 11:03:22
不完全型へのポインタの一種でしかないんだが
見た目のグロさに過剰反応してしまう奴が後を絶たない

24:デフォルトの名無しさん
10/06/13 13:02:15
早くC++まで勉強して競馬ゲー作りたいわ

25:デフォルトの名無しさん
10/06/13 13:09:09
お前じゃ無理だろw

26:デフォルトの名無しさん
10/06/13 13:21:39
URLリンク(kansai2channeler.hp.infoseek.co.jp)

龍神録の9章を参考にコンフィグを作っています。
が、2P(player_flag==1)コンフィグ用の configpad.◯◯[1] に値が代入されません。
少々分かりづらくて恐縮ですが、対応策をお願いします。
また1P(player_flag==0)は問題なく動きます。

27:デフォルトの名無しさん
10/06/13 13:28:56
>>25
それ言うためだけに書き込むのか・・・・・

28:デフォルトの名無しさん
10/06/13 14:04:19
うん

29:デフォルトの名無しさん
10/06/13 14:05:37
>>27
それ言うためだけに書き込むのか・・・・・

30:デフォルトの名無しさん
10/06/13 14:28:56
>>29
それ言うためだけに書き込むのか・・・・・

31:デフォルトの名無しさん
10/06/13 14:30:31
>>25みたいなカスのせいでスレが荒れるとか。煽りたいだけの中学生とか放っとけよ

32:デフォルトの名無しさん
10/06/13 14:35:01
ってか本当いつもいつも一言多いヤツが何か居座ってるよなこのスレ。
マジで一言多いから自重してほしい

33:デフォルトの名無しさん
10/06/13 14:38:49
それは違うな
煽るだけで何もできない奴と
余計な一言付ける奴とがいる

34:デフォルトの名無しさん
10/06/13 14:40:09
ああ、確かに。
アドバイスはちゃんとしてるのに余計なこと付け加えるヤツと、>>25みたいなのが居るよな

35:デフォルトの名無しさん
10/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返してるけど、ここも気になる

36:デフォルトの名無しさん
10/06/13 14:45:15
>>27-34
お前らまとめてどっか行けよ

37:デフォルトの名無しさん
10/06/13 14:46:42
>>36
ワロタw

38:デフォルトの名無しさん
10/06/13 14:47:22
ワロタのは>>36>>25だと思ったから。違ったらごめんね

39:デフォルトの名無しさん
10/06/13 14:52:09
間に26がいなかったら25からにしたかったのにw

40:デフォルトの名無しさん
10/06/13 14:53:07
>>25を入れないとかワロタ

41:デフォルトの名無しさん
10/06/13 14:54:25
>>36が指してるレスと>>36は同じじゃんw

42:デフォルトの名無しさん
10/06/13 14:55:11
>>24-25,27-34,36-41
お前らいい加減にしろよ

43:デフォルトの名無しさん
10/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;

ありがとうございました。

44:デフォルトの名無しさん
10/06/13 14:56:30
>>24-25,27-34,36-41,42
お前ら(ry

馬鹿すぎw

45:デフォルトの名無しさん
10/06/13 15:03:18
でかいのがでた

46:デフォルトの名無しさん
10/06/13 15:12:36
>>1-45
お前らどっかいけよ

47:デフォルトの名無しさん
10/06/13 15:14:08
>>47
お前どっかいけよ

48:デフォルトの名無しさん
10/06/13 15:16:36
俺がどっか行くぜ!

49:デフォルトの名無しさん
10/06/13 15:26:17
いやいや俺が

50:デフォルトの名無しさん
10/06/13 15:28:40
どうぞどうぞ

51:デフォルトの名無しさん
10/06/13 16:23:17
ダチョウ切りしてすんません、ニコニコのこれなんだが
URLリンク(www.nicovideo.jp)

自分でやったんだけど何故か除算が表示されないんです。↓
#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;}
何処が間違ってるか教えて下さい!!

52:51
10/06/13 16:24:41
うpした人のと全く同じにしたツモリなんだが・・・
見辛くてすいませんがどうかヨロシクお願いします!

53:デフォルトの名無しさん
10/06/13 16:25:25
死ね

54:デフォルトの名無しさん
10/06/13 16:26:08
とりあえず
#include<math.h>
つけてみろカス


55:デフォルトの名無しさん
10/06/13 16:28:34
warota

56:51
10/06/13 16:37:30
かー
ハズレの時に来ちゃったか

ありがとうございましたー

57:デフォルトの名無しさん
10/06/13 16:40:54
scanf()の引数を良く見るんだ
warizan()のif(y==0)も怪しい

58:デフォルトの名無しさん
10/06/13 16:44:31
はちゅねみくなのー

59:デフォルトの名無しさん
10/06/13 18:36:58
for(x = 0;x < 10;x++)
scanf("%c",a[x]);

みたいに使えないんだけど

60:デフォルトの名無しさん
10/06/13 18:46:21
なんだその態度は

61:デフォルトの名無しさん
10/06/13 18:48:28
しらねーよ

62:デフォルトの名無しさん
10/06/13 19:34:00
>>51
6行目のscanfの %記号
    scanf("%lf&lf",&a,&b);

        ↓

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



63:デフォルトの名無しさん
10/06/13 20:11:26
もう初心者に scanf 教えるのやめろよ。
全部 gets でやらせろ。

64:デフォルトの名無しさん
10/06/13 20:16:13
そんな事したら質問数うなぎ登りだぞ

65:デフォルトの名無しさん
10/06/13 20:22:39
scanf に文句ぬかす奴がハードわかんねえとか、もうアボカド

66:デフォルトの名無しさん
10/06/13 21:13:57
gets言ってる時点でネタだからな

67:デフォルトの名無しさん
10/06/13 21:15:48
|= で足してる(?)値って、引く事ってできますか?



68:デフォルトの名無しさん
10/06/13 21:19:28
>>67
|= ~たしてる値

69:デフォルトの名無しさん
10/06/13 21:20:53
ああ間違えた、すまん
&= ~たしてる値

70:デフォルトの名無しさん
10/06/13 21:21:43
できるはず
a |= b;
a &= ~b;


71:デフォルトの名無しさん
10/06/13 21:30:16
scanfもgetsも引数がポインタだからダメ。
何も知らない初心者にいきなりポインタ教えるのは酷というもの。


72:デフォルトの名無しさん
10/06/13 21:31:40
でも、いつのまにか当たり前のように理解してるもんだよ

73:デフォルトの名無しさん
10/06/13 22:25:54
>>71
gets()がダメな理由が、引数がポインタだからってことだったら、fgets()とかなにもかもダメだろ。

74:デフォルトの名無しさん
10/06/13 22:33:27
getchar()で一文字ずつ読めってことか

75:デフォルトの名無しさん
10/06/13 22:37:41
LOWモードでな。

76:デフォルトの名無しさん
10/06/13 22:56:39
RAW だろ。

77:デフォルトの名無しさん
10/06/13 23:08:36
getcharってchar型のデータを取り出すのに、戻り値がintになってるよ。
getintとすべきでは?

78:デフォルトの名無しさん
10/06/13 23:11:42
>>77
1. 戻り値としてEOFの可能性がある。
2. 昔はchar型を戻り値とすることができなかった。

79:デフォルトの名無しさん
10/06/13 23:16:20
glibみたいくlistやhashのあるライブラリってないですか?

80:デフォルトの名無しさん
10/06/13 23:17:37
78
いわれてみれば戻り値がcharの標準関数ってみたことないな。

81:デフォルトの名無しさん
10/06/13 23:23:00
なぜか void はあるんだが

82:デフォルトの名無しさん
10/06/14 00:42:01
へえ

83:51
10/06/14 04:15:55
>>57さん>>62さん
わ 本当だ!
わざわざすんませんです(;^^)

イージーミス減らせる様頑張ります!
ありがとうございました!

84:デフォルトの名無しさん
10/06/14 05:10:55
>>79
cstl
使ったことはないけどな!

85:デフォルトの名無しさん
10/06/14 06:13:12
>>70
a=1;
b=1;
a|=b; // a == 1;
a&=~b; // a == 0;
足したのを引いたつもりがずいぶん引かれてしまったように見える。

質問があいまいだからこれでもよかったのかもしれないし、違った(足す前の状態に戻したかった)のかもしれない。

86:デフォルトの名無しさん
10/06/14 07:20:15
ビットフラグを何だと思ってるんだろう
前のに戻したいなら前のを覚えとけ

87:デフォルトの名無しさん
10/06/14 07:40:38
>>85
足した時点で足されてないのが原因では

88:デフォルトの名無しさん
10/06/14 08:35:31
floatの絶対値をビット演算で求めたいんだけど

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

これは問題ある?
互換性とか

89:88
10/06/14 08:37:18
ごめん
誤)t &= 0x7FFFFFFF;
正)*t &= 0x7FFFFFFF;


90:デフォルトの名無しさん
10/06/14 09:44:57
>>88
IEEE754ならそれでいいけど、他の浮動小数点フォーマットの場合も
多々あるので互換性はない

91:デフォルトの名無しさん
10/06/14 10:56:49
>>88
x86みたいに実数演算プロセッサが別にある場合、一旦メインメモリに転送しないといけなくなるので無駄に遅くなる恐れがある。
そうでなくても、fabs()自体が高速に実行できるように実装されているはずだから特にメリットはない。

92:デフォルトの名無しさん
10/06/14 10:59:17
glibの標準関数のソースみたときはフラグ用ビットいじる仕様だったな

93:デフォルトの名無しさん
10/06/14 13:14:16
>>86
フラグ倒すだけならXOR使うでしょ普通。

>>87
え?

94:デフォルトの名無しさん
10/06/14 16:44:29
>>93
え?

95:デフォルトの名無しさん
10/06/14 17:05:06
>>93
> >>86
> フラグ倒すだけならXOR使うでしょ普通。
え?

> >>87
> え?
うん

96:デフォルトの名無しさん
10/06/14 17:39:08
どうしてもポインタの意味がわからん。
これ使わなかったらどうなるの?関数を多用する時にとりあえず
*つけとけばいいんですか?

97:デフォルトの名無しさん
10/06/14 17:47:08
とりあえず語尾に「にゃ」を付けておけばいいよ

98:デフォルトの名無しさん
10/06/14 18:15:01
どうしてもポインタの意味がわからないにゃ。
これ使わなかったらどうなるにゃ?関数を多用する時にとりあえず
*つけとけばいいのかにゃ?

99:デフォルトの名無しさん
10/06/14 18:20:59
きもい

100:デフォルトの名無しさん
10/06/14 18:26:41
  /l、   
  (゚、 。`フ _ 
  _」、 "∨  
 └じl_r' ,)  

101:デフォルトの名無しさん
10/06/14 18:30:15
>>96
例えば、printf("Hello!\n");と書いたとき、あんたは既にポインタを使っている。

102:デフォルトの名無しさん
10/06/14 18:32:04
>>101
意味がわからん

103:デフォルトの名無しさん
10/06/14 18:34:38
>>95
与えたビットを 強制的に立てるのが or
与えたビット以外を 強制的に落すのが and
与えたビットを 反転するのは xor

足すとか引くとかの意の取り扱いが難しい

# 論理数学的には 加算法 って xor が一番近いんだっけか?

104:デフォルトの名無しさん
10/06/14 18:38:13
>>103
1ビットの足し算はxorだよ。繰り上がりはandね。

105:デフォルトの名無しさん
10/06/14 18:40:33
>>102
文字列リテラルはそれ自体がchar *と言う型のポインタ値として扱われる。
つまり、printf("Hello\n");と書いただけで、printf()関数にcharへのポインタを渡すと言うプログラムになっているわけだ。

106:デフォルトの名無しさん
10/06/14 18:42:15
自分で関数作った方が速い。配列の参照渡しを

107:デフォルトの名無しさん
10/06/14 18:46:40
関数内で、わたされた引数を書き換えたうえで、呼び出し側に書き換え結果を反映したい場合
配列を渡す場合
FILE みたいに、ものすごくカプセル化したい場合

108:デフォルトの名無しさん
10/06/14 18:49:08
配列は渡せない。渡せるのはポインタだけ。

109:デフォルトの名無しさん
10/06/14 18:51:08
だからそう言ってるだろw

110:デフォルトの名無しさん
10/06/14 18:52:55
>>105
文字列リテラルの型は配列だ
そして配列からポインタへの暗黙の変換が規定されているだけだ

111:デフォルトの名無しさん
10/06/14 18:55:48
>>110
大丈夫、誰もそれを否定していない。

112:デフォルトの名無しさん
10/06/14 19:02:49
>>110
文字列リテラルは文字列リテラルであって配列じゃないだろう

113:デフォルトの名無しさん
10/06/14 19:03:16
>>112
アホ

114:デフォルトの名無しさん
10/06/14 19:07:03
>>113
配列は内容が同じであっても必ず別々に確保されるぞ

115:デフォルトの名無しさん
10/06/14 19:22:03
こまけえこたあいいんだよ

116:デフォルトの名無しさん
10/06/14 19:35:22
>>114
規格も読まないアホなんだなお前って

117:デフォルトの名無しさん
10/06/14 19:42:22
>>116
人をアホ呼ばわりするだけで根拠を示せないの?どっちが…

初期化するときにもリテラルは使えるが配列は使えないよね

118:デフォルトの名無しさん
10/06/14 19:49:48
もういいから。見てられないよ。

119:デフォルトの名無しさん
10/06/14 19:50:36
別々に確保されるという規格はないぞw
"ABC" と "ABC" のような全く同じ文字列どころか、
"DEF" と "ABCDEF" のように最後だけ同じ文字列を
1つにまとめるとかいう最適化だって許されてるくらいだのに

120:デフォルトの名無しさん
10/06/14 19:56:25
規格では、文字列リテラルは書き換えてはならない配列であると規定されている
ここで「書き換えてはならない」という持って回った言い方にしたのは、
書き換えてはならないにも関わらず、
昔との互換性のためにchar*への変換が許されているから
こういう特殊な扱いがあるという意味では確かに普通の配列とは異なるが、
型としては確かに配列型だ

121:デフォルトの名無しさん
10/06/14 20:08:40
>>120
特別な配列だということで納得しました

122:デフォルトの名無しさん
10/06/14 20:57:03
>>104
それはねーよ

123:デフォルトの名無しさん
10/06/14 21:04:40
>>122

124:デフォルトの名無しさん
10/06/14 21:20:23
>>123


125:デフォルトの名無しさん
10/06/14 21:21:30
恥ずかしい>>122>>124のいるスレはここですか

126:デフォルトの名無しさん
10/06/14 21:22:37
半加算器とか懐かしいなw

127:デフォルトの名無しさん
10/06/14 21:23:17
いまはそういうとこすっ飛ばして直接言語から始めるからな

128:デフォルトの名無しさん
10/06/14 21:25:31
bitの足し算とか意味不明なことを供述してるけど
整数の足し算が xor と and で出来るって言いたいんだろう
まあ幼稚園児でも知ってることだけど

129:デフォルトの名無しさん
10/06/14 21:27:19
ビットって単に2進数の桁のことだぜ
1桁の足し算は、と言ってるだけだ

130:デフォルトの名無しさん
10/06/14 21:27:42
>>128

131:デフォルトの名無しさん
10/06/14 21:30:17
おおもとの >>67 からずれすぎ

132:デフォルトの名無しさん
10/06/14 21:37:44
それが俺のジャスティス

133:デフォルトの名無しさん
10/06/14 21:53:56
>>120
「char *への変換が許されてる」っていうけど、そうじゃなく
配列のまま使うなんてことあるの?

 "hello"[2]

こういう感じ?


134:デフォルトの名無しさん
10/06/14 22:10:47
sizeof "hogehogehoge" == 13

135:デフォルトの名無しさん
10/06/14 22:21:22
>>133
そういうかんじ。

136:デフォルトの名無しさん
10/06/14 22:23:55
char* array = "hello";
printf("%c\n", array[1]);

137:デフォルトの名無しさん
10/06/14 22:28:19
>>136
ポインタだね。

138:デフォルトの名無しさん
10/06/14 22:59:08
>>135
おいおい
ポインタでもできることだろう・・・

139:デフォルトの名無しさん
10/06/14 23:06:59
>>120
一行目、なんか気になる。
そんな規定あったっけ?
入門スレだから?

140:デフォルトの名無しさん
10/06/14 23:18:18
大昔は書き換え可だったけど(char*に変換できるのはその名残)、今は不可
書き換え不可だと、同じ文字列をまとめたりする最適化ができるからね

141:デフォルトの名無しさん
10/06/14 23:30:58
できるね

142:デフォルトの名無しさん
10/06/14 23:34:50
>>140
そうだっけか?こりゃ失礼。
未定義なだけかと思ってた。
もっかい読み直してくるわ。

143:デフォルトの名無しさん
10/06/15 00:02:01
ああ、書き換えた時の動作は未定義だと思う

144:デフォルトの名無しさん
10/06/15 01:48:53
1つのソース内で同じ文字列リテラルが何度も出て来るケースって希だと思う
それだけのために最適化とか考える物なのかな

145:デフォルトの名無しさん
10/06/15 02:15:53
"\n" とか "%d" みたいな短い文字列は、大量にあってもおかしくないんじゃない
もしくは、マクロ中に含めてたりしたらいつのまにか爆散してるかもしれない

146:デフォルトの名無しさん
10/06/15 02:22:38
その程度だとメリットよりデメリットのが多くなりそうな気もする

147:デフォルトの名無しさん
10/06/15 02:41:37
ふー

148:デフォルトの名無しさん
10/06/15 02:53:43
文字列に限らずに
リテラルは1か所に集められるだろ。

int a=100, b=100, c;
c = a + b + 100 + 100;
if(printf("%d",100)==100);

これだけあっても 100 は1つだけで良い。

149:デフォルトの名無しさん
10/06/15 02:58:32
>c = a + b + 100 + 100;
ここは200になるだろw

150:デフォルトの名無しさん
10/06/15 03:00:48
整数値ならソースに埋め込んだ方が処理速度はずっと速くないか?
add ax, [label1]
よりも
add ax, 0064H
のがどう考えても効率がいい。使用メモリも少ない。

151:デフォルトの名無しさん
10/06/15 06:32:45
C言語にはBSS領域というものがあってだな・・・
初期化データはここに入れられる

152:デフォルトの名無しさん
10/06/15 06:34:02
data領域が初期値を持つ静的データ、BSS領域は0だった

153:デフォルトの名無しさん
10/06/15 07:02:43
そりゃ C の仕様と関係ないだろ。

154:デフォルトの名無しさん
10/06/15 08:07:15
いや、Cの歴史的経緯と深い関係がある

155:デフォルトの名無しさん
10/06/15 08:41:35
F

156:デフォルトの名無しさん
10/06/15 09:06:22
c = a + b * 100 + 100
ならよかったのに

157:デフォルトの名無しさん
10/06/15 14:20:18
はあ…

158:デフォルトの名無しさん
10/06/15 17:33:55
.netsdk2.0にwindows.hが入って無かったです
首吊ってきていいですか?

159:デフォルトの名無しさん
10/06/15 20:16:17
#include <stdio.h>
#define N 20
int main (void)
{
int j;
int f[N + 1];

f[0] = 1;
f[1] = 1;
f[j] = f[j - 2] + f[j - 1];

for (j = 0; j <= N; j++)
printf("f%d:%d\n",j,f[j]);

return (0);
}


上のプログラムを書きました。
f0:1
f1:1
f2:2
f3:3
f4:5
f5:8
以科略
という結果が欲しいです。
どこが間違えていてどこをどのように直せばいいのか教えてもらえませんか?
よろしくお願いします。

160:デフォルトの名無しさん
10/06/15 20:20:35
>>159
j に適切な値を代入して繰り返すべき
f[j] = f[j - 2] + f[j - 1];


161:デフォルトの名無しさん
10/06/15 20:30:00
#include <stdio.h>
#define N 20
int main (void)
{
int j;
int f[N + 3];

f[0] = 1;
f[1] = 1;

for (j = 0; j <= N; j++){
f[j + 2] = f[j + 1] + f[j];
printf("f%d:%d\n",j,f[j]);
}

return (0);
}

無理矢理

162:159
10/06/15 21:10:30
ありがとうございます。

>>160
そのようにしたいのですが、どうすればいいのかわからないのです
自分の書いたものではどこが間違っているのですか?

>>161
f[j + 2] = f[j + 1] + f[j]をfor文のループに入れてしまうんですね
自分のように上に書いておくとどうおかしいのかよかったら教えてください
自宅のパソコンにgnome端末が無いのでいまはできないのですが、明日>>161さんのを見せてもらいますね

163:デフォルトの名無しさん
10/06/15 21:19:56
>>162
元のだと、f[2]以降は定義されてないから、それを表示させようとしてもうまくいかない。
別にprintfのループに入れる必要はないが、繰り返し文が増えるが先に↓を書くとか

for (j = 2; j <= N; j++)
f[j] = f[j - 2] + f[j - 1];

↓環境がないなら例えばここを使おう
URLリンク(codepad.org)

164:デフォルトの名無しさん
10/06/15 21:21:13
ループに入れないのに、なんでf[j]って書いたのか理解できない

165:デフォルトの名無しさん
10/06/15 21:56:00
つーか j を初期化しろよ

166:159
10/06/15 22:07:23
>>163
なるほど!解決しました
これは便利ですね、丁寧な説明ありがとうございました

>>164
まだ配列だとか繰り返しだとかよくわからないのです



167:デフォルトの名無しさん
10/06/16 10:12:48
>>165
うっせーな

168:デフォルトの名無しさん
10/06/16 10:16:57
動作上問題がないのに必ず一言ケチを付けるアホがいるよな

169:デフォルトの名無しさん
10/06/16 10:29:49
初歩的な質問です

(1) int hoge1[10] = {0,1,2,3,4,5,6,7,8,9};
(2) static int hoge2[10] = {0,1,2,3,4,5,6,7,8,9};
(3) static const int hoge3[10] = {0,1,2,3,4,5,6,7,8,9};

プログラムを実行すると(1)と(2)はRAMメモリ上のどこかに確保されますよね
(3)もRAMメモリ上のどこかに確保されるんでしょうか?

170:デフォルトの名無しさん
10/06/16 10:46:08
>>169
環境が具体的に示してないので何とも言えないが、組み込み用の
Cコンパイラでは(3)の場合オプションを付ける事でROM上に置くような
環境も存在する

171:デフォルトの名無しさん
10/06/16 10:56:11
>>169
その他、通常(1)はスタックに確保されてその宣言に到達するたびに初期化される。
(2)は静的領域に確保されて起動時に一度だけ初期化される。
(3)は(2)とは別の静的領域に確保されて初期化される。また、更新できない。

それはさて、初期値を全て列挙するなら要素数は省略した方が意図が判りやすいかと。

172:デフォルトの名無しさん
10/06/16 10:59:10
ありがとうございます。
組み込みコンピューターの開発でsinとcosの計算結果を予め360*2個分
static constで定義しておいて利用するのが目的です
実行時にRAMに再び確保されるのはなんかメモリの無駄だなーと思いまして
質問させて頂きました

173:デフォルトの名無しさん
10/06/16 11:00:16
>sinとcosの計算結果を予め360*2個分
なんと無駄なことを。

174:デフォルトの名無しさん
10/06/16 11:19:21
>>172
要求するスピードや、RAM、ROM容量にもよるけど、最低45°分あれば可能。

175:デフォルトの名無しさん
10/06/16 11:43:35
助言ありがとうございます
45度分用意すればいいのは知っているのですが、今回は速度最優先なので
fn_sin(angle)という関数より sin[angle] で処理することにしました
余談ですが、始め0.1度づつ3600個*2のデーター用意したら
「そこまで精度はいらん」と怒られちゃいました(汗

176:デフォルトの名無しさん
10/06/16 12:05:52
速度最優先ならsinのテーブルじゃなくて、sinを使った式の結果をテーブルにした方がよくないか?
メモリはたくさん使っていいみたいだし。

177:デフォルトの名無しさん
10/06/16 12:19:46
>>172
>組み込みコンピューターの開発で
その開発環境の説明書見たほうが良いよー
何処に配置するかの説明が必ずあるハズ

(or 上司に聞く 明示的にROMに配置させるには どう記述するれば良い? って

178:デフォルトの名無しさん
10/06/16 21:09:17
11

179:デフォルトの名無しさん
10/06/16 21:13:10
巨人ファンです

180:デフォルトの名無しさん
10/06/16 21:26:52
楽天

181:デフォルトの名無しさん
10/06/16 22:30:17
>>175
速度最優先なら内臓RAMに展開を考慮
内臓Flashへのアクセスがノーウェイトで出来るなら良いが
CPU動作クロックが高い場合はウェイトが入っている可能性が高い

182:デフォルトの名無しさん
10/06/16 23:10:51
× 内臓
○ 内蔵

183:デフォルトの名無しさん
10/06/17 00:00:48
そもそもターゲットCPUが浮動小数点演算苦手な可能性があるから
整数を固定小数点数として扱って計算したほうがいいかも知れない

184:デフォルトの名無しさん
10/06/17 01:02:29
>>183
FPUがないCPUで速度最優先なのに浮動小数点演算するって低脳だろ
必然と固定小数点数にして整数演算することになる

185:デフォルトの名無しさん
10/06/17 01:50:39
ここの人たちで、だれが一番高速なsin関数を書けるか競争してみたら?
ターゲットCPUはもっとも一般的なcore2で

186:デフォルトの名無しさん
10/06/17 01:54:07
精度や使用メモリなどの制限をつけないと意味なくね?

187:デフォルトの名無しさん
10/06/17 01:54:28
>>185
sin(theta)

188:デフォルトの名無しさん
10/06/17 02:03:11
CPUにCore2使うような環境ならメモリは十分あるだろうからテーブル引くのが一番速い

189:デフォルトの名無しさん
10/06/17 04:44:01
てか内部的にテーブル持ってたりしないの?

190:デフォルトの名無しさん
10/06/17 04:51:03
ないな

191:デフォルトの名無しさん
10/06/17 05:07:29
そなんだ。
毎回計算してるとかライブラリさんも大変なんだなぁ

192:デフォルトの名無しさん
10/06/17 05:54:48
FSIN命令はFPU内部にテーブル持ってる
精度に問題がない限り、ライブラリはその結果を必要に応じて丸めてるだけ

193:デフォルトの名無しさん
10/06/17 06:49:33
main() { char *s="main() { char *s=%c%s%c; printf(s,34,s,34); }"; printf(s,34,s,34); }
がどうしてクワインになるの?

printfの中身にトリックがあると思うんだけど、
元ネタのWikipediaの説明読んでも理解不能でした。
URLリンク(ja.wikipedia.org)

194:デフォルトの名無しさん
10/06/17 07:11:11
printf()が何を表示してるか、順を追って考えてみれば?

195:デフォルトの名無しさん
10/06/17 07:13:24
printf の format をそのまま引数にも使ってるあたりがミソかと

196:デフォルトの名無しさん
10/06/17 07:31:29
なるほど、最初のsの%c%s%cは展開されるけど・・・ってことか。納得。

197:デフォルトの名無しさん
10/06/17 16:24:33
「#pragma ○○○」って、
プリプロセサーはどのように認識するの?
コメントとして?

198:デフォルトの名無しさん
10/06/17 17:20:36
>>197
その言語によるだろ
プリプロセッサーが機能する物もあるしそうでない物もある

199:デフォルトの名無しさん
10/06/17 17:38:29
言語はCに決まってんだろw
スレタイ読めよw

200:デフォルトの名無しさん
10/06/17 17:43:41
コンパイラによる

201:デフォルトの名無しさん
10/06/17 17:46:44
>>199
そのC言語に色々な種類があるということなんだよ

そもそもコンパイラ固有の指定を行う手段だと規定されているんだから

202:デフォルトの名無しさん
10/06/17 17:53:41
コンパイラ固有の指定を行う為にはプリプロセッサはpragmaをスルーするしかないだろう

203:デフォルトの名無しさん
10/06/17 18:00:23
>>202
プリプロセッサーを含めたコンパイラということ

204:デフォルトの名無しさん
10/06/17 18:03:23
プリプロセッサとコンパイラが一体化してるのもあるし

205:デフォルトの名無しさん
10/06/17 18:03:51
>>201
それはC言語の種類じゃなくて、処理系の種類だよ。

C言語の種類といったら、K&RとかANSIとかC89とかC99のような言語仕様の違いを言うんだよ。

206:デフォルトの名無しさん
10/06/18 05:23:43
ループしてブルースクリーン起こさせるソースください

207:デフォルトの名無しさん
10/06/18 09:55:06
>>205
君が言ってるのは、自分で書いてる通り「言語仕様」の種類だろ

もちろんそれを指すこともあるが、開発メーカーやそのバージョンによる違い、
処理系の違い、その他諸々を含めて色んな種類があるということ。

208:デフォルトの名無しさん
10/06/18 10:20:03
>207 素人はすっこんでろ

209:デフォルトの名無しさん
10/06/18 10:35:01
50

210:デフォルトの名無しさん
10/06/18 13:00:34
>>207
つまりVC8とVC9は別の言語であると。

211:デフォルトの名無しさん
10/06/18 13:16:43
正解

212:デフォルトの名無しさん
10/06/18 13:22:16
>>210
#pragma の仕様なんてバージョンごとに変わる
素人でも常識だわ

213:デフォルトの名無しさん
10/06/18 13:30:46
>>210
対応度違うからね、厳密には違うとみていい
別の言語とはどういうことだ
東京市の山手言葉と下町言葉は別言語なのか
大阪民国弁と帝都弁はは別言語なのか

214:デフォルトの名無しさん
10/06/18 13:34:52
>>212
#pragmaの仕様は特に変わってないとおもったけど、なんかかわったの?c99とか?

215:デフォルトの名無しさん
10/06/18 13:55:37
>>214
だから言語の種類によって変わる
どういう仕様かはそのコンパイラの仕様書やマニュアル見ないとわからん

コンパイル時に機能するとは限らず、
プリプロセスで機能するものから、リンクの動作を制御するのまで様々

そもそも #pragma 自体を認識せずエラーとなるコンパイラだって存在する(した)

216:デフォルトの名無しさん
10/06/18 15:12:59
昔のgccは#pragmaを極端に嫌って、pragmaが検出されるとコンパイル中に
Rogueというゲームを立ち上げて強制的にプレイさせるようになっていた

#pragmaが完全に処理系依存だという事を逆手に取ったジョークだ

217:デフォルトの名無しさん
10/06/18 16:23:54
>>215
「#pragma」自体が言語仕様では定められておらず、ベンダの個別実装であるということか。

218:デフォルトの名無しさん
10/06/18 16:33:29
>>217
#pragma自体は言語仕様にあるよ

#pragmaを認識しないコンパイラってのは、関数でint型しか返せないコンパイラみたいなもんだよ

219:デフォルトの名無しさん
10/06/18 16:52:24
>>218
>関数でint型しか返せないコンパイラみたいなもんだよ
さすがにそれはないな、#pragma が使えるようになったのはもっと最近だよ

220:デフォルトの名無しさん
10/06/18 17:28:03
つか、だからプリプロセッスで扱うわけでもないのに、
"#" で表記してるんだろ。
対応してない処理系でも最初に消えるようにな。


221:デフォルトの名無しさん
10/06/18 17:30:00
プロセッス プロセッサ
プロセス プロセサ

まあ個人的にはプロセサーだな。


222:↓ブックマーク推奨
10/06/18 17:43:26


NHKの極左売国捏造路線何とかなりませんか?19
スレリンク(nhk板)
次スレ
NHKの極左売国捏造路線何とかなりませんか?20
スレリンク(nhk板)







223:デフォルトの名無しさん
10/06/18 18:02:09
コンパイラの違いを言語の違いと表現する阿呆がいるからこんなことになるんだよ

224:デフォルトの名無しさん
10/06/18 18:11:43
ああ君のことね

225:デフォルトの名無しさん
10/06/18 18:51:40
これ見てよ↓
URLリンク(livedoor.blogimg.jp)
ばらまこうぜ!


226:デフォルトの名無しさん
10/06/18 19:05:19
>>224
参政権ほしいですか?
やめてください

227:デフォルトの名無しさん
10/06/18 21:24:36
undeclared first use in this function
このエラーはどういう意味ですか?

228:デフォルトの名無しさん
10/06/18 21:41:51
書いてある通りだろw

229:デフォルトの名無しさん
10/06/18 21:42:18
つ[英和辞書]

230:デフォルトの名無しさん
10/06/18 21:43:49
知らないなら黙っててください

231:デフォルトの名無しさん
10/06/18 21:46:54
>>227
宣言されてません

232:デフォルトの名無しさん
10/06/18 21:47:40
おい馬鹿教えるなよ

233:デフォルトの名無しさん
10/06/18 21:50:04
>>231
どういう事ですか?

234:デフォルトの名無しさん
10/06/18 22:01:57
>>233
関数・変数などの全ての識別子は、そのソースファイルにおいて最初に*使われる*までに
宣言されている必要がある。

例えば、以下のソースをコンパイルすると、そのメッセージがでる。
---ここから---
void foo() { x = 5; }
int x;
int main(void) { return 0; }
---ここまで---

1: error: ‘x’ undeclared (first use in this function)

これは1行めで変数xが*使われて*いるにも関わらず、この時点ではxの宣言がなされていないことを
意味する。
2行めのxの宣言を1行めより先に書けばエラーにならない。

---ここから---
int x;
void foo() { x = 5; }
int main(void) { return 0; }
---ここまで---

この場合は、xは同じファイルで定義されているが、別のファイルで定義されている場合も
宣言は必要。そのときは、以下のように書く。

extern int x;






235:デフォルトの名無しさん
10/06/18 22:04:00
意味がわからない
他の人説明してくれませんか?

236:デフォルトの名無しさん
10/06/18 22:04:24
使う前に宣言してください。

237:デフォルトの名無しさん
10/06/18 22:10:50
>>235
ソースコードとerror: ‘hoge’ undeclared (first use in this function)のhogeを晒せや

238:デフォルトの名無しさん
10/06/18 22:17:04
>>237
ソースコードさらしたら別にエラー内容なんていらんだろ

239:デフォルトの名無しさん
10/06/18 22:23:58
>>238
よく分からんマクロとかかも知れんだろ

240:デフォルトの名無しさん
10/06/18 22:27:23
ふつうソースコードなんて晒せないだろ
家にソースを持って帰ったり会社で2chにアクセスできたりするクソ会社じゃあるまいし

241:デフォルトの名無しさん
10/06/18 22:28:26
>>240
え?意味が分からない

242:デフォルトの名無しさん
10/06/18 22:37:10
>>235が業務用のプログラムをいじってるなら怖いな

243:デフォルトの名無しさん
10/06/18 22:37:47
エラーの内容から判断してこいつは学生だってわかるだろ
変数の宣言忘れてエラーの意味もわからないプロがいたら怖いわ

244:デフォルトの名無しさん
10/06/18 22:45:11
>>240
どう考えても仕事絡みの質問じゃないだろ

245:デフォルトの名無しさん
10/06/18 22:48:34
学生とは限らんだろ

246:デフォルトの名無しさん
10/06/18 23:01:29
そうだな趣味かもしれないしな

247:デフォルトの名無しさん
10/06/18 23:22:16
友愛数のペアを出力するプログラムを作ってみました

自分の思いつく限りの事はしたのですが、これ以上に速くなりますか?
ご指摘お願いします。

URLリンク(codepad.org)

248:デフォルトの名無しさん
10/06/18 23:32:41
n/mが複数回出てくるけどこういうのはコンパイラが取り計らってくれるのだろうか。

249:デフォルトの名無しさん
10/06/18 23:33:54
こんなスレで質問するって職業プログラマじゃないだろ
普通、職業プログラマなら職場のよくわかっている奴に聞くだろ

250:デフォルトの名無しさん
10/06/18 23:35:49
意外に聞かないわ

251:デフォルトの名無しさん
10/06/18 23:36:48
職場によくわかってない奴がいっぱいいるから?

252:デフォルトの名無しさん
10/06/18 23:37:27
>>248
どういう意味ですか?

253:デフォルトの名無しさん
10/06/18 23:39:48
>>247
なんでここまで遅くできるのかわからんw

普通に約数の和を関数化して戻り値と引数を比較すればいいのに

254:デフォルトの名無しさん
10/06/18 23:40:28
職業プログラマじゃないと質問してはいけないんですか?

255:デフォルトの名無しさん
10/06/18 23:40:36
n/mの結果を一度変数に入れてその変数を使い回したらって、ことじゃ

256:デフォルトの名無しさん
10/06/18 23:45:24
なるほど!
こういう事ですね


URLリンク(codepad.org)


それ以外にはありますか?

257:デフォルトの名無しさん
10/06/18 23:49:39
#include <stdio.h>

int divsum(int n)
{
int sum = 1, i;

for(i = 2; i * i < n; i++) if(n % i == 0) sum += i + n / i;

return i * i == n ? sum + i : sum;
}

int main(void)
{
int i, j, c = 0;

for(i = 220; i < 1000000; i++) {
if((j = divsum(i)) <= i) continue;
if(i == divsum(j)) {
printf("%d %d\n", i, j);
c++;
} }

printf("%d\n", c);

return 0;
}

258:デフォルトの名無しさん
10/06/18 23:57:47
友愛数を配列に保存して比較するのは意味がなくて無駄

259:デフォルトの名無しさん
10/06/19 00:06:09
作り変えちゃったか。仕方のないことかもな。

260:デフォルトの名無しさん
10/06/19 00:08:05
>>257
凄いですね・・・。
以前に作った事がありますか?

>>258
自分の作ったプログラムだと、
それが無いと同じペアを2回表示する事になるので・・・。

261:デフォルトの名無しさん
10/06/19 00:10:57
>>260
多分自分でそこまで作るのにあれこれ苦労したと思うんだけど、その苦労が経験となり、身につく。
おつかれさま。

262:デフォルトの名無しさん
10/06/19 00:20:15
>>260
if(n < s) があるから、同じの2回表示されないと思うけど。

263:デフォルトの名無しさん
10/06/19 00:23:58
>>262
ありがとうございます

264:デフォルトの名無しさん
10/06/19 00:32:58
>>260 もう少し高速化
#include<stdio.h>

long calc_yuai(long value){
long i, j, yuai=1, tmp, sum, value_org;

value_org=value;
for(i=2;value/i>=i;i++){
sum=1;
tmp=1;
for(j=0;value%i==0;j++){
value/=i;
tmp*=i;
sum+=tmp;
}
yuai*=sum;
}
if(value>1) yuai*=(value+1);
return yuai-value_org;
}

int main(void){
long i, yuai;

for(i=2;i<1000000;i++){
yuai=calc_yuai(i);
if(i<yuai && calc_yuai(yuai)==i){
printf("%ld %ld\n", i, yuai);
}
}
return 0;
}

265:デフォルトの名無しさん
10/06/19 00:41:58
一応プロだけど同僚よりGoogleとMSDNに聞いた方が速くて確実だわ

266:デフォルトの名無しさん
10/06/19 00:44:58
ふーん

267:デフォルトの名無しさん
10/06/19 01:05:41
>>264
速いな
今度からこれ使うことにしよう

268:デフォルトの名無しさん
10/06/19 07:07:03
自演乙

269:デフォルトの名無しさん
10/06/19 07:35:38
横からだけど、アルゴリズムの出典があったらおながいします。
ぐぐったけど互除法の変形とも違うし何やってるんだ、これ?

270:デフォルトの名無しさん
10/06/19 07:41:15
(1 + a + a^2 + ... + a^m) * (1 + b + b^2 + ... + b^n)
= 1 + a + ... + a^m + a * b + a^2 *b + ... + a^m * b + .... + a^m * b + ... a^m + b^n

271:デフォルトの名無しさん
10/06/19 07:42:35
= 1 + a + ... + a^m + b + a * b + a^2 *b + ... + a^m * b + .... + b^n + a * b^n + ... a^m + b^n
だった

272:デフォルトの名無しさん
10/06/19 07:43:38
また違った。
最後はa^m * b^nだ。

273:デフォルトの名無しさん
10/06/19 08:57:21
>>269
アルゴリズム名は知らないけど、例えば220の約数は1,2,4,5,10,11,20,22,44,55,110。
1を無視して、両端から数字をひとつづつ取って掛け合わせると、以下のように220になる。
2*100=220
4*55=220
5*44=220
10*22=220
11*20=220

約数の和sumを得るためには、a=2,3,4,5,6,...で割ってみるが、
割りきれたらsum=sum+a+220/a
a<=220/aの間、aをカウントアップして割りきれるか試す。
それ以上続けても、既に見つけた約数しかないので、無駄になるから計算しない。

274:デフォルトの名無しさん
10/06/19 08:59:05
>>273
X:2*100=220
○:2*110=220

275:269
10/06/19 10:36:30
>>273
理解しました!

>>270
言いたいことはたぶん理解しました!

276:デフォルトの名無しさん
10/06/19 10:47:13
アホだw

277:デフォルトの名無しさん
10/06/19 10:51:18
>>264のアルゴリズムを聞いてたんじゃないの?
>>273の説明は全然関係ないと思うんだが。

278:デフォルトの名無しさん
10/06/19 11:26:10
>>277
だから、>>264のアルゴリズムのfor(j=0以降は
>>270がヒントになってると思いますよ?

279:デフォルトの名無しさん
10/06/19 11:28:53
だから、>>273関係ないじゃんwってことなんだけど

280:デフォルトの名無しさん
10/06/19 11:33:28
俺がアホだwと煽られるのは結構だけど、
>>273が叩かれる筋合いはないのでは?
>>273の説明のおかげで>>264のiのforループも理解し易くなると思うんだが。

281:デフォルトの名無しさん
10/06/19 11:42:27
素因数分解したときに
1210=2^1*5^1*11^2
であるとき
全ての約数の和は
(2^0+2^1)*(5^0+5^1)*(11^0+11^1+11^2)=2394
ここから元の数を引けば
2394-1210=1184
となる

282:デフォルトの名無しさん
10/06/19 11:57:50
>>280
じゃあ遠慮なく・・・アホ!

283:デフォルトの名無しさん
10/06/19 12:06:30
関係ない説明すれば、煽られても仕方ないだろ

284:デフォルトの名無しさん
10/06/19 12:10:10
数学的な解方をそのままプログラムに置き換えると効率が悪いから、
コンピューターの性質を踏まえた上でもう一工夫するんだよ

285:デフォルトの名無しさん
10/06/19 12:18:58
今の女子って、正直、生理的に汚いよね。

286:デフォルトの名無しさん
10/06/19 12:54:11
はい

287:デフォルトの名無しさん
10/06/19 13:39:32
度々世話になります

#define RAKKA_SPEED 8.0
#define BLOCK_TATE 32.00

(略)
double rakka_calc=BLOCK_TATE/RAKKA_SPEED;

(略)
board[i][j][2][player_flag]+=double(rakka_calc*rakka_flag[player_flag]+shot_calc*shot_flag[player_flag]);


で計算が上手くいかないというか、
rakka_calkの値の小数点以下が計算されてないみたいで、
どうすれば小数点以下を反映できますか?

board[][][][]をdouble宣言ってのはなしの方向で。

288:デフォルトの名無しさん
10/06/19 14:01:46
なしの方向なら答えもなし

289:デフォルトの名無しさん
10/06/19 14:04:50
>>287ですが解決しました、ありがとうございました

290:デフォルトの名無しさん
10/06/19 14:45:17
いまどき、C言語のコンソールアプリの求人ってあるの?

291:デフォルトの名無しさん
10/06/19 15:07:38
ない

292:デフォルトの名無しさん
10/06/19 17:05:28
質問です。
穴掘り法で迷路を作成しようとしたのですが、参考にしたソースと同じ様に動かすつもりで
書いたのに、なぜか、掘られていない穴が残ってしまいます。
ソースを載せますので、自分のソースのどこに問題があるのか教えてください。
参考にしたもの
URLリンク(codepad.org)
自分で書いたヤツ
URLリンク(codepad.org)

よろしくお願いします。

293:292
10/06/19 17:08:18
すいません。掘られていないのは穴ではなくて、壁でした//

294:デフォルトの名無しさん
10/06/19 17:19:02
そこで穴があったら入りたいとか言っとけよ

295:デフォルトの名無しさん
10/06/19 17:19:26
アッー!

296:デフォルトの名無しさん
10/06/19 18:44:21
穴があったら入れたい

297:デフォルトの名無しさん
10/06/19 21:57:15
穴があったら塞ぎたい

298:デフォルトの名無しさん
10/06/19 23:56:17
>>264
前後もコードもちゃんとみてないんで、
何するコードか分からんのだけど、
jをインクリメントしてんの、何で?

299:デフォルトの名無しさん
10/06/20 00:01:48
>>298
途中で書き直した名残
j はいらない

300:デフォルトの名無しさん
10/06/20 00:32:45
jを使って等比級数の公式利用して
for(j = 1; value % i == 0; j++, value /= i);
yuai *= (pow(i, j) - 1) / (i - 1);
とか書くと笑えるくらい遅くなるなw

301:デフォルトの名無しさん
10/06/20 00:53:01
for(i = 2; i * i <= n; i++) {
for(j = 1; n % i == 0; j = j * i + 1) n /= i;
yuai *= j;
}
これなら計算回数変わらずに変数節約できる

302:デフォルトの名無しさん
10/06/20 01:45:17
プロプライエタリなライブラリを一部で呼び出してるソースコードを、GPLとして公開することは合法ですか?
具体的にはフォトショップSDKで書いたプラグインです。

303:302
10/06/20 01:48:44
BSDとして公開することは合法ですか?

304:デフォルトの名無しさん
10/06/20 02:16:54
GPLは無理だったような
BSDは別にいいんじゃないかな

305:デフォルトの名無しさん
10/06/20 02:37:28
GPL違反ではあるけど、法的にはグレーじゃないっけ?
まぁあえて危ない橋渡る人が居ないだろうけど。

306:デフォルトの名無しさん
10/06/20 06:10:19
>>292
URLリンク(codepad.org)
/* これ */

307:292
10/06/20 10:56:53
>>306
ですね。
デバッグするっていうのはなかなか難しいです。
ありがとうございました。

308:デフォルトの名無しさん
10/06/20 11:59:40
>>307
たいしたこと教えてないからお礼はいらないよ

309:デフォルトの名無しさん
10/06/20 14:40:40
>>308
お礼?ふざけんな
2chでちょっと投稿したからと言って何かもらえるという考えは甘い

310:デフォルトの名無しさん
10/06/20 14:44:44
回答者でもないのに毎回お礼に反応する頭のおかしい人が常駐してるからなw

311:デフォルトの名無しさん
10/06/20 14:48:24
>>307
いえいえ

312:デフォルトの名無しさん
10/06/20 18:01:02
VC++ 2008です

いったんプログラムを止めて
エンターキーを1回押して再開させたいのですが

fprintf(stdout,"Push Enter\n");
getchar();

と書いたらエンターキーを2回押さないと再開しません
仕方ないのでしょうか?


313:デフォルトの名無しさん
10/06/20 19:51:08
>>311
どうもどうも

314:デフォルトの名無しさん
10/06/20 20:37:23
getch()の結果が\nか判定

315:312
10/06/20 23:50:26
while(getch()!=10);

でいいのでしょうか?
これにするとエンターを何回押しても進みません。

エンター1回で進むようにする方法はないのでしょうか?


316:デフォルトの名無しさん
10/06/21 01:03:01
#include <stdio.h>
#include <conio.h>

int main(void)
{
  puts("before");
  while(getch() != '\r'){
  }
  puts("after");
  return 0;
}

317:デフォルトの名無しさん
10/06/21 01:16:40
>>312
俺の環境だと、その書き方でenter一回押したら再開されるんだが。

318:312
10/06/21 01:32:11
できました。
2回押さなければ進まなかった原因は
他の関数で入力待ちしている部分があったためでした。
ありがとうございました。

319:デフォルトの名無しさん
10/06/21 01:33:09
>>318
いいよ別に

320:デフォルトの名無しさん
10/06/21 21:59:08
int a = ( int )( 3 * 1.0f );

aは3であることが保証されるのでしょうか??
浮動小数点数は誤差とか怖いので気になりました・・・

321:デフォルトの名無しさん
10/06/21 22:07:10
>>320
保険をかけるなら四捨五入すべし

322:デフォルトの名無しさん
10/06/21 23:11:17
普通の浮動小数点数なら整数は(表現可能精度内でなら)誤差なしに表現できるので、
一旦循環小数や精度オーバーを経由して
整数に戻ってくるような演算でない限り、誤差は発生しない
(Cの規格で保証されているわけではないが)

323:デフォルトの名無しさん
10/06/21 23:16:30
0.5足しとけばいいじゃん

324:デフォルトの名無しさん
10/06/21 23:42:00
>>320
誤差が出るのは小数点イカでゲソ

325:デフォルトの名無しさん
10/06/21 23:45:07
>>320
URLリンク(ja.wikipedia.org)

326:320
10/06/21 23:46:34
みなさん、ありがとうございます。
>>320のケースは大丈夫なようですが、大事をとって0.5f足してからの丸め(四捨五入)をする方針でいくように
したいと思います。

327:デフォルトの名無しさん
10/06/21 23:47:20
>>326
round 使ったほうがいいかも

328:デフォルトの名無しさん
10/06/22 00:16:01
>>326
0.5f足して四捨五入しちゃだめー

329:デフォルトの名無しさん
10/06/22 00:34:01
>>328
ああああわわわてててるななな

330: ◆Jo8oQAGh3M
10/06/22 01:34:54
3次元の実数ベクトルを、要素がfloat型で要素数3の配列を用いて表すものとする。
二つの3次元ベクトルに対して、それらの和を求める関数を定義する。
和を計算する関数はaddvec関数定義の頭部は
void addvec(const float x[3], const float y[3], float z[3])とする。
プログラムの動作は、二つの3次元ベクトルaとbの各成分を順次に入力して、それらの和を求めて出力する。

というものをつくりたいです、そこで
#include <stdio.h>

void addvec(const float x[3], const float y[3], float z[3])
{
int i;
for(i = 0; i < 3; i++) z[i] = x[i] + y[i];
}
これに続くmain関数を作りたいのですがどうすればいいのかわからないので教えてください。


int main (void)
{
float x1,y1,z1,x2,y2,z2;

puts("各成分を入力してください.");
printf("ベクトルa:"); scanf("(%d,%d,%d)", &x1, &y1, &z1);
printf("ベクトルb:"); scanf("(%d,%d,%d)", &x2, &y2, &z2);

printf("和%d \n", addvec(わからない));
return (0);
}
上のように作ろうとしたのですが、どうも的外れな気がして…

331:デフォルトの名無しさん
10/06/22 02:12:27
#include<stdio.h>

void addvec(const float a[3], const float b[3], float c[3])
{
int i;
for(i = 0; i < 3; i++) c[i] = a[i] + b[i];
}

int main (void)
{
float a[3], b[3], c[3];//x,y,z成分

puts("各成分を入力してください.");
printf("ベクトルa:"); scanf("%f %f %f", &a[0], &a[1], &a[2]);
printf("ベクトルb:"); scanf("%f %f %f", &b[0], &b[1], &b[2]);
addvec(a, b, c);
printf("a+b:%f, %f, %f\n",c[0], c[1], c[2]);
return (0);
}

332:デフォルトの名無しさん
10/06/22 02:18:01
あ、コメントは配列の要素がx,y,z成分てこと

333: ◆Jo8oQAGh3M
10/06/22 02:27:16
>>332
ありがとうございます、凄く助かりました!


334:デフォルトの名無しさん
10/06/22 04:49:11
今更だけど
>>301 にするだけでも >>264 の 1.8 倍速
これだと >>264 の 2.5~3 倍速になる
除算は遅いから書き直せるものは書き直したほうがいいね
long calc_yuai(long value){
long i, j, yuai, value_org;

if(value<=1) return 0;

value_org=value;

for(i=0;(value&1)==0;i++) value>>=1;
yuai=(2<<i)-1;

for(i=3;i*i<=value;i+=2){
for(j=1;value%i==0;j=j*i+1){
value/=i;
}
if(j>1) yuai*=j;
}
if(value>1) yuai*=(value+1);
return yuai-value_org;
}

335:デフォルトの名無しさん
10/06/22 06:40:02
>>334
なるほど。書き方によってスピードがずいぶん違うね。
ところで、スピードアップしたいときには試行錯誤で、
早そうな書き方をいくつか試してるんだが、定石パターンってあるんだろうか?
処理系によっても、この演算は遅いor早い、とかあると思うんだが。

336:デフォルトの名無しさん
10/06/22 06:47:01
実数より整数のが速い
掛け算は遅いから可能ならビットシフトに置き換える
割り算はもっと遅いからできるだけ使わないように工夫する
条件分岐は足を引っ張る
ループの中で使う変数が増えると、ある時点でスピードががたっと落ちる
コードサイズが大きくなると不利

基本はCPUやパソコンの構造をよく理解すること
小手先の工夫をするよりアルゴリズムをよく練ること

337:デフォルトの名無しさん
10/06/22 06:49:19
スピードだけをとことん追求するとスパゲッティになる

338:デフォルトの名無しさん
10/06/22 07:18:10
そうかなあ

339:デフォルトの名無しさん
10/06/22 08:58:19
巧妙にビット演算とか使いまくって、作った自分があとから見ても何やってんのかわからなくなることは珍しくない
ちゃんとコメントは書いとこうね

340:デフォルトの名無しさん
10/06/22 09:02:26
前時代的な最適化だな

今どき乗除算も遅くないから
無理にシフト使って命令数増やすより1命令で済ませる方がいい

341:デフォルトの名無しさん
10/06/22 09:40:42
こういうくだらん高速化より、コードの保守性を上げる方が遥かに大切。
コードを汚くして.0001秒速くするなど、正に愚の骨頂。

そして演算時間が問題となり本当に高速化が必要なところでは、
こんな小学生的な発想のレベルの最適化など殆ど役に立たん。

342:デフォルトの名無しさん
10/06/22 09:48:38
はいはい、すごいすごい

343:デフォルトの名無しさん
10/06/22 10:59:45
組み込みやゲームだったら、0.001秒早くするほうが普通だけど

344:デフォルトの名無しさん
10/06/22 11:41:06
この程度の高速化なら、逆にコードがすっきりして見やすくなると思うんだが。

345:デフォルトの名無しさん
10/06/22 13:25:18
>>341
コードの保守性が高いかどうかはユーザに関係ないよ
なぜこの処理は遅いのですか?と質問されたら、保守性を下げない為です、と回答するの?
それともこれより速く出来ませんと回答するの?

346:デフォルトの名無しさん
10/06/22 13:29:35
具体的なことには何一つ答えられないアホが、
抽象論で他人を叩いて優越感に浸りたいだけ

まともに相手する必要なないと思う

347:デフォルトの名無しさん
10/06/22 13:57:39
>>340
データシート見てこい
SALは0.33クロック、IMULは0.5クロックに対してIDIVはmax36クロック
つまり100倍遅い

348:デフォルトの名無しさん
10/06/22 14:41:20
>>345
一万ぽ譲って関係ないとして、ユーザに関係ないなら無視して良いの?

349:デフォルトの名無しさん
10/06/22 14:50:21
>>348
速度が問題なのであればそれを改善するのは当然。
それによって保守性が下がると思うのであれば、同等のコード、または
普段よりも注意深く詳しいコメントを記述する
ってなんでこんな学生相手に話すような展開になってんだ?普通だろこれ。

350:デフォルトの名無しさん
10/06/22 14:52:06
>>347
ふおお。0.5がでてきたときもびっくりしたけど、いまや3命令が同時に行えるようになっているのか

351:デフォルトの名無しさん
10/06/22 14:56:10
>>349
でも遅い遅いとユーザから不満が出てる一般的なアプリケーションはビット演算なんて使ってないんだろうね

352:デフォルトの名無しさん
10/06/22 15:05:15
ん?
>>334 のコードの保守性が低いと言ってるんだよ。醜いということ。
で、こういうコードを書いた理由がこっちの方が速いだろ。

それに対して、その部分が速いといっても全体から見れば極々一部のコードなんだし、
そこが何倍になろうとも全体が速くなるわけではない。と言ったまで。

高速化というのは、その必要性が生じたときに、
ボトルネックとなっている部分を調べて、
その部分を対象に行うものだよ。

そもそも 334 は単に自分のスキルを自慢したいだけだんだろ?
当然ながらこういうコードは、以下略

353:デフォルトの名無しさん
10/06/22 15:20:38
ちなみにマシン言レベルで比較する程の高速化が必要な状況なら
その部分はアセンブリで書くのが普通。

C言語で書いておいて、シフト演算使ったから速いとか、
そのプログラマーのマスタベーションでしかありえない。

どうして究極の速度が要求されるような状況でC言語で開発してんだ?
そこまでの要求がないからだろ。

354:デフォルトの名無しさん
10/06/22 15:21:47
コンパイラさんのほうが優秀だから

355:デフォルトの名無しさん
10/06/22 15:22:22
>>334の高速化なんて2で先に割り切っておいて、
ループ変数を+=2にして高速化してるだけじゃんw

この程度で保守性低いとか、スキル自慢とか、やばすぎだろw

356:デフォルトの名無しさん
10/06/22 15:27:15
やべー、おまえやべー

357:デフォルトの名無しさん
10/06/22 15:42:55
>>334
>これだと >>264 の 2.5~3 倍速になる
>除算は遅いから書き直せるものは書き直したほうがいいね

流石にこれはないなw

358:デフォルトの名無しさん
10/06/22 16:19:38
>>334程度が理解できないアホは>>257でも使ってりゃいいんだよw

359:デフォルトの名無しさん
10/06/22 16:24:33
>>358
かわいそうに、いやマジで

360:デフォルトの名無しさん
10/06/22 16:46:58
>>352
ちょっと>>334の代わりになる保守性の高いコードとやらを書いてみてよ

361:デフォルトの名無しさん
10/06/22 16:59:32
そもそも>>352は根底からおかしいからな。
どこがボトルネックだと考えているのか教えてほしいわ。

362:デフォルトの名無しさん
10/06/22 18:13:59
>>360
高速化を考えるんだったら、そのマシンや環境がどうかで大きく変わるし、
それ以前に最大桁が幾らかでも手法は色々考えられる。
例えばその辺のWindowsPCとかなら、そこそこメモリも使えるから、

#include <stdio.h>
#define N 1000000

int main(void)
{
static long table[N];
long i, j;

for (i = 1; i < N; i++)
for (j = i+i; j < N; j += i)
table[j] += i;

for (i = 0; i < N; i++) {
j = table[i];
if (j <= N && i < j && table[j] == i)
printf("%ld %ld\n", i, j);
}

return 0;
}

363:デフォルトの名無しさん
10/06/22 18:20:07
>>362
はやいな、おい

364:デフォルトの名無しさん
10/06/22 18:24:47
>>362
>>264 の10倍速

365:デフォルトの名無しさん
10/06/22 18:56:50
>>361
え、一般論だと思うけど。それがコードチューニングってやつだよ
どこがボトルネックか教えろって、なに言ってるの?

366:デフォルトの名無しさん
10/06/22 19:00:10
>>365
ボトルネックの部分をチューニングしてるわけだけど、そこをチューニングするなといっているように見える

367:デフォルトの名無しさん
10/06/22 19:01:20
>>362
なんで動いてるのかが分からない!かっけー

368:デフォルトの名無しさん
10/06/22 19:03:56
と思ったけど理解できた!
逆転の発想スゴス

369:デフォルトの名無しさん
10/06/22 19:40:57
>>366
ボトルネックというのは、プログラムの実行時間の大半を占める部分だよ

370:デフォルトの名無しさん
10/06/22 19:52:51
>>362はかなりのやり手。

371:デフォルトの名無しさん
10/06/22 19:57:09
>>369
そんで、今回の友愛数を求めるプログラムのボトルネックはどこなの?

372:デフォルトの名無しさん
10/06/22 20:05:53
誰が友愛数を求めるプログラムの実行速度を要求してるの?
速くしたいのなら、いくらでもすればいいんじゃないでしょうか
保守なんていらないよ、そんなパーツには

373:デフォルトの名無しさん
10/06/22 20:11:41
>>371
Nの大きさに対する演算回数の多さじゃないの?
演算回数を減らす工夫が効果的ってことでしょ。

N*N だったものを 2*N にするとかはよくある話じゃないの。

374:デフォルトの名無しさん
10/06/22 20:17:00
だから、コンパイラが充分賢いなら小手先の最適化は慎んだ方がいいね。
>336の挙げた項目を整理すると、
・実数より整数の方が速いが、型変換は遅いから要注意。
・CPUによってはビットシフトは必ずしも速くない。
・条件分岐はできるだけループの外に。
・「ループの中で使う変数」だと意味不明だが、一次変数を利用してループ内の演算量を減らすのは有効。
・どうせ今時のコンパイラはstatic関数のインライン展開くらいしてくれるから、関数は機能ごとに分割すべき。
となるかな。

375:デフォルトの名無しさん
10/06/22 20:18:42
>>372
実行速度の要求もないのに、
自分の趣味で速くしたくてシフト演算使って高速化するの?
それで保守のことなど知ったことはないと開き直るの?

うちの会社なら即クビだ。

376:デフォルトの名無しさん
10/06/22 20:25:38
>>375
そういうことだ

377:320
10/06/22 20:44:43
>>327
ありがとございます。
残念ながら、VC++はC99に対応していないので、roundが使えないです・・・

>>328
あ、たしかに一律0.5f足すだと、負の四捨五入がおかしくなりますね・・・

調べてみたところ、次のようなやり方で絶対値的四捨五入ができると分かりました。

float a = -4.6f;
float b = ( a > 0 ) ? floor( a + 0.5f ) : ceil( a - 0.5f );

最終的に求めたいのはint型なので、以下のようなカタチでも良いと思うのですが、どうでしょう??

int b = ( int )( ( a > 0 ) ? ( a + 0.5f ) : ( a - 0.5f ) )

378:デフォルトの名無しさん
10/06/22 20:51:41
>>372
> 誰が
>>247

379:デフォルトの名無しさん
10/06/22 20:53:38
>>377
足して切り捨てしてるならおk。足して四捨五入ってところを心配したのだろうと思う。

380:デフォルトの名無しさん
10/06/22 20:56:36
割る数が2のべき乗の定数だと勝手に割り算をシフトに置き換えてくれるコンパイラもあるよ。
最近はその程度の最適化はやってくれる。

ただ、特定の乗除算とビットシフトが等価だって知らない人とは一緒に仕事したくない。
そんなの2進数の基本的な性質じゃん。
その程度のことで保守性が下がるとか、何寝言言ってんのって感じ。

381:デフォルトの名無しさん
10/06/22 20:58:16
>>375
ええと、あなたの会社のコーディング規約ではシフト演算が禁止、ただし要求速度を満たせない
場合を除くとなっているのですか?
どこからが複雑だから禁止になり、どこまでが許容される記述なのか、そのガイドラインを
社内で作成し、周知徹底されていますか?
また、速度に関する要件がない場合、速度はどれだけ遅くとも問題ないのですか?

382:デフォルトの名無しさん
10/06/22 21:06:49
職業プログラマが保守性とかって、お笑い

383:デフォルトの名無しさん
10/06/22 21:29:16
マ板に行けよ土方は

384:320
10/06/22 21:29:26
>>379
あ、そういうことでしたか。
了解です。

385:デフォルトの名無しさん
10/06/22 23:43:30
こんなところでまで会社に縛られてるなんて大変だね

386:デフォルトの名無しさん
10/06/23 00:23:48
scanfの引数に&をつける理由を大学の教授に尋ねたのですが、
「今は気にしなくていい。scanf使うときは&をつけるように」
といい加減な回答が返ってきました。
お金払ってるんだからちゃんと説明しろよ

387:デフォルトの名無しさん
10/06/23 00:25:40
その段階でポインタの説明始めたら一向に進まなくなるぞ

388:デフォルトの名無しさん
10/06/23 00:28:05
大学生だろ?
自分で調べられる程度の範囲は自分で調べろよ
小中学生じゃないんだから

389:デフォルトの名無しさん
10/06/23 00:40:32
>>388
俺が言いたいのは教授の教え方がいい加減だっていってるんだ。
他にもソースファイルの先頭に書くinclude文についてもそう。
教授は「プログラムを動かすためのおまじないだと思ってください」
とか抜かしやがる。

390:デフォルトの名無しさん
10/06/23 00:42:38
大抵の参考書もそう言ってるぞ。
物事には学ぶための順序ってもんがある。

391:デフォルトの名無しさん
10/06/23 00:44:00
>>389
何も分かってない人に教える場合はそれが普通

392:デフォルトの名無しさん
10/06/23 00:45:25
>>389
それが定番になってるけど、俺もどうかと思う。ガキに教えるんじゃないんだから

393:デフォルトの名無しさん
10/06/23 00:45:51
>>391
残念ながら最初に聞いたときぽかーんだったよ。
そもそも「おまじない」って何だよって?w
さすがに調べて分かったが。俺とおんなじこと考えてた人きっといるはず

394:デフォルトの名無しさん
10/06/23 00:49:33
includeやポインタくらいはちゃんと意味を教えたほうが良いのでは・・・
前者は至極分かり易いと思うぞ。

395:デフォルトの名無しさん
10/06/23 00:53:14
会社に入ってからも「おまじない」という単語はよく使うけどな。
「テスト済みの処理構造をブラックボックスとして使う」という意味で。
あとで暇な時にそのおなじないの内容を理解しておくことは必須

396:デフォルトの名無しさん
10/06/23 00:54:59
話が違いますが

397:デフォルトの名無しさん
10/06/23 00:56:16
なるほどね。
大まかには「お決まりの処理」という理解で、さらには「なぜその処理が必要か」という理解に踏み込んでいくという、
二段階の理解ステップとなるわけだ。
経験上、こういうのはけっこうあるね。
何となしにやっていたことの意味が徐々に明らかになっていくのは、成長を実感できてうれしいものだ。
>>386も是非この楽しさを知ってほしい。

398:デフォルトの名無しさん
10/06/23 00:57:51
調べる能力も大切って事を教授が教えてくれたんですね。

399:デフォルトの名無しさん
10/06/23 00:59:49
>何となしにやっていたことの意味が徐々に明らかになっていくのは
できれば本当の意味にすぐに気づきたい。時間はそんなに待ってくれないぞ

400:デフォルトの名無しさん
10/06/23 01:01:42
includeをおまじないと言っても、stdio.h以外を使う時点で
この関数を使うときはこれをインクルードと言っちゃうんだから
初めからprintfや標準入出力関数を使うためにこうすると言えばいいだろ、馬鹿らしい

401:デフォルトの名無しさん
10/06/23 01:01:45
>>399
printfの使い方とか、要所を抑えておけばあとは適当な理解でいいようなことは結構あるよ

402:デフォルトの名無しさん
10/06/23 01:01:49
>>393は言葉尻とらえてケチつけてるだけでなんの意味もない話だったな

403:デフォルトの名無しさん
10/06/23 01:04:48
慣行となってる教え方に問題があるって話だろ。意味を見い出せない馬鹿

404:デフォルトの名無しさん
10/06/23 01:08:40
Aを理解するには、Bを教えなければならない
Bを(ry
人に教えるならどこかで堺をつけないといけない

調べてわかるレベルならなおさら教えない
おしえてクンをその道に育てるのは自殺行為

405:デフォルトの名無しさん
10/06/23 01:11:04
全部調べて分かるだろ

406:デフォルトの名無しさん
10/06/23 01:11:40
調べて分かることならちゃんと説明できるだろう。
それを遠回しな表現で学生を撹乱させて時間稼ごうだってそうはいかない
お金払ってるんだから教授はちゃんと仕事しろってんだ

407:デフォルトの名無しさん
10/06/23 01:11:41
while(!関数名)ってあったんですけどこれってどういう意味なんでしょうか?
もし関数が0を返したらwhile(!0)になると思うんですがこれは真なんでしょうか?
よろしくお願いします。

408:デフォルトの名無しさん
10/06/23 01:13:00
人に聞く=調べる
金払ってんだ、質問した事に答えろよ。

409:デフォルトの名無しさん
10/06/23 01:13:43
えっ?

410:デフォルトの名無しさん
10/06/23 01:16:29
初心者にものを教える時に最初から1~10まで全て説明する馬鹿はいないだろ。順序を考えろ。
>>393>>400>>403みたいな馬鹿学生が山ほど潜んでるんだから教える方も大変だよ

411:デフォルトの名無しさん
10/06/23 01:18:17
誰が最初から1~10まですべて説明しろと言ったんだ?
順序を考えればおまじないなんて馬鹿なことを言わずに済むだろ

412:デフォルトの名無しさん
10/06/23 01:19:51
だよな。
「おまじない」とかふざけすぎ。
まず最初は printf を使わずに教えるべき。
C は、入出力は言語機能自体には含まれていない、と教えるべき。
苦C とかいうサイトはそういう始め方だったから好感が持てた。


413:デフォルトの名無しさん
10/06/23 01:22:05
>>411
#include で別のファイルを読み込みます

中を見てみましょう

???

これじゃ先に進みそうにないから
おまじないっていうんだよ

414:デフォルトの名無しさん
10/06/23 01:24:28
>>413
「おまじない」が「おまじない」じゃなくなる時点でもヘッダファイルの中身なんて見てないだろ
関数の概念だけ教えれば済む話。高校以上なら簡単なに受け入れられる

415:デフォルトの名無しさん
10/06/23 01:24:34
それが正しい順序?
初心者にはまず目に見える結果が出る部分を教えないと。
自分の覚えたことの結果が出ないと正しいのか間違ってるのかの判断も付かない。
だからprintfを最初に教えるのは理にかなっている。

printfを使うためにはインクルードがどうたらこうたらやり始めるのか?アホクセー

416:デフォルトの名無しさん
10/06/23 01:26:52
せめて printf は後にしろよ。
puts とか putchar が先だろ。


417:デフォルトの名無しさん
10/06/23 01:27:03
疑問があるから質問したんだろ。
授業とは違うんだよ、生徒の質問に答えろって話。

418:デフォルトの名無しさん
10/06/23 01:28:03
教えるのは後回しでもいいけど、「おまじない」って言葉を使うのはダメだと思う。

419:デフォルトの名無しさん
10/06/23 01:28:47
Java の System.Console.○○○ は最初から使えるのは何で?

420:デフォルトの名無しさん
10/06/23 01:29:44
単なる言葉の言い回しの是非をグダグダいうのも実に馬鹿らしいな

421:デフォルトの名無しさん
10/06/23 01:30:10
>>418
どんな言葉なら気が済むんだ

422:デフォルトの名無しさん
10/06/23 01:31:48
>>421
「これからC言語のプログラムを書きます」の合図でいいんじゃないです?

423:デフォルトの名無しさん
10/06/23 01:32:03
プリントフ

>>419 それC#。JavaはSystem.out.println()な。Java.langパッケージは宣言なしで使えるから。

424:デフォルトの名無しさん
10/06/23 01:32:33
>>422
おまじないよりタチ悪いな

425:デフォルトの名無しさん
10/06/23 01:33:21
>>422
おまじないと同レベルに糞。

426:デフォルトの名無しさん
10/06/23 01:33:58
>>425
ハァ?同レベル?

427:デフォルトの名無しさん
10/06/23 01:35:20
>>426
そう。どっちもまるで必須みたいで的外れ。printfを使いたいがために書いてるんだからそう言えばいいだけ

428:デフォルトの名無しさん
10/06/23 01:36:32
じゃあなんて言うんだよ!
お前も同レベルの事言うんだろ?言ってみろや

429:デフォルトの名無しさん
10/06/23 01:38:26
ここはCの教え方についてのスレになってるので>>407は取り消しますw

430:デフォルトの名無しさん
10/06/23 01:39:10
質問スレは別にあるし

431:デフォルトの名無しさん
10/06/23 01:39:36
>>427
それおまじないとどう違うの?
printfを使うためのおまじないじゃん

432:デフォルトの名無しさん
10/06/23 01:40:46
>>431
「おまじない」と「printfを使うためのおまじない」とには大きな差があるんだが

433:デフォルトの名無しさん
10/06/23 01:42:37
Q 「おまじない」ってなんですか?
A 「printfを使うためのおまじない」だよ

すげえ、大きな差だ
レベルたけえwwwwww

434:デフォルトの名無しさん
10/06/23 01:43:12
両方とも何も説明してないから同じだな

435:デフォルトの名無しさん
10/06/23 01:44:23
馬鹿学生は意味が知りたかったんだよな?
それを「printfを使うためのおまじない」と答えて大きな差だと言う。

436:デフォルトの名無しさん
10/06/23 01:44:42
もっと言えばスタンダードアイオー、標準入出力関数だよ。そう言えば良い
おまじないと言うより百倍良いだろう

437:デフォルトの名無しさん
10/06/23 01:45:39
馬鹿学生は意味が知りたかったんだよな?
それを「スタンダードアイオー、標準入出力関数だよ。」と答えて大きな差だと言う。

438:デフォルトの名無しさん
10/06/23 01:45:46
>>432
printf を使うためってのを理解させるには関数について教えなきゃいかんだろ
最初は #include も main も printf も return もおまじない

439:デフォルトの名無しさん
10/06/23 01:46:43
最初からprintfのポインタの説明から入って分かる訳ないじゃん。文字列リテラルとかの説明をいきなり教えるの?

440:デフォルトの名無しさん
10/06/23 01:46:45
>>436
それなんも教えてないよ。関数って何?ってなるだけだろ。

441:デフォルトの名無しさん
10/06/23 01:47:11
>>432で大きな差があると言ったら、それが答えみたいにとられてうざいんだが
>>438
俺は初めから関数について教えればいいと言ってるだろ

442:デフォルトの名無しさん
10/06/23 01:48:45
おまじない、に対しての答えが、関数を教える?

443:デフォルトの名無しさん
10/06/23 01:49:17
いきなり関数の説明から入るのかよ。ハードル高い授業だぜ。

444:デフォルトの名無しさん
10/06/23 01:49:59
int main()とかvoid main(void)とか書かれて混乱する入門者も多い
引数も戻り値も分かってないから当然だわな。関数を教えて、mainが特殊な関数だと教えればいいだろう

445:デフォルトの名無しさん
10/06/23 01:50:36
それって「おまじない」とどう違う?

446:デフォルトの名無しさん
10/06/23 01:50:56
意味が分かる

447:デフォルトの名無しさん
10/06/23 01:51:23
>>414
みるだろ。
printfってどうなってんの^^と気軽にのぞいて凹むステップは必要。

448:デフォルトの名無しさん
10/06/23 01:51:27
なんの意味だ

449:デフォルトの名無しさん
10/06/23 01:51:42
意味論の意味だよ

450:デフォルトの名無しさん
10/06/23 01:52:42
>>407
0は偽なので、その反対は真です。

451:デフォルトの名無しさん
10/06/23 01:52:50
結局おまじないじゃねえか

452:デフォルトの名無しさん
10/06/23 01:52:58
>>447
それには同意。用意されてるソートとかな

453:デフォルトの名無しさん
10/06/23 01:54:04
>>451
それはお前がやってるプログラミングが今もおまじないだからだろ

454:デフォルトの名無しさん
10/06/23 01:54:35
おっと罵倒きました!

455:デフォルトの名無しさん
10/06/23 01:54:38
>>453
話をすりかえるな
馬鹿学生の話をしてんだよ?

456:デフォルトの名無しさん
10/06/23 01:56:03
そもそもHello world.をprintfで出力することがおかしいとは考えないのか?
printfを用いるとしても、printf("%s\n", "Hello world.");と記述させるべきなのではないか?

457:デフォルトの名無しさん
10/06/23 01:56:10
そりゃ馬鹿文系学生のための一般教養のプログラミング入門ならおまじないでいいよ

458:デフォルトの名無しさん
10/06/23 01:57:21
おまじないで済ますなって話してんだよボケが!!!

459:デフォルトの名無しさん
10/06/23 01:57:36
おまじないが気にくわない→なぜそれが必要なのかの説明がないから気にくわない
ここまでいっておきながら、
なぜprintfでなければならないのかの説明がない
というところに進めないところに馬鹿の壁を見た。

460:デフォルトの名無しさん
10/06/23 01:58:18
>>459
なぜHello Worldでなければならないのかと同義だろ

461:デフォルトの名無しさん
10/06/23 01:58:46
おまえはどこに進んでんだwwww

462:デフォルトの名無しさん
10/06/23 02:00:17
おまじないって実生活ではただの気休めで効果があるのかないのかもわからないだろ。

プログラムにはそんな曖昧な要素が入り込む余地はないから、
おまじないって言葉を使うのはふさわしくない。

463:デフォルトの名無しさん
10/06/23 02:00:52
で、なんという言葉ならいいんだ?

464:デフォルトの名無しさん
10/06/23 02:01:03
願いを込めて、インクルード

465:デフォルトの名無しさん
10/06/23 02:02:07
質問に答えてください

466:デフォルトの名無しさん
10/06/23 02:02:50
説明すれば良いと言ってるのに、おまじないに代わる言葉を探してる時点でカス

467:デフォルトの名無しさん
10/06/23 02:03:03
>>460
文字列をコンソールに出力しましょう。文字列は別に何でも良いですが、Hello world.と出力しましょう。
これで十分理由に値する。
しかし、なぜprintfを用いるのかについては理由が明らかになっていない。
まるでリテラルを出力するためにはprintfでなければならないと思い込んでいるかのようだ。

scanfにはなぜアドレスを渡さなければならないのか。これについての疑問が解けた直後、
なぜ可変個の引数が渡せるのかという疑問を持つべきである。

>>461
もちろん、明日に向かって進んでいる。その延長には明後日がある。

468:デフォルトの名無しさん
10/06/23 02:04:07
>>462
実生活でも説明するのが面倒なときはおまじないって言うだろ
とくに子供に対して、前提となる知識や経験が不足している場合はとくに

プログラミングでも同様だよ
きちんと説明するには手間がかかりすぎるからおまじないって言われた、
つまり言われた側はまだまだレベルが低いってこと

469:デフォルトの名無しさん
10/06/23 02:04:28
>>466
説明?どれの事だね?

470:デフォルトの名無しさん
10/06/23 02:05:02
>>467
なんでもいいが、Hello worldと出力しましょう。なんでもいいが、printfを使いましょう

471:デフォルトの名無しさん
10/06/23 02:06:11
結局、満場一致で
おまじないでいい
という認識でいいのか?
教授は正しかったんだよな?

472:デフォルトの名無しさん
10/06/23 02:06:37
おまじない(笑)どんな低レベルな大学なんだよ、哀れ

473:デフォルトの名無しさん
10/06/23 02:07:03
>>470
ばかだなぁ。

高校出た時点で知識レベルをそろえる必要なんてなくなるんだから
おまじないで済ませてよい学生と、済ませてはならない学生が出てくるのは確か。
しかし、教授にその説明を求めるのもまた間違いだろうな。
金さえ払えばなんでもできるなんて甘えは捨てないと。

474:デフォルトの名無しさん
10/06/23 02:07:15
しかし、誰もおまじない以上の説明を書かないという。

475:デフォルトの名無しさん
10/06/23 02:07:53
>>473
は?俺教授に質問した学生なの?

476:デフォルトの名無しさん
10/06/23 02:08:18
同レベル

477:デフォルトの名無しさん
10/06/23 02:08:25
え、もしかしておまじないどまりの人?

478:デフォルトの名無しさん
10/06/23 02:09:05
>>475
ごめんね。後段はあなたへのレスじゃなかったんです。ツイート()なんです

479:デフォルトの名無しさん
10/06/23 02:09:15
>>474
じゃあお前は今もおまじないと思ってるわけ?ちゃんと分かってるなら、そう説明すればいいだろ

480:デフォルトの名無しさん
10/06/23 02:10:03
俺、教授じゃねえよ?

481:デフォルトの名無しさん
10/06/23 02:10:26
>>479
なんかずれてんぞ。
この場で説明してあげるべきだと考えてるなら説明すればいいだろ、じゃないのか?

482:デフォルトの名無しさん
10/06/23 02:10:58
>>474
プリプロセッサから解説しないといけないし
おまじないでいいと思うけどな。最初は不要な知識だし

483:デフォルトの名無しさん
10/06/23 02:11:35
結局物事には順序がある。
初心者にいきなり関数の説明とかポインタの説明したってわかる訳がない。
順序立てて学習して行くことでいままでおまじないだった事が理解できるようになる。scanfに何で&を付けるのかもわかるようになる。それで良いじゃないか

484:デフォルトの名無しさん
10/06/23 02:11:36
興味があって大学来てんだから、最初のプログラミングの講義受ける時点で半分以上はもうおまじないなんかじゃないんだよ
そこでおまじないとか言って二極化を促進させる教授パネェよ

485:デフォルトの名無しさん
10/06/23 02:12:05
ある変数(10桁)の
1の位:
10の位:
100の位:
1000の位:
  ・
  ・
  ・
ってな感じで出力する簡単な計算式教えてください

486:デフォルトの名無しさん
10/06/23 02:12:41
今の時代、大学なんて義務教育なんだよ

487:デフォルトの名無しさん
10/06/23 02:14:05
>>462
おまじないには自己暗示効果があるから、信じて実行すれば効果があるよ。
少しでも疑ったら魔法は消える。

488:デフォルトの名無しさん
10/06/23 02:14:46
おかげでレベルが下がった

ちゃんと試験でバカは落とせよ

489:デフォルトの名無しさん
10/06/23 02:14:56
あれもこれもインクルードして、いっぱいおまじないすればいいね

490:デフォルトの名無しさん
10/06/23 02:15:54
「プロセッサ」とか言ってるやつって何なの?
プロセスを「プロセッス」とか言うわけ?
「キッス」とか旧世代の言葉を使う人?w

491:デフォルトの名無しさん
10/06/23 02:15:59
>>484
マジレスすると大学のプログラミング講義でおまじないレベルからやるのって興味ない人向けの授業だよ
興味のある人は入門なんか飛ばして次の講義を受けるべき

492:デフォルトの名無しさん
10/06/23 02:16:54
>>489
あれもこれもインクルードするぐらいになったらもうおまじないじゃなくなってるだろ

493:デフォルトの名無しさん
10/06/23 02:17:00
おまじないはある種のパターナリズムなんだよ。
『お前には分からんかもしれんけど俺が正しいから従え』というのを言い換えただけ。

494:デフォルトの名無しさん
10/06/23 02:17:26
>>491
マジレスすると入門向けの講義受ければ休みまくっても余裕でいい成績が取れる

495:デフォルトの名無しさん
10/06/23 02:17:46
>>488
さがんないよ。授業余裕なら単位取れる最低限の行動だけして残った時間を有意義に過ごせばいい。
それが大学だろ。

496:デフォルトの名無しさん
10/06/23 02:18:13
プログラマになりたいのだったら小中学生のころにC言語くらいできるようになってんだろ
お前らもそうだったよな?

497:デフォルトの名無しさん
10/06/23 02:18:43
まさかFラン大学じゃないだろうな
質の高い教育はそれなりの場所へ行かなきゃ受けられないんだよ
授業料さえ払えばなんでも教えてもらえると思うのが大間違い
これが格差というもの

498:デフォルトの名無しさん
10/06/23 02:18:48
おまいら明日どうすんの?

499:デフォルトの名無しさん
10/06/23 02:19:23
小学生で既にLisperだった

500:デフォルトの名無しさん
10/06/23 02:19:52
>>490
URLリンク(www.intel.co.jp)
インテルにあやまれ

>>494
きちんとサボればおまじないが気になることなんて無い

501:デフォルトの名無しさん
10/06/23 02:21:14
>>496
中学の頃はPC-8001にカセットテープの時代だったのでCコンパイラが動く環境がありませんでした

502:デフォルトの名無しさん
10/06/23 02:21:42
>>500
サボりまくっても2chにこんだけおまじないの人がいるんだから気になるよ

503:デフォルトの名無しさん
10/06/23 02:22:01
くたばれジジイ

504:デフォルトの名無しさん
10/06/23 02:24:57
てか、そもそもその授業の単位を取得した時点で#include<stdio.h>がなんであるかの
具体的な説明をする予定がないんじゃないの?

505:デフォルトの名無しさん
10/06/23 02:26:38
>>485
while(n) {
printf("%d\n", n % 10);
n /= 10;
}

506:デフォルトの名無しさん
10/06/23 02:31:11
なんかマルチしまくってんのがいるなw

507:デフォルトの名無しさん
10/06/23 02:38:27
>>505
ありがとうございます

508:デフォルトの名無しさん
10/06/23 03:19:18
数学が(好き|得意)な奴には、「おまじない」が嫌いな奴が多い。
数学には「おまじない」など存在しない。
数学においては、新出の語句や定理は、必ずそれ以前に学習した定義・定理から導き出せる。
>>386の言い分もわからんでもない。
むしろ、「おまじない」になんの疑問も抱かない奴よりは見込みある。


教授にはぐらかされても放置せず、自分で調べようとしているならば、だが。

509:デフォルトの名無しさん
10/06/23 03:22:44
導き出せはしないだろ。
決めごとなんだから。

510:デフォルトの名無しさん
10/06/23 03:47:21
>>508
その定義・定理を自分で調べようともせず教授に教えろと言ってんだよ
どこに見込みがあるってんだ

511:デフォルトの名無しさん
10/06/23 04:06:01
>>510
ちゃんと最後の行読みなよ。

512:デフォルトの名無しさん
10/06/23 04:24:47
>>511
ちゃんと今までの話を読んだか?
最後の行はまるで的外れ。

513:デフォルトの名無しさん
10/06/23 04:30:08
詭弁の特徴のガイドライン

1:事実に対して仮定を持ち出す
2:ごくまれな反例をとりあげる
3:自分に有利な将来像を予想する
4:主観で決め付ける
5:資料を示さず自論が支持されていると思わせる
6:一見関係ありそうで関係ない話を始める
7:陰謀であると力説する
8:知能障害を起こす
9:自分の見解を述べずに人格批判をする
10:ありえない解決策を図る
11:レッテル貼りをする
12:決着した話を経緯を無視して蒸し返す
13:勝利宣言をする
14:細かい部分のミスを指摘し相手を無知と認識させる
15:新しい概念が全て正しいのだとミスリードする


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch