C言語なら俺に聞け(入門篇) Part 21
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2007/11/07(水) 06:24:18・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/
0002デフォルトの名無しさん
2007/11/07(水) 06:25:04Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/
Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/
Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/
Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/
Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/
Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/
Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/
Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/
Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/
Part 12 ttp://pc11.2ch.net/test/read.cgi/tech/1178620766/
Part 13 ttp://pc11.2ch.net/test/read.cgi/tech/1179301993/
Part 14 ttp://pc11.2ch.net/test/read.cgi/tech/1181735298/
Part 15 ttp://pc11.2ch.net/test/read.cgi/tech/1182719692/
Part 16 ttp://pc11.2ch.net/test/read.cgi/tech/1184003625/
Part 17 ttp://pc11.2ch.net/test/read.cgi/tech/1185286631/
Part 18 ttp://pc11.2ch.net/test/read.cgi/tech/1187213990/
Part 19 ttp://pc11.2ch.net/test/read.cgi/tech/1190342593/
0003デフォルトの名無しさん
2007/11/07(水) 06:25:50ともあれ>>1乙
0004デフォルトの名無しさん
2007/11/07(水) 07:46:40現在WAVEの単純音データに離散フーリエ変換を行ってそのデータをExcelでグラフ化しているのですが
フーリエが終わってデータを格納した後、それをグラフにおこして別窓で表示させたいのですがどのようなプログラムをかけばいいのでしょうか?
またそのような事が詳しくかかれているHPなど参考になるところがありましたら是非紹介をお願いします。
わかりにくくてすみません。
0005デフォルトの名無しさん
2007/11/07(水) 13:09:44窓の開き方がわからないとか、図形の表示の仕方がわからない?
その場合は Win32 API を勉強
0006デフォルトの名無しさん
2007/11/07(水) 13:23:410007デフォルトの名無しさん
2007/11/07(水) 14:51:32上記とは別にルーレット選択とボルツマン選択のサンプルプログラムもよろしくお願いします。
プログラムはC言語でお願いします。 どうもこれらがイメージつかないんでお願いします。
0008デフォルトの名無しさん
2007/11/07(水) 15:30:37スレ違い。
つーか、マルチすんなや。
http://pc11.2ch.net/test/read.cgi/tech/1193150915/961
http://pc11.2ch.net/test/read.cgi/tech/1193556424/227
ちゃんと↑の228にレスついているだろ。
0009デフォルトの名無しさん
2007/11/07(水) 15:43:420010デフォルトの名無しさん
2007/11/07(水) 15:54:26違う。つーか、入門者はそんなこと気にしなくて構いません。
0011デフォルトの名無しさん
2007/11/07(水) 15:57:520012sage
2007/11/07(水) 16:01:08ちょっと気にしてるんだよ。
やっぱgccか・・・?
デバッガ使うスキルがないんで確認ができないんだよね。
0013デフォルトの名無しさん
2007/11/07(水) 16:03:15アセンブリ出力を読むスキルもない?
例えば、callってニモニックがどこに散らばっているか位読めれば末尾再帰が展開されたかどうか判るんだけど。
つーか、スレ違い脱中年。
0014デフォルトの名無しさん
2007/11/07(水) 16:03:350015デフォルトの名無しさん
2007/11/07(水) 16:05:190016デフォルトの名無しさん
2007/11/07(水) 18:33:55-S でいいだろ
0017デフォルトの名無しさん
2007/11/07(水) 18:37:49VCだったら /FA かな
0018デフォルトの名無しさん
2007/11/07(水) 20:04:57コマンドラインからパスワード等の入力をするときは、標準入力にパスワードを入力してるのに
画面には入力した文字を表示しないようになってるよね。これってどうやって実装してるんですか?
fgets()などのC言語のライブラリ関数では、どうやればいいかわからない。。
0019デフォルトの名無しさん
2007/11/07(水) 20:30:32を読めば分かると思うが、通常は打った文字はechoされて画面に出る。
が、しかし、echoフラグを一時的に切れるような、getpassあたりの関数を使えば隠す事が可能になる。
詳しい実装方法は、getpass関数のソースを読めばわかると思うよ。
0021デフォルトの名無しさん
2007/11/07(水) 22:44:27struct e{
int value[];
};
を
int temp[256]
e num[256].value[256];
と宣言して
temp[i]にnumのvalueを一時的にまとめてコピーしたいのですが
temp[i]=num[i].value[];
といったことはできるのでしょうか?
0022デフォルトの名無しさん
2007/11/07(水) 22:51:470023デフォルトの名無しさん
2007/11/07(水) 22:58:20そのためにmemcpyがあるのですね。
できました。ありがとうございましt
0024デフォルトの名無しさん
2007/11/07(水) 23:26:07temp[]に
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
の縦の行、つまり 0 4 8 12 を一度に入れたいのですが
そういうやり方はfor使うしかないですかね
0025デフォルトの名無しさん
2007/11/07(水) 23:34:42gccだったら?
0026デフォルトの名無しさん
2007/11/07(水) 23:36:22一度にって表現がよくわからない。
0027デフォルトの名無しさん
2007/11/07(水) 23:39:260028デフォルトの名無しさん
2007/11/07(水) 23:44:570029デフォルトの名無しさん
2007/11/07(水) 23:46:240030デフォルトの名無しさん
2007/11/07(水) 23:51:22サンクス。
0031デフォルトの名無しさん
2007/11/07(水) 23:53:25二次元配列がメモリ上でどうなってるか考えてみればすぐわかるだろうに。
0032デフォルトの名無しさん
2007/11/08(木) 00:13:35まだまだトーシローな俺は
二次元配列のような格納できる関数でもあるのかとおもっちまったぜ・・・
0033デフォルトの名無しさん
2007/11/08(木) 00:19:20そうですね。諦めました
人間諦めが肝心
0034デフォルトの名無しさん
2007/11/08(木) 10:44:09struct e{
int value[256];
};
e tmp;
e num[256];
tmp = num[i];
0035デフォルトの名無しさん
2007/11/08(木) 12:58:14構造体同士の代入はできて配列同士の代入はできないて理不尽じゃね?
0036デフォルトの名無しさん
2007/11/08(木) 14:14:01いや別に。Cでは配列をそのまま扱うことはできないと諦めているからどうでもいいよ。
どうせ、関数にそのまま渡すことさえできないんだから。
0037デフォルトの名無しさん
2007/11/08(木) 14:23:10マルチ乙
0038デフォルトの名無しさん
2007/11/08(木) 14:34:56理不尽っつぅかそういう考え方なんだな。配列は一つの纏まったオブジェクトではない、と。
一つの纏まったオブジェクトにしたいなら、上のように構造体で包めばいい。
0039デフォルトの名無しさん
2007/11/08(木) 16:46:00マイナスの符号とかがあると変わってしまって表が汚くなります
0040デフォルトの名無しさん
2007/11/08(木) 16:51:290041デフォルトの名無しさん
2007/11/08(木) 16:58:330042デフォルトの名無しさん
2007/11/08(木) 17:01:40どうも!
0043デフォルトの名無しさん
2007/11/08(木) 17:44:24構造体も配列同様、コピーできなかったのも今は昔。
0044デフォルトの名無しさん
2007/11/08(木) 17:49:200045デフォルトの名無しさん
2007/11/08(木) 17:52:540046デフォルトの名無しさん
2007/11/08(木) 18:01:16IEEE754であれば、表わすことができる最大値が1e308程度なので、商がその値を超えなければ(精度は兎も角)解は得られる。
つまり、1/1e-308は1e308だが、10/1e-308は1e309なので無限大になってしまう。
尤も、無限大になっても特に危険はないので安心して0で割ればいいと思う。
0047デフォルトの名無しさん
2007/11/08(木) 18:05:381 / -1e-320はちゃんと-Infになるからね。
0048デフォルトの名無しさん
2007/11/08(木) 18:46:180で割るととまってしまうんですが・・・
0049デフォルトの名無しさん
2007/11/08(木) 18:49:53スゲー便利
0050デフォルトの名無しさん
2007/11/08(木) 20:06:220の除算をしたらプログラム割り込みが発生し、強制終了となる。
0051デフォルトの名無しさん
2007/11/08(木) 20:34:160052デフォルトの名無しさん
2007/11/08(木) 23:29:450で割ってるのに気がつかなくてはまったことがある
0053デフォルトの名無しさん
2007/11/09(金) 00:32:251
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とリダイレクトは絶対使わなければならないので、そこ以外を変更することで対処したいのです。
0054デフォルトの名無しさん
2007/11/09(金) 00:41:59scanfの戻り値を見ろ。あるいはscanf後にfeof(stdin)を見るという手も使えると思う。
0055デフォルトの名無しさん
2007/11/09(金) 05:47:16EOFとの比較は、「ほにゃららの場合はEOFになる」と明記されたものと行います。
例えばfgetc()のリターン値とか。
0056デフォルトの名無しさん
2007/11/09(金) 13:55:01dp=(double*)malloc(sizeof double);
コンパイル通らないよ
どうすればいい
0057デフォルトの名無しさん
2007/11/09(金) 13:59:32か
sizeof *dp
で
0058デフォルトの名無しさん
2007/11/09(金) 14:00:360059デフォルトの名無しさん
2007/11/09(金) 14:01:330060デフォルトの名無しさん
2007/11/09(金) 14:39:24for(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;
}
}
}
}
これだけだとただの列挙になってしまいます
最小値だけをだすにはどうしたらいいでしょうか?
0061デフォルトの名無しさん
2007/11/09(金) 19:05:00ありがとうございます。
ちょっと詳しくしらべてみます。
0062デフォルトの名無しさん
2007/11/10(土) 00:00:54int *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が入ると思ったのですが入らないのはなんでですか?
0063デフォルトの名無しさん
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);
}
助言をお願いします
0064デフォルトの名無しさん
2007/11/10(土) 00:03:44p[1].x[1] = 10;
こう入れないとだめなんですね
んで、 p[0].x[0] = 10;
だと表示ができるのですが
p[1].x[1] = 10;
だとエラーが出てしまいます。なんででしょうか
0065デフォルトの名無しさん
2007/11/10(土) 00:21:11p = (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]分を確保
0066デフォルトの名無しさん
2007/11/10(土) 00:22:29もし>>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);
}
0067デフォルトの名無しさん
2007/11/10(土) 00:23:47このたび仕事でC言語のソース解析を行うことになったのですが、コードリーディングのために便利なツールなどは無いでしょうか?
コード中の関数や構造体をダブルクリックすると、定義してあるソースまでジャンプしてくれたりしたら助かるのですが
よろしくお願いいたします
0068デフォルトの名無しさん
2007/11/10(土) 00:24:10p[0].x[0〜9]が確保されていて
p[1].xは確保されていなかったわけですね。
ありがとうございます。頭がスッキリニッコリ
ということは解放するときは
for(int i=0;i<10;i++)
free(p[i].x);
free( p );
こういう風にせんといかんわけですね。
0069デフォルトの名無しさん
2007/11/10(土) 00:26:36VisualStudioは、右クリックから定義へ移動って機能があるけど、Cでちゃんと動くかはわからない。
0070デフォルトの名無しさん
2007/11/10(土) 00:29:10それなりに動く。
たまにどのシンボルか選べってなることもあるけど。
0071デフォルトの名無しさん
2007/11/10(土) 00:30:21doxygenというのがあるよ
ttp://www.fides.dti.ne.jp/~oka-t/doxygen.html#sample
こんな感じでクラスや関数間の関係を可視化してくれる。
導入方法はここから
ttp://skazami.web.infoseek.co.jp/tools/Graphviz_Doxygen.htm
0072デフォルトの名無しさん
2007/11/10(土) 00:30:590073デフォルトの名無しさん
2007/11/10(土) 00:59:10例えば…
struct{
foo[]
};
で、配列の使用時に
foo[bar]; (barは最大値)
という風にしたいのですが…
それとも構造体の定義時にあらかじめ余裕をもって配列を定義してしまう方がいいですか?
0074デフォルトの名無しさん
2007/11/10(土) 01:15:34良く分からないなら、あらかじめ定義した方が良いだろうね。
0075デフォルトの名無しさん
2007/11/10(土) 01:23:53秀丸エディタにそういう機能あるよ。
0076デフォルトの名無しさん
2007/11/10(土) 01:48:32ありがとうございます。
正直よくわからないので、助言どおり余裕を持って最初に定義してしまうことにします…すんません。
0077デフォルトの名無しさん
2007/11/10(土) 05:16:10for(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++)で上下反転。
0078デフォルトの名無しさん
2007/11/10(土) 10:33:24まったくワカリマセン(´・ω・`)・・どなたか助けてください
↓こんなの
***
**
*
0079デフォルトの名無しさん
2007/11/10(土) 10:39:04宿題スレ池
#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;
}
008078
2007/11/10(土) 10:43:36ありがとうございます
そうさせていただきます・・w
0081デフォルトの名無しさん
2007/11/10(土) 11:47:01今C言語の勉強をしていて、Cpadというエディターで書いたあとにコンパイルして
実行ボタンを押して実行しています。
コマンドプロンプトが表示されて、処理が実行されますが一回で終わってしまいます。
例えば「ある数をscanfして、それに2を加えた数をprintfする」というプログラムのとき
結果が出力されたあとに、またscanfに戻るって何度もプログラムを続けることってできないですか?
説明下手ですが、宜しくお願いします。
0082デフォルトの名無しさん
2007/11/10(土) 11:49:57for(;;) {
scanf(・・・);
printf(・・・);
}
0083デフォルトの名無しさん
2007/11/10(土) 12:02:25ありがとうございます。それで指定した数までは終了しないようになりました。
#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になるのはなぜなんだろう…
0084デフォルトの名無しさん
2007/11/10(土) 12:04:31a の値を表示させてないからじゃないかな
0085デフォルトの名無しさん
2007/11/10(土) 12:04:370086デフォルトの名無しさん
2007/11/10(土) 12:08:30迅速なレスありがとうございます。
間違っていました…。
でも今度は結果が3926が出力されるようになりました。
今日手探りで色々入れたので、もしかしたら環境の問題なのかもしれません。
ちょっと色々試してみます。ありがとうございました。
0087デフォルトの名無しさん
2007/11/10(土) 12:10:42printf("%d\n", a); // & はいらない
0088デフォルトの名無しさん
2007/11/10(土) 12:32:05int r,g,b;
}
という構造体を
struct RGB *color;
color = (struct RGB *)malloc( sizeof(struct RGB) *10 );
と10個作って、各要素を足して4で割るということを続けていきたいのですが
(color[0]+color[1])/4
という感じに、構造体同士を足したりできるのでしょうか?
0089デフォルトの名無しさん
2007/11/10(土) 12:36:29ムリ。
0090デフォルトの名無しさん
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
としないといかんわけですか。
0092デフォルトの名無しさん
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行目で、
なぜ変数に関数を代入してるのかも意味が解りません。
0093デフォルトの名無しさん
2007/11/10(土) 13:47:26関数を実行した戻り値を代入しているんだ
009492
2007/11/10(土) 14:28:06レスありがとうございます。
関数を代入しているわけではなく、関数の戻り値を代入しているのですね。
なぜ、戻り値を代入しているのですか?
3行目は、二分探索木の有無の判定で、無い場合は、そのままNULLを
返して終了。
4〜5行目は、左部分木が無ければ、根が最小値なので、最小値の節点の
アドレスを入れる変数であるmに根のアドレスであるtを代入して、
それを返して終了。
なので、7行目以外は解るのですが、7行目はどういう処理をしてる
のですかね?
0095デフォルトの名無しさん
2007/11/10(土) 14:35:53tがNULL→NULLを返す
t->lがNULL→tが最小なのでtを返す
それ以外→t->lから始まる二分木で最小の物を返す
ok?
0096デフォルトの名無しさん
2007/11/10(土) 14:42:11○┘└○
○┘○┘└○
○┘ ・・・┘└・・・
○┘
009792
2007/11/10(土) 15:24:02はい、そこまでは解っています。どういう処理と言うか、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に
代入しても、最小値のアドレスになりませんよね…
0098デフォルトの名無しさん
2007/11/10(土) 15:44:58if(t->l == (struct node *)NULL)
に引っかかって
m = min(t->l);
が実行されずに
m=t
が実行されるので
if(t != (struct node *)NULL){
が偽になるのは再帰ではなく外から呼び出した場合だけ
009992
2007/11/10(土) 16:00:46確かに一番左下を再帰呼び出しした時に、
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);としているのですか?
0100デフォルトの名無しさん
2007/11/10(土) 16:19:20教えてください。
学校でユークリッドの互除法によって最大公約数を出すプログラムを
作ったんですが、これは2つの数の最大公約数を求めるものですよね。
もし3つとか6つとかの数の最大公約数を求めるんだったらどうプログラムするのが
一番なのでしょうか?ユークリッドを工夫すれば出来るでしょうか。
0101デフォルトの名無しさん
2007/11/10(土) 16:22:55メイン関数に返るのではなく呼び出した関数の呼び出した位置に返るのだよ
つまりmin(t->l)が実行されたあとにその戻り値がmに代入されてreturn mで戻り値となりそれが更に・・・
てな具合で呼び出した順を逆にたどるために各階で戻り値を返す必要があるわけだ
0102デフォルトの名無しさん
2007/11/10(土) 16:26:51数学板の方が適切だと思われ。
0103デフォルトの名無しさん
2007/11/10(土) 16:40:34まさかとは思うけど、複数の数の最大公約数の求め方を知らないという話じゃないよね?
ユークリッド互除法より最適なアルゴリズムはないのか、という話だよね?
0104デフォルトの名無しさん
2007/11/10(土) 16:58:45int gcd(int a, int b); // 引数で与えられた2数の最大公約数を返す関数
があるとして
gcd(a, gcd(b, c));
なら…
010592
2007/11/10(土) 17:34:55なるほど、だからm = min(t->l);と言う様にmに代入しているのですね。
完全に理解できました。
アドバイスして下さった方、本当にありがとうございました。
0106デフォルトの名無しさん
2007/11/10(土) 21:13:150107デフォルトの名無しさん
2007/11/10(土) 21:20:43分投げじゃなくて、少しは考えよう
0108デフォルトの名無しさん
2007/11/10(土) 21:21:23丸投げは宿題スレへ
http://pc11.2ch.net/test/read.cgi/tech/1194262698/l50
0109デフォルトの名無しさん
2007/11/10(土) 21:52:01{
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としたときに、どこを指しているのかわからなくて
0110デフォルトの名無しさん
2007/11/10(土) 22:13:24それらを画面に表示して最後にそれらの総和を表示する。
ただしa,rは実数値とする。
0111デフォルトの名無しさん
2007/11/10(土) 22:17:07*yuv は yuv[0] と同じ意味
0112デフォルトの名無しさん
2007/11/10(土) 22:22:480113デフォルトの名無しさん
2007/11/10(土) 22:31:13ありがとうございます。理解できました。
0114デフォルトの名無しさん
2007/11/10(土) 23:54:232^(1/2)や3^(1/2)なら sqrt(2.0)やsqrt(3.0)だとわかるのですが。
pow( sqrt(2.0),3 )になるのでしょうか?
0115デフォルトの名無しさん
2007/11/10(土) 23:55:490116デフォルトの名無しさん
2007/11/10(土) 23:55:520117デフォルトの名無しさん
2007/11/10(土) 23:56:53ありがとございます
0118デフォルトの名無しさん
2007/11/10(土) 23:56:540119デフォルトの名無しさん
2007/11/10(土) 23:57:150120デフォルトの名無しさん
2007/11/11(日) 00:19:30numerical recipeのコード使ってるんだけど、
同じ振幅で別周波数の時系列入れてもスペクトルの
大きさが違うんです。
周波数の適当なビンで積分しても違いがあるどうしてかな。
コードはいじってないよ。
0121デフォルトの名無しさん
2007/11/11(日) 00:28:07入力波形を正弦波にしてサンプリング周波数の 1/(2^n) にしてもそうなる?
0122デフォルトの名無しさん
2007/11/11(日) 01:55:42俺は情報科の1年なんだけど、
大学でやってるCを自宅でもやりたいと思ってるんだけど、
そういうのを自宅でやるのはどうすればいいの?
できれば無料でやりたいんだけど、
そんなソフトをインストールすればいいのか教えてください。
0123デフォルトの名無しさん
2007/11/11(日) 01:58:270124122
2007/11/11(日) 02:02:02OSはXPです。
コンパイラ・・・ってなんだろ?
emacsとかktermとか使ってますけど。
0125デフォルトの名無しさん
2007/11/11(日) 02:05:550126デフォルトの名無しさん
2007/11/11(日) 02:07:080127デフォルトの名無しさん
2007/11/11(日) 02:08:38gccは使ってる?
0128122
2007/11/11(日) 02:28:58自宅で環境整えるのは難しいみたいですね・・・。
今度聞いてみます。
こんな時間にありがとうございました。
0129デフォルトの名無しさん
2007/11/11(日) 02:37:200130デフォルトの名無しさん
2007/11/11(日) 02:41:18学校と同じものを揃えたいんでしょ?
とりあえず学校で何を使ってるかを調べるだけでおk
0131デフォルトの名無しさん
2007/11/11(日) 03:25:580が出力されてしまいます…
初心者ですみませんがよろしくです.
#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);
}
0132デフォルトの名無しさん
2007/11/11(日) 03:28:54i に注目。
0133デフォルトの名無しさん
2007/11/11(日) 03:34:37レスありがとうございます.
でも,ちょっとわかんないです^^
0134デフォルトの名無しさん
2007/11/11(日) 03:37:53そういうときには、取り敢えずsumを更新した次の行に(その下にある)printf()の行をコピーしてみよう。
それを実行しても未だ問題点が見つからないようなら、きっと注意力不足か適正不足だと思うよ。
0135デフォルトの名無しさん
2007/11/11(日) 03:58:31不等号の向きが逆。
0136デフォルトの名無しさん
2007/11/11(日) 04:03:45レスありがとうございます.
sum += i*i*i;
の下にprintfを入れてみたけど,そこの分のprintfが実行されてなさそう…
ってことは,for自体が実行されてないんですかね?
0137デフォルトの名無しさん
2007/11/11(日) 04:24:04Borland C++ Compiler 5.5
Borland Turbo Debugger 5.5
BCC Developer
を使ってC言語を勉強してるのですが、最近BCC Developerがよくバグります。
プログラムはちゃんと書けてるのに、いざコマンドプロンプトを開くと「問題が発生したため〜〜を終了します。」
と出てきて、そこで終わってしまいます。
こういうのって開発環境を変えた方が良いんでしょうか??
0138デフォルトの名無しさん
2007/11/11(日) 05:05:52コマンドプロンプトを開くだけで出るならBCCは関係ないが。
0139137
2007/11/11(日) 05:36:06レスありがとうございます。
コマンドプロンプト開くだけなら全然大丈夫なんですが
長時間(っていっても2時間とかそんなもん)プログミングしてるとよくエラーになります。
同じプログラムでもちゃんと出力できるときとそうでないときがあっていまいち原因が分からないです。
0140137
2007/11/11(日) 06:21:330141デフォルトの名無しさん
2007/11/11(日) 10:01:08そのとーり。>>135も指摘しているが、for文の条件判断のところの意味をよく理解しておくこと。
0142デフォルトの名無しさん
2007/11/11(日) 10:03:44>入力波形を正弦波にしてサンプリング周波数の 1/(2^n) にしてもそうなる?
はい。純粋に周波数がf,f1,f2...の正弦波をFFTにかけています。
規格化の方も分かってます。
014386
2007/11/11(日) 11:13:09このようになるのですが間違っている部分ありますか?
http://www.imgup.org/iup500370.png
宜しくお願いします。
0144デフォルトの名無しさん
2007/11/11(日) 11:17:49printf("%d\n", d); // & いらない
0146デフォルトの名無しさん
2007/11/11(日) 11:44:530147デフォルトの名無しさん
2007/11/11(日) 11:53:20レスありがとうございました.
forの条件判断は,反復の終了条件ではなく,継続条件なのですね.
つまり,その条件が偽になったら終了と.
つまらない質問に答えていただき,ありがとうございました.
0148デフォルトの名無しさん
2007/11/11(日) 13:19:24求めるプログラムしてたんですが、下記のこれでもいけますかね?
#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;
}
0149デフォルトの名無しさん
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の間に+を表示させるにはどうしたら良いですか?
0150デフォルトの名無しさん
2007/11/11(日) 15:23:40printfの変換仕様のフィールド幅の部分をマクロで
置き換えたいんですが、方法はありますでしょうか?
printf("値: %05d\n", number);
を、
define FIELD 5
printf("値: %0FIELDd\n", number);
といった感じに。(↑上手く動作しません。)↓はコンパイルできませんでした。
printf("値: %0"FIELD"d\n", number);
ちなみに、コンパイラはgccです。よろしくおねがいします。
0151デフォルトの名無しさん
2007/11/11(日) 15:26:59僕がやったところ、下記のような出力結果になってますよ。
Input number1 : 10
Input number2 : 20
Input number3 : 30
(10 +20 +30 +)
0152デフォルトの名無しさん
2007/11/11(日) 15:27:08printf("値: %0*d\n", FIELD, number); でいけたかと
0153デフォルトの名無しさん
2007/11/11(日) 15:29:56いけました!
ありがとうございます!!
0154149
2007/11/11(日) 16:50:50あっそうなんです
どうしても+が一つ多くなってしまうんですが
(10 +20 +30)
こういうすっきりした形にしたいんですが・・・
0155デフォルトの名無しさん
2007/11/11(日) 16:53:28printf("%d", num[cnt]);
0156デフォルトの名無しさん
2007/11/11(日) 16:53:53{
if(cnt>0){ printf(" +"); }
printf("%d",num[cnt]);
}
これでいいんじゃない
0157デフォルトの名無しさん
2007/11/11(日) 17:18:52for(cnt = 0 ; cnt < INPUT_CNT - 1 ; cnt++)
{
printf("%d + ",num[cnt]);
}
printf("%d",num[cnt]);
0158デフォルトの名無しさん
2007/11/11(日) 17:21:12まぁ、155が見えないバカにはわからないだろうが。
0159デフォルトの名無しさん
2007/11/11(日) 18:03:370160デフォルトの名無しさん
2007/11/11(日) 18:09:45もっとおすすめできないが、
return文の2行上のprintf文をこうするとか。
printf("\b)");
\bってのはカーソルを1文字戻すエスケープシーケンスね。
0161デフォルトの名無しさん
2007/11/11(日) 19:22:26bool hoge(int array[const])
{
...
}
とやっても良いらしいのだけれど
array[const]ってどういう意味の配列になるの?
0162デフォルトの名無しさん
2007/11/11(日) 19:26:190163デフォルトの名無しさん
2007/11/11(日) 19:52:40bool hoge(int * array)と全く同じ。
>>162
何故main限定?w
>>160
お勧め云々以前にダメすぎ。
0164デフォルトの名無しさん
2007/11/11(日) 20:03:14bool hoge(int * const array)
というわけでもない?
0165デフォルトの名無しさん
2007/11/11(日) 20:07:38遅くなりましたが、レスさんくすです
>>69
VisualStudioは残念ながら所有していません
ExpressEditionで試してみます
>>71
どうもです
面白そうですね
試してみます
その他にも知り合いのJava使いからOpenGrokなるツールを紹介してもらいました
これらを参考に仕事がんばらせていただきます
どうもありがとうございました
0166デフォルトの名無しさん
2007/11/11(日) 20:17:56int *const arrayと同じ。
C99から導入された書き方。
0167デフォルトの名無しさん
2007/11/11(日) 20:28:30サンクス。C99からだったか・・。
どうりでわからんわけだ。C99の資料も欲しい。
0168デフォルトの名無しさん
2007/11/11(日) 20:51:19また、実務で使われている開発環境はVC++ですか、ボーランドのやつですか
エクリプスですか
0169149
2007/11/11(日) 21:53:42本当にどうもありがとうございました
0170デフォルトの名無しさん
2007/11/11(日) 21:54:200171デフォルトの名無しさん
2007/11/11(日) 21:59:290172デフォルトの名無しさん
2007/11/11(日) 22:00:21sleep()でググってみそ。
0173デフォルトの名無しさん
2007/11/11(日) 22:00:35printf("hoge");
0.5秒待つ ←これを実行するための関数とヘッダファイルです
}
0174デフォルトの名無しさん
2007/11/11(日) 22:02:100175デフォルトの名無しさん
2007/11/11(日) 22:02:45システムに依存する。
0176デフォルトの名無しさん
2007/11/11(日) 22:04:58windows.h
Sleep(500);
0177173
2007/11/11(日) 22:06:230178デフォルトの名無しさん
2007/11/11(日) 22:25:26ゲイツに聞こうぜ
あんだけ話題になったんだし
http://matome.info/HatsuneMikuImageSearch/
0179デフォルトの名無しさん
2007/11/11(日) 22:46:32int double floatについて教えてください。
int型は整数型ということを調べていてよく見たのですが
int a=0.5 や int b=0.00000005 でもエラーが出ません。
また、範囲が狭いということが書いてあったのですが
int a=1234567890 と大きい値を入れても大丈夫でした。
どれくらい大きい値まで大丈夫なのでしょうか。
それと小数点を扱うときはdouble と floatを使うとあったのですが
二つの違いもよくわかりません
お願いします
0180デフォルトの名無しさん
2007/11/11(日) 22:50:35http://www.aso.ecei.tohoku.ac.jp/~yoshi/C/double.html
0181デフォルトの名無しさん
2007/11/11(日) 22:52:33実際には理由がなければdoubleを使うのが普通。
0182デフォルトの名無しさん
2007/11/11(日) 22:59:55浮動小数点なのでfloat
(↑1.1346*10^5とか)
doubleは倍精度(おもに小数部分が)なので
0183デフォルトの名無しさん
2007/11/11(日) 23:05:11*.hは/usr/includeにあるけど本体がどこにあるのかわからない。
0184デフォルトの名無しさん
2007/11/11(日) 23:05:580185デフォルトの名無しさん
2007/11/11(日) 23:06:52検索しても見つからなかったら、インストールされてないんじゃない?
0186デフォルトの名無しさん
2007/11/11(日) 23:07:57いやトラブルにあったとかそういうことじゃなくて
ソースを読むために居場所を知りたい。
0187デフォルトの名無しさん
2007/11/11(日) 23:22:59>int a=0.5 や int b=0.00000005 でもエラーが出ません。
エラーは出ないけど、だまって整数に切り捨てられる。
0188デフォルトの名無しさん
2007/11/11(日) 23:26:29Cでもいつもキャストしてるから気づかなかった
0189デフォルトの名無しさん
2007/11/11(日) 23:26:36いやだから、ライブラリのソースはインストールしてないと入ってない
0190デフォルトの名無しさん
2007/11/11(日) 23:26:48標準関数のソースは、OSなりコンパイラをインストールするときに、オプションで指定しないと入らないんじゃないの?
なんでもいいから見たいってことなら、ネットで探せば出てくると思うけど。
0191デフォルトの名無しさん
2007/11/11(日) 23:27:56そんなものない。
ファイルに書き出すにしても、OSのAPI呼び出したりアセンブラで書いたりと
C言語じゃないことやってるんだから、Cのソースファイルとしては存在しない。
0192デフォルトの名無しさん
2007/11/11(日) 23:32:11>>190
そうなのか、全然知らなかった。
インストールしないといけないのか。thx!
0193デフォルトの名無しさん
2007/11/11(日) 23:38:40doubleの方がfloatより精度が高い。
だから計算に時間がかかるかといえばそうでもなくて、
CPUに乗ってる数値演算プロセッサが32bit精度だったり、
C言語のライブラリがdouble前提で作られたりしてて、
floatで計算すると、
float-double変換→計算→double-float変換
となってdoubleよりも遅くなることが多かった。
けど、最近はSSEなどの演算命令などが出てきたため、
floatの方が速い場合もあるらしい。
0194デフォルトの名無しさん
2007/11/11(日) 23:42:51FPUは80bitだから、「CPUに…」の行は無視して。
0195デフォルトの名無しさん
2007/11/11(日) 23:48:02イメージできてきました。
intが8バイトや、256ビットやら、バイトとビットがよくわかってもいない中で
わけがわからなくなっていましたが
精度の違いってこのbitの部分が違うということですよね?
足し算、掛け算やら計算を格納するところはdoubleにしてやるように気をつけます。
ありがとうございました
0196デフォルトの名無しさん
2007/11/12(月) 00:34:470197デフォルトの名無しさん
2007/11/12(月) 00:40:020198デフォルトの名無しさん
2007/11/12(月) 00:43:52が可能で
char *ptr;
scanf("%s",ptr);
がダメなのはなんで?
0199デフォルトの名無しさん
2007/11/12(月) 00:46:55char *ptr = "ghijkl";
は、コンパイラがどっかに用意した"ghijkl"って領域の
先頭アドレスをptrに代入してる。だからOK
char *ptr;
はptrってポインタ(アドレスを入れる箱)は用意したけど、まだ中身は不定。
文字列を入れる場所が確保されてないから、コピーできない。
0200デフォルトの名無しさん
2007/11/12(月) 00:47:280201デフォルトの名無しさん
2007/11/12(月) 00:50:22scanf("%s",ptr);
を可能にするにはmallocやnewやらで領域作らないとダメなの?
それだと
char ptr[256];
scanf("%s",ptr);
でやってしまっても問題ないなぁ…
なんか領域が可変な1次元のcharでもあればいいのに
0202デフォルトの名無しさん
2007/11/12(月) 00:52:16標準ではないが asprintf が便利
0203デフォルトの名無しさん
2007/11/12(月) 00:56:39C言語スレだからnewは無いけどな。
char* ptr=(char*)malloc(256);
みたいにしないといけない。使い終わったらfreeもしなきゃいけない。
可変配列なんて裏でメモリの確保・開放を勝手にやるってことだからな。
高級アセンブラたるCにそんな機能は無い。必要なら自分で作るんだよ。
0204デフォルトの名無しさん
2007/11/12(月) 01:05:46理解できました
0205デフォルトの名無しさん
2007/11/12(月) 01:12:220206デフォルトの名無しさん
2007/11/12(月) 01:24:49「関数がついた構造体」みたいな感じで認識してるけど
オブジェクトに何か値をぶち込む。
↓
何かよくわからないけど、いろいろ処理する(コンストラクタやらデストラクタやらして)
↓
何か処理したもんが出てくる
って認識であってる?
0207デフォルトの名無しさん
2007/11/12(月) 01:26:50スレ違い。
0208デフォルトの名無しさん
2007/11/12(月) 01:33:40メンバをchar word[20] として
そのメンバとaとかbと一致するかどうかをみたいんだけど
どうすればいいですかね?
0209抽象的な質問には抽象的な回答を
2007/11/12(月) 01:36:150210デフォルトの名無しさん
2007/11/12(月) 02:04:01#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 になってしまいます。
0211デフォルトの名無しさん
2007/11/12(月) 02:44:490212デフォルトの名無しさん
2007/11/12(月) 02:54:390213デフォルトの名無しさん
2007/11/12(月) 03:54:550214デフォルトの名無しさん
2007/11/12(月) 04:34:24MT法でやってくりたまえ
0215デフォルトの名無しさん
2007/11/12(月) 09:20:48基本情報処理でいいんじゃないの?
0216デフォルトの名無しさん
2007/11/12(月) 10:27:21こんな感じでおk?
目標プロセスのアドレス取得
↓
ある数値、文字列を探すときはstrstrで検索
0217抽象的な質問には抽象的な回答を
2007/11/12(月) 10:38:560218デフォルトの名無しさん
2007/11/12(月) 12:43:520219デフォルトの名無しさん
2007/11/12(月) 12:57:080220デフォルトの名無しさん
2007/11/12(月) 13:07:340221デフォルトの名無しさん
2007/11/12(月) 13:40:24文字で書いてあればまだなんとかなるか。
0222デフォルトの名無しさん
2007/11/12(月) 13:43:42ヒントはPPM
がんばれよ!
0223デフォルトの名無しさん
2007/11/12(月) 13:56:06何を切り出すの?
金型?
0224デフォルトの名無しさん
2007/11/12(月) 14:40:090225デフォルトの名無しさん
2007/11/12(月) 15:38:25↓
テキストデータに変換
↓
0.5秒間ハミング窓を与える ←
↓ 0.25秒ずらす
FFT、ピッチを求めてドッカに保存 → ↑
↓
終了
こんな感じで求めればドレミファソラシドって変化していくWAVEファイルのピッチを追えると思ってるんだが
どう?
0226デフォルトの名無しさん
2007/11/12(月) 18:00:23それなりのC言語の使い手に一見見える型とか構造体ってありますか?
0227デフォルトの名無しさん
2007/11/12(月) 18:04:060228デフォルトの名無しさん
2007/11/12(月) 18:04:540229デフォルトの名無しさん
2007/11/12(月) 18:13:430230デフォルトの名無しさん
2007/11/12(月) 18:14:520231デフォルトの名無しさん
2007/11/12(月) 18:16:46・・・
・・・
char ar[1]; //[0]じゃなくあえて[1]で。
};
0232デフォルトの名無しさん
2007/11/12(月) 18:18:50int argc;
char **argv;
{
return 0;
}
0233デフォルトの名無しさん
2007/11/12(月) 18:20:30#define end ;}
0234デフォルトの名無しさん
2007/11/12(月) 18:25:55ptrdiff_t
intptr_t
uintptr_t
0235デフォルトの名無しさん
2007/11/12(月) 18:49:39>>231
[0]じゃなくてあえて[1]で。ってどういうことなんですか
すごく興味があります。
0236デフォルトの名無しさん
2007/11/12(月) 19:16:10int 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部なのですが。
変数が多くなってあまりに汚いのでどうにかできないものかと
0237デフォルトの名無しさん
2007/11/12(月) 19:25:30それってsizeは関数に渡るのか?
0238デフォルトの名無しさん
2007/11/12(月) 19:26:240239デフォルトの名無しさん
2007/11/12(月) 19:30:53昔は [0] が認められてなかった。
そのころからの古参ベテランだぞというアピール。
0240デフォルトの名無しさん
2007/11/12(月) 19:32:21関数に渡してもどっちでもいい状態であります。
どうしても構造体に3つのintが入ることになってしまって…
testで作っていたソースはvalue1個だけとかでやってていけて
いざ3つにしたら ぅわぁぁあぁ…という状況に…
0241デフォルトの名無しさん
2007/11/12(月) 19:35:23e add(e a, e b);
e sub(e a, e b);
のような関数を作ればおk
0242デフォルトの名無しさん
2007/11/12(月) 19:38:09i のループで、output1,output2が壊れてない?
output1, output2には、i = size - 1 のときの値しかassignされないように見える。
0243デフォルトの名無しさん
2007/11/12(月) 19:39:35配列の範囲外にアクセスしてるみたいだが、それはいいのかな?
0244デフォルトの名無しさん
2007/11/12(月) 19:40:01return a+b; }
0245デフォルトの名無しさん
2007/11/12(月) 19:45:37#define SUM(x, m) x[j].m + x[j+1].m
みたいに。
0246デフォルトの名無しさん
2007/11/12(月) 19:46:11元のソースを少し変えてi jの2重ループだけにしてるので、ちょっとおかしいところ出てますが
そこは気にしないでください。
>>241
それは構造体を返す型の、関数ということですか。
やったことが無いのでイメージしづらいのですが…ためしに組んでみます。
マクロでやれるかとも思ったのですが、ヘッダがものすごいことになりそうで。。
0247デフォルトの名無しさん
2007/11/12(月) 20:03:340248デフォルトの名無しさん
2007/11/12(月) 20:35:49そんなあなたにこのマクロをどうぞ
#include<stdio.h>
int main(void){
printf("File:%s Line:%d\n", __FILE__, __LINE__);
return 0;
}
0249デフォルトの名無しさん
2007/11/12(月) 20:42:32ただ行列(構造体)の横走査と
縦走査で同じようなことを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(); //縦走査
こんな感じに。。。
まだまだ修行不足です。アドバイスありがとうございました。
0250デフォルトの名無しさん
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]);
}}
って感じになるんだけど、
これだとソースを見て何をやっているかが一目でわかる。
後々メンテする可能性のあるプログラムならこっちの方がいいかと。
0251デフォルトの名無しさん
2007/11/13(火) 01:25:12#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]を表示したいんですがうまく表示されません。
どうすればよいですか?
0252デフォルトの名無しさん
2007/11/13(火) 01:28:290253デフォルトの名無しさん
2007/11/13(火) 02:01:40代入文が逆ではないか?
× a[i][j]=b[k][l];
○ b[k][l]=a[i][j];
0254デフォルトの名無しさん
2007/11/13(火) 02:46:03ベクトルじゃないやつ。
0255デフォルトの名無しさん
2007/11/13(火) 03:09:09スカラーのことだろ?よく文字を見ればわかる。
ラーがついているということは、もともとスカルという意味で、
つまりはスカル人=スカラーだ。わかったか!?
あとは、マカセタ。
0256デフォルトの名無しさん
2007/11/13(火) 03:37:42program1.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してみたのですが
同じようなエラーが出てダメでした。
どうすれば解決できるでしょうか・・
0257デフォルトの名無しさん
2007/11/13(火) 08:15:45いろいろやってるうちにそうなってました。
ありがとうございます
0258デフォルトの名無しさん
2007/11/13(火) 09:33:13cygwinはsys/socket.hじゃなくてcygwin/socket.hとかにあるんじゃなかったかな。
こういう質問はC言語のスレじゃなくてcygwinスレとかの方が答えてくれると思う。
0259デフォルトの名無しさん
2007/11/13(火) 14:34:44今読んでるソースに**aみたいなのが、無数に出てきて、これが分からない
0260デフォルトの名無しさん
2007/11/13(火) 14:36:08ポインタの位置を指すポインタ。
0261デフォルトの名無しさん
2007/11/13(火) 14:48:04俺はアホだからよく分からない…
ぬこにも分かるようにお願いします><
0262デフォルトの名無しさん
2007/11/13(火) 14:51:47int* -> int (int*はint(の場所)を指す)
int** -> int* (int** は int*(の場所)を指す)
0263デフォルトの名無しさん
2007/11/13(火) 17:24:52int **p; → **p が int型
0264デフォルトの名無しさん
2007/11/13(火) 17:29:09わざわざ判りにくくしてやがんのな。
0265デフォルトの名無しさん
2007/11/13(火) 17:31:370266sage
2007/11/13(火) 17:42:23unsigned 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で指定した変数を超えてメモリを使用する恐れはありませんでしょうか?
0267デフォルトの名無しさん
2007/11/13(火) 17:45:44ありがとうございました、そちらのほうにいってみます
0268デフォルトの名無しさん
2007/11/13(火) 18:31:36引数がunsigned short *Buffだとわかっているので、
*(Buff+1) += 0x12345678;
もunsigned shortで行われる。
(正しくはintに拡張されて計算されてshortに丸められる)
その結果がshortに収まらなくてオーバーフローしても、
他の領域には影響は及ぼさないよ。
0269デフォルトの名無しさん
2007/11/13(火) 18:43:070270デフォルトの名無しさん
2007/11/13(火) 19:17:00ポインタじゃなくて配列の代わりみたいなもん、って教え方した方が
俺の場合はすっきりした><
でもポインタなんだよね。
ポインタなんて死ねばいいのに
0271デフォルトの名無しさん
2007/11/13(火) 19:38:38全部ポインタでメモリ確保しなきゃ使えないようにすれば混乱しなくていいのに。
0272デフォルトの名無しさん
2007/11/13(火) 19:43:13文字列(char*)の配列なんかだと、char *argv[]やchar **argvになってしまう。
[]付きのほうが理解しやすいよね。
0273デフォルトの名無しさん
2007/11/13(火) 20:30:05迷路でゴールを目指すプログラムを作りたいのですが、
左手法までたどり着き、その後がまったく分かりません。
どなたか、左手法の参考プログラムを教えていただけませんか?
ちなみに、Cを始めて3ヶ月です。
0274デフォルトの名無しさん
2007/11/13(火) 21:31:05進行方向というパラメータを持って、
左に壁があれば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();}
}
0275デフォルトの名無しさん
2007/11/13(火) 21:37:30tanak 170 60
satou 180 70
suzuki 162 55
…
onaka 192 80 (100行)
みたいなデータがあるのですが。
1行目読み込んで、任意の行(60行目とか)に飛ぶには
fseekでどうやるのでしょうか?
for文で回して、5行おきとか飛んだり、10行おきとかscanfで指定した分だけ飛んだり出来るような
ソースを最終的には考えているのですが、まずは指定した行だけ飛ぼうと思いまして
0276デフォルトの名無しさん
2007/11/13(火) 21:41:15>fseekで
そのデータじゃ無理
0277デフォルトの名無しさん
2007/11/13(火) 21:41:590278デフォルトの名無しさん
2007/11/13(火) 21:45:310279デフォルトの名無しさん
2007/11/13(火) 21:45:41fseekはバイト単位で進んだり戻ったりする。データがテキストなら改行で数えたほうがラク。
0280デフォルトの名無しさん
2007/11/13(火) 21:48:01改行で数える、というのは具体的にはどうやればいいんでしょうか
0281デフォルトの名無しさん
2007/11/13(火) 21:50:000282デフォルトの名無しさん
2007/11/13(火) 22:00:06fseekで移動しfscanfで読み込むという作業をしようとしていました。
0283デフォルトの名無しさん
2007/11/13(火) 22:01:07sscanfでいいじゃね?
0284デフォルトの名無しさん
2007/11/13(火) 22:07:36ビット位置------入力ポート--------
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
0285デフォルトの名無しさん
2007/11/13(火) 22:08:09for(i=0;i<n;i++)fgets(buff,buff_size,fp);
でいいんじゃないかってこと。
0286デフォルトの名無しさん
2007/11/13(火) 22:09:36main()
{
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の番号やモータの右左のポートが入る
0287デフォルトの名無しさん
2007/11/13(火) 22:11:06上の条件やプログラムを参考にして
「SW1がONの時モータが右回転、
SW2がONの時モータが左回転、
SW3,4がONの時モータを止める、
光SWを暗くするとプログラム終了。」
というプログラムを教えて欲しいです。
他に何か必要な条件などがあったら教えてください。
0288デフォルトの名無しさん
2007/11/13(火) 22:11:590289デフォルトの名無しさん
2007/11/13(火) 22:15:41SW1とSW3がONになったらどうするんだ?
0290デフォルトの名無しさん
2007/11/13(火) 22:17:010291デフォルトの名無しさん
2007/11/13(火) 22:19:110292デフォルトの名無しさん
2007/11/13(火) 22:33:05モーターならドライバにFETとかが入るので、負論理は普通にありえる。
>>287
電気・電子板がいいとおもうぞ。
http://science6.2ch.net/denki/
0293デフォルトの名無しさん
2007/11/13(火) 22:36:14スイッチならプルアップして、押下時に接地で負論理ってのは多いな。
0294デフォルトの名無しさん
2007/11/13(火) 22:47:500295デフォルトの名無しさん
2007/11/13(火) 23:00:42モバゲーやっちゃお
ケータイでね
0296デフォルトの名無しさん
2007/11/13(火) 23:05:15>>284を見る限りビットで制御するようだが、outport()とinport()の引数は整数なのか?
0297デフォルトの名無しさん
2007/11/13(火) 23:15:430298デフォルトの名無しさん
2007/11/13(火) 23:18:03おしえてえろい人
0299デフォルトの名無しさん
2007/11/13(火) 23:26:45outport()の第2引数はなんなの?
SW3とSW4が押されたとき、inport()でどうやって受け取るの?inport()を2回呼ぶの?
つーかそもそもinport()は実行すると入力があるまで待つの?
ハードの仕様も分からんし、不明な点が多すぎるよ。
0300デフォルトの名無しさん
2007/11/13(火) 23:27:47readって何?
0301デフォルトの名無しさん
2007/11/13(火) 23:38:46気にするな。お前が使えば、どっちでもそう変わりはしない。
0302デフォルトの名無しさん
2007/11/14(水) 00:05:03mmapならさらにはやいかもしれない。
0303デフォルトの名無しさん
2007/11/14(水) 01:17:220304デフォルトの名無しさん
2007/11/14(水) 19:57:03それが回文かどうか判定するにはどうすればいいですか。
0305デフォルトの名無しさん
2007/11/14(水) 19:58:45んで5ケタなら[0]と[4] [2]と[3]を比べてどっちも一致なら回文。
0306デフォルトの名無しさん
2007/11/14(水) 19:59:32今は一応入門の本を買って手取り足とりでプログラムを組んでる最中です
0307デフォルトの名無しさん
2007/11/14(水) 19:59:590308デフォルトの名無しさん
2007/11/14(水) 20:01:54基礎を学んだら適当に自分でソースかいて実際コンパイルの繰り返し。
ボーリングのスコア計算とか組めるようになってようやく超初心者卒業じゃないかな。
0309デフォルトの名無しさん
2007/11/14(水) 20:06:51独習Cだな。
あれを眠くならずに飽きもせずに最後まで練習問題こなせたら構文は卒業だよ。
とネタはさておき、何のためにCを勉強するかじゃないのか?
学校とか情報処理試験のためならそのレベルで十分だし、
何か作りたいソフトがあるなら、調べながらでも実際に作ってみればいい。
Cに限らずアルゴリズムやAPI、通信手順など学ぶものはいくつも出てくるから。
0310デフォルトの名無しさん
2007/11/14(水) 20:08:31今一応簡単なのをしてるんですが楽しいです、本のまねをしてるだけですが
最初は仕組みを重点的に勉強した方がいいですか!?
0311デフォルトの名無しさん
2007/11/14(水) 20:13:56int main(void)
から始まるけど、このvoidってなんだい?とか説明できるようになるともっと面白くなるよ。
構造も大事だけど意味も知ったほうがなおよし
0312デフォルトの名無しさん
2007/11/14(水) 21:06:21ポインタと構造体の使いかたは理解しといたほうがいいと思うな
ソースが汚い人は大抵、構造体の使いかたが下手だよ
Cの本はあとあと読まないものが多いから、市立図書館を活用するのが一番のコツだと思う
0313デフォルトの名無しさん
2007/11/14(水) 21:15:120314デフォルトの名無しさん
2007/11/14(水) 21:17:390315デフォルトの名無しさん
2007/11/14(水) 21:17:540316312
2007/11/14(水) 21:18:450317デフォルトの名無しさん
2007/11/14(水) 21:23:43ちなみにパソコンを触ることは大好きです
0318デフォルトの名無しさん
2007/11/14(水) 21:28:59クライアントとの意思疎通やドキュメントの作成など、
文系の方が有利といえる内容も多いので、
理系だ文系だというのは関係ない。
胸を張って「俺は体育会系だ」と言ってやれ。
0319デフォルトの名無しさん
2007/11/14(水) 21:36:490320デフォルトの名無しさん
2007/11/14(水) 21:56:04また文字(列)としても扱わずに、四則演算だけで求める方法を
教えてください。
たとえば、123234と入力されたら、
num1 == 1;
num2 == 2;
num3 == 3;
num4 == 2;
num5 == 3;
num6 == 4
という風に取得したいのです。
0321デフォルトの名無しさん
2007/11/14(水) 22:23:02% も使ったらいかんの?
num1 = n - (n / 10 * 10);
n /= 10;
num2 = n - (n / 10 * 10);
n /= 10;
num3 = n - (n / 10 * 10);
n /= 10;
0322デフォルトの名無しさん
2007/11/14(水) 22:24:20むしろ%と/を使って取得する方法が知りたいのです。
0323デフォルトの名無しさん
2007/11/14(水) 22:28:48num2 = n / 10 % 10
num3 = n / 100 % 10
num4 = n / 1000 % 10
num5 = n / 10000 % 10
>>320 とは逆順だけど
0324デフォルトの名無しさん
2007/11/14(水) 22:33:53ありがとうございます
0325デフォルトの名無しさん
2007/11/14(水) 23:04:570326デフォルトの名無しさん
2007/11/14(水) 23:10:470327デフォルトの名無しさん
2007/11/14(水) 23:40:27世の中大概のことは非線形で
理系はそのことを理解していてなおかつ計算を楽にするために線形で近似する。
もちろん近似だからそれに限界があるのも知っている。
だが文系は最初から線形だ。
所詮は近似でしかない計算をバカはどこまでも頼みにしてバカでない者は経験で適当に我流の修正を加えていく。
計算が不完全なのを知っていて理論を新しく作ることも出来ないから理論を講じること自体を頭から否定して自分の経験に依存する。
物事のとらえかたに根本的な差があるのさ。
0328デフォルトの名無しさん
2007/11/14(水) 23:58:06ttp://www.ioccc.org/
0329デフォルトの名無しさん
2007/11/15(木) 00:00:530330デフォルトの名無しさん
2007/11/15(木) 11:43:39変数Aに変数Bの特定ビットを読み込みたいのですが、
専用の命令はありますか?
変数Bの 01010101の 一番右の「1」だけ、とか
右から4番目の「0」だけとか読みたいのです。
「>>」 と 「<<」でずらすのが一番処理が早いでしょうか?
0331デフォルトの名無しさん
2007/11/15(木) 11:45:56ビットフィールド使うこともあるけど。
0332デフォルトの名無しさん
2007/11/15(木) 11:46:420333デフォルトの名無しさん
2007/11/15(木) 11:47:51A = B[52];
0334デフォルトの名無しさん
2007/11/15(木) 13:12:16&演算子ありましたね。スマートです。
bitset勉強が必要です。精進します。どもども。
0335デフォルトの名無しさん
2007/11/15(木) 13:25:10int 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を作成せよ。
?の部分がわからないです
0336デフォルトの名無しさん
2007/11/15(木) 13:34:31int 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;
}
0337デフォルトの名無しさん
2007/11/15(木) 13:47:260338デフォルトの名無しさん
2007/11/15(木) 13:51:340339デフォルトの名無しさん
2007/11/15(木) 13:52:350340デフォルトの名無しさん
2007/11/15(木) 14:01:320341デフォルトの名無しさん
2007/11/15(木) 14:06:46ナウい略語を使ってるオレかっこよすぎだぜ
という心の声が
0342デフォルトの名無しさん
2007/11/15(木) 14:08:17auto variableのことか?
0343デフォルトの名無しさん
2007/11/15(木) 14:11:20たぶんこれのことだろうか?
0344デフォルトの名無しさん
2007/11/15(木) 14:36:00こうしろって事かな?
0345デフォルトの名無しさん
2007/11/15(木) 14:41:250346デフォルトの名無しさん
2007/11/15(木) 14:55:170347デフォルトの名無しさん
2007/11/15(木) 15:02:51WisdomSoftのページの内容を全部解るくらいなら
あとはポインタ関連。それとANSIの関数(よく使うやつを主に)
を覚えておいた方が楽。
ついでに、基本的なアルゴリズムとデータ構造。
まぁ、気楽にね〜
0348デフォルトの名無しさん
2007/11/15(木) 15:46:37オレは昔友達とチャットがしたくて、コマンドラインベースのチャットソフトを作ったのが初めてのC。
必要にせまられて取り組むのとなんとなくでは、やる気も吸収スピードもまるで違うからね。
ソースはLinuxならSRPMとか、GNUライブラリあたりで大量に読める。
WindowsベースはほとんどC++かVBかDelphiだから、最近のはあまり役に立たないかもな。
WinAPIなんかdefineしまくってて、一見Cと思えないようなことしてるし。
0349デフォルトの名無しさん
2007/11/15(木) 16:20:52必要に迫られること自体あんまりなさそう
0350デフォルトの名無しさん
2007/11/15(木) 16:30:18そういうフリーソフトの「ここがこうだったらなぁ」を実現する為に作る時はあるよ。
0351デフォルトの名無しさん
2007/11/15(木) 16:36:41実は既に実装済みで単にオプションの設定を知らないだけだった
ということがままあるわけで
0352デフォルトの名無しさん
2007/11/15(木) 16:38:32よく本に載ってるアドレス帳みたいなの作れと言われても、いらねーと思ったらやる気起きないし。
趣味の範囲で取り組むならそれが一番。仕事だとそうもいかないけどね。
ただしコピペは厳禁な。全く身に付かないから時間の無駄。
0353デフォルトの名無しさん
2007/11/15(木) 16:48:17そうやって必死に身に着けた知識が
既成の優れたライブラリの前では何の役にも立たないと知ったときに
努力は無駄ではなかったと必死に自分に言い訳するのさ
努力が無駄ではなかったと言えるのは結果を出した者だけだ
0354デフォルトの名無しさん
2007/11/15(木) 16:51:20猫でものホームページ見ながらSDK勉強しようとして
サンプルソースそのまま打ち込んだは良いが
何がどうなってるのかわけわからないままでいたもんだ
やっぱ初心者はウザイほどコメント付けるクセ
つけないと身に付かんね
0355デフォルトの名無しさん
2007/11/15(木) 16:52:50キミは目的を勘違いしてないか?世界一優れたライブラリを作るのが目的なの?
0356デフォルトの名無しさん
2007/11/15(木) 16:54:56いいんじゃねーの?
フルスクラッチできたら独自拡張できるんだし。
0357デフォルトの名無しさん
2007/11/15(木) 16:55:23この処理どうなってんだろーとかへーこうやるんだー
ってちらっとでも見て感心することも大事
0358デフォルトの名無しさん
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
0359デフォルトの名無しさん
2007/11/15(木) 17:04:03そしてそのソースは消さずにきちんとメンテすること。自作のソースが溜まっていくと、後で必ず役に立つ。
0360デフォルトの名無しさん
2007/11/15(木) 17:09:110361デフォルトの名無しさん
2007/11/15(木) 17:18:12C++始めたら自作の文字列クラスを作るのが通過儀礼だったな。
不定長で来る文字列をどう受ければいいのか、
バッファを越えたら大きなバッファを確保してコピーするのか、
リストで繋げてみるか、可変長配列(これも自作)に収納するかとか、
自分の知っている知識でともかく実装してみて動くものを作った。
さらにアルゴリズムの本や他人のソースを見て、
思いもよらなかった方法を発見して試して、
自分の作ったものの完成度が高まるのは純粋に楽しいし、
そういう試行錯誤した経験は無駄にはならないよ。
0362デフォルトの名無しさん
2007/11/15(木) 17:21:320363デフォルトの名無しさん
2007/11/15(木) 17:34:26最近は、Cの時はついついbits/stl_algo.hを見て書いてしまうw
0364デフォルトの名無しさん
2007/11/15(木) 18:18:27若者に時間を無駄にさせて自分たちが追い越されまいとする年寄りの方便
で何かマシなことやろうとすると結局プラットフォームに依存してるんだよね
0365デフォルトの名無しさん
2007/11/15(木) 18:29:51無駄にならない方法をぜひ教えてくれ。
0366デフォルトの名無しさん
2007/11/15(木) 18:31:232ch に充てる時間を半分にする
0368デフォルトの名無しさん
2007/11/15(木) 18:36:04いまいち理解できません
最初はこんなもんですか・・?
0369デフォルトの名無しさん
2007/11/15(木) 18:38:07時間のハンドリングの話じゃねーだろ。
なにを勉強すべきなんだって?
そもそも空いた時間で「再開発」やるって話じゃないのかね。
そんでそれは有用だよ、という。
0370デフォルトの名無しさん
2007/11/15(木) 18:39:09>>361にとっていい経験だ、て話で誰も「お前らもやるべき」なんて言ってないと思うけど。
0371364
2007/11/15(木) 18:46:07その解釈は誤り。
>>361の最後の文章は個人の経験の記述のように見せかけて最後の行で一般論に帰結させてる。
事実と意見を混同させる初歩的な手だ。
0372デフォルトの名無しさん
2007/11/15(木) 18:51:11いきなりスイスイ進めねーよ
よほどの天才でもなけりゃあさ
つうかさ、一応ってなに?普段は他の言語やってんの?
独り言じゃないならこっちが答えやすいように質問してよ
0373デフォルトの名無しさん
2007/11/15(木) 18:55:210374デフォルトの名無しさん
2007/11/15(木) 19:00:01有用なライブラリは何も考えずに利用すべきであって、中身を知ろうとはするなってことか?
きっとその人は一生理解出来ないだけだと思うが。
0375デフォルトの名無しさん
2007/11/15(木) 19:13:230376デフォルトの名無しさん
2007/11/15(木) 19:14:04学習するって事に拘るなよ
0377デフォルトの名無しさん
2007/11/15(木) 20:22:46一日8時間みっちり学べば遅かれ早かれCの基礎はマスターできるんじゃないかね。
0378デフォルトの名無しさん
2007/11/15(木) 20:35:36何が無駄で何が無駄でないかは
その無駄かも知れない何かを学び
発展途上の途中で無駄だったな
と無駄に無駄と言ってしまっても
その先で無駄ではないと思った
時点で無駄も無駄では無かった
と学ぶことでしょう。
0379デフォルトの名無しさん
2007/11/15(木) 20:52:51例:
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 );
0380デフォルトの名無しさん
2007/11/15(木) 20:59:19for(i=0;c=str[i];i++)key( keycode[c-'a'] );
0381デフォルトの名無しさん
2007/11/15(木) 23:18:31配列に適当に数字おいて、一時的に保管しておく変数用意して、
ループの入れ子ループでカウントアップしつつ、
比較Aと比較Bで片方補完変数にいれてループ抜けて、
親ループでカウントアップさせて・・・ってやるんだけど、結果一番でかいのだけ連続して出力される('A`
0382デフォルトの名無しさん
2007/11/15(木) 23:19:340383デフォルトの名無しさん
2007/11/16(金) 00:03:35俺の頭はどうにかしてしまったのだろうか
0384デフォルトの名無しさん
2007/11/16(金) 00:05:000385デフォルトの名無しさん
2007/11/16(金) 00:08:42印刷したソース逆から見る俺の身にもなってくれ
なんでここで否定してんだって何度も思うじゃねえか
0386デフォルトの名無しさん
2007/11/16(金) 00:12:280387デフォルトの名無しさん
2007/11/16(金) 00:15:37最低限、英語で書かれた技術文書は、読める必要が必ずでてくる。
ただ、技術文書は平易な英語で書かれているから、すぐなれると
思うよ。
出世して、英語の契約書読む羽目になるとまた別だが。
0388デフォルトの名無しさん
2007/11/16(金) 00:19:20見たこと無い単語が出てきたら辞書引く程度で間に合うよ。
0389デフォルトの名無しさん
2007/11/16(金) 00:31:24printf("")のprintf文をいれなかったらセグメンテーションエラーでて
printf文をいれたらセグメンテーションエラー消えることがあるんですけど
これはどういうことなんでしょうか?
0390デフォルトの名無しさん
2007/11/16(金) 00:34:500391デフォルトの名無しさん
2007/11/16(金) 00:47:38ソートもアルゴリズムの分野だけど
理解できないんなら
有名どころのソート(6個くらい)
丸覚えしとけば良いじゃん。
まぁ、バブルソートぐらいは理解しといた
ほうが良いとは思うけど。
0392392
2007/11/16(金) 00:49:25start = clock();
なんらかの処理
end = clock();
time = (float) (end - start) / CLOCKS_PAR_SEC;
pirntf("実行時間%d\n", time);
これでtimeを出力すると、
536870912, 2147483648, 1073741824, 1610612736, 0
のうちのどれかの値に-ついたりつかなかったりして、出力されます。
「なんらかの処理」を変えても 上記の値しかでません。
どうしてこうなるのか分かりません。教えてください。
0393デフォルトの名無しさん
2007/11/16(金) 00:55:20time という変数名がマズイ
time が実数型であるにもかかわらず %d で出力している
typo がある
の全てが原因でしょう
0394デフォルトの名無しさん
2007/11/16(金) 00:58:520395392
2007/11/16(金) 01:04:08timeという変数について調べてみます。
%fでしたね@@;
ありがとうございました!!
>>394
clock_tで宣言しています。
回答ありがとうございます!
0396デフォルトの名無しさん
2007/11/16(金) 01:18:020397デフォルトの名無しさん
2007/11/16(金) 07:14:360398デフォルトの名無しさん
2007/11/16(金) 16:49:36const 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も検出されません。
これはよく知られたバグなのでしょうか?また対策はあるのでしょうか?
よろしくお願いします。
0399デフォルトの名無しさん
2007/11/16(金) 16:51:47「有効桁数」でググってきな
0400デフォルトの名無しさん
2007/11/16(金) 17:12:46約 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 が自分で実装するのは無理だろうからライブラリを探した方がいいでしょう
0401デフォルトの名無しさん
2007/11/16(金) 17:14:010402デフォルトの名無しさん
2007/11/16(金) 19:18:42質問です。
C言語には「volatile」という記号が あります。
これを記入すると、該当部分でのコンパイル時の最適化を抑制できます。
しかし、なぜ volatile(移り気な、気まぐれな)なのでしょうか。
最適化を抑制しているのですから、むしろ「変化しない」という意味に なるはずです。
つまり、volatile では なく、「un-volatile(不揮発の、変化しない)」になるべきでは ないでしょうか。
教えてください。よろしくお願い致します。
0403デフォルトの名無しさん
2007/11/16(金) 19:29:200404デフォルトの名無しさん
2007/11/16(金) 19:31:36最適化などで省略して定数になったり計算無効になったりしたらこちらは変化無い
0405デフォルトの名無しさん
2007/11/16(金) 20:57:33ただし名前入力の最初にendが入力された場合は、その旨のメッセージを出力して再入力させてください
名前は最大15文字入力とする
これのやり方を教えてください
0406デフォルトの名無しさん
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関数でそれ以上の文字を入力すると
オーバーフローが起き、強制終了しますよね?
ですがこれでは起きないんです、何故でしょうか
0407デフォルトの名無しさん
2007/11/16(金) 21:13:04どっかで勝手に値が変えられる可能性があるから volatile だな。
0408デフォルトの名無しさん
2007/11/16(金) 21:56:34ひーぷに余裕があるからじゃね?
0409デフォルトの名無しさん
2007/11/16(金) 22:10:54丸投げは宿題スレへ
http://pc11.2ch.net/test/read.cgi/tech/1194262698/l50
0410デフォルトの名無しさん
2007/11/16(金) 22:12:14>オーバーフローが起き、強制終了しますよね?
そうとは限らない
他のところで使ってるメモリ領域を黙って書き換えるだけの場合もある
0411デフォルトの名無しさん
2007/11/16(金) 22:16:27あっすいませんでした
0412デフォルトの名無しさん
2007/11/16(金) 22:17:24あ、そういうことか!!
どうもありがとうございました
0413デフォルトの名無しさん
2007/11/16(金) 22:37:56「最適化しないだって?」
「ああ、今日はそんな気分なんだ」
「まったく気まぐれな奴だよ」
0414デフォルトの名無しさん
2007/11/16(金) 22:52:46#define donotoptimize volatile
0415デフォルトの名無しさん
2007/11/16(金) 22:56:56綿密な計画と設計思想に基づいてボラタイルに したんです。
気まぐれで ボラッたわけでは ありません。
0416デフォルトの名無しさん
2007/11/16(金) 23:23:580417デフォルトの名無しさん
2007/11/16(金) 23:25:040418デフォルトの名無しさん
2007/11/16(金) 23:36:500419デフォルトの名無しさん
2007/11/16(金) 23:46:05関数の名前にしちゃうとその辺の理屈あわせが難しくなるよね
>>418
ああなるほど
関係ないけどmain"メソッド"には今でも違和感がある…
0420デフォルトの名無しさん
2007/11/17(土) 01:36:080421デフォルトの名無しさん
2007/11/17(土) 02:07:260422デフォルトの名無しさん
2007/11/17(土) 02:17:270423デフォルトの名無しさん
2007/11/17(土) 02:22:01主要な処理を他でやっていても、
全体通してのメインの流れを定めるのがmain関数
int main(){
first_step();
second_step();
third_step();
return 0;
}
0424デフォルトの名無しさん
2007/11/17(土) 03:51:360425デフォルトの名無しさん
2007/11/17(土) 09:08:360426デフォルトの名無しさん
2007/11/17(土) 09:18:170427デフォルトの名無しさん
2007/11/17(土) 19:17:140428デフォルトの名無しさん
2007/11/17(土) 20:24:04ググれ
0429デフォルトの名無しさん
2007/11/17(土) 20:33:33<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
というように<>内をそれぞれ抽出したいのですが、どのようにしたら出来ますでしょうか?
0430デフォルトの名無しさん
2007/11/17(土) 22:36:570431デフォルトの名無しさん
2007/11/17(土) 22:42:250432デフォルトの名無しさん
2007/11/17(土) 23:01:25volatileは「最適化抑制」という意味じゃない。
「値が外的要因(ハードウェアなど)によって変化しうる」という意味。
0433デフォルトの名無しさん
2007/11/17(土) 23:05:27Win系だったらMFCや.NET Framework、UNIX系ならPerlを使ったほうがいいな。
Cでやるしかない、という場合だったら、methodなどのキーワードの後の"...;"の中を一々抽出するしかないな。
0434デフォルトの名無しさん
2007/11/17(土) 23:08:04どっかから正規表現のライブラリ持ってくるのが楽じゃない?
0435デフォルトの名無しさん
2007/11/17(土) 23:11:010436デフォルトの名無しさん
2007/11/17(土) 23:19:45たとえばWindowsならMSHTMLとかだな。
0437デフォルトの名無しさん
2007/11/17(土) 23:34:44まずはCだけで頑張ってみます。
0438デフォルトの名無しさん
2007/11/18(日) 00:04:55プログラムを作るとき、どう区別すべきですか?
0439デフォルトの名無しさん
2007/11/18(日) 00:08:110440デフォルトの名無しさん
2007/11/18(日) 00:20:31か
for(;i<=9;)
の違いがわからんってこと?
0441デフォルトの名無しさん
2007/11/18(日) 00:23:01>=は以上ってことだし。
0442デフォルトの名無しさん
2007/11/18(日) 00:29:57elseif(B>>A) C=B
elseif(A>=B) C=A+1;
elseif(B>=A) C=B+1;
の条件分岐を作りたいんだけど
区別どうすればいいのかってね。
0443デフォルトの名無しさん
2007/11/18(日) 00:33:32AがBより非常に大きいってことを言いたいのなら、
コンピュータは 「非常に」 なんて曖昧な条件は理解できないので、
どのくらいかを具体的に指示してやらないとだめ。
if (A >= B + 1000) C = A;
とか
if (A >= B * 10000) C = A;
とか。
0444デフォルトの名無しさん
2007/11/18(日) 00:34:25C言語でそんな比較演算子は無い
単なる大小比較( > )にし問題を書き換えなさい
0445デフォルトの名無しさん
2007/11/18(日) 00:59:480446デフォルトの名無しさん
2007/11/18(日) 07:12:45「〜よりは大きいが常識の範囲内で」とか言われても判断できるわけがない。
0447デフォルトの名無しさん
2007/11/18(日) 07:37:40「非常に左が大きい」て何だよw
0448デフォルトの名無しさん
2007/11/18(日) 07:38:500449デフォルトの名無しさん
2007/11/18(日) 08:23:39判別する関数をつくりなさい。(10点)
0450デフォルトの名無しさん
2007/11/18(日) 08:30:080451デフォルトの名無しさん
2007/11/18(日) 08:38:360452デフォルトの名無しさん
2007/11/18(日) 08:44:450453デフォルトの名無しさん
2007/11/18(日) 09:15:50課題で
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スレ達成しちゃってました…)
0454デフォルトの名無しさん
2007/11/18(日) 09:27:51論理演算とビットシフトでググればわかりそうなもんだが…
&はand演算だから、左右どちらも1なら真=1になる。そうでなければ0になる。
例えば、11001100 & 11000000の結果は11000000になる。
これを右に6ビットシフトすれば00000011が得られる。
0455デフォルトの名無しさん
2007/11/18(日) 09:38:3711100010 上位ビット
01100011
00100100
11011100 下位ビット
のように格納されている
0ビットシフトさせてff = 11111111とand取れば下位ビットが出てくる
8ビットシフトさせてff = 11111111とand取れば下から二つ目が出てくる
0456デフォルトの名無しさん
2007/11/18(日) 09:42:04インライン展開するときに、Bが定数なら>451の方が効率がよくなる。
0457デフォルトの名無しさん
2007/11/18(日) 09:49:080458デフォルトの名無しさん
2007/11/18(日) 10:03:4811111111 00000000 00000000 00000000 (4278190080 = 0xff000000)
----------------------------------
11000000 00000000 00000000 00000000 (3221225472 = and後)
00000000 00000000 00000000 11000000 (192 = 24ビット右シフト後)
ビットシフトした後には0が入る。つまり1ビットシフトはx2か/2と同等。
これで理解できなければ諦めてくれ。
0459453
2007/11/18(日) 11:44:35すごくわかりやすい解説ありがとうございます。
ビットシフト自体は皆さんのご説明ですぐに理解できたのですが
「だからどうして�@:エ、�A:ウ・・・・・になるの?」というところが
なかなか理解できずレスに時間かかりました><
ただ少しばかり>>458さんに確認も含めた質問があるのですが
もしご覧になってたらお時間あればレスいただけませんか?
一行目の(192.168,101.1)というIPアドレスが最初はどこから出てきたのかさっぱり???だったのですが
これはわかりやすく例をあげるために適当?に書いてくれたのかな?と解釈しました。それでよろしいでしょうか?
あと、同じくカッコの中の3232235777や4278190080、3221225472という数字がイマイチピンとこないのですが
これはそれぞれ110000001010100000000010000001という2進法の数値を10進法で現してるものでしょうか?
(ググレ!でしたらすみません・・・ビット換算表はぐぐって今見てるのですが数字が大きすぎて・・・orz)
結局、最初の質問であった「どうして�@:エ�A:ウ・・・になるのか?」という質問についてはやっと理解できました。
みなさんご親切にどうもありがとうございました^^
0460デフォルトの名無しさん
2007/11/18(日) 12:08:51ああ、スマン間違ってる。458の2進数表記だと192.168.1.1になるね。
IPアドレス自体は例として適当に書いただけ。
数字の部分は1バイトずつにそれぞれ192、168、1、1と当てはめたものを
4バイトのunsigned int型変数addressの10進数として表現したもの。
ちなみにこの処理は欲しい部分を切り取るのによく使われる方法で「マスク」等と呼ばれたりする。
まあ頑張ってや〜。
0461デフォルトの名無しさん
2007/11/18(日) 12:51:48連結リストに末尾からデータを蓄えて指定した数字を削除し
削除後のリストを画面に表示するプログラムを作りたいのですが、
手元にある参考書を見たり、ネットで調べても分らなかったので
どなたかご教授お願いします。
0462デフォルトの名無しさん
2007/11/18(日) 12:58:05ネットで調べてわからなかったらここで聞いてもわからないんじゃない?
まずは指定した数字が何番目にあるか判定するプログラムを作ってみて、
それができたら一つ前のデータと一つ後ろのデータを連結するように書いてみればいいんじゃない?
宿題スレにいって丸投げするのが一番早いと思うけど。
0463デフォルトの名無しさん
2007/11/18(日) 13:04:03ありがとうございます。宿題スレいってみます。
0464デフォルトの名無しさん
2007/11/18(日) 15:18:47こういうプログラムを作ったのですが
これに「平均点順に並び替えて表示する」という操作を加えたいのですがよくわかりません。
お願いします。
0465デフォルトの名無しさん
2007/11/18(日) 17:31:47そのプログラムを自分で作れるなら出来ると思うけな
0466459
2007/11/18(日) 17:32:31マスクという処理方法については
名前だけ知ってたものの具体的にどういうものかまだ知りませんでした。
数字についてはまだピンときてないので引き続き2進数10進数16進数についても色々勉強してみます。
また何かわからない事ありましたら皆さんよろしくお願いします!
0467デフォルトの名無しさん
2007/11/18(日) 18:05:59よくわからないでございます
0468デフォルトの名無しさん
2007/11/18(日) 18:10:51普通のソートと同じ
0469デフォルトの名無しさん
2007/11/18(日) 18:12:50ちょっとやってみる。thx
0470デフォルトの名無しさん
2007/11/18(日) 18:40:46バブルソートで比較しては入れ替えを繰り返せばいいんじゃないか。
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内の値だけ入れ替えるのが楽なのかなぁ。
0471デフォルトの名無しさん
2007/11/18(日) 18:46:080472デフォルトの名無しさん
2007/11/18(日) 19:24:18C99のisnan
一部の独自関数_isnan
0473デフォルトの名無しさん
2007/11/18(日) 21:18:540474デフォルトの名無しさん
2007/11/19(月) 16:36:19#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です。
0475デフォルトの名無しさん
2007/11/19(月) 16:46:34従来のCではダメ
C99ならOK
0476デフォルトの名無しさん
2007/11/19(月) 17:21:09なるほど!さんくす
ちなみによく知られているコンパイラのうち、C99に対応していないものはありますか。
変数宣言が先頭じゃなくていいのは大変便利なのでぜひ使いたいんですけど、世の中の対応状況次第ではやめとこうと思います。
調べてみたらGCCはver3から対応しているみたいでした。今のGCCはver4が主流だと思うので、GCCは大丈夫ですね。
0477デフォルトの名無しさん
2007/11/19(月) 19:20:140478デフォルトの名無しさん
2007/11/19(月) 19:24:470479デフォルトの名無しさん
2007/11/19(月) 19:32:23Visual C++は対応していない。
世間一般ではGCCのようなC99に対応しているCコンパイラのほうが珍しい。
ブロック途中での変数宣言はC++だと当然の機能なんだけどね。
0480デフォルトの名無しさん
2007/11/19(月) 19:41:20最初に用意したポインタの示す値をNULL(ストッパーの役割)にして
んで次に用意したポインタの示す構造体の内部の自己参照ポインタには、その直前にあった構造体のアドレスを代入して。
繰り返すごとにどんどん構造体が繋がるってのはわかるんだけど、
例えば先頭から10個目の構造体内部を書き換えたい!って場合はどうすりゃいいの?
予め10個目ってわかるように変数で振っとけばいいの?
0481デフォルトの名無しさん
2007/11/19(月) 19:45:40構造体を先頭から辿るときに、いま何個目かわかるように、その辿った回数を数えとけばいい
0482デフォルトの名無しさん
2007/11/19(月) 19:48:20習ってたものでは一つ一つに入力の際でも、内部処理としての変数でもカウントアップさせるようなものを用意して、
その番号に直。
か、または、たどる時に何個かこっちが指定するって感じですか・・・。
難しそうだ('A`
0483デフォルトの名無しさん
2007/11/19(月) 20:10:58そういう線形リストは向いていない。配列が向いている。
0484デフォルトの名無しさん
2007/11/19(月) 20:11:35自己参照構造体というか、線形リストのことでしょ。
0485デフォルトの名無しさん
2007/11/19(月) 20:49:540486デフォルトの名無しさん
2007/11/19(月) 23:50:37狭い世間なんだね。
0487デフォルトの名無しさん
2007/11/19(月) 23:55:070488デフォルトの名無しさん
2007/11/19(月) 23:56:02求められるものなの?
0489デフォルトの名無しさん
2007/11/19(月) 23:56:54途中宣言のほうが格段に読みやすい。
0490デフォルトの名無しさん
2007/11/20(火) 00:00:330491デフォルトの名無しさん
2007/11/20(火) 00:03:410492デフォルトの名無しさん
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++;
}
0493デフォルトの名無しさん
2007/11/20(火) 00:12:09コンパイラの警告は無視しないできちんと対処しましょう。
もしそのコードで警告が出ないようなら、コンパイラのオプションを見直しましょう。
もし警告レベルを換えても警告が出ないようなら、そんなコンパイラは投げ捨てましょう。
0494デフォルトの名無しさん
2007/11/20(火) 00:12:23right--;
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 スタイル キャストまたは関数スタイルのキャストが必要です。
どこがおかしいのか教えて下さい
0495宿題スレへ逝け
2007/11/20(火) 00:16:14あんたの頭。
0496デフォルトの名無しさん
2007/11/20(火) 00:26:48今更っぽいけど、ちょい補足。
-ansiはc89相当だけど、gcc拡張機能として途中の宣言が出来るので何も言われない。
厳密にc89を適応したければ-pedanticか-pedantic-errorsを-ansiと一緒に指定する。
でもコレやると//でのコメントとかですら怒られるけどな。
0497デフォルトの名無しさん
2007/11/20(火) 00:32:57いつもならこういう煽りは見ていて腹立たしくなるが今回は同意してしまった。
0498デフォルトの名無しさん
2007/11/20(火) 08:15:27>どこがおかしいのか教えて下さい
strcmp の 1 番目の引数がおかしいって書いてあるじゃん
0499デフォルトの名無しさん
2007/11/20(火) 15:25:31true / false それぞれが何らかの整数に変換されてから
比較されるのでしょうか?
0500デフォルトの名無しさん
2007/11/20(火) 16:09:59trueは非0、falseは0としてコンパイラが評価する。
0501デフォルトの名無しさん
2007/11/20(火) 16:14:20C言語にbool型なんて無い。
0502デフォルトの名無しさん
2007/11/20(火) 16:40:31c99はcではないとでも?
0503デフォルトの名無しさん
2007/11/20(火) 16:50:141と0を保持する整数型で、比較演算では結局int型に格上げされるはず。
0504デフォルトの名無しさん
2007/11/20(火) 17:25:482番目の要素、上の文字列だと0.056を文字列検索かけてうまくとる方法教えてください
0505デフォルトの名無しさん
2007/11/20(火) 17:28:52これでいいのかな?
#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;
}
0506デフォルトの名無しさん
2007/11/20(火) 17:41:44ありがとう、うまくいきました。
私が書いた正規表現が間違ってたみたいです。
0507476
2007/11/20(火) 21:55:54遅れましたが、情報サンクスです。
VisualC++が対応していないというのは驚きですね。C++とみなしてコンパイルすればいいんだろうけど。
>>496
細かい情報ありがとう。-ansiで厳密なANSI準拠にならないというのはなんか間違ってる気がする。UIとして。
0508デフォルトの名無しさん
2007/11/21(水) 01:12:45ここに矛盾を感じない人には丁度いいのでは?
0509デフォルトの名無しさん
2007/11/21(水) 10:18:110510デフォルトの名無しさん
2007/11/21(水) 10:26:430511デフォルトの名無しさん
2007/11/21(水) 10:30:370512デフォルトの名無しさん
2007/11/21(水) 10:38:370513デフォルトの名無しさん
2007/11/21(水) 10:42:060514デフォルトの名無しさん
2007/11/21(水) 10:44:07書き換えるの意味がわからん。
122日 -> 5月2日
という感じ?
0515デフォルトの名無しさん
2007/11/21(水) 10:45:02そうです。
0516デフォルトの名無しさん
2007/11/21(水) 10:47:46うるう年を考慮するのか、とか
0517デフォルトの名無しさん
2007/11/21(水) 10:50:250518デフォルトの名無しさん
2007/11/21(水) 10:59:47自分で月数の配列作って計算してもいいけど、
標準関数使うなら、mktime で 2007年1月122日を設定(122はtm_mdayに入れる))すれば
tm_mon に0から始まる月、tm_mdayに1から始まる日が入るはず。
0519デフォルトの名無しさん
2007/11/21(水) 11:20:43ありがとうございます!
…が、初心者の俺には難しいようでした。まったくわかりません。
お手数おかけしてすみませんでした。
0520デフォルトの名無しさん
2007/11/21(水) 11:27:40if(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");
}
0521デフォルトの名無しさん
2007/11/21(水) 11:32:06struct 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);
0522デフォルトの名無しさん
2007/11/21(水) 12:38:46int 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…
0523デフォルトの名無しさん
2007/11/21(水) 12:43:41#include <string.h>
char *strstr(const char *s1, const char *s2);
http://www9.plala.or.jp/sgwr-t/lib/strstr.html
これじゃ駄目なの?
0524デフォルトの名無しさん
2007/11/21(水) 12:45:39申し訳ないです。
stiring.hを使わず、for文でループして検索するっていう条件付です;
0525デフォルトの名無しさん
2007/11/21(水) 12:51:49この前同じようなの見かけた
http://pc11.2ch.net/test/read.cgi/tech/1194016813/389-
0526デフォルトの名無しさん
2007/11/21(水) 12:54:12×s[] について検索開始位置 (j=0 ; j<256; j++)とあるが、s[j] != '\0'でで辞めるべき
×1文字でも一致していると、処理を抜けてしまう
→1文字でも不一致で処理を抜けるべき
0527526
2007/11/21(水) 13:01:08忘れずに
0528デフォルトの名無しさん
2007/11/21(水) 13:04:16ってことは根本的には間違ってるんですかね?
数文でもいいので例をあげてもらえればうれしいです。
0529デフォルトの名無しさん
2007/11/21(水) 13:07:14あっ、なるほど!
サンクスです。
0530デフォルトの名無しさん
2007/11/21(水) 13:08:29なるべく原型を留めたつもり。
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;
}
0531デフォルトの名無しさん
2007/11/21(水) 13:12:26少しわかったつもりですが、forで混乱してるかも…
>>527のヒントがすごいわかり易いんですけど、こっからつまってます。
0532デフォルトの名無しさん
2007/11/21(水) 13:21:120533デフォルトの名無しさん
2007/11/21(水) 13:25:37教えてくんでごめんなさい
0534デフォルトの名無しさん
2007/11/21(水) 15:07:20sprintf(b,"%x",a);
としたのですが
printf("%s",b[0]);
としてみたところセグメントエラーが出てしまいます
どうしてでしょうか?
aはint型変数です
0535デフォルトの名無しさん
2007/11/21(水) 15:11:50あと%xは16進数、%sは文字列だがいいのか?
b[0]がchar型なら、%cだろ?
0536デフォルトの名無しさん
2007/11/21(水) 15:12:170538デフォルトの名無しさん
2007/11/21(水) 16:36:350539デフォルトの名無しさん
2007/11/21(水) 16:56:03ウソツケ
printf("%s",b[0])
はb[0]の値をアドレスとする番地から始まるゼロ終端文字列を表示し
printf("%c",b[0])
はb[0]の値を文字コードとする文字を表示する
0540デフォルトの名無しさん
2007/11/21(水) 17:07:120541デフォルトの名無しさん
2007/11/21(水) 17:08:37後者に直せって意味で書いた
0542デフォルトの名無しさん
2007/11/21(水) 17:13:210544デフォルトの名無しさん
2007/11/21(水) 17:53:090545デフォルトの名無しさん
2007/11/21(水) 18:49:06VSだとexeファイルってできないんですかね
0546デフォルトの名無しさん
2007/11/21(水) 18:51:050547デフォルトの名無しさん
2007/11/21(水) 19:24:480548デフォルトの名無しさん
2007/11/21(水) 21:23:29return 0
がどういう意味なのかがどうしても分かりません。
return 0
があると、コンピュータは何をするのでしょうか?
0549デフォルトの名無しさん
2007/11/21(水) 21:28:57int main(void)って書いてるでしょ?
return 0;ってのは、OSに 正常終了しましたよ〜って知らせるための記述。
でなぜ0なのかってのはint main(void)ってコトからわかるように、
main関数には整数を返しますよってコトです。
まぁ余談になったけど、 正常終了 ってコトです。
0550デフォルトの名無しさん
2007/11/21(水) 21:31:20「には」じゃなくて「は」だろ。
0551デフォルトの名無しさん
2007/11/21(水) 21:32:290552デフォルトの名無しさん
2007/11/21(水) 21:35:19受け取る者がいなければ、
次のクロックで虚無に消える。
0553デフォルトの名無しさん
2007/11/21(水) 21:35:20exit(1)と同じだと認識してる・・・
0554デフォルトの名無しさん
2007/11/21(水) 21:39:370555デフォルトの名無しさん
2007/11/21(水) 22:01:01そうです。それがよく分からないんです。
正常終了したかどうかはコンピュータが判断することでは?
「これは正常終了したことにします」って人間が決めちゃうんですか?
「正常終了」の意味が分かってないんだと思います。
main()関数は引数として0か1を渡してあげないといけないということでしょうか?
1を渡した場合、どうなるのでしょうか?
0556デフォルトの名無しさん
2007/11/21(水) 22:03:030557デフォルトの名無しさん
2007/11/21(水) 22:09:00OSが何なのか分かってないのでは?
0558デフォルトの名無しさん
2007/11/21(水) 22:13:03別にプログラムから1が返ってきたからってコンピュータはどうもしないけど、
シェルスクリプトやバッチファイルでコマンドの終了状態で処理を分岐したりだとか、
make中にコンパイルが失敗した時に処理を中断したりだとか、
そういう場面で使う。
俺的には「1つのプログラムで処理が完結する場合ばっかりじゃないので、
一応お約束が決まってます」ってぐらいだと思ってるけど。
0559デフォルトの名無しさん
2007/11/21(水) 22:14:25コンピュータがどうやって「正常終了」の判断をするのかkwsk
0560555
2007/11/21(水) 22:19:560561デフォルトの名無しさん
2007/11/21(水) 22:21:03main関数からどんな値を返そうと、WindowsやUnixなど大抵のOSは何も行わない。
ただ、その値を「欲しがっているところ」に引き渡すだけ。
「欲しがっているところ」とは、単に別のプログラム、大抵はバッチファイルやシェルスクリプト。
0が正常終了というのは、シェルスクリプトらとプログラムとの間の暗黙の了解。
当時の資料を探せば何か根拠が出てくるかもしれない。
Cはそれを標準規格へ取り込んだ。
0562デフォルトの名無しさん
2007/11/21(水) 22:32:10CPUはただクロックを数えるのみ。
0563デフォルトの名無しさん
2007/11/21(水) 22:40:55繋ぎなおして先頭アドレスをmainに返すってのはわかるんだけど、
か、書けねえ・・・
なんかコツとかありますか('A`)
0564デフォルトの名無しさん
2007/11/21(水) 22:44:19ありがとうございます。
どうやら
return 0;
が何かを理解するのに必要な知識がだいぶ不足しているようです。
OSが何なのかや「make中」などが分かりません。
あてどもなくググってみたところ、
http://www.mech.utsunomiya-u.ac.jp/ozaki/education/c/text.html
の下の方の記述を見つけ、ようやっと、「一応お約束」や「暗黙の了解」
という意味が分かりました。
ただ、
return 0;
を書いた段階でプログラムが終わってしまうのは知りませんでしたが、
引数を返した時点で関数というのはそれ以上見なくなってしまうものなんですね。
もう少し勉強が必要です。少し知識を身につけてから、また皆さんの書き込み
を見たら意味が理解できるのかもしれません。ありがとうございました。
0565デフォルトの名無しさん
2007/11/21(水) 22:44:370566デフォルトの名無しさん
2007/11/21(水) 22:45:22構造体を四角、ポインタの指す方向を線で、紙に書いてやってみそ。
慣れたら、頭の中でできるようになる。
0567デフォルトの名無しさん
2007/11/21(水) 22:52:16の下の方のところ、貼っておきます。
------------------------------------
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 や 異常終了の値の型を表している.
0568デフォルトの名無しさん
2007/11/21(水) 23:11:090569デフォルトの名無しさん
2007/11/21(水) 23:50:47ret
0570デフォルトの名無しさん
2007/11/21(水) 23:59:44process.h のsystem関数で外部exeを実行できるんだけど、
system関数の戻り値がintでそのプログラムが返した値を返す。
最後にreturn 0;だったら0。return 10;だったら10。
void main()だと不定っぽい。
0571デフォルトの名無しさん
2007/11/22(木) 00:04:12#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
と出るはず。
0572デフォルトの名無しさん
2007/11/22(木) 01:13:16if文やwhile文が0以外を真としたりするので、0を返しちゃうと判定で偽になるよね?
みんなは省略形は使わずに、必ず==で何かと比較してますか?
0573デフォルトの名無しさん
2007/11/22(木) 01:16:40ほかの言語 (C++, Java, C#)でもtrueは1で、falseは0に相当するし。
0574デフォルトの名無しさん
2007/11/22(木) 02:05:04にプロジェクトで使う全ての関数をプロトタイプ宣言しています。
例えば、
<<main.hの中身>>
#include "proj1.h"
extern void test1(void);
extern int test2(int);
: // 以下色々な宣言等を列挙
といった具合です。
今までプロトタイプ宣言している関数の頭にはとりあえずexternを
書く必要があるのだろうと思っていました。
しかし、このexternを書かなくても正常にビルド出来てしまいます。
環境がVisualStudioだからでしょうか?
このextern宣言は邪魔くさいのでこれからは外して記述しようと思う
のですが、externが無い場合困るケースとしてどのような事が考えられますか?
0575デフォルトの名無しさん
2007/11/22(木) 02:50:240576デフォルトの名無しさん
2007/11/22(木) 04:51:07変数は定義になるから、extern必須。
普通は両方つけて揃えるはず。
0577デフォルトの名無しさん
2007/11/22(木) 05:19:540578デフォルトの名無しさん
2007/11/22(木) 07:20:44直接関係無いけど、なんでもかんでもグローバル関数にしないこと。
0579デフォルトの名無しさん
2007/11/22(木) 11:05:55外部参照なんだから extern つければ?
0580デフォルトの名無しさん
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];
}
}
}
0581デフォルトの名無しさん
2007/11/22(木) 13:43:27あとBMPがちゃんと確保されてるか確認した?
0582デフォルトの名無しさん
2007/11/22(木) 13:50:06BMPはちゃんと確保されてます。そのまま出力もできますし・・・
OpenGLも考えてみます。
0583デフォルトの名無しさん
2007/11/22(木) 13:51:19取り敢えずシフト量を0にして試してみたら?
0584デフォルトの名無しさん
2007/11/22(木) 14:04:32そのあと1とか小さい値にして
デバッグモードで確認して
0585デフォルトの名無しさん
2007/11/22(木) 14:07:410586デフォルトの名無しさん
2007/11/22(木) 14:11:17シフト量を0にすると、ちゃんと元の画像が出るんです。
ずらすと真っ黒になったりするんです。マイナス方向にずらすとエラーで止まってしまいますし・・・。
0587デフォルトの名無しさん
2007/11/22(木) 14:15:36それout2の領域外に書き込んでないか?
つまり配列の添え字がマイナスになったりX_SIZEやY_SIZEをオーバーしたり…
0588デフォルトの名無しさん
2007/11/22(木) 14:19:34for(j=0; j<biWidth; j++) {
y = (i+sy) % biHeight;
x = (i+sx) % biWidth;
ってしてみれば?
0589デフォルトの名無しさん
2007/11/22(木) 14:19:53やっと解決しました。
大きな理由はビットマップのビット深さを間違えてました。
どうもお手数おかけしてすいません。ありがとうございました!
0590デフォルトの名無しさん
2007/11/22(木) 14:38:340591デフォルトの名無しさん
2007/11/22(木) 14:47:41なんで
a = x[y[z[n]]];
みたいな感じ
a=z[n];a=y[a];a=x[a];
のほうが速くない?
0592デフォルトの名無しさん
2007/11/22(木) 14:56:240593デフォルトの名無しさん
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;
}
0594デフォルトの名無しさん
2007/11/22(木) 15:30:37手元の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
--
0595デフォルトの名無しさん
2007/11/22(木) 15:31:300596デフォルトの名無しさん
2007/11/22(木) 15:34:550597デフォルトの名無しさん
2007/11/22(木) 15:40:00VCだとmov,mov,...ってのにしかならない
0598デフォルトの名無しさん
2007/11/22(木) 15:44:40C/C++スレか速度スレ、或いは最適化スレへどうぞ。
>>596
あんたもスレ違い。
0599デフォルトの名無しさん
2007/11/22(木) 21:02:53っていうコード unsigned にするとやばいね 全然気づかなかったよ
0600デフォルトの名無しさん
2007/11/22(木) 21:11:230601デフォルトの名無しさん
2007/11/22(木) 21:17:310602デフォルトの名無しさん
2007/11/22(木) 21:20:46どうもありがとう
0603デフォルトの名無しさん
2007/11/22(木) 22:37:22例えば、
char *a="ABC";
char b[4];
このとき、 b[0]=A,b[1]=B,b[2]=C にしたいです。
0604デフォルトの名無しさん
2007/11/22(木) 22:39:150605デフォルトの名無しさん
2007/11/22(木) 22:41:180607デフォルトの名無しさん
2007/11/22(木) 23:01:270608デフォルトの名無しさん
2007/11/22(木) 23:16:00今日紙に書きつつ、これがこーなるから次はこうなるだろーってソース書いてったら無事動きました!
0609デフォルトの名無しさん
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
何を入力してもこの答えになってしまいます。
自分なりに見直してみたのですが間違いが分かりません。
どなたかご教示いただけたら幸いです。
0610デフォルトの名無しさん
2007/11/22(木) 23:32:030611デフォルトの名無しさん
2007/11/22(木) 23:39:050612609
2007/11/22(木) 23:40:33今の式じゃ-bがが最後に計算されてしまうってことですかね?
0613デフォルトの名無しさん
2007/11/22(木) 23:43:51あなたが書いている式は
√(b^2 - 4ac)
x1 = -b + ------------- * a
2
こんなだよ
0614609
2007/11/22(木) 23:44:12x2 = (-b-sqrt(b*b-4.0*a*c))/2.0*a;
こんな感じでいいんでしょうか?あと
warning C4996: 'scanf' が古い形式として宣言されました。
というエラーが発生してるんですがこれが原因でしょうか?
習ったとおりに書いてみたのですが。
0615デフォルトの名無しさん
2007/11/22(木) 23:46:11独自拡張とかC99とかならいけたかもしれんけど。
0616デフォルトの名無しさん
2007/11/22(木) 23:47:57最後のaは分母にかかりますよね?
>>615
そうなんですか・・・家と学校じゃ環境が違うのでそのせいかもしれません。
他に間違ってるところありますかね?
0617デフォルトの名無しさん
2007/11/22(木) 23:48:09それは警告であってエラーじゃない
0618デフォルトの名無しさん
2007/11/22(木) 23:48:110619デフォルトの名無しさん
2007/11/22(木) 23:48:15-b + √(b^2 - 4ac)
x1 = ----------------- * a
2
だな
>warning C4996: 'scanf' が古い形式として宣言されました。
warning C4996 でぐぐれ
0620デフォルトの名無しさん
2007/11/22(木) 23:48:46かからねーよwww
0621デフォルトの名無しさん
2007/11/22(木) 23:51:39なるほど・・・()付けない限り数字同士はくっ付かないんですか
ご指摘ありがとうございます。修正してみましたが、相変わらず答えは変わりません。
他に間違っているところがないのであれば家の環境が悪いということで諦めます。
0622デフォルトの名無しさん
2007/11/22(木) 23:53:550623デフォルトの名無しさん
2007/11/22(木) 23:59:22答えがでました。適当に値を入れていたのが原因でしたか・・・
こんな基礎の問題に答えてくれて助かりました。
もっと勉強しないと駄目なようです、ありがとうございました。
0624デフォルトの名無しさん
2007/11/23(金) 00:02:470625デフォルトの名無しさん
2007/11/23(金) 00:05:03応用なんてものは後回しでとにかく基礎だぜ。
0626デフォルトの名無しさん
2007/11/23(金) 00:06:460627デフォルトの名無しさん
2007/11/23(金) 00:11:14良い気分転換になる
0628デフォルトの名無しさん
2007/11/23(金) 00:12:090629助けてBOYZ
2007/11/23(金) 02:27:55ポインタ大嫌いです。
どなたか助けて下さい。
この問題が一つ目です。
【問】数字文字列を数値化する関数を作成して下さい。
<関数仕様>
書式 :short *AtoS(char *pStr, int *pRetCode);
戻り値:数字文字列のポインタ
引数 :char *pStr → 文字列の先頭アドレス
:int *pRetCode → 動作の成否を返す (正常なら:0,エラー時は-1)
※但し、NULLの時は返さない
処理 :pStrで与えられた文字列をshort型の数値に変換する
※負数(マイナス)にも対応
<考慮必要事項>
・short型の範囲外の数値文字列
・非数字文字列
・数字文字列と非数字文字列の混在(先頭の'-')は除く
・空文字列
・NULL
以上の5つはpRetCodeの示す領域にはエラーを返す、戻り値は0
0630デフォルトの名無しさん
2007/11/23(金) 02:28:53いつまで逃げ続けられるの?
終わりはあるの?
0631デフォルトの名無しさん
2007/11/23(金) 02:40:04自分で考える気がないなら宿題スレへ
http://pc11.2ch.net/test/read.cgi/tech/1195668114/
0632デフォルトの名無しさん
2007/11/23(金) 03:03:04printf("x1= %f x2= %f\n", x1, x2);
で試したのか? どうみてこうだと思うんだが
0633デフォルトの名無しさん
2007/11/23(金) 03:05:05そういう問題じゃないから
0634助けてBOYZ
2007/11/23(金) 03:11:41だけど戻り値?とか関数の意味がよく分からないし、何だかグダグダと
長いプログラムになってしまいました。
ポインタ&関数を理解するコツを教えて下さい。
0635デフォルトの名無しさん
2007/11/23(金) 03:15:180636デフォルトの名無しさん
2007/11/23(金) 03:15:18文字列を数値化するのに文字列へのポインタ返してどうしろと
0637助けてBOYZ
2007/11/23(金) 03:22:30一応表示はされたんですけど…
ちょっとチェックして下さい。
おかしいところ教えて下さい。
0638助けてBOYZ
2007/11/23(金) 03:26:42short 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;
0639助けて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;
0640デフォルトの名無しさん
2007/11/23(金) 05:10:13次からは宿題スレへ
#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;
}
0641640
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;
}
0642デフォルトの名無しさん
2007/11/23(金) 09:05:09> pStr[i] = pStr[i] - '0';
文字列へのポインタ貰った関数が、中身を書き換えちゃいけない。
呼び出し側が、
n=AtoS("12345", &x);
とした場合、pStrの指す先は書き換えは不可能である処理系が多い。
普通、こういう文字列へのポインタを貰う関数は、
short AtoS(const char *pStr, int *pRetCode)
のようにconstを付ける。
0643デフォルトの名無しさん
2007/11/23(金) 09:23:18for(s=*pStr=='-'?1:0,pStr+=s,n=0;*pStr != '\0' && *pStr>='0' && *pStr<='9' && n>=-32768;pStr++)
n=n*10-*pStr+'0';
↑こういう可読性の悪い書き方はやめようぜ…
0644デフォルトの名無しさん
2007/11/23(金) 09:24:470645デフォルトの名無しさん
2007/11/23(金) 10:41:36(x[0]-x[1])/x[1] + r * (x[1]-x[2])/x[2] + r^2 * (x[2]-x[3])/x[3] + ・・・
という計算を多くするとき計算が速く終わるコードって分かりますか?
x[n]は変化します 厳密な値ではなくていいです
0646デフォルトの名無しさん
2007/11/23(金) 10:42:450647デフォルトの名無しさん
2007/11/23(金) 10:54:43(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
とすれば速そうですね
0648デフォルトの名無しさん
2007/11/23(金) 11:57:13-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以降は計算しなくてもいいと思う。
0649デフォルトの名無しさん
2007/11/23(金) 12:22:00サンクス
0650574
2007/11/23(金) 13:43:42ありがとうございました。
プロトタイプ宣言はやはり暗黙的にexternのですね。
社内のソースと合わせるため、一応これからはグローバルな関数はexternを付けて区別していこうと思います。
0651デフォルトの名無しさん
2007/11/23(金) 14:22:28それより前に static なプロトタイプ宣言や関数定義がなければ extern になり、
あれば static になる。
0652デフォルトの名無しさん
2007/11/23(金) 14:24:280653デフォルトの名無しさん
2007/11/23(金) 14:26:23ヘッダファイルはファイルの先頭でインクルードするしで、
>>651 のような曖昧さがあっても実際の所これが問題になる事はない。
extern をつけるかどうかは好みの問題。
0654デフォルトの名無しさん
2007/11/23(金) 15:14:15すまん。
前2行と後ろ2行の関係が分からん。
出来ればもうちょい詳しく頼む。
0655デフォルトの名無しさん
2007/11/23(金) 15:39:55ヘッダファイルは彼にとって何か特別なものなのかもしれないが。
0656デフォルトの名無しさん
2007/11/23(金) 15:52:05前2行の理由により、普通はヘッダファイル内にあるプロトタイプ宣言より先に
static なプロトタイプ宣言や関数定義が現れることはないから、
実質的には暗黙的に extern になると考えても問題ないという話。
0657デフォルトの名無しさん
2007/11/23(金) 19:14:430658デフォルトの名無しさん
2007/11/23(金) 19:36:030659デフォルトの名無しさん
2007/11/23(金) 19:59:26学生とSEばっか
0660デフォルトの名無しさん
2007/11/23(金) 20:09:550661デフォルトの名無しさん
2007/11/23(金) 20:13:13SEが居るならプログラマも居る事になるんだよ
0662デフォルトの名無しさん
2007/11/23(金) 20:19:420663デフォルトの名無しさん
2007/11/23(金) 20:21:40特に若い人。
0664デフォルトの名無しさん
2007/11/23(金) 20:35:16なってみたら優れたコードとかは二の次で動くコードを書く人だと知った。
0665デフォルトの名無しさん
2007/11/23(金) 20:40:150666デフォルトの名無しさん
2007/11/23(金) 21:25:120667デフォルトの名無しさん
2007/11/23(金) 21:44:550668デフォルトの名無しさん
2007/11/23(金) 21:46:47渡す機会は無いけど
0669デフォルトの名無しさん
2007/11/23(金) 21:47:29「システムエンジニア」と書くんだよ。
0670デフォルトの名無しさん
2007/11/23(金) 21:48:33自社以外の人にいっさい会わないで、こもって仕事してるならいらないけど。
名詞の肩書きに「プログラマー」とか入ってないって意味?
0671デフォルトの名無しさん
2007/11/23(金) 21:50:100672デフォルトの名無しさん
2007/11/23(金) 21:50:430673デフォルトの名無しさん
2007/11/23(金) 21:54:02使うときに1枚だけプリンタから出せってことだよ。
0674デフォルトの名無しさん
2007/11/23(金) 21:58:230675デフォルトの名無しさん
2007/11/23(金) 22:03:15SEとして派遣されたら名刺だすけどさ
0676デフォルトの名無しさん
2007/11/23(金) 22:10:23どんだけ貧乏な会社なんだよ。
100枚1000円ぐらいなのに…
0677デフォルトの名無しさん
2007/11/23(金) 22:11:360678デフォルトの名無しさん
2007/11/23(金) 22:15:030679デフォルトの名無しさん
2007/11/23(金) 23:19:51わたくしどもはお客様の会社にプログラマを派遣いたしております
わたくしどもは常に優秀な人材を取り揃えてございます
おたくの会社にもおひとついかがでしょうか?
0680デフォルトの名無しさん
2007/11/23(金) 23:23:290681デフォルトの名無しさん
2007/11/23(金) 23:32:04笑えない話なのさ
0682デフォルトの名無しさん
2007/11/23(金) 23:47:54最初はpow(5,0)=1,pow(5,1)=5,(5,2)=25....と順調です。
しかし、pow(5,23)の時に本来ならば11920928955078125のはずなのですが、
なぜか11920928955078124と1小さい数になってしまいます。
pow(5,24)以降も正しい数値が得られず誤差がどんどん大きくなっていってしまいます
この原因が全く分からず途方にくれている状態です…よろしくお願いします。
0683デフォルトの名無しさん
2007/11/23(金) 23:50:40ttp://ja.wikipedia.org/wiki/%E8%AA%A4%E5%B7%AE#.E8.A8.88.E7.AE.97.E8.AA.A4.E5.B7.AE.E3.81.AE.E7.A8.AE.E9.A1.9E
0684デフォルトの名無しさん
2007/11/23(金) 23:51:45doubleの有効桁数を超えてるとか。
0685デフォルトの名無しさん
2007/11/23(金) 23:57:530686デフォルトの名無しさん
2007/11/24(土) 00:15:23倍精度浮動小数点で普通使われるIEEE 754 形式だと仮数部52ビットだけど、
pow(5,23)で52bitを超えるから、以降は誤差が出る。
誤差を避けるためには自分で作るしかない。
でも多分そういうアルゴリズムは探せばあるよ。
0687デフォルトの名無しさん
2007/11/24(土) 01:53:27をlog計算するためにプログラムでかくにはどうすればいいですかね?
0*確率なら0になるから処理の結果に影響ないんだけど
logだと0にならないんで困るわ。
0688デフォルトの名無しさん
2007/11/24(土) 01:54:200689デフォルトの名無しさん
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でなければ数値は残ってしまういうわけ。
これでプログラムになやんでるんですよ。
0690デフォルトの名無しさん
2007/11/24(土) 02:13:560691689
2007/11/24(土) 02:35:46いま、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の計算なので。
0692デフォルトの名無しさん
2007/11/24(土) 02:39:14なんだお前か
氏ね
0693689
2007/11/24(土) 02:46:150694デフォルトの名無しさん
2007/11/24(土) 02:47:250695デフォルトの名無しさん
2007/11/24(土) 03:40:220696デフォルトの名無しさん
2007/11/24(土) 03:57:50人に説明する気はありますか?
宿題スレでも、簡単なことを訳の分からない説明してたし
考えていることを整理してみてはどうでしょう?
エスパーしておくと、対数を使うのは外部データの入出力のときだけで
内部での計算は対数を使わなくていいんじゃないかと・・・
(どうせ浮動小数点だし)
0697デフォルトの名無しさん
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| \ ソ
0698デフォルトの名無しさん
2007/11/24(土) 09:21:52>ただlogで計算する場合に、logはlog(A*B)=logA+logBという性質があるので
>Aが0であってもBが0でなければ数値は残ってしまういうわけ。
なんで、そんな偉そうにウソを語るんだ。
0699デフォルトの名無しさん
2007/11/24(土) 09:53:500700デフォルトの名無しさん
2007/11/24(土) 10:03:19よく分からんが、log0って出来ないんじゃないの?
0701デフォルトの名無しさん
2007/11/24(土) 10:06:58確率変化を積じゃなく和で表現したいんだろうな。
log(0) は CPU によっては -inf (マイナス無限大) として扱われるから、
そういう CPU では特に問題は発生しないと思うんだけど。
0702デフォルトの名無しさん
2007/11/24(土) 10:45:05レスサンクス!
結局、多倍長演算をするためにGMPとやらを入れてみました。
しかしGMPの関数を解説してるサイトの少ないこと…
どんな関数があるのか、引数の意味は何かとかさっぱり分からないorz
0703デフォルトの名無しさん
2007/11/24(土) 11:32:52サーバーはサーバーでリッスンさせといて、クライアントはメッセージを入力すると相手サーバーへ飛ぶ、
と考えたんだけど、先にサーバーソケットをaccept()でループさせとくと、後のクライアント処理に行けなくて困ってる。
スレッド使わないとムリ?
0704デフォルトの名無しさん
2007/11/24(土) 11:55:20>スレッド使わないとムリ?
無理。素直にスレッド立てれ。
0705デフォルトの名無しさん
2007/11/24(土) 11:57:220706デフォルトの名無しさん
2007/11/24(土) 12:00:22全然(標準)Cじゃねーじゃねーか
0707デフォルトの名無しさん
2007/11/25(日) 00:04:32苦Cのサイトに、「for文はwhile文を拡張した文」と書いてあったのですが、
while文が先にできて後でfor文を追加したのでしょうか?
while文でなければできないことや、while文でやった方がいいこと、またその逆など、
ありましたら教えてください。よろしくお願いいたします。
0708デフォルトの名無しさん
2007/11/25(日) 00:10:58とりあえずループカウンタをつかってるループはfor()を使っておけばいいんじゃないの?
0709デフォルトの名無しさん
2007/11/25(日) 00:17:10while文でできてfor文でできないことや、その逆のことは、ない。
i = 0;
while (i < 10) {
....
i++;
}
と
for (i = 0; i < 10; i++) {
...
}
のどちらが読みやすいか?
その程度の問題。
0710デフォルトの名無しさん
2007/11/25(日) 00:19:45for(;;) // ループ途中で continue を行っても for の第三項が実行される
0711デフォルトの名無しさん
2007/11/25(日) 00:36:29ありがとうございます。
文法的にwhile文の方が見やすいので、個人的にはそちらを使おうかと思っています。
一般的にはどういう使い分けがされてるとか、「慣習」や「常識」みたいのはありますでしょうか?
0712デフォルトの名無しさん
2007/11/25(日) 00:54:110713デフォルトの名無しさん
2007/11/25(日) 01:03:140714デフォルトの名無しさん
2007/11/25(日) 01:04:49回数が固定なら for,未定なら while が一般的だと思う
たとえば,「荷物を10個選ぶ」なら for で,「荷物を10kg分選ぶ」なら while とか
0715デフォルトの名無しさん
2007/11/25(日) 01:07:00内容の容量の制限したいときにforではせんわな。
あープログラムつくらないといけないのに
作る気がしない。
作り始めたら5,6時間いけるのに
そういうのが全然ない。
0716デフォルトの名無しさん
2007/11/25(日) 09:10:10オイラは無限ループは while 使うようにしてるな。
do while は使わなくなった。
0717デフォルトの名無しさん
2007/11/25(日) 09:50:56continue しても実行されるから。
0718デフォルトの名無しさん
2007/11/25(日) 11:06:17この辺の習慣は環境で変わるんだろうね
0719デフォルトの名無しさん
2007/11/25(日) 11:08:380720デフォルトの名無しさん
2007/11/25(日) 13:30:51どういう警告?
0721デフォルトの名無しさん
2007/11/25(日) 13:42:40C4127
0722デフォルトの名無しさん
2007/11/25(日) 15:10:01C99すごすぎ。
0723デフォルトの名無しさん
2007/11/25(日) 17:28:24再実験でそのプログラムを作ってるんだけど。
データ100でそのうちの何個かで認識率を出すって感じで
今ようやくデータ1つで数値を出せるようになった。
データ100個をプログラムで入力できるようにして自動でしたいんだけど
結構複雑。
データ1つ入力して値をだして100回するのも
認識率1%とかいうやって意味あるのか的な感じがして自重してる。
しかしプログラムの内容を率でだされるのっていやだね。
0724デフォルトの名無しさん
2007/11/25(日) 17:36:310725デフォルトの名無しさん
2007/11/25(日) 18:57:23これか
0726デフォルトの名無しさん
2007/11/25(日) 19:48:100727デフォルトの名無しさん
2007/11/25(日) 20:01:280728デフォルトの名無しさん
2007/11/25(日) 20:02:510729デフォルトの名無しさん
2007/11/25(日) 20:03:100730デフォルトの名無しさん
2007/11/25(日) 20:13:07一行ずつ読み取る方法がありますが、
どういう場合に使い分けるんですか?
0731デフォルトの名無しさん
2007/11/25(日) 20:14:23ファイルを1文字ずつ読み取りたい場合は1文字ずつ読み取る方法を使い、
1行ずつ読み取りたい場合は1行ずつ読み取る方法を使う。
0732デフォルトの名無しさん
2007/11/25(日) 20:16:090733デフォルトの名無しさん
2007/11/25(日) 20:30:51例えばどんな場合がありますか?
0734デフォルトの名無しさん
2007/11/25(日) 20:43:56行に意味があるときには行単位で読んだほうが楽
行に意味がないときには文字単位で読んだほうが楽
0735デフォルトの名無しさん
2007/11/25(日) 22:13:40テキストファイルは1行ずつ読む。
0736デフォルトの名無しさん
2007/11/25(日) 22:39:40さらっと嘘教えるな
0737デフォルトの名無しさん
2007/11/25(日) 23:10:37たとえばunsigned int型を同じ型でキャストした場合です
0738737
2007/11/25(日) 23:17:160739デフォルトの名無しさん
2007/11/25(日) 23:39:110740デフォルトの名無しさん
2007/11/26(月) 00:22:380741デフォルトの名無しさん
2007/11/26(月) 01:08:03分かり易い説明をありがとうございます。
>>709の例で言うと、for文を使う方が一般的、ということですね。
どちらも i を宣言しないといけないことに変わりはないんですね。
0742デフォルトの名無しさん
2007/11/26(月) 05:05:13ループごとにある関数を呼んで、その結果が真の時のみループを抜ける、とかな。
while (func() != 0)
{
〜何かの処理〜
}
まあforでも実現できるから、どっちでもいいんじゃない?
0743デフォルトの名無しさん
2007/11/26(月) 09:16:5830日位考えれば作れるようなプログラムとかどのような物があります?
大学にも行けなかったような頭なので、そこまで難しい物はまず出来ませんが。
0744デフォルトの名無しさん
2007/11/26(月) 09:31:01トランプのポーカーを AI 付で
0745デフォルトの名無しさん
2007/11/26(月) 09:36:18OS。本が売ってるからそれに従えばおk
0746デフォルトの名無しさん
2007/11/26(月) 09:55:58色々ネットにソースありましたが、AIって部分が難しそうですね・・・
ゲーム作ってみたかったので参考にさせて頂きます。
>>745
アセンブラも使うそうですし、OSとなると自分には無理な気がしてならないですがw
30日でOSが出来るならとなると少し興味もありますね。
レビューのみでは分からなかったのでこれから本屋行って二つを見て周って来ます
レス下さった方有難うございました
0747デフォルトの名無しさん
2007/11/26(月) 13:45:16例えば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
という風に格納したいのですが、どういう風にプログラムを書けばいいのか思いつきません
よろしくお願いします。
0748デフォルトの名無しさん
2007/11/26(月) 13:48:11scanf("%d", &n);
for(i=0; n; i++, n/=10) a[i] = n % 10;
0749デフォルトの名無しさん
2007/11/26(月) 14:06:25ありがとうございます!
int型やdouble型以上の桁の数字を扱う方法として
一桁ずつ格納する方法ならば!と思ったのですが、
どちらにしろ一度int型の変数に代入しないといけないことにプログラム見て気付きましたorz
char型の配列(例えばstr[256])に文字として数値を文字として格納した後に、
それをint型の配列(a[256])に入れなおすことって出来ませんよね…
0750デフォルトの名無しさん
2007/11/26(月) 14:19:16こういうこと?
char buf[] = "123456789";
int val[sizeof(buf)];
for (unsigned ic = 0; ic < sizeof(buf); ++ic) {
val[ic] = buf[ic] == '\0' ? 0 : buf[ic] - '0';
}
0751デフォルトの名無しさん
2007/11/26(月) 14:20:01char str[256];
scanf("%s", str);
for(i=0; str[i]; i++);
whil(i--) a[j++] = str[i] - '0';
0752デフォルトの名無しさん
2007/11/26(月) 14:20:10{
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と出力されます。
どこがおかしいのでしょうか?
0753デフォルトの名無しさん
2007/11/26(月) 14:25:38>どこがおかしいのでしょうか?
頭。
コードと結果が合致してさえいないぞ。自分のコードくらい間違うな。
0754デフォルトの名無しさん
2007/11/26(月) 14:29:45ヒント: 上書きと交換は違う
0755デフォルトの名無しさん
2007/11/26(月) 14:31:48ヒント: ピントが外れている
0756デフォルトの名無しさん
2007/11/26(月) 14:32:11お前の頭もおかしいよ
0757デフォルトの名無しさん
2007/11/26(月) 14:36:06自分の頭(紙と鉛筆でもいい)の中で実行して
1行ずつ変数の中身がどうなるか考えてみよう
ループを展開するんだ。
a[0] = a[5-1];
a[1] = a[5-1];
・
・
・
0758デフォルトの名無しさん
2007/11/26(月) 14:36:57お前もちゃんとコード見ろ
0760デフォルトの名無しさん
2007/11/26(月) 14:52:32a[i] = a[n-1] を
int temp = a[i];
a[i] = a[n-1];
a[n-1] = temp;
にすればok
0761デフォルトの名無しさん
2007/11/26(月) 14:58:310762デフォルトの名無しさん
2007/11/26(月) 15:31:04具体的にどう実装する?
0763デフォルトの名無しさん
2007/11/26(月) 15:33:38>760の例なら
a[i] <> a[n - 1];
とか。
評価の回数を減らせるし、swapマクロを作って自爆することもなくなるし、
CPUに交換ニモニックがあれば使えるべさ。
0764デフォルトの名無しさん
2007/11/26(月) 16:08:54演習内容うpするので教えてくれませんか?
0765デフォルトの名無しさん
2007/11/26(月) 16:16:21スレ違い
0766デフォルトの名無しさん
2007/11/26(月) 16:18:44キティーだから許して。スレ違いだったらスマン
板いろいろ探したんだが、何処で聞いたらいい?
ググレ以外の回答を頼むw
0767デフォルトの名無しさん
2007/11/26(月) 16:26:09http://pc11.2ch.net/test/read.cgi/tech/1195668114/l50
0768デフォルトの名無しさん
2007/11/26(月) 16:26:32宿題スレも見つけられないなら大人しく首括っとけ。
0769デフォルトの名無しさん
2007/11/26(月) 17:57:03文字列をLONGLONG型の整数値に変換したいんですが、atoll関数が見つかりません。
Visual C++ 2005の環境では、atoll関数は自作するしかないでしょうか。
0770デフォルトの名無しさん
2007/11/26(月) 17:58:25つ[strtoll()]
0771デフォルトの名無しさん
2007/11/26(月) 18:42:360772デフォルトの名無しさん
2007/11/26(月) 18:51:110774デフォルトの名無しさん
2007/11/26(月) 19:59:33VC2005はC99に未対応じゃね?
0775デフォルトの名無しさん
2007/11/26(月) 20:56:490776デフォルトの名無しさん
2007/11/26(月) 21:01:58入門書卒業後何をしたらいいのやら。
グラフィック系統の本みたけど、これを利用してぱらぱら漫画みたいなの作れないですか
0777デフォルトの名無しさん
2007/11/26(月) 21:05:110778デフォルトの名無しさん
2007/11/26(月) 21:06:05それだけなら画像表示ツール自身でできるからなぁ。
あんたの質問は、「英語で何ができますか?」と同じくらい無意味なんだよ。
0779デフォルトの名無しさん
2007/11/26(月) 21:40:46int 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になるんですが、何か見落としてるのでしょうか。
0780デフォルトの名無しさん
2007/11/26(月) 21:47:040781デフォルトの名無しさん
2007/11/26(月) 21:48:45>何か見落としてるのでしょうか。
夢
冗談さておき、"w"でオープンしたストリームからは読み込めません。
まして、fprintf()で出力した先には何もありません。
0782デフォルトの名無しさん
2007/11/26(月) 21:49:26ありがとうございます。
また"r"で開きなおさないとダメなんですね。
"r+"とか"w+"の使い方もいまいち不明だし。
0783デフォルトの名無しさん
2007/11/26(月) 21:58:29"r+"と"a+"の違いって何でしょう?
両方ともファイルに出力したら追記されますよね。
単純にファイルが新規に作成されるか否かですか?
0784デフォルトの名無しさん
2007/11/26(月) 22:01:41a+ はファイルの終わりにしか書き込めない。
0785デフォルトの名無しさん
2007/11/26(月) 22:14:53挿入可能って事ですか?
それとも上書きが出来るって事でしょうか。
色々試してみてるけど思うように扱えないです。
0786デフォルトの名無しさん
2007/11/26(月) 22:23:12#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;
}
0787デフォルトの名無しさん
2007/11/26(月) 22:32:56上記の例で、"a+"だと、
10
1030
と出力されちゃうんですね。
fseek関数はまだ触った事ないので勉強してみようと思います。
0788デフォルトの名無しさん
2007/11/26(月) 23:07:17読んだときか書き込んだときでかは忘れたけど、数字で
int型の4バイトの時と、char型の1バイトの時があってイミフ。
チラシの裏で馬鹿なレスだからスルーしてね^^ */
0789デフォルトの名無しさん
2007/11/26(月) 23:43:55それは恐らくfseek()が判らないのではなくて、fprintf()で書き込むのかfwrite()で書き込むのかの
違いがよく判っていないんジャマイカ。
>>787
書き込み後は、fseek()(或いはそのサブセットのrewind())をするか、明示的にfflush()しないと
書き込んだ結果が実際のストリームに出力される保障がないことに注意。
まぁ、ファイル先頭に移動するにはrewind()の方が判りやすいだろうね。
0790デフォルトの名無しさん
2007/11/26(月) 23:56:48記録した情報を順番に読み取って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++;}
こんな感じで書いてるんですが、どこかおかしいところがあればご指摘ください。
0791デフォルトの名無しさん
2007/11/27(火) 00:13:53a = new float();
*a = 120;
float *temp = a;
これはOKですよね
float *temp = 120
これはなんでダメなんですか?
0792デフォルトの名無しさん
2007/11/27(火) 00:29:03120を変数に格納して、その変数のアドレスをtempに渡すなどする必要がある。
0793デフォルトの名無しさん
2007/11/27(火) 00:30:170794デフォルトの名無しさん
2007/11/27(火) 00:30:490795デフォルトの名無しさん
2007/11/27(火) 00:32:19float *tempは、ポインタとして宣言してる状態で、そこにaのアドレスが入って、
temp = a となっている、ということですか?上の例だと
で、3行目の
*a =120 は aのアドレスをもったところに120をぶち込んでる、ということで
float *tempとは別ものなんですよね?
0796デフォルトの名無しさん
2007/11/27(火) 00:47:27451.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などがわかっていないのでよろしくお願いします。
0797デフォルトの名無しさん
2007/11/27(火) 00:47:38*a=120の*はデリファレンス、float *tempの*はポインタ宣言。
0798ワカメ高専
2007/11/27(火) 01:05:59これをラグランジュで求めて結果を出力するプログラムを作れって(c or c++)言われたけどさっぱりでしゅ
0799デフォルトの名無しさん
2007/11/27(火) 01:44:24課題丸投げは宿題スレへ
http://pc11.2ch.net/test/read.cgi/tech/1195668114/
0800デフォルトの名無しさん
2007/11/27(火) 01:49:31i=0;
while(1){
if (fscanf(fp, "%lf", &data[i]) == EOF) {
break;
}
i++;
}
0801デフォルトの名無しさん
2007/11/27(火) 01:55:32そう。上の例は
float *a;
a = new float();
*a = 120;
float *temp;
temp = a;
に等しい。下の例は
float *temp;
temp = 120;
ということになる。floatポインタに整数120は代入できない(型が異なる)のでエラー。
0802デフォルトの名無しさん
2007/11/27(火) 02:14:260803デフォルトの名無しさん
2007/11/27(火) 02:16:13別に駄目じゃねーよ。
期待してるのとは違う動作だろうけどな。
0804801
2007/11/27(火) 02:19:440805デフォルトの名無しさん
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;
}
0806デフォルトの名無しさん
2007/11/27(火) 04:59:03C++を理解しているなら、new演算子が何をやっているのか知ってるんじゃないの?
メモリの確保と初期化。下の例では、new演算子に相当する処理が抜けている。
0807デフォルトの名無しさん
2007/11/27(火) 07:07:00最近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のソース見ていると同じようなパターンばかりなので何か理由があるのでしょうが。。。)
どなたかご教授お願いします。
0808デフォルトの名無しさん
2007/11/27(火) 07:46:42多分そのまま使っておk。
>dst_lenや変換した文字の書き出し先の最大長や
バッファオーバーフロー回避のため。
>src_len 変換元の文字の長さ
必ずしも「文字列の最後まで」とは限らないから。
0809デフォルトの名無しさん
2007/11/27(火) 10:47:12>何でポインタとして宣言したものに、アドレス以外の値を代入しようなどと考えるのか?
この一文を見て
なんでポインタってアドレスだけで使うのに
float *a = malloc(sizeof(float));
*a = 123;
こんな使い方があるんだろう、って思った。
アドレス以外入れれないようにすればいいのに
だからポインタ理解するまで時間掛かるんだよ…ハァ
0810デフォルトの名無しさん
2007/11/27(火) 11:01:01定数以外で初期化ってできたっけ?
0811デフォルトの名無しさん
2007/11/27(火) 11:18:340812デフォルトの名無しさん
2007/11/27(火) 11:27:420813デフォルトの名無しさん
2007/11/27(火) 11:36:230814デフォルトの名無しさん
2007/11/27(火) 11:40:03作れる
0815デフォルトの名無しさん
2007/11/27(火) 11:42:34とかは商用無理ですよね
0816デフォルトの名無しさん
2007/11/27(火) 11:43:30聞いた事ないぞそんな事。
0817デフォルトの名無しさん
2007/11/27(火) 11:43:51使用許諾を読めばいいんじゃない?
0818デフォルトの名無しさん
2007/11/27(火) 11:51:33両方とも商用利用できるよ
0819デフォルトの名無しさん
2007/11/27(火) 11:59:300820デフォルトの名無しさん
2007/11/27(火) 12:08:15ボーランドのコンパイラは商用可能なやつと商用不可の両方があります
0821デフォルトの名無しさん
2007/11/27(火) 12:08:170822デフォルトの名無しさん
2007/11/27(火) 14:27:00確かに、url_encode()内で文字列長を調べ、必要なメモリサイズを計算し、
メモリを確保してそこへ書き込み、確保したアドレスを返すことは可能です。
しかし、例えば非常に短い間しか必要としない場合、わざわざmallocして
解放漏れのないようコーディングするより、スタック上で済ませた方が
楽チンだったりもします。
また、返って来たアドレスは本当にmallocされたものでしょうか?
staticな変数として関数内に確保されていない、という保証を誰が約束して
くれるのでしょうか?今のバージョンではmallocされていたとして、将来の
バージョンでもmallocされ続ける保証は?
そんなわけで、この手の関数ではバッファの確保を呼び出し側の責任と
する場合が多いです。
そして、確保されたバッファを越えて書き込んで(バッファオーバーフロー)
しまわないよう、何バイトまでなら書き込んでもいいのか、引数として受け取る
という仕様になります。
0823デフォルトの名無しさん
2007/11/27(火) 20:48:22とした場合、str1とstr2にはそれぞれ何が入るんですか?
0824デフォルトの名無しさん
2007/11/27(火) 20:51:53str1: ゴミ
str2: "DRAGONQUEST"
だと思います
0825デフォルトの名無しさん
2007/11/27(火) 20:53:26ありがとうございます。
ゴミというか空ですかね??
0826デフォルトの名無しさん
2007/11/27(火) 20:55:12ゴミ。なにが入っているか分からない。
0827デフォルトの名無しさん
2007/11/27(火) 20:55:53出力してみればわかる。
str1[256] = {0} として中身全て0で初期化しない限りゴミが入ってる
0828デフォルトの名無しさん
2007/11/27(火) 20:56:50関数内で宣言したなら、たまたまそこの領域に
あったバイト列がそのまま残ってる。
0829デフォルトの名無しさん
2007/11/27(火) 21:08:33出力してみたら、
フフフフフフフフフフフフフフフフフフフフフフフフ『
となってました。最後の『は、なんか半角の変換できない文字です。
エラーにはならず出力できるんですね。不思議・・・intだとエラーになるのに。。
>>828
main()関数の中で宣言した場合でも当てはまりますか?
0830デフォルトの名無しさん
2007/11/27(火) 21:16:34フフフ・・はデバッグ時に特定のバイト列いれてるんだよ。
リリースビルドしたら結果は変わる
static つけるか関数の外なら0に初期化される。
mainも例外ではないが、未使用の場所ならたまたま0になってることもあるかもな
0831デフォルトの名無しさん
2007/11/27(火) 21:17:22フフフフが入ってるのは、VC++で、デバッグビルドしたときだけな。
(他のコンパイラでも、フフフで埋めてるのがあるかもしれんけど)
0832デフォルトの名無しさん
2007/11/27(火) 21:32:01ホントだ〜〜リリースビルドするたびに結果が変わります。
最初は何も表示されなかったんですが、これが 0 ということでしょうか?
static をつけたら、何度やっても何も表示されなくなりました。
0833807
2007/11/27(火) 22:16:39>>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
のサイズはどう設定すればよい(どこまで大きく設定してよい)のでしょうか?
0834デフォルトの名無しさん
2007/11/27(火) 22:51:21staticをつければ0に初期化されるが、staticの意味をちゃんと理解して使わないとだめよ。
0835デフォルトの名無しさん
2007/11/27(火) 22:55:35{
int i,t;
t=4649;}
としたときに
void array_double(int *a)
{printf("%d",t);}
と異なる関数の値を利用したいのですが、可能ですか?
0836デフォルトの名無しさん
2007/11/27(火) 22:56:16ケースバイケースだが、URLの場合最大長が決まってるはず。
それをMAXにすればいいと思う。
URLの最大長は、HTTP仕様に書いてあったと思う。
0837デフォルトの名無しさん
2007/11/27(火) 23:00:03array_input内のtを使いたいってことなら無理
グローバル変数を用意するか,array_doubleに引数で与える
0838デフォルトの名無しさん
2007/11/27(火) 23:00:32グローバル変数じゃないと不可能。
何でそんなことしたいん?
0839デフォルトの名無しさん
2007/11/27(火) 23:09:43グローバル変数ならいけるけど、変数衝突おきやすいからなぁ
0840デフォルトの名無しさん
2007/11/27(火) 23:18:46{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;}}
いえば、こういうことをしてみたいのですが…
0841デフォルトの名無しさん
2007/11/27(火) 23:26:54のように、256の要素で宣言する例示が多いのは何故ですか?
0842デフォルトの名無しさん
2007/11/27(火) 23:32:05あなたが何をやりたいのか見当がつかなくなった
0843デフォルトの名無しさん
2007/11/27(火) 23:38:54なんとなく切りがいいからでしょう。
0844デフォルトの名無しさん
2007/11/27(火) 23:52:138ビットで、255まで数えられるんですよね?
とすると、0を入れて、256まで配列を作ると、実際には257の文字列が
用意されていることになるんでは?
254なら8ビットで表せてキリがいいのは分かるんですが・・・
0845デフォルトの名無しさん
2007/11/27(火) 23:53:280846デフォルトの名無しさん
2007/11/27(火) 23:54:350847デフォルトの名無しさん
2007/11/27(火) 23:54:558ビットは、0〜255だ。0を数え忘れてないか。
char str[256]; は、0〜255までの256個だ。257番目は使えない。
0848デフォルトの名無しさん
2007/11/27(火) 23:54:57「一回に扱える処理のデータ単位が32ビットのコンパイラ」
って意味でいいんでしょうか?
0849デフォルトの名無しさん
2007/11/27(火) 23:55:110850デフォルトの名無しさん
2007/11/27(火) 23:57:230851デフォルトの名無しさん
2007/11/28(水) 00:04:10ふつう32ビットのコンパイラっていうと、コンパイラ自身が32ビットなんじゃなくて、32ビットコードを生成できるコンパイラのことだと思う
「一回に扱える処理のデータ単位が32ビットのCPU」 上で動くようにプログラムをコンパイルできるコンパイラ…かな
0852デフォルトの名無しさん
2007/11/28(水) 00:06:59知らないけど、log取ってるかもね
0853デフォルトの名無しさん
2007/11/28(水) 00:12:41なるほど。そうなんですね!
8ビットを、0〜254 と勘違いしてました。
0を入れて、全部で256なのは分かったんですが、ここでもう一つ疑問が。。
プレステ2のFFXなどでパラメータの最大値は 255 なんですが、
なぜ、256 ではないんでしょうか?
0854デフォルトの名無しさん
2007/11/28(水) 00:15:45なるほど。そんな正確な言葉で説明していただきたかったんです。
ありがとうございました!
0855デフォルトの名無しさん
2007/11/28(水) 00:22:20double pow(double x, double y) {return exp(log(x) * y);}
かも知れない。
>>853
0-255を表せるから、255にしておくのが無難と言うわけ。
0856デフォルトの名無しさん
2007/11/28(水) 00:23:260〜255だからだろ
0857デフォルトの名無しさん
2007/11/28(水) 00:25:380858デフォルトの名無しさん
2007/11/28(水) 00:37:12とした場合、p1もp2もポインタ変数になるんでしょうか?
0859デフォルトの名無しさん
2007/11/28(水) 00:38:29もしかしてもしかすると、パラメータは0から始まっていたかもしれません。
もう一度確認してみます!!
0860デフォルトの名無しさん
2007/11/28(水) 00:40:37試してみれば分かるが、そうはならない。
*はp1にしか係らない。
0861デフォルトの名無しさん
2007/11/28(水) 00:44:23勉強中ですので試してみ方がよく分からないのですが、とりあえず理解しました。
ありがとうございました。(初歩的な質問すみません)
0862デフォルトの名無しさん
2007/11/28(水) 01:02:48とかは< >で記述するのに、自作ヘッダーファイルなどは
#include "jisaku.h"
のように" "で記述するのは何故ですか?
0863デフォルトの名無しさん
2007/11/28(水) 01:48:19" " と < > でファイルの検索する場所が異なるから。
ソースファイルがあるのと同じ場所を検索してほしかったら " " を使う。
0864デフォルトの名無しさん
2007/11/28(水) 01:54:04なるほど!ありがとうございます。
stdio.h などのファイルがどこにあるかは、コンパイラによって違う、
という認識でいいのでしょうか?
0865デフォルトの名無しさん
2007/11/28(水) 02:00:01○設定によって違う
0866デフォルトの名無しさん
2007/11/28(水) 02:12:27てか、C++の前にC言語が分かってないとお門違いなのかな・・・
0867デフォルトの名無しさん
2007/11/28(水) 02:13:370868866
2007/11/28(水) 02:14:26C++を覚えるにはC言語をある程度把握してないといけないのでしょうか?
0869デフォルトの名無しさん
2007/11/28(水) 02:15:440870デフォルトの名無しさん
2007/11/28(水) 02:17:26全然「逆」じゃないです。
単に、>>868と同じことが知りたいがために聞いた質問です。すみません。
0871デフォルトの名無しさん
2007/11/28(水) 03:36:21これはお薦めでしょうか?
0872デフォルトの名無しさん
2007/11/28(水) 07:40:39gccならソースコードが公開されてる。
glibcでぐぐれ。
0873デフォルトの名無しさん
2007/11/28(水) 08:10:44普通にいるよ。文法も違うし、そもそも考え方がまるで違うからな。
C++はCの上位版ではあるが、それは「Cの書き方も利用できる」くらいに認識したほうがいい。
それも、厳密にはC99と今のC++では互換が失われているから、適当ではないかもしれんが。
C++を使いたい、Cは使うつもりが無い、ということなら、初めからC++を覚えていったほうがいい。
ただ問題なのは、C++の参考書がほとんどC習熟者を対象としていることだ。
0874デフォルトの名無しさん
2007/11/28(水) 09:29:14ttp://www.stat.phys.kyushu-u.ac.jp/~ryokawa/cbegin2_3/html4/cbegin.html
0875デフォルトの名無しさん
2007/11/28(水) 09:35:08int a[n];
n=10;
というような感じのことがやりたいのですが・・・
0876デフォルトの名無しさん
2007/11/28(水) 09:45:330877デフォルトの名無しさん
2007/11/28(水) 11:27:23・c99でローカル変数でnが確定しているなら、int a[n]でいい。
・そうでないなら、malloc()などでメモリを割り当てて使うしかない。
・それもいやなら、Cを諦めてC++で書くなどする。
0878デフォルトの名無しさん
2007/11/28(水) 11:30:19・c99でローカル変数でnが確定しているなら、int a[n]でいい。
↓
c99を利用していて、その配列が静的でないローカル変数でよくて、nの値が確定しているなら、int a[n]でいい。
つまり、VCではダメで、呼び出し元に返すことができなくて、staticにできなくて、関数内部でしか使えなくて、動的にリサイズできない。
0879デフォルトの名無しさん
2007/11/28(水) 14:28:47許容量=自分が用意したバッファのサイズ。
スタック上に
char urlencoded[256];
と用意した変数に書き込んでほしいなら、
const char *url = "なんたらかんたら";
url_encode(urlencoded, 256 * sizeof(char), url, STRLEN(url));
とか。
>>845
買い物した代金や、お釣りが2の乗数だと「キリがいいな」と思ったりな。
>>878
この仕様変更ってさ、容易にスタックオーバーフロー招きそうじゃね?
C99の仕様よく知らないけど。
0880デフォルトの名無しさん
2007/11/28(水) 14:48:200881デフォルトの名無しさん
2007/11/28(水) 14:55:57今時、ちょっとしたバッファに使うような数キロバイトの配列程度でスタックオーバフローなんかしないでしょ。
制限は>878にある通りなんだから、大量に確保したり再確保するような用途にはどうせ使えないわけだし。
0882デフォルトの名無しさん
2007/11/28(水) 15:00:59内部的にはヒープに確保することもできるから、必ずしもスタックオーバーフローに繋がるわけでもない
それよりも、longjmpですっ飛ばした場合は解放されない(という実装も許される)ってことの方が気になる
0883デフォルトの名無しさん
2007/11/28(水) 15:47:29一時的にその要素数分のスタックを確保した場合、
引数にうっかりバグって20億要素とか渡ると大変なことにならね?
0884デフォルトの名無しさん
2007/11/28(水) 15:56:250885デフォルトの名無しさん
2007/11/28(水) 16:16:060886デフォルトの名無しさん
2007/11/28(水) 22:07:50%.3lfとか%dとかを複数できるようにしたいです。
ちなみに一つだけなら
void set(int,int,const char*, ...);
でできましたが複数だとできません。
教えてください。
0887デフォルトの名無しさん
2007/11/28(水) 22:16:42va_arg でぐぐる
0888デフォルトの名無しさん
2007/11/28(水) 22:25:43複数だと、自分で1つ目のフォーマットを大雑把でいいから解析して、
va_list の値を自分で進めてから、2度目の vprintf を実行する形になるんじゃないかなあ。
0889886
2007/11/28(水) 22:35:13{
va_list ap;
va_start(ap, format);
vsprintf(buffer, format, ap);
va_end(ap);
return buffer;
}
これでいいのかな?
0890デフォルトの名無しさん
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");
}
0891デフォルトの名無しさん
2007/11/29(木) 06:38:28アドバイスください。。。orz
0892デフォルトの名無しさん
2007/11/29(木) 06:42:06VisualC++
0893デフォルトの名無しさん
2007/11/29(木) 06:49:14Visual C++ 2005 Express Edition
正確には↑ですよね?無料の
0894デフォルトの名無しさん
2007/11/29(木) 06:50:070895デフォルトの名無しさん
2007/11/29(木) 06:53:04Visual Studio 2005 Academic Edition
とはなにが違うか分かります?
Visual C++ 2005 Express Edition で十分?
0896デフォルトの名無しさん
2007/11/29(木) 07:12:13各Editionの機能比較はここ
http://www.microsoft.com/japan/msdn/vstudio/products/compare/default.aspx
多分君なら当面はExpressで十分
VisualStudio2008の英語版は出てるし日本語版ももうすぐ出るよ
買うなら2005は買わずにもうちょい待った方がいい
http://www.microsoft.com/japan/msdn/vstudio/
0897デフォルトの名無しさん
2007/11/29(木) 07:20:32いや〜ありがとう。
0898デフォルトの名無しさん
2007/11/29(木) 15:08:140899デフォルトの名無しさん
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++;
}
0900デフォルトの名無しさん
2007/11/29(木) 17:06:09wprintf(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;
}
0901デフォルトの名無しさん
2007/11/29(木) 17:09:31"jpn" か "japanese" にしてみたら?
0902デフォルトの名無しさん
2007/11/29(木) 17:13:23とか
"Japanese_Japan.932"
だと出るよ
0903デフォルトの名無しさん
2007/11/29(木) 17:17:36ありがとうございます!!!
0904デフォルトの名無しさん
2007/11/29(木) 17:18:23取り合えず吐き出し方だけ。
#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");
}
}
}
}
0905デフォルトの名無しさん
2007/11/29(木) 17:27:040907デフォルトの名無しさん
2007/11/29(木) 18:03:59*i++;
という表現をしたらエラーになったのですが、
何がまずかったのでしょうか。
*i = *i + 1;
とするとエラーは消えたのですが、原因が気になります。
0908デフォルトの名無しさん
2007/11/29(木) 18:09:200909デフォルトの名無しさん
2007/11/29(木) 18:17:32という配列を動的にメモリに確保するにはどうすればよいのでしょうか?
一次元配列であれば先頭ポインタを作っておいてmallocで確保すればよいだけですが・・・
0910デフォルトの名無しさん
2007/11/29(木) 18:27:55無理。
一次元で確保して、オフセット計算しつつアクセスする
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);
}
0912デフォルトの名無しさん
2007/11/29(木) 18:50:34スマートな表現をありがとうございます。
とりあえず×と区別が付かないからエラーになったと解釈することにしました。
0913デフォルトの名無しさん
2007/11/29(木) 18:53:53つーか、*i++だと結合規則の関係で*(i++)と解釈されるってだけの話だけどね。
0914デフォルトの名無しさん
2007/11/29(木) 20:12:27char 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 );
としたら出来たのですが、こんなので良いのでしょうか?
もっと良い解決方法などありましたら教えてください。
0915デフォルトの名無しさん
2007/11/29(木) 20:17:54st.c1 = fgetc(fp);
st.c2 = fgetc(fp);
st.c3 = fgetc(fp);
fread(& st.i, sizeof(int), 1, fp);
// fread()の第2パラメータはサイズ、第3パラメータは個数
0916デフォルトの名無しさん
2007/11/29(木) 20:20:53コンパイラスイッチに期待するくらいなら #pragma pack とか __attribute__((__packed__)) の方がマシ
0917デフォルトの名無しさん
2007/11/29(木) 20:56:17union使って全体をchar型の配列で覆って
アラインメントさせないようにする
0918デフォルトの名無しさん
2007/11/29(木) 21:10:25低水準って使う機会あるんでしょうか?
マニュアルには、高水準のみでいい みたいなことが('A`
0919デフォルトの名無しさん
2007/11/29(木) 21:22:41と
#include <loli/loli.h>
#include <pedo/loli.h>
って必ず別物として扱ってもらえますか?
同じ名前で public ヘッダと private ヘッダに分けたいのですが。
0920914
2007/11/29(木) 21:40:56ありがとうございます。
助かりました。freadをずっと間違えて使う羽目になる所でした・・・
>>916
ありがとうございます。
__attribute__((__packed__))というのは初めて見ましたので
調べてみます。
>>917
ありがとうございます。
よく分からないのですが、これから考えてみます。
0921デフォルトの名無しさん
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
0922デフォルトの名無しさん
2007/11/29(木) 21:52:53移植性よりも、OS固有の細かい指定が必要なときに使うことがある。
0923デフォルトの名無しさん
2007/11/29(木) 23:01:49そういうもの(低レベルI/O)がある、ってことを知っとけば十分じゃないかな。
あんまり使う機会はないけど、「何かの機能」が有るか無いかって知識は、
持っておいて損はないと思う。
というかPGなんて、そういうメタ情報の塊じゃなかろうか。
0924デフォルトの名無しさん
2007/11/30(金) 00:18:04>917は無理。調べるだけ無駄。
0925デフォルトの名無しさん
2007/11/30(金) 01:17:50正常には動作するんだけど、エラーを出したいんです。
自己参照構造体での課題でMS-DOS端末で、予め構造体配列を50個とったら
スタックエラーで実行すらできず、んなら自己参照で次々にこちらが入力した情報にそって構造体を作成していけばエラーが出るんじゃ?
と思いやってみましたが、延々と入力でき、エラーが出ませんでした。
入力したものを出力したらDOSが落ちましたけど・・・。
でWindowsにて登録部分を無限ループにしたらメモリ大量に消費したのまではよかったんですが、やはりエラーが出ずにWindowsが操作不能になる始末です。
if(p = (struct list *)malloc(sizeof(struct list))) == NULL)
{ puts("malloc error"); exit(1); }
これであってますよね?メモリが取れないときの制御文って。
0926デフォルトの名無しさん
2007/11/30(金) 01:29:26k 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
0927デフォルトの名無しさん
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);
0928デフォルトの名無しさん
2007/11/30(金) 01:32:41気になるのはかっこは正確?実は違っていたりしない?
0929デフォルトの名無しさん
2007/11/30(金) 01:35:04数式はそのまんま写しているので間違ってはないです。
ただ、プログラミングのほうは多分あってるとしか……。
0930デフォルトの名無しさん
2007/11/30(金) 01:37:58数式を画像で上げてくれたほうがありがたい
0931デフォルトの名無しさん
2007/11/30(金) 01:40:17だな
どうもどこからどこまでが掛け算なのかわからんが
おれの思ったとおりなら一応配列用意してあとはwhile文で足し算繰り返すだけで終わるはず
0932デフォルトの名無しさん
2007/11/30(金) 01:54:18うpしました。
http://www.vipper.org/vip679492.jpg
>>931
ホントですか?
希望がみえてきた……!
0933デフォルトの名無しさん
2007/11/30(金) 02:02:220934デフォルトの名無しさん
2007/11/30(金) 02:03:34int hoge::func(int argnum, ...){ ・・・ }
ではなく
int hoge::func(...){ ・・・ }
という形の関数を実装する方法がわかりません。
(引数の個数はhogeクラスのメンバ変数に予め書き込んであります)
va_list等は"..."の直前の引数のアドレスから"..."の部分の
アドレスを求めているようなので無理でした。
メンバ関数ポインタとインスタンスから
引数のアドレスを求められたりはするのでしょうか?
お願いします。
0935デフォルトの名無しさん
2007/11/30(金) 02:06:27そもそもこの行列の場合、どういった答えが出たら正しいんだ?
0936デフォルトの名無しさん
2007/11/30(金) 02:09:18nijは「i×jの表の、i行目のj列目の数」という意味です。
niとnjの定義は>>926の通りです。
ようするに、i行目を全部たしたものと、j列目を全部足したものです。
>>935
>>927の表のばあい(配列aがそのまま表になっています)
3〜10の間におさまるはずです。
0937デフォルトの名無しさん
2007/11/30(金) 02:17:52最後で4倍してる意味は?
0938デフォルトの名無しさん
2007/11/30(金) 02:22:24多次元配列を可変にしたいのです。
要素を可変長にするのではなく
str[][]
str[][][]
str[][][][]
こんな感じで変えれるようにしたいのです。
もちろん、実行時の最初のmalloc実行時に決定されてしまうのでも構いませんが
同じバイナリで可変に出来れば問題ありません。
このような方法はどのようにするのでしょうか?
0939デフォルトの名無しさん
2007/11/30(金) 02:25:34使う方も合わせなきゃいけないだろ?
0940デフォルトの名無しさん
2007/11/30(金) 02:32:30n=4だからです。つまり2×2の表なので要素数が4つってことで。
描けてい理由は、>>932の画像の式の通りにかけているだけです。
>>938
ポインタとかじゃだめなの?
0941デフォルトの名無しさん
2007/11/30(金) 02:41:49各添え字には、i、i+1、i+2と言う具合に入れる予定で
例えば
#define N 3
for(int i=0; i<N; i++){
}
0942デフォルトの名無しさん
2007/11/30(金) 02:43:46nは全部の要素数でした。すみません。
>>937の指摘でわかりました。
答えがようやくでました。
どうもありがとうございました。
0943937
2007/11/30(金) 02:48:560944デフォルトの名無しさん
2007/11/30(金) 03:13:04無理。C/C++の可変個引数では、
可変個でない(明示的な)引数が少なくとも1つないと無理。
0946デフォルトの名無しさん
2007/11/30(金) 03:49:52最低1個引き数を用意するだけでいいと思うのだけど。
つまり、呼び出し側で
個数が0個のときにfunc()と呼ぶ代わりにfunc(0)とでもしてもらうってことで。
勿論、個数が1個以上ならfunc(a), func(a, b)などは同じようにできるのだし。
尤も、C++なら無理に可変個引き数にしなくても引き数セットのクラスを作ればいいのだけれど。
0948デフォルトの名無しさん
2007/11/30(金) 04:28:360949デフォルトの名無しさん
2007/11/30(金) 05:24:170950デフォルトの名無しさん
2007/11/30(金) 05:47:15#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個で、データを降順に並べ替えて出力するプログラムつくれ
って宿題が出たんですが、コンパイルして実行しても全く関係ない文字列が
出力されます。
おかしいところがよくわからんのですが、教えてください。よろしくお願いします。
0951デフォルトの名無しさん
2007/11/30(金) 05:53:59for( b=0; b<n; b++ ) {
printf("value[%d] = %d\n", b, a[b]);}
でした
0952デフォルトの名無しさん
2007/11/30(金) 06:33:17良く分からんかったからバブルソートにした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]);
}
一応動くけど、書き方悪いと思うから推敲してね
0953デフォルトの名無しさん
2007/11/30(金) 07:37:07どう入力をしたらどう出力された?
それが無いとわからん。
ただ、scanf()はあまり使わんほうがいいよ。
簡単にバッファオーバーフローするから。
0954デフォルトの名無しさん
2007/11/30(金) 08:58:48ほほ〜
実例希望。
0955デフォルトの名無しさん
2007/11/30(金) 09:05:450956デフォルトの名無しさん
2007/11/30(金) 10:34:09DOSの方はプログラムに何かバグがあるんだろう。
Windowsの方は、仮想記憶があるので物理RAMがいくらだろうと1プロセス
で2GBぐらいまでmalloc()できる。でも、もちろんたくさんメモリ確保す
ると著しくパフォーマンスが落ちる。
0957デフォルトの名無しさん
2007/11/30(金) 11:43:22要するにすべての関数の中に
printf("関数名\n");
を入れればいいのですが、それを簡単にやる方法はないでしょうか。
コンパイラはgccなのでgdbを使ってもいいんですが。
よろしくお願いします。
0958デフォルトの名無しさん
2007/11/30(金) 12:31:09プロファイラー
cc -pg
0959デフォルトの名無しさん
2007/11/30(金) 13:00:25cc -c foo.c -p
cc foo.o -p
./a.out
gprof
0960デフォルトの名無しさん
2007/11/30(金) 15:12:46例えば./a.out data.txtとしてdata.txtを表示させたいときには
system("cat ???");どうすればいいですか?
0961デフォルトの名無しさん
2007/11/30(金) 15:14:31sprintf()でも使って繋げばよろしかろ。
0962957
2007/11/30(金) 16:03:31この辺でできそうなことがわかりました。ありがとうございます。
DSAS開発者の部屋:オープンソースを楽しむエンジニアの二日目 - ftraceコマンドを書く
http://dsas.blog.klab.org/archives/51025093.html
Index of /~krahmer/instrumental
http://www.suse.de/~krahmer/instrumental/
0963デフォルトの名無しさん
2007/11/30(金) 17:07:21どうやったら逆にコピーできるんですか?
誰か教えてください
0964デフォルトの名無しさん
2007/11/30(金) 17:21:501文字ずつコピーするんだよ
0965デフォルトの名無しさん
2007/11/30(金) 17:22:06void 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;
}
0966デフォルトの名無しさん
2007/11/30(金) 17:39:370967デフォルトの名無しさん
2007/11/30(金) 17:56:33チマチマ頑張るのか、それ用の何かがあるのか。
0968デフォルトの名無しさん
2007/11/30(金) 17:57:28なるほど〜ありがとうございます。
ただちょっと自分頭が弱いみたいで
for (i = 0; i < len / 2; i++)
この部分が完全に理解できてないです。
確かに実行するとちゃんと逆にコピーしてくれますが何故 len/2なのでしょうか?
ずっとlenだと思ってて、だけど半分しか逆にならないっていう感じでした…
0969デフォルトの名無しさん
2007/11/30(金) 18:00:15最後までって、単にコピーしてたんじゃ
後半は前半コピーしたやつを書き戻すだけだから半分にみえるだろうな
0970デフォルトの名無しさん
2007/11/30(金) 18:05:06最終的には、前の半分を後ろの半分と置き換えてるんです。
前から0番目と、後から0番目を交換、
前から1番目と、後から1番目を交換、
:
:
前からlen/2番目と、後からlen/2番目を交換、
ここまでで達成しており、len番目まで交換すると、
どうなるでしょうか。元に戻ってしまうことがわかります。
0971デフォルトの名無しさん
2007/11/30(金) 18:07:02前からlen/2 - 1番目と、後からlen/2 - 1番目を交換、
ここまでで達成しており、len - 1番目まで交換すると、
0972デフォルトの名無しさん
2007/11/30(金) 18:07:300973デフォルトの名無しさん
2007/11/30(金) 18:27:340974デフォルトの名無しさん
2007/11/30(金) 18:29:28詳しく解説ありがとう
「交換してた」ってことだったんですね!
確かに交換してるなら半分で交換を止めないと残り半分は元通りに戻っちゃいますね
どうりでおかしかったわけだ 親切にどうもです
前から0番目に後から0番目をコピー
前から1番目に後から1番目をコピー、
:
:
こう考えてしまってました・・・
0975デフォルトの名無しさん
2007/11/30(金) 18:36:04これを2バイトずつ分割して、char型の1バイト10進数値(12,34,56)
に変換したいのですが、
先頭から2バイト取出し(適当な配列へ格納)
↓
atoi関数でint型整数へ変換
↓
これを、char型へキャストして、最終的に格納したいchar型配列へ
↓
次の2バイト文字へポインタ移動
↓
ここまでのフローをあと2回繰り返し
自分としては、こういった処理を考えています。
これでも出来るとは思うのですが、ほかにスマートな方法等あれば
教えてください。
0976デフォルトの名無しさん
2007/11/30(金) 18:53:38sscanf(pStr, "%2d%2d%2d", &a,&b,&c);
とか
0977デフォルトの名無しさん
2007/11/30(金) 19:07:19#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');
}
0978デフォルトの名無しさん
2007/11/30(金) 19:22:14この方法ならpStrの文字数が偶数であるなら
何文字でも可能
forならもっとスマートになるかも
0979デフォルトの名無しさん
2007/11/30(金) 19:37:06int 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;
}
0980デフォルトの名無しさん
2007/11/30(金) 19:38:32>>976さんの案をパクッて…と言うより、ほとんど>>975の手順のままだけど、
0981デフォルトの名無しさん
2007/11/30(金) 20:21:07どうもすっきりしないでいました。
>>977さんのサンプルだと、memcpy関数を使えば、char*型のみでコピー
できますね。
文字列は、14バイト(NULL文字含むと15バイト)固定なので、2バイトずつ
ポインタ移動しながらmemcpyを繰り返していけると思います。
皆さん、ありがとうございました。
0982デフォルトの名無しさん
2007/11/30(金) 20:23:53除算は「DIVISION」ですが
除算しないは何て記述するのが一番適切ですか?
0983デフォルトの名無しさん
2007/11/30(金) 20:27:260984デフォルトの名無しさん
2007/11/30(金) 20:28:43それだったらmemcpyしなくても、printf("%.2s\n", pStr + i)で十分じゃないか?
0985983
2007/11/30(金) 20:34:23解決しました・・・
0987890
2007/11/30(金) 21:26:22904さん考えていただきありがとうございました
0988デフォルトの名無しさん
2007/11/30(金) 21:51:26事前に定義できるならunion(共用体)。
まあ配列程度なら普通に定数なりとかけ合わせて位置取る方が楽だろうけど
0989デフォルトの名無しさん
2007/11/30(金) 22:37:38char c;
for( n=0; n<strlen(pStr); n+=2 )
{
strncpy( cBuf, pStr+n, 2 );
c = (char)atoi(cBuf);
printf( "%d", c );
}
???
0990デフォルトの名無しさん
2007/12/01(土) 00:37:40ある座標からある座標に線を引きたいんです
0991デフォルトの名無しさん
2007/12/01(土) 01:44:580992デフォルトの名無しさん
2007/12/01(土) 02:33:33構造体で十分な気がするけど……?
0993デフォルトの名無しさん
2007/12/01(土) 02:35:120994904
2007/12/01(土) 04:24:17多分今度こそコレでいい……はず。
#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]);
}
0995904
2007/12/01(土) 04:24:51void 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);
}
0996904
2007/12/01(土) 04:25:43int 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;
}
駄目だったらゴメンナサイってことで。
0997デフォルトの名無しさん
2007/12/01(土) 09:49:17そもそも共用体と構造体は使用目的が違うので比較すること自体が無意味
だから、「構造体で十分・・・」はない
怪人二十面相のようなデータ
あるときはint、あるときはfloat、はたまたあることは構造体A、そしてあるときは構造体B
こんなデータを参照するときに使う
そんなデータがあるかって!?
0998デフォルトの名無しさん
2007/12/01(土) 09:52:210999デフォルトの名無しさん
2007/12/01(土) 11:23:441000デフォルトの名無しさん
2007/12/01(土) 11:24:5110011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。