C言語なら俺に聞け(入門篇) Part 21

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 20
http://pc11.2ch.net/test/read.cgi/tech/1192455273/

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 99代目
http://pc11.2ch.net/test/read.cgi/tech/1194262698/
2デフォルトの名無しさん:2007/11/07(水) 06:25:04
3デフォルトの名無しさん:2007/11/07(水) 06:25:50
うお、あぶね俺もたてるとこだった。
ともあれ>>1
4デフォルトの名無しさん:2007/11/07(水) 07:46:40
XP VisualC++2005 ExEdiで作業をしています。

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

わかりにくくてすみません。
5デフォルトの名無しさん:2007/11/07(水) 13:09:44
窓を開いてグラフを描くようなプログラムを書けばいいです

窓の開き方がわからないとか、図形の表示の仕方がわからない?
その場合は Win32 API を勉強
6デフォルトの名無しさん:2007/11/07(水) 13:23:41
やっぱりWin32APIでの表示なんですね ありがとうございます。
7デフォルトの名無しさん:2007/11/07(水) 14:51:32
強化学習のQ-learningを用いたサンプルプログラムはないですか?

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

プログラムはC言語でお願いします。 どうもこれらがイメージつかないんでお願いします。
8デフォルトの名無しさん:2007/11/07(水) 15:30:37
>>7
スレ違い。
つーか、マルチすんなや。
http://pc11.2ch.net/test/read.cgi/tech/1193150915/961
http://pc11.2ch.net/test/read.cgi/tech/1193556424/227
ちゃんと↑の228にレスついているだろ。
9デフォルトの名無しさん:2007/11/07(水) 15:43:42
末尾再帰の最適化が起きる条件ってやっぱり実装によって違う?
10デフォルトの名無しさん:2007/11/07(水) 15:54:26
>>9
違う。つーか、入門者はそんなこと気にしなくて構いません。
11デフォルトの名無しさん:2007/11/07(水) 15:57:52
と入門者が申しております。
12sage:2007/11/07(水) 16:01:08
>>10
ちょっと気にしてるんだよ。
やっぱgccか・・・?
デバッガ使うスキルがないんで確認ができないんだよね。
13デフォルトの名無しさん:2007/11/07(水) 16:03:15
>>12
アセンブリ出力を読むスキルもない?
例えば、callってニモニックがどこに散らばっているか位読めれば末尾再帰が展開されたかどうか判るんだけど。
つーか、スレ違い脱中年。
14デフォルトの名無しさん:2007/11/07(水) 16:03:35
ない。
15デフォルトの名無しさん:2007/11/07(水) 16:05:19
まずは逆アセンブルからか・・・
16デフォルトの名無しさん:2007/11/07(水) 18:33:55
>>15
-S でいいだろ
17デフォルトの名無しさん:2007/11/07(水) 18:37:49
BCCならそうだね。
VCだったら /FA かな
18デフォルトの名無しさん:2007/11/07(水) 20:04:57
質問です。

コマンドラインからパスワード等の入力をするときは、標準入力にパスワードを入力してるのに
画面には入力した文字を表示しないようになってるよね。これってどうやって実装してるんですか?
fgets()などのC言語のライブラリ関数では、どうやればいいかわからない。。
19デフォルトの名無しさん:2007/11/07(水) 20:30:32
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/getpass.3.html
を読めば分かると思うが、通常は打った文字はechoされて画面に出る。
が、しかし、echoフラグを一時的に切れるような、getpassあたりの関数を使えば隠す事が可能になる。
詳しい実装方法は、getpass関数のソースを読めばわかると思うよ。
2018:2007/11/07(水) 20:44:02
>>19
ありがとうございます
21デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/07(水) 22:51:47
やってみればいいと思うよ^^
23デフォルトの名無しさん:2007/11/07(水) 22:58:20
やってみました。できませんでした><

そのためにmemcpyがあるのですね。
できました。ありがとうございましt
24デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/07(水) 23:34:42
>>17
gccだったら?
26デフォルトの名無しさん:2007/11/07(水) 23:36:22
>>24
一度にって表現がよくわからない。
27デフォルトの名無しさん:2007/11/07(水) 23:39:26
for文を使わないでmemcpyみたいな感じで、ということです
28デフォルトの名無しさん:2007/11/07(水) 23:44:57
memcpyみたいなものの内部でforを使ってたらどうすんだよ
29デフォルトの名無しさん:2007/11/07(水) 23:46:24
ふつーのコンパイラなら-Sでアセンブリ出力。
30デフォルトの名無しさん:2007/11/07(水) 23:51:22
>>29
サンクス。
31デフォルトの名無しさん:2007/11/07(水) 23:53:25
>>24
二次元配列がメモリ上でどうなってるか考えてみればすぐわかるだろうに。
32デフォルトの名無しさん:2007/11/08(木) 00:13:35
二次元なのか。
まだまだトーシローな俺は
二次元配列のような格納できる関数でもあるのかとおもっちまったぜ・・・
33デフォルトの名無しさん:2007/11/08(木) 00:19:20
>>31
そうですね。諦めました
人間諦めが肝心
34デフォルトの名無しさん:2007/11/08(木) 10:44:09
>>21

struct e{
int value[256];
};

e tmp;
e num[256];

tmp = num[i];
35デフォルトの名無しさん:2007/11/08(木) 12:58:14
ふと思ったんだけど、
構造体同士の代入はできて配列同士の代入はできないて理不尽じゃね?
36デフォルトの名無しさん:2007/11/08(木) 14:14:01
>>35
いや別に。Cでは配列をそのまま扱うことはできないと諦めているからどうでもいいよ。
どうせ、関数にそのまま渡すことさえできないんだから。
37デフォルトの名無しさん:2007/11/08(木) 14:23:10
>>21
マルチ乙
38デフォルトの名無しさん:2007/11/08(木) 14:34:56
>>35
理不尽っつぅかそういう考え方なんだな。配列は一つの纏まったオブジェクトではない、と。
一つの纏まったオブジェクトにしたいなら、上のように構造体で包めばいい。
39デフォルトの名無しさん:2007/11/08(木) 16:46:00
double型のデータを表示するときに桁数をそろえたいんですが、どうすればいいですか?
マイナスの符号とかがあると変わってしまって表が汚くなります
40デフォルトの名無しさん:2007/11/08(木) 16:51:29
符号だけなら "%+f" とか "% f" にすればいいよ
41デフォルトの名無しさん:2007/11/08(木) 16:58:33
つ[%25.15g]
42デフォルトの名無しさん:2007/11/08(木) 17:01:40
>>40
どうも!
43デフォルトの名無しさん:2007/11/08(木) 17:44:24
>>38
構造体も配列同様、コピーできなかったのも今は昔。
44デフォルトの名無しさん:2007/11/08(木) 17:49:20
double型で割り算する場合、その数字がどのぐらい小さいと危険ですか?
45デフォルトの名無しさん:2007/11/08(木) 17:52:54
このぐらい(・∀・)c
46デフォルトの名無しさん:2007/11/08(木) 18:01:16
>>44
IEEE754であれば、表わすことができる最大値が1e308程度なので、商がその値を超えなければ(精度は兎も角)解は得られる。
つまり、1/1e-308は1e308だが、10/1e-308は1e309なので無限大になってしまう。
尤も、無限大になっても特に危険はないので安心して0で割ればいいと思う。
47デフォルトの名無しさん:2007/11/08(木) 18:05:38
そこが実数演算の面白いところだよな。
1 / -1e-320はちゃんと-Infになるからね。
48デフォルトの名無しさん:2007/11/08(木) 18:46:18
>>46
0で割るととまってしまうんですが・・・
49デフォルトの名無しさん:2007/11/08(木) 18:49:53
今日構造体習った
スゲー便利
50デフォルトの名無しさん:2007/11/08(木) 20:06:22
>>48
0の除算をしたらプログラム割り込みが発生し、強制終了となる。
51デフォルトの名無しさん:2007/11/08(木) 20:34:16
それ整数型だろ。
52デフォルトの名無しさん:2007/11/08(木) 23:29:45
実数演算だと0で割っても止まらないんだよな
0で割ってるのに気がつかなくてはまったことがある
53デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/09(金) 00:41:59
それはたまたまEOFの値が-1だったというだけだろう。
scanfの戻り値を見ろ。あるいはscanf後にfeof(stdin)を見るという手も使えると思う。
55デフォルトの名無しさん:2007/11/09(金) 05:47:16
>>53
EOFとの比較は、「ほにゃららの場合はEOFになる」と明記されたものと行います。
例えばfgetc()のリターン値とか。
56デフォルトの名無しさん:2007/11/09(金) 13:55:01
double *dp;
dp=(double*)malloc(sizeof double);
コンパイル通らないよ
どうすればいい
57デフォルトの名無しさん:2007/11/09(金) 13:59:32
sizeof (double)

sizeof *dp
58デフォルトの名無しさん:2007/11/09(金) 14:00:36
ども
59デフォルトの名無しさん:2007/11/09(金) 14:01:33
(double)
60デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/09(金) 19:05:00
>>54>>55
ありがとうございます。
ちょっと詳しくしらべてみます。
62デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/10(土) 00:03:44
62はわかりました
p[1].x[1] = 10;
こう入れないとだめなんですね

んで、 p[0].x[0] = 10;
だと表示ができるのですが
p[1].x[1] = 10;
だとエラーが出てしまいます。なんででしょうか
65デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/10(土) 00:23:47
プログラムのことではないのですが、お尋ねしたいことがあります。
このたび仕事でC言語のソース解析を行うことになったのですが、コードリーディングのために便利なツールなどは無いでしょうか?
コード中の関数や構造体をダブルクリックすると、定義してあるソースまでジャンプしてくれたりしたら助かるのですが


よろしくお願いいたします
68デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/10(土) 00:26:36
>>67
VisualStudioは、右クリックから定義へ移動って機能があるけど、Cでちゃんと動くかはわからない。
70デフォルトの名無しさん:2007/11/10(土) 00:29:10
>>69
それなりに動く。
たまにどのシンボルか選べってなることもあるけど。
71デフォルトの名無しさん:2007/11/10(土) 00:30:21
>>68
doxygenというのがあるよ
ttp://www.fides.dti.ne.jp/~oka-t/doxygen.html#sample
こんな感じでクラスや関数間の関係を可視化してくれる。

導入方法はここから
ttp://skazami.web.infoseek.co.jp/tools/Graphviz_Doxygen.htm
72デフォルトの名無しさん:2007/11/10(土) 00:30:59
>>71のは>>67へ向けたもの
73デフォルトの名無しさん:2007/11/10(土) 00:59:10
構造体に不定の配列を定義して、後で配列の最大値を設定するにはどうしたらよいでしょうか?
例えば…

struct{
foo[]
};

で、配列の使用時に

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

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

それとも構造体の定義時にあらかじめ余裕をもって配列を定義してしまう方がいいですか?
74デフォルトの名無しさん:2007/11/10(土) 01:15:34
malloc。
良く分からないなら、あらかじめ定義した方が良いだろうね。
75デフォルトの名無しさん:2007/11/10(土) 01:23:53
>>67
秀丸エディタにそういう機能あるよ。
76デフォルトの名無しさん:2007/11/10(土) 01:48:32
>>74
ありがとうございます。

正直よくわからないので、助言どおり余裕を持って最初に定義してしまうことにします…すんません。
77デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/10(土) 10:33:24
こんな図形をFor文で作れといわれたんですが・・
まったくワカリマセン(´・ω・`)・・どなたか助けてください
↓こんなの
***
**
*
79デフォルトの名無しさん:2007/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;
}
8078:2007/11/10(土) 10:43:36
>79さん
ありがとうございます

そうさせていただきます・・w
81デフォルトの名無しさん:2007/11/10(土) 11:47:01
質問です。
今C言語の勉強をしていて、Cpadというエディターで書いたあとにコンパイルして
実行ボタンを押して実行しています。
コマンドプロンプトが表示されて、処理が実行されますが一回で終わってしまいます。
例えば「ある数をscanfして、それに2を加えた数をprintfする」というプログラムのとき
結果が出力されたあとに、またscanfに戻るって何度もプログラムを続けることってできないですか?
説明下手ですが、宜しくお願いします。
82デフォルトの名無しさん:2007/11/10(土) 11:49:57
>>81
for(;;) {
  scanf(・・・);
  printf(・・・);
}
83デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/10(土) 12:04:31
>>83
a の値を表示させてないからじゃないかな
85デフォルトの名無しさん:2007/11/10(土) 12:04:37
> printf("%d\n",&j);
86デフォルトの名無しさん:2007/11/10(土) 12:08:30
>>84->>85
迅速なレスありがとうございます。
間違っていました…。
でも今度は結果が3926が出力されるようになりました。
今日手探りで色々入れたので、もしかしたら環境の問題なのかもしれません。
ちょっと色々試してみます。ありがとうございました。
87デフォルトの名無しさん:2007/11/10(土) 12:10:42
>>86
printf("%d\n", a); // & はいらない
88デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/10(土) 12:36:29
>>88
ムリ。
90デフォルトの名無しさん:2007/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
としないといかんわけですか。
9163:2007/11/10(土) 13:09:39
>>77
お答え頂ありがとうございました。
ずっと悩んでいたので、やっとスッキリすることができました。
92デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/10(土) 13:47:26
関数を代入してるんじゃない
関数を実行した戻り値を代入しているんだ
9492:2007/11/10(土) 14:28:06
>>93
レスありがとうございます。
関数を代入しているわけではなく、関数の戻り値を代入しているのですね。
なぜ、戻り値を代入しているのですか?

3行目は、二分探索木の有無の判定で、無い場合は、そのままNULLを
返して終了。
4〜5行目は、左部分木が無ければ、根が最小値なので、最小値の節点の
アドレスを入れる変数であるmに根のアドレスであるtを代入して、
それを返して終了。
なので、7行目以外は解るのですが、7行目はどういう処理をしてる
のですかね?
95デフォルトの名無しさん:2007/11/10(土) 14:35:53
>>94
tがNULL→NULLを返す
t->lがNULL→tが最小なのでtを返す
それ以外→t->lから始まる二分木で最小の物を返す

ok?
96デフォルトの名無しさん:2007/11/10(土) 14:42:11
      ○
    ○┘└○
   ○┘○┘└○
  ○┘  ・・・┘└・・・
 ○┘
9792:2007/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デフォルトの名無しさん:2007/11/10(土) 15:44:58
>>97
if(t->l == (struct node *)NULL)
に引っかかって
m = min(t->l);
が実行されずに
m=t
が実行されるので
if(t != (struct node *)NULL){
が偽になるのは再帰ではなく外から呼び出した場合だけ
9992:2007/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デフォルトの名無しさん:2007/11/10(土) 16:19:20
自分で考えてみたんですがちょっと分からないので
教えてください。

学校でユークリッドの互除法によって最大公約数を出すプログラムを
作ったんですが、これは2つの数の最大公約数を求めるものですよね。
もし3つとか6つとかの数の最大公約数を求めるんだったらどうプログラムするのが
一番なのでしょうか?ユークリッドを工夫すれば出来るでしょうか。
101デフォルトの名無しさん:2007/11/10(土) 16:22:55
>>99
メイン関数に返るのではなく呼び出した関数の呼び出した位置に返るのだよ
つまりmin(t->l)が実行されたあとにその戻り値がmに代入されてreturn mで戻り値となりそれが更に・・・
てな具合で呼び出した順を逆にたどるために各階で戻り値を返す必要があるわけだ
102デフォルトの名無しさん:2007/11/10(土) 16:26:51
>>100
数学板の方が適切だと思われ。
103デフォルトの名無しさん:2007/11/10(土) 16:40:34
>>100
まさかとは思うけど、複数の数の最大公約数の求め方を知らないという話じゃないよね?
ユークリッド互除法より最適なアルゴリズムはないのか、という話だよね?
104デフォルトの名無しさん:2007/11/10(土) 16:58:45
>>100
int gcd(int a, int b); // 引数で与えられた2数の最大公約数を返す関数
があるとして
gcd(a, gcd(b, c));
なら…
10592:2007/11/10(土) 17:34:55
>>101
なるほど、だからm = min(t->l);と言う様にmに代入しているのですね。
完全に理解できました。

アドバイスして下さった方、本当にありがとうございました。
106デフォルトの名無しさん:2007/11/10(土) 21:13:15
等比数列の和の求め方のソースコードを載せてください。(初項a,公比r,項数nとする)
107デフォルトの名無しさん:2007/11/10(土) 21:20:43
それは宿題スレ向き

分投げじゃなくて、少しは考えよう
108デフォルトの名無しさん:2007/11/10(土) 21:21:23
109デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/10(土) 22:13:24
等比数列の初項a,公比r、項数nをキーボードから入力して、
それらを画面に表示して最後にそれらの総和を表示する。
ただしa,rは実数値とする。
111デフォルトの名無しさん:2007/11/10(土) 22:17:07
>>109
*yuv は yuv[0] と同じ意味

112デフォルトの名無しさん:2007/11/10(土) 22:22:48
yuv[0] = *(yuv + 0) = *yuv
113デフォルトの名無しさん:2007/11/10(土) 22:31:13
>>111-112
ありがとうございます。理解できました。
114デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/10(土) 23:55:49
pow( 2.0, 1.5 );
116デフォルトの名無しさん:2007/11/10(土) 23:55:52
素直にpow(2, 3 / 2)でよろしかろ。
117デフォルトの名無しさん:2007/11/10(土) 23:56:53
そのままで良かったんですねw
ありがとございます
118デフォルトの名無しさん:2007/11/10(土) 23:56:54
いいえ
119デフォルトの名無しさん:2007/11/10(土) 23:57:15
おっといけねぇ。pow(2, 3. / 2)だね。
120デフォルトの名無しさん:2007/11/11(日) 00:19:30
FFTで振幅が正確に得られないときはどうするの?
numerical recipeのコード使ってるんだけど、
同じ振幅で別周波数の時系列入れてもスペクトルの
大きさが違うんです。
周波数の適当なビンで積分しても違いがあるどうしてかな。
コードはいじってないよ。
121デフォルトの名無しさん:2007/11/11(日) 00:28:07
>>120
入力波形を正弦波にしてサンプリング周波数の 1/(2^n) にしてもそうなる?
122デフォルトの名無しさん:2007/11/11(日) 01:55:42
超初心者な質問だけど、よろしく。

俺は情報科の1年なんだけど、
大学でやってるCを自宅でもやりたいと思ってるんだけど、
そういうのを自宅でやるのはどうすればいいの?
できれば無料でやりたいんだけど、
そんなソフトをインストールすればいいのか教えてください。
123デフォルトの名無しさん:2007/11/11(日) 01:58:27
学校で使ってるOSとかコンパイラは何?
124122:2007/11/11(日) 02:02:02
>>123
OSはXPです。
コンパイラ・・・ってなんだろ?
emacsとかktermとか使ってますけど。
125デフォルトの名無しさん:2007/11/11(日) 02:05:55
コンパイラはソースコードから実行ファイルを作るプログラム
126デフォルトの名無しさん:2007/11/11(日) 02:07:08
そのレベルで環境構築は無理だよ。素直に学校の先生に聞いてみよう。
127デフォルトの名無しさん:2007/11/11(日) 02:08:38
>>124
gccは使ってる?
128122:2007/11/11(日) 02:28:58
すみません、やっぱり今の俺には
自宅で環境整えるのは難しいみたいですね・・・。
今度聞いてみます。
こんな時間にありがとうございました。
129デフォルトの名無しさん:2007/11/11(日) 02:37:20
いや、やること自体は難しくないよ。先生に聞けば普通に解決すると思う。
130デフォルトの名無しさん:2007/11/11(日) 02:41:18
>>128
学校と同じものを揃えたいんでしょ?
とりあえず学校で何を使ってるかを調べるだけでおk
131デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/11(日) 03:28:54
>>131
i に注目。
133デフォルトの名無しさん:2007/11/11(日) 03:34:37
>>132
レスありがとうございます.
でも,ちょっとわかんないです^^
134デフォルトの名無しさん:2007/11/11(日) 03:37:53
>>133
そういうときには、取り敢えずsumを更新した次の行に(その下にある)printf()の行をコピーしてみよう。
それを実行しても未だ問題点が見つからないようなら、きっと注意力不足か適正不足だと思うよ。
135デフォルトの名無しさん:2007/11/11(日) 03:58:31
>>131
不等号の向きが逆。
136デフォルトの名無しさん:2007/11/11(日) 04:03:45
>>134
レスありがとうございます.
sum += i*i*i;
の下にprintfを入れてみたけど,そこの分のprintfが実行されてなさそう…
ってことは,for自体が実行されてないんですかね?
137デフォルトの名無しさん:2007/11/11(日) 04:24:04
若干スレ違いかもしれないですが・・・

Borland C++ Compiler 5.5
Borland Turbo Debugger 5.5
BCC Developer
を使ってC言語を勉強してるのですが、最近BCC Developerがよくバグります。
プログラムはちゃんと書けてるのに、いざコマンドプロンプトを開くと「問題が発生したため〜〜を終了します。」
と出てきて、そこで終わってしまいます。
こういうのって開発環境を変えた方が良いんでしょうか??
138デフォルトの名無しさん:2007/11/11(日) 05:05:52
コマンドプロンプトを開いて何をしたらそのエラーが出る?
コマンドプロンプトを開くだけで出るならBCCは関係ないが。
139137:2007/11/11(日) 05:36:06
>>138
レスありがとうございます。
コマンドプロンプト開くだけなら全然大丈夫なんですが
長時間(っていっても2時間とかそんなもん)プログミングしてるとよくエラーになります。
同じプログラムでもちゃんと出力できるときとそうでないときがあっていまいち原因が分からないです。
140137:2007/11/11(日) 06:21:33
ごめんなさい。自己解決できました。
141デフォルトの名無しさん:2007/11/11(日) 10:01:08
>>136
そのとーり。>>135も指摘しているが、for文の条件判断のところの意味をよく理解しておくこと。
142デフォルトの名無しさん:2007/11/11(日) 10:03:44
>>121

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

はい。純粋に周波数がf,f1,f2...の正弦波をFFTにかけています。
規格化の方も分かってます。
14386:2007/11/11(日) 11:13:09
昨日質問した者ですが、やはり足し算などをすると出力がおかしいみたいです。
このようになるのですが間違っている部分ありますか?
http://www.imgup.org/iup500370.png
宜しくお願いします。
144デフォルトの名無しさん:2007/11/11(日) 11:17:49
>>143
printf("%d\n", d); // & いらない
14586:2007/11/11(日) 11:21:45
>>144
昨日も同じレスもらってたのに気付きませんでした…。
今やったらできました。「&」でしたか…
ありがとうございました!!
146デフォルトの名無しさん:2007/11/11(日) 11:44:53
市ねよ &d
147デフォルトの名無しさん:2007/11/11(日) 11:53:20
>>135 >>141
レスありがとうございました.
forの条件判断は,反復の終了条件ではなく,継続条件なのですね.
つまり,その条件が偽になったら終了と.
つまらない質問に答えていただき,ありがとうございました.
148デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/11(日) 15:26:59
>>149
僕がやったところ、下記のような出力結果になってますよ。

Input number1 : 10
Input number2 : 20
Input number3 : 30
(10 +20 +30 +)
152デフォルトの名無しさん:2007/11/11(日) 15:27:08
>>150
printf("値: %0*d\n", FIELD, number); でいけたかと
153デフォルトの名無しさん:2007/11/11(日) 15:29:56
>>152
いけました!
ありがとうございます!!
154149:2007/11/11(日) 16:50:50
>>151
あっそうなんです
どうしても+が一つ多くなってしまうんですが
(10 +20 +30)
こういうすっきりした形にしたいんですが・・・
155デフォルトの名無しさん:2007/11/11(日) 16:53:28
for(cnt = 0 ; cnt < INPUT_CNT - 1 ; cnt++) printf("%d +",num[cnt]);
printf("%d", num[cnt]);
156デフォルトの名無しさん:2007/11/11(日) 16:53:53
for(cnt = 0 ; cnt < INPUT_CNT ; cnt++)
{
if(cnt>0){ printf(" +"); }
printf("%d",num[cnt]);
}
これでいいんじゃない
157デフォルトの名無しさん:2007/11/11(日) 17:18:52
おすすめできないが、こういう書き方も。

for(cnt = 0 ; cnt < INPUT_CNT - 1 ; cnt++)
{
printf("%d + ",num[cnt]);
}
printf("%d",num[cnt]);
158デフォルトの名無しさん:2007/11/11(日) 17:21:12
ループの中に無駄な分岐突っ込むよりは、はるかにマシだろ。
まぁ、155が見えないバカにはわからないだろうが。
159デフォルトの名無しさん:2007/11/11(日) 18:03:37
VC++2005EE の ^Z の問題は結局どうなったの?
160デフォルトの名無しさん:2007/11/11(日) 18:09:45
>>154
もっとおすすめできないが、
return文の2行上のprintf文をこうするとか。
printf("\b)");
\bってのはカーソルを1文字戻すエスケープシーケンスね。
161デフォルトの名無しさん:2007/11/11(日) 19:22:26
関数定義で
bool hoge(int array[const])
{
...
}
とやっても良いらしいのだけれど
array[const]ってどういう意味の配列になるの?
162デフォルトの名無しさん:2007/11/11(日) 19:26:19
mainから整数型の配列受け取るだけじゃね?って思ったら受け取る時は普通ポインタ使う品
163デフォルトの名無しさん:2007/11/11(日) 19:52:40
>>161
bool hoge(int * array)と全く同じ。

>>162
何故main限定?w

>>160
お勧め云々以前にダメすぎ。
164デフォルトの名無しさん:2007/11/11(日) 20:03:14
>>163
bool hoge(int * const array)
というわけでもない?
165デフォルトの名無しさん:2007/11/11(日) 20:07:38
67です
遅くなりましたが、レスさんくすです

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

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

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

どうもありがとうございました
166デフォルトの名無しさん:2007/11/11(日) 20:17:56
>>161>>163
int *const arrayと同じ。
C99から導入された書き方。
167デフォルトの名無しさん:2007/11/11(日) 20:28:30
>>166
サンクス。C99からだったか・・。
どうりでわからんわけだ。C99の資料も欲しい。
168デフォルトの名無しさん:2007/11/11(日) 20:51:19
コボルはデータを読み込んで演算させて吐き出すことが主ですがC言語はどうですか

また、実務で使われている開発環境はVC++ですか、ボーランドのやつですか
エクリプスですか
169149:2007/11/11(日) 21:53:42
「-」を入れると出来るんですね
本当にどうもありがとうございました

170デフォルトの名無しさん:2007/11/11(日) 21:54:20
一時停止させる関数とそのヘッダファイル教えてください
171デフォルトの名無しさん:2007/11/11(日) 21:59:29
何を一時停止?
172デフォルトの名無しさん:2007/11/11(日) 22:00:21
>>170
sleep()でググってみそ。
173デフォルトの名無しさん:2007/11/11(日) 22:00:35
while(){
printf("hoge");
0.5秒待つ ←これを実行するための関数とヘッダファイルです
}
174デフォルトの名無しさん:2007/11/11(日) 22:02:10
putc(' ', NULL); //stdio.h
175デフォルトの名無しさん:2007/11/11(日) 22:02:45
>>173
システムに依存する。
176デフォルトの名無しさん:2007/11/11(日) 22:04:58
>>173
windows.h
Sleep(500);
177173:2007/11/11(日) 22:06:23
ありがとうございます
178デフォルトの名無しさん:2007/11/11(日) 22:25:26
>>172
ゲイツに聞こうぜ
あんだけ話題になったんだし
http://matome.info/HatsuneMikuImageSearch/
179デフォルトの名無しさん:2007/11/11(日) 22:46:32
最近初めたばかりなんですが
int double floatについて教えてください。

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

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

お願いします
180デフォルトの名無しさん:2007/11/11(日) 22:50:35
181デフォルトの名無しさん:2007/11/11(日) 22:52:33
そこには普通floatって書いてあるけど、
実際には理由がなければdoubleを使うのが普通。
182デフォルトの名無しさん:2007/11/11(日) 22:59:55
>>179
浮動小数点なのでfloat
(↑1.1346*10^5とか)
doubleは倍精度(おもに小数部分が)なので
183デフォルトの名無しさん:2007/11/11(日) 23:05:11
stdio.cとかstring.cってどこにあるの?
*.hは/usr/includeにあるけど本体がどこにあるのかわからない。
184デフォルトの名無しさん:2007/11/11(日) 23:05:58
> 倍精度(おもに小数部分が)
185デフォルトの名無しさん:2007/11/11(日) 23:06:52
>>183
検索しても見つからなかったら、インストールされてないんじゃない?
186デフォルトの名無しさん:2007/11/11(日) 23:07:57
>>185
いやトラブルにあったとかそういうことじゃなくて
ソースを読むために居場所を知りたい。
187デフォルトの名無しさん:2007/11/11(日) 23:22:59
>>179
>int a=0.5 や int b=0.00000005 でもエラーが出ません。

エラーは出ないけど、だまって整数に切り捨てられる。
188デフォルトの名無しさん:2007/11/11(日) 23:26:29
エラー出ないのか
Cでもいつもキャストしてるから気づかなかった
189デフォルトの名無しさん:2007/11/11(日) 23:26:36
>>186
いやだから、ライブラリのソースはインストールしてないと入ってない
190デフォルトの名無しさん:2007/11/11(日) 23:26:48
>>186
標準関数のソースは、OSなりコンパイラをインストールするときに、オプションで指定しないと入らないんじゃないの?

なんでもいいから見たいってことなら、ネットで探せば出てくると思うけど。
191デフォルトの名無しさん:2007/11/11(日) 23:27:56
>>186
そんなものない。
ファイルに書き出すにしても、OSのAPI呼び出したりアセンブラで書いたりと
C言語じゃないことやってるんだから、Cのソースファイルとしては存在しない。
192デフォルトの名無しさん:2007/11/11(日) 23:32:11
>>189
>>190
そうなのか、全然知らなかった。
インストールしないといけないのか。thx!
193デフォルトの名無しさん:2007/11/11(日) 23:38:40
>>179
doubleの方がfloatより精度が高い。

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

けど、最近はSSEなどの演算命令などが出てきたため、
floatの方が速い場合もあるらしい。
194デフォルトの名無しさん:2007/11/11(日) 23:42:51
ごめん、ウソついた。
FPUは80bitだから、「CPUに…」の行は無視して。
195デフォルトの名無しさん:2007/11/11(日) 23:48:02
179ですが皆さんありがとうございました。
イメージできてきました。

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

足し算、掛け算やら計算を格納するところはdoubleにしてやるように気をつけます。
ありがとうございました
196デフォルトの名無しさん:2007/11/12(月) 00:34:47
ランダムに-1.0から1.0までのdouble値を生成するコードを考えてくれたまえ
197デフォルトの名無しさん:2007/11/12(月) 00:40:02
(double)rand() / RAND_MAX * 2 - 1
198デフォルトの名無しさん:2007/11/12(月) 00:43:52
char *ptr = "ghijkl";
が可能で

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

char *ptr;
はptrってポインタ(アドレスを入れる箱)は用意したけど、まだ中身は不定。
文字列を入れる場所が確保されてないから、コピーできない。
200デフォルトの名無しさん:2007/11/12(月) 00:47:28
そのポインタは確保された領域を指していないから
201デフォルトの名無しさん:2007/11/12(月) 00:50:22
char *ptr;
scanf("%s",ptr);
を可能にするにはmallocやnewやらで領域作らないとダメなの?

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

なんか領域が可変な1次元のcharでもあればいいのに
202デフォルトの名無しさん:2007/11/12(月) 00:52:16
>>201
標準ではないが asprintf が便利
203デフォルトの名無しさん:2007/11/12(月) 00:56:39
>>201
C言語スレだからnewは無いけどな。
char* ptr=(char*)malloc(256);
みたいにしないといけない。使い終わったらfreeもしなきゃいけない。

可変配列なんて裏でメモリの確保・開放を勝手にやるってことだからな。
高級アセンブラたるCにそんな機能は無い。必要なら自分で作るんだよ。
204デフォルトの名無しさん:2007/11/12(月) 01:05:46
C言語スレだから、C++は違うのですね。すんません。
理解できました
205デフォルトの名無しさん:2007/11/12(月) 01:12:22
配列と要素数と確保開放を一括で管理するオブジェクトでも作ればいいんじゃね?
206デフォルトの名無しさん:2007/11/12(月) 01:24:49
おぶじぇくとがよくわかってないなぁ。

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

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

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

って認識であってる?
207デフォルトの名無しさん:2007/11/12(月) 01:26:50
>>206
スレ違い。
208デフォルトの名無しさん:2007/11/12(月) 01:33:40
構造体配列struct tfield data[10]で
メンバをchar word[20] として

そのメンバとaとかbと一致するかどうかをみたいんだけど
どうすればいいですかね?
209抽象的な質問には抽象的な回答を:2007/11/12(月) 01:36:15
比較すればいいと思います。
210デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/12(月) 02:44:49
long double は %Lf
212デフォルトの名無しさん:2007/11/12(月) 02:54:39
ありがとございます。
213デフォルトの名無しさん:2007/11/12(月) 03:54:55
C言語系で就職に役に立つ資格ってありますかね?
214デフォルトの名無しさん:2007/11/12(月) 04:34:24
>>197
MT法でやってくりたまえ
215デフォルトの名無しさん:2007/11/12(月) 09:20:48
>>213
基本情報処理でいいんじゃないの?
216デフォルトの名無しさん:2007/11/12(月) 10:27:21
メモリエディタ製作しようとしているが
こんな感じでおk?

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

ある数値、文字列を探すときはstrstrで検索
217抽象的な質問には抽象的な回答を:2007/11/12(月) 10:38:56
ダメ。数値を探すのにstrstr()は使えない。
218デフォルトの名無しさん:2007/11/12(月) 12:43:52
画像の指定した範囲を切り出して出力するプログラムはどうやりますか?
219デフォルトの名無しさん:2007/11/12(月) 12:57:08
出番だぞ抽象
220デフォルトの名無しさん:2007/11/12(月) 13:07:34
pythonでやれ
221デフォルトの名無しさん:2007/11/12(月) 13:40:24
画像解読か。難しそうだな。
文字で書いてあればまだなんとかなるか。
222デフォルトの名無しさん:2007/11/12(月) 13:43:42
まず、irfan viewをDLします
ヒントはPPM

がんばれよ!
223デフォルトの名無しさん:2007/11/12(月) 13:56:06
>>218
何を切り出すの?
金型?
224デフォルトの名無しさん:2007/11/12(月) 14:40:09
phpでも使っとけ。
225デフォルトの名無しさん:2007/11/12(月) 15:38:25
WAVEファイルを読み込む

テキストデータに変換

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

終了

こんな感じで求めればドレミファソラシドって変化していくWAVEファイルのピッチを追えると思ってるんだが
どう?
226デフォルトの名無しさん:2007/11/12(月) 18:00:23
size_tとかFILEみたいになんか知ってるとそれなりに
それなりのC言語の使い手に一見見える型とか構造体ってありますか?
227デフォルトの名無しさん:2007/11/12(月) 18:04:06
FILEは違うだろ・・・
228デフォルトの名無しさん:2007/11/12(月) 18:04:54
void*
229デフォルトの名無しさん:2007/11/12(月) 18:13:43
LPCWSTR
230デフォルトの名無しさん:2007/11/12(月) 18:14:52
char const* const p;
231デフォルトの名無しさん:2007/11/12(月) 18:16:46
strct hoge{
・・・
・・・
char ar[1]; //[0]じゃなくあえて[1]で。
};
232デフォルトの名無しさん:2007/11/12(月) 18:18:50
int main(argc, argv)
int argc;
char **argv;
{
return 0;
}
233デフォルトの名無しさん:2007/11/12(月) 18:20:30
#define begin {
#define end ;}
234デフォルトの名無しさん:2007/11/12(月) 18:25:55
size_t
ptrdiff_t
intptr_t
uintptr_t
235デフォルトの名無しさん:2007/11/12(月) 18:49:39
うわぁ予想外にいっぱいあるんですね。
>>231
[0]じゃなくてあえて[1]で。ってどういうことなんですか
すごく興味があります。
236デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/12(月) 19:25:30
>>236
それってsizeは関数に渡るのか?
238デフォルトの名無しさん:2007/11/12(月) 19:26:24
きっと #define size 10 に違いない
239デフォルトの名無しさん:2007/11/12(月) 19:30:53
>>235
昔は [0] が認められてなかった。
そのころからの古参ベテランだぞというアピール。
240デフォルトの名無しさん:2007/11/12(月) 19:32:21
sizeは#define sizeですが
関数に渡してもどっちでもいい状態であります。

どうしても構造体に3つのintが入ることになってしまって…
testで作っていたソースはvalue1個だけとかでやってていけて
いざ3つにしたら ぅわぁぁあぁ…という状況に…
241デフォルトの名無しさん:2007/11/12(月) 19:35:23
>>236
e add(e a, e b);
e sub(e a, e b);
のような関数を作ればおk
242デフォルトの名無しさん:2007/11/12(月) 19:38:09
>>236
i のループで、output1,output2が壊れてない?
output1, output2には、i = size - 1 のときの値しかassignされないように見える。
243デフォルトの名無しさん:2007/11/12(月) 19:39:35
>>236
配列の範囲外にアクセスしてるみたいだが、それはいいのかな?
244デフォルトの名無しさん:2007/11/12(月) 19:40:01
int add(int a, int b){
return a+b; }
245デフォルトの名無しさん:2007/11/12(月) 19:45:37
Cだし、マクロをうまく使えばどう?
#define SUM(x, m) x[j].m + x[j+1].m
みたいに。
246デフォルトの名無しさん:2007/11/12(月) 19:46:11
>>242-243
元のソースを少し変えてi jの2重ループだけにしてるので、ちょっとおかしいところ出てますが
そこは気にしないでください。

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

マクロでやれるかとも思ったのですが、ヘッダがものすごいことになりそうで。。
247デフォルトの名無しさん:2007/11/12(月) 20:03:34
DEFINEって定数じゃなく式をも使えたのか!超勉強になるこのスレ!
248デフォルトの名無しさん:2007/11/12(月) 20:35:49
>>247
そんなあなたにこのマクロをどうぞ

#include<stdio.h>
int main(void){
printf("File:%s Line:%d\n", __FILE__, __LINE__);
return 0;
}
249デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/13(火) 01:28:29
スカラってなんですか?
253デフォルトの名無しさん:2007/11/13(火) 02:01:40
>>251
代入文が逆ではないか?
× a[i][j]=b[k][l];
○ b[k][l]=a[i][j];
254デフォルトの名無しさん:2007/11/13(火) 02:46:03
>>252
ベクトルじゃないやつ。
255デフォルトの名無しさん:2007/11/13(火) 03:09:09
>>252
スカラーのことだろ?よく文字を見ればわかる。
ラーがついているということは、もともとスカルという意味で、
つまりはスカル人=スカラーだ。わかったか!?

あとは、マカセタ。
256デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/13(火) 08:15:45
>>253
いろいろやってるうちにそうなってました。
ありがとうございます
258デフォルトの名無しさん:2007/11/13(火) 09:33:13
>>256
cygwinはsys/socket.hじゃなくてcygwin/socket.hとかにあるんじゃなかったかな。
こういう質問はC言語のスレじゃなくてcygwinスレとかの方が答えてくれると思う。
259デフォルトの名無しさん:2007/11/13(火) 14:34:44
*a はポインタって当然分かるが、
今読んでるソースに**aみたいなのが、無数に出てきて、これが分からない
260デフォルトの名無しさん:2007/11/13(火) 14:36:08
>>259
ポインタの位置を指すポインタ。
261デフォルトの名無しさん:2007/11/13(火) 14:48:04
>>260
俺はアホだからよく分からない…

ぬこにも分かるようにお願いします><
262デフォルトの名無しさん:2007/11/13(火) 14:51:47
>>261

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

int** -> int* (int** は int*(の場所)を指す)
263デフォルトの名無しさん:2007/11/13(火) 17:24:52
int *p; → *p が int型
int **p; → **p が int型
264デフォルトの名無しさん:2007/11/13(火) 17:29:09
int* p; って書く奴アホだよな。
わざわざ判りにくくしてやがんのな。
265デフォルトの名無しさん:2007/11/13(火) 17:31:37
int* *p
266sage:2007/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デフォルトの名無しさん:2007/11/13(火) 17:45:44
>>258
ありがとうございました、そちらのほうにいってみます
268デフォルトの名無しさん:2007/11/13(火) 18:31:36
>>266
引数がunsigned short *Buffだとわかっているので、
*(Buff+1) += 0x12345678;
もunsigned shortで行われる。
(正しくはintに拡張されて計算されてshortに丸められる)

その結果がshortに収まらなくてオーバーフローしても、
他の領域には影響は及ぼさないよ。
269デフォルトの名無しさん:2007/11/13(火) 18:43:07
ちなみに、usWork[1]の値は、0x5678になる。
270デフォルトの名無しさん:2007/11/13(火) 19:17:00
なんか
ポインタじゃなくて配列の代わりみたいなもん、って教え方した方が
俺の場合はすっきりした><

でもポインタなんだよね。
ポインタなんて死ねばいいのに
271デフォルトの名無しさん:2007/11/13(火) 19:38:38
むしろポインタ以外は死んで欲しい。
全部ポインタでメモリ確保しなきゃ使えないようにすれば混乱しなくていいのに。
272デフォルトの名無しさん:2007/11/13(火) 19:43:13
関数の引数はx[]と書いても*xと書いても意味は同じだからね。
文字列(char*)の配列なんかだと、char *argv[]やchar **argvになってしまう。

[]付きのほうが理解しやすいよね。
273デフォルトの名無しさん:2007/11/13(火) 20:30:05
すいません。

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

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

ちなみに、Cを始めて3ヶ月です。
274デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/13(火) 21:41:15
>>275
>fseekで
そのデータじゃ無理
277デフォルトの名無しさん:2007/11/13(火) 21:41:59
嘘を教えるなよ
278デフォルトの名無しさん:2007/11/13(火) 21:45:31
文字列がどう入ってるかによるんじゃね?
279デフォルトの名無しさん:2007/11/13(火) 21:45:41
>>275
fseekはバイト単位で進んだり戻ったりする。データがテキストなら改行で数えたほうがラク。
280デフォルトの名無しさん:2007/11/13(火) 21:48:01
>>279
改行で数える、というのは具体的にはどうやればいいんでしょうか
281デフォルトの名無しさん:2007/11/13(火) 21:50:00
前に戻らないんなら、fgetsで読み捨てればいいんじゃないか。
282デフォルトの名無しさん:2007/11/13(火) 22:00:06
fgetsだと、文字列や数値を変数にもっていくのがよくわからなく
fseekで移動しfscanfで読み込むという作業をしようとしていました。

283デフォルトの名無しさん:2007/11/13(火) 22:01:07
>>282
sscanfでいいじゃね?
284デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/13(火) 22:08:09
毎行fscanfしなくても、n行読み飛ばすなら、
for(i=0;i<n;i++)fgets(buff,buff_size,fp);
でいいんじゃないかってこと。
286デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/13(火) 22:11:06

上の条件やプログラムを参考にして
「SW1がONの時モータが右回転、
SW2がONの時モータが左回転、
SW3,4がONの時モータを止める、
光SWを暗くするとプログラム終了。」
というプログラムを教えて欲しいです。
他に何か必要な条件などがあったら教えてください。
288デフォルトの名無しさん:2007/11/13(火) 22:11:59
連投失礼しました
289デフォルトの名無しさん:2007/11/13(火) 22:15:41
SW1とSW2がONになったらどうするんだ?
SW1とSW3がONになったらどうするんだ?
290デフォルトの名無しさん:2007/11/13(火) 22:17:01
for文で待つとかwww
291デフォルトの名無しさん:2007/11/13(火) 22:19:11
0 = ON、1 = OFFが気になって夜も眠れない。
292デフォルトの名無しさん:2007/11/13(火) 22:33:05
>>291
モーターならドライバにFETとかが入るので、負論理は普通にありえる。

>>287
電気・電子板がいいとおもうぞ。
http://science6.2ch.net/denki/
293デフォルトの名無しさん:2007/11/13(火) 22:36:14
あ、スイッチもか。
スイッチならプルアップして、押下時に接地で負論理ってのは多いな。
294デフォルトの名無しさん:2007/11/13(火) 22:47:50
SWが2つ以上ONにして動作するのはSW3,4のみにしてそれ以外は動作しないものとします
295デフォルトの名無しさん:2007/11/13(火) 23:00:42
http://mbga.jp/AFmbb.S6kw4dbb1f/
モバゲーやっちゃお
ケータイでね
296デフォルトの名無しさん:2007/11/13(火) 23:05:15
>>294
>>284を見る限りビットで制御するようだが、outport()とinport()の引数は整数なのか?
297デフォルトの名無しさん:2007/11/13(火) 23:15:43
整数です
298デフォルトの名無しさん:2007/11/13(火) 23:18:03
readとfreadやっぱりreadの方が早いんですか?
おしえてえろい人
299デフォルトの名無しさん:2007/11/13(火) 23:26:45
>>297
outport()の第2引数はなんなの?
SW3とSW4が押されたとき、inport()でどうやって受け取るの?inport()を2回呼ぶの?
つーかそもそもinport()は実行すると入力があるまで待つの?
ハードの仕様も分からんし、不明な点が多すぎるよ。
300デフォルトの名無しさん:2007/11/13(火) 23:27:47
>>298
readって何?
301デフォルトの名無しさん:2007/11/13(火) 23:38:46
>>298
気にするな。お前が使えば、どっちでもそう変わりはしない。
302デフォルトの名無しさん:2007/11/14(水) 00:05:03
readvのほうがもっとはやい。
mmapならさらにはやいかもしれない。
303デフォルトの名無しさん:2007/11/14(水) 01:17:22
シスコと標準ファンクシャンヌの区別くらいできろよ。
304デフォルトの名無しさん:2007/11/14(水) 19:57:03
ユーザーに5桁の整数を入力してもらい、除算演算子と剰余演算子を使用して
それが回文かどうか判定するにはどうすればいいですか。
305デフォルトの名無しさん:2007/11/14(水) 19:58:45
配列に文字列で取得させて、
んで5ケタなら[0]と[4] [2]と[3]を比べてどっちも一致なら回文。
306デフォルトの名無しさん:2007/11/14(水) 19:59:32
C言語の自主勉強の仕方教えてください!
今は一応入門の本を買って手取り足とりでプログラムを組んでる最中です
307デフォルトの名無しさん:2007/11/14(水) 19:59:59
それを続ければいいじゃないの。
308デフォルトの名無しさん:2007/11/14(水) 20:01:54
>>306
基礎を学んだら適当に自分でソースかいて実際コンパイルの繰り返し。
ボーリングのスコア計算とか組めるようになってようやく超初心者卒業じゃないかな。
309デフォルトの名無しさん:2007/11/14(水) 20:06:51
>>306
独習Cだな。
あれを眠くならずに飽きもせずに最後まで練習問題こなせたら構文は卒業だよ。

とネタはさておき、何のためにCを勉強するかじゃないのか?
学校とか情報処理試験のためならそのレベルで十分だし、
何か作りたいソフトがあるなら、調べながらでも実際に作ってみればいい。
Cに限らずアルゴリズムやAPI、通信手順など学ぶものはいくつも出てくるから。
310デフォルトの名無しさん:2007/11/14(水) 20:08:31
そうですか〜
今一応簡単なのをしてるんですが楽しいです、本のまねをしてるだけですが
最初は仕組みを重点的に勉強した方がいいですか!?
311デフォルトの名無しさん:2007/11/14(水) 20:13:56
例えば
int main(void)
から始まるけど、このvoidってなんだい?とか説明できるようになるともっと面白くなるよ。
構造も大事だけど意味も知ったほうがなおよし
312デフォルトの名無しさん:2007/11/14(水) 21:06:21
>>310
ポインタと構造体の使いかたは理解しといたほうがいいと思うな
ソースが汚い人は大抵、構造体の使いかたが下手だよ

Cの本はあとあと読まないものが多いから、市立図書館を活用するのが一番のコツだと思う
313デフォルトの名無しさん:2007/11/14(水) 21:15:12
市立限定かよw
314デフォルトの名無しさん:2007/11/14(水) 21:17:39
区立図書館はダメですか?
315デフォルトの名無しさん:2007/11/14(水) 21:17:54
村のオラはどうしたら><
316312:2007/11/14(水) 21:18:45
ごめん、なんでもいいよorz
317デフォルトの名無しさん:2007/11/14(水) 21:23:43
文系が得意な僕はプログラム系の仕事は向いていませんか?
ちなみにパソコンを触ることは大好きです
318デフォルトの名無しさん:2007/11/14(水) 21:28:59
プログラミングに理系の素養は多少はあった方がいいが、
クライアントとの意思疎通やドキュメントの作成など、
文系の方が有利といえる内容も多いので、
理系だ文系だというのは関係ない。

胸を張って「俺は体育会系だ」と言ってやれ。
319デフォルトの名無しさん:2007/11/14(水) 21:36:49
文系理系でどうこう言うやつって、血液型で性格をどうこう言うやつと同レベルだろ。
320デフォルトの名無しさん:2007/11/14(水) 21:56:04
整数の各桁の値を、配列もポインタも使わずに、
また文字(列)としても扱わずに、四則演算だけで求める方法を
教えてください。

たとえば、123234と入力されたら、
num1 == 1;
num2 == 2;
num3 == 3;
num4 == 2;
num5 == 3;
num6 == 4
という風に取得したいのです。
321デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/14(水) 22:24:20
あ、%は使ってもいいです。
むしろ%と/を使って取得する方法が知りたいのです。
323デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/14(水) 22:33:53
>>323
ありがとうございます
325デフォルトの名無しさん:2007/11/14(水) 23:04:57
ソースを読んでC言語を勉強したいのですが、お勧めのソースはありますでしょうか。
326デフォルトの名無しさん:2007/11/14(水) 23:10:47
ない
327デフォルトの名無しさん:2007/11/14(水) 23:40:27
>>319
世の中大概のことは非線形で
理系はそのことを理解していてなおかつ計算を楽にするために線形で近似する。
もちろん近似だからそれに限界があるのも知っている。
だが文系は最初から線形だ。
所詮は近似でしかない計算をバカはどこまでも頼みにしてバカでない者は経験で適当に我流の修正を加えていく。
計算が不完全なのを知っていて理論を新しく作ることも出来ないから理論を講じること自体を頭から否定して自分の経験に依存する。
物事のとらえかたに根本的な差があるのさ。
328デフォルトの名無しさん:2007/11/14(水) 23:58:06
329デフォルトの名無しさん:2007/11/15(木) 00:00:53
anderson.c がお薦め。
330デフォルトの名無しさん:2007/11/15(木) 11:43:39
聞きます!

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

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

「>>」 と 「<<」でずらすのが一番処理が早いでしょうか?
331デフォルトの名無しさん:2007/11/15(木) 11:45:56
まあ普通はシフトするかな。
ビットフィールド使うこともあるけど。
332デフォルトの名無しさん:2007/11/15(木) 11:46:42
A = (B >> n) & 1
333デフォルトの名無しさん:2007/11/15(木) 11:47:51
bitset <100> B;

A = B[52];
334デフォルトの名無しさん:2007/11/15(木) 13:12:16
ありがとうございます!
&演算子ありましたね。スマートです。
bitset勉強が必要です。精進します。どもども。
335デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/15(木) 13:47:26
きめえ! わざわざ自動varにコピーすんなボケ。
338デフォルトの名無しさん:2007/11/15(木) 13:51:34
コピーってどこの事ですか?
339デフォルトの名無しさん:2007/11/15(木) 13:52:35
自動var?
340デフォルトの名無しさん:2007/11/15(木) 14:01:32
ワロタ
341デフォルトの名無しさん:2007/11/15(木) 14:06:46
ちょっとクールにきめてみたぜ
ナウい略語を使ってるオレかっこよすぎだぜ

という心の声が
342デフォルトの名無しさん:2007/11/15(木) 14:08:17
自動var……
auto variableのことか?
343デフォルトの名無しさん:2007/11/15(木) 14:11:20
>char str[]="Hello !! I am Computer.";
 
たぶんこれのことだろうか?
344デフォルトの名無しさん:2007/11/15(木) 14:36:00
char* str="Hello !! I am Computer.";
こうしろって事かな?
345デフォルトの名無しさん:2007/11/15(木) 14:41:25
C言語ってどう勉強したらいい?
346デフォルトの名無しさん:2007/11/15(木) 14:55:17
C言語っていつ勉強したらいい?
347デフォルトの名無しさん:2007/11/15(木) 15:02:51
>>345
WisdomSoftのページの内容を全部解るくらいなら
あとはポインタ関連。それとANSIの関数(よく使うやつを主に)
を覚えておいた方が楽。
ついでに、基本的なアルゴリズムとデータ構造。
まぁ、気楽にね〜
348デフォルトの名無しさん:2007/11/15(木) 15:46:37
自分で欲しいと思うものがあるなら、それを作ってみるのがいい。
オレは昔友達とチャットがしたくて、コマンドラインベースのチャットソフトを作ったのが初めてのC。
必要にせまられて取り組むのとなんとなくでは、やる気も吸収スピードもまるで違うからね。
ソースはLinuxならSRPMとか、GNUライブラリあたりで大量に読める。
WindowsベースはほとんどC++かVBかDelphiだから、最近のはあまり役に立たないかもな。
WinAPIなんかdefineしまくってて、一見Cと思えないようなことしてるし。
349デフォルトの名無しさん:2007/11/15(木) 16:20:52
作るのが比較的簡単で使って便利なものは今は大概フリーソフトやオープンソースになってるからね
必要に迫られること自体あんまりなさそう
350デフォルトの名無しさん:2007/11/15(木) 16:30:18
>>349
そういうフリーソフトの「ここがこうだったらなぁ」を実現する為に作る時はあるよ。
351デフォルトの名無しさん:2007/11/15(木) 16:36:41
>>350
実は既に実装済みで単にオプションの設定を知らないだけだった

ということがままあるわけで
352デフォルトの名無しさん:2007/11/15(木) 16:38:32
既に存在するなら、それのマネでいいと思うよ。なにしろ興味を引く題材であることが大事。
よく本に載ってるアドレス帳みたいなの作れと言われても、いらねーと思ったらやる気起きないし。
趣味の範囲で取り組むならそれが一番。仕事だとそうもいかないけどね。
ただしコピペは厳禁な。全く身に付かないから時間の無駄。
353デフォルトの名無しさん:2007/11/15(木) 16:48:17
>>352
そうやって必死に身に着けた知識が
既成の優れたライブラリの前では何の役にも立たないと知ったときに
努力は無駄ではなかったと必死に自分に言い訳するのさ

努力が無駄ではなかったと言えるのは結果を出した者だけだ
354デフォルトの名無しさん:2007/11/15(木) 16:51:20
コピペはマジで何も身に付かんね〜
猫でものホームページ見ながらSDK勉強しようとして
サンプルソースそのまま打ち込んだは良いが
何がどうなってるのかわけわからないままでいたもんだ
やっぱ初心者はウザイほどコメント付けるクセ
つけないと身に付かんね
355デフォルトの名無しさん:2007/11/15(木) 16:52:50
>>353
キミは目的を勘違いしてないか?世界一優れたライブラリを作るのが目的なの?
356デフォルトの名無しさん:2007/11/15(木) 16:54:56
>>351
いいんじゃねーの?
フルスクラッチできたら独自拡張できるんだし。
357デフォルトの名無しさん:2007/11/15(木) 16:55:23
ああ修正しながら使うのはむしろいいことかもな
この処理どうなってんだろーとかへーこうやるんだー
ってちらっとでも見て感心することも大事
358デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/15(木) 17:04:03
あとはアレだ、しょーもない単一機能のテストプログラムでもちゃんとコメント付けること。
そしてそのソースは消さずにきちんとメンテすること。自作のソースが溜まっていくと、後で必ず役に立つ。
360デフォルトの名無しさん:2007/11/15(木) 17:09:11
そうやってゴミに埋もれて生きてゆくのね…
361デフォルトの名無しさん:2007/11/15(木) 17:18:12
STLが標準じゃなかった頃、
C++始めたら自作の文字列クラスを作るのが通過儀礼だったな。

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

さらにアルゴリズムの本や他人のソースを見て、
思いもよらなかった方法を発見して試して、
自分の作ったものの完成度が高まるのは純粋に楽しいし、
そういう試行錯誤した経験は無駄にはならないよ。
362デフォルトの名無しさん:2007/11/15(木) 17:21:32
他の言語のあの関数使えたらな〜で似たものを作るとか
363デフォルトの名無しさん:2007/11/15(木) 17:34:26
>>362
最近は、Cの時はついついbits/stl_algo.hを見て書いてしまうw
364デフォルトの名無しさん:2007/11/15(木) 18:18:27
無駄にはならないと言うのは
若者に時間を無駄にさせて自分たちが追い越されまいとする年寄りの方便

で何かマシなことやろうとすると結局プラットフォームに依存してるんだよね
365デフォルトの名無しさん:2007/11/15(木) 18:29:51
>>364
無駄にならない方法をぜひ教えてくれ。
366デフォルトの名無しさん:2007/11/15(木) 18:31:23
>>365
2ch に充てる時間を半分にする
367364:2007/11/15(木) 18:35:18
>>365
>>364>>361に対する皮肉のつもりなんだが
368デフォルトの名無しさん:2007/11/15(木) 18:36:04
一応C言語を勉強していますが
いまいち理解できません
最初はこんなもんですか・・?
369デフォルトの名無しさん:2007/11/15(木) 18:38:07
>>366
時間のハンドリングの話じゃねーだろ。
なにを勉強すべきなんだって?

そもそも空いた時間で「再開発」やるって話じゃないのかね。
そんでそれは有用だよ、という。
370デフォルトの名無しさん:2007/11/15(木) 18:39:09
>>364

>>361にとっていい経験だ、て話で誰も「お前らもやるべき」なんて言ってないと思うけど。
371364:2007/11/15(木) 18:46:07
>>370
その解釈は誤り。
>>361の最後の文章は個人の経験の記述のように見せかけて最後の行で一般論に帰結させてる。
事実と意見を混同させる初歩的な手だ。
372デフォルトの名無しさん:2007/11/15(木) 18:51:11
>>368
いきなりスイスイ進めねーよ
よほどの天才でもなけりゃあさ
つうかさ、一応ってなに?普段は他の言語やってんの?
独り言じゃないならこっちが答えやすいように質問してよ
373デフォルトの名無しさん:2007/11/15(木) 18:55:21
「いちよう」とか言わないだけマシだと思え。
374デフォルトの名無しさん:2007/11/15(木) 19:00:01
だから無駄にならない学習方法を教えてくれよ。
有用なライブラリは何も考えずに利用すべきであって、中身を知ろうとはするなってことか?
きっとその人は一生理解出来ないだけだと思うが。
375デフォルトの名無しさん:2007/11/15(木) 19:13:23
ごめん俺エスパーじゃないから答えらんない
376デフォルトの名無しさん:2007/11/15(木) 19:14:04
自分のしたい事してれば良いじゃない
学習するって事に拘るなよ
377デフォルトの名無しさん:2007/11/15(木) 20:22:46
一応というかなんというか、
一日8時間みっちり学べば遅かれ早かれCの基礎はマスターできるんじゃないかね。
378デフォルトの名無しさん:2007/11/15(木) 20:35:36
>>374
何が無駄で何が無駄でないかは
その無駄かも知れない何かを学び
発展途上の途中で無駄だったな
と無駄に無駄と言ってしまっても
その先で無駄ではないと思った
時点で無駄も無駄では無かった
と学ぶことでしょう。
379デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/15(木) 20:59:19
配列に入れておけばいいんじゃないか?
for(i=0;c=str[i];i++)key( keycode[c-'a'] );
381デフォルトの名無しさん:2007/11/15(木) 23:18:31
ソートがわかるようでわからん・・・
配列に適当に数字おいて、一時的に保管しておく変数用意して、
ループの入れ子ループでカウントアップしつつ、
比較Aと比較Bで片方補完変数にいれてループ抜けて、
親ループでカウントアップさせて・・・ってやるんだけど、結果一番でかいのだけ連続して出力される('A`
382デフォルトの名無しさん:2007/11/15(木) 23:19:34
ソースうp
383デフォルトの名無しさん:2007/11/16(金) 00:03:35
ダメだ。アスタリスクを見るとポインタに見えてfor無限ループ(;;)を見ると顔文字に見えてしまったり
俺の頭はどうにかしてしまったのだろうか
384デフォルトの名無しさん:2007/11/16(金) 00:05:00
->も然り
385デフォルトの名無しさん:2007/11/16(金) 00:08:42
頼むから俺に聞くとき、変数 i を使わないでくれ
印刷したソース逆から見る俺の身にもなってくれ
なんでここで否定してんだって何度も思うじゃねえか
386デフォルトの名無しさん:2007/11/16(金) 00:12:28
プログラムの仕事につくには英語を最低限身につけないといけないんですか?
387デフォルトの名無しさん:2007/11/16(金) 00:15:37
>>386
最低限、英語で書かれた技術文書は、読める必要が必ずでてくる。
ただ、技術文書は平易な英語で書かれているから、すぐなれると
思うよ。

出世して、英語の契約書読む羽目になるとまた別だが。
388デフォルトの名無しさん:2007/11/16(金) 00:19:20
完全に読めなくても、だいたいの意味はわからないか?
見たこと無い単語が出てきたら辞書引く程度で間に合うよ。
389デフォルトの名無しさん:2007/11/16(金) 00:31:24
ときどき
printf("")のprintf文をいれなかったらセグメンテーションエラーでて
printf文をいれたらセグメンテーションエラー消えることがあるんですけど
これはどういうことなんでしょうか?
390デフォルトの名無しさん:2007/11/16(金) 00:34:50
バグです(多分バッファオーバフローの)
391デフォルトの名無しさん:2007/11/16(金) 00:47:38
>>381
ソートもアルゴリズムの分野だけど
理解できないんなら
有名どころのソート(6個くらい)
丸覚えしとけば良いじゃん。

まぁ、バブルソートぐらいは理解しといた
ほうが良いとは思うけど。
392392:2007/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デフォルトの名無しさん:2007/11/16(金) 00:55:20
>>392
time という変数名がマズイ
time が実数型であるにもかかわらず %d で出力している
typo がある
の全てが原因でしょう
394デフォルトの名無しさん:2007/11/16(金) 00:58:52
clock()が返すのはclock_tだが、startとendの型は?
395392:2007/11/16(金) 01:04:08
>>393
timeという変数について調べてみます。
%fでしたね@@;
ありがとうございました!!

>>394
clock_tで宣言しています。
回答ありがとうございます!
396デフォルトの名無しさん:2007/11/16(金) 01:18:02
しかし深夜にならないとプログラム作る気おきないのはなぜなんだろう
397デフォルトの名無しさん:2007/11/16(金) 07:14:36
あるある
398デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/16(金) 16:51:47
>>398
「有効桁数」でググってきな
400デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/16(金) 17:14:01
>>400 は83桁じゃなくて82桁だった
402デフォルトの名無しさん:2007/11/16(金) 19:18:42
質問:C言語の「volatile」の名前の由来について

質問です。
C言語には「volatile」という記号が あります。
これを記入すると、該当部分でのコンパイル時の最適化を抑制できます。
しかし、なぜ volatile(移り気な、気まぐれな)なのでしょうか。
最適化を抑制しているのですから、むしろ「変化しない」という意味に なるはずです。
つまり、volatile では なく、「un-volatile(不揮発の、変化しない)」になるべきでは ないでしょうか。
教えてください。よろしくお願い致します。
403デフォルトの名無しさん:2007/11/16(金) 19:29:20
volatile 変数は移り気で勝手に変化するから、最適化せずに毎回ちゃんとメモリを読みにいかないと正しい結果を得られない、と考えてはいかが
404デフォルトの名無しさん:2007/11/16(金) 19:31:36
快活に計算動作するから
最適化などで省略して定数になったり計算無効になったりしたらこちらは変化無い
405デフォルトの名無しさん:2007/11/16(金) 20:57:33
最初に名前を入力させ、5件分の入力が行われるか、endと入力されたら、その分だけ出力させる
ただし名前入力の最初にendが入力された場合は、その旨のメッセージを出力して再入力させてください
名前は最大15文字入力とする

これのやり方を教えてください
406デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/16(金) 21:13:04
>>402
どっかで勝手に値が変えられる可能性があるから volatile だな。
408デフォルトの名無しさん:2007/11/16(金) 21:56:34
>>406
ひーぷに余裕があるからじゃね?
409デフォルトの名無しさん:2007/11/16(金) 22:10:54
410デフォルトの名無しさん:2007/11/16(金) 22:12:14
>>406
>オーバーフローが起き、強制終了しますよね? 

そうとは限らない
他のところで使ってるメモリ領域を黙って書き換えるだけの場合もある
411デフォルトの名無しさん:2007/11/16(金) 22:16:27
>>409
あっすいませんでした
412デフォルトの名無しさん:2007/11/16(金) 22:17:24
>>408
あ、そういうことか!!
どうもありがとうございました
413デフォルトの名無しさん:2007/11/16(金) 22:37:56
>>402
「最適化しないだって?」
「ああ、今日はそんな気分なんだ」
「まったく気まぐれな奴だよ」
414デフォルトの名無しさん:2007/11/16(金) 22:52:46
>>402
#define donotoptimize volatile
415デフォルトの名無しさん:2007/11/16(金) 22:56:56
違うとおもいますよ。
綿密な計画と設計思想に基づいてボラタイルに したんです。
気まぐれで ボラッたわけでは ありません。
416デフォルトの名無しさん:2007/11/16(金) 23:23:58
なぜmainはmainという名前にしたんだろう、startの方がよくない?と思ったことはあります
417デフォルトの名無しさん:2007/11/16(金) 23:25:04
だったらstopも要ると思わないか
418デフォルトの名無しさん:2007/11/16(金) 23:36:50
多分main,subで分けて書いたからじゃないかな。
419デフォルトの名無しさん:2007/11/16(金) 23:46:05
>>417
関数の名前にしちゃうとその辺の理屈あわせが難しくなるよね
>>418
ああなるほど

関係ないけどmain"メソッド"には今でも違和感がある…
420デフォルトの名無しさん:2007/11/17(土) 01:36:08
mainメソッド……てJAVA?
421デフォルトの名無しさん:2007/11/17(土) 02:07:26
Cから始めた自分には違和感なかったけど、よくよく考えたら不思議な名前のメソッドだな。
422デフォルトの名無しさん:2007/11/17(土) 02:17:27
mainと言いつつ、主要な処理は他のところでやってるしね。
423デフォルトの名無しさん:2007/11/17(土) 02:22:01
主要な流れ、ということじゃないか?
主要な処理を他でやっていても、
全体通してのメインの流れを定めるのがmain関数

int main(){
first_step();
second_step();
third_step();
return 0;
}
424デフォルトの名無しさん:2007/11/17(土) 03:51:36
構造体のメンバの数って制限あるのですか?
425デフォルトの名無しさん:2007/11/17(土) 09:08:36
そりゃあるだろうが、限界まで使ったこと無いな。
426デフォルトの名無しさん:2007/11/17(土) 09:18:17
ハード側の限界にぶつかったことならあるが、規格の限界は知らないな
427デフォルトの名無しさん:2007/11/17(土) 19:17:14
MFCって何?
428デフォルトの名無しさん:2007/11/17(土) 20:24:04
>>427
ググれ
429デフォルトの名無しさん:2007/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デフォルトの名無しさん:2007/11/17(土) 22:36:57
オイラだったら perl でやる。rubyも好いらしい。
431デフォルトの名無しさん:2007/11/17(土) 22:42:25
字句解析はCよりPerlを勉強した方がはるかに楽だよ
432デフォルトの名無しさん:2007/11/17(土) 23:01:25
>402

volatileは「最適化抑制」という意味じゃない。
「値が外的要因(ハードウェアなど)によって変化しうる」という意味。
433デフォルトの名無しさん:2007/11/17(土) 23:05:27
>429

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

Cでやるしかない、という場合だったら、methodなどのキーワードの後の"...;"の中を一々抽出するしかないな。
434デフォルトの名無しさん:2007/11/17(土) 23:08:04
>>429
どっかから正規表現のライブラリ持ってくるのが楽じゃない?
435デフォルトの名無しさん:2007/11/17(土) 23:11:01
HTMLのライブラリだって、探せばありそう。
436デフォルトの名無しさん:2007/11/17(土) 23:19:45
>>435
たとえばWindowsならMSHTMLとかだな。
437デフォルトの名無しさん:2007/11/17(土) 23:34:44
レスありがとうございます。
まずはCだけで頑張ってみます。
438デフォルトの名無しさん:2007/11/18(日) 00:04:55
>>と>=で処理する式が違うんですけど、
プログラムを作るとき、どう区別すべきですか?
439デフォルトの名無しさん:2007/11/18(日) 00:08:11
違うってわかってるんなら、区別できてるってことじゃないか
440デフォルトの名無しさん:2007/11/18(日) 00:20:31
for(;i<10;)

for(;i<=9;)
の違いがわからんってこと?
441デフォルトの名無しさん:2007/11/18(日) 00:23:01
>>は非常に左が大きいだけど
>=は以上ってことだし。
442デフォルトの名無しさん:2007/11/18(日) 00:29:57
if(A>>B)    C=A
elseif(B>>A)   C=B
elseif(A>=B) C=A+1;
elseif(B>=A) C=B+1;

の条件分岐を作りたいんだけど
区別どうすればいいのかってね。


443デフォルトの名無しさん:2007/11/18(日) 00:33:32
>if(A>>B) C=A
 
AがBより非常に大きいってことを言いたいのなら、
コンピュータは 「非常に」 なんて曖昧な条件は理解できないので、
どのくらいかを具体的に指示してやらないとだめ。

if (A >= B + 1000) C = A;
とか
if (A >= B * 10000) C = A;
とか。
444デフォルトの名無しさん:2007/11/18(日) 00:34:25
>>>は非常に左が大きいだけど
C言語でそんな比較演算子は無い
単なる大小比較( > )にし問題を書き換えなさい
445デフォルトの名無しさん:2007/11/18(日) 00:59:48
きっとビットシフトだ
446デフォルトの名無しさん:2007/11/18(日) 07:12:45
良くも悪くもコンピュータは正直だから、命令されたことしかやらない。
「〜よりは大きいが常識の範囲内で」とか言われても判断できるわけがない。
447デフォルトの名無しさん:2007/11/18(日) 07:37:40
おれもビットシフトだと思って、何のことだか全然わからんかった。
「非常に左が大きい」て何だよw
448デフォルトの名無しさん:2007/11/18(日) 07:38:50
以前にも同じような質問してきた奴が居たから俺はわかった
449デフォルトの名無しさん:2007/11/18(日) 08:23:39
unsigned A; の下位 B ビット以外が0であることを
判別する関数をつくりなさい。(10点)
450デフォルトの名無しさん:2007/11/18(日) 08:30:08
int f(unsigned A, int B) { return !(A >> B); }
451デフォルトの名無しさん:2007/11/18(日) 08:38:36
bool func(unsigned A, unsigned B) {return A >= (1 << B);}
452デフォルトの名無しさん:2007/11/18(日) 08:44:45
後出しなのに・・・
453デフォルトの名無しさん:2007/11/18(日) 09:15:50
すみません、まだC初めて一週間足らずの初心者ですが質問させてください。

課題で
void printIPAddress( unsigned int address )
{
printf("%d.%d.%d.%d",
(address & 『 @ 』 ) >> 24,
(address & 『 A 』 ) >> 16,
(address & 『 B 』 ) >> 8,
(address & 『 C 』 ));
}
ア.0x000000ff イ.0x0000ff00 ウ.0x00ff0000 エ.0xff000000

とありまして、@〜Cにア〜エから適切なものを選択して関数を完成させるというものです。
ネットなどで色々検索して、答はたぶん@:エ A:ウ B:イ C:アじゃないかと思ってるのですが
どうしてそれが正解?なのかがわかりません。(そもそも正解かどうかすらわかりません)

考え方としては例えば@:エなら0xff000000は11111111 00000000 00000000 00000000で
>>24というのが右に24bit(3byte)移動するという意味なんだろうか?と思ってるんですが
3byte移動したら11111111が一番→にきて後ろについてたたくさんの0は前に行くんでしょうか?
それがどうして正解?なんでしょうか?他のもの(例えば0x000000ffとか)が入ってはいけないんでしょうか?
&を使ってるという事は論理積を理解できてないとこの問題は理解できないんだと思うのですが
本や解説を見てる時はふんふんなるほどと思っても実際こうやって問題にされると全くわからなくてお手上げです…

長文すみませんがどなたかご教授お願いします。
もしスレチならどこか該当スレに誘導お願いします。
(最初ふらっとCスレに書き込もうとしたら1000スレ達成しちゃってました…)
454デフォルトの名無しさん:2007/11/18(日) 09:27:51
>>453
論理演算とビットシフトでググればわかりそうなもんだが…

&はand演算だから、左右どちらも1なら真=1になる。そうでなければ0になる。
例えば、11001100 & 11000000の結果は11000000になる。
これを右に6ビットシフトすれば00000011が得られる。
455デフォルトの名無しさん:2007/11/18(日) 09:38:37
アドレスは、
11100010  上位ビット
01100011  
00100100  
11011100  下位ビット

のように格納されている

0ビットシフトさせてff = 11111111とand取れば下位ビットが出てくる
8ビットシフトさせてff = 11111111とand取れば下から二つ目が出てくる
456デフォルトの名無しさん:2007/11/18(日) 09:42:04
>>452
インライン展開するときに、Bが定数なら>451の方が効率がよくなる。
457デフォルトの名無しさん:2007/11/18(日) 09:49:08
効率とか言うレベルじゃなくて、単純に間違ってるだけだろw
458デフォルトの名無しさん:2007/11/18(日) 10:03:48
11000000 10101000 00000001 00000001 (3232235777 = 192.168.101.1)
11111111 00000000 00000000 00000000 (4278190080 = 0xff000000)
----------------------------------
11000000 00000000 00000000 00000000 (3221225472 = and後)
00000000 00000000 00000000 11000000 (192 = 24ビット右シフト後)

ビットシフトした後には0が入る。つまり1ビットシフトはx2か/2と同等。
これで理解できなければ諦めてくれ。
459453:2007/11/18(日) 11:44:35
なるほどっ!
すごくわかりやすい解説ありがとうございます。
ビットシフト自体は皆さんのご説明ですぐに理解できたのですが

「だからどうして@:エ、A:ウ・・・・・になるの?」というところが
なかなか理解できずレスに時間かかりました><

ただ少しばかり>>458さんに確認も含めた質問があるのですが
もしご覧になってたらお時間あればレスいただけませんか?
一行目の(192.168,101.1)というIPアドレスが最初はどこから出てきたのかさっぱり???だったのですが
これはわかりやすく例をあげるために適当?に書いてくれたのかな?と解釈しました。それでよろしいでしょうか?
あと、同じくカッコの中の3232235777や4278190080、3221225472という数字がイマイチピンとこないのですが
これはそれぞれ110000001010100000000010000001という2進法の数値を10進法で現してるものでしょうか?
(ググレ!でしたらすみません・・・ビット換算表はぐぐって今見てるのですが数字が大きすぎて・・・orz)

結局、最初の質問であった「どうして@:エA:ウ・・・になるのか?」という質問についてはやっと理解できました。
みなさんご親切にどうもありがとうございました^^
460デフォルトの名無しさん:2007/11/18(日) 12:08:51
>>459
ああ、スマン間違ってる。458の2進数表記だと192.168.1.1になるね。

IPアドレス自体は例として適当に書いただけ。
数字の部分は1バイトずつにそれぞれ192、168、1、1と当てはめたものを
4バイトのunsigned int型変数addressの10進数として表現したもの。

ちなみにこの処理は欲しい部分を切り取るのによく使われる方法で「マスク」等と呼ばれたりする。
まあ頑張ってや〜。
461デフォルトの名無しさん:2007/11/18(日) 12:51:48
C言語によるリスト構造について質問させてください。

連結リストに末尾からデータを蓄えて指定した数字を削除し
削除後のリストを画面に表示するプログラムを作りたいのですが、
手元にある参考書を見たり、ネットで調べても分らなかったので
どなたかご教授お願いします。
462デフォルトの名無しさん:2007/11/18(日) 12:58:05
http://www.google.co.jp/search?q=%E3%81%94%E6%95%99%E6%8E%88
ネットで調べてわからなかったらここで聞いてもわからないんじゃない?

まずは指定した数字が何番目にあるか判定するプログラムを作ってみて、
それができたら一つ前のデータと一つ後ろのデータを連結するように書いてみればいいんじゃない?
宿題スレにいって丸投げするのが一番早いと思うけど。
463デフォルトの名無しさん:2007/11/18(日) 13:04:03
>>462
ありがとうございます。宿題スレいってみます。
464デフォルトの名無しさん:2007/11/18(日) 15:18:47
http://www.uploda.org/uporg1118116.txt.html
こういうプログラムを作ったのですが
これに「平均点順に並び替えて表示する」という操作を加えたいのですがよくわかりません。
お願いします。
465デフォルトの名無しさん:2007/11/18(日) 17:31:47
>>464
そのプログラムを自分で作れるなら出来ると思うけな
466459:2007/11/18(日) 17:32:31
>>460さん、レスありがとうございました^^
マスクという処理方法については
名前だけ知ってたものの具体的にどういうものかまだ知りませんでした。
数字についてはまだピンときてないので引き続き2進数10進数16進数についても色々勉強してみます。


また何かわからない事ありましたら皆さんよろしくお願いします!
467デフォルトの名無しさん:2007/11/18(日) 18:05:59
>>465
よくわからないでございます
468デフォルトの名無しさん:2007/11/18(日) 18:10:51
>>467
普通のソートと同じ
469デフォルトの名無しさん:2007/11/18(日) 18:12:50
そうなの?
ちょっとやってみる。thx
470デフォルトの名無しさん:2007/11/18(日) 18:40:46
n番目のcellのポインタを呼び出す関数(*cell getcell(n)とか)でも作って、
バブルソートで比較しては入れ替えを繰り返せばいいんじゃないか。
for(i=0;i<MAX-1;i++)for(j=0;j<i;j++){
x=getcell(j);
y=getcell(j+1);
if(x->heikin > y->heikin){xとyの入れ替え}
}
cellごと入れ替えるにはもう一個前にもアクセスせんといかんから、
cell内の値だけ入れ替えるのが楽なのかなぁ。
471デフォルトの名無しさん:2007/11/18(日) 18:46:08
その変数がnanかそうでないかを判断するにはどうすればいいですか?
472デフォルトの名無しさん:2007/11/18(日) 19:24:18
有名なイディオムx != x(IEEE 754なら確実;あほなコンパイラでない限り)
C99のisnan
一部の独自関数_isnan
473デフォルトの名無しさん:2007/11/18(日) 21:18:54
NGワード:ご教授
474デフォルトの名無しさん:2007/11/19(月) 16:36:19
ANSI-Cについて質問です。

#include <stdio.h>
int main(int argc, char *argv[])
{
int x = 10;
printf("x=%d¥n", x);
char *s = "foo"; /** should be error? **/
printf("s=%s¥n", s);
return 0;
}

というコードを gcc -Wall -ansi hoge.c としてコンパイルすると何のエラーもなくコンパイルできてしまったんですけど、
Cでは文のあとに変数宣言できましたっけ?できなかったと思うのですが。
今までダミーのブロックを使ってたけど、いらないということでしょうか。
なおGCCは4.0.1です。
475デフォルトの名無しさん:2007/11/19(月) 16:46:34
>>474
従来のCではダメ
C99ならOK
476デフォルトの名無しさん:2007/11/19(月) 17:21:09
>>475
なるほど!さんくす
ちなみによく知られているコンパイラのうち、C99に対応していないものはありますか。
変数宣言が先頭じゃなくていいのは大変便利なのでぜひ使いたいんですけど、世の中の対応状況次第ではやめとこうと思います。
調べてみたらGCCはver3から対応しているみたいでした。今のGCCはver4が主流だと思うので、GCCは大丈夫ですね。
477デフォルトの名無しさん:2007/11/19(月) 19:20:14
途中宣言はキモイから使いたくないな。
478デフォルトの名無しさん:2007/11/19(月) 19:24:47
途中宣言ってわけわからなくなったりしないのかな?
479デフォルトの名無しさん:2007/11/19(月) 19:32:23
>>476
Visual C++は対応していない。
世間一般ではGCCのようなC99に対応しているCコンパイラのほうが珍しい。

ブロック途中での変数宣言はC++だと当然の機能なんだけどね。
480デフォルトの名無しさん:2007/11/19(月) 19:41:20
自己参照構造体がイミフ
最初に用意したポインタの示す値をNULL(ストッパーの役割)にして
んで次に用意したポインタの示す構造体の内部の自己参照ポインタには、その直前にあった構造体のアドレスを代入して。
繰り返すごとにどんどん構造体が繋がるってのはわかるんだけど、
例えば先頭から10個目の構造体内部を書き換えたい!って場合はどうすりゃいいの?
予め10個目ってわかるように変数で振っとけばいいの?
481デフォルトの名無しさん:2007/11/19(月) 19:45:40
>>480
構造体を先頭から辿るときに、いま何個目かわかるように、その辿った回数を数えとけばいい
482デフォルトの名無しさん:2007/11/19(月) 19:48:20
結局ソレが一番無難ですかー。
習ってたものでは一つ一つに入力の際でも、内部処理としての変数でもカウントアップさせるようなものを用意して、
その番号に直。
か、または、たどる時に何個かこっちが指定するって感じですか・・・。
難しそうだ('A`
483デフォルトの名無しさん:2007/11/19(月) 20:10:58
つまり、何番目にアクセスしたいという要求が頻繁にあるときには、
そういう線形リストは向いていない。配列が向いている。
484デフォルトの名無しさん:2007/11/19(月) 20:11:35
>>480
自己参照構造体というか、線形リストのことでしょ。
485デフォルトの名無しさん:2007/11/19(月) 20:49:54
なるほど・・・勉強になります。
486デフォルトの名無しさん:2007/11/19(月) 23:50:37
>>479
狭い世間なんだね。
487デフォルトの名無しさん:2007/11/19(月) 23:55:07
なんか妄想してる奴がいるな
488デフォルトの名無しさん:2007/11/19(月) 23:56:02
構造体のメンバのアドレスって構造体の先頭のアドレスから
求められるものなの?
489デフォルトの名無しさん:2007/11/19(月) 23:56:54
>>478
途中宣言のほうが格段に読みやすい。
490デフォルトの名無しさん:2007/11/20(火) 00:00:33
関数の長さによるだろ。
491デフォルトの名無しさん:2007/11/20(火) 00:03:41
関数の長さによらず、途中宣言のほうが読みやすい。
492デフォルトの名無しさん:2007/11/20(火) 00:10:17
こんばんは
大学の課題のことで質問です。
文字列をクイックソートで並ぶかえるプログラムなのですが、エラーが出来ます。
void your_sort(char *s[NS][WC]) {

int pivot;
int l_hold,r_hold;
int x=0;
int left = 0;
int right = WC-1;
l_hold = left;
r_hold = right;
pivot = (left+right)/2;
while(x<WC){

while(left < right)
{
while(strcmp(&s[x][right],&s[x][pivot])>0)
right--;
if(left =right)
{
s[x][left] = s[x][right];
left++;
}
493デフォルトの名無しさん:2007/11/20(火) 00:12:09
>>492
コンパイラの警告は無視しないできちんと対処しましょう。
もしそのコードで警告が出ないようなら、コンパイラのオプションを見直しましょう。
もし警告レベルを換えても警告が出ないようなら、そんなコンパイラは投げ捨てましょう。
494デフォルトの名無しさん:2007/11/20(火) 00:12:23
while((strcmp( &s[x][pivot],&s[x][left])<0) &&(left <right))
right--;
if(left != right)
{
s[x][left] = s[x][right];
left++;
}
while((strcmp( &s[x][pivot], &s[x][left])>0)&&(left < right))
left++;
if(left != right)
{
s[x][right] = s[x][left];
right--;

}
left = l_hold;
right = r_hold;
if(left < pivot)
your_sort(s[x][pivot-1]);
if(right > pivot)
your_sort(s[x]pivot+1,right);
}
x++;
}
エラー:cpp(39) : error C2664: 'strcmp' : 1 番目の引数を 'char **__w64 ' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
どこがおかしいのか教えて下さい
495宿題スレへ逝け:2007/11/20(火) 00:16:14
>どこがおかしいのか教えて下さい
あんたの頭。
496デフォルトの名無しさん:2007/11/20(火) 00:26:48
>>474
今更っぽいけど、ちょい補足。
-ansiはc89相当だけど、gcc拡張機能として途中の宣言が出来るので何も言われない。
厳密にc89を適応したければ-pedanticか-pedantic-errorsを-ansiと一緒に指定する。

でもコレやると//でのコメントとかですら怒られるけどな。
497デフォルトの名無しさん:2007/11/20(火) 00:32:57
>>495
いつもならこういう煽りは見ていて腹立たしくなるが今回は同意してしまった。
498デフォルトの名無しさん:2007/11/20(火) 08:15:27
>>494
>どこがおかしいのか教えて下さい

strcmp の 1 番目の引数がおかしいって書いてあるじゃん
499デフォルトの名無しさん:2007/11/20(火) 15:25:31
bool 型同士の比較演算の結果はどうなるのでしょうか?
true / false それぞれが何らかの整数に変換されてから
比較されるのでしょうか?
500デフォルトの名無しさん:2007/11/20(火) 16:09:59
>>499
trueは非0、falseは0としてコンパイラが評価する。
501デフォルトの名無しさん:2007/11/20(火) 16:14:20
>>499
C言語にbool型なんて無い。
502デフォルトの名無しさん:2007/11/20(火) 16:40:31
>>501
c99はcではないとでも?
503デフォルトの名無しさん:2007/11/20(火) 16:50:14
それ_Boolのtypedef。
1と0を保持する整数型で、比較演算では結局int型に格上げされるはず。
504デフォルトの名無しさん:2007/11/20(火) 17:25:48
文字列0.051/0.056/0.095/0.010 msから
2番目の要素、上の文字列だと0.056を文字列検索かけてうまくとる方法教えてください
505デフォルトの名無しさん:2007/11/20(火) 17:28:52
>>504
これでいいのかな?
#include <stdio.h>

int main(void){
char str[]="文字列0.051/0.056/0.095/0.010 msから";
char second_value[100];

sscanf(str, "%*[^/]/%[^/]", second_value);
puts(second_value);

return 0;
}
506デフォルトの名無しさん:2007/11/20(火) 17:41:44
>>505
ありがとう、うまくいきました。
私が書いた正規表現が間違ってたみたいです。
507476:2007/11/20(火) 21:55:54
>>479
遅れましたが、情報サンクスです。
VisualC++が対応していないというのは驚きですね。C++とみなしてコンパイルすればいいんだろうけど。
>>496
細かい情報ありがとう。-ansiで厳密なANSI準拠にならないというのはなんか間違ってる気がする。UIとして。
508デフォルトの名無しさん:2007/11/21(水) 01:12:45
>厳密なANSI準拠
ここに矛盾を感じない人には丁度いいのでは?
509デフォルトの名無しさん:2007/11/21(水) 10:18:11
もうテンプレに、このスレはC89用って書いとけよ
510デフォルトの名無しさん:2007/11/21(水) 10:26:43
C90 じゃなくて?
511デフォルトの名無しさん:2007/11/21(水) 10:30:37
うん
512デフォルトの名無しさん:2007/11/21(水) 10:38:37
1年は365日ですけど、それを1月は31日、2月は28日、3月は31日・・・・12月は31日っいう感じに書き換えるプログラムを作りたいんですがどうすればいいでしょうか?
513デフォルトの名無しさん:2007/11/21(水) 10:42:06
お前にはまだ早い
514デフォルトの名無しさん:2007/11/21(水) 10:44:07
>>512
書き換えるの意味がわからん。
122日 -> 5月2日
という感じ?
515デフォルトの名無しさん:2007/11/21(水) 10:45:02
>>514
そうです。
516デフォルトの名無しさん:2007/11/21(水) 10:47:46
年はどうするの?
うるう年を考慮するのか、とか
517デフォルトの名無しさん:2007/11/21(水) 10:50:25
今年の月日です。
518デフォルトの名無しさん:2007/11/21(水) 10:59:47
>>517
自分で月数の配列作って計算してもいいけど、
標準関数使うなら、mktime で 2007年1月122日を設定(122はtm_mdayに入れる))すれば
tm_mon に0から始まる月、tm_mdayに1から始まる日が入るはず。
519デフォルトの名無しさん:2007/11/21(水) 11:20:43
>>518
ありがとうございます!
…が、初心者の俺には難しいようでした。まったくわかりません。
お手数おかけしてすみませんでした。
520デフォルトの名無しさん:2007/11/21(水) 11:27:40
void calendar(int day){
if(day > 0 && day <= 365){
int data[] = {31,28,31,30,31,30,31,31,30,31,30,31};
for(int i=0;i<12;i++){
if((day-=data[i])<= 0){
printf("%d月%d日\n",i+1,day+data[i]);
return;
}
}
}
else
printf("1〜365の間で入力してください。\n");
}
521デフォルトの名無しさん:2007/11/21(水) 11:32:06
>>519
struct tm tm = {0};
tm.tm_year = 2007 - 1900;
tm.tm_mday = 122;
time_t t = mktime(&tm);

printf("%d月%d日", tm_mon + 1, tm.tm_mday);
522デフォルトの名無しさん:2007/11/21(水) 12:38:46
#include <stdio.h>
int main(void)
{ char str[256];
char s[] = "This is a pen. That is an apple.";
int i,j,k,checker;
printf("This is a pen. That is an apple.\n\n");
gets(str);
for(j=0;j<256;j++)
{for(i=j,k=0;str[k]!='\0';k++,i++)
{if(str[k]==s[i])
{checker=1;
break;}
else
{checker=0;}}}
if(checker==1)
{printf("OK!その文字列は含まれています。。\n");}
else
{
printf("NG!その文字列は含まれていません。\n");}}

初期化した文字列(This is~)と, キーボードから入力した文字列 str に対し, 文字列中に str が出現するかどうかを判定して表示するプログラムを作成したいのですが、
なかなかうまくいきません。最初のifelse文においてのreturnが変だと思うのですが。
例えば This→OK That→OK is→OK apple→OK pple→OK…
523デフォルトの名無しさん:2007/11/21(水) 12:43:41
>>522
#include <string.h>
char *strstr(const char *s1, const char *s2);

http://www9.plala.or.jp/sgwr-t/lib/strstr.html
これじゃ駄目なの?

524デフォルトの名無しさん:2007/11/21(水) 12:45:39
>>523
申し訳ないです。
stiring.hを使わず、for文でループして検索するっていう条件付です;
525デフォルトの名無しさん:2007/11/21(水) 12:51:49
>>522
この前同じようなの見かけた
http://pc11.2ch.net/test/read.cgi/tech/1194016813/389-
526デフォルトの名無しさん:2007/11/21(水) 12:54:12
>>522
×s[] について検索開始位置 (j=0 ; j<256; j++)とあるが、s[j] != '\0'でで辞めるべき
×1文字でも一致していると、処理を抜けてしまう
→1文字でも不一致で処理を抜けるべき
527526:2007/11/21(水) 13:01:08
あと、2段目のforループで一致判定出たら、1段目のforループ抜けるのも
忘れずに
528デフォルトの名無しさん:2007/11/21(水) 13:04:16
>>526
ってことは根本的には間違ってるんですかね?
数文でもいいので例をあげてもらえればうれしいです。
529デフォルトの名無しさん:2007/11/21(水) 13:07:14
>>527
あっ、なるほど!
サンクスです。
530デフォルトの名無しさん:2007/11/21(水) 13:08:29
>>522
なるべく原型を留めたつもり。

char *sp,*strp,*bsp;
for(sp = s; *sp!='\0';sp++){
for(strp = str, bsp=sp; *strp!='\0' && bsp != '\0';strp++,bsp++){
if(*strp == *bsp)
checker = 1;
else{
checker = 0;
break;
}
}
if(checker)
break;
}
531デフォルトの名無しさん:2007/11/21(水) 13:12:26
やばいw
少しわかったつもりですが、forで混乱してるかも…
>>527のヒントがすごいわかり易いんですけど、こっからつまってます。
532デフォルトの名無しさん:2007/11/21(水) 13:21:12
つーかchekerは0で初期化しといて、elseで代入はやめなよ
533デフォルトの名無しさん:2007/11/21(水) 13:25:37
>>532なるほど

教えてくんでごめんなさい
534デフォルトの名無しさん:2007/11/21(水) 15:07:20
整数型の数字を一文字ごとに分割したいので
sprintf(b,"%x",a);
としたのですが
printf("%s",b[0]);
としてみたところセグメントエラーが出てしまいます
どうしてでしょうか?
aはint型変数です
535デフォルトの名無しさん:2007/11/21(水) 15:11:50
bの型は?
あと%xは16進数、%sは文字列だがいいのか?
b[0]がchar型なら、%cだろ?
536デフォルトの名無しさん:2007/11/21(水) 15:12:17
bがchar*として考えると,printf("%s",b[0]);はprintf("%c",b[0]);
537デフォルトの名無しさん:2007/11/21(水) 15:29:47
>>535>>536
sとcは違うんですねw
ありがとうございました
538デフォルトの名無しさん:2007/11/21(水) 16:36:35
同じだと思ってたのか
539デフォルトの名無しさん:2007/11/21(水) 16:56:03
>>536
ウソツケ

printf("%s",b[0])
はb[0]の値をアドレスとする番地から始まるゼロ終端文字列を表示し
printf("%c",b[0])
はb[0]の値を文字コードとする文字を表示する
540デフォルトの名無しさん:2007/11/21(水) 17:07:12
質問から読んで書いてるのだろうか。
541デフォルトの名無しさん:2007/11/21(水) 17:08:37
>>539
後者に直せって意味で書いた
542デフォルトの名無しさん:2007/11/21(水) 17:13:21
何コイツ
543539:2007/11/21(水) 17:40:45
>>541
スマン
イコールの意味だと勘違いしてた
544デフォルトの名無しさん:2007/11/21(水) 17:53:09
m9(^Д
545デフォルトの名無しさん:2007/11/21(水) 18:49:06
borlandからVisualStudio2005に変えたんですが、
VSだとexeファイルってできないんですかね
546デフォルトの名無しさん:2007/11/21(水) 18:51:05
なぜそう思った?
547デフォルトの名無しさん:2007/11/21(水) 19:24:48
debug フォルダの中にできてるよ。
548デフォルトの名無しさん:2007/11/21(水) 21:23:29
初心者です。
return 0
がどういう意味なのかがどうしても分かりません。
return 0
があると、コンピュータは何をするのでしょうか?
549デフォルトの名無しさん:2007/11/21(水) 21:28:57
まずmain内に記述してると思うけど、main関数(mainという小さなプログラム)があるんだ。
int main(void)って書いてるでしょ?
return 0;ってのは、OSに 正常終了しましたよ〜って知らせるための記述。
でなぜ0なのかってのはint main(void)ってコトからわかるように、
main関数には整数を返しますよってコトです。

まぁ余談になったけど、 正常終了 ってコトです。
550デフォルトの名無しさん:2007/11/21(水) 21:31:20
>main関数には整数を返しますよってコトです。
「には」じゃなくて「は」だろ。
551デフォルトの名無しさん:2007/11/21(水) 21:32:29
んじゃreturn 1だとしたらどうなるんです?
552デフォルトの名無しさん:2007/11/21(水) 21:35:19
光あれと1と戻すだけ。
受け取る者がいなければ、
次のクロックで虚無に消える。
553デフォルトの名無しさん:2007/11/21(水) 21:35:20
return 1って異常終了じゃないっけか?
exit(1)と同じだと認識してる・・・
554デフォルトの名無しさん:2007/11/21(水) 21:39:37
受け取る側で判断するから異常とは限らないな
555デフォルトの名無しさん:2007/11/21(水) 22:01:01
>>549
そうです。それがよく分からないんです。
正常終了したかどうかはコンピュータが判断することでは?
「これは正常終了したことにします」って人間が決めちゃうんですか?
「正常終了」の意味が分かってないんだと思います。
main()関数は引数として0か1を渡してあげないといけないということでしょうか?
1を渡した場合、どうなるのでしょうか?
556デフォルトの名無しさん:2007/11/21(水) 22:03:03
2とか3とかも渡せるぞ
557デフォルトの名無しさん:2007/11/21(水) 22:09:00
>>555
OSが何なのか分かってないのでは?
558デフォルトの名無しさん:2007/11/21(水) 22:13:03
>>555
別にプログラムから1が返ってきたからってコンピュータはどうもしないけど、
シェルスクリプトやバッチファイルでコマンドの終了状態で処理を分岐したりだとか、
make中にコンパイルが失敗した時に処理を中断したりだとか、
そういう場面で使う。

俺的には「1つのプログラムで処理が完結する場合ばっかりじゃないので、
一応お約束が決まってます」ってぐらいだと思ってるけど。
559デフォルトの名無しさん:2007/11/21(水) 22:14:25
>>555
コンピュータがどうやって「正常終了」の判断をするのかkwsk
560555:2007/11/21(水) 22:19:56
スマン適当に言っただけだ。流してくれ。
561デフォルトの名無しさん:2007/11/21(水) 22:21:03
>>555
main関数からどんな値を返そうと、WindowsやUnixなど大抵のOSは何も行わない。
ただ、その値を「欲しがっているところ」に引き渡すだけ。
「欲しがっているところ」とは、単に別のプログラム、大抵はバッチファイルやシェルスクリプト。

0が正常終了というのは、シェルスクリプトらとプログラムとの間の暗黙の了解。
当時の資料を探せば何か根拠が出てくるかもしれない。
Cはそれを標準規格へ取り込んだ。
562デフォルトの名無しさん:2007/11/21(水) 22:32:10
正しいか正しくないかは人間がきめること。
CPUはただクロックを数えるのみ。
563デフォルトの名無しさん:2007/11/21(水) 22:40:55
自己参照構造体のポインタの動きで頭がこんがらがりまくる・・・
繋ぎなおして先頭アドレスをmainに返すってのはわかるんだけど、
か、書けねえ・・・
なんかコツとかありますか('A`)
564デフォルトの名無しさん:2007/11/21(水) 22:44:19
>>557-558>>561
ありがとうございます。
どうやら
return 0;
が何かを理解するのに必要な知識がだいぶ不足しているようです。
OSが何なのかや「make中」などが分かりません。
あてどもなくググってみたところ、
http://www.mech.utsunomiya-u.ac.jp/ozaki/education/c/text.html
の下の方の記述を見つけ、ようやっと、「一応お約束」や「暗黙の了解」
という意味が分かりました。
ただ、
return 0;
を書いた段階でプログラムが終わってしまうのは知りませんでしたが、
引数を返した時点で関数というのはそれ以上見なくなってしまうものなんですね。
もう少し勉強が必要です。少し知識を身につけてから、また皆さんの書き込み
を見たら意味が理解できるのかもしれません。ありがとうございました。
565デフォルトの名無しさん:2007/11/21(水) 22:44:37
紙に書いて考えれば?
566デフォルトの名無しさん:2007/11/21(水) 22:45:22
>>563
構造体を四角、ポインタの指す方向を線で、紙に書いてやってみそ。
慣れたら、頭の中でできるようになる。
567デフォルトの名無しさん:2007/11/21(水) 22:52:16
http://www.mech.utsunomiya-u.ac.jp/ozaki/education/c/text.html
の下の方のところ、貼っておきます。
------------------------------------
return 0 とは,プログラムの正常終了を意味している.とはいえ,これは UNIX 上でないとほとんど意味をなさないかもしれない.
UNIXでは,シェル(shell)と呼ばれるインタフェースプログラムを介してプログラムの実行が行われる. return 0 はこのシェルに
よってプログラムの終了状態に合わせた処理を行わせることができる.たとえば,Bash(Linux の標準シェル)の場合,

if program; then echo "OK"; else echo "ERROR"; fi

と記述することによって, program という名前のプログラムを実行し,もしそのプログラムが正常に終了した場合は OK を表示し,
正常に終了しなかった場合には ERROR を表示するようにすることができる. 正常に終了しなかった場合を表すには,たとえば次のよう記述する.
#include <stdio.h>

int main()
{
int a, b, c;

if (c != 0) {
a = b / 0;
} else {
printf("c = 0 なので割れません\n");
exit(1); /* 異常終了として1を返してプログラムを終了する */
}
return 0;
}

このプログラムでは, 0で割算を行わないように,まず変数 c がゼロでないかチェックし,もし変数 c がゼロのときには異常を
示してプログラムを終了する. exit() はプログラムを終了させるための関数で,引数の値が返される.一般的には,正常に終了
した場合には 0 を返すことにし,正常に終了しなかった場合には他の値を返すことになっている.だから,return 0 は
プログラムの正常終了を示すために必要なのである.また,main() の前の int は 0 や 異常終了の値の型を表している.
568デフォルトの名無しさん:2007/11/21(水) 23:11:09
おそらく>>297は皆を困らせようとして書いただけだよ
569デフォルトの名無しさん:2007/11/21(水) 23:50:47
xor eax, eax
ret
570デフォルトの名無しさん:2007/11/21(水) 23:59:44
>>564
process.h のsystem関数で外部exeを実行できるんだけど、
system関数の戻り値がintでそのプログラムが返した値を返す。
最後にreturn 0;だったら0。return 10;だったら10。
void main()だと不定っぽい。
571デフォルトの名無しさん:2007/11/22(木) 00:04:12
//child.c
#include <stdio.h>
int main(){
printf("hogeeeeeeee!!\n");
return 10;
}

//parent.c
#include <stdio.h>
#include <process.h>
int main(){
printf("system::%d", system("child"));
return 0;
}

二つをコンパイルしてparentを実行した結果
>hogeeeeeeee!!
>system::10

と出るはず。
572デフォルトの名無しさん:2007/11/22(木) 01:13:16
プログラムの正常終了は0だが、各関数の正常終了も0を返すようにしてる?
if文やwhile文が0以外を真としたりするので、0を返しちゃうと判定で偽になるよね?
みんなは省略形は使わずに、必ず==で何かと比較してますか?
573デフォルトの名無しさん:2007/11/22(木) 01:16:40
俺はmain以外の関数の場合、<ctype.h>のisナントカに合わせて0以外を真と見做すことにしている。
ほかの言語 (C++, Java, C#)でもtrueは1で、falseは0に相当するし。
574デフォルトの名無しさん:2007/11/22(木) 02:05:04
自分はファイル分割をする際、main.hなどと命名したヘッダファイル
にプロジェクトで使う全ての関数をプロトタイプ宣言しています。
例えば、
<<main.hの中身>>
#include "proj1.h"
extern void test1(void);
extern int test2(int);
    : // 以下色々な宣言等を列挙
といった具合です。
今までプロトタイプ宣言している関数の頭にはとりあえずexternを
書く必要があるのだろうと思っていました。
しかし、このexternを書かなくても正常にビルド出来てしまいます。
環境がVisualStudioだからでしょうか?
このextern宣言は邪魔くさいのでこれからは外して記述しようと思う
のですが、externが無い場合困るケースとしてどのような事が考えられますか?
575デフォルトの名無しさん:2007/11/22(木) 02:50:24
ヤメレ
576デフォルトの名無しさん:2007/11/22(木) 04:51:07
関数の宣言は暗黙にexternだから別に構わないけど、
変数は定義になるから、extern必須。
普通は両方つけて揃えるはず。
577デフォルトの名無しさん:2007/11/22(木) 05:19:54
関数にexternをつけてるソースは、殆ど見た事が無いなぁ。
578デフォルトの名無しさん:2007/11/22(木) 07:20:44
>574

直接関係無いけど、なんでもかんでもグローバル関数にしないこと。
579デフォルトの名無しさん:2007/11/22(木) 11:05:55
static でプロトタイプ宣言するのと区別するのに、
外部参照なんだから extern つければ?
580デフォルトの名無しさん:2007/11/22(木) 11:53:53
ビットマップの画像を平行移動させるプログラムを作っているのですが、
出力が真っ黒になってしまい、うまく動作しません。
単純なバグだと思うのですが、教えていただけると大変助かります。よろしくお願いします。

/* 画像の平行移動 */
void image_shift( unsigned char out2[Y_SIZE][X_SIZE][3],
unsigned char out[Y_SIZE][X_SIZE][3] )
{
unsigned int i,j,sx,sy,x,y;

sx=148; // X方向のシフト量
sy=128; // Y方向のシフト量

for(i=0;i<biHeight;i++){
for(j=0;j<biWidth;j++){
y=i+sy;
x=j+sx;
out2[y][x][0]=out[i][j][0];
out2[y][x][1]=out[i][j][1];
out2[y][x][2]=out[i][j][2];
}
}
}
581デフォルトの名無しさん:2007/11/22(木) 13:43:27
OPENGLを使えばいいと思うよ><
あとBMPがちゃんと確保されてるか確認した?

582デフォルトの名無しさん:2007/11/22(木) 13:50:06
回答ありがとうございます!
BMPはちゃんと確保されてます。そのまま出力もできますし・・・
OpenGLも考えてみます。
583デフォルトの名無しさん:2007/11/22(木) 13:51:19
>>580
取り敢えずシフト量を0にして試してみたら?
584デフォルトの名無しさん:2007/11/22(木) 14:04:32
シフト量を0
そのあと1とか小さい値にして

デバッグモードで確認して
585デフォルトの名無しさん:2007/11/22(木) 14:07:41
シフトした分だけあふれてるような気がするんだけど。
586デフォルトの名無しさん:2007/11/22(木) 14:11:17
みなさんのおっしゃるとおりです。
シフト量を0にすると、ちゃんと元の画像が出るんです。
ずらすと真っ黒になったりするんです。マイナス方向にずらすとエラーで止まってしまいますし・・・。
587デフォルトの名無しさん:2007/11/22(木) 14:15:36
>>マイナス方向にずらすとエラーで止まってしまいますし・・・。

それout2の領域外に書き込んでないか?
つまり配列の添え字がマイナスになったりX_SIZEやY_SIZEをオーバーしたり…
588デフォルトの名無しさん:2007/11/22(木) 14:19:34
for(i=0; i<biHeight; i++) {
for(j=0; j<biWidth; j++) {
y = (i+sy) % biHeight;
x = (i+sx) % biWidth;
ってしてみれば?
589デフォルトの名無しさん:2007/11/22(木) 14:19:53
ありがとうございます!
やっと解決しました。
大きな理由はビットマップのビット深さを間違えてました。
どうもお手数おかけしてすいません。ありがとうございました!
590デフォルトの名無しさん:2007/11/22(木) 14:38:34
アチャー
591デフォルトの名無しさん:2007/11/22(木) 14:47:41
なんかC言語の配列って何度も呼び出すと鈍くならない?
なんで
a = x[y[z[n]]];
みたいな感じ

a=z[n];a=y[a];a=x[a];
のほうが速くない?
592デフォルトの名無しさん:2007/11/22(木) 14:56:24
計ってみれば?
593デフォルトの名無しさん:2007/11/22(木) 15:05:40
計ってみたよ 配列に何度も入れた方がわずかに速いようだ

#include <iostream>
#include <time.h>
#define N 900000
using namespace std;
main(){
unsigned int n,k,c,sum;
unsigned int *x,*y,*z,*v,*w;
x=new unsigned int [N]; y=new unsigned int [N];
z=new unsigned int [N]; v=new unsigned int [N];
w=new unsigned int [N];

for(n=0;n<N;n++){x[n]=rand()%10;y[n]=rand()%N;z[n]=rand()%N;v[n]=rand()%N;w[n]=rand()%N;}

sum=0; c=clock();
for(n=0;n<N;n++){k=w[n];k=v[k];k=z[k];k=y[k];sum+=x[k];}
c=clock()-c; cout<<c<<" clock "<<sum<<endl;

sum=0; c=clock();
for(n=0;n<N;n++)sum+=x[y[z[v[w[n]]]]];
c=clock()-c; cout<<c<<" clock "<<sum<<endl;
}
594デフォルトの名無しさん:2007/11/22(木) 15:30:37
>>593
手元のiccでは全く同じコードにコンパイルされたよ。
--
movl (%rbx,%rcx,4), %ecx #15.20
movl (%rbp,%rcx,4), %edi #15.27
movl (%r12,%rdi,4), %r8d #15.34
movl (%r13,%r8,4), %r9d #15.41
addl $1, %edx #15.13
movl %edx, %ecx #15.13
addl (%r10,%r9,4), %r15d #15.46
movl %ecx, %edx #15.1
cmpl $900000, %edx #15.1
jb ..B1.15 # Prob 99% #15.1
--
movl (%rbx,%rcx,4), %ecx #19.30
movl (%rbp,%rcx,4), %esi #19.28
movl (%r12,%rsi,4), %edi #19.26
movl (%r13,%rdi,4), %r8d #19.24
addl $1, %edx #19.13
movl %edx, %ecx #19.13
addl (%r9,%r8,4), %r15d #19.17
movl %ecx, %edx #19.1
cmpl $900000, %edx #19.1
jb ..B1.23 # Prob 99% #19.1
--
595デフォルトの名無しさん:2007/11/22(木) 15:31:30
処で、>593はなんでC++でコンパイルしているんだ?
596デフォルトの名無しさん:2007/11/22(木) 15:34:55
仮想関数を利用する上での注意点があれば教えて下さい。
597デフォルトの名無しさん:2007/11/22(木) 15:40:00
iccだとmovlにしてくれるのか
VCだとmov,mov,...ってのにしかならない
598デフォルトの名無しさん:2007/11/22(木) 15:44:40
>593以下速度の話題
C/C++スレか速度スレ、或いは最適化スレへどうぞ。

>>596
あんたもスレ違い。
599デフォルトの名無しさん:2007/11/22(木) 21:02:53
for(i=10;i>=0;i--)printf("%d\n"i);
っていうコード unsigned にするとやばいね 全然気づかなかったよ
600デフォルトの名無しさん:2007/11/22(木) 21:11:23
処理系依存になるってこと?
601デフォルトの名無しさん:2007/11/22(木) 21:17:31
unsigned int iに対してi>=0は常に真だべ
602デフォルトの名無しさん:2007/11/22(木) 21:20:46
なるほど
どうもありがとう
603デフォルトの名無しさん:2007/11/22(木) 22:37:22
ポインタが指してる内容を配列に入れたいのですがどうしたらいいですか?
例えば、
char *a="ABC";
char b[4];
このとき、 b[0]=A,b[1]=B,b[2]=C にしたいです。
604デフォルトの名無しさん:2007/11/22(木) 22:39:15
strcpy(b,a);
605デフォルトの名無しさん:2007/11/22(木) 22:41:18
memmove(b,a,3);
606603:2007/11/22(木) 23:01:19
>>604,>>605
できました。
ありがとうございます。

607デフォルトの名無しさん:2007/11/22(木) 23:01:27
for(i=0;b[i]=a[i];i++);
608デフォルトの名無しさん:2007/11/22(木) 23:16:00
昨日自己参照構造体でのリストについてかけねーって嘆いてた者だけど、
今日紙に書きつつ、これがこーなるから次はこうなるだろーってソース書いてったら無事動きました!
609デフォルトの名無しさん:2007/11/22(木) 23:28:12
二次方程式の解の公式を求めるプログラムを作れとの課題が出たので考えてみたのですが
思うようにうまくいきません。
#include <stdio.h>
#include <math.h>


int main() {
double x1 ,x2, a, b, c;

printf( "a = " );
scanf("%lf" , &a);

printf( "b = " );
scanf("%lf" , &b);

printf( "c = " );
scanf("%lf" , &c);

x1 = -b+sqrt(b*b-4.0*a*c)/2.0*a;
x2 = -b-sqrt(b*b-4.0*a*c)/2.0*a;
printf("x1= %lf x2= %lf\n", x1, x2);
}

までできたのですが、
x1= -1.#IND00 x2= -1.#IND00
何を入力してもこの答えになってしまいます。
自分なりに見直してみたのですが間違いが分かりません。
どなたかご教示いただけたら幸いです。

610デフォルトの名無しさん:2007/11/22(木) 23:32:03
そもそも式が違うじゃん
611デフォルトの名無しさん:2007/11/22(木) 23:39:05
かけざんとわりざんはたしざんやひきざんよりもさきにけいさんします。
612609:2007/11/22(木) 23:40:33
式からして間違ってるのでしょうか?
今の式じゃ-bがが最後に計算されてしまうってことですかね?
613デフォルトの名無しさん:2007/11/22(木) 23:43:51
>>609
あなたが書いている式は

       √(b^2 - 4ac)
x1 = -b + ------------- * a
          2

こんなだよ
614609:2007/11/22(木) 23:44:12
x1 = (-b+sqrt(b*b-4.0*a*c))/2.0*a;
x2 = (-b-sqrt(b*b-4.0*a*c))/2.0*a;

こんな感じでいいんでしょうか?あと
warning C4996: 'scanf' が古い形式として宣言されました。
というエラーが発生してるんですがこれが原因でしょうか?
習ったとおりに書いてみたのですが。
615デフォルトの名無しさん:2007/11/22(木) 23:46:11
printfで%lfは標準じゃなかった気がする。
独自拡張とかC99とかならいけたかもしれんけど。
616デフォルトの名無しさん:2007/11/22(木) 23:47:57
>>613
最後のaは分母にかかりますよね?

>>615
そうなんですか・・・家と学校じゃ環境が違うのでそのせいかもしれません。
他に間違ってるところありますかね?
617デフォルトの名無しさん:2007/11/22(木) 23:48:09
>>614
それは警告であってエラーじゃない
618デフォルトの名無しさん:2007/11/22(木) 23:48:11
>>614 (...)/2*aじゃなくて(...)/(2*a)
619デフォルトの名無しさん:2007/11/22(木) 23:48:15
それだと

    -b + √(b^2 - 4ac)
x1 = ----------------- * a
         2
だな

>warning C4996: 'scanf' が古い形式として宣言されました。
warning C4996 でぐぐれ
620デフォルトの名無しさん:2007/11/22(木) 23:48:46
>>616
かからねーよwww
621デフォルトの名無しさん:2007/11/22(木) 23:51:39
>>618-620
なるほど・・・()付けない限り数字同士はくっ付かないんですか
ご指摘ありがとうございます。修正してみましたが、相変わらず答えは変わりません。
他に間違っているところがないのであれば家の環境が悪いということで諦めます。
622デフォルトの名無しさん:2007/11/22(木) 23:53:55
入力してる値が悪いのでは?実数解を持つ値を入れてみ
623デフォルトの名無しさん:2007/11/22(木) 23:59:22
>>622
答えがでました。適当に値を入れていたのが原因でしたか・・・
こんな基礎の問題に答えてくれて助かりました。
もっと勉強しないと駄目なようです、ありがとうございました。
624デフォルトの名無しさん:2007/11/23(金) 00:02:47
適当にいれんなよwwwwwwwwwwww
625デフォルトの名無しさん:2007/11/23(金) 00:05:03
Cに一番大事なのはとにかく基礎。
応用なんてものは後回しでとにかく基礎だぜ。
626デフォルトの名無しさん:2007/11/23(金) 00:06:46
AもBもすっとばしていきなりCやるとはたかれるってことですよねー
627デフォルトの名無しさん:2007/11/23(金) 00:11:14
たまにする背伸びは楽しいけどな
良い気分転換になる
628デフォルトの名無しさん:2007/11/23(金) 00:12:09
fizzbuzzもかけない段階でchaos pp使ってメタプログラミングしたりな
629助けてBOYZ:2007/11/23(金) 02:27:55
今日からの連休中に3つの課題を出されました。
ポインタ大嫌いです。
どなたか助けて下さい。
この問題が一つ目です。

【問】数字文字列を数値化する関数を作成して下さい。

<関数仕様>
書式 :short *AtoS(char *pStr, int *pRetCode);
戻り値:数字文字列のポインタ
引数 :char *pStr → 文字列の先頭アドレス
    :int *pRetCode → 動作の成否を返す (正常なら:0,エラー時は-1)
              ※但し、NULLの時は返さない
処理 :pStrで与えられた文字列をshort型の数値に変換する
    ※負数(マイナス)にも対応

<考慮必要事項>
・short型の範囲外の数値文字列
・非数字文字列
・数字文字列と非数字文字列の混在(先頭の'-')は除く
・空文字列
・NULL

以上の5つはpRetCodeの示す領域にはエラーを返す、戻り値は0
630デフォルトの名無しさん:2007/11/23(金) 02:28:53
>>629
いつまで逃げ続けられるの?
終わりはあるの?
631デフォルトの名無しさん:2007/11/23(金) 02:40:04
>>629
自分で考える気がないなら宿題スレへ
http://pc11.2ch.net/test/read.cgi/tech/1195668114/
632デフォルトの名無しさん:2007/11/23(金) 03:03:04
>>609
printf("x1= %f x2= %f\n", x1, x2);
で試したのか? どうみてこうだと思うんだが
633デフォルトの名無しさん:2007/11/23(金) 03:05:05
>>632
そういう問題じゃないから
634助けてBOYZ:2007/11/23(金) 03:11:41
何とか自分で作ってみました。
だけど戻り値?とか関数の意味がよく分からないし、何だかグダグダと
長いプログラムになってしまいました。
ポインタ&関数を理解するコツを教えて下さい。
635デフォルトの名無しさん:2007/11/23(金) 03:15:18
戻り値ってshort*なの?
636デフォルトの名無しさん:2007/11/23(金) 03:15:18
そもそも問題がおかしいのにどうしろと
文字列を数値化するのに文字列へのポインタ返してどうしろと
637助けてBOYZ:2007/11/23(金) 03:22:30
戻り値はshortみたいです。
一応表示はされたんですけど…
ちょっとチェックして下さい。
おかしいところ教えて下さい。
638助けてBOYZ:2007/11/23(金) 03:26:42
#include <stdio.h>
short AtoS(char *pStr, int *pRetCode);
int main(void)
{
short val;
int ret = 0;

val = AtoS("1234", &ret);
printf("%d\n", val);

val = AtoS("-789", &ret);
printf("%d\n", val);

val = AtoS("atai", &ret);
if (-1 == ret) {
printf("数値文字列でないデータが渡されました。\n");
}
return 0;
639助けてBOYZ:2007/11/23(金) 03:27:56
改行が多くて入りませんでした。
間違ってるところあれば教えて下さい。
short AtoS(char *pStr, int *pRetCode)
{
int *p;
int i;
int sum;
short goukei;

goukei = 0;
if (pStr[0] == '-') {
for (i = 1; pStr[i] != '\0'; i++) { /* p[0]に'-'が入力された */

pStr[i] = pStr[i] - '0';
goukei = pStr[i] + (goukei * 10);
}
goukei = goukei - (goukei * 2);
return goukei;
}
goukei = 0;
for (i = 0; pStr[i] != '\0'; i++) { /* p[0]〜'\0'の中に数字だけが入力された */
if (pStr[i] > 48 && pStr[i] < 58) {
pStr[i] = pStr[i] - '0';
goukei = pStr[i] + (goukei * 10);
}
else {
*pRetCode = -1;
return pRetCode[0];
}
}
return goukei;
640デフォルトの名無しさん:2007/11/23(金) 05:10:13
>>629
次からは宿題スレへ
#include <stdio.h>
short AtoS(char *pStr, int *pRetCode)
{
int n,s;
if(pRetCode == NULL) return 0;
*pRetCode = -1;
if(pStr == NULL || *pStr == '\0') return 0;
for(s=*pStr=='-'?1:0,pStr+=s,n=0;*pStr != '\0' && *pStr>='0' && *pStr<='9';pStr++)
n=n*10+*pStr-'0';
n=s==1?-n:n;
if(*pStr != '\0' || *(pStr-1) == '-' || n<-32768 || n>32767) return 0;
*pRetCode = 0;
return n;
}
int main()
{
int i,s,r;
char t[][8]={"","-","a","-a","a1","1a","1-",
"-32769","-32768","-1","0","1","32767","32768","-000001","000001"};
printf("String\t: Value\t(RetCode)\n");
s = AtoS("1",NULL);
printf("\"1\"\t: %d\t(NULL)\n",s);
s = AtoS(NULL,&r);
printf("(NULL)\t: %d\t(%d)\n",s,r);
for(i=0; i<sizeof(t)/8; i++) {
s = AtoS(t[i],&r);
printf("\"%s\"\t: %d\t(%d)\n",t[i],s,r);
}
return 0;
}
641640:2007/11/23(金) 06:31:08
訂正
#include <stdio.h>
short AtoS(char *pStr, int *pRetCode)
{
int n,s;
if(pRetCode == NULL) return 0;
*pRetCode = -1;
if(pStr == NULL || *pStr == '\0') return 0;
for(s=*pStr=='-'?1:0,pStr+=s,n=0;*pStr != '\0' && *pStr>='0' && *pStr<='9' && n>=-32768;pStr++)
n=n*10-*pStr+'0';
n=s?n:-n;
if(*pStr != '\0' || *(pStr-1) == '-' || n<-32768 || n>32767) return 0;
*pRetCode = 0;
return n;
}
int main()
{
int i,s,r;
char t[][16]={"","-","a","-a","a1","1a","1-",
"-32769","-32768","-1","0","1","32767","32768","-000001","000001","4294967296"};
printf("String\t: Value\t(RetCode)\n");
s = AtoS("1",NULL);
printf("\"1\"\t: %d\t(NULL)\n",s);
s = AtoS(NULL,&r);
printf("(NULL)\t: %d\t(%d)\n",s,r);
for(i=0; i<sizeof(t)/16; i++) {
s = AtoS(t[i],&r);
printf("\"%s\"\t: %d\t(%d)\n",t[i],s,r);
}
return 0;
}
642デフォルトの名無しさん:2007/11/23(金) 09:05:09
>>639
> pStr[i] = pStr[i] - '0';

文字列へのポインタ貰った関数が、中身を書き換えちゃいけない。
呼び出し側が、
n=AtoS("12345", &x);
とした場合、pStrの指す先は書き換えは不可能である処理系が多い。

普通、こういう文字列へのポインタを貰う関数は、
short AtoS(const char *pStr, int *pRetCode)
のようにconstを付ける。
643デフォルトの名無しさん:2007/11/23(金) 09:23:18
>641

for(s=*pStr=='-'?1:0,pStr+=s,n=0;*pStr != '\0' && *pStr>='0' && *pStr<='9' && n>=-32768;pStr++)
n=n*10-*pStr+'0';

↑こういう可読性の悪い書き方はやめようぜ…
644デフォルトの名無しさん:2007/11/23(金) 09:24:47
わざとだろう
645デフォルトの名無しさん:2007/11/23(金) 10:41:36
x[n]とr=0.6に対して

(x[0]-x[1])/x[1] + r * (x[1]-x[2])/x[2] + r^2 * (x[2]-x[3])/x[3] + ・・・

という計算を多くするとき計算が速く終わるコードって分かりますか?
x[n]は変化します 厳密な値ではなくていいです
646デフォルトの名無しさん:2007/11/23(金) 10:42:45
あとx[n]の値は50%以内のずれしかありません
647デフォルトの名無しさん:2007/11/23(金) 10:54:43
x[n]の平均値hとその誤差をd[n]とすると

(x[0]-x[1])/x[1]
=d[0]-d[1]/x[1]
=d[0]-d[1]/h
=(d[0]-d[1])*k k=1/h
とすれば速そうですね
648デフォルトの名無しさん:2007/11/23(金) 11:57:13
(x[0]-x[1])/x[1] = x[0]/x[1]-1 でしょ。
-1の部分だけ分けて、
元の式=x[0]/x[1]+r*x[1]/x[2]+r^2*x[2]/x[3]....-(1+r+r^2+...)
とすれば、
r=0.6固定なら後ろの部分は定数だから前もって計算しておけば早いのかも。

精度が無視できる項以降は計算しないって手もあるのかな。
有効数字2ケタでいいなら、0.6^10以降は計算しなくてもいいと思う。
649デフォルトの名無しさん:2007/11/23(金) 12:22:00
>>648
サンクス
650574:2007/11/23(金) 13:43:42
>>576-579
ありがとうございました。
プロトタイプ宣言はやはり暗黙的にexternのですね。
社内のソースと合わせるため、一応これからはグローバルな関数はexternを付けて区別していこうと思います。
651デフォルトの名無しさん:2007/11/23(金) 14:22:28
プロトタイプ宣言は厳密には暗黙的に extern なのではなくて、
それより前に static なプロトタイプ宣言や関数定義がなければ extern になり、
あれば static になる。
652デフォルトの名無しさん:2007/11/23(金) 14:24:28
そういうときに「規定」って言葉を使うのかな。
653デフォルトの名無しさん:2007/11/23(金) 14:26:23
ヘッダファイルで static な関数プロトタイプを書くことは無いし、
ヘッダファイルはファイルの先頭でインクルードするしで、
>>651 のような曖昧さがあっても実際の所これが問題になる事はない。
extern をつけるかどうかは好みの問題。
654デフォルトの名無しさん:2007/11/23(金) 15:14:15
>>653
すまん。
前2行と後ろ2行の関係が分からん。
出来ればもうちょい詳しく頼む。
655デフォルトの名無しさん:2007/11/23(金) 15:39:55
別のスレに翻訳単位をよくわかってない奴がいたな。
ヘッダファイルは彼にとって何か特別なものなのかもしれないが。
656デフォルトの名無しさん:2007/11/23(金) 15:52:05
>>654
前2行の理由により、普通はヘッダファイル内にあるプロトタイプ宣言より先に
static なプロトタイプ宣言や関数定義が現れることはないから、
実質的には暗黙的に extern になると考えても問題ないという話。
657デフォルトの名無しさん:2007/11/23(金) 19:14:43
ここに来てるのってみんなプログラマーなの?
658デフォルトの名無しさん:2007/11/23(金) 19:36:03
プログラムが出来るって意味ではみんなプログラマーだろうな
659デフォルトの名無しさん:2007/11/23(金) 19:59:26
職業=プログラマはあんまいないと思う
学生とSEばっか
660デフォルトの名無しさん:2007/11/23(金) 20:09:55
いや、プログラマーって普通にいるだろ。
661デフォルトの名無しさん:2007/11/23(金) 20:13:13
>>659
SEが居るならプログラマも居る事になるんだよ
662デフォルトの名無しさん:2007/11/23(金) 20:19:42
SEと職業プログラマはちょっと違うけどな
663デフォルトの名無しさん:2007/11/23(金) 20:21:40
あ、名刺はSEだけどプログラマって人はいっぱいいると思う
特に若い人。
664デフォルトの名無しさん:2007/11/23(金) 20:35:16
昔職業プログラマって優れたコードを書く人だと思ってたけど、
なってみたら優れたコードとかは二の次で動くコードを書く人だと知った。
665デフォルトの名無しさん:2007/11/23(金) 20:40:15
資格とかいらなくて、基本的にだれでもやれる職業だしな。
666デフォルトの名無しさん:2007/11/23(金) 21:25:12
頭使うドカタだしな。
667デフォルトの名無しさん:2007/11/23(金) 21:44:55
名刺もってるプログラマに出会ったことないんだけど
668デフォルトの名無しさん:2007/11/23(金) 21:46:47
名刺は持ってるぞ
渡す機会は無いけど
669デフォルトの名無しさん:2007/11/23(金) 21:47:29
名刺に「プログラマ」と書くとどうしても低く見られるから、
「システムエンジニア」と書くんだよ。
670デフォルトの名無しさん:2007/11/23(金) 21:48:33
みんな普通にもってるでしょ?
自社以外の人にいっさい会わないで、こもって仕事してるならいらないけど。
名詞の肩書きに「プログラマー」とか入ってないって意味?
671デフォルトの名無しさん:2007/11/23(金) 21:50:10
所属とか役職は入ってるけど、プログラマーとかSEとかってのは書いてないよね。
672デフォルトの名無しさん:2007/11/23(金) 21:50:43
いや、会社が名刺をつくってくれないらしいんだが……
673デフォルトの名無しさん:2007/11/23(金) 21:54:02
たまにしか使わないのに何十枚も刷ると高いから、
使うときに1枚だけプリンタから出せってことだよ。
674デフォルトの名無しさん:2007/11/23(金) 21:58:23
数十枚刷れば数年もつ
675デフォルトの名無しさん:2007/11/23(金) 22:03:15
プログラマが名刺出すような状況にならんだろ
SEとして派遣されたら名刺だすけどさ
676デフォルトの名無しさん:2007/11/23(金) 22:10:23
>672-673

どんだけ貧乏な会社なんだよ。
100枚1000円ぐらいなのに…
677デフォルトの名無しさん:2007/11/23(金) 22:11:36
使わないものを作ったってねぇ
678デフォルトの名無しさん:2007/11/23(金) 22:15:03
あんま名刺出すとセールスの電話が増えて業務が滞る
679デフォルトの名無しさん:2007/11/23(金) 23:19:51
>>678
わたくしどもはお客様の会社にプログラマを派遣いたしております
わたくしどもは常に優秀な人材を取り揃えてございます
おたくの会社にもおひとついかがでしょうか?
680デフォルトの名無しさん:2007/11/23(金) 23:23:29
おもしろくないよ
681デフォルトの名無しさん:2007/11/23(金) 23:32:04
そのとおり
笑えない話なのさ
682デフォルトの名無しさん:2007/11/23(金) 23:47:54
Cでpow(5,i)の計算をした時のことでお聞きしたいことがあります。
最初はpow(5,0)=1,pow(5,1)=5,(5,2)=25....と順調です。
しかし、pow(5,23)の時に本来ならば11920928955078125のはずなのですが、
なぜか11920928955078124と1小さい数になってしまいます。
pow(5,24)以降も正しい数値が得られず誤差がどんどん大きくなっていってしまいます
この原因が全く分からず途方にくれている状態です…よろしくお願いします。
683デフォルトの名無しさん:2007/11/23(金) 23:50:40
684デフォルトの名無しさん:2007/11/23(金) 23:51:45
>>682
doubleの有効桁数を超えてるとか。
685デフォルトの名無しさん:2007/11/23(金) 23:57:53
多売長ライブラリ
686デフォルトの名無しさん:2007/11/24(土) 00:15:23
>683

倍精度浮動小数点で普通使われるIEEE 754 形式だと仮数部52ビットだけど、
pow(5,23)で52bitを超えるから、以降は誤差が出る。
誤差を避けるためには自分で作るしかない。
でも多分そういうアルゴリズムは探せばあるよ。
687デフォルトの名無しさん:2007/11/24(土) 01:53:27
0*0.003=0

をlog計算するためにプログラムでかくにはどうすればいいですかね?

0*確率なら0になるから処理の結果に影響ないんだけど
logだと0にならないんで困るわ。
688デフォルトの名無しさん:2007/11/24(土) 01:54:20
689デフォルトの名無しさん:2007/11/24(土) 02:09:44
わからないかな?
たとえばこの図であらわすと
http://kossie.net/up/src/kos1247.jpg
startから1回目の移動で↑と↓に移動できるそのときの確率が0.5と0.5
start地点の状態確率が1とすると↑と↓に移動した段階の状態確率はそれぞれ0.5 0.5

プログラム的に1回の移動ごとに、すべての状態をまわって、
そのあとに2回目の移動をすることにしてます。そうじゃないと作れないので。
これを小数点でなら最初すべての状態の確率を 0にしておけば、それぞれの移動ごとに
すべての状態をまわっても0*移動確率 =0になるので変な数値が値がでることはありません。

ただlogで計算する場合に、logはlog(A*B)=logA+logBという性質があるので
Aが0であってもBが0でなければ数値は残ってしまういうわけ。

これでプログラムになやんでるんですよ。
690デフォルトの名無しさん:2007/11/24(土) 02:13:56
そもそもlogxって定義域x>0だろが
691689:2007/11/24(土) 02:35:46
まあ問題はこういう感じなんですけど、図は>>689のとおりです

いま、start,1,2,3,10,11,endという状態がありまして、
以下のような確率で移動することとします。
最初はstartで最後はendです。startの状態確率は1.0です。
1.0から移動する確率をかけると状態1のその時点での状態確率が0.5、状態2の状態確率が
0.5となります。
ただし状態1は入ってくる矢印が3つですので、その時点では0.5ですが
次の状態に状態1から状態1へ移動すると0.5X0.6の計算をして0.3となるわけで
す。この(startから状態1への移動確率)
(状態1の状態確率)X(状態1から状態1への移動確率)と、(状態11の状態確率)X(状態11
から状態1への移動確率)の和が状態1の状態確率となります。
startから状態10に移動したり、状態2に移動したりして計算をしていって
endにきたときの最終状態確率を求めよ。っていうのが問題です。

これをlogで計算しないといけないっていう前提にプログラムを作るとしたら
どうつくっていきますか?ただし状態に入ってくる3つの値は比較しながら
計算しないといけないんでね。logの計算なので。
692デフォルトの名無しさん:2007/11/24(土) 02:39:14
>>689
なんだお前か
氏ね
693689:2007/11/24(土) 02:46:15
どうせできないのにいばんな。
694デフォルトの名無しさん:2007/11/24(土) 02:47:25
非友好的な態度だな
695デフォルトの名無しさん:2007/11/24(土) 03:40:22
負の無限大?
696デフォルトの名無しさん:2007/11/24(土) 03:57:50
>>691
人に説明する気はありますか?
宿題スレでも、簡単なことを訳の分からない説明してたし
考えていることを整理してみてはどうでしょう?

エスパーしておくと、対数を使うのは外部データの入出力のときだけで
内部での計算は対数を使わなくていいんじゃないかと・・・
(どうせ浮動小数点だし)
697デフォルトの名無しさん:2007/11/24(土) 09:14:10

             「 ̄ `ヽ、   ______
             L -‐ '´  ̄ `ヽ- 、   〉
          /           ヽ\ /
        //  /  /      ヽヽ ヽ〈
        ヽ、レ! {  ム-t ハ li 、 i i  }ト、
         ハN | lヽ八l ヽjハVヽ、i j/ l !
         /ハ. l ヽk== , r= 、ノルl lL」
        ヽN、ハ l   ┌‐┐   ゙l ノl l
           ヽトjヽ、 ヽ_ノ   ノ//レ′
    r777777777tノ` ー r ´フ/′
   j´ニゝ        l|ヽ  _/`\
   〈 ‐ 知ってるが lト、 /   〃ゝ、
   〈、ネ..         .lF V=="/ イl.
   ト |お前の態度が とニヽ二/  l
   ヽ.|l         〈ー-   ! `ヽ.   l
      |l気に入らない lトニ、_ノ     ヾ、!
      |l__________l|   \    ソ
698デフォルトの名無しさん:2007/11/24(土) 09:21:52
>>689
>ただlogで計算する場合に、logはlog(A*B)=logA+logBという性質があるので
>Aが0であってもBが0でなければ数値は残ってしまういうわけ。

なんで、そんな偉そうにウソを語るんだ。
699デフォルトの名無しさん:2007/11/24(土) 09:53:50
log0 は未定義だから log(A*B)=logA+logB で A が 0 の場合を考える事自体がナンセンス
700デフォルトの名無しさん:2007/11/24(土) 10:03:19
>>689
よく分からんが、log0って出来ないんじゃないの?
701デフォルトの名無しさん:2007/11/24(土) 10:06:58
エスパーすると、確率を log した値で保持しておいて、
確率変化を積じゃなく和で表現したいんだろうな。
log(0) は CPU によっては -inf (マイナス無限大) として扱われるから、
そういう CPU では特に問題は発生しないと思うんだけど。
702デフォルトの名無しさん:2007/11/24(土) 10:45:05
>>683-686
レスサンクス!
結局、多倍長演算をするためにGMPとやらを入れてみました。
しかしGMPの関数を解説してるサイトの少ないこと…
どんな関数があるのか、引数の意味は何かとかさっぱり分からないorz
703デフォルトの名無しさん:2007/11/24(土) 11:32:52
練習で、サーバーソケットとクライアントソケットを両方持つプログラムを作ってます。
サーバーはサーバーでリッスンさせといて、クライアントはメッセージを入力すると相手サーバーへ飛ぶ、
と考えたんだけど、先にサーバーソケットをaccept()でループさせとくと、後のクライアント処理に行けなくて困ってる。
スレッド使わないとムリ?
704デフォルトの名無しさん:2007/11/24(土) 11:55:20
>>703

>スレッド使わないとムリ?

無理。素直にスレッド立てれ。
705デフォルトの名無しさん:2007/11/24(土) 11:57:22
プロセスでもいいけどな
706デフォルトの名無しさん:2007/11/24(土) 12:00:22
selectとその仲間


全然(標準)Cじゃねーじゃねーか
707デフォルトの名無しさん:2007/11/25(日) 00:04:32
for文とwhile文の使い分けがよく分かりません。
苦Cのサイトに、「for文はwhile文を拡張した文」と書いてあったのですが、
while文が先にできて後でfor文を追加したのでしょうか?

while文でなければできないことや、while文でやった方がいいこと、またその逆など、
ありましたら教えてください。よろしくお願いいたします。
708デフォルトの名無しさん:2007/11/25(日) 00:10:58
>>707
とりあえずループカウンタをつかってるループはfor()を使っておけばいいんじゃないの?

709デフォルトの名無しさん:2007/11/25(日) 00:17:10
>>707
while文でできてfor文でできないことや、その逆のことは、ない。
 i = 0;
 while (i < 10) {
  ....
  i++;
 }

 for (i = 0; i < 10; i++) {
  ...
 }
のどちらが読みやすいか?
その程度の問題。
710デフォルトの名無しさん:2007/11/25(日) 00:19:45
do{}while(); // 必ず一回は行う処理
for(;;) // ループ途中で continue を行っても for の第三項が実行される
711デフォルトの名無しさん:2007/11/25(日) 00:36:29
>>708-710
ありがとうございます。
文法的にwhile文の方が見やすいので、個人的にはそちらを使おうかと思っています。
一般的にはどういう使い分けがされてるとか、「慣習」や「常識」みたいのはありますでしょうか?
712デフォルトの名無しさん:2007/11/25(日) 00:54:11
文字列処理とか数値処理とかで使い分けるだろ。
713デフォルトの名無しさん:2007/11/25(日) 01:03:14
ここでfor文の方が速いからfor文使え、とその後200レス程費やす無駄な議論を起こす為のネタ投下
714デフォルトの名無しさん:2007/11/25(日) 01:04:49
慣習とかは無いだろうけど,
回数が固定なら for,未定なら while が一般的だと思う
たとえば,「荷物を10個選ぶ」なら for で,「荷物を10kg分選ぶ」なら while とか
715デフォルトの名無しさん:2007/11/25(日) 01:07:00
そうだな
内容の容量の制限したいときにforではせんわな。

あープログラムつくらないといけないのに
作る気がしない。
作り始めたら5,6時間いけるのに
そういうのが全然ない。
716デフォルトの名無しさん:2007/11/25(日) 09:10:10
たしかに for でも while でもよいネ。
オイラは無限ループは while 使うようにしてるな。
do while は使わなくなった。
717デフォルトの名無しさん:2007/11/25(日) 09:50:56
ループするごとに毎回行いたい処理があれば for を使うね。
continue しても実行されるから。
718デフォルトの名無しさん:2007/11/25(日) 11:06:17
vcだとwhile(1)は警告レベル最大だと文句言われるのでfor(;;)を使うようになった
この辺の習慣は環境で変わるんだろうね
719デフォルトの名無しさん:2007/11/25(日) 11:08:38
泣く泣く for (; ;) を使うように
720デフォルトの名無しさん:2007/11/25(日) 13:30:51
>>718
どういう警告?
721デフォルトの名無しさん:2007/11/25(日) 13:42:40
>>720
C4127
722デフォルトの名無しさん:2007/11/25(日) 15:10:01
CとC++はもう仲良くできないの?
C99すごすぎ。
723デフォルトの名無しさん:2007/11/25(日) 17:28:24
認識率1%とかの実験のプログラムを前の先輩をつくられて
再実験でそのプログラムを作ってるんだけど。
データ100でそのうちの何個かで認識率を出すって感じで
今ようやくデータ1つで数値を出せるようになった。
データ100個をプログラムで入力できるようにして自動でしたいんだけど
結構複雑。
データ1つ入力して値をだして100回するのも
認識率1%とかいうやって意味あるのか的な感じがして自重してる。

しかしプログラムの内容を率でだされるのっていやだね。
724デフォルトの名無しさん:2007/11/25(日) 17:36:31
日記帳にでも書いてろカス
725デフォルトの名無しさん:2007/11/25(日) 18:57:23
726デフォルトの名無しさん:2007/11/25(日) 19:48:10
文字列処理を極めたいのですが、何から手を付けたらいいですか?
727デフォルトの名無しさん:2007/11/25(日) 20:01:28
左から。
728デフォルトの名無しさん:2007/11/25(日) 20:02:51
まずは文字列の表現方法を考えることから
729デフォルトの名無しさん:2007/11/25(日) 20:03:10
修辞的疑問文というやつだな
730デフォルトの名無しさん:2007/11/25(日) 20:13:07
ファイルを読み取る時に一文字ずつ読み取る方法と
一行ずつ読み取る方法がありますが、
どういう場合に使い分けるんですか?
731デフォルトの名無しさん:2007/11/25(日) 20:14:23
カンタンなことだ。
ファイルを1文字ずつ読み取りたい場合は1文字ずつ読み取る方法を使い、
1行ずつ読み取りたい場合は1行ずつ読み取る方法を使う。
732デフォルトの名無しさん:2007/11/25(日) 20:16:09
その日の気分による
733デフォルトの名無しさん:2007/11/25(日) 20:30:51
一行ずつ、もしくは一文字ずつ読み取らなければいけない場合とは、
例えばどんな場合がありますか?
734デフォルトの名無しさん:2007/11/25(日) 20:43:56
>>733
行に意味があるときには行単位で読んだほうが楽
行に意味がないときには文字単位で読んだほうが楽
735デフォルトの名無しさん:2007/11/25(日) 22:13:40
バイナリファイルは1文字ずつ読んで、
テキストファイルは1行ずつ読む。
736デフォルトの名無しさん:2007/11/25(日) 22:39:40
>>735
さらっと嘘教えるな
737デフォルトの名無しさん:2007/11/25(日) 23:10:37
型変換しないのに型変換するとコストかかりますか?

たとえばunsigned int型を同じ型でキャストした場合です
738737:2007/11/25(日) 23:17:16
どうやらたいして差がないことが分かりました
739デフォルトの名無しさん:2007/11/25(日) 23:39:11
まず間違いなく出力は1バイトもたがわないと思う。
740デフォルトの名無しさん:2007/11/26(月) 00:22:38
ビルドしてfc /bで比べればいいんじゃね
741デフォルトの名無しさん:2007/11/26(月) 01:08:03
>>714
分かり易い説明をありがとうございます。
>>709の例で言うと、for文を使う方が一般的、ということですね。
どちらも i を宣言しないといけないことに変わりはないんですね。
742デフォルトの名無しさん:2007/11/26(月) 05:05:13
ループの終了条件がループカウンター以外の場合はwhileを使う。
ループごとにある関数を呼んで、その結果が真の時のみループを抜ける、とかな。

while (func() != 0)
{
〜何かの処理〜
}

まあforでも実現できるから、どっちでもいいんじゃない?
743デフォルトの名無しさん:2007/11/26(月) 09:16:58
C言語の参考書Lvを卒業して、線形リストとかアルゴリズムみたいなのをある程度組んでみた。
30日位考えれば作れるようなプログラムとかどのような物があります?
大学にも行けなかったような頭なので、そこまで難しい物はまず出来ませんが。
744デフォルトの名無しさん:2007/11/26(月) 09:31:01
>>743
トランプのポーカーを AI 付で
745デフォルトの名無しさん:2007/11/26(月) 09:36:18
>>743
OS。本が売ってるからそれに従えばおk
746デフォルトの名無しさん:2007/11/26(月) 09:55:58
>>744
色々ネットにソースありましたが、AIって部分が難しそうですね・・・
ゲーム作ってみたかったので参考にさせて頂きます。

>>745
アセンブラも使うそうですし、OSとなると自分には無理な気がしてならないですがw
30日でOSが出来るならとなると少し興味もありますね。
レビューのみでは分からなかったのでこれから本屋行って二つを見て周って来ます

レス下さった方有難うございました
747デフォルトの名無しさん:2007/11/26(月) 13:45:16
int a[256]={0} という配列を定義して
例えば1024をscanfでこの配列に
a[0]=1024 , a[1]=0 ,a[2]=0,......,a[255]=0
ではなく
a[0]=4 ,a[1]=2, a[2]=0, a[3]=1.a[4]=0,.....,a[255]=0
という風に格納したいのですが、どういう風にプログラムを書けばいいのか思いつきません
よろしくお願いします。
748デフォルトの名無しさん:2007/11/26(月) 13:48:11
int n, a[256] = {0}, i;

scanf("%d", &n);
for(i=0; n; i++, n/=10) a[i] = n % 10;
749デフォルトの名無しさん:2007/11/26(月) 14:06:25
>>748
ありがとうございます!
int型やdouble型以上の桁の数字を扱う方法として
一桁ずつ格納する方法ならば!と思ったのですが、
どちらにしろ一度int型の変数に代入しないといけないことにプログラム見て気付きましたorz

char型の配列(例えばstr[256])に文字として数値を文字として格納した後に、
それをint型の配列(a[256])に入れなおすことって出来ませんよね…
750デフォルトの名無しさん:2007/11/26(月) 14:19:16
>>749
こういうこと?

char buf[] = "123456789";
int val[sizeof(buf)];
for (unsigned ic = 0; ic < sizeof(buf); ++ic) {
val[ic] = buf[ic] == '\0' ? 0 : buf[ic] - '0';
}
751デフォルトの名無しさん:2007/11/26(月) 14:20:01
int i, j=0, a[256];
char str[256];

scanf("%s", str);
for(i=0; str[i]; i++);
whil(i--) a[j++] = str[i] - '0';
752デフォルトの名無しさん:2007/11/26(月) 14:20:10
void array_double(int *a, int n)
{
int i;
for(i=0;i<n-1;i++,n--)
{
a[i] = a[n-1];
}}
配列aとそのサイズnを受け取り、要素を逆順にするプログラムを考えているんですが、
うまくコンパイルすることができず、1,2,3,4,5と入力すると、5,4,3,4,5と出力されます。
どこがおかしいのでしょうか?
753デフォルトの名無しさん:2007/11/26(月) 14:25:38
>>752
>どこがおかしいのでしょうか?
頭。

コードと結果が合致してさえいないぞ。自分のコードくらい間違うな。
754デフォルトの名無しさん:2007/11/26(月) 14:29:45
>>752
ヒント: 上書きと交換は違う
755デフォルトの名無しさん:2007/11/26(月) 14:31:48
>>753
ヒント: ピントが外れている
756デフォルトの名無しさん:2007/11/26(月) 14:32:11
>>753
お前の頭もおかしいよ
757デフォルトの名無しさん:2007/11/26(月) 14:36:06
>>752
自分の頭(紙と鉛筆でもいい)の中で実行して
1行ずつ変数の中身がどうなるか考えてみよう
ループを展開するんだ。
a[0] = a[5-1];
a[1] = a[5-1];


758デフォルトの名無しさん:2007/11/26(月) 14:36:57
>>757
お前もちゃんとコード見ろ
759753:2007/11/26(月) 14:40:36
とりあえず、>755のお蔭でn--を見落としていたのは判ったw

>>757
同士よw
760デフォルトの名無しさん:2007/11/26(月) 14:52:32
>>752
a[i] = a[n-1] を

int temp = a[i];
a[i] = a[n-1];
a[n-1] = temp;

にすればok
761デフォルトの名無しさん:2007/11/26(月) 14:58:31
Cに交換演算子が欲しいと思う恭子の頃。
762デフォルトの名無しさん:2007/11/26(月) 15:31:04
>>761
具体的にどう実装する?
763デフォルトの名無しさん:2007/11/26(月) 15:33:38
>>762
>760の例なら
a[i] <> a[n - 1];
とか。
評価の回数を減らせるし、swapマクロを作って自爆することもなくなるし、
CPUに交換ニモニックがあれば使えるべさ。
764デフォルトの名無しさん:2007/11/26(月) 16:08:54
今大学でプログラミング授業を取ってるんだが、色々とワカンネorz

演習内容うpするので教えてくれませんか?
765デフォルトの名無しさん:2007/11/26(月) 16:16:21
>>764
スレ違い
766デフォルトの名無しさん:2007/11/26(月) 16:18:44
>>765
キティーだから許して。スレ違いだったらスマン

板いろいろ探したんだが、何処で聞いたらいい?
ググレ以外の回答を頼むw
767デフォルトの名無しさん:2007/11/26(月) 16:26:09
C/C++の宿題を片付けます 100
http://pc11.2ch.net/test/read.cgi/tech/1195668114/l50
768デフォルトの名無しさん:2007/11/26(月) 16:26:32
>>764
宿題スレも見つけられないなら大人しく首括っとけ。
769デフォルトの名無しさん:2007/11/26(月) 17:57:03
Visual C++ 2005を使用しています。
文字列をLONGLONG型の整数値に変換したいんですが、atoll関数が見つかりません。
Visual C++ 2005の環境では、atoll関数は自作するしかないでしょうか。
770デフォルトの名無しさん:2007/11/26(月) 17:58:25
>>769
つ[strtoll()]
771デフォルトの名無しさん:2007/11/26(月) 18:42:36
_atoi64
772デフォルトの名無しさん:2007/11/26(月) 18:51:11
boost::lexical_cast
773769:2007/11/26(月) 18:53:19
>>770-772
ありがとうございます。
_atoi64でいけました。
774デフォルトの名無しさん:2007/11/26(月) 19:59:33
>>770
VC2005はC99に未対応じゃね?
775デフォルトの名無しさん:2007/11/26(月) 20:56:49
変な質問ですが、C言語をマスターするのにだいたいどのくらいかかりますか?
776デフォルトの名無しさん:2007/11/26(月) 21:01:58
オレにも教えて下さい。C言語って何が出来ますか?
入門書卒業後何をしたらいいのやら。

グラフィック系統の本みたけど、これを利用してぱらぱら漫画みたいなの作れないですか
777デフォルトの名無しさん:2007/11/26(月) 21:05:11
Cでできないことはほとんどない
778デフォルトの名無しさん:2007/11/26(月) 21:06:05
>>776
それだけなら画像表示ツール自身でできるからなぁ。
あんたの質問は、「英語で何ができますか?」と同じくらい無意味なんだよ。
779デフォルトの名無しさん:2007/11/26(月) 21:40:46
#include <stdio.h>

int main(void)
{
FILE *fp;
int x;
int y = 30;

fp = fopen("test.txt","r");
fscanf(fp,"%d",&x);
printf("%d",x);
fclose(fp);
fp = fopen("test.txt","w");
fprintf(fp,"%d",x);
fscanf(fp,"%d",&x);
printf("%d",x);
fclose(fp);

return(0);
}

------test.txt-----
10
-----------------
馬鹿な質問で申し訳ないです。
実行結果が107になるんですが、何か見落としてるのでしょうか。
780デフォルトの名無しさん:2007/11/26(月) 21:47:04
"w" なのになんで fscanf を?
781デフォルトの名無しさん:2007/11/26(月) 21:48:45
>>779
>何か見落としてるのでしょうか。


冗談さておき、"w"でオープンしたストリームからは読み込めません。
まして、fprintf()で出力した先には何もありません。
782デフォルトの名無しさん:2007/11/26(月) 21:49:26
あ、ホントだ。
ありがとうございます。

また"r"で開きなおさないとダメなんですね。
"r+"とか"w+"の使い方もいまいち不明だし。
783デフォルトの名無しさん:2007/11/26(月) 21:58:29
ついでに質問です。
"r+"と"a+"の違いって何でしょう?
両方ともファイルに出力したら追記されますよね。

単純にファイルが新規に作成されるか否かですか?
784デフォルトの名無しさん:2007/11/26(月) 22:01:41
r+ は途中にも書き込める。
a+ はファイルの終わりにしか書き込めない。
785デフォルトの名無しさん:2007/11/26(月) 22:14:53
>>784
挿入可能って事ですか?
それとも上書きが出来るって事でしょうか。

色々試してみてるけど思うように扱えないです。
786デフォルトの名無しさん:2007/11/26(月) 22:23:12
r+ は上書き可能。こんな感じ。       ポップアップ用アンカー >>786
#include <stdio.h>
#include <stdlib.h>

int main() {
static const char FILENAME[] = "test.txt";
FILE *fp;
int x = 0;

/* とりあえず 10 と書き込む */
fp = fopen(FILENAME, "w");
fprintf(fp, "%d", 10);
fclose(fp);

fp = fopen(FILENAME, "r+"); /* r+ で開く */

/* ファイルの先頭から数値を読み出す */
fscanf(fp, "%d", &x);
printf("%d\n", x); /* 10 と出力されるはず */

/* ファイルの先頭に移動して 30 と書き込む */
fseek(fp, 0, SEEK_SET);
fprintf(fp, "%d", 30);

/* またファイルの先頭に移動して数値を読み出す */
fseek(fp, 0, SEEK_SET);
fscanf(fp, "%d", &x);
printf("%d\n", x); /* 30 と出力されるはず */

fclose(fp);
return EXIT_SUCCESS;
}
787デフォルトの名無しさん:2007/11/26(月) 22:32:56
分かり易い解説ありがとうございます。
上記の例で、"a+"だと、
10
1030
と出力されちゃうんですね。

fseek関数はまだ触った事ないので勉強してみようと思います。
788デフォルトの名無しさん:2007/11/26(月) 23:07:17
/* fseekってイマイチよく分からん。 オフセットとかなんだか知らんが
読んだときか書き込んだときでかは忘れたけど、数字で
int型の4バイトの時と、char型の1バイトの時があってイミフ。
チラシの裏で馬鹿なレスだからスルーしてね^^ */
789デフォルトの名無しさん:2007/11/26(月) 23:43:55
>>788
それは恐らくfseek()が判らないのではなくて、fprintf()で書き込むのかfwrite()で書き込むのかの
違いがよく判っていないんジャマイカ。

>>787
書き込み後は、fseek()(或いはそのサブセットのrewind())をするか、明示的にfflush()しないと
書き込んだ結果が実際のストリームに出力される保障がないことに注意。

まぁ、ファイル先頭に移動するにはrewind()の方が判りやすいだろうね。
790デフォルトの名無しさん:2007/11/26(月) 23:56:48
条件によって01を記録し、
記録した情報を順番に読み取って01を判別し、
条件分けをしたいのですが思ったとおりになりません。。
具体的には、書き込み
FILE *fp;
char output = 0;
int bit = 0;
fp = fopen("bitstream","rb");
for(i=0; i...... )
{
if(bit == 8)
{bit = 0; fputc(output,fp);}
if(条件)
{手順1; output = ((output<<1) | 0x01); bit++;}
else
{手順2; output <<= 1; bit++;}
}
output = (output<<(7-bit));
fputc(output,fp);
読み込み
char a;
for(i=0; ){
if(bit == 8)
{a = getc(fp); bit = 0;}
if( ( a >> (7-bit) ) & 0x01 )
{手順1; }
else
{手順2; }
bit++;}
こんな感じで書いてるんですが、どこかおかしいところがあればご指摘ください。
791デフォルトの名無しさん:2007/11/27(火) 00:13:53
float *a;
a = new float();
*a = 120;
float *temp = a;

これはOKですよね

float *temp = 120

これはなんでダメなんですか?
792デフォルトの名無しさん:2007/11/27(火) 00:29:03
tempが格納するのはアドレスだから。
120を変数に格納して、その変数のアドレスをtempに渡すなどする必要がある。
793デフォルトの名無しさん:2007/11/27(火) 00:30:17
newはC++なんだけど
794デフォルトの名無しさん:2007/11/27(火) 00:30:49
セミコロンが無いから。
795デフォルトの名無しさん:2007/11/27(火) 00:32:19
つまり
float *tempは、ポインタとして宣言してる状態で、そこにaのアドレスが入って、
temp = a となっている、ということですか?上の例だと

で、3行目の
*a =120 は aのアドレスをもったところに120をぶち込んでる、ということで
float *tempとは別ものなんですよね?

796デフォルトの名無しさん:2007/11/27(火) 00:47:27
564.1
451.6
154.1
[EOF]

こういう風になってるテキストファイルがあるときに
「EOFまで数字をテキストファイルから読み込む」という作業をする場合はどうすればいいんでしょうか?

i=0;
while(1){
if(fread(&c,sizeof(char),1,fp)==EOF) break;
else
{
data[i]=fscanf(fp,"%lf\n",&value);
i++;
}
}

こんな感じにかいたらdata[0][1][2]には564.1 451.6 154.1 が入っているんでしょうか?
よくfreadとfscanfなどがわかっていないのでよろしくお願いします。
797デフォルトの名無しさん:2007/11/27(火) 00:47:38
別もの。
*a=120の*はデリファレンス、float *tempの*はポインタ宣言。
798ワカメ高専:2007/11/27(火) 01:05:59
[-3,3] fx=1/(1+5x^2) 分点の数 10個(n=9)
これをラグランジュで求めて結果を出力するプログラムを作れって(c or c++)言われたけどさっぱりでしゅ
799デフォルトの名無しさん:2007/11/27(火) 01:44:24
>>798
課題丸投げは宿題スレへ
http://pc11.2ch.net/test/read.cgi/tech/1195668114/
800デフォルトの名無しさん:2007/11/27(火) 01:49:31
>>796
i=0;
while(1){
if (fscanf(fp, "%lf", &data[i]) == EOF) {
break;
}
i++;
}
801デフォルトの名無しさん:2007/11/27(火) 01:55:32
>>795
そう。上の例は
float *a;
a = new float();
*a = 120;
float *temp;
temp = a;
に等しい。下の例は
float *temp;
temp = 120;
ということになる。floatポインタに整数120は代入できない(型が異なる)のでエラー。
802デフォルトの名無しさん:2007/11/27(火) 02:14:26
エラーにはならないだろボケ
803デフォルトの名無しさん:2007/11/27(火) 02:16:13
>>791
別に駄目じゃねーよ。
期待してるのとは違う動作だろうけどな。
804801:2007/11/27(火) 02:19:44
本当だ、エラーにはならんね、すまそ
805デフォルトの名無しさん:2007/11/27(火) 04:48:24
何でポインタとして宣言したものに、アドレス以外の値を代入しようなどと考えるのか?
ポインタはアドレスを指し示す以外に能が無い。間接参照は*演算子のおかげ。
整数を格納したいなら、そのポインタの指すアドレスを先頭としたメモリを確保しろ。
(エラー処理は省略)

// 以下はNG
int main(int argc, char **argv)
{
int *i; // この時点ではポインタiの指すメモリアドレスは不定

*i = 123; // iの指す不定アドレスのメモリ領域に整数123を代入しようとしている
printf("%d", *i);

return 0;
}

// 以下はOK
int main(int argc, char **argv)
{
int *i = malloc(sizeof(int)); // ポインタiにはmallocで確保されたメモリ領域の先頭アドレスが入る

*i = 123; // iの指すintバイトのメモリ領域に123を代入
printf("%d", *i);

free(i);
return 0;
}
806デフォルトの名無しさん:2007/11/27(火) 04:59:03
>>791
C++を理解しているなら、new演算子が何をやっているのか知ってるんじゃないの?
メモリの確保と初期化。下の例では、new演算子に相当する処理が抜けている。
807デフォルトの名無しさん:2007/11/27(火) 07:07:00
PHP経験2年です。
最近Cの書籍をぱらぱらと眺め始めています。

C言語で、
URLデコード関数を作りたいのですが、
セキュリティ面でどうすればリスクを回避できるのか、

型に不慣れなためによくわかりません。

ttp://www.kinet.or.jp/hiromin/cgi_introduction/appendix/url_encode/x_www_form_url_translator.c
たとえば、上のようなものを見つけましたが、
これはそのまま使っても安心な感じでしょうか。

引数に
dst_lenや変換した文字の書き出し先の最大長や
src_len 変換元の文字の長さ
を指定する必要性もよくわかりません。
(なぜ関数内で文字数を調べるような流れにしないのか。
.cのソース見ていると同じようなパターンばかりなので何か理由があるのでしょうが。。。)

どなたかご教授お願いします。
808デフォルトの名無しさん:2007/11/27(火) 07:46:42
>>807

多分そのまま使っておk。


>dst_lenや変換した文字の書き出し先の最大長や

バッファオーバーフロー回避のため。

>src_len 変換元の文字の長さ

必ずしも「文字列の最後まで」とは限らないから。
809デフォルトの名無しさん:2007/11/27(火) 10:47:12
>>805
>何でポインタとして宣言したものに、アドレス以外の値を代入しようなどと考えるのか?
この一文を見て

なんでポインタってアドレスだけで使うのに

float *a = malloc(sizeof(float));
*a = 123;

こんな使い方があるんだろう、って思った。
アドレス以外入れれないようにすればいいのに
だからポインタ理解するまで時間掛かるんだよ…ハァ
810デフォルトの名無しさん:2007/11/27(火) 11:01:01
>>805
定数以外で初期化ってできたっけ?
811デフォルトの名無しさん:2007/11/27(火) 11:18:34
商用利用が可能なフリーのcコンパイラって何がありますか? gcc MINgwとかはシェアウェア作れますか
812デフォルトの名無しさん:2007/11/27(火) 11:27:42
開発と対象の環境は?
813デフォルトの名無しさん:2007/11/27(火) 11:36:23
商用利用が不可能なコンパイラっていうと「LSI C-86 Ver 3.30 試食版」だっけ?
814デフォルトの名無しさん:2007/11/27(火) 11:40:03
>>811
作れる
815デフォルトの名無しさん:2007/11/27(火) 11:42:34
ボーランドc++ やvisual c++2005 express
とかは商用無理ですよね
816デフォルトの名無しさん:2007/11/27(火) 11:43:30
>>815
聞いた事ないぞそんな事。
817デフォルトの名無しさん:2007/11/27(火) 11:43:51
>>815
使用許諾を読めばいいんじゃない?
818デフォルトの名無しさん:2007/11/27(火) 11:51:33
>>815
両方とも商用利用できるよ
819デフォルトの名無しさん:2007/11/27(火) 11:59:30
ボーランドは調べたら駄目って書いてあったんですけど・・・今調べたらVC++は可能ってありました
820デフォルトの名無しさん:2007/11/27(火) 12:08:15
>>819
ボーランドのコンパイラは商用可能なやつと商用不可の両方があります
821デフォルトの名無しさん:2007/11/27(火) 12:08:17
バージョンは?
822デフォルトの名無しさん:2007/11/27(火) 14:27:00
>>807
確かに、url_encode()内で文字列長を調べ、必要なメモリサイズを計算し、
メモリを確保してそこへ書き込み、確保したアドレスを返すことは可能です。

しかし、例えば非常に短い間しか必要としない場合、わざわざmallocして
解放漏れのないようコーディングするより、スタック上で済ませた方が
楽チンだったりもします。
また、返って来たアドレスは本当にmallocされたものでしょうか?
staticな変数として関数内に確保されていない、という保証を誰が約束して
くれるのでしょうか?今のバージョンではmallocされていたとして、将来の
バージョンでもmallocされ続ける保証は?

そんなわけで、この手の関数ではバッファの確保を呼び出し側の責任と
する場合が多いです。
そして、確保されたバッファを越えて書き込んで(バッファオーバーフロー)
しまわないよう、何バイトまでなら書き込んでもいいのか、引数として受け取る
という仕様になります。
823デフォルトの名無しさん:2007/11/27(火) 20:48:22
char str1[256],str2[] = "DRAGONQUEST";

とした場合、str1とstr2にはそれぞれ何が入るんですか?
824デフォルトの名無しさん:2007/11/27(火) 20:51:53
>>823
str1: ゴミ
str2: "DRAGONQUEST"

だと思います
825デフォルトの名無しさん:2007/11/27(火) 20:53:26
>>824
ありがとうございます。
ゴミというか空ですかね??
826デフォルトの名無しさん:2007/11/27(火) 20:55:12
>>825
ゴミ。なにが入っているか分からない。
827デフォルトの名無しさん:2007/11/27(火) 20:55:53
いやゴミ。
出力してみればわかる。
str1[256] = {0} として中身全て0で初期化しない限りゴミが入ってる
828デフォルトの名無しさん:2007/11/27(火) 20:56:50
>>825
関数内で宣言したなら、たまたまそこの領域に
あったバイト列がそのまま残ってる。
829デフォルトの名無しさん:2007/11/27(火) 21:08:33
>>826-827
出力してみたら、
フフフフフフフフフフフフフフフフフフフフフフフフ『
となってました。最後の『は、なんか半角の変換できない文字です。
エラーにはならず出力できるんですね。不思議・・・intだとエラーになるのに。。
>>828
main()関数の中で宣言した場合でも当てはまりますか?
830デフォルトの名無しさん:2007/11/27(火) 21:16:34
>>829
フフフ・・はデバッグ時に特定のバイト列いれてるんだよ。
リリースビルドしたら結果は変わる
static つけるか関数の外なら0に初期化される。
mainも例外ではないが、未使用の場所ならたまたま0になってることもあるかもな
831デフォルトの名無しさん:2007/11/27(火) 21:17:22
>>829
フフフフが入ってるのは、VC++で、デバッグビルドしたときだけな。
(他のコンパイラでも、フフフで埋めてるのがあるかもしれんけど)
832デフォルトの名無しさん:2007/11/27(火) 21:32:01
>>830
ホントだ〜〜リリースビルドするたびに結果が変わります。
最初は何も表示されなかったんですが、これが 0 ということでしょうか?
static をつけたら、何度やっても何も表示されなくなりました。
833807:2007/11/27(火) 22:16:39
>>818
>>822
丁寧な説明ありがとうございます。
バッファオーバーフローはよく聞きますが、
具体的に許容量って何が指標になるんでしょうか?

ttp://www.kinet.or.jp/hiromin/cgi_introduction/appendix/url_encode/x_www_form_url_translator.c
の場合、
size_t dst_len

int src_len
のサイズはどう設定すればよい(どこまで大きく設定してよい)のでしょうか?
834デフォルトの名無しさん:2007/11/27(火) 22:51:21
>>832
staticをつければ0に初期化されるが、staticの意味をちゃんと理解して使わないとだめよ。
835デフォルトの名無しさん:2007/11/27(火) 22:55:35
void array_input(int *a)
{
int i,t;
t=4649;}
としたときに
void array_double(int *a)
{printf("%d",t);}

と異なる関数の値を利用したいのですが、可能ですか?
836デフォルトの名無しさん:2007/11/27(火) 22:56:16
>>833
ケースバイケースだが、URLの場合最大長が決まってるはず。
それをMAXにすればいいと思う。
URLの最大長は、HTTP仕様に書いてあったと思う。
837デフォルトの名無しさん:2007/11/27(火) 23:00:03
>>835
array_input内のtを使いたいってことなら無理
グローバル変数を用意するか,array_doubleに引数で与える
838デフォルトの名無しさん:2007/11/27(火) 23:00:32
>>835
グローバル変数じゃないと不可能。
何でそんなことしたいん?
839デフォルトの名無しさん:2007/11/27(火) 23:09:43
値直接渡せばいいんじゃね?
グローバル変数ならいけるけど、変数衝突おきやすいからなぁ
840デフォルトの名無しさん:2007/11/27(火) 23:18:46
void array_input(int *a)
{int i;
for(t=0;i!='0';t++){
for (i=0; i!='0'; i++) {
printf("%d 番目の要素 = ", i);
scanf("%d", &a[i]);
if(a[i]==0)
break;}break;}

void array_double(int *a)
{int i,j;
for (i=0;i<t;i++,t--) {
j=a[i];
a[i]=a[t-1];
a[t-1]=j;}}

いえば、こういうことをしてみたいのですが…
841デフォルトの名無しさん:2007/11/27(火) 23:26:54
char str[256];
のように、256の要素で宣言する例示が多いのは何故ですか?
842デフォルトの名無しさん:2007/11/27(火) 23:32:05
>>840
あなたが何をやりたいのか見当がつかなくなった
843デフォルトの名無しさん:2007/11/27(火) 23:38:54
>>841
なんとなく切りがいいからでしょう。
844デフォルトの名無しさん:2007/11/27(火) 23:52:13
>>843
8ビットで、255まで数えられるんですよね?
とすると、0を入れて、256まで配列を作ると、実際には257の文字列が
用意されていることになるんでは?
254なら8ビットで表せてキリがいいのは分かるんですが・・・
845デフォルトの名無しさん:2007/11/27(火) 23:53:28
256をキリがいいって思う感覚は、もう何かに毒されてるよな…
846デフォルトの名無しさん:2007/11/27(火) 23:54:35
256だとわかりにくいが、0x100と書くとわかりやすい
847デフォルトの名無しさん:2007/11/27(火) 23:54:55
>>844
8ビットは、0〜255だ。0を数え忘れてないか。

char str[256]; は、0〜255までの256個だ。257番目は使えない。
848デフォルトの名無しさん:2007/11/27(火) 23:54:57
「32ビットのコンパイラ」というのは、
「一回に扱える処理のデータ単位が32ビットのコンパイラ」
って意味でいいんでしょうか?
849デフォルトの名無しさん:2007/11/27(火) 23:55:11
C言語のpow関数なんですが、0.1の0.3乗とかの少数の累乗ってどうやって計算してるんですか?
850デフォルトの名無しさん:2007/11/27(火) 23:57:23
知らんがな
851デフォルトの名無しさん:2007/11/28(水) 00:04:10
>>848
ふつう32ビットのコンパイラっていうと、コンパイラ自身が32ビットなんじゃなくて、32ビットコードを生成できるコンパイラのことだと思う

「一回に扱える処理のデータ単位が32ビットのCPU」 上で動くようにプログラムをコンパイルできるコンパイラ…かな
852デフォルトの名無しさん:2007/11/28(水) 00:06:59
>>849
知らないけど、log取ってるかもね
853デフォルトの名無しさん:2007/11/28(水) 00:12:41
>>847
なるほど。そうなんですね!
8ビットを、0〜254 と勘違いしてました。
0を入れて、全部で256なのは分かったんですが、ここでもう一つ疑問が。。
プレステ2のFFXなどでパラメータの最大値は 255 なんですが、
なぜ、256 ではないんでしょうか?
854デフォルトの名無しさん:2007/11/28(水) 00:15:45
>>851
なるほど。そんな正確な言葉で説明していただきたかったんです。
ありがとうございました!
855デフォルトの名無しさん:2007/11/28(水) 00:22:20
>>849
double pow(double x, double y) {return exp(log(x) * y);}
かも知れない。

>>853
0-255を表せるから、255にしておくのが無難と言うわけ。
856デフォルトの名無しさん:2007/11/28(水) 00:23:26
>>853
0〜255だからだろ
857デフォルトの名無しさん:2007/11/28(水) 00:25:38
printf()関数の中身を見ることってできないんでしょうか?
858デフォルトの名無しさん:2007/11/28(水) 00:37:12
int *p1,p2;
とした場合、p1もp2もポインタ変数になるんでしょうか?
859デフォルトの名無しさん:2007/11/28(水) 00:38:29
>>856
もしかしてもしかすると、パラメータは0から始まっていたかもしれません。
もう一度確認してみます!!
860デフォルトの名無しさん:2007/11/28(水) 00:40:37
>>858
試してみれば分かるが、そうはならない。
*はp1にしか係らない。
861デフォルトの名無しさん:2007/11/28(水) 00:44:23
>>860
勉強中ですので試してみ方がよく分からないのですが、とりあえず理解しました。
ありがとうございました。(初歩的な質問すみません)
862デフォルトの名無しさん:2007/11/28(水) 01:02:48
#include <stdio.h>

とかは< >で記述するのに、自作ヘッダーファイルなどは

#include "jisaku.h"
のように" "で記述するのは何故ですか?
863デフォルトの名無しさん:2007/11/28(水) 01:48:19
>>862
" " と < > でファイルの検索する場所が異なるから。
ソースファイルがあるのと同じ場所を検索してほしかったら " " を使う。
864デフォルトの名無しさん:2007/11/28(水) 01:54:04
>>863
なるほど!ありがとうございます。
stdio.h などのファイルがどこにあるかは、コンパイラによって違う、
という認識でいいのでしょうか?
865デフォルトの名無しさん:2007/11/28(水) 02:00:01
△コンパイラによって違う
○設定によって違う
866デフォルトの名無しさん:2007/11/28(水) 02:12:27
全く持って無知な俺がC++を学ぼうと思うんだが、まずどのソフトを入れたらいいのですか?
てか、C++の前にC言語が分かってないとお門違いなのかな・・・
867デフォルトの名無しさん:2007/11/28(水) 02:13:37
まずは検索の仕方から覚えるのがいいと思うよ
868866:2007/11/28(水) 02:14:26
あwスレチだったorz
C++を覚えるにはC言語をある程度把握してないといけないのでしょうか?
869デフォルトの名無しさん:2007/11/28(水) 02:15:44
逆に聞きたいんだけど、C++は分かるけど、Cは分からない人っているの?
870デフォルトの名無しさん:2007/11/28(水) 02:17:26
>>869誤解を招きそうなので・・・
全然「逆」じゃないです。
単に、>>868と同じことが知りたいがために聞いた質問です。すみません。
871デフォルトの名無しさん:2007/11/28(水) 03:36:21
"世界一わかりやすいCプログラミングの授業"
これはお薦めでしょうか?
872デフォルトの名無しさん:2007/11/28(水) 07:40:39
>>857

gccならソースコードが公開されてる。
glibcでぐぐれ。
873デフォルトの名無しさん:2007/11/28(水) 08:10:44
>>868-869
普通にいるよ。文法も違うし、そもそも考え方がまるで違うからな。
C++はCの上位版ではあるが、それは「Cの書き方も利用できる」くらいに認識したほうがいい。
それも、厳密にはC99と今のC++では互換が失われているから、適当ではないかもしれんが。

C++を使いたい、Cは使うつもりが無い、ということなら、初めからC++を覚えていったほうがいい。
ただ問題なのは、C++の参考書がほとんどC習熟者を対象としていることだ。
874デフォルトの名無しさん:2007/11/28(水) 09:29:14
このページでC言語を学習しようと思うんですが、どうでしょうか?

ttp://www.stat.phys.kyushu-u.ac.jp/~ryokawa/cbegin2_3/html4/cbegin.html
875デフォルトの名無しさん:2007/11/28(水) 09:35:08
配列の宣言で、要素数に後から分かる値を代入することはできないのでしょうか?

int a[n];

n=10;

というような感じのことがやりたいのですが・・・
876デフォルトの名無しさん:2007/11/28(水) 09:45:33
つ動的割当
877デフォルトの名無しさん:2007/11/28(水) 11:27:23
>>875
・c99でローカル変数でnが確定しているなら、int a[n]でいい。
・そうでないなら、malloc()などでメモリを割り当てて使うしかない。
・それもいやなら、Cを諦めてC++で書くなどする。
878デフォルトの名無しさん:2007/11/28(水) 11:30:19
誤解を招きそうだから補足。
・c99でローカル変数でnが確定しているなら、int a[n]でいい。

c99を利用していて、その配列が静的でないローカル変数でよくて、nの値が確定しているなら、int a[n]でいい。
つまり、VCではダメで、呼び出し元に返すことができなくて、staticにできなくて、関数内部でしか使えなくて、動的にリサイズできない。
879デフォルトの名無しさん:2007/11/28(水) 14:28:47
>>833
許容量=自分が用意したバッファのサイズ。
スタック上に
char urlencoded[256];
と用意した変数に書き込んでほしいなら、
const char *url = "なんたらかんたら";
url_encode(urlencoded, 256 * sizeof(char), url, STRLEN(url));
とか。

>>845
買い物した代金や、お釣りが2の乗数だと「キリがいいな」と思ったりな。

>>878
この仕様変更ってさ、容易にスタックオーバーフロー招きそうじゃね?
C99の仕様よく知らないけど。
880デフォルトの名無しさん:2007/11/28(水) 14:48:20
最近のOSってスタックサイズ可変じゃね?
881デフォルトの名無しさん:2007/11/28(水) 14:55:57
>>879
今時、ちょっとしたバッファに使うような数キロバイトの配列程度でスタックオーバフローなんかしないでしょ。
制限は>878にある通りなんだから、大量に確保したり再確保するような用途にはどうせ使えないわけだし。
882デフォルトの名無しさん:2007/11/28(水) 15:00:59
>>879
内部的にはヒープに確保することもできるから、必ずしもスタックオーバーフローに繋がるわけでもない
それよりも、longjmpですっ飛ばした場合は解放されない(という実装も許される)ってことの方が気になる
883デフォルトの名無しさん:2007/11/28(水) 15:47:29
例えば関数の引数で配列要素数を受け取り、関数内で
一時的にその要素数分のスタックを確保した場合、
引数にうっかりバグって20億要素とか渡ると大変なことにならね?
884デフォルトの名無しさん:2007/11/28(水) 15:56:25
大変だね。
885デフォルトの名無しさん:2007/11/28(水) 16:16:06
大変だよ
886デフォルトの名無しさん:2007/11/28(水) 22:07:50
printf互換関数を作るにはどうすれば?
%.3lfとか%dとかを複数できるようにしたいです。
ちなみに一つだけなら
void set(int,int,const char*, ...);
でできましたが複数だとできません。
教えてください。
887デフォルトの名無しさん:2007/11/28(水) 22:16:42
>>886
va_arg でぐぐる
888デフォルトの名無しさん:2007/11/28(水) 22:25:43
1つだとできたんなら、そのくらいは分かってるんじゃない?

複数だと、自分で1つ目のフォーマットを大雑把でいいから解析して、
va_list の値を自分で進めてから、2度目の vprintf を実行する形になるんじゃないかなあ。
889886:2007/11/28(水) 22:35:13
char* FormatFunc(char* buffer, const char* format, ...)
{
va_list ap;
va_start(ap, format);
vsprintf(buffer, format, ap);
va_end(ap);
return buffer;
}

これでいいのかな?
890デフォルトの名無しさん:2007/11/28(水) 23:53:53
整数の分割を求めるアルゴリズムを考えているのですがわからないのでアドバイスお願いします。

ここでいう整数nの分割とはn=5の場合
5; 4,1; 3,2; 3,1,1; 2,2,1; 2,1,1,1; 1,1,1,1,1 の7つの数字の組のことです。
2次元配列を使った形でお願いします。再帰とか使うんでしょうがいまいちわかりませんでした。

出力は2次元配列の形で代入し、
整数nを入力してください
n=5
No.1: 5         ( a[0][0]=5 )
No.2: 4,1         ( a[1][0]=4, a[1][1]=1 )
・・・
No.7: 1,1,1,1,1     ( a[6][0]=1, a[6][1]=1, ..., a[6][4]=1 )
というふうにしたいです。

/***出力表示部分は以下のように考えました***/

for(i=0; a[i][0] > 0; i++){
printf("No.%d:", i+1);
for(j=0; a[i][j] > 0; j++){
printf("%d,", a[i][j]);
}
printf("\n");
}
891デフォルトの名無しさん:2007/11/29(木) 06:38:28
統合開発環境なににしよか迷っているんですが

アドバイスください。。。orz

892デフォルトの名無しさん:2007/11/29(木) 06:42:06
>>891
VisualC++
893デフォルトの名無しさん:2007/11/29(木) 06:49:14
>>892


Visual C++ 2005 Express Edition

正確には↑ですよね?無料の
894デフォルトの名無しさん:2007/11/29(木) 06:50:07
うん
895デフォルトの名無しさん:2007/11/29(木) 06:53:04
市販の
Visual Studio 2005 Academic Edition
とはなにが違うか分かります?


Visual C++ 2005 Express Edition で十分?
896デフォルトの名無しさん:2007/11/29(木) 07:12:13
Academicの中身はStandard相当
各Editionの機能比較はここ
http://www.microsoft.com/japan/msdn/vstudio/products/compare/default.aspx
多分君なら当面はExpressで十分
VisualStudio2008の英語版は出てるし日本語版ももうすぐ出るよ
買うなら2005は買わずにもうちょい待った方がいい
http://www.microsoft.com/japan/msdn/vstudio/
897デフォルトの名無しさん:2007/11/29(木) 07:20:32
>>896
いや〜ありがとう。
898デフォルトの名無しさん:2007/11/29(木) 15:08:14
なんでこの程度も自分で調べないのかね
899デフォルトの名無しさん:2007/11/29(木) 17:05:13
ワイド文字列がうまく表示出来ないのですが、なぜなんでしょうか。
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>

/* 定数 */
#define DELIMITER L"/ ,、" /* 区切り文字 */

/**
* 文字列を分割する
*/
int main(void)
{
wchar_t str[] = L"Unix/Linuxサーバ、Windows, Solaris";
wchar_t *token;
wchar_t *data[10];
int count = 0;

setlocale(LC_ALL, "ja"); /* ロケールを日本語に設定 */

token = wcstok(str, DELIMITER);
while (token != NULL)
{
data[count] = token;
token = wcstok(NULL, DELIMITER);
count++;
}
900デフォルトの名無しさん:2007/11/29(木) 17:06:09
wprintf(L"data[0]=[%s]\n", data[0]);
wprintf(L"data[1]=[%s]\n", data[1]);
wprintf(L"data[2]=[%s]\n", data[2]);
wprintf(L"data[3]=[%s]\n", data[3]);

return EXIT_SUCCESS;
}
901デフォルトの名無しさん:2007/11/29(木) 17:09:31
"ja" っていうのがダメなんじゃね?
"jpn" か "japanese" にしてみたら?
902デフォルトの名無しさん:2007/11/29(木) 17:13:23
".932"
とか
"Japanese_Japan.932"
だと出るよ
903デフォルトの名無しさん:2007/11/29(木) 17:17:36
うお!!
ありがとうございます!!!
904デフォルトの名無しさん:2007/11/29(木) 17:18:23
>>890
取り合えず吐き出し方だけ。
#define N 5
void foo(void)
{
int i,j,k;

for(i = N;i > 0;i--){
for(j = 1;i+j <= N;j++){
if(j <= i){
printf("%d:%d",i,j);
for(k = 1;i+j+k <= N;k++) printf(":1");
printf("\n");
}
}
}
}
905デフォルトの名無しさん:2007/11/29(木) 17:27:04
<LI>を一つの区切りとして文字列を分割することって出来ますかね?
906904:2007/11/29(木) 17:47:59
あー、ごめん。>>904はみなかったことにして。
5の分解しか考えてなかった。6とかだと不足がでるわ
907デフォルトの名無しさん:2007/11/29(木) 18:03:59
iを変数として
*i++;
という表現をしたらエラーになったのですが、
何がまずかったのでしょうか。
*i = *i + 1;
とするとエラーは消えたのですが、原因が気になります。
908デフォルトの名無しさん:2007/11/29(木) 18:09:20
(*i)++;
909デフォルトの名無しさん:2007/11/29(木) 18:17:32
array[ M ][ N ] (M、N : 定数)
という配列を動的にメモリに確保するにはどうすればよいのでしょうか?

一次元配列であれば先頭ポインタを作っておいてmallocで確保すればよいだけですが・・・
910デフォルトの名無しさん:2007/11/29(木) 18:27:55
>>909
無理。

一次元で確保して、オフセット計算しつつアクセスする
int *array = (int *)malloc(sizeof(int) * M * N);
配列[m][n]にアクセスしたい時に
array[m * N + n]

もしくは、ポインタの配列を確保する
int **array = (int **)malloc(sizeof(int *) * M);
for (int i = 0; i < M; i++){
 array[i] = (int *)malloc(sizeof(int) * N);
}
911909:2007/11/29(木) 18:47:47
>>910
なるほどー。
ありがとうございました!
912デフォルトの名無しさん:2007/11/29(木) 18:50:34
>>908
スマートな表現をありがとうございます。
とりあえず×と区別が付かないからエラーになったと解釈することにしました。
913デフォルトの名無しさん:2007/11/29(木) 18:53:53
>>912
つーか、*i++だと結合規則の関係で*(i++)と解釈されるってだけの話だけどね。
914デフォルトの名無しさん:2007/11/29(木) 20:12:27
struct test {
char c1;
char c2;
char c3;
int i;
} st;
このような構造体にバイナリファイルから値を読込みたいとき
fp = fopen("xxx.bin", "rb");

fread( &st, 1, sizeof(st), fp );
ではアライメントの為ずれてしまうので、
コンパイラスイッチでアライメントを1バイトにするか

fread( &st.c1, 1, sizeof(char), fp );
fread( &st.c2, 1, sizeof(char), fp );
fread( &st.c3, 1, sizeof(char), fp );
fread( &st.i, 1, sizeof(int), fp );
としたら出来たのですが、こんなので良いのでしょうか?

もっと良い解決方法などありましたら教えてください。
915デフォルトの名無しさん:2007/11/29(木) 20:17:54
>>914
st.c1 = fgetc(fp);
st.c2 = fgetc(fp);
st.c3 = fgetc(fp);
fread(& st.i, sizeof(int), 1, fp);
// fread()の第2パラメータはサイズ、第3パラメータは個数
916デフォルトの名無しさん:2007/11/29(木) 20:20:53
1個ずつ読むのがいいと思うけどね
コンパイラスイッチに期待するくらいなら #pragma pack とか __attribute__((__packed__)) の方がマシ
917デフォルトの名無しさん:2007/11/29(木) 20:56:17
>>914
union使って全体をchar型の配列で覆って
アラインメントさせないようにする
918デフォルトの名無しさん:2007/11/29(木) 21:10:25
本日高水準ファイル入出力と低水準ファイル入出力を覚えた?んですが、
低水準って使う機会あるんでしょうか?
マニュアルには、高水準のみでいい みたいなことが('A`
919デフォルトの名無しさん:2007/11/29(木) 21:22:41
#include <loli.h>

#include <loli/loli.h>
#include <pedo/loli.h>
って必ず別物として扱ってもらえますか?
同じ名前で public ヘッダと private ヘッダに分けたいのですが。
920914:2007/11/29(木) 21:40:56
>>915
ありがとうございます。
助かりました。freadをずっと間違えて使う羽目になる所でした・・・
>>916
ありがとうございます。
__attribute__((__packed__))というのは初めて見ましたので
調べてみます。
>>917
ありがとうございます。
よく分からないのですが、これから考えてみます。
921デフォルトの名無しさん:2007/11/29(木) 21:41:00
インクルードパスの指定次第

/usr/include/loli.h
/usr/include/loli/loli.h
/usr/include/pedo/loli.h

/usr/include/
で検索したら別物として扱えるけど
/usr/include/loli/
で検索したら
#include <loli.h>

/usr/include/loli/loli.h
922デフォルトの名無しさん:2007/11/29(木) 21:52:53
>>918
移植性よりも、OS固有の細かい指定が必要なときに使うことがある。
923デフォルトの名無しさん:2007/11/29(木) 23:01:49
>>918
そういうもの(低レベルI/O)がある、ってことを知っとけば十分じゃないかな。
あんまり使う機会はないけど、「何かの機能」が有るか無いかって知識は、
持っておいて損はないと思う。
というかPGなんて、そういうメタ情報の塊じゃなかろうか。
924デフォルトの名無しさん:2007/11/30(金) 00:18:04
>>920
>917は無理。調べるだけ無駄。
925デフォルトの名無しさん:2007/11/30(金) 01:17:50
malloc関数でエラーにならない・・・
正常には動作するんだけど、エラーを出したいんです。
自己参照構造体での課題でMS-DOS端末で、予め構造体配列を50個とったら
スタックエラーで実行すらできず、んなら自己参照で次々にこちらが入力した情報にそって構造体を作成していけばエラーが出るんじゃ?
と思いやってみましたが、延々と入力でき、エラーが出ませんでした。
入力したものを出力したらDOSが落ちましたけど・・・。
でWindowsにて登録部分を無限ループにしたらメモリ大量に消費したのまではよかったんですが、やはりエラーが出ずにWindowsが操作不能になる始末です。
if(p = (struct list *)malloc(sizeof(struct list))) == NULL)
{ puts("malloc error"); exit(1); }
これであってますよね?メモリが取れないときの制御文って。
926デフォルトの名無しさん:2007/11/30(金) 01:29:26
誘導されてきました。↓の式を求めたいのですが、
  k l
n(ΣΣn^2ij /ni * nj - 1) = χ^2
 i=1j=1

ちなみに、k=2 l = 2で、2×2の表があります。
iは行番号、jは列番号
ni = n11 + n12 … + n1j
nj = n11 + n21 … + ni1
927デフォルトの名無しさん:2007/11/30(金) 01:30:39
これを解くために、↓を組んでみたのですが、全然違う答えになります。
どこがおかしいのでしょうか……orzC言語というよりも数学の問題よりではありますが……。

double kai = 0.0;
int i, j;
int a[2][2] = {{54, 66},
          {63, 117}};

int gyo[2] = {a[0][0] + a[0][1], a[1][0] + a[1][1]};
int retu[2] = { a[0][0] + a[1][0], a[0][1] + a[1][1]};

for (i = 0; i < 2; i++)
   for (j = 0; j < 2; j++)
    kai += ((double)(a[i][j] * a[i][j]) / (gyo[i] * retu[j]));
kai -= 1.0;
kai *= 4.0;

printf("答え:%f\n", kai);
928デフォルトの名無しさん:2007/11/30(金) 01:32:41
数学の問題だね
気になるのはかっこは正確?実は違っていたりしない?
929デフォルトの名無しさん:2007/11/30(金) 01:35:04
>>926
数式はそのまんま写しているので間違ってはないです。
ただ、プログラミングのほうは多分あってるとしか……。
930デフォルトの名無しさん:2007/11/30(金) 01:37:58
>>926
数式を画像で上げてくれたほうがありがたい
931デフォルトの名無しさん:2007/11/30(金) 01:40:17
>>930
だな
どうもどこからどこまでが掛け算なのかわからんが
おれの思ったとおりなら一応配列用意してあとはwhile文で足し算繰り返すだけで終わるはず
932デフォルトの名無しさん:2007/11/30(金) 01:54:18
>>930
うpしました。
http://www.vipper.org/vip679492.jpg

>>931
ホントですか?
希望がみえてきた……!
933デフォルトの名無しさん:2007/11/30(金) 02:02:22
n*j…?わ、わからん…nijの定義すらわからん
934デフォルトの名無しさん:2007/11/30(金) 02:03:34
引数のとり方が
int hoge::func(int argnum, ...){ ・・・ }
ではなく
int hoge::func(...){ ・・・ }
という形の関数を実装する方法がわかりません。
(引数の個数はhogeクラスのメンバ変数に予め書き込んであります)

va_list等は"..."の直前の引数のアドレスから"..."の部分の
アドレスを求めているようなので無理でした。

メンバ関数ポインタとインスタンスから
引数のアドレスを求められたりはするのでしょうか?
お願いします。
935デフォルトの名無しさん:2007/11/30(金) 02:06:27
>>932
そもそもこの行列の場合、どういった答えが出たら正しいんだ?
936デフォルトの名無しさん:2007/11/30(金) 02:09:18
>>933
nijは「i×jの表の、i行目のj列目の数」という意味です。
niとnjの定義は>>926の通りです。
ようするに、i行目を全部たしたものと、j列目を全部足したものです。

>>935
>>927の表のばあい(配列aがそのまま表になっています)
3〜10の間におさまるはずです。
937デフォルトの名無しさん:2007/11/30(金) 02:17:52
>>936
最後で4倍してる意味は?
938デフォルトの名無しさん:2007/11/30(金) 02:22:24
質問です。
多次元配列を可変にしたいのです。
要素を可変長にするのではなく

str[][]
str[][][]
str[][][][]

こんな感じで変えれるようにしたいのです。
もちろん、実行時の最初のmalloc実行時に決定されてしまうのでも構いませんが
同じバイナリで可変に出来れば問題ありません。

このような方法はどのようにするのでしょうか?
939デフォルトの名無しさん:2007/11/30(金) 02:25:34
どうして可変にしたいのかが理解できない
使う方も合わせなきゃいけないだろ?
940デフォルトの名無しさん:2007/11/30(金) 02:32:30
>>934
n=4だからです。つまり2×2の表なので要素数が4つってことで。
描けてい理由は、>>932の画像の式の通りにかけているだけです。

>>938
ポインタとかじゃだめなの?
941デフォルトの名無しさん:2007/11/30(金) 02:41:49
>>940
各添え字には、i、i+1、i+2と言う具合に入れる予定で
例えば
#define N 3
for(int i=0; i<N; i++){

}
942デフォルトの名無しさん:2007/11/30(金) 02:43:46
あああ、間違いに気付きました!
nは全部の要素数でした。すみません。
>>937の指摘でわかりました。
答えがようやくでました。

どうもありがとうございました。
943937:2007/11/30(金) 02:48:56
なんか良く分からんが役立ったようだwww
944デフォルトの名無しさん:2007/11/30(金) 03:13:04
>>934
無理。C/C++の可変個引数では、
可変個でない(明示的な)引数が少なくとも1つないと無理。
945934:2007/11/30(金) 03:41:55
>>944
そうですか・・・ありがとうございます
あきらめがつきました
別の方法/仕様を模索することにします
946デフォルトの名無しさん:2007/11/30(金) 03:49:52
>>945
最低1個引き数を用意するだけでいいと思うのだけど。
つまり、呼び出し側で
個数が0個のときにfunc()と呼ぶ代わりにfunc(0)とでもしてもらうってことで。
勿論、個数が1個以上ならfunc(a), func(a, b)などは同じようにできるのだし。
尤も、C++なら無理に可変個引き数にしなくても引き数セットのクラスを作ればいいのだけれど。
947946:2007/11/30(金) 03:51:06
って、回答してから気がついた。ここCスレじゃんw
ってことで>>934、あんたスレ違いだから。
948デフォルトの名無しさん:2007/11/30(金) 04:28:36
なぜwhile (*s++ = *t++);で文字列がコピーできるの?
949デフォルトの名無しさん:2007/11/30(金) 05:24:17
最後に*sに'\0'をコピーした時点で終了するから。
950デフォルトの名無しさん:2007/11/30(金) 05:47:15
#include <stdio.h>
#define N 10
void main(void)
{
int a[N];
int n=0;
int i,j,x;

printf("データを入力 データ数の上限は10、下限は1\n");
printf("終了時は CTRL+d を押下\n");
while(n<N && scanf("%d",&a[n])!=EOF) ++n;
for(i=2;i<=n;i++){
x=a[i];
a[0]=a[i];
j=i-1;
while(x>a[j]){
a[j+1]=a[j];
j--;}
a[j+1]=x;
}
printf("%d",&a[0]);
}

データ数の上限が10個で、データを降順に並べ替えて出力するプログラムつくれ
って宿題が出たんですが、コンパイルして実行しても全く関係ない文字列が
出力されます。
おかしいところがよくわからんのですが、教えてください。よろしくお願いします。
951デフォルトの名無しさん:2007/11/30(金) 05:53:59
最後の出力のとこ間違えた。
for( b=0; b<n; b++ ) {
printf("value[%d] = %d\n", b, a[b]);}
でした
952デフォルトの名無しさん:2007/11/30(金) 06:33:17
>>950
良く分からんかったからバブルソートにしたw
#include <stdio.h>
#define N 10
main(){
int a[N];
int n=0;
int i,j,x,b;

printf("データを入力 データ数の上限は10、下限は1\n");
printf("終了時は CTRL+d を押下\n");
while(n<N && scanf("%d",&a[n])!=EOF) ++n;
for(j=n;j>=1;j--){
for(i=0;i<j-1;i++){
if(a[i]<a[i+1]){
x=a[i+1];
a[i+1]=a[i];
a[i]=x;
}
}
}
for( b=0; b<n; b++ ) printf("value[%d] = %d\n", b, a[b]);
}
一応動くけど、書き方悪いと思うから推敲してね
953デフォルトの名無しさん:2007/11/30(金) 07:37:07
>>950

どう入力をしたらどう出力された?
それが無いとわからん。

ただ、scanf()はあまり使わんほうがいいよ。
簡単にバッファオーバーフローするから。
954デフォルトの名無しさん:2007/11/30(金) 08:58:48
>簡単にバッファオーバーフローするから。
ほほ〜
実例希望。
955デフォルトの名無しさん:2007/11/30(金) 09:05:45
どうせ学校の宿題なんだろうし、特に指定が無い限りscanf使った方が楽でいい
956デフォルトの名無しさん:2007/11/30(金) 10:34:09
>>925
DOSの方はプログラムに何かバグがあるんだろう。
Windowsの方は、仮想記憶があるので物理RAMがいくらだろうと1プロセス
で2GBぐらいまでmalloc()できる。でも、もちろんたくさんメモリ確保す
ると著しくパフォーマンスが落ちる。
957デフォルトの名無しさん:2007/11/30(金) 11:43:22
プログラムを実行したときの関数呼び出しを全てログに取る方法ってないでしょうか?
要するにすべての関数の中に
printf("関数名\n");
を入れればいいのですが、それを簡単にやる方法はないでしょうか。
コンパイラはgccなのでgdbを使ってもいいんですが。
よろしくお願いします。
958デフォルトの名無しさん:2007/11/30(金) 12:31:09
>>957
プロファイラー

cc -pg
959デフォルトの名無しさん:2007/11/30(金) 13:00:25
>>957
cc -c foo.c -p
cc foo.o -p
./a.out
gprof
960デフォルトの名無しさん:2007/11/30(金) 15:12:46
system("    ")の中身を標準入力から指定できますか?
例えば./a.out data.txtとしてdata.txtを表示させたいときには
system("cat ???");どうすればいいですか?
961デフォルトの名無しさん:2007/11/30(金) 15:14:31
>>960
sprintf()でも使って繋げばよろしかろ。
962957:2007/11/30(金) 16:03:31
>>958 >>959
この辺でできそうなことがわかりました。ありがとうございます。

DSAS開発者の部屋:オープンソースを楽しむエンジニアの二日目 - ftraceコマンドを書く
http://dsas.blog.klab.org/archives/51025093.html
Index of /~krahmer/instrumental
http://www.suse.de/~krahmer/instrumental/
963デフォルトの名無しさん:2007/11/30(金) 17:07:21
文字列を逆にして返す関数を作りたいのですが
どうやったら逆にコピーできるんですか?
誰か教えてください

964デフォルトの名無しさん:2007/11/30(金) 17:21:50
>>963
1文字ずつコピーするんだよ
965デフォルトの名無しさん:2007/11/30(金) 17:22:06
同じchar配列を書き換えていいのなら、
void rev(char *buf) {
int i, len = strlen(buf);
char c;
for (i = 0; i < len / 2; i++) {
c = buf[i];
buf[i] = buf[len - 1 - i];
buf[len - 1 - i] = c;
}
}
int main() {
char buf[64];
strcpy(buf, "abcdef");
printf("%s\n", buf);
rev(buf);
printf("%s\n", buf);
return 0;
}
966デフォルトの名無しさん:2007/11/30(金) 17:39:37
日本語判定が無髄
967デフォルトの名無しさん:2007/11/30(金) 17:56:33
そうか。Cでするときはどうするんだろうね。
チマチマ頑張るのか、それ用の何かがあるのか。
968デフォルトの名無しさん:2007/11/30(金) 17:57:28
>>965
なるほど〜ありがとうございます。
ただちょっと自分頭が弱いみたいで
for (i = 0; i < len / 2; i++)
この部分が完全に理解できてないです。
確かに実行するとちゃんと逆にコピーしてくれますが何故 len/2なのでしょうか?
ずっとlenだと思ってて、だけど半分しか逆にならないっていう感じでした…
969デフォルトの名無しさん:2007/11/30(金) 18:00:15
入れ替えてるから半分でいいんだろ
最後までって、単にコピーしてたんじゃ
後半は前半コピーしたやつを書き戻すだけだから半分にみえるだろうな
970デフォルトの名無しさん:2007/11/30(金) 18:05:06
>>968
最終的には、前の半分を後ろの半分と置き換えてるんです。
前から0番目と、後から0番目を交換、
前から1番目と、後から1番目を交換、
 :
 :
前からlen/2番目と、後からlen/2番目を交換、
ここまでで達成しており、len番目まで交換すると、
どうなるでしょうか。元に戻ってしまうことがわかります。
971デフォルトの名無しさん:2007/11/30(金) 18:07:02
訂正:
前からlen/2 - 1番目と、後からlen/2 - 1番目を交換、
ここまでで達成しており、len - 1番目まで交換すると、
972デフォルトの名無しさん:2007/11/30(金) 18:07:30
課題なら馬鹿ソートでいいじゃん
973デフォルトの名無しさん:2007/11/30(金) 18:27:34
ボゴソートがなんだって?
974デフォルトの名無しさん:2007/11/30(金) 18:29:28
>>969-970
詳しく解説ありがとう
「交換してた」ってことだったんですね!
確かに交換してるなら半分で交換を止めないと残り半分は元通りに戻っちゃいますね
どうりでおかしかったわけだ 親切にどうもです

前から0番目に後から0番目をコピー
前から1番目に後から1番目をコピー、
 :
 :
こう考えてしまってました・・・

975デフォルトの名無しさん:2007/11/30(金) 18:36:04
char* pStr = "123456";

これを2バイトずつ分割して、char型の1バイト10進数値(12,34,56)
に変換したいのですが、

先頭から2バイト取出し(適当な配列へ格納)
 ↓
atoi関数でint型整数へ変換
 ↓
これを、char型へキャストして、最終的に格納したいchar型配列へ
 ↓
次の2バイト文字へポインタ移動
 ↓
ここまでのフローをあと2回繰り返し

自分としては、こういった処理を考えています。
これでも出来るとは思うのですが、ほかにスマートな方法等あれば
教えてください。

976デフォルトの名無しさん:2007/11/30(金) 18:53:38
スマートじゃねーけど、
sscanf(pStr, "%2d%2d%2d", &a,&b,&c);
とか
977デフォルトの名無しさん:2007/11/30(金) 19:07:19
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main() {
char *pStr = "123456";
char tmp[3] = {};

int i=0;
do {
memcpy(tmp, (pStr+i), 2);
printf("%s\n", tmp);
i+=2;
}
while (*(pStr+i+1) != '\0');
}
978デフォルトの名無しさん:2007/11/30(金) 19:22:14
returnするの忘れてた
この方法ならpStrの文字数が偶数であるなら
何文字でも可能
forならもっとスマートになるかも
979デフォルトの名無しさん:2007/11/30(金) 19:37:06
>>796さんの案をパクッて、
int main() {
char *pStr = "123456";
char charvalue, *p, *tail = pStr + strlen(pStr);
int intvalue;
for (p = pStr; p < tail; p += 2) {
sscanf(p, "%2d", &intvalue);
charvalue = (char)intvalue;
printf("%d ", charvalue);
}
return 0;
}
980デフォルトの名無しさん:2007/11/30(金) 19:38:32
訂正:
>>976さんの案をパクッて…と言うより、ほとんど>>975の手順のままだけど、
981デフォルトの名無しさん:2007/11/30(金) 20:21:07
一旦、atoi関数でint型へ変換してからchar型へキャストするのが、
どうもすっきりしないでいました。
>>977さんのサンプルだと、memcpy関数を使えば、char*型のみでコピー
できますね。
文字列は、14バイト(NULL文字含むと15バイト)固定なので、2バイトずつ
ポインタ移動しながらmemcpyを繰り返していけると思います。
皆さん、ありがとうございました。

982デフォルトの名無しさん:2007/11/30(金) 20:23:53
マクロ名について質問させてください。

除算は「DIVISION」ですが
除算しないは何て記述するのが一番適切ですか?
983デフォルトの名無しさん:2007/11/30(金) 20:27:26
あっ除算しないじゃなくて、除算以外でした・・・
984デフォルトの名無しさん:2007/11/30(金) 20:28:43
>>977
それだったらmemcpyしなくても、printf("%.2s\n", pStr + i)で十分じゃないか?
985983:2007/11/30(金) 20:34:23
あっすいません
解決しました・・・
986977:2007/11/30(金) 21:05:33
>>984
表示するだけならね
でも、スマートにコピーする方法というのが今回の問題点
987890:2007/11/30(金) 21:26:22
890ですが他で聞いてみます。
904さん考えていただきありがとうございました
988デフォルトの名無しさん:2007/11/30(金) 21:51:26
>>938
事前に定義できるならunion(共用体)。
まあ配列程度なら普通に定数なりとかけ合わせて位置取る方が楽だろうけど
989デフォルトの名無しさん:2007/11/30(金) 22:37:38
char cBuf[2];
char c;

for( n=0; n<strlen(pStr); n+=2 )
{
 strncpy( cBuf, pStr+n, 2 );
 c = (char)atoi(cBuf);
 printf( "%d", c );
}

???
990デフォルトの名無しさん:2007/12/01(土) 00:37:40
BCC developerを使ってるんですが、線を描画するライブラリとかりますか?
ある座標からある座標に線を引きたいんです
991デフォルトの名無しさん:2007/12/01(土) 01:44:58
MoveToEx と LineTo
992デフォルトの名無しさん:2007/12/01(土) 02:33:33
共用体って何か意義あるの?
構造体で十分な気がするけど……?
993デフォルトの名無しさん:2007/12/01(土) 02:35:12
IPアドレス
994904:2007/12/01(土) 04:24:17
>>890,987
多分今度こそコレでいい……はず。

#include <stdio.h>
#define NumMax 100

void print_numbers(int *numList)
{
int i = 0,len;
while(numList[i++] != 0) ;
len = i-2;
for(i = 0;i < len;i++) printf("%d,",numList[i]);
printf("%d\n",numList[i]);

}
995904:2007/12/01(土) 04:24:51
>>994の続き

void foo(int *numList,int n,int limit,int targetIndex,int len,)
{
int tempList[NumMax] = {0};

if(limit >= n || targetIndex >= len) return;

memcpy(tempList,numList,sizeof(int)*n);

if(tempList[targetIndex] < limit && len >= 1){
if(targetIndex < 1 || tempList[targetIndex] < tempList[targetIndex-1]){
tempList[targetIndex]++; tempList[len--] = 0;
print_numbers(tempList);
foo(tempList,n,2,targetIndex+1,len);
}
}
foo(tempList,n,limit+1,targetIndex,len);
}
996904:2007/12/01(土) 04:25:43
>>995の続き

int main(void)
{
int i,n,numList[NumMax+1] = {0};

printf("INPUT:");
scanf("%d",&n);
if(n > NumMax) n = NumMax;

for(i = 0;i < n;i++) numList[i] = 1;
numList[i] = 0; /* 12:1,1,1,1,1,1,1,1,1,1,1,1 */
foo(numList,n,1,0,n-1);

return 0;
}

駄目だったらゴメンナサイってことで。
997デフォルトの名無しさん:2007/12/01(土) 09:49:17
>>992
そもそも共用体と構造体は使用目的が違うので比較すること自体が無意味
だから、「構造体で十分・・・」はない

怪人二十面相のようなデータ
あるときはint、あるときはfloat、はたまたあることは構造体A、そしてあるときは構造体B
こんなデータを参照するときに使う

そんなデータがあるかって!?
998デフォルトの名無しさん:2007/12/01(土) 09:52:21
なにそのvariant型
999デフォルトの名無しさん:2007/12/01(土) 11:23:44
999
1000デフォルトの名無しさん:2007/12/01(土) 11:24:51
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。