C言語なら俺に聞け( ..
[2ch|▼Menu]
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部なのですが。

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


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

4973日前に更新/195 KB
担当:undef