C言語なら俺に聞け(入門篇) Part 21at TECH
C言語なら俺に聞け(入門篇) Part 21 - 暇つぶし2ch2:デフォルトの名無しさん
07/11/07 06:25:04
Part 1 スレリンク(tech板)
Part 2 スレリンク(tech板)
Part 3 スレリンク(tech板)
Part 4 スレリンク(tech板)
Part 5 スレリンク(tech板)
Part 6 スレリンク(tech板)
Part 7 スレリンク(tech板)
Part 8 スレリンク(tech板)
Part 9 スレリンク(tech板)
Part 10 スレリンク(tech板)
Part 11 スレリンク(tech板)
Part 12 スレリンク(tech板)
Part 13 スレリンク(tech板)
Part 14 スレリンク(tech板)
Part 15 スレリンク(tech板)
Part 16 スレリンク(tech板)
Part 17 スレリンク(tech板)
Part 18 スレリンク(tech板)
Part 19 スレリンク(tech板)

3:デフォルトの名無しさん
07/11/07 06:25:50
うお、あぶね俺もたてるとこだった。
ともあれ>>1

4:デフォルトの名無しさん
07/11/07 07:46:40
XP VisualC++2005 ExEdiで作業をしています。

現在WAVEの単純音データに離散フーリエ変換を行ってそのデータをExcelでグラフ化しているのですが
フーリエが終わってデータを格納した後、それをグラフにおこして別窓で表示させたいのですがどのようなプログラムをかけばいいのでしょうか?
またそのような事が詳しくかかれているHPなど参考になるところがありましたら是非紹介をお願いします。

わかりにくくてすみません。

5:デフォルトの名無しさん
07/11/07 13:09:44
窓を開いてグラフを描くようなプログラムを書けばいいです

窓の開き方がわからないとか、図形の表示の仕方がわからない?
その場合は Win32 API を勉強

6:デフォルトの名無しさん
07/11/07 13:23:41
やっぱりWin32APIでの表示なんですね ありがとうございます。

7:デフォルトの名無しさん
07/11/07 14:51:32
強化学習のQ-learningを用いたサンプルプログラムはないですか?

上記とは別にルーレット選択とボルツマン選択のサンプルプログラムもよろしくお願いします。

プログラムはC言語でお願いします。 どうもこれらがイメージつかないんでお願いします。


8:デフォルトの名無しさん
07/11/07 15:30:37
>>7
スレ違い。
つーか、マルチすんなや。
スレリンク(tech板:961番)
スレリンク(tech板:227番)
ちゃんと↑の228にレスついているだろ。

9:デフォルトの名無しさん
07/11/07 15:43:42
末尾再帰の最適化が起きる条件ってやっぱり実装によって違う?

10:デフォルトの名無しさん
07/11/07 15:54:26
>>9
違う。つーか、入門者はそんなこと気にしなくて構いません。

11:デフォルトの名無しさん
07/11/07 15:57:52
と入門者が申しております。

12:sage
07/11/07 16:01:08
>>10
ちょっと気にしてるんだよ。
やっぱgccか・・・?
デバッガ使うスキルがないんで確認ができないんだよね。

13:デフォルトの名無しさん
07/11/07 16:03:15
>>12
アセンブリ出力を読むスキルもない?
例えば、callってニモニックがどこに散らばっているか位読めれば末尾再帰が展開されたかどうか判るんだけど。
つーか、スレ違い脱中年。

14:デフォルトの名無しさん
07/11/07 16:03:35
ない。

15:デフォルトの名無しさん
07/11/07 16:05:19
まずは逆アセンブルからか・・・


16:デフォルトの名無しさん
07/11/07 18:33:55
>>15
-S でいいだろ

17:デフォルトの名無しさん
07/11/07 18:37:49
BCCならそうだね。
VCだったら /FA かな

18:デフォルトの名無しさん
07/11/07 20:04:57
質問です。

コマンドラインからパスワード等の入力をするときは、標準入力にパスワードを入力してるのに
画面には入力した文字を表示しないようになってるよね。これってどうやって実装してるんですか?
fgets()などのC言語のライブラリ関数では、どうやればいいかわからない。。

19:デフォルトの名無しさん
07/11/07 20:30:32
URLリンク(www.linux.or.jp)
を読めば分かると思うが、通常は打った文字はechoされて画面に出る。
が、しかし、echoフラグを一時的に切れるような、getpassあたりの関数を使えば隠す事が可能になる。
詳しい実装方法は、getpass関数のソースを読めばわかると思うよ。

20:18
07/11/07 20:44:02
>>19
ありがとうございます

21:デフォルトの名無しさん
07/11/07 22:44:27
くだらない質問なのですが

struct e{
int value[];
};


int temp[256]
e num[256].value[256];
と宣言して

temp[i]にnumのvalueを一時的にまとめてコピーしたいのですが

temp[i]=num[i].value[];

といったことはできるのでしょうか?

22:デフォルトの名無しさん
07/11/07 22:51:47
やってみればいいと思うよ^^

23:デフォルトの名無しさん
07/11/07 22:58:20
やってみました。できませんでした><

そのためにmemcpyがあるのですね。
できました。ありがとうございましt

24:デフォルトの名無しさん
07/11/07 23:26:07
あともう一つ質問なのですが

temp[]に
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15

の縦の行、つまり 0 4 8 12 を一度に入れたいのですが
そういうやり方はfor使うしかないですかね

25:デフォルトの名無しさん
07/11/07 23:34:42
>>17
gccだったら?

26:デフォルトの名無しさん
07/11/07 23:36:22
>>24
一度にって表現がよくわからない。

27:デフォルトの名無しさん
07/11/07 23:39:26
for文を使わないでmemcpyみたいな感じで、ということです

28:デフォルトの名無しさん
07/11/07 23:44:57
memcpyみたいなものの内部でforを使ってたらどうすんだよ

29:デフォルトの名無しさん
07/11/07 23:46:24
ふつーのコンパイラなら-Sでアセンブリ出力。

30:デフォルトの名無しさん
07/11/07 23:51:22
>>29
サンクス。

31:デフォルトの名無しさん
07/11/07 23:53:25
>>24
二次元配列がメモリ上でどうなってるか考えてみればすぐわかるだろうに。

32:デフォルトの名無しさん
07/11/08 00:13:35
二次元なのか。
まだまだトーシローな俺は
二次元配列のような格納できる関数でもあるのかとおもっちまったぜ・・・

33:デフォルトの名無しさん
07/11/08 00:19:20
>>31
そうですね。諦めました
人間諦めが肝心

34:デフォルトの名無しさん
07/11/08 10:44:09
>>21

struct e{
int value[256];
};

e tmp;
e num[256];

tmp = num[i];

35:デフォルトの名無しさん
07/11/08 12:58:14
ふと思ったんだけど、
構造体同士の代入はできて配列同士の代入はできないて理不尽じゃね?

36:デフォルトの名無しさん
07/11/08 14:14:01
>>35
いや別に。Cでは配列をそのまま扱うことはできないと諦めているからどうでもいいよ。
どうせ、関数にそのまま渡すことさえできないんだから。

37:デフォルトの名無しさん
07/11/08 14:23:10
>>21
マルチ乙

38:デフォルトの名無しさん
07/11/08 14:34:56
>>35
理不尽っつぅかそういう考え方なんだな。配列は一つの纏まったオブジェクトではない、と。
一つの纏まったオブジェクトにしたいなら、上のように構造体で包めばいい。

39:デフォルトの名無しさん
07/11/08 16:46:00
double型のデータを表示するときに桁数をそろえたいんですが、どうすればいいですか?
マイナスの符号とかがあると変わってしまって表が汚くなります

40:デフォルトの名無しさん
07/11/08 16:51:29
符号だけなら "%+f" とか "% f" にすればいいよ

41:デフォルトの名無しさん
07/11/08 16:58:33
つ[%25.15g]

42:デフォルトの名無しさん
07/11/08 17:01:40
>>40
どうも!

43:デフォルトの名無しさん
07/11/08 17:44:24
>>38
構造体も配列同様、コピーできなかったのも今は昔。

44:デフォルトの名無しさん
07/11/08 17:49:20
double型で割り算する場合、その数字がどのぐらい小さいと危険ですか?

45:デフォルトの名無しさん
07/11/08 17:52:54
このぐらい(・∀・)c

46:デフォルトの名無しさん
07/11/08 18:01:16
>>44
IEEE754であれば、表わすことができる最大値が1e308程度なので、商がその値を超えなければ(精度は兎も角)解は得られる。
つまり、1/1e-308は1e308だが、10/1e-308は1e309なので無限大になってしまう。
尤も、無限大になっても特に危険はないので安心して0で割ればいいと思う。

47:デフォルトの名無しさん
07/11/08 18:05:38
そこが実数演算の面白いところだよな。
1 / -1e-320はちゃんと-Infになるからね。

48:デフォルトの名無しさん
07/11/08 18:46:18
>>46
0で割るととまってしまうんですが・・・

49:デフォルトの名無しさん
07/11/08 18:49:53
今日構造体習った
スゲー便利

50:デフォルトの名無しさん
07/11/08 20:06:22
>>48
0の除算をしたらプログラム割り込みが発生し、強制終了となる。

51:デフォルトの名無しさん
07/11/08 20:34:16
それ整数型だろ。

52:デフォルトの名無しさん
07/11/08 23:29:45
実数演算だと0で割っても止まらないんだよな
0で割ってるのに気がつかなくてはまったことがある

53:デフォルトの名無しさん
07/11/09 00:32:25
2
1
0
-1
-2
というテキストファイルinput.txtをscanfを使ってリダイレクトで、
scanf.exe<input.txt >output.txt
というようにして読み込みたいのですが、
for(i=0;i<100;i++){
scanf("%d",&c[i]);
tmp=i;
if(c[i]==EOF){
break
}
として、ファイルの終端まで読もうとすると、-1の行までしか読み込みません。
-2まで読み込んでファイルの終端で読み込みを完了させるにはどうしたらよいのでしょうか?
scanfとリダイレクトは絶対使わなければならないので、そこ以外を変更することで対処したいのです。

54:デフォルトの名無しさん
07/11/09 00:41:59
それはたまたまEOFの値が-1だったというだけだろう。
scanfの戻り値を見ろ。あるいはscanf後にfeof(stdin)を見るという手も使えると思う。

55:デフォルトの名無しさん
07/11/09 05:47:16
>>53
EOFとの比較は、「ほにゃららの場合はEOFになる」と明記されたものと行います。
例えばfgetc()のリターン値とか。

56:デフォルトの名無しさん
07/11/09 13:55:01
double *dp;
dp=(double*)malloc(sizeof double);
コンパイル通らないよ
どうすればいい

57:デフォルトの名無しさん
07/11/09 13:59:32
sizeof (double)

sizeof *dp


58:デフォルトの名無しさん
07/11/09 14:00:36
ども

59:デフォルトの名無しさん
07/11/09 14:01:33
(double)

60:デフォルトの名無しさん
07/11/09 14:39:24
巡回セールス問題を解くプログラムを順列を用いて書きたいのですけど
for(i = 0; i < n; i++) used[i]=NO;
perm(0);

return(0);
}

void perm(int d)
{
int i,j;
int b[MAXN];
int s = adj[a[0]][a[n-1]];

if(d == n){
for(i = 0; i < n-1; i++){
s+=adj[a[i]][a[i+1]];
}
}

else {
for (i = 0; i < n; i++) {
if (used[i] == NO) {
a[d] = i;
used[i] = YES;
perm(d + 1);
used[i] = NO;
}
}
}
}
これだけだとただの列挙になってしまいます
最小値だけをだすにはどうしたらいいでしょうか?

61:デフォルトの名無しさん
07/11/09 19:05:00
>>54>>55
ありがとうございます。
ちょっと詳しくしらべてみます。

62:デフォルトの名無しさん
07/11/10 00:00:54
struct Point {
int *x;
int y;
};
にして
p = (struct Point *)malloc( sizeof(struct Point) *10 );
p->x=(int *)malloc(sizeof(int)*10);
とメモリを確保したら
p[0~9].x[0~9] のメモリが確保されているということですよね。

p[1].x = 10;
とやったらxに10が入ると思ったのですが入らないのはなんでですか?

63:デフォルトの名無しさん
07/11/10 00:03:00
逆ピラミッドを描きたいのですが、どうしてもできません

#include <stdio.h>

int main(void)
{
int a,i,j;

printf("何段ですか? ");
scanf("%d",&a);

for(i=1;i<=a;i++){
for(j=1;j<=i-1;j++)

putchar(' ');

for(j=1;ここの部分がわかりません;j++)

putchar('*');

putchar('\n');

}
return(0);
}

助言をお願いします


64:デフォルトの名無しさん
07/11/10 00:03:44
62はわかりました
p[1].x[1] = 10;
こう入れないとだめなんですね

んで、 p[0].x[0] = 10;
だと表示ができるのですが
p[1].x[1] = 10;
だとエラーが出てしまいます。なんででしょうか

65:デフォルトの名無しさん
07/11/10 00:21:11
>>62,64
p = (struct Point *)malloc( sizeof(struct Point) *10 );
ここでp10個分、p[10]が確保されてるので
for(i = 0;i < 10;i++) p[i]->x = (int *)malloc(sizeof(int)*10);
で各xには別のx[10]分を確保

66:デフォルトの名無しさん
07/11/10 00:22:29
>>64
もし>>62の通りのプログラムなら、p[0]のxしか確保されてない
p->x=(int *)malloc(sizeof(int)*10); //p->xはp[0].xと同義

全てのpについてxを確保するなら以下のように繰り返しを使う
for(i=0; i<10; ++i){
p[i].x=(int *)malloc(sizeof(int)*10);
}

67:デフォルトの名無しさん
07/11/10 00:23:47
プログラムのことではないのですが、お尋ねしたいことがあります。
このたび仕事でC言語のソース解析を行うことになったのですが、コードリーディングのために便利なツールなどは無いでしょうか?
コード中の関数や構造体をダブルクリックすると、定義してあるソースまでジャンプしてくれたりしたら助かるのですが


よろしくお願いいたします

68:デフォルトの名無しさん
07/11/10 00:24:10
つまり
p[0].x[0~9]が確保されていて
p[1].xは確保されていなかったわけですね。

ありがとうございます。頭がスッキリニッコリ
ということは解放するときは
for(int i=0;i<10;i++)
free(p[i].x);
free( p );
こういう風にせんといかんわけですね。

69:デフォルトの名無しさん
07/11/10 00:26:36
>>67
VisualStudioは、右クリックから定義へ移動って機能があるけど、Cでちゃんと動くかはわからない。

70:デフォルトの名無しさん
07/11/10 00:29:10
>>69
それなりに動く。
たまにどのシンボルか選べってなることもあるけど。

71:デフォルトの名無しさん
07/11/10 00:30:21
>>68
doxygenというのがあるよ
URLリンク(www.fides.dti.ne.jp)
こんな感じでクラスや関数間の関係を可視化してくれる。

導入方法はここから
URLリンク(skazami.web.infoseek.co.jp)


72:デフォルトの名無しさん
07/11/10 00:30:59
>>71のは>>67へ向けたもの

73:デフォルトの名無しさん
07/11/10 00:59:10
構造体に不定の配列を定義して、後で配列の最大値を設定するにはどうしたらよいでしょうか?
例えば…

struct{
foo[]
};

で、配列の使用時に

foo[bar]; (barは最大値)

という風にしたいのですが…

それとも構造体の定義時にあらかじめ余裕をもって配列を定義してしまう方がいいですか?

74:デフォルトの名無しさん
07/11/10 01:15:34
malloc。
良く分からないなら、あらかじめ定義した方が良いだろうね。

75:デフォルトの名無しさん
07/11/10 01:23:53
>>67
秀丸エディタにそういう機能あるよ。

76:デフォルトの名無しさん
07/11/10 01:48:32
>>74
ありがとうございます。

正直よくわからないので、助言どおり余裕を持って最初に定義してしまうことにします…すんません。

77:デフォルトの名無しさん
07/11/10 05:16:10
>>63
for(i = a;i >= 1;i--){
for(j = a - i;j > 0;j--) putchar(' ');
for(j = i * 2 - 1;j > 0;j--) putchar('*');
putchar('\n');
}
最初のをfor(i=1;i <= a;i++)で上下反転。


78:デフォルトの名無しさん
07/11/10 10:33:24
こんな図形をFor文で作れといわれたんですが・・
まったくワカリマセン(´・ω・`)・・どなたか助けてください
↓こんなの
***
**
*

79:デフォルトの名無しさん
07/11/10 10:39:04
>>78
宿題スレ池

#include <stdio.h>
#define N 3
int main()
{
char i, j;
for (i = 0; i < N; i++) {
for(j = N; j > i; j--) {
printf("*");
}
printf("\n");
}
return 0;
}

80:78
07/11/10 10:43:36
>79さん
ありがとうございます

そうさせていただきます・・w

81:デフォルトの名無しさん
07/11/10 11:47:01
質問です。
今C言語の勉強をしていて、Cpadというエディターで書いたあとにコンパイルして
実行ボタンを押して実行しています。
コマンドプロンプトが表示されて、処理が実行されますが一回で終わってしまいます。
例えば「ある数をscanfして、それに2を加えた数をprintfする」というプログラムのとき
結果が出力されたあとに、またscanfに戻るって何度もプログラムを続けることってできないですか?
説明下手ですが、宜しくお願いします。

82:デフォルトの名無しさん
07/11/10 11:49:57
>>81
for(;;) {
  scanf(・・・);
  printf(・・・);
}


83:デフォルトの名無しさん
07/11/10 12:02:25
>>82
ありがとうございます。それで指定した数までは終了しないようになりました。


#include <stdio.h>
int main(void)
{
int i, j,a;
printf("数を入力して\n");
for (i = 0; i < 10; i++) {

scanf("%d",&j);
a=5+j;
printf("%d\n",&j);
}
return 0;
}


何入力しても結果が3928になるのはなぜなんだろう…

84:デフォルトの名無しさん
07/11/10 12:04:31
>>83
a の値を表示させてないからじゃないかな

85:デフォルトの名無しさん
07/11/10 12:04:37
> printf("%d\n",&j);

86:デフォルトの名無しさん
07/11/10 12:08:30
>>84->>85
迅速なレスありがとうございます。
間違っていました…。
でも今度は結果が3926が出力されるようになりました。
今日手探りで色々入れたので、もしかしたら環境の問題なのかもしれません。
ちょっと色々試してみます。ありがとうございました。


87:デフォルトの名無しさん
07/11/10 12:10:42
>>86
printf("%d\n", a); // & はいらない

88:デフォルトの名無しさん
07/11/10 12:32:05
struct RGB{
int r,g,b;
}

という構造体を

struct RGB *color;
color = (struct RGB *)malloc( sizeof(struct RGB) *10 );
と10個作って、各要素を足して4で割るということを続けていきたいのですが

(color[0]+color[1])/4
という感じに、構造体同士を足したりできるのでしょうか?


89:デフォルトの名無しさん
07/11/10 12:36:29
>>88
ムリ。

90:デフォルトの名無しさん
07/11/10 12:41:57
それだと
(color[0].r+color[1].r)/4
(color[0].g+color[1].g)/4
(color[0].b+color[1].b)/4
としないといかんわけですか。


91:63
07/11/10 13:09:39
>>77
お答え頂ありがとうございました。
ずっと悩んでいたので、やっとスッキリすることができました。

92:デフォルトの名無しさん
07/11/10 13:32:08
再帰を習ったのですが理解できなくて、自分なりに、ネットとかで調べて、
再帰の概念は何となく分かったのですが、いざプログラムとなると…。
例えば、構造体を
struct node{
int a;
struct node *r;
struct node *l;
};
と定義し、
引数を二分探索木の根のアドレスとし、二分探索木の最小の値を持つ節点の
アドレスを返す関数minを作成。
1 struct node *min(struct node *t){
2 struct node *m = (struct node *)NULL;
3 if(t != (struct node *)NULL){
4 if(t->l == (struct node *)NULL)
5 m = t;
6 else
7 m = min(t->l);
8 }
9 return m;
10 }
と書いてあるのですが、どういう手順で実行されるのかと、7行目で、
なぜ変数に関数を代入してるのかも意味が解りません。

93:デフォルトの名無しさん
07/11/10 13:47:26
関数を代入してるんじゃない
関数を実行した戻り値を代入しているんだ

94:92
07/11/10 14:28:06
>>93
レスありがとうございます。
関数を代入しているわけではなく、関数の戻り値を代入しているのですね。
なぜ、戻り値を代入しているのですか?

3行目は、二分探索木の有無の判定で、無い場合は、そのままNULLを
返して終了。
4~5行目は、左部分木が無ければ、根が最小値なので、最小値の節点の
アドレスを入れる変数であるmに根のアドレスであるtを代入して、
それを返して終了。
なので、7行目以外は解るのですが、7行目はどういう処理をしてる
のですかね?

95:デフォルトの名無しさん
07/11/10 14:35:53
>>94
tがNULL→NULLを返す
t->lがNULL→tが最小なのでtを返す
それ以外→t->lから始まる二分木で最小の物を返す

ok?

96:デフォルトの名無しさん
07/11/10 14:42:11
      ○
    ○┘└○
   ○┘○┘└○
  ○┘  ・・・┘└・・・
 ○┘

97:92
07/11/10 15:24:02
>>95
はい、そこまでは解っています。どういう処理と言うか、tがNULLでなく、
t->lもNULLでない場合にどういう手順で動いてるかが解らなくて。

tがNULLでなく、t->lもNULLでない場合を考えたとして、
>>96さんの図で言えば、一番左下に位置している○が最小ですよね。
そして、一番左下の○まで来て、さらに再帰呼び出しをすると、
3行目のif(t != (struct node *)NULL)で条件に一致せずに、
9行目のreturn m;に進んで、ここで、どうなるんですか?
2行目でstruct node *m = (struct node *)NULL;としているので、
戻り値は、このアドレスになって、7行目のm = min(t->l);で、mに
代入しても、最小値のアドレスになりませんよね…

98:デフォルトの名無しさん
07/11/10 15:44:58
>>97
if(t->l == (struct node *)NULL)
に引っかかって
m = min(t->l);
が実行されずに
m=t
が実行されるので
if(t != (struct node *)NULL){
が偽になるのは再帰ではなく外から呼び出した場合だけ

99:92
07/11/10 16:00:46
>>98
確かに一番左下を再帰呼び出しした時に、
if(t->l == (struct node *)NULL)にひっかかるので、
一番左下の○まで来て、さらに再帰呼び出しされる事は、ないですね。
となると、
if(t->l == (struct node *)NULL)
に引っかかって
m=t
が実行されて、
次は
return m;
ですよね?
このreturn m;で、メイン関数に返されて終了ってことですかね?
それだと、
m = min(t->l);
じゃなくて、
min(t->l);
で十分じゃないですか?
何のために、m = min(t->l);としているのですか?

100:デフォルトの名無しさん
07/11/10 16:19:20
自分で考えてみたんですがちょっと分からないので
教えてください。

学校でユークリッドの互除法によって最大公約数を出すプログラムを
作ったんですが、これは2つの数の最大公約数を求めるものですよね。
もし3つとか6つとかの数の最大公約数を求めるんだったらどうプログラムするのが
一番なのでしょうか?ユークリッドを工夫すれば出来るでしょうか。

101:デフォルトの名無しさん
07/11/10 16:22:55
>>99
メイン関数に返るのではなく呼び出した関数の呼び出した位置に返るのだよ
つまりmin(t->l)が実行されたあとにその戻り値がmに代入されてreturn mで戻り値となりそれが更に・・・
てな具合で呼び出した順を逆にたどるために各階で戻り値を返す必要があるわけだ

102:デフォルトの名無しさん
07/11/10 16:26:51
>>100
数学板の方が適切だと思われ。

103:デフォルトの名無しさん
07/11/10 16:40:34
>>100
まさかとは思うけど、複数の数の最大公約数の求め方を知らないという話じゃないよね?
ユークリッド互除法より最適なアルゴリズムはないのか、という話だよね?

104:デフォルトの名無しさん
07/11/10 16:58:45
>>100
int gcd(int a, int b); // 引数で与えられた2数の最大公約数を返す関数
があるとして
gcd(a, gcd(b, c));
なら…

105:92
07/11/10 17:34:55
>>101
なるほど、だからm = min(t->l);と言う様にmに代入しているのですね。
完全に理解できました。

アドバイスして下さった方、本当にありがとうございました。

106:デフォルトの名無しさん
07/11/10 21:13:15
等比数列の和の求め方のソースコードを載せてください。(初項a,公比r,項数nとする)

107:デフォルトの名無しさん
07/11/10 21:20:43
それは宿題スレ向き

分投げじゃなくて、少しは考えよう

108:デフォルトの名無しさん
07/11/10 21:21:23
>>106
丸投げは宿題スレへ
スレリンク(tech板)l50

109:デフォルトの名無しさん
07/11/10 21:52:01
void foo( double* yuv, double* s1, double* w1, unsigned int size, unsigned int inc )
{
int i;

for ( i = 0 ; i < size / 2 ; i++ ) {
double d0 = *yuv;
double d1 = yuv[inc];
*s1 = ( d0 + d1 ) * sqrt( 2 ) / 2;


すいません、初歩的な質問なのですが
double yuvは1次元のポインタなのですが
double d0 = *yuv;
double d1 = yuv[inc];
のd0が何をやっているのか教えてください。
1次元の配列で *yuvとしたときに、どこを指しているのかわからなくて

110:デフォルトの名無しさん
07/11/10 22:13:24
等比数列の初項a,公比r、項数nをキーボードから入力して、
それらを画面に表示して最後にそれらの総和を表示する。
ただしa,rは実数値とする。

111:デフォルトの名無しさん
07/11/10 22:17:07
>>109
*yuv は yuv[0] と同じ意味



112:デフォルトの名無しさん
07/11/10 22:22:48
yuv[0] = *(yuv + 0) = *yuv

113:デフォルトの名無しさん
07/11/10 22:31:13
>>111-112
ありがとうございます。理解できました。

114:デフォルトの名無しさん
07/11/10 23:54:23
2^(3/2)って関数でかくとどうなりますか?
2^(1/2)や3^(1/2)なら sqrt(2.0)やsqrt(3.0)だとわかるのですが。

pow( sqrt(2.0),3 )になるのでしょうか?

115:デフォルトの名無しさん
07/11/10 23:55:49
pow( 2.0, 1.5 );

116:デフォルトの名無しさん
07/11/10 23:55:52
素直にpow(2, 3 / 2)でよろしかろ。

117:デフォルトの名無しさん
07/11/10 23:56:53
そのままで良かったんですねw
ありがとございます

118:デフォルトの名無しさん
07/11/10 23:56:54
いいえ

119:デフォルトの名無しさん
07/11/10 23:57:15
おっといけねぇ。pow(2, 3. / 2)だね。

120:デフォルトの名無しさん
07/11/11 00:19:30
FFTで振幅が正確に得られないときはどうするの?
numerical recipeのコード使ってるんだけど、
同じ振幅で別周波数の時系列入れてもスペクトルの
大きさが違うんです。
周波数の適当なビンで積分しても違いがあるどうしてかな。
コードはいじってないよ。

121:デフォルトの名無しさん
07/11/11 00:28:07
>>120
入力波形を正弦波にしてサンプリング周波数の 1/(2^n) にしてもそうなる?

122:デフォルトの名無しさん
07/11/11 01:55:42
超初心者な質問だけど、よろしく。

俺は情報科の1年なんだけど、
大学でやってるCを自宅でもやりたいと思ってるんだけど、
そういうのを自宅でやるのはどうすればいいの?
できれば無料でやりたいんだけど、
そんなソフトをインストールすればいいのか教えてください。

123:デフォルトの名無しさん
07/11/11 01:58:27
学校で使ってるOSとかコンパイラは何?

124:122
07/11/11 02:02:02
>>123
OSはXPです。
コンパイラ・・・ってなんだろ?
emacsとかktermとか使ってますけど。

125:デフォルトの名無しさん
07/11/11 02:05:55
コンパイラはソースコードから実行ファイルを作るプログラム

126:デフォルトの名無しさん
07/11/11 02:07:08
そのレベルで環境構築は無理だよ。素直に学校の先生に聞いてみよう。

127:デフォルトの名無しさん
07/11/11 02:08:38
>>124
gccは使ってる?

128:122
07/11/11 02:28:58
すみません、やっぱり今の俺には
自宅で環境整えるのは難しいみたいですね・・・。
今度聞いてみます。
こんな時間にありがとうございました。

129:デフォルトの名無しさん
07/11/11 02:37:20
いや、やること自体は難しくないよ。先生に聞けば普通に解決すると思う。

130:デフォルトの名無しさん
07/11/11 02:41:18
>>128
学校と同じものを揃えたいんでしょ?
とりあえず学校で何を使ってるかを調べるだけでおk

131:デフォルトの名無しさん
07/11/11 03:25:58
これってどこがダメなんですかね?
0が出力されてしまいます…
初心者ですみませんがよろしくです.

#include <stdio.h>

main()
{
 int i, k, sum;

 sum = 0;

 do{
  printf("正の整数kを入力して下さい:");
  scanf("%d", &k);
 }while(!(k>0));

 for(i = 1; i > k; i++){
  sum += i*i*i;
 }

 printf("kまでの自然数の3乗の和は%d", sum);
}

132:デフォルトの名無しさん
07/11/11 03:28:54
>>131
i に注目。

133:デフォルトの名無しさん
07/11/11 03:34:37
>>132
レスありがとうございます.
でも,ちょっとわかんないです^^

134:デフォルトの名無しさん
07/11/11 03:37:53
>>133
そういうときには、取り敢えずsumを更新した次の行に(その下にある)printf()の行をコピーしてみよう。
それを実行しても未だ問題点が見つからないようなら、きっと注意力不足か適正不足だと思うよ。

135:デフォルトの名無しさん
07/11/11 03:58:31
>>131
不等号の向きが逆。

136:デフォルトの名無しさん
07/11/11 04:03:45
>>134
レスありがとうございます.
sum += i*i*i;
の下にprintfを入れてみたけど,そこの分のprintfが実行されてなさそう…
ってことは,for自体が実行されてないんですかね?

137:デフォルトの名無しさん
07/11/11 04:24:04
若干スレ違いかもしれないですが・・・

Borland C++ Compiler 5.5
Borland Turbo Debugger 5.5
BCC Developer
を使ってC言語を勉強してるのですが、最近BCC Developerがよくバグります。
プログラムはちゃんと書けてるのに、いざコマンドプロンプトを開くと「問題が発生したため~~を終了します。」
と出てきて、そこで終わってしまいます。
こういうのって開発環境を変えた方が良いんでしょうか??

138:デフォルトの名無しさん
07/11/11 05:05:52
コマンドプロンプトを開いて何をしたらそのエラーが出る?
コマンドプロンプトを開くだけで出るならBCCは関係ないが。

139:137
07/11/11 05:36:06
>>138
レスありがとうございます。
コマンドプロンプト開くだけなら全然大丈夫なんですが
長時間(っていっても2時間とかそんなもん)プログミングしてるとよくエラーになります。
同じプログラムでもちゃんと出力できるときとそうでないときがあっていまいち原因が分からないです。

140:137
07/11/11 06:21:33
ごめんなさい。自己解決できました。


141:デフォルトの名無しさん
07/11/11 10:01:08
>>136
そのとーり。>>135も指摘しているが、for文の条件判断のところの意味をよく理解しておくこと。

142:デフォルトの名無しさん
07/11/11 10:03:44
>>121

>入力波形を正弦波にしてサンプリング周波数の 1/(2^n) にしてもそうなる?

はい。純粋に周波数がf,f1,f2...の正弦波をFFTにかけています。
規格化の方も分かってます。


143:86
07/11/11 11:13:09
昨日質問した者ですが、やはり足し算などをすると出力がおかしいみたいです。
このようになるのですが間違っている部分ありますか?
URLリンク(www.imgup.org)
宜しくお願いします。

144:デフォルトの名無しさん
07/11/11 11:17:49
>>143
printf("%d\n", d); // & いらない

145:86
07/11/11 11:21:45
>>144
昨日も同じレスもらってたのに気付きませんでした…。
今やったらできました。「&」でしたか…
ありがとうございました!!

146:デフォルトの名無しさん
07/11/11 11:44:53
市ねよ &d

147:デフォルトの名無しさん
07/11/11 11:53:20
>>135 >>141
レスありがとうございました.
forの条件判断は,反復の終了条件ではなく,継続条件なのですね.
つまり,その条件が偽になったら終了と.
つまらない質問に答えていただき,ありがとうございました.

148:デフォルトの名無しさん
07/11/11 13:19:24
ちょっと質問させてください。3つの数の最大公約数を
求めるプログラムしてたんですが、下記のこれでもいけますかね?
#include<stdio.h>
#include<stdlib.h>
#define n 3
int main(void
{
int kazu[n];
int i=0, c,num;
while(i < n){
printf("入力 %d < ", i+1);
scanf("%d", &kazu[i]);
i++;
}
for(i=1; i< n; i++){
while(kazu[i] != 0){
c = kazu[i];
kazu[i] = kazu[0] % kazu[i];
kazu[0] = c;
}
}
printf("gcd = %d\n",kazu[0]);

return 0;
}

149:デフォルトの名無しさん
07/11/11 15:18:26
被って申し訳ありませんが質問させてください

#include <stdio.h>
#define INPUT_CNT 3
int main(void)
{
int num[INPUT_CNT];
int cnt;
for(cnt = 0 ; cnt < INPUT_CNT ; cnt++)
{
printf("Input number%d : ",cnt+1);
scanf("%d",&num[cnt]);
}
printf("(");
for(cnt = 0 ; cnt < INPUT_CNT ; cnt++)
{
printf("%d +",num[cnt]);
}
printf(")");
printf("\n");
return 0;
}
出力結果
Input number : 10
Input number : 20
Input number : 30
(102030)
↑102030の間に+を表示させるにはどうしたら良いですか?

150:デフォルトの名無しさん
07/11/11 15:23:40
初歩的な質問ですみません。
printfの変換仕様のフィールド幅の部分をマクロで
置き換えたいんですが、方法はありますでしょうか?
printf("値: %05d\n", number);
を、
define FIELD 5
printf("値: %0FIELDd\n", number);
といった感じに。(↑上手く動作しません。)↓はコンパイルできませんでした。
printf("値: %0"FIELD"d\n", number);

ちなみに、コンパイラはgccです。よろしくおねがいします。

151:デフォルトの名無しさん
07/11/11 15:26:59
>>149
僕がやったところ、下記のような出力結果になってますよ。

Input number1 : 10
Input number2 : 20
Input number3 : 30
(10 +20 +30 +)


152:デフォルトの名無しさん
07/11/11 15:27:08
>>150
printf("値: %0*d\n", FIELD, number); でいけたかと

153:デフォルトの名無しさん
07/11/11 15:29:56
>>152
いけました!
ありがとうございます!!

154:149
07/11/11 16:50:50
>>151
あっそうなんです
どうしても+が一つ多くなってしまうんですが
(10 +20 +30)
こういうすっきりした形にしたいんですが・・・

155:デフォルトの名無しさん
07/11/11 16:53:28
for(cnt = 0 ; cnt < INPUT_CNT - 1 ; cnt++) printf("%d +",num[cnt]);
printf("%d", num[cnt]);

156:デフォルトの名無しさん
07/11/11 16:53:53
for(cnt = 0 ; cnt < INPUT_CNT ; cnt++)
{
if(cnt>0){ printf(" +"); }
printf("%d",num[cnt]);
}
これでいいんじゃない

157:デフォルトの名無しさん
07/11/11 17:18:52
おすすめできないが、こういう書き方も。

for(cnt = 0 ; cnt < INPUT_CNT - 1 ; cnt++)
{
printf("%d + ",num[cnt]);
}
printf("%d",num[cnt]);

158:デフォルトの名無しさん
07/11/11 17:21:12
ループの中に無駄な分岐突っ込むよりは、はるかにマシだろ。
まぁ、155が見えないバカにはわからないだろうが。

159:デフォルトの名無しさん
07/11/11 18:03:37
VC++2005EE の ^Z の問題は結局どうなったの?


160:デフォルトの名無しさん
07/11/11 18:09:45
>>154
もっとおすすめできないが、
return文の2行上のprintf文をこうするとか。
printf("\b)");
\bってのはカーソルを1文字戻すエスケープシーケンスね。

161:デフォルトの名無しさん
07/11/11 19:22:26
関数定義で
bool hoge(int array[const])
{
...
}
とやっても良いらしいのだけれど
array[const]ってどういう意味の配列になるの?

162:デフォルトの名無しさん
07/11/11 19:26:19
mainから整数型の配列受け取るだけじゃね?って思ったら受け取る時は普通ポインタ使う品

163:デフォルトの名無しさん
07/11/11 19:52:40
>>161
bool hoge(int * array)と全く同じ。

>>162
何故main限定?w

>>160
お勧め云々以前にダメすぎ。

164:デフォルトの名無しさん
07/11/11 20:03:14
>>163
bool hoge(int * const array)
というわけでもない?

165:デフォルトの名無しさん
07/11/11 20:07:38
67です
遅くなりましたが、レスさんくすです

>>69
VisualStudioは残念ながら所有していません
ExpressEditionで試してみます

>>71
どうもです
面白そうですね
試してみます

その他にも知り合いのJava使いからOpenGrokなるツールを紹介してもらいました
これらを参考に仕事がんばらせていただきます

どうもありがとうございました

166:デフォルトの名無しさん
07/11/11 20:17:56
>>161>>163
int *const arrayと同じ。
C99から導入された書き方。


167:デフォルトの名無しさん
07/11/11 20:28:30
>>166
サンクス。C99からだったか・・。
どうりでわからんわけだ。C99の資料も欲しい。

168:デフォルトの名無しさん
07/11/11 20:51:19
コボルはデータを読み込んで演算させて吐き出すことが主ですがC言語はどうですか

また、実務で使われている開発環境はVC++ですか、ボーランドのやつですか
エクリプスですか

169:149
07/11/11 21:53:42
「-」を入れると出来るんですね
本当にどうもありがとうございました



170:デフォルトの名無しさん
07/11/11 21:54:20
一時停止させる関数とそのヘッダファイル教えてください

171:デフォルトの名無しさん
07/11/11 21:59:29
何を一時停止?


172:デフォルトの名無しさん
07/11/11 22:00:21
>>170
sleep()でググってみそ。

173:デフォルトの名無しさん
07/11/11 22:00:35
while(){
printf("hoge");
0.5秒待つ ←これを実行するための関数とヘッダファイルです
}


174:デフォルトの名無しさん
07/11/11 22:02:10
putc(' ', NULL); //stdio.h

175:デフォルトの名無しさん
07/11/11 22:02:45
>>173
システムに依存する。

176:デフォルトの名無しさん
07/11/11 22:04:58
>>173
windows.h
Sleep(500);

177:173
07/11/11 22:06:23
ありがとうございます

178:デフォルトの名無しさん
07/11/11 22:25:26
>>172
ゲイツに聞こうぜ
あんだけ話題になったんだし
URLリンク(matome.info)

179:デフォルトの名無しさん
07/11/11 22:46:32
最近初めたばかりなんですが
int double floatについて教えてください。

int型は整数型ということを調べていてよく見たのですが
int a=0.5 や int b=0.00000005 でもエラーが出ません。
また、範囲が狭いということが書いてあったのですが
int a=1234567890 と大きい値を入れても大丈夫でした。
どれくらい大きい値まで大丈夫なのでしょうか。

それと小数点を扱うときはdouble と floatを使うとあったのですが
二つの違いもよくわかりません

お願いします

180:デフォルトの名無しさん
07/11/11 22:50:35
>>179
URLリンク(www.aso.ecei.tohoku.ac.jp)

181:デフォルトの名無しさん
07/11/11 22:52:33
そこには普通floatって書いてあるけど、
実際には理由がなければdoubleを使うのが普通。

182:デフォルトの名無しさん
07/11/11 22:59:55
>>179
浮動小数点なのでfloat
(↑1.1346*10^5とか)
doubleは倍精度(おもに小数部分が)なので

183:デフォルトの名無しさん
07/11/11 23:05:11
stdio.cとかstring.cってどこにあるの?
*.hは/usr/includeにあるけど本体がどこにあるのかわからない。

184:デフォルトの名無しさん
07/11/11 23:05:58
> 倍精度(おもに小数部分が)

185:デフォルトの名無しさん
07/11/11 23:06:52
>>183
検索しても見つからなかったら、インストールされてないんじゃない?

186:デフォルトの名無しさん
07/11/11 23:07:57
>>185
いやトラブルにあったとかそういうことじゃなくて
ソースを読むために居場所を知りたい。

187:デフォルトの名無しさん
07/11/11 23:22:59
>>179
>int a=0.5 や int b=0.00000005 でもエラーが出ません。

エラーは出ないけど、だまって整数に切り捨てられる。

188:デフォルトの名無しさん
07/11/11 23:26:29
エラー出ないのか
Cでもいつもキャストしてるから気づかなかった

189:デフォルトの名無しさん
07/11/11 23:26:36
>>186
いやだから、ライブラリのソースはインストールしてないと入ってない

190:デフォルトの名無しさん
07/11/11 23:26:48
>>186
標準関数のソースは、OSなりコンパイラをインストールするときに、オプションで指定しないと入らないんじゃないの?

なんでもいいから見たいってことなら、ネットで探せば出てくると思うけど。

191:デフォルトの名無しさん
07/11/11 23:27:56
>>186
そんなものない。
ファイルに書き出すにしても、OSのAPI呼び出したりアセンブラで書いたりと
C言語じゃないことやってるんだから、Cのソースファイルとしては存在しない。

192:デフォルトの名無しさん
07/11/11 23:32:11
>>189
>>190
そうなのか、全然知らなかった。
インストールしないといけないのか。thx!

193:デフォルトの名無しさん
07/11/11 23:38:40
>>179
doubleの方がfloatより精度が高い。

だから計算に時間がかかるかといえばそうでもなくて、
CPUに乗ってる数値演算プロセッサが32bit精度だったり、
C言語のライブラリがdouble前提で作られたりしてて、
floatで計算すると、
float-double変換→計算→double-float変換
となってdoubleよりも遅くなることが多かった。

けど、最近はSSEなどの演算命令などが出てきたため、
floatの方が速い場合もあるらしい。


194:デフォルトの名無しさん
07/11/11 23:42:51
ごめん、ウソついた。
FPUは80bitだから、「CPUに…」の行は無視して。

195:デフォルトの名無しさん
07/11/11 23:48:02
179ですが皆さんありがとうございました。
イメージできてきました。

intが8バイトや、256ビットやら、バイトとビットがよくわかってもいない中で
わけがわからなくなっていましたが
精度の違いってこのbitの部分が違うということですよね?

足し算、掛け算やら計算を格納するところはdoubleにしてやるように気をつけます。
ありがとうございました

196:デフォルトの名無しさん
07/11/12 00:34:47
ランダムに-1.0から1.0までのdouble値を生成するコードを考えてくれたまえ

197:デフォルトの名無しさん
07/11/12 00:40:02
(double)rand() / RAND_MAX * 2 - 1

198:デフォルトの名無しさん
07/11/12 00:43:52
char *ptr = "ghijkl";
が可能で

char *ptr;
scanf("%s",ptr);
がダメなのはなんで?

199:デフォルトの名無しさん
07/11/12 00:46:55
>>198
char *ptr = "ghijkl";
は、コンパイラがどっかに用意した"ghijkl"って領域の
先頭アドレスをptrに代入してる。だからOK

char *ptr;
はptrってポインタ(アドレスを入れる箱)は用意したけど、まだ中身は不定。
文字列を入れる場所が確保されてないから、コピーできない。

200:デフォルトの名無しさん
07/11/12 00:47:28
そのポインタは確保された領域を指していないから

201:デフォルトの名無しさん
07/11/12 00:50:22
char *ptr;
scanf("%s",ptr);
を可能にするにはmallocやnewやらで領域作らないとダメなの?

それだと
char ptr[256];
scanf("%s",ptr);
でやってしまっても問題ないなぁ…

なんか領域が可変な1次元のcharでもあればいいのに

202:デフォルトの名無しさん
07/11/12 00:52:16
>>201
標準ではないが asprintf が便利

203:デフォルトの名無しさん
07/11/12 00:56:39
>>201
C言語スレだからnewは無いけどな。
char* ptr=(char*)malloc(256);
みたいにしないといけない。使い終わったらfreeもしなきゃいけない。

可変配列なんて裏でメモリの確保・開放を勝手にやるってことだからな。
高級アセンブラたるCにそんな機能は無い。必要なら自分で作るんだよ。

204:デフォルトの名無しさん
07/11/12 01:05:46
C言語スレだから、C++は違うのですね。すんません。
理解できました


205:デフォルトの名無しさん
07/11/12 01:12:22
配列と要素数と確保開放を一括で管理するオブジェクトでも作ればいいんじゃね?

206:デフォルトの名無しさん
07/11/12 01:24:49
おぶじぇくとがよくわかってないなぁ。

「関数がついた構造体」みたいな感じで認識してるけど
オブジェクトに何か値をぶち込む。

何かよくわからないけど、いろいろ処理する(コンストラクタやらデストラクタやらして)

何か処理したもんが出てくる

って認識であってる?

207:デフォルトの名無しさん
07/11/12 01:26:50
>>206
スレ違い。

208:デフォルトの名無しさん
07/11/12 01:33:40
構造体配列struct tfield data[10]で
メンバをchar word[20] として

そのメンバとaとかbと一致するかどうかをみたいんだけど
どうすればいいですかね?

209:抽象的な質問には抽象的な回答を
07/11/12 01:36:15
比較すればいいと思います。

210:デフォルトの名無しさん
07/11/12 02:04:01
#include <stdio.h>
#include <math.h>
int main(void){
long double r,pi,t;

r=2.859492;
pi=3.141590;
r=pow(r,3);
t=4/3*pi*r;

printf("%f",t);

return 0;
}

>>> -0.0000 になってしまいます。

211:デフォルトの名無しさん
07/11/12 02:44:49
long double は %Lf

212:デフォルトの名無しさん
07/11/12 02:54:39
ありがとございます。


213:デフォルトの名無しさん
07/11/12 03:54:55
C言語系で就職に役に立つ資格ってありますかね?


214:デフォルトの名無しさん
07/11/12 04:34:24
>>197
MT法でやってくりたまえ

215:デフォルトの名無しさん
07/11/12 09:20:48
>>213
基本情報処理でいいんじゃないの?

216:デフォルトの名無しさん
07/11/12 10:27:21
メモリエディタ製作しようとしているが
こんな感じでおk?

目標プロセスのアドレス取得

ある数値、文字列を探すときはstrstrで検索


217:抽象的な質問には抽象的な回答を
07/11/12 10:38:56
ダメ。数値を探すのにstrstr()は使えない。

218:デフォルトの名無しさん
07/11/12 12:43:52
画像の指定した範囲を切り出して出力するプログラムはどうやりますか?

219:デフォルトの名無しさん
07/11/12 12:57:08
出番だぞ抽象

220:デフォルトの名無しさん
07/11/12 13:07:34
pythonでやれ

221:デフォルトの名無しさん
07/11/12 13:40:24
画像解読か。難しそうだな。
文字で書いてあればまだなんとかなるか。

222:デフォルトの名無しさん
07/11/12 13:43:42
まず、irfan viewをDLします
ヒントはPPM

がんばれよ!

223:デフォルトの名無しさん
07/11/12 13:56:06
>>218
何を切り出すの?
金型?

224:デフォルトの名無しさん
07/11/12 14:40:09
phpでも使っとけ。

225:デフォルトの名無しさん
07/11/12 15:38:25
WAVEファイルを読み込む

テキストデータに変換

0.5秒間ハミング窓を与える      ←
↓                          0.25秒ずらす
FFT、ピッチを求めてドッカに保存    →      ↑

終了

こんな感じで求めればドレミファソラシドって変化していくWAVEファイルのピッチを追えると思ってるんだが
どう?

226:デフォルトの名無しさん
07/11/12 18:00:23
size_tとかFILEみたいになんか知ってるとそれなりに
それなりのC言語の使い手に一見見える型とか構造体ってありますか?

227:デフォルトの名無しさん
07/11/12 18:04:06
FILEは違うだろ・・・

228:デフォルトの名無しさん
07/11/12 18:04:54
void*

229:デフォルトの名無しさん
07/11/12 18:13:43
LPCWSTR

230:デフォルトの名無しさん
07/11/12 18:14:52
char const* const p;

231:デフォルトの名無しさん
07/11/12 18:16:46
strct hoge{
・・・
・・・
char ar[1]; //[0]じゃなくあえて[1]で。
};


232:デフォルトの名無しさん
07/11/12 18:18:50
int main(argc, argv)
int argc;
char **argv;
{
return 0;
}


233:デフォルトの名無しさん
07/11/12 18:20:30
#define begin {
#define end ;}


234:デフォルトの名無しさん
07/11/12 18:25:55
size_t
ptrdiff_t
intptr_t
uintptr_t

235:デフォルトの名無しさん
07/11/12 18:49:39
うわぁ予想外にいっぱいあるんですね。
>>231
[0]じゃなくてあえて[1]で。ってどういうことなんですか
すごく興味があります。

236:デフォルトの名無しさん
07/11/12 19:16:10
struct e{
int value1,value2,value3;
};

void foo(e num[][size]){
e output1[size],output2[size];
double sum1, sum2, sum3;
double difference1,difference2,difference3;
for( i=0;i<size;i++){
for( j=0; j<size; j++){
sum1 = num[i][j].value1 + num[i][j+1].value1;
sum2 = num[i][j].value2 + num[i][j+1].value2;
sum3 = num[i][j].value3 + num[i][j+1].value3;

difference1 = num[i][j*2].value1 - num[i][j*2+1].value1;
difference2 = num[i][j*2].value2 - num[i][j*2+1].value2;
difference3 = num[i][j*2].value3 - num[i][j*2+1].value3;

output1[j].value1 = sum;output1[j].value2 = sum2;output1[j].value3 = sum3;
output2[j].value1 = difference1;output2[j].value2 = difference2;output2[j].value3 = difference3
} // end for j
} // end for i
}

このクソ汚いソースを直すのに、どなたか知恵をお貸しください。
2次元の構造体に3つの変数があって
それの隣接する和と差を求めるものの1部なのですが。

変数が多くなってあまりに汚いのでどうにかできないものかと

237:デフォルトの名無しさん
07/11/12 19:25:30
>>236
それってsizeは関数に渡るのか?

238:デフォルトの名無しさん
07/11/12 19:26:24
きっと #define size 10 に違いない

239:デフォルトの名無しさん
07/11/12 19:30:53
>>235
昔は [0] が認められてなかった。
そのころからの古参ベテランだぞというアピール。


240:デフォルトの名無しさん
07/11/12 19:32:21
sizeは#define sizeですが
関数に渡してもどっちでもいい状態であります。

どうしても構造体に3つのintが入ることになってしまって…
testで作っていたソースはvalue1個だけとかでやってていけて
いざ3つにしたら ぅわぁぁあぁ…という状況に…

241:デフォルトの名無しさん
07/11/12 19:35:23
>>236
e add(e a, e b);
e sub(e a, e b);
のような関数を作ればおk

242:デフォルトの名無しさん
07/11/12 19:38:09
>>236
i のループで、output1,output2が壊れてない?
output1, output2には、i = size - 1 のときの値しかassignされないように見える。

243:デフォルトの名無しさん
07/11/12 19:39:35
>>236
配列の範囲外にアクセスしてるみたいだが、それはいいのかな?

244:デフォルトの名無しさん
07/11/12 19:40:01
int add(int a, int b){
return a+b; }


245:デフォルトの名無しさん
07/11/12 19:45:37
Cだし、マクロをうまく使えばどう?
#define SUM(x, m) x[j].m + x[j+1].m
みたいに。

246:デフォルトの名無しさん
07/11/12 19:46:11
>>242-243
元のソースを少し変えてi jの2重ループだけにしてるので、ちょっとおかしいところ出てますが
そこは気にしないでください。

>>241
それは構造体を返す型の、関数ということですか。
やったことが無いのでイメージしづらいのですが…ためしに組んでみます。

マクロでやれるかとも思ったのですが、ヘッダがものすごいことになりそうで。。

247:デフォルトの名無しさん
07/11/12 20:03:34
DEFINEって定数じゃなく式をも使えたのか!超勉強になるこのスレ!

248:デフォルトの名無しさん
07/11/12 20:35:49
>>247
そんなあなたにこのマクロをどうぞ

#include<stdio.h>
int main(void){
printf("File:%s Line:%d\n", __FILE__, __LINE__);
return 0;
}

249:デフォルトの名無しさん
07/11/12 20:42:32
246ですがとりあえず、マクロにして出来ました(その方が行が少なくできたので)

ただ行列(構造体)の横走査と
縦走査で同じようなことを2回書いて、あまり良くないソースになりました。

#define ADD(x, m) x[i][j*2].m + x[i][j*2+1].m  横走査
#define ADD_I(x, m) x[j*2][i].m + x[j*2+1][i].m 縦走査

for(i)
for(j)
ADD(); //横走査

for(i)
for(j)
ADD_I(); //縦走査

こんな感じに。。。
まだまだ修行不足です。アドバイスありがとうございました。


250:デフォルトの名無しさん
07/11/12 22:21:46
行数を少なく書くというのも大事だけど、ソースの可読性ってのも大事だよ。
>241の言うような構造体eを足し引きする関数を作れば、
for(i){for(j){
out1[j] = e_sum ( num[i][j] , num[i][j+1] );
out2[j] = e_sub ( num[i][j*2] , num[i][j*2+1]);
}}
って感じになるんだけど、
これだとソースを見て何をやっているかが一目でわかる。
後々メンテする可能性のあるプログラムならこっちの方がいいかと。

251:デフォルトの名無しさん
07/11/13 01:25:12
#include<stdio.h>
#define ROW 3
#define COLUMN 4
int main(void){

double a[ROW][COLUMN],b[COLUMN][ROW];
int i,j,k,l;
for(i=0;i<ROW;i++){
for(j=0;j<COLUMN;j++){
scanf("%lf",&a[i][j]);}}
l=k=0;
for(i=0;i<ROW;i++){
for(j=0;j<COLUMN;j++){
a[i][j]=b[k][l];
k++;}
l++;k=0;}
for(k=0;k<COLUMN;k++){
for(l=0;l<ROW;l++){
printf("b[%d][%d]=%lf\t",k+1,l+1,b[k][l]);}
printf("\n");}
return 0;}
a[3][4]の転置行列b[4][3]を表示したいんですがうまく表示されません。
どうすればよいですか?

252:デフォルトの名無しさん
07/11/13 01:28:29
スカラってなんですか?

253:デフォルトの名無しさん
07/11/13 02:01:40
>>251
代入文が逆ではないか?
× a[i][j]=b[k][l];
○ b[k][l]=a[i][j];

254:デフォルトの名無しさん
07/11/13 02:46:03
>>252
ベクトルじゃないやつ。

255:デフォルトの名無しさん
07/11/13 03:09:09
>>252
スカラーのことだろ?よく文字を見ればわかる。
ラーがついているということは、もともとスカルという意味で、
つまりはスカル人=スカラーだ。わかったか!?

あとは、マカセタ。

256:デフォルトの名無しさん
07/11/13 03:37:42
ネットワークプログラミングを勉強しようとおもい、getaddrinfo等を使ってみようとしたのですが

program1.c:8:24: sys/socket.h: No such file or directory
program1.c:9:19: netdb.h: No such file or directory
program1.c:11:24: netinet/in.h: No such file or directory
以下、↑が読み込まれてないことが原因と思われるエラー複数


と、必要なヘッダファイルが見つからないようでコンパイルが出来ません・・
環境ですが
cygwinとwsbuilderというのをインストールして両方でgccしてみたのですが
同じようなエラーが出てダメでした。
どうすれば解決できるでしょうか・・

257:デフォルトの名無しさん
07/11/13 08:15:45
>>253
いろいろやってるうちにそうなってました。
ありがとうございます

258:デフォルトの名無しさん
07/11/13 09:33:13
>>256
cygwinはsys/socket.hじゃなくてcygwin/socket.hとかにあるんじゃなかったかな。
こういう質問はC言語のスレじゃなくてcygwinスレとかの方が答えてくれると思う。


259:デフォルトの名無しさん
07/11/13 14:34:44
*a はポインタって当然分かるが、
今読んでるソースに**aみたいなのが、無数に出てきて、これが分からない

260:デフォルトの名無しさん
07/11/13 14:36:08
>>259
ポインタの位置を指すポインタ。

261:デフォルトの名無しさん
07/11/13 14:48:04
>>260
俺はアホだからよく分からない…

ぬこにも分かるようにお願いします><

262:デフォルトの名無しさん
07/11/13 14:51:47
>>261

int* -> int (int*はint(の場所)を指す)

int** -> int* (int** は int*(の場所)を指す)

263:デフォルトの名無しさん
07/11/13 17:24:52
int *p; → *p が int型
int **p; → **p が int型


264:デフォルトの名無しさん
07/11/13 17:29:09
int* p; って書く奴アホだよな。
わざわざ判りにくくしてやがんのな。


265:デフォルトの名無しさん
07/11/13 17:31:37
int* *p

266:sage
07/11/13 17:42:23
void A(void){
unsigned short usWork[2];

usWork[0] = 0x0012
usWork[1] = 0x0000

B(usWork);
}

void B(unsigned short *Buff){
*(Buff+0) &= 0xffff
*(Buff+1) += 0x12345678
}


※上記の様な関数AとBが存在し、AからBをコールする際、
 Bで誤ってshort型に4バイトで計算してしまいました。
 その場合は、関数Aで指定した変数にはどのような値が入るのでしょうか?
 また、関数Aで指定した変数を超えてメモリを使用する恐れはありませんでしょうか?


267:デフォルトの名無しさん
07/11/13 17:45:44
>>258
ありがとうございました、そちらのほうにいってみます

268:デフォルトの名無しさん
07/11/13 18:31:36
>>266
引数がunsigned short *Buffだとわかっているので、
*(Buff+1) += 0x12345678;
もunsigned shortで行われる。
(正しくはintに拡張されて計算されてshortに丸められる)

その結果がshortに収まらなくてオーバーフローしても、
他の領域には影響は及ぼさないよ。

269:デフォルトの名無しさん
07/11/13 18:43:07
ちなみに、usWork[1]の値は、0x5678になる。

270:デフォルトの名無しさん
07/11/13 19:17:00
なんか
ポインタじゃなくて配列の代わりみたいなもん、って教え方した方が
俺の場合はすっきりした><

でもポインタなんだよね。
ポインタなんて死ねばいいのに

271:デフォルトの名無しさん
07/11/13 19:38:38
むしろポインタ以外は死んで欲しい。
全部ポインタでメモリ確保しなきゃ使えないようにすれば混乱しなくていいのに。

272:デフォルトの名無しさん
07/11/13 19:43:13
関数の引数はx[]と書いても*xと書いても意味は同じだからね。
文字列(char*)の配列なんかだと、char *argv[]やchar **argvになってしまう。

[]付きのほうが理解しやすいよね。

273:デフォルトの名無しさん
07/11/13 20:30:05
すいません。

迷路でゴールを目指すプログラムを作りたいのですが、
左手法までたどり着き、その後がまったく分かりません。

どなたか、左手法の参考プログラムを教えていただけませんか?

ちなみに、Cを始めて3ヶ月です。

274:デフォルトの名無しさん
07/11/13 21:31:05
>>273
進行方向というパラメータを持って、
左に壁があれば1歩直進(前が壁なら右回転)、
左に壁が無ければ左を向いて1歩直進。
これの繰り返しじゃないのかな。

int maze[100][100]={...}; /* 迷路。壁が1、通路が0 */
int x=1,y=1; /* 現在地 */
int direction=0; /* 向き */

while(x!=98 && y!=98)
{
if(existleft()){if(existfront()){turnright()}else{go()}}
else{turnleft();go();}
}


275:デフォルトの名無しさん
07/11/13 21:37:30
すみません変な質問なのですが

tanak 170 60
satou 180 70
suzuki 162 55

onaka 192 80 (100行)

みたいなデータがあるのですが。
1行目読み込んで、任意の行(60行目とか)に飛ぶには
fseekでどうやるのでしょうか?

for文で回して、5行おきとか飛んだり、10行おきとかscanfで指定した分だけ飛んだり出来るような
ソースを最終的には考えているのですが、まずは指定した行だけ飛ぼうと思いまして

276:デフォルトの名無しさん
07/11/13 21:41:15
>>275
>fseekで
そのデータじゃ無理

277:デフォルトの名無しさん
07/11/13 21:41:59
嘘を教えるなよ

278:デフォルトの名無しさん
07/11/13 21:45:31
文字列がどう入ってるかによるんじゃね?

279:デフォルトの名無しさん
07/11/13 21:45:41
>>275
fseekはバイト単位で進んだり戻ったりする。データがテキストなら改行で数えたほうがラク。

280:デフォルトの名無しさん
07/11/13 21:48:01
>>279
改行で数える、というのは具体的にはどうやればいいんでしょうか

281:デフォルトの名無しさん
07/11/13 21:50:00
前に戻らないんなら、fgetsで読み捨てればいいんじゃないか。

282:デフォルトの名無しさん
07/11/13 22:00:06
fgetsだと、文字列や数値を変数にもっていくのがよくわからなく
fseekで移動しfscanfで読み込むという作業をしようとしていました。



283:デフォルトの名無しさん
07/11/13 22:01:07
>>282
sscanfでいいじゃね?

284:デフォルトの名無しさん
07/11/13 22:07:36
C言語で簡単なプログラムを作りたいんですが・・・

 ビット位置------入力ポート--------
 0 ・・・ SW1 ON:0 OFF:1
 1 ・・・ SW2 ON:0 OFF:1
 2 ・・・ SW3 ON:0 OFF:1 
 3 ・・・ SW4 ON:0 OFF:1 ・・・ モータ回転 右:1 左:0
 4 ・・・ 未使用 ・・・ 0 1
 5 ・・・ 光SW 明:0 暗:1


285:デフォルトの名無しさん
07/11/13 22:08:09
毎行fscanfしなくても、n行読み飛ばすなら、
for(i=0;i<n;i++)fgets(buff,buff_size,fp);
でいいんじゃないかってこと。

286:デフォルトの名無しさん
07/11/13 22:09:36


main()
{
int cnt, data;
outport (3,0) /* モータを止める
outport (4,0)
printf ("SW××を押してください\n");
while (1) { /* 無条件に繰り返す
data = inport (1) /* inport関数からdataを受け取る
if (data==××) /* SW××が押された状態か
break; /* 繰り返しから抜け出る
}
outport (××, ××); /* モータを動作させる
for (cnt=1 ; cnt<100 ; cnt++); /* 暫く待つ
outport (3,0); /* モータを止める
outport (4,0);
}
 注:××はSWの番号やモータの右左のポートが入る



287:デフォルトの名無しさん
07/11/13 22:11:06

上の条件やプログラムを参考にして
「SW1がONの時モータが右回転、
SW2がONの時モータが左回転、
SW3,4がONの時モータを止める、
光SWを暗くするとプログラム終了。」
というプログラムを教えて欲しいです。
他に何か必要な条件などがあったら教えてください。

288:デフォルトの名無しさん
07/11/13 22:11:59
連投失礼しました


289:デフォルトの名無しさん
07/11/13 22:15:41
SW1とSW2がONになったらどうするんだ?
SW1とSW3がONになったらどうするんだ?

290:デフォルトの名無しさん
07/11/13 22:17:01
for文で待つとかwww

291:デフォルトの名無しさん
07/11/13 22:19:11
0 = ON、1 = OFFが気になって夜も眠れない。

292:デフォルトの名無しさん
07/11/13 22:33:05
>>291
モーターならドライバにFETとかが入るので、負論理は普通にありえる。

>>287
電気・電子板がいいとおもうぞ。
URLリンク(science6.2ch.net)

293:デフォルトの名無しさん
07/11/13 22:36:14
あ、スイッチもか。
スイッチならプルアップして、押下時に接地で負論理ってのは多いな。


294:デフォルトの名無しさん
07/11/13 22:47:50
SWが2つ以上ONにして動作するのはSW3,4のみにしてそれ以外は動作しないものとします


295:デフォルトの名無しさん
07/11/13 23:00:42
URLリンク(mbga.jp)
モバゲーやっちゃお
ケータイでね

296:デフォルトの名無しさん
07/11/13 23:05:15
>>294
>>284を見る限りビットで制御するようだが、outport()とinport()の引数は整数なのか?

297:デフォルトの名無しさん
07/11/13 23:15:43
整数です


298:デフォルトの名無しさん
07/11/13 23:18:03
readとfreadやっぱりreadの方が早いんですか?
おしえてえろい人

299:デフォルトの名無しさん
07/11/13 23:26:45
>>297
outport()の第2引数はなんなの?
SW3とSW4が押されたとき、inport()でどうやって受け取るの?inport()を2回呼ぶの?
つーかそもそもinport()は実行すると入力があるまで待つの?
ハードの仕様も分からんし、不明な点が多すぎるよ。

300:デフォルトの名無しさん
07/11/13 23:27:47
>>298
readって何?

301:デフォルトの名無しさん
07/11/13 23:38:46
>>298
気にするな。お前が使えば、どっちでもそう変わりはしない。

302:デフォルトの名無しさん
07/11/14 00:05:03
readvのほうがもっとはやい。
mmapならさらにはやいかもしれない。

303:デフォルトの名無しさん
07/11/14 01:17:22
シスコと標準ファンクシャンヌの区別くらいできろよ。

304:デフォルトの名無しさん
07/11/14 19:57:03
ユーザーに5桁の整数を入力してもらい、除算演算子と剰余演算子を使用して
それが回文かどうか判定するにはどうすればいいですか。


305:デフォルトの名無しさん
07/11/14 19:58:45
配列に文字列で取得させて、
んで5ケタなら[0]と[4] [2]と[3]を比べてどっちも一致なら回文。

306:デフォルトの名無しさん
07/11/14 19:59:32
C言語の自主勉強の仕方教えてください!
今は一応入門の本を買って手取り足とりでプログラムを組んでる最中です


307:デフォルトの名無しさん
07/11/14 19:59:59
それを続ければいいじゃないの。

308:デフォルトの名無しさん
07/11/14 20:01:54
>>306
基礎を学んだら適当に自分でソースかいて実際コンパイルの繰り返し。
ボーリングのスコア計算とか組めるようになってようやく超初心者卒業じゃないかな。

309:デフォルトの名無しさん
07/11/14 20:06:51
>>306
独習Cだな。
あれを眠くならずに飽きもせずに最後まで練習問題こなせたら構文は卒業だよ。

とネタはさておき、何のためにCを勉強するかじゃないのか?
学校とか情報処理試験のためならそのレベルで十分だし、
何か作りたいソフトがあるなら、調べながらでも実際に作ってみればいい。
Cに限らずアルゴリズムやAPI、通信手順など学ぶものはいくつも出てくるから。

310:デフォルトの名無しさん
07/11/14 20:08:31
そうですか~
今一応簡単なのをしてるんですが楽しいです、本のまねをしてるだけですが
最初は仕組みを重点的に勉強した方がいいですか!?


311:デフォルトの名無しさん
07/11/14 20:13:56
例えば
int main(void)
から始まるけど、このvoidってなんだい?とか説明できるようになるともっと面白くなるよ。
構造も大事だけど意味も知ったほうがなおよし

312:デフォルトの名無しさん
07/11/14 21:06:21
>>310
ポインタと構造体の使いかたは理解しといたほうがいいと思うな
ソースが汚い人は大抵、構造体の使いかたが下手だよ

Cの本はあとあと読まないものが多いから、市立図書館を活用するのが一番のコツだと思う

313:デフォルトの名無しさん
07/11/14 21:15:12
市立限定かよw

314:デフォルトの名無しさん
07/11/14 21:17:39
区立図書館はダメですか?

315:デフォルトの名無しさん
07/11/14 21:17:54
村のオラはどうしたら><

316:312
07/11/14 21:18:45
ごめん、なんでもいいよorz

317:デフォルトの名無しさん
07/11/14 21:23:43
文系が得意な僕はプログラム系の仕事は向いていませんか?
ちなみにパソコンを触ることは大好きです

318:デフォルトの名無しさん
07/11/14 21:28:59
プログラミングに理系の素養は多少はあった方がいいが、
クライアントとの意思疎通やドキュメントの作成など、
文系の方が有利といえる内容も多いので、
理系だ文系だというのは関係ない。

胸を張って「俺は体育会系だ」と言ってやれ。

319:デフォルトの名無しさん
07/11/14 21:36:49
文系理系でどうこう言うやつって、血液型で性格をどうこう言うやつと同レベルだろ。

320:デフォルトの名無しさん
07/11/14 21:56:04
整数の各桁の値を、配列もポインタも使わずに、
また文字(列)としても扱わずに、四則演算だけで求める方法を
教えてください。

たとえば、123234と入力されたら、
num1 == 1;
num2 == 2;
num3 == 3;
num4 == 2;
num5 == 3;
num6 == 4
という風に取得したいのです。


321:デフォルトの名無しさん
07/11/14 22:23:02
>>320
% も使ったらいかんの?

num1 = n - (n / 10 * 10);
n /= 10;
num2 = n - (n / 10 * 10);
n /= 10;
num3 = n - (n / 10 * 10);
n /= 10;




322:デフォルトの名無しさん
07/11/14 22:24:20
あ、%は使ってもいいです。
むしろ%と/を使って取得する方法が知りたいのです。

323:デフォルトの名無しさん
07/11/14 22:28:48
num1 = n / 1 % 10
num2 = n / 10 % 10
num3 = n / 100 % 10
num4 = n / 1000 % 10
num5 = n / 10000 % 10

>>320 とは逆順だけど

324:デフォルトの名無しさん
07/11/14 22:33:53
>>323
ありがとうございます

325:デフォルトの名無しさん
07/11/14 23:04:57
ソースを読んでC言語を勉強したいのですが、お勧めのソースはありますでしょうか。

326:デフォルトの名無しさん
07/11/14 23:10:47
ない

327:デフォルトの名無しさん
07/11/14 23:40:27
>>319
世の中大概のことは非線形で
理系はそのことを理解していてなおかつ計算を楽にするために線形で近似する。
もちろん近似だからそれに限界があるのも知っている。
だが文系は最初から線形だ。
所詮は近似でしかない計算をバカはどこまでも頼みにしてバカでない者は経験で適当に我流の修正を加えていく。
計算が不完全なのを知っていて理論を新しく作ることも出来ないから理論を講じること自体を頭から否定して自分の経験に依存する。
物事のとらえかたに根本的な差があるのさ。

328:デフォルトの名無しさん
07/11/14 23:58:06
>>325
URLリンク(www.ioccc.org)


329:デフォルトの名無しさん
07/11/15 00:00:53
anderson.c がお薦め。

330:デフォルトの名無しさん
07/11/15 11:43:39
聞きます!

変数Aに変数Bの特定ビットを読み込みたいのですが、
専用の命令はありますか?

変数Bの 01010101の 一番右の「1」だけ、とか 
右から4番目の「0」だけとか読みたいのです。

「>>」 と 「<<」でずらすのが一番処理が早いでしょうか?

331:デフォルトの名無しさん
07/11/15 11:45:56
まあ普通はシフトするかな。
ビットフィールド使うこともあるけど。

332:デフォルトの名無しさん
07/11/15 11:46:42
A = (B >> n) & 1

333:デフォルトの名無しさん
07/11/15 11:47:51
bitset <100> B;

A = B[52];

334:デフォルトの名無しさん
07/11/15 13:12:16
ありがとうございます!
&演算子ありましたね。スマートです。
bitset勉強が必要です。精進します。どもども。

335:デフォルトの名無しさん
07/11/15 13:25:10
#include <stdio.h>

int count_a(char *);

int main ( void){
char str[]="Hello !! I am Computer.";

printf("%s \n",str);
printf("aを%d個含みます\n", count_a(?));

return 0;
}

int count_a(?){
?
}
文字列strに含まれる'a'の個数を戻り値とする関数count_aを作成せよ。
?の部分がわからないです

336:デフォルトの名無しさん
07/11/15 13:34:31
#include <stdio.h>
int count_a(char *);

int main ( void){
char str[]="Hello !! I am Computer.";

printf("%s \n",str);
printf("aを%d個含みます\n", count_a(str));

return 0;
}

int count_a(char* str){
 int count;
  for( count = 0;*str != '\0'; str++)
   if(*str == 'a')
    count++;
 return count;
}

337:デフォルトの名無しさん
07/11/15 13:47:26
きめえ! わざわざ自動varにコピーすんなボケ。


338:デフォルトの名無しさん
07/11/15 13:51:34
コピーってどこの事ですか?

339:デフォルトの名無しさん
07/11/15 13:52:35
自動var?


340:デフォルトの名無しさん
07/11/15 14:01:32
ワロタ

341:デフォルトの名無しさん
07/11/15 14:06:46
ちょっとクールにきめてみたぜ
ナウい略語を使ってるオレかっこよすぎだぜ

という心の声が

342:デフォルトの名無しさん
07/11/15 14:08:17
自動var……
auto variableのことか?

343:デフォルトの名無しさん
07/11/15 14:11:20
>char str[]="Hello !! I am Computer.";
 
たぶんこれのことだろうか?

344:デフォルトの名無しさん
07/11/15 14:36:00
char* str="Hello !! I am Computer.";
こうしろって事かな?


345:デフォルトの名無しさん
07/11/15 14:41:25
C言語ってどう勉強したらいい?

346:デフォルトの名無しさん
07/11/15 14:55:17
C言語っていつ勉強したらいい?

347:デフォルトの名無しさん
07/11/15 15:02:51
>>345
WisdomSoftのページの内容を全部解るくらいなら
あとはポインタ関連。それとANSIの関数(よく使うやつを主に)
を覚えておいた方が楽。
ついでに、基本的なアルゴリズムとデータ構造。
まぁ、気楽にね~

348:デフォルトの名無しさん
07/11/15 15:46:37
自分で欲しいと思うものがあるなら、それを作ってみるのがいい。
オレは昔友達とチャットがしたくて、コマンドラインベースのチャットソフトを作ったのが初めてのC。
必要にせまられて取り組むのとなんとなくでは、やる気も吸収スピードもまるで違うからね。
ソースはLinuxならSRPMとか、GNUライブラリあたりで大量に読める。
WindowsベースはほとんどC++かVBかDelphiだから、最近のはあまり役に立たないかもな。
WinAPIなんかdefineしまくってて、一見Cと思えないようなことしてるし。

349:デフォルトの名無しさん
07/11/15 16:20:52
作るのが比較的簡単で使って便利なものは今は大概フリーソフトやオープンソースになってるからね
必要に迫られること自体あんまりなさそう

350:デフォルトの名無しさん
07/11/15 16:30:18
>>349
そういうフリーソフトの「ここがこうだったらなぁ」を実現する為に作る時はあるよ。

351:デフォルトの名無しさん
07/11/15 16:36:41
>>350
実は既に実装済みで単にオプションの設定を知らないだけだった

ということがままあるわけで

352:デフォルトの名無しさん
07/11/15 16:38:32
既に存在するなら、それのマネでいいと思うよ。なにしろ興味を引く題材であることが大事。
よく本に載ってるアドレス帳みたいなの作れと言われても、いらねーと思ったらやる気起きないし。
趣味の範囲で取り組むならそれが一番。仕事だとそうもいかないけどね。
ただしコピペは厳禁な。全く身に付かないから時間の無駄。

353:デフォルトの名無しさん
07/11/15 16:48:17
>>352
そうやって必死に身に着けた知識が
既成の優れたライブラリの前では何の役にも立たないと知ったときに
努力は無駄ではなかったと必死に自分に言い訳するのさ

努力が無駄ではなかったと言えるのは結果を出した者だけだ

354:デフォルトの名無しさん
07/11/15 16:51:20
コピペはマジで何も身に付かんね~
猫でものホームページ見ながらSDK勉強しようとして
サンプルソースそのまま打ち込んだは良いが
何がどうなってるのかわけわからないままでいたもんだ
やっぱ初心者はウザイほどコメント付けるクセ
つけないと身に付かんね

355:デフォルトの名無しさん
07/11/15 16:52:50
>>353
キミは目的を勘違いしてないか?世界一優れたライブラリを作るのが目的なの?

356:デフォルトの名無しさん
07/11/15 16:54:56
>>351
いいんじゃねーの?
フルスクラッチできたら独自拡張できるんだし。

357:デフォルトの名無しさん
07/11/15 16:55:23
ああ修正しながら使うのはむしろいいことかもな
この処理どうなってんだろーとかへーこうやるんだー
ってちらっとでも見て感心することも大事

358:デフォルトの名無しさん
07/11/15 16:57:06
「どうしてこんなにつらいのボクだけ?」被害者意識に侵される
他人がひどくうらやましい そんな自分に
腹立つ毎日 手に負えない相乗効果

何をとまどうの ボクは今? なんでもありの人生の中で
ひとりよがりの悩みなど ほうり投げたら笑えよMOVE ON,MOVE ON, NOW

MOVE ON, MOVE ON

You're too young まだお若いのに疲れて 世界を全部見てきたよに
リタイヤするのもけっこう渋いと 呟いて
半端な同情買うのだけはやめよう

なにをびびってるの キミは今? でかいチャンスを目の前にして
なんてことはないよね何事も 楽しい者勝ち 動けりゃ MOVE ON,MOVE ON,NOW

寝て暮らすのも 街を捨てるのも 恋に溺れるも このボクの自由

何をとまどうの ボクは今? なんでもありの人生の中で
ひとりよがりの悩みなど ほうり投げたら 醜態を見せよう
がむしゃらな日々は報われる思いやり無きはバチ当たり
時の流れさえついてくる 自分で進みゃついてくる MOVE ON,MOVE ON,BABY

359:デフォルトの名無しさん
07/11/15 17:04:03
あとはアレだ、しょーもない単一機能のテストプログラムでもちゃんとコメント付けること。
そしてそのソースは消さずにきちんとメンテすること。自作のソースが溜まっていくと、後で必ず役に立つ。

360:デフォルトの名無しさん
07/11/15 17:09:11
そうやってゴミに埋もれて生きてゆくのね…

361:デフォルトの名無しさん
07/11/15 17:18:12
STLが標準じゃなかった頃、
C++始めたら自作の文字列クラスを作るのが通過儀礼だったな。

不定長で来る文字列をどう受ければいいのか、
バッファを越えたら大きなバッファを確保してコピーするのか、
リストで繋げてみるか、可変長配列(これも自作)に収納するかとか、
自分の知っている知識でともかく実装してみて動くものを作った。

さらにアルゴリズムの本や他人のソースを見て、
思いもよらなかった方法を発見して試して、
自分の作ったものの完成度が高まるのは純粋に楽しいし、
そういう試行錯誤した経験は無駄にはならないよ。

362:デフォルトの名無しさん
07/11/15 17:21:32
他の言語のあの関数使えたらな~で似たものを作るとか

363:デフォルトの名無しさん
07/11/15 17:34:26
>>362
最近は、Cの時はついついbits/stl_algo.hを見て書いてしまうw

364:デフォルトの名無しさん
07/11/15 18:18:27
無駄にはならないと言うのは
若者に時間を無駄にさせて自分たちが追い越されまいとする年寄りの方便

で何かマシなことやろうとすると結局プラットフォームに依存してるんだよね

365:デフォルトの名無しさん
07/11/15 18:29:51
>>364
無駄にならない方法をぜひ教えてくれ。

366:デフォルトの名無しさん
07/11/15 18:31:23
>>365
2ch に充てる時間を半分にする

367:364
07/11/15 18:35:18
>>365
>>364>>361に対する皮肉のつもりなんだが

368:デフォルトの名無しさん
07/11/15 18:36:04
一応C言語を勉強していますが
いまいち理解できません
最初はこんなもんですか・・?

369:デフォルトの名無しさん
07/11/15 18:38:07
>>366
時間のハンドリングの話じゃねーだろ。
なにを勉強すべきなんだって?

そもそも空いた時間で「再開発」やるって話じゃないのかね。
そんでそれは有用だよ、という。


370:デフォルトの名無しさん
07/11/15 18:39:09
>>364

>>361にとっていい経験だ、て話で誰も「お前らもやるべき」なんて言ってないと思うけど。

371:364
07/11/15 18:46:07
>>370
その解釈は誤り。
>>361の最後の文章は個人の経験の記述のように見せかけて最後の行で一般論に帰結させてる。
事実と意見を混同させる初歩的な手だ。

372:デフォルトの名無しさん
07/11/15 18:51:11
>>368
いきなりスイスイ進めねーよ
よほどの天才でもなけりゃあさ
つうかさ、一応ってなに?普段は他の言語やってんの?
独り言じゃないならこっちが答えやすいように質問してよ

373:デフォルトの名無しさん
07/11/15 18:55:21
「いちよう」とか言わないだけマシだと思え。

374:デフォルトの名無しさん
07/11/15 19:00:01
だから無駄にならない学習方法を教えてくれよ。
有用なライブラリは何も考えずに利用すべきであって、中身を知ろうとはするなってことか?
きっとその人は一生理解出来ないだけだと思うが。

375:デフォルトの名無しさん
07/11/15 19:13:23
ごめん俺エスパーじゃないから答えらんない

376:デフォルトの名無しさん
07/11/15 19:14:04
自分のしたい事してれば良いじゃない
学習するって事に拘るなよ

377:デフォルトの名無しさん
07/11/15 20:22:46
一応というかなんというか、
一日8時間みっちり学べば遅かれ早かれCの基礎はマスターできるんじゃないかね。

378:デフォルトの名無しさん
07/11/15 20:35:36
>>374
何が無駄で何が無駄でないかは
その無駄かも知れない何かを学び
発展途上の途中で無駄だったな
と無駄に無駄と言ってしまっても
その先で無駄ではないと思った
時点で無駄も無駄では無かった
と学ぶことでしょう。

379:デフォルトの名無しさん
07/11/15 20:52:51
文字列を仮想キーコードに変換するにはどうすればいいでしょうかv?

例:
string str="unk"

key( VK_U );
key( VK_N );
key( VK_K );


いっこいっこ調べるのが普通?しかしかなり面倒だ
if( str[0]=="a" ) key( VK_A );
if( str[0]=="b" ) key( VK_B );


if( str[0]=="z" ) key( VK_Z );

380:デフォルトの名無しさん
07/11/15 20:59:19
配列に入れておけばいいんじゃないか?
for(i=0;c=str[i];i++)key( keycode[c-'a'] );

381:デフォルトの名無しさん
07/11/15 23:18:31
ソートがわかるようでわからん・・・
配列に適当に数字おいて、一時的に保管しておく変数用意して、
ループの入れ子ループでカウントアップしつつ、
比較Aと比較Bで片方補完変数にいれてループ抜けて、
親ループでカウントアップさせて・・・ってやるんだけど、結果一番でかいのだけ連続して出力される('A`

382:デフォルトの名無しさん
07/11/15 23:19:34
ソースうp

383:デフォルトの名無しさん
07/11/16 00:03:35
ダメだ。アスタリスクを見るとポインタに見えてfor無限ループ(;;)を見ると顔文字に見えてしまったり
俺の頭はどうにかしてしまったのだろうか

384:デフォルトの名無しさん
07/11/16 00:05:00
->も然り

385:デフォルトの名無しさん
07/11/16 00:08:42
頼むから俺に聞くとき、変数 i を使わないでくれ
印刷したソース逆から見る俺の身にもなってくれ
なんでここで否定してんだって何度も思うじゃねえか

386:デフォルトの名無しさん
07/11/16 00:12:28
プログラムの仕事につくには英語を最低限身につけないといけないんですか?

387:デフォルトの名無しさん
07/11/16 00:15:37
>>386
最低限、英語で書かれた技術文書は、読める必要が必ずでてくる。
ただ、技術文書は平易な英語で書かれているから、すぐなれると
思うよ。

出世して、英語の契約書読む羽目になるとまた別だが。

388:デフォルトの名無しさん
07/11/16 00:19:20
完全に読めなくても、だいたいの意味はわからないか?
見たこと無い単語が出てきたら辞書引く程度で間に合うよ。

389:デフォルトの名無しさん
07/11/16 00:31:24
ときどき
printf("")のprintf文をいれなかったらセグメンテーションエラーでて
printf文をいれたらセグメンテーションエラー消えることがあるんですけど
これはどういうことなんでしょうか?

390:デフォルトの名無しさん
07/11/16 00:34:50
バグです(多分バッファオーバフローの)

391:デフォルトの名無しさん
07/11/16 00:47:38
>>381
ソートもアルゴリズムの分野だけど
理解できないんなら
有名どころのソート(6個くらい)
丸覚えしとけば良いじゃん。

まぁ、バブルソートぐらいは理解しといた
ほうが良いとは思うけど。

392:392
07/11/16 00:49:25
ある処理の実行時間の測定を次のようにしました。

start = clock();
なんらかの処理
end = clock();

time = (float) (end - start) / CLOCKS_PAR_SEC;
pirntf("実行時間%d\n", time);

これでtimeを出力すると、
536870912, 2147483648, 1073741824, 1610612736, 0
のうちのどれかの値に-ついたりつかなかったりして、出力されます。
「なんらかの処理」を変えても 上記の値しかでません。
どうしてこうなるのか分かりません。教えてください。

393:デフォルトの名無しさん
07/11/16 00:55:20
>>392
time という変数名がマズイ
time が実数型であるにもかかわらず %d で出力している
typo がある
の全てが原因でしょう

394:デフォルトの名無しさん
07/11/16 00:58:52
clock()が返すのはclock_tだが、startとendの型は?

395:392
07/11/16 01:04:08
>>393
timeという変数について調べてみます。
%fでしたね@@;
ありがとうございました!!

>>394
clock_tで宣言しています。
回答ありがとうございます!

396:デフォルトの名無しさん
07/11/16 01:18:02
しかし深夜にならないとプログラム作る気おきないのはなぜなんだろう

397:デフォルトの名無しさん
07/11/16 07:14:36
あるある

398:デフォルトの名無しさん
07/11/16 16:49:36
文字列を倍精度に変換する関数strtodにバグがあるようでうまく変換してくれません。

const char* pszInput = "9999999999999999999999999999999999999999999999999999999999999999999999999999999999";
char* pszStop;
double dOutput;
dOutput = ::strtod(pszInput, &pszStop);
::printf("input:%s\noutput:%f\nstop:%s\n", pszInput, dOutput, pszStop);

output:9999999999999999600000000000000000000000000000000000000000000000000000000
000000000.000000
となってしまいます。ERANGEも検出されません。
これはよく知られたバグなのでしょうか?また対策はあるのでしょうか?

よろしくお願いします。

399:デフォルトの名無しさん
07/11/16 16:51:47
>>398
「有効桁数」でググってきな

400:デフォルトの名無しさん
07/11/16 17:12:46
9999999999999999999999999999999999999999999999999999999999999999999999999999999999
約 10^83

有効桁数 83 桁の数値を扱うために最低限必要なビット数を x とすると
2^(x-1) < 10^83 < 2^x
x = ceil( 83 / log2 )
x = ceil( 83 / 0.301 )
x = 276
1 バイトを 8 ビットとして最低 35 バイトは必要

>>398 が自分で実装するのは無理だろうからライブラリを探した方がいいでしょう

401:デフォルトの名無しさん
07/11/16 17:14:01
>>400 は83桁じゃなくて82桁だった

402:デフォルトの名無しさん
07/11/16 19:18:42
質問:C言語の「volatile」の名前の由来について

質問です。
C言語には「volatile」という記号が あります。
これを記入すると、該当部分でのコンパイル時の最適化を抑制できます。
しかし、なぜ volatile(移り気な、気まぐれな)なのでしょうか。
最適化を抑制しているのですから、むしろ「変化しない」という意味に なるはずです。
つまり、volatile では なく、「un-volatile(不揮発の、変化しない)」になるべきでは ないでしょうか。
教えてください。よろしくお願い致します。

403:デフォルトの名無しさん
07/11/16 19:29:20
volatile 変数は移り気で勝手に変化するから、最適化せずに毎回ちゃんとメモリを読みにいかないと正しい結果を得られない、と考えてはいかが

404:デフォルトの名無しさん
07/11/16 19:31:36
快活に計算動作するから
最適化などで省略して定数になったり計算無効になったりしたらこちらは変化無い

405:デフォルトの名無しさん
07/11/16 20:57:33
最初に名前を入力させ、5件分の入力が行われるか、endと入力されたら、その分だけ出力させる
ただし名前入力の最初にendが入力された場合は、その旨のメッセージを出力して再入力させてください
名前は最大15文字入力とする

これのやり方を教えてください

406:デフォルトの名無しさん
07/11/16 21:10:12
初歩的な質問スミマセン

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
char *cp=NULL;
void *ptr=NULL;

if((ptr=(char*)calloc(10,sizeof(char)))==NULL){
printf("error\n");
exit(EXIT_FAILURE);}

if((cp=strchr(fgets(ptr,100,stdin),'\n'))!=NULL){
*cp='\0';}

printf("%s",ptr);

return EXIT_SUCCESS;
}

半角文字10文字分のメモリをcalloc関数で確保して
fgets関数で10文字以上入力しましたが
普通10バイト分の配列を用意しfgets関数でそれ以上の文字を入力すると
オーバーフローが起き、強制終了しますよね?
ですがこれでは起きないんです、何故でしょうか

407:デフォルトの名無しさん
07/11/16 21:13:04
>>402
どっかで勝手に値が変えられる可能性があるから volatile だな。

408:デフォルトの名無しさん
07/11/16 21:56:34
>>406
ひーぷに余裕があるからじゃね?

409:デフォルトの名無しさん
07/11/16 22:10:54
>>405
丸投げは宿題スレへ
スレリンク(tech板)l50

410:デフォルトの名無しさん
07/11/16 22:12:14
>>406
>オーバーフローが起き、強制終了しますよね? 

そうとは限らない
他のところで使ってるメモリ領域を黙って書き換えるだけの場合もある

411:デフォルトの名無しさん
07/11/16 22:16:27
>>409
あっすいませんでした

412:デフォルトの名無しさん
07/11/16 22:17:24
>>408
あ、そういうことか!!
どうもありがとうございました

413:デフォルトの名無しさん
07/11/16 22:37:56
>>402
「最適化しないだって?」
「ああ、今日はそんな気分なんだ」
「まったく気まぐれな奴だよ」

414:デフォルトの名無しさん
07/11/16 22:52:46
>>402
#define donotoptimize volatile

415:デフォルトの名無しさん
07/11/16 22:56:56
違うとおもいますよ。
綿密な計画と設計思想に基づいてボラタイルに したんです。
気まぐれで ボラッたわけでは ありません。

416:デフォルトの名無しさん
07/11/16 23:23:58
なぜmainはmainという名前にしたんだろう、startの方がよくない?と思ったことはあります

417:デフォルトの名無しさん
07/11/16 23:25:04
だったらstopも要ると思わないか

418:デフォルトの名無しさん
07/11/16 23:36:50
多分main,subで分けて書いたからじゃないかな。

419:デフォルトの名無しさん
07/11/16 23:46:05
>>417
関数の名前にしちゃうとその辺の理屈あわせが難しくなるよね
>>418
ああなるほど

関係ないけどmain"メソッド"には今でも違和感がある…

420:デフォルトの名無しさん
07/11/17 01:36:08
mainメソッド……てJAVA?

421:デフォルトの名無しさん
07/11/17 02:07:26
Cから始めた自分には違和感なかったけど、よくよく考えたら不思議な名前のメソッドだな。

422:デフォルトの名無しさん
07/11/17 02:17:27
mainと言いつつ、主要な処理は他のところでやってるしね。

423:デフォルトの名無しさん
07/11/17 02:22:01
主要な流れ、ということじゃないか?
主要な処理を他でやっていても、
全体通してのメインの流れを定めるのがmain関数

int main(){
first_step();
second_step();
third_step();
return 0;
}

424:デフォルトの名無しさん
07/11/17 03:51:36
構造体のメンバの数って制限あるのですか?

425:デフォルトの名無しさん
07/11/17 09:08:36
そりゃあるだろうが、限界まで使ったこと無いな。


426:デフォルトの名無しさん
07/11/17 09:18:17
ハード側の限界にぶつかったことならあるが、規格の限界は知らないな

427:デフォルトの名無しさん
07/11/17 19:17:14
MFCって何?

428:デフォルトの名無しさん
07/11/17 20:24:04
>>427
ググれ

429:デフォルトの名無しさん
07/11/17 20:33:33
HTMLのform解析をしたいのですが、
<form action="./int.php" method="post">
<input type="text" name="id" value="C">
<input type="submit" name="button" value="押す">actionは./int.php
methodはPOST
typeはtext、nameはbutton valueはC
というように<>内をそれぞれ抽出したいのですが、どのようにしたら出来ますでしょうか?

430:デフォルトの名無しさん
07/11/17 22:36:57
オイラだったら perl でやる。rubyも好いらしい。


431:デフォルトの名無しさん
07/11/17 22:42:25
字句解析はCよりPerlを勉強した方がはるかに楽だよ

432:デフォルトの名無しさん
07/11/17 23:01:25
>402

volatileは「最適化抑制」という意味じゃない。
「値が外的要因(ハードウェアなど)によって変化しうる」という意味。


433:デフォルトの名無しさん
07/11/17 23:05:27
>429

Win系だったらMFCや.NET Framework、UNIX系ならPerlを使ったほうがいいな。

Cでやるしかない、という場合だったら、methodなどのキーワードの後の"...;"の中を一々抽出するしかないな。



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