C言語なら俺に聞け(入門編)Part 96at TECH
C言語なら俺に聞け(入門編)Part 96 - 暇つぶし2ch1:デフォルトの名無しさん
12/02/04 03:01:40.24
C言語の*入門者*向け解説スレッドです。

★前スレ
C言語なら俺に聞け(入門編)Part 95
スレリンク(tech板)
★過去スレ
URLリンク(makimo.to:8000)
★教えて欲しいのではなく宿題を丸投げしたいだけなら
  ↓宿題スレ↓へ行ってください。
C/C++の宿題片付けます 156代目
スレリンク(tech板)
★C++言語については避けてください。C++対応明記スレへどうぞ
★分からない事をなるべく詳しく書いて下さい。
★ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
★開発環境や動作環境も晒すと答えが早いかもしれません。
★質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

長くなりそうなコードはcodepadに貼り付けてもいいでしょう
URLリンク(codepad.org)

2:デフォルトの名無しさん
12/02/04 11:35:00.20
URLリンク(codepad.org)


フィボナッチ数列の中で、偶数の値のものを足していくプログラムです。
その偶数の値が400万を超える項になるまで繰り返すのですが、うまくいきません。
どうすればいいでしょうか。



3:デフォルトの名無しさん
12/02/04 11:44:19.85
>>2
ちなみに出るエラーは
'fibo' : 1 番目の引数を 'void' から 'int *' に変換できません。
と出ます。

偶数の値になるときは、
2項目、5項目、8項目、11項目、14項目・・・です。
3項先の値は約4倍の値になるので、それをaddに格納して400万を越えるかどうかの判定をしてます。

4:デフォルトの名無しさん
12/02/04 11:54:37.66
>>2
URLリンク(codepad.org)

5:デフォルトの名無しさん
12/02/04 13:12:23.35
>>4
素晴らしい回答をありがとうございます!


あの、値渡しが上手くいかないんですけど、
どうすればいいでしょうか?

6:デフォルトの名無しさん
12/02/04 14:13:43.38
>>5
値渡し云々よりもまず、
add = fibo(fibo(&a,&b),fibo(&a,&b));
この呼び出しの仕方だけど、関数呼び出しの引数を渡す所で、
同じ変数を更新する関数を呼ぶのは、呼び出しの順番が保証されないのでまずい
int z;
void f(int a,b,c) { }
void a(void) { z = 1; } void b(void) { z = 2; } void c(void) { z = 3; }
f(a(),b(),c());
この例ではa b cでそれぞれzを更新しようとしても、
どの順番に呼ばれるのかは言語の仕様に規定がないので、
zの結果は処理系依存になる。

で、値渡しができない件については、関数の結果の値は右辺値だから、
その値に対してのアドレスは得られない。
一度、結果を別の変数に格納して、その変数のアドレスを渡せば良い。
int tmp = fibo()
fibo(&tmp)

7:デフォルトの名無しさん
12/02/04 14:16:33.88
つーかfiboの型はvoidじゃないか。
voidじゃなくてint *にして適当にreturnで返せば意図通りになるよ。


8:デフォルトの名無しさん
12/02/04 15:17:27.77
なるよね

9:デフォルトの名無しさん
12/02/04 15:29:24.92
呼び出しの順番がどうとか関係ないよね

10:デフォルトの名無しさん
12/02/04 15:53:12.09
ないよね。

11:デフォルトの名無しさん
12/02/04 15:58:21.51
Cには値渡ししかないけどな。

12:デフォルトの名無しさん
12/02/04 18:36:36.21
関数引数の評価順序は規定されてないんだから
あんな書き方するもんじゃないよって事だよ



13:デフォルトの名無しさん
12/02/04 19:02:44.18
そもそも元の意味がわからんが、どういう順でよばれても同じ結果になる感じじゃないのか。
だからそもそも論点が違う。

14:デフォルトの名無しさん
12/02/04 21:06:04.79
>>4
上手いな。

15:デフォルトの名無しさん
12/02/04 21:14:03.83
まぁ最近はあんまりしてないけど、はじめてCしたのはもう30年以上前だからな。

16:デフォルトの名無しさん
12/02/04 22:22:05.74
><

17:デフォルトの名無しさん
12/02/04 23:26:06.87
あれは30年前
止めるあなた駅に残し

18:デフォルトの名無しさん
12/02/04 23:40:18.97
>>9-10, >>13
どんな順序でも結果が同じになればいいというわけじゃない。

それがいいなら、a = (i++) * (i++); もいいことになる。

C-FAQ: 3.2, 3.8

19:デフォルトの名無しさん
12/02/04 23:56:16.60
assertの内部実装に関して質問なのですが、
プログラム中でassertに引っかかって停止した場合、
OSに対して、何かしらの値を戻したりしているのでしょうか?

20:デフォルトの名無しさん
12/02/05 00:20:23.07
>>18
未定義と不定は違うのだよ。

21:デフォルトの名無しさん
12/02/05 00:45:36.11
>>20
それがどうかしたのか?

22:デフォルトの名無しさん
12/02/05 00:47:51.63
>>19
それは実装次第じゃないかな。

23:デフォルトの名無しさん
12/02/05 01:21:18.15
mainのなかでファイルからデータを読み込んで、構造体の配列で宣言したものを
ユーザー定義関数?でつかうにはどうしたらいいんですか?

24:デフォルトの名無しさん
12/02/05 01:35:49.01
>>18
論点が違うよ。
>>2のケースは
URLリンク(codepad.org)
こういうことだから評価順は関係ないよね
ってな話。
分かる?

25:デフォルトの名無しさん
12/02/05 01:36:39.45
>>23
mainのなかでファイルからデータを読み込んで、構造体の配列で宣言したものを
ユーザー定義関数?でつかえばいい。

26:デフォルトの名無しさん
12/02/05 01:38:01.47
「ファイルからデータを読み込んだデータ」をつかう?
「構造体の配列で宣言したもの」をつかう?

27:デフォルトの名無しさん
12/02/05 01:45:05.45
まずデータをファイルに書き込んでおいたものを読み込んで
それを構造体の配列で保持します。
mainの中でよみこんだのをユーザー定義関数で使えますか?

28:デフォルトの名無しさん
12/02/05 01:46:09.07
何を言ってるのかよくわからないが、使えない理由はない。

29:デフォルトの名無しさん
12/02/05 01:47:21.68
説明下手ですいません;

30:デフォルトの名無しさん
12/02/05 02:19:34.00
スレチかもしれないが・・・
(1)1から1000までの間に、3と7の倍数の値がいくつ含まれているのか求めるプログラムを書け。

(2)キーボードから西暦年を入力し、その年がサッカーワールドカップ開催年かどうかを判定するプログラムを作成せよ。

この2つのプログラムを作成してくれませんか?自分でやってみたのですが、イマイチうまくいかなくて・・・

31:デフォルトの名無しさん
12/02/05 02:33:10.21
スレ違い。

32:デフォルトの名無しさん
12/02/05 02:33:36.06
スレチか~残念

33:デフォルトの名無しさん
12/02/05 03:01:52.49
>>14
まぁ、メジャーなサンプルだから、ここから学ぶことは多いよね。

>>18
順番関係ないよ。
その2行目は曲解もはなはだしいけど

34:デフォルトの名無しさん
12/02/05 03:20:08.84
>>27
ユーザ定義関数に引数で渡せば使える

35:デフォルトの名無しさん
12/02/05 10:07:07.51
>>24
結果が正しいからOKって?
いや、まあ君がそれでいいなら別に言うことはないけど。

36:デフォルトの名無しさん
12/02/05 15:01:40.90
>>35
どこが問題なの?

37:デフォルトの名無しさん
12/02/05 15:37:15.24
head.h、one.cpp、two.cppのファイルの構成で
head.hの中にaaa()、bbb()という関数があったとして
one.cpp、two.cppともに、head.hをインクルードしたとき
関数aaaとbbbはちゃんと1つずつメモリに読み込まれるんでしょうか?
exe実行すると、2個ずつメモリに展開されるようになるんですか?

38:デフォルトの名無しさん
12/02/05 15:45:04.03
そもそもhead.hに関数の定義をしてはいけない。
してしまったとしたら、その関数が外部リンケージならエラーになるはず。
ファイルリンケージなら、実体は複数できる可能性が高い。

39:デフォルトの名無しさん
12/02/05 15:52:25.44
ありがとうございました

40:デフォルトの名無しさん
12/02/05 16:17:02.29
>>37
>>38の補足になるけど

>head.hの中にaaa()、bbb()という関数があったとして
これが宣言なのか定義なのかが問題。
通常は宣言だと思うので、それならば問題ない。
定義だとすると>>38の問題がでる。

これがinline関数だとしたら処理がインラインに展開されることになり、
メモリは余計に食うことになる。

41:デフォルトの名無しさん
12/02/05 16:25:37.68
よっぽど短い関数の場合だとインライン展開した方が小さい場合もあるけどな。

42:デフォルトの名無しさん
12/02/05 17:18:20.48
FILE *fp;
fp = fopen("data.txt","r");
for(i=0; i<10; i++)
{
if((fscanf(fp,"%[^,],%d",data[i].name, data[i].score)) != EOF)
{
number++;
}
else
{
break;
}

ファイルの読み込みってこれであってますか?
うまくうごかないんですけど

43:デフォルトの名無しさん
12/02/05 18:25:51.58
>>42
どう、うまく動かないかわからんのだが。
ついでにdata構造体の宣言が見えないとわからん。

気になるのはdata[i].scoreはポインタを渡しているかってことかな。

44:デフォルトの名無しさん
12/02/05 19:02:19.27
struct file_data{
char name[100];
int score;
};

struct file_data data[10];

構造体の宣言はこんな感じです。
if(fp==NULL){
printf("指定されたファイルが存在しません\n");
}
if文の中が表示されてしまうんですけどどうしたらいいですか?


45:デフォルトの名無しさん
12/02/05 19:06:50.43
>>35
なぜ?
> どんな順序でも結果が同じになればいいというわけじゃない。
>
> それがいいなら、a = (i++) * (i++); もいいことになる。
>
> C-FAQ: 3.2, 3.8
とか言ってる人だから日本語通じないのかな


>>44
fscanf(fp,"%[^,],%d\n",data[i].name, &data[i].score)

46:デフォルトの名無しさん
12/02/05 19:49:33.99
>>45
どういう理由で日本語通じないと言ってるのか、さっぱりわからんが、
>>24 で満足してるなら別にいいんじゃね。

別に君がどうなろうと、俺にとってはどうでもいいし。

47:デフォルトの名無しさん
12/02/05 20:30:54.82
なんだ、まだ不定と未定義の区別もついてないのか。
それとも理解したくないのか。

48:デフォルトの名無しさん
12/02/05 20:42:51.06
function(exp_a(), exp_b(), exp_c());
この評価順も不定だからダメと言いたいのだろうか。バカ丸出しだな。>>35

49:デフォルトの名無しさん
12/02/05 20:51:52.95
>>46
> C-FAQ: 3.2
これは引数の評価順のFAQじゃないのね
C-FAQ: 3.2 で理解できないのなら
URLリンク(www.st.rim.or.jp)
Q 【i++ * i++】
に目を通した上で読み直してごらん

> どんな順序でも結果が同じ
とする例として
>a = (i++) * (i++);
を出すのはおかしい事に気づくはず

50:デフォルトの名無しさん
12/02/05 21:53:41.28
>>49
Q 【未定義の例】未定義である場合としては、どのようなものがあるか。
A 二つの副作用完了点の間に、オブジェクトの値を2回以上変更している場合、
  又は変更した後で新しい値を得ること以外の目的でそのオブジェクトをアク セスしている場合。

fibo(fibo(&a,&b),fibo(&a,&b)); の式は、(間違ってるけど) 式中で a, b を2回以上
変更してるからダメということ。

>>47
この手の議論で「不定」とか出してくる奴には用はないよ。

>>48
exp_a( ), exp_b( ), exp_c( ) で、同一オブジェクトを変更しているかどうかが問題。
なので、exp_a( ) の内容も示せずにレスする奴は、何も理解してない馬鹿。

51:デフォルトの名無しさん
12/02/05 21:56:54.79
この場合重要なのは、一つの式の中で、副作用が発生する操作を二回行う
ということです。その結果は未定義なので、この printf がどのような値を表示
してもC言語の仕様としては問題ありません。極端な場合、ここでプログラムが
異常終了してしまっても問題ありません。

52:デフォルトの名無しさん
12/02/05 22:17:54.47
>>51
>この場合重要なのは、一つの式の中で、副作用が発生する操作を二回行う
>ということです。その結果は未定義なので、

ダウト。

printf("%d %d\n", a++, b++); は、副作用が発生する操作を2回しているが問題ない。

問題にすべきなのは、「同一オブジェクトに対して」副作用が複数回発生すること。

53:デフォルトの名無しさん
12/02/05 22:22:15.96
もうただの揚げ足の取り合いだなw

54:デフォルトの名無しさん
12/02/05 22:29:05.79
>>44
>if文の中が表示されてしまうんですけどどうしたらいいですか?
ってことはfpがNULLなんだろ。
ファイルが開けないのだから、ファイル名があっているか、パスがあっているか、
そのあたりでしょ。

それと、その構造体の宣言なら、%dに対応する変数はポインタを渡す必要があるから
>>45のとおりfscanf(fp,"%[^,],%d\n",data[i].name, &data[i].score)
data[i].nameもポインタになっているのは、わかるよね?

55:デフォルトの名無しさん
12/02/05 22:40:58.60
>>50
話の通じない人だな
24の簡単なサンプルが理解できないようだから
更に簡単に書くよ

int f() { static i=2; return i++; }
int sum(int a, intb) { return a+b; }
int sub(int a, intb) { return a-b; }

int main() {
printf("%d\n", sub(f(), f()));
printf("%d\n", sum(f(), f()));
return 0;
}

これなら分かるかい?
2-3 が 3-2では困るが
2+3 は 3+2は同じだろ?
小学生でも分かる交換法則な
>>2でのケースはそれなんだよ

56:デフォルトの名無しさん
12/02/05 22:50:44.07
>>51
> exp_a( ), exp_b( ), exp_c( ) で、同一オブジェクトを変更しているかどうかが問題。
かかったな。どの順序で呼んでも全然問題ありませんが、何か言い残す事は? w

int total
exp_a( )
{
total +=1;
}
exp_b()
{
total +=2;
}
exp_c( )
{
total +=3;
}

57:デフォルトの名無しさん
12/02/05 23:04:21.70
どの順序で呼ぶとか以前に
同じオブジェクトを1つの式中で変更するようなコードの動作は未定義なんでしょ?

58:デフォルトの名無しさん
12/02/05 23:06:47.58
足りなかった&ちょっと言い方が違うか
同じオブジェクトを1つの式中で複数回変更するようなコードを実行すると
鼻から悪魔が飛び出すんでしょ?

59:デフォルトの名無しさん
12/02/05 23:19:48.44
>>57
関数呼び出しの引数並びは「一つの式」じゃありませんが。

なるほど、こんなことも知らずに「副作用完了点ガー」って、
覚えたての念仏唱えてたのか。w

60:デフォルトの名無しさん
12/02/05 23:28:26.83
だから揚げ足取りw

61:デフォルトの名無しさん
12/02/05 23:31:28.55
わからなくて調べててわからなかったんだが
URLリンク(f4.aaacafe.ne.jp)
これの最後のレスがあってるということ?

62:デフォルトの名無しさん
12/02/05 23:33:39.64
>>59
関数呼び出し(を含む式)は1つの式じゃないの?

63:デフォルトの名無しさん
12/02/05 23:35:16.49
途中で(順序は不明だが)関数を呼び出してる(副作用完了点になる)
どういう順序で関数が呼ばれても結果が変わらない
からOKということか

64:デフォルトの名無しさん
12/02/06 00:27:12.54
float a = ...
float b = ...
float c = (float)(((double)a) * ((double)b));

このコードは誤差を減らすためにやっているんですか?

65:デフォルトの名無しさん
12/02/06 00:41:01.38
>>64
試してみりゃいいじゃん
double a,b,c;
double a,b; float c;
float a,b; double c;
とかのパタンで


66:デフォルトの名無しさん
12/02/06 01:15:18.08
素人が書きましたという意味。
それじゃ、誤差は減らないから。

67:デフォルトの名無しさん
12/02/06 07:31:33.37
で、結局>>50がアフォってことでFA?
関数呼び出しが副作用完了点てことも知らなかったのかな。

68:デフォルトの名無しさん
12/02/06 08:00:23.40
何にしろf(g(), h())みたいな書き方はマイナス査定対象

69:デフォルトの名無しさん
12/02/06 08:06:55.29
アフォ登場。

70:デフォルトの名無しさん
12/02/06 08:25:26.34
文字列中の部分文字列を検索する関数を作成したいのですが
strstr関数だと先頭に来る文字列しか検索できないので、
その次以降にも文字列が含まれているかどうか探していくにはどうやってプログラムすればいいんでしょうか
例えば str1="abcabdefgabchaiab" という文字列がある時、文字列「abc」が含まれる個数を数えるといった具合です

71:デフォルトの名無しさん
12/02/06 08:36:17.15
>>70
URLリンク(codepad.org)

72:デフォルトの名無しさん
12/02/06 08:47:09.95
>>71
ありがとうございます!

73:デフォルトの名無しさん
12/02/06 09:08:13.60
しかし、>>50の言い草はまたすごいなぁ
結局用が無かったのは>>50なわけでwww

74:デフォルトの名無しさん
12/02/06 10:02:32.17
>>64
floatをdoubleにしても、元がfloatなので有効桁はfloatの時と
同じなので意味がない。
double化することにより、乗算の結果表現可能よりはみ出すこ
とを抑制できるが、float化するのでこれまた意味がない。

つまり>>50並みのアフォが書いた意味なしコード。

75:デフォルトの名無しさん
12/02/06 13:34:26.44
>>67
よくわからないなら書かなければいいのにね

76:デフォルトの名無しさん
12/02/06 16:55:11.93
ミーティングの時に「副作用完了点」とぼそっと呟いてみよう。
ピクッと反応した奴が>>50だ。見つけたら笑ってやれ。

77:デフォルトの名無しさん
12/02/06 17:46:54.75
変数の使い方についてなんですが
プログラムを作っていて、変数が新しく必要になった時に
今までの処理で使用したけどもう役目を終えて使っていない変数があればそれを再利用すべきなのか
それとも新しく宣言した方が良いのか、どっちなんでしょうか?うまく表現できなくてすみません

78:デフォルトの名無しさん
12/02/06 17:48:08.11
>>77
意味のある名前をつければおk

79:デフォルトの名無しさん
12/02/06 17:56:02.05
一時変数のtmpを使いまわすかどうかとか、
2個目のループでi j を使いまわすかどうかってレベルの気がする。

80:デフォルトの名無しさん
12/02/06 18:29:11.17
再利用か、別変数か、>>50の意見も聞いてみたい。
>>50の逆をいけばいい。w

81:77
12/02/06 18:39:41.19
>>79
たぶんそのレベルでした

82:デフォルトの名無しさん
12/02/06 19:17:46.90
オブジェクトの解体と再構築のコストが大きくて
可読性を犠牲にして再利用したくなるぐらいなら最利用する
そうでなければ普通に新しく作る

83:はちみつ餃子 ◆8X2XSCHEME
12/02/06 19:23:57.62
>>77
まともな最適化機能をもったコンパイラなら再利用は避けた方が効率的なプログラムになる可能性が高い。
最適化の前段階でのフロー解析において、どの変数がどこに利用されるか等のプログラムの流れを検出しようとするが、
関係の無いところでの使い回しがあると解析しにくくなる。
これは人間にとっても同じで、関係の無い使い回しがあると流れがわかりにくくなり易い。

コンパイラが C99 に対応しているならループ変数程度のものは
for (int i=0; i<n; i++) hoge();
というようにその場限りの使い捨てがやりやすいので積極的に使うといいと思う。

昔の C は関数の先頭でしか変数の宣言をできなかったが、今ではどこでも宣言できるので、
使うところの近くで宣言し、なるべく狭い範囲でだけ使うのが近代的なスタイルと考えられている。

とは言うものの、これらはあくまで原則。 やりすぎるとそれはそれで不都合があることもある。
読み易さや効率はケースバイケースなので盲目的に従うのではなく、
どちらが良いか個別の「意味」を自分なりに考えよう。

プロジェクトによって書き方にガイドラインを設けているものもあるので、
既存のスタイルを参考にするのもいいかもしれない。

84:77
12/02/06 19:29:34.66
参考になりました。みなさんありがとうございます!

85:デフォルトの名無しさん
12/02/06 19:33:14.81
C99以外の環境ってブロックの先頭以外で変数宣言できたっけ?

86:デフォルトの名無しさん
12/02/06 19:35:19.44
void func(void) {
int x;
hoge(x);
{
int y;
fuga(x, y);
}
}

的な感じで書けるから実質宣言場所に制限はないと見てもいいよ

87:デフォルトの名無しさん
12/02/06 19:36:31.93
できないよ

88:87
12/02/06 19:37:04.79
>>85あてね。

89:デフォルトの名無しさん
12/02/06 19:38:41.23
>>80
しばらく>>50を引き合いに出しそうな感じがするからコテつけてもらえると助かる。

90:デフォルトの名無しさん
12/02/06 19:40:58.79
> プロジェクトによって書き方にガイドラインを設けているものもあるので、
> 既存のスタイルを参考にするのもいいかもしれない。

>>50のように聞きかじりの知識を振りかざして混乱させるはた迷惑なバカが
ガイドラインを作っていることも多いので、プロジェクトのガイドラインに
は疑いの目を向けることも重要。

91:デフォルトの名無しさん
12/02/06 19:54:15.48
また変なのがでてきたなぁ…
コテ禁止にはしなかったんだっけ?

92:デフォルトの名無しさん
12/02/06 21:02:11.80
コテつけてもらったほうがありがたい

93:デフォルトの名無しさん
12/02/06 21:07:17.15
逆コンパイルでソースが復元できないC系のwindowsフォームアプリの開発言語でVSに入っているのはなんというものですか?

94:デフォルトの名無しさん
12/02/06 21:07:44.89
>>92
いや、コテつけるようなやつは出入り禁止で。
>>93
スレ違い。

95:デフォルトの名無しさん
12/02/06 21:08:04.00
>>85
C11ならできるだろ

96:デフォルトの名無しさん
12/02/06 21:16:17.39
いや。>>50はぜひコテをつけて、このスレのおもちゃになってもらいたい。

97:デフォルトの名無しさん
12/02/06 21:25:08.17
いやいや。すでに>>50って名前で定着してるだろw

98:デフォルトの名無しさん
12/02/06 22:11:33.58
float a,b,c;
a = 425;
b = 293749;
c = (float)(((double)a) * ((double)b));
printf("%f %f\n",c,a*b);

99:デフォルトの名無しさん
12/02/06 22:27:12.44
>>98
printf()にdoubleで渡してるからだろ。
何がいいたいんだ?
また>>50か?

100:デフォルトの名無しさん
12/02/06 22:28:09.03
ワクワク、>>50の新作ギャグかな。

101:デフォルトの名無しさん
12/02/06 22:32:12.29
初心者向けにC言語の暗黙のルールやバッドノウハウがまとまってるサイトとかってないかな
getsは使うなとかscanfは使うなとかそういうの

102:デフォルトの名無しさん
12/02/06 22:42:48.60
C FAQの初心者版って事?
確かにC FAQ理解できなくて>>50になってしまったら悲惨だからなあ。
2chならいいけどリアルでやったら生きていけないよなあ。w

103:デフォルトの名無しさん
12/02/06 22:43:53.39
お前ら容赦ないなwww

104:デフォルトの名無しさん
12/02/06 22:46:15.96
>>101
バッドノウハウを学ぶタイミングは難しいとおもう。
非推奨の関数に関してはコンパイラの警告で。

105:デフォルトの名無しさん
12/02/06 22:50:00.27
今Macのxcodeでc言語してるんですけど質問はここでいいですかね?

106:デフォルトの名無しさん
12/02/06 22:53:52.00
mac板にxcodeスレがあるみたいだけど。そこじゃダメなの?

107:デフォルトの名無しさん
12/02/06 23:24:50.60
新Mac板は基本objective-cや変化の多い環境環境やアプリや機器の登録とかの話題多いからcだけとかそうゆう感じじゃないんですよね。。MacでCすると窓にはないイレギュラーな事態とか起こったりするんだろうか、?

あ、すみません質問は事故解決しました

108:デフォルトの名無しさん
12/02/06 23:43:06.17
ターミナルでgcc打ってるレガシーな感じでCの勉強してるのかな?

109:デフォルトの名無しさん
12/02/06 23:55:33.61
xcodeのiPhoneアプリやMac用ソフトとかのテンプレの中にcのテンプレがありますねん
メモリ2Gくらい使うソフトでやってるからレガシーではないですな

110:デフォルトの名無しさん
12/02/06 23:58:27.67
>>54-55
馬鹿すぎて話しにならない。

>>59
副作用完了点舐めすぎ。
関数呼び出しが副作用完了点と言うのは正しいが、今回の問題は引数の評価だから、全然違う話。

例えば
int foo(int x, int y){ return x + y; }
int main(){
int a = 1;
int b = foo(a++, a++);
printf("a = %d, b = %d\n", a, b);
return 0;
}
ってやってみればわかる。
引数の評価毎に副作用完了点があるなら、評価の順序にかかわらず a = 3, b = 3 になるはず。(GCC/2.95)
ところが、コンパイラによっては a = 3, b = 2 になる奴がある。(Visual Studio 2010)
もちろん両方ともに処理系としては正しい動作。
そもそも式がダメなのに、それに含まれる関数の引数評価に副作用完了点があると思えるなんて馬鹿すぎる。

111:デフォルトの名無しさん
12/02/07 00:05:40.28
まだほざいてるのかよ。
誰も引数の評価ごとに完了点があるなんて言ってねーよ。

112:デフォルトの名無しさん
12/02/07 00:06:24.95
a++の代わりにadd1(&a)とかにしてみろよ。

113:デフォルトの名無しさん
12/02/07 00:14:26.36
やたら3項演算子使いたがるよね、自称玄人プログラマはw

114:デフォルトの名無しさん
12/02/07 00:15:30.95
まぁ普通は低レベルに合わせないといけないから禁止されてるからそのせいだろw

115:デフォルトの名無しさん
12/02/07 00:17:41.25
3項演算も禁止しなきゃならないぐらいヘボグラマしか居ない環境でまともなアプリケーションなんて作れるの?

116:デフォルトの名無しさん
12/02/07 00:18:30.88
まぁお前も含めて大抵のとこはそんなもんだよ。

117:デフォルトの名無しさん
12/02/07 00:18:37.62
>>4のソースとかニヤニヤしちゃう

118:デフォルトの名無しさん
12/02/07 00:28:39.58
int fibo(int a)
{
if(a == 0) {
return 0;
} else if(a == 1) {
return 1;
} else {
return ( fibo(a - 1) + fibo(a - 2) );
}
}



int fibo(int a)
{
return a == 0 ? 0 : a == 1 ? 1 : fibo(a - 1) + fibo(a - 2);
}

おれってかっけー、いやっほぅ!

119:デフォルトの名無しさん
12/02/07 00:30:23.33
returnの後にelseとか、いつも間抜けに見えるよね。

120:デフォルトの名無しさん
12/02/07 00:36:49.58
やってることは大したことないんだけど、記述次第で凄そうにみえる3項演算子

121:デフォルトの名無しさん
12/02/07 00:39:38.48
まぁ理解してたらその逆だと思うけどなw

122:デフォルトの名無しさん
12/02/07 00:41:31.76
おすすめの本教えて質問はできません

123:デフォルトの名無しさん
12/02/07 00:41:37.31
そもそもif-elseの羅列と三項演算は使い道が違うから
比較すること自体がナンセンス

124:デフォルトの名無しさん
12/02/07 00:46:33.27
ほうほう。
>>4の例が使うべき例だとそういうことだね

125:デフォルトの名無しさん
12/02/07 00:47:20.15
そんな低レベルの話はしなくていいよ。

126: ◆QZaw55cn4c
12/02/07 00:57:09.53
>>120
三項演算子をネストに使うのが便利です。
URLリンク(codepad.org)

127:デフォルトの名無しさん
12/02/07 01:01:37.22
この作例の利点は何だ?w

128:デフォルトの名無しさん
12/02/07 01:02:51.96
三項演算ってのは条件式から値へのマッピングなんだよ
条件分岐とは意味合いが異なる

129:デフォルトの名無しさん
12/02/07 01:04:30.24
うむ、その意味合いの違いが生かせる作例とは?

130:デフォルトの名無しさん
12/02/07 01:08:07.69
Perl使う様になれば理解できると思うよ

131:デフォルトの名無しさん
12/02/07 01:18:33.29
三項演算子は1段までなら簡潔にかけていいこともあるだろうが、
それ以降のネスト化はただの技巧披露にしか見えない

仮に、最適化オプションありでコンパイルしたコードをディスアッセンブリしてみて、
ソースを三項演算子で記述したほうが命令数少ないよって話なら別だが


慣れればフツーに読めるだろ、低能には無理だろうがな
とか言い出す玄人()が出てきそうなネタだね

132:デフォルトの名無しさん
12/02/07 01:20:46.78
むしろ3項のほうがすっきりして読みやすいと思うんだけど

133:デフォルトの名無しさん
12/02/07 01:22:18.38
カンマ式混ぜると痛い事に成るしな

134:デフォルトの名無しさん
12/02/07 01:23:15.94
>>131
そう? (cond) に対応して便利と思わない?

135:デフォルトの名無しさん
12/02/07 01:39:11.04
>>134
ん?どゆこと?

136:デフォルトの名無しさん
12/02/07 01:45:03.81
で、どこに自称玄人プログラマがいるんだ?
色々禁止してやらないとダメな>>115のようなヘボグラマしかいないようだが。

137:デフォルトの名無しさん
12/02/07 02:08:06.07
>>136
そういうあなたは?

138:デフォルトの名無しさん
12/02/07 02:11:15.72
質問には質問で返す。
典型的なヘボ。

139:デフォルトの名無しさん
12/02/07 02:13:56.08
これを俗にブーメランというのだよ >>136


140:デフォルトの名無しさん
12/02/07 02:14:24.49
そして論点をずらす。

141:デフォルトの名無しさん
12/02/07 03:15:20.54
#include <stdio.h>

void func(){
printf("i am func.¥n");
}

int fibo(int a){
return a == 0 ?
(a = 1, 0)
: a == 1 ?
(a = 2, func(), 1)
:
fibo(a - 1) + fibo(a - 2);
}

int main(){
printf("%d¥n", fibo(10));
return 0;
}


142:デフォルトの名無しさん
12/02/07 03:31:12.45
fatal error RC1015: cannot open include file 'l.jpn\windows.rc'.

リソースファイルのコンパイルに失敗します

どうすれば解決しますか?

143:デフォルトの名無しさん
12/02/07 03:41:43.09
>>126
それに慣れるとPHPでびっくりするからやめたほうがいいよ

144:デフォルトの名無しさん
12/02/07 06:06:31.80
おまいら、教えてくれ
page faultの許容ってどんくらい?
process explorerで測定したら2000くらい。
バッチプログラムなんだけど、バッチで2000って多いですか?

145:デフォルトの名無しさん
12/02/07 06:30:04.04
スレ違い。

146:デフォルトの名無しさん
12/02/07 06:49:49.88
int x = 0;
printf("%d %d", ++x, ++x);

147:デフォルトの名無しさん
12/02/07 08:28:54.91
>>141
もはやあほだろ。。

148:デフォルトの名無しさん
12/02/07 09:51:11.12
>>2
#include <stdio.h>

void fibo(int *a, int *b)
{
*b += *a;
*a = *b - *a;
}

int main(void)
{
int sum, a, b;

for(sum = 0, a = 0, b = 1; a <= 4000000; fibo(&a, &b)) {
if(a % 2 == 0) {
sum += a;
printf("%d %d\n", a, sum);
} }

return 0;
}

149:デフォルトの名無しさん
12/02/07 10:10:42.09
URLリンク(codepad.org)

150:デフォルトの名無しさん
12/02/07 13:14:55.81
static unsigned long long fib(unsigned n)
{
if (n == 0) return 0;
static unsigned long long a[94] = {0, 1, };
bool inRange = n < sizeof(a) / sizeof(* a);
if (inRange && a[n] != 0) return a[n];
unsigned long long val = fib(n - 1) + fib(n - 2);
if (inRange) a[n] = val;
return val;
}

151:デフォルトの名無しさん
12/02/07 13:39:44.57
int add_fibo_evnn(int n){
int a=0,b=1,c=0,d;
while((d=b,b+=a,a=d)<=n)c+=d*(~d&1);
return c; }

152:デフォルトの名無しさん
12/02/07 15:46:57.40
C言語のプログラムレポート15個中3個提出しなかっただけで3段階評価で
Cだった...8割出してC(可)ってありえないだろ。ふつうはAだよな。
みなさんどう思う?

153:デフォルトの名無しさん
12/02/07 15:53:13.11
3段階評価ならCって不可じゃねーの?普通

3段階なら、全提出でB、内容がマトモでAだな
提出してないのはCでも文句言えないだろ

154:デフォルトの名無しさん
12/02/07 15:53:54.59
プログラムの出来がパーフェクトで8割提出なら80点
プログラムの出来が80点で8割提出なら80*0.8=64点
プログラムの出来が90点で8割提出なら90*0.8=72点

00-60 不合格
60-70 C
70-80 B
80-100 A

お前のプログラムの出来が80から90に満たない程度の出来だったと判断されたんだろ

155:デフォルトの名無しさん
12/02/07 15:55:05.69
パンデモニウムさんは可愛いけど声がイラつく

156:デフォルトの名無しさん
12/02/07 16:03:32.42
>>154
専門科目が6割以上合格ってどんだけ昔の考え?

157:デフォルトの名無しさん
12/02/07 16:08:14.75
A 優
B 良
C 可

D 不可

だろw

Aくれない教授はゴミだよ。生ゴミ以下。

158:デフォルトの名無しさん
12/02/07 16:18:57.38
それ4段階じゃね?
レポートのみなら未提出がある時点でAはあり得ないだろ

159:デフォルトの名無しさん
12/02/07 16:21:29.31
>>158
単位がくれるっていう前提で3段階っていっちゃったね。
ふつうはどの大学も合格がABCの3つだからね。



160:デフォルトの名無しさん
12/02/07 16:29:03.64
未提出がある時点でAがありえない、とまではいわないが、
未提出があるにもかかわらずAを与えうる回答をそれまでにしたかどうかが気になるな

161:デフォルトの名無しさん
12/02/07 16:30:27.44
つまり、求められた回答と同じレベル(テストで言うと100点)の回答しか出していないなら、未提出がある時点でAはない。

162:デフォルトの名無しさん
12/02/07 16:46:10.86
実は本当は8つ提出してなくてぶっちゃけAとかどうでもよくて
単位が貰えるか不安だったけど安心した俺内野手

163:デフォルトの名無しさん
12/02/07 17:01:57.43
>>159
「単位をくれる」なのか「単位が貰える」なのか
つか前提ってすごいな。最近の大学はそんなもんなのか?

>>162
教授次第だけど1/3以上未提出なら普通はDになるんじゃないかな

164:デフォルトの名無しさん
12/02/07 17:02:21.17
むしろ全部提出してる奴は少ないからな。必修なら落とされないと思う。

165:デフォルトの名無しさん
12/02/07 17:10:40.98
そういや私の通ってた大学も(頭が)足りないやつは追加提出させられてた気がするな
必修ならほぼ落とすことは無いか

166:デフォルトの名無しさん
12/02/07 17:25:23.02
選択がないので1つでも落すとアボン。

167:デフォルトの名無しさん
12/02/07 17:31:58.14
落とされない大学なんぞに意味はないな。

168:デフォルトの名無しさん
12/02/07 17:57:20.43
情報系じゃなかったけど
レポート半期で12本初回抜き打ち試験中間試験定期試験とか当たり前のようにやって
全部提出出席しても試験でしくじって落とされるやつがちらほらいて地獄絵図だった
後輩にはうちの大学には絶対に来るなと忠告したよ

169:デフォルトの名無しさん
12/02/07 18:34:08.84
何の為に大学に行ってるの?

170:デフォルトの名無しさん
12/02/07 18:35:02.15
行かないと社会が人間扱いしてくれないからとりあえず

171:デフォルトの名無しさん
12/02/07 18:43:35.47
>>168
普通だろそれ


172:デフォルトの名無しさん
12/02/07 18:53:04.52
必修だから落とされないとか、そんな世の中なの?

173:デフォルトの名無しさん
12/02/07 18:59:29.22
関数func()内で
int data[177][23]が定義されており、データが関数内で入れられるとします。

この関数の外から、2次元配列のポインタのポインタを渡し、int data[177][23]のアドレスを引数で返したいのですが、


void func( ① ){
int data[177][23];

② = data;
}

void func2(void){

174:デフォルトの名無しさん
12/02/07 19:01:40.10
失礼しました。途中で送信してしまったようで・・・
改めまして


関数func()内で
int data[177][23]が定義されており、データが関数内で入れられるとします。

この関数の外から、2次元配列のポインタのポインタを渡し、int data[177][23]のアドレスを引数で返したいのですが、


void func1(①){
int data[177][23];

② = data;
}

void func2(void){
③ // 2次元配列のポインタのポインタの宣言

func1(④);
}

①~④の記述は、どの様にしたらよろしいでしょうか?


175:174
12/02/07 19:03:24.76
int data[177][23]の実体はfunc1()が持ち、
他の関数からその中身を参照にしたいのです(グローバル変数使用不可)

宜しくお願い致します。

176:デフォルトの名無しさん
12/02/07 19:06:05.04
> 関数func()内で

177:デフォルトの名無しさん
12/02/07 19:07:47.55
mallocを使うか根本的なところから見直す

178:デフォルトの名無しさん
12/02/07 19:15:15.24
void func1( *(*pArray)[23]){
  int data[177][23];

  *pArray = data;
}

void func2(void){
  int *pArray[177][23]; // 2次元配列のポインタのポインタの宣言
  int ans;

  func1(pArray);

  ans = pArray[0][0] + pArray[176][22];
}

イメージとしてはこんな感じですが、もちろんこれでは上手く行きません・・・



179:174
12/02/07 19:17:27.61
int data[177][23]をグローバルに持って行ければ全然問題ないのですが、
事情があって、それが出来ないのです・・・

※私に与えられてる権限としては、func1の引数の変更、func2の製作

180:デフォルトの名無しさん
12/02/07 19:18:57.51
ゴミコード発生の瞬間である。


181:デフォルトの名無しさん
12/02/07 19:20:25.28
やりたい事がさっぱり分からん
エスパー待ち

182:デフォルトの名無しさん
12/02/07 19:25:29.62
その実装だと誤動作するよ。自動変数で調べてね。
以下のいずれかの修正をしてもらう必要がある。

void getData(*****) {
. static int data[N][M];
}
②ソースを分割して、
static int data[N][M];
void getData(*******);

malloc つかう。

183:174
12/02/07 19:29:37.65
>>182
おお!
すみません・・・static扱いでお願いします。
実際はstaticでした。懸案事案の抽象化に失敗してしまいました・・・



void func1(①){
  static int data[177][23];

  ② = data;
}

void func2(void){
  ③ // 2次元配列のポインタのポインタの宣言

  func1(④);
}


184:デフォルトの名無しさん
12/02/07 19:31:48.22
>>181
知りたいのは、「2次元配列のポインタのポインタ」を引数に渡してアドレスを入れてもらう
やり方です

185:デフォルトの名無しさん
12/02/07 19:43:35.47
①int*** value
②*value
③int** data
④&data
で、できると思うけど、何がやりたいのかは知らないし、あまりよくないコードな気がする。
やりたいこと書いて代案出してもらったほうがいいと思うけど、まあ、とりあえず。

186:デフォルトの名無しさん
12/02/07 19:53:39.40
ローカルstaic変数のアドレスを取るとかグローバルと大差ないわ
いや、グローバルはグローバルだって意識できるからまだいいけど
これじゃあソレもできないから最低最悪だな

187:デフォルトの名無しさん
12/02/07 20:40:54.32
静的なオブジェクト/動的なオブジェクト(free必要)
これ以上の情報を意識する必要はないし、意識しなけりゃならないのは最低最悪。
グローバル? 今時使わないよね。w

188:デフォルトの名無しさん
12/02/07 20:44:17.33
質問
関数って引数は何個までとか何バイトまでにした方が良いってのはある?
ある程度を超えるとメモリに積む作業が増えるので急激に遅くなる、とか。
大差無いのかな。

189:デフォルトの名無しさん
12/02/07 20:49:42.42
そんなことを気にするのはお前には早すぎるよ。

190:デフォルトの名無しさん
12/02/07 20:54:56.96
>>187
こいつ最高にアホ

191:デフォルトの名無しさん
12/02/07 20:59:26.69
>>189 初心者は速度を気にしちゃいけないなんて決まりがあったのか。
知らなかったわ、すまん。

192:デフォルトの名無しさん
12/02/07 21:03:19.05
>>188
変数固めて構造体にして、ポインタで渡す
俺なら

193:はちみつ餃子 ◆8X2XSCHEME
12/02/07 21:03:52.10
>>188
パフォーマンスへの影響は環境によるので実測しないとなんとも言えないけど、
計算量的によほど厳しい条件下でなければはっきりわかるような差は出ないよ。
回数が多く呼ばれる関数ならちょっとした差が全体に多きく影響することもあるけど、
どこまで許容できるかは程度問題なのでスパッと基準を決められるものではないな。

194:デフォルトの名無しさん
12/02/07 21:07:52.89
問題になるまでほっときゃいい
腐りだしたら破棄して作りなおしゃいい
ダしゃいいタマがうずくなら

195:デフォルトの名無しさん
12/02/07 21:09:28.84
>>191
決まりではないが鉄則ではある

196:デフォルトの名無しさん
12/02/07 21:10:39.31
>>188
大雑把に1KB以下なら気にしなくていい

197:はちみつ餃子 ◆8X2XSCHEME
12/02/07 21:12:29.93
>>192
Windows API はそういう感じだね。

でも、その構造体だってどこかでメモリを消費するわけだし、
構造体に値を放り込むのだってゼロコストなわけじゃない。
同じデータをある程度何度も繰り返して渡すような状況ならいいが、
そうでないならパフォーマンスの差はほとんど出ないと思う。

バイナリ互換性を維持したまま構造体に要素を追加して拡張できる点で有利ではあるので、
長期的にインターフェイスを維持したいときには考慮に値する方法と言える。

198:デフォルトの名無しさん
12/02/07 21:19:43.77
こういうくだらん話しか出てこないから初心者は気にすることはないってこと。


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