1 :
デフォルトの名無しさん :
2007/05/16(水) 16:53:13
2 :
デフォルトの名無しさん :2007/05/16(水) 16:55:31
だから要らんと言ってるのに。
4 :
デフォルトの名無しさん :2007/05/17(木) 00:39:44
質問お願いします。 scanfを使って2つの変数を入力したいんですが、 sanf("%d",&a,b); こんな感じで良いのでしょうか?動作環境がないため確認お願いします。
コピペしたら失敗した
>>4 scanf("%d %d",&a,&b);
二次元配列の引渡しはどうしたら良いですか? main関数の中で宣言した int a[3][3]をほかに自分で宣言、定義した関数に渡すときとか。
そのままaを渡せばいい 引数の宣言は int a[][3] でいいかな
11 :
デフォルトの名無しさん :2007/05/17(木) 15:53:01
newで確保した領域を中身を消すことなく再割り当てってできますか?
入力した文章中の単語を1行に一つずつ印字するプログラムを書け。 (ここでの単語とは、ブランク,タブ,改行文字で区切られた文字) 例えば、 This is a book. と入力すると、 This is a book. と表示される。 while((c=getchar()) != EOF) という文を使って文章を入力するらしいのですが、どうやって表示させればいいのかわかりません。 教えてください。
いやです。
15 :
13 :2007/05/17(木) 16:21:45
そうですか。 すみませんでした。
16 :
デフォルトの名無しさん :2007/05/17(木) 17:34:16
printf
>13 while((c=getchar())!=EOF) { putchar(c); if(c==' '||c=='\t'||c=='\n') putchar('\n'); }
>>17 改行セパレータの時に二重改行しちゃうかららめぇ。
if(c==' '||c=='\t'||c=='\n') putchar('\n'); else putchar(c);
19 :
13 :2007/05/17(木) 20:03:29
>>18 これだと、Enterを押したときに表示されませんか?
理想としては、while文が終わった後に、まとめて表示させたいのですが。
>>3 こうやってスレの使い分けも出来ない莫迦が存在する限り、このスレは必要なんですよ。
>>19 それは>13に書かれた要件を超えた要求だな。
そもそも○投げなら宿題スレにいけ。
22 :
13 :2007/05/17(木) 20:19:04
>>21 宿題スレってものがあったんですね
本当にすみませんでした
25 :
デフォルトの名無しさん :2007/05/17(木) 21:18:06
gccで作成したa.outをexeにしたいのですがどうすればいいのでしょうか?
27 :
25 :2007/05/17(木) 23:01:48
28 :
sage :2007/05/18(金) 03:12:47
文字列配列をstrcmp関数を使って、 辞書順にクイックソートするアルゴリズムを作ったのですが、 並び替えた結果を見ると、ところどころ並び替えを間違えています。 原因がまったくわかりません。どのように直せばいいのでしょうか? line[]が文字列の入っている配列です。 void Swap(int i, int j) //交換する {a = line[i]; line[i] = line[j]; line[j] = a; } void QSort(int left, int right) { int i,j,middle; i = left; /* ソートする配列の一番小さい要素の添字 */ j = right; /* ソートする配列の一番大きい要素の添字 */ middle = (left + right) / 2; /* 基準値を配列の中央付近にとる */ while (1) { while (strcmp(line[i],line[middle])<0) /* 基準より辞書順に後ろにある文字列が */ i++; /* 出るまで i を増加させる */ while (strcmp(line[j],line[middle])>0) /* 基準より辞書順に前にある文字列が */ j--; /* 出るまで j を減少させる */ if (i >= j) break; /* i >= j なら無限ループから抜ける */ Swap(i, j); /* line[i] と line[j]を交換 */ if ((middle -left) > 0) /* 基準値の左に 2 以上要素があれば */ QSort(left, middle-1); /* 左の配列を クイックソートする */ if ((right - middle)> 0) /* 基準値の右に 2 以上要素があれば */ QSort(middle+1, right); /* 右の配列を クイックソートする */ }
strcmp(line[i],line[middle])<0 を line[i]-line[middle]<0 にしてみたら?その下も同じ。 strcmpは文字列を比較する関数であって、 1文字をあらわすline[i]の比較には使えない。
>>28 line[middle]と同じ値は左右どっちに移動すると思う?
>>29 そんなミスだったらコンパイル通らないでしょ。
31 :
30 :2007/05/18(金) 05:27:53
> line[middle]と同じ値は左右どっちに移動すると思う? これはちょっと言葉が足りなかった、すまん。 1, 2, 50, 1, 1 こんな例で考えてみればわかるかな。
C言語で、C#でArrayListに構造体を突っ込んだような可変長の構造体を扱いたいのですが どういう風に組むのがいいでしょうか?
>>32 malloc() realloc() free() などを使うといいと思うよ
関数を呼び出す時(環境はWinXP,VC++)はリニアアドレスで指定しているのか セレクタ値とオフセットアドレスで指定しているのかを知りたいですが、 #include <stdio.h> void foo(void){}; int main(void) { void (*hoge)()=foo; printf("hoge of address is %p\n",hoge); return 0; } これを実行したら hoge of address is 00401000 と表示されました。 この上位16ビット(0040h)はセレクタ値で、下位16ビット(1000h)がオフセットアドレスですか?
仮想メモリ上でのリニアなオフセットです
セレクタとオフセットって、いつの時代の人だ…
なつかしいなおいw
39 :
35 :2007/05/18(金) 12:16:52
あれ、今はじめて読む486って言う本で勉強してるんですが、最近ではセグメントの管理の仕方ってまた変わってるんですか? その本ではリアルモードの時に関数へのfarポインタにセレクタ値16ビットと関数のオフセットアドレスをくっ付けたものを代入して プロテクトモードに移行してからそのポインタを参照してました
>>39 >環境はWinXP
これでかなーり事情が変わるので Advanced Windows でも嫁となる
>>39 OSのブート部分を書くのでない限り、セグメントのことは忘れてあげて
ください。
42 :
35 :2007/05/18(金) 16:22:25
>>40 ,41
あ、9x系まではそうだったからいつの時代だよってことですか…了解です
>>39 はじめて読む486だったら、もっと後のページで32ビットアドレスの話が出てくるはず。
これはようするにオフセットが32ビットになっているモード。
Win32アプリケーションは、その32ビットアドレスのモードで動く。
35のコードで出力された32ビットのアドレスも全てオフセット値。
ちなみに、Win16アプリケーションなら16ビットセレクタと16ビットオフセットを使う。
入力はfgetsを使えとよく言われていますが、 fgetsは読み込んだ文字列がバッファに入りきったかどうか判別できませんよね? 改行で読み終わった場合は、バッファに改行コードがあるかどうかで読みきれたかどうか 判別できます。しかしEOFで読み終わった場合はそれが判別できないと思うのですが。 入力→バッファがあふれたらstdinをクリアして再入力 という処理を確実に行うにはどうすればいいのでしょうか。
45 :
35 :2007/05/18(金) 18:48:21
>>43 ありがとうございます、もう少し読み進めてみます
>>44 >EOFで読み終わった場合はそれが判別できないと思うのですが。
char buf[1000];
fgets(buf,1000,stream);
だとして
文字数のチェックして999未満ならEOF、または改行で終了した
そして最後に改行文字がなければEOFって判断できるんじゃない?
fgetsは改行認識しないだろ。
BCBのヘルプ fgets は,stream から文字を読み込んで文字列 s に格納します。読み込みは n-1 個の文字を読み込むか,または改行文字を読み込んだときに終了します。 改行文字で終了した場合には fgets は,s の最後に改行文字を格納します。 s に読み込まれた文字の最後にはヌルターミネータが付加されます。
>>44 >EOFで読み終わった場合は
読み込み中にファイルの終わりに達したら
そこまでのデータが読み込まれる。
↓
更に読もうとしたら NULL が返るし、feof() を呼べば 0 以外が返る。
>バッファがあふれたらstdinをクリアして再入力
バッファを拡張して続きを読めばいいでないの。
>>47 fread() と間違えてる?
>更に読もうとしたら NULL が返るし バッファぴったりに読んだ場合、更に読もうとしたら入力待ちにならない?
追記可能なストリームならそうなるな。
>>48 ,49
思いっきりボケてたわスマン
恥ずかしい・・・
>>50 ごめん、俺よくわかってない、入力待ちって?
>バッファぴったりに読んだ場合
char buf[10];
fgets(buf,10,stream);
として9文字の入力を読み込んだときってこと、それとも10文字?
キーボードバッファが空の状態でfgets呼んだら入力待ちになる、ってことじゃね?
まあ普通は改行入れるし、Ctrl-Dは入力してないときに入れるもんだから影響ないか
>>54 そういうこなのかな
stdinから読み込んでバッファが空になったら入力待ちになるのは当然な気が・・・
それでも問題にはならないと思うけど
こんなコードでも問題なく動作するし
#include <stdio>
int main()
{
FILE *in;
char buf[5];
while(fgets(buf,5,stdin)!=0)
{
printf("%s ",buf);
}
return 0;
}
FILE *in; は消し忘れでした
1回の入力(待ち)で確実に全入力を取得したいってことだよ 2回目の入力待ちは避けたい場合ね。
61 :
44 :2007/05/18(金) 20:33:05
62 :
44 :2007/05/18(金) 22:05:46
>>61 で「バッファオーバーフロー」という言葉を使いましたが、
適切ではありませんね。すみません。
バッファサイズを超える入力を受けたとき、環境に依存しない方法で
stdinをクリアし、再入力を促す。ということです。
>>62 ソース見ていいたい事分かった・・・気がする
極力元ソース変えないようにしたけどこれではダメ?
#include <stdio.h>
#include <string.h>
int main(void)
{
int num = 0;
char c,buf[5];
for (;;) {
printf("整数を入力してください : ");
fgets(buf, sizeof(buf), stdin);
/* バッファサイズをオーバーした場合、stdinをクリアし、再入力 */
if (strchr(buf, '\n') == NULL) {
scanf("%*[^\n]%*c");
/* 正常に読み取れた場合 */
} else {
if (sscanf(buf, "%d", &num) != EOF) {
break;
}
}
fprintf(stderr, "入力でエラーが発生しました\n再入力してください\n");
}
printf("num = %d\n", num);
return 0;
}
64 :
63 :2007/05/18(金) 22:19:24
>>62 if (strchr(buf, '\n') == NULL) {
scanf("%*[^\n]%*c");
}
fgetsでbuf に取り込んだ文字列内に'\n'がない場合は
scanf("%*[^\n]%*c"); によって入力バッファの以降の文字をスキップする
正確には %*[^\n] で'\n'の一つ前までをスキップして %*c で'\n'そのものをスキップする
でバッファ内には残らなくなる・・・的な・・・
65 :
44 :2007/05/19(土) 10:27:49
>>63 stdinの読み捨ては簡単にすることが出来ましたが、EOFで読み終わったとき
無限ループにはまってしまいます。
66 :
63 :2007/05/19(土) 18:39:31
>>65 EOF入力でも再入力を求めたほうがいいの?
それともEOFが入力されたら終了していい?
67 :
44 :2007/05/19(土) 19:49:47
>>66 可能なら再入力を求めるほうがいいですね。
68 :
63 :2007/05/19(土) 20:06:13
そか scanf("%*[^\n]%*c"); を rewind(stdin); に変えると環境によってはうまくいくんだけど MS的にはおkとしている でも他の環境だと・・・ 環境依存なものはダメだよね?
ちょっと待て。EOFってことは標準入力がクローズされていると思うんだが。
70 :
44 :2007/05/19(土) 20:26:58
>>68 環境依存OKだとその方法で出来てしまうんですよね…。
if (feof(stdin)) {
/* エラー処理 */
exit(1);
}
このへんで妥協するしかないですかね。
どうやらfgetsはEOFで読み終わった場合はstdinにEOFが残された状態になるらしく、
再入力を求める場合、どうしても無限ループになってしまいます。
71 :
63 :2007/05/19(土) 20:41:25
>>69 そうなの?
ファイルの終端に達したからといってクローズされるとは思わないけど
それとも勝手に閉じられてしまうの?
>>70 って事は環境依存はダメって事ね
72 :
44 :2007/05/19(土) 20:51:11
>>71 >って事は環境依存はダメって事ね
そうですね。お手数かけてすみません…。
clearerr(stdin)ってどうだろう?
74 :
63 :2007/05/19(土) 22:06:10
>>75 多次元配列(厳密にはただの配列と一緒なんだが・・・)を仮引数とするときは
最初(最後だったかもしれん)の1つ以外は指定しなければならないという制限があったはず
そうしないとコンパイラがポインタ値をいくつスライドさせりゃいいのか分からんからな
78 :
63 :2007/05/20(日) 01:00:21
>>75 関数宣言で
int a_substitute(int a[][])
としているでしょ
関数に配列を渡すときには”配列”としてではなく”ポインタ”として渡される
引数に配列が使えるのはコンパイラ段階で引数が分かっていることが前提
ところがコンパイラ上で渡された配列のサイズが不明なためコンパイルできない
int a_substitute(int a[][2]) とすればコンパイルは通る
と計算といってるけど、これからその部分書くの?
79 :
63 :2007/05/20(日) 01:01:59
>>77 #define N 100
int a_substitute(int a[][N])
とかはダメ?
>>78 プログラムうp遅れすまそ。
上にうpしたやつです。名前はmatrix.cといいます。
しかしこれでは希望の仕様を満たさない。
どうすればいいのやら・・・これが出来たら次は外積のプログラムを作りたいのですが。
これでは応用が効かない。
>>77 手持ちのC99仕様書によるとこういう宣言も認められるらしいが使ったことないので分からん
試してみてくれ
T foo(int n, int m, T' a[n][m]);
>>79 main関数内で行列なりベクトルなりの次元を取得して
それを引数にするためプリプロセッサでは無理ですね。
それでは書き換えるのと大差ない。
>>81 ど、どういう意味ですかその宣言方法は。
なんか光明が
double det(double *a, int n){ double *temp; //中略 temp = (double*)malloc(sizeof(double)*n*n); for(i=0; i<n; i++) for(j=0; j<n; j++) temp(i*n+j) = a(i*n+j) //後略 ってやるのはどう? 関数に渡すときにキャストして。
>>83 おそらくC99で追加された可変長配列(配列宣言時にConstantでなくVariableを大きさとして指定できる配列)を
仮引数並びに使ってるんだろうが詳しくは知らん
gcc3.3.6ならC99対応してるだろうからおそらく通るとは思うが通らない可能性も否定できん
#include <stdio.h> main () { char text; printf ("Please Input Key : "); text = getchar (); printf ("Input key is %c.",text); if (text != 'z') { printf ("\nPlease Input Key : "); text = getchar (); switch (text) { case 'Y': case 'y': printf ("Y");
break; case 'N': case 'n': printf ("N"); break; default: printf ("$"); } } return 0; }
88 :
63 :2007/05/20(日) 01:15:53
>>82 実行段階でのサイズを変更をしたいのね
>>84 double det(double **a, int n){
じゃないかと・・・
おっ!!!
なんとなくやってみたら出来たっ!!
(a[][n], int n) => (int n, a[][n])
と後ろに置けばおkみたいですね。もちろんa[n][n]でもおk(まぁ無駄だけど)
感動・・・
完成プログラムを置いておきます。
http://www.uploda.org/uporg815567.c.html a[0][n]がいいかa[n][n]がいいか。どちらがベストかは微妙です。
>88 配列わかってねー
>>86-87 が失敗ソースなのですが
メッセージを出し、キーを入力させ
入力したキーを表示させます
もし入力されたキーがzなら終了
z以外なら再入力を促し
YないしyならYを表示→終了
NないしnならNを表示→終了
それ以外なら$を表示→終了
としたいのですが、どうも再入力を受け付けてくれません
この場合、変数を増やしてやるほかに方法は無いのでしょうか?
rewind (stdin);を入れてやれば、一応は解決したのですが
こうするとバッファデータが全部ロストするみたいなので、余り良くないんじゃないかなぁ・・・と
それとrewind (stdin);を入れて、再入力した場合
何を入れても$が表示されてします
復改というのでしょうか?
\nが混じるのが問題みたいなんですが
これを除去する良い方法はないのでしょうか?
>>84 むつかしい。理解不能でつ
キャストとかポインタが連発するともう解析不可能・・・
93 :
63 :2007/05/20(日) 01:22:23
>>84 その方法だと、配列が小さいときは良いが、でかくなったときにオーバーヘッドが大きすぎないか?
>>91 訂正
”それとrewind〜方法はないのでしょうか?”は無視してくださってかまいません
ですが、改行を読み飛ばす方法は教えてくださると幸いです
調べたらgetchar ();をダブらせるといいとか、fgetsで関数を組むみたいなことを見つけたのですが
いかんせん上手くいきません・・・
つーか84は *temp(i*n+j) = *a(i*n+j) だろ
>>95 現在stdinにある文字を改行含めて読み飛ばすならこれでいける
scanf("%*[^\n]%*c");
>96 なんか混ざってるw p[i*n+j]もしくは*(p+i*n+j)が正解
>>94 固定長の配列版と較べて、遜色ない速度にまで最適化されるから心配なし。
つーか、激しく常套手段。ついでに、i * n + jの部分を別関数にしても問題なし。
Ex. size_t offset(unsigned, i, unsigned j, size_t n) {return i * n + j;} ... temp[offset(i, j, n)] = a[offset(i, j, n)];
>>97 >>86-87 の派生版に
それを組み込んでみたんですが、上手く動作しません
原因は大体解ってるんですが、やり方がわからないんですよね・・・
ソース
http://www.borujoa.org/upload/source/upload11705.c scanf("%*[^\n]%*c");の組み込み位置が可笑しいのは解ってるんですが
(一応、前のtextに引っ掛けてるつもりです)
全部読み飛ばすと判定が出来なくなるというか、入力する意味が失われますので
getcharで読み飛ばしを試みてるのですが、どうしても読み飛ばされないです
どうすればswitchの判定を有効に出来るのでしょうか?
(printfで確認した限りでは、defaultしか動いてない)
どうでもいいけど激しく読みにくいインデントスタイルだな。 処で、switchがまともに動かない直接原因ではないが、getchar()の戻り値はintで受けるべき。 で、EOFが帰ってきたらその処理もした方がよさそうだが。
エディタはemacsに限る。viはうんこ
Meadowのインスコにadmin権限が必要ってのを何とかしてくれ
関数を通して配列を作って、それを返り値にすることは出来ますか? double * make_rotate_array(double angle) のように例えば角度を引数として回転行列をreturnしてくれるような。 一度やったら なんかローカル変数のポインタを参照にしちゃってます 的なことをいわれて凹んだ。ここでmallocですかね?
Cなら呼び出し側でメモリ確保する方が一般的。
質問です。 コマンドライン引数でファイル名を受け取りその中身(テキスト)を標準出力する というプログラムを作っていて、ある時から「MZP」という文字列が出力されるようになりました。 MZPってなんなんですか?
MZヘッダの一部
>>106 Windowsの.exeとかをバイナリエディタで開けば解るお
109 :
デフォルトの名無しさん :2007/05/21(月) 05:35:11
OS:VineLinux コンパイラ:gcc こんばんは、ppm形式(フルカラーraw形式)の画像のピクセルごとの,R,G,Bの色のデータを メモリを動的に確保して1次元の配列にぶち込みました。 これを任意の角度回転しようと考えているのですが、 どうも1次元の配列ですと直交座標で扱いにくく困っています。 そこで新たに二次元配列を動的に確保して・・・とも考えたのですが 元画像、出力画像のデータを取り込んでいるので、得策でもないような気がします。 なんとか直交座標系として扱いつつ、元画像を回転させて出力画像を作る方法ありませんでしょうか? ソースがあるだとかよい案があればよろしくお願い致します。
>>109 何が問題なのか判らない。全く同じ質問を他のスレでもしていたようだが
貰ったレスに対しても碌な返事していなかったようだし、
少々落ち着いて他人に伝えるという努力をしてみるといいかもしれない。
そもそも、画像の回転の方法は判っているのか?
どうも、画像処理の基礎知識も幾何数学の素養も無い気がしてならない。
というか画像処理に関する知識がないから考えようもない。 専門じゃないんで・・・
専門じゃないのなら、他人任せ(ひとまかせ)にするか勉強するか、どっちかしかないと思うのだが。 前者なら、具体的な要件をまとめて宿題スレへ、後者は勝手にどうぞ。 コーディングに際して何か疑問があるようならここかどこか、適当なスレで承ります。
>>109 こんな感じのもの作れば楽になるんじゃない?
int pos2index(width, height, x, y){
if(width<=0 || height<=0 || x<0 || y<0 || x>=width || y>=height) return -1;
return width*3*y+x*3;
}
114 :
デフォルトの名無しさん :2007/05/21(月) 12:09:48
>>110 1次元配列で直交座標系における回転を行うことができる方法があればと思いました
別のスレで誘導され、返事のほうはさせていただいたつもりですが。
>>111-113 どうもありがとうございます
使ってみてダメなようであれば質問スレに行くことにします。
>>114 そうやって数学まで落としてくれればわかりやすい。
つまり1次元配列で3次元の基底変換をしたいんだろ
無理に決まってんじゃん・・・
3*3の回転行列が必要に決まってる。
高崎先生がおれにそう教えてくれたっ!
116 :
デフォルトの名無しさん :2007/05/21(月) 14:34:03
まじめにC言語学びなおしたいってすこしおもったけど
C++に進もうぜ!!
118 :
デフォルトの名無しさん :2007/05/21(月) 16:26:26
嫌です
じゃあC#でいいや
120 :
デフォルトの名無しさん :2007/05/21(月) 16:55:48
嫌だっていってます
*Q[]はint型のポインタの配列で、疑似二次元配列を作っています。その縦の個数は8で、横の個数は融通が効くようにしています。 Q[i]の値を全てQ[i+1]にコピーして、Q[i+1]の最後にaと0を代入する関数です。 一応はうまく動くのですが、i=4, j=3になると Q[i+1] = realloc(Q[i+1], sizeof(int)*(j+1)); のところでセグメントエラーを起こしてしまいます。 その理由がわからず、途方にくれています。 助けてください。 void copyArray2(int *Q[], int i, int a){ int j, k; j = count(Q[i]); Q[i+1] = realloc(Q[i+1], sizeof(int)*(j+1)); for(k=0; k<j; k++){ Q[i+1][k] = Q[i][k]; } Q[i+1][k] = a; Q[i+1][k+1] = 0; return; }
>>121 横の数足りてないだろ。
Q[i+1][k] = a; /* k == j */
Q[i+1][k+1] = 0; /* k == j+1 */
123 :
デフォルトの名無しさん :2007/05/21(月) 17:29:02
質問です 標準入力から読込んだ文字を判別する際に、 改行(¥n)などは判別できるのですが 矢印キーなどはどの文字で判別すればよいのか分かりません エスケープシーケンスなどが存在するのでしょうか? ちなみに開発環境はLinux上でgccコンパイラを使用してます
>>123 標準入力を使うのはやめた方がいい。
リダイレクトされると泣ける。
^H ^J ^K ^L が渡ってくるかもしれないし、 shell が喰ってしまってアプリケーションに渡らないかもしれない
126 :
デフォルトの名無しさん :2007/05/21(月) 18:03:44
127 :
121 :2007/05/21(月) 18:14:53
>>122 さん
ありがとうございます。
この関数部分についてはうまく行くようになりました。
しかし他の部分でもバグが出て泣きそうです。
でもしばらくは自力で頑張ってみます。
Numerical Recipes in C って本を大学の図書館で借りてきた。 楽しみだおわくわく 数値計算においてはC>>>>>>>>>C++ C++は必要なし。
その本は糞
130 :
デフォルトの名無しさん :2007/05/21(月) 20:16:21
>>128 C++を使うと複素数演算がきれいに出来る
rubyでいいじゃん、オブジェクト指向なら
Numerical Recipes in C++の方が糞 何せC++で書く意味が無いようなプログラムがずらずら並んでる しかも糞高い
FFTに興味があったから
>>128 >数値計算においてはC>>>>>>>>>C++
何を比べているのかさっぱり判りませんが、そのあたりが
「莫迦は不等号を好んで使う」と言われる所以なんでしょうね。
>>130 C99 にもありますね<複素数
もっとも gcc くらいしか選択肢がないですが。
Numerical Recipes in C って、 FORTRAN のから無理矢理作った感じの本。 いくつかバグもあったと思うよ。 まあ、理論のところは役に立つと思うけど。
FORTRANから無理やりCに移植してさらに無理やりC++に移植したのが Numerical Recipes in C++ということなのか、そりゃあ仕方ないな
138 :
解いてください。お願いします。 :2007/05/22(火) 11:26:03
問2 時間(0以上23以下)を入力し、以下に示す時間に従った挨拶を出力するプログラムを作りなさい。 プログラムは、0未満24以上の時間が入力されるまで繰り返しなさい。 0時〜3時 :Good night 4時〜11時 :Good morning 12時〜16時 :Good afternoon 17時〜20時 :Good evening 21時〜23時 :Good Night 但し、一つの整数を引数とし、引数で指定された数値によって、上記メッセージを出力する関数を 作り、main関数では、その関数を呼び出すようにしなさい。
宿題スレ池よカス
偉くはないが本当にエロいそのスレの住人の俺に対する挑戦状か?
エロいですが何か。
絶対に許さないよ
4GB以上のファイルは32bitOSで読めないんですか? 以下のようなプログラムで試したんですが、 64bitOSだとサイズが出せます。 環境はlinux,gccです。 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int main(int ac, char **av) { if(ac != 2){ printf("No filename\n"); return 1; } FILE *fp = fopen(av[1],"rb");
//続きです。 int n; if(fp != NULL){ struct stat s; if((n = fileno(fp)) != -1) printf("fp is valid.\n"); else printf("fp is invalid.\n"); if(!fstat(n, &s)){ printf("OK\n"); printf("Size is %ld\n", (long)s.st_size); fclose(fp); } else printf("NG\n"); } else printf("NG\n"); return 0; }
つPAE
C言語ってオブジェクト指向じゃありませんよね。 なんで構造体があるのにオブジェクト指向じゃないんですか? メソッドがないからですか? 継承がないからですか? オーバーロードが出来ないのがいたすぎ
継承がないから、というのが一番大きいと思う。
Cでもオブジェクト指向的なプログラミングができんわけではない
まあ、どのレベルまで言語的に実装されてるか、だな。
>>147 構造体とOOPは何の関係もないし
オーバーロードとOOPもまた、何の関係もない。
Cで単継承はできる。 が、文法の枠組みの外の実装となるので、書き辛い
構造体でクラスっぽいものが実装できる以上、 オブジェクト指向的なプログラミングはできるし、 それに構造体が必須なのも事実。
int *p; int x = 10; p = &x; printf("%d", *p); これでは10が表示されるみたいですが、 char *p; p = "aaaa"; printf("%s", *p); こうするとエラーがでます。printf("%s", p)とすればaaaaと表示されます。 1番目に書いたほうは理解できたのですが、 同じように考えて2番目もするとエラーでした。 この違いはなんなんでしょうか?
char に対応するフォーマットは %c
>>154 "%d"は値を10進表記で出力
"%s"は値を0終端文字列の先頭アドレスとみなして文字列を出力
>>154 cの言語仕様自体には文字列型というものは無いんだ。
文字の配列を文字列として扱う関数が標準で用意されているだけ。
char ** p;
char * x = "aaaa";
p = &x;
printf("%s", *p);
これでaaaaが出るよ。
課題の中でわからない問題が2問あるんだけど聞いてもいいかすら? 多分ベテランさんなら楽勝だと思うんだけど、俺C言語苦手だなぁ・・・。
解いてくれ、なら不可。 やってみたけどうまくいかない、というのなら、 自分で書いたソース付きでさらに条件付きで可。
>144 off_tとかでぐぐれ。
CにあってC++にないものってありますか? ないとしたらC言語はとっくに消えていると思うのですが。 どうも++って名前が気にいらない。
歴史
こんぱうんどりてらる、とか。 可変長配列、とか。
>>159 ソース付きというか初めからソース書いてて一つ穴開いてるんだけど
開いてる部分を埋めて動作を記入しろって問題。
実際埋めて実行してみたんだけど、間違ってるような気がしてならない。
>>165 結果が正しいなら、とりあえずそれで提出したら?
間違ってたら、それはそれで勉強になる。
>>163 あれ、俺書き込もうとしてやめたはずなんだが…
計算機ソフトウェアで8パズルを解くプログラムを書けとか・・・無理っすよ。
170 :
163 :2007/05/22(火) 21:20:24
172 :
168 :2007/05/22(火) 21:25:29
>>170 さよかw
ID出ないから本当に書き込んじゃったのかと思ったよ
既出かもしれませんが、short への代入について教えて下さい。 ------------------------------ short.c ------------------------------ #include <stdio.h> int main(void) { short int a; printf("sizeof a = %d Byte\n", sizeof a); a = 4; printf("4(16) = %08x\n", a); a = -6; printf("-6(16) = %08x\n", a); return 0; } --------------------------------------------------------------------- つづく...
174 :
173 :2007/05/22(火) 21:27:09
上のプログラムを実行すると sizeof a = 2 Byte 4(16) = 00000004 -6(16) = fffffffa と表示されます。 short は 2 バイトなのに -6 を代入すると fffffffa になるのは なぜなんでしょう? 変数 a が short なので本来ならば printf("%04hx\n", a); としなければ いけないのはわかっているのですが、-6 の代入で上位 2 バイトにも ff が 代入されるということは short の宣言で確保した 2 バイト以上の 領域にも代入されているということになって メモリの領域破壊につながらがらないのでしょうか? どうかご教授をお願い致します。
...経由で引数渡しすると、int以下の連中が みんなintへ昇格するから。
1) 汎整数拡張。 2) 変換指定子 x は unsigned int を期待する。 hx なら unsigned short int
>>161 ありがとうございました。
>>144 で
-printf("Size is %ld\n", (long)s.st_size);
+printf("Size is %Ld\n", (long long)s.st_size);
として
-D_FILE_OFFSET_BITS=64をコンパイルflagに
加えたところ、ばっちり表示できました。
178 :
173 :2007/05/22(火) 23:11:32
>> 175 printf の引数渡しの段階で型変換が行われていたんですね。 勉強になりました。ありがとうございました。
関数の中にswitch文入れたりするのっておかしいですか?
それは普通です。 関数の外に書く方がおかしいです。
そもそも関数の外には書けない
182 :
デフォルトの名無しさん :2007/05/22(火) 23:46:17
2問の問題をよろしくお願いします。 1.「*」を並べて下図のような三角形を作るプログラムを作成せよ。 ただし、プログラム中にはprintf("*")とprintf("\n")を各1回のみ使い作成せよ。 * ** *** **** ***** ******
183 :
デフォルトの名無しさん :2007/05/22(火) 23:49:10
2.上の問題と同様に下図の表示を実現せよ。 (1) ****** ***** **** *** ** * (2) ****** ***** **** *** (3) *** **** ***** ****** *** **** ***** ****** *** **** ***** ******
184 :
デフォルトの名無しさん :2007/05/22(火) 23:51:20
(4) ** **** ****** (5) ***** *** *
はいはい、頑張ってね。
こういう回答に懲りたら次は宿題スレにでも逝っとけ #define p printf("*"); #define n printf("\n"); int main(){p n p p n p p p n p p p p n p p p p p n p p p p p p n}
#include <stdio.h> #define A printf("*") #define B printf("\n") int main(){A;B;A;A;B;A;A;A;B;A;A;A;A;B;A;A;A;A;A;B;return 0;} 宿題なら宿題スレへ
はいはい結婚結婚
これ定番のネタなの?w
お前ら釣られてんのわからんの?
191 :
182 :2007/05/23(水) 00:04:17
192 :
182 :2007/05/23(水) 00:05:30
宿題すれに行ったら射精しました。
自分の説明不足を棚に上げて 自分が意図した答えではないと腹を立てるのが日本の世間一般だから 何事にも察しと思いやり
194 :
デフォルトの名無しさん :2007/05/23(水) 08:15:01
2000*1000*500*3位の画像データ(ハイビジョン画像500枚くらい)を扱いたいんですが何かいい方法があれば教えて欲しいです。お願いします。
195 :
デフォルトの名無しさん :2007/05/23(水) 08:17:31
小数点以下50桁まで扱えませんか?
扱えます。
そういうときはもう、多桁に長けたアルゴリズムを使いましょう
>>196 なにを使うのですか?
どのように表示を
printf("%.50f", 1e-50);
多倍長演算
202 :
デフォルトの名無しさん :2007/05/23(水) 14:49:00
動的な3次元のポインタの使い方を教えてください。ポインタの使い方が不慣れなもんでよく分かりません。現在、3次元の1000*500*300の配列を計算したのですが、配列が大きすぎるのか計算途中でハングアップしてしまいます。どうかお願いします
>>202 8バイト実数だとして1.1GByteか。豪気だな。
>>202 一次元配列に転写して、一気に動的メモリ確保するのが一番。
Ex.
static unsigned offset(int x, int y, int n, int width, int height) {return x + y * width + n * width * height;}
int * array = malloc(sizeof(* array) * 1000*500*300);
for (int in = 0; in < 300; ++in) {
for (int iy = 0; iy < 500; ++iy) {
for (int ix = 0; ix < 1000; ++ix) {
array[offset(ix, iy, in, 1000, 500)] = ix + iy + in;
}
}
}
205 :
202 :2007/05/23(水) 15:12:06
>>204 ありがとうございます!
申し訳ないですが、ここからどのように数値を読み込んで、どのように値を入れたらいいでしょうか。
初歩的なところが分かってなくてすいません。
そもそもcharですら150MBの作業領域が必要になるようなアルゴリズムを修正した方がいいと思うがな
>>205 なんだ、そのレベルか。だったら諦めろ。それが一番楽だ。
>>204 最初から
typedef int MyElement; // 要素の型。int でも double でも好きなように。
typedef MyElement (*MyArray)[500][300];
みたいにしといて
MyArray array = malloc(1000 * sizeof(*array));
で確保すりゃ
array[999][499][299] = 0;
直感的。
必ずそのサイズ必要になるなら、それが一番楽かもね。
動的にやるなら***pが必要になると思うんだぜ?
イミフ
C言語じゃなくてmakeの質問なんですが、詳しい人がいそうなのでここで質問させてください。 .oファイルをソースとは別の場所に出力したいのですが、 コンパイル自体は -c obj/$< のようなオプションでディレクトリobjに出力できるのですが、 リンクのときどう書けばいいか分かりません。 分かるかたいましたら教えてください。
makeスレだってあるだろ
makeスレは人がいません
それはどこのmakeだ? gnu make? bsd make? imake? nmake?
217 :
デフォルトの名無しさん :2007/05/23(水) 22:52:52
よそでやれ。迷惑だ
wildcard でソース一覧を作って、 patsubst で *.c を obj/*.o に置換しる。
キーボードからアルファベット1文字を入力し、その文字の次の文字を出力するプログラムは どのようにして作るのでしょうか?
次の文字って? A→BとかB→Cとか? Zの次は?
そです、A→Bです Zは入力しない方針で
>219 'A' + 1, 'B' + 1でいいんじゃないの だからchに文字が読み込まれているとしてch + 1にすればいいじゃない。 Zはそれなりに表示されるし。
こういうことすると、ASCIIコードが対応してない環境だと うんぬん言われるけど、このほかに方法はあるのかと俺は知りたい。
char c; switch(c) { case 'A': c='B';break; case 'B': c='C';break; ・・・・ } とか
if(ch=='A')return 'B';if(ch=='B')return 'C';・・・ 26文字くらいならアリだと思う
*(strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 'A')+1); 実際はエラーチェックいるけど。
static const char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ."; int ch = getchar(); char * p = strchr(table, ch); if (p) ch = p[1]; putchar(ch);
文字コード32を引いた文字を出すプログラムを作成するのが課題なんですが どのようにしてプログラムを組めばいいのでしょうか
ch -=32; 'a'を'A'にする問題なのかな?
230 :
デフォルトの名無しさん :2007/05/24(木) 00:36:22
ヒント:227さんのカキコを入力として、出力をどうするか考えるといいんじゃないでしょうかねえ。
231 :
デフォルトの名無しさん :2007/05/24(木) 00:37:09
文字コード32って、空白でしょ?
232 :
デフォルトの名無しさん :2007/05/24(木) 00:50:56
なんだ?
233 :
デフォルトの名無しさん :2007/05/24(木) 01:28:18
うう・・・。 もっと、やさしくなりたい。 俺、やなやつ? 人の気持ち無視してるのかな・・・。 すっげえ悩む。
234 :
デフォルトの名無しさん :2007/05/24(木) 04:14:34
お初です。 プログラミング初心者ですがご回答下されば幸いです。 バッファオーバーフロー(以降BOF)に関して知りたいのですがどのサイトを見ても 「BOFの仕組み」や「BOFの対策」ばかりで実際のプログラムの例がほとんどありません。 あっても、ただ単に「こうするとバッファがあふれます」程度 かなり詳しく書いていてもハードルが高くて理解できない実例ばかり 知りたいのは、単純な数行程度のプログラムでBOFを故意に行い、プログラムを書き換えるものです。 昔見たサイトで単純な仕組みでBOFを解説しているのがあったのですが探しても見当たりませんでした。 うろ覚えですが、 char str[3]; strcpy(str, "ABC..."); のような感じでstrのバッファを溢れさせ、関数を呼び出したのか、以降の変数に任意の書き込みを行ったのか そこら辺の記憶が欠落していて思い出せないのです。 ただ、BOFにより何かしらの出力(printf||puts)を行っていたものと記憶しています。 BOFを故意に行い関数を呼び出すもしくは以降の変数を書き換えるプログラムを教えてくださいませんか? できれば、スタックにどのように積まれていき、BOFによってどのように書き換えるのか詳しく知りたいです。 簡単な例をもとに解説してくれるWebPageがあればそちらも教えていただきたいです。 注文が多くて申し訳ありません。 コードだけでもわかれば後は自分で弄って理解したいと思います。 よろしくお願いします。
void f() { printf("ばか"); } void g() { int a[1], n =(int)f; //キャストできないかも a[1] = n, a[2] = n, a[3] = n, a[4] = n; } int main() { g(); return 0; }
>>234 int main() {char buf[4]; gets(buf); return 0;}
必要なのはこれだけ。後はデバッガで追えばバッファオーバフローで異常動作を引き起こす様子を観察できる。
どうやってそれをやればいいか判らないようなら、諦めろ。
237 :
デフォルトの名無しさん :2007/05/24(木) 04:26:17
>>236 もうその程度のレベルの低いレスをしているくせに、諦めろとか言っちゃっているところが
(・∀・)ニヤニヤもんだね
>>234 「プログラミング初心者」がそんなトピックに手を出すのが大間違い。
> かなり詳しく書いていてもハードルが高くて理解できない実例ばかり
これが理解できるまでは無駄だろう。
相手の理解力も重要だが、答える側が適切に理解させられる知識を持っていないのに お前そんなのも分からんのか?やめろとか偉そうに上から物を言っちゃっている 井の中の蛙だから墓穴を掘って笑われるんだよw
っつかgets()はありえない。これを使う時点で(ry
>>234 #include<stdio.h>
int main(void){
char buf1[]="this is fixed string named buf1";
char buf2[]="temp";
char buf3[]="this is fixed string named buf3";
printf("\nbuf1=%s\nbuf2=%s\nbuf3=%s\n", buf1, buf2, buf3);
printf("\n文字列を入力して下さい : ");
gets(buf2);
printf("\nbuf1=%s\nbuf2=%s\nbuf3=%s\n", buf1, buf2, buf3);
return 0;
}
↑のコードで
hello, my name is nanasi.
と入力すると…
>>234 「HACKING: 美しき策謀」 でも読んどけ。
変数が書き換わるのなんか、どんな初心者でも理解できるだろ。
>>234 がより気にしてるのは、「任意の関数を呼び出す」の方。
まあそれも
>>235 に書いてある通りで、
>>236 みたいな書き込みは何の助けにもなってないとは思うよ。
236に235が理解できるかすら疑問。
リターンアドレスを書き換えるのは基本だな。
x86アセンブラの話を延々ここで質問者が 理解するまで進める、というような趣旨か?
____ ..::/ \ おはようございますw / \ ─ ─\ ___ 今沖田w / ─ ─\ ⌒ ⌒ ヽ / \ / ⌒ ⌒ ヽノ(、_, )ヽ | / ― ― \ 仕事?ありえませんねw | ,ノ(、_, )ヽ |-=ニ=- / / ⌒ ⌒ ヽ \ -=ニ=- /:. < | ,ノ(、_, )ヽ | ノ \⌒ ̄ ⌒⌒〜 \ -=ニ=- / 〜⌒ ⌒ ̄⌒ ⌒ ̄ ⌒⌒〜 > < \ /⌒ ⌒ ̄⌒ ⌒ ̄ ⌒⌒〜 ―― l ‐┼― ‐┼― _l_ヾ ー― ト― | ⌒ rー、 | | ―‐― l / ー _ノ / J | ̄ ̄| ーヽ-〃 ヽ_ノ ‐┼― |二二| _ヽ γ、ノ`ヽ | ⌒ |__| (_ , lノ ヽ_ノ / ー‐
無間配列はどうやって作るのでしょうか? それとも無間配列を作ることは不可能なのでしょうか?
なにそれ
「むげんはいれつ」か? Cは[]のオーバーロードが出来ないので、gtter,setter関数で実現すべし。
有限の中でやっていることに対して無限はないだろ。敢えて言うなら可変。
>>246 それはもちろん、「VCでデバッガで」と言ってる人に対しての皮肉ですよね?
関数呼び出し時にスタックにどんな値がどのように積まれ、使われるか。 それがわからんやつに何を説明しても無駄。
引数の順に積むのか? 逆順に積むのか? レジスタ優先割り当てを行うのか? 積まれた引数の巻き戻しは 呼び出し側で整理するのか 呼び出された関数側で整理するのか
>>254 「だったらそこから説明しろ」とか言いかねないな。
何れにしろこのスレの範疇ではないが。
Linux上のgccで書いているのですが、 たとえばpid=1234のプロセスがまだ生きているかどうかを調べるには どうしたらいいのでしょうか? 教えて君でスマソ
それは C の質問というよりは、 Linux の質問な気がするよ。
259 :
257 :2007/05/24(木) 14:04:52
そうですね....どもです(´・ω・`) Linux板逝ってきます
260 :
234 :2007/05/24(木) 14:27:43
ご回答くださり有難うございます。
>>235 短くてわかりやすい例ですね。
mainに戻るアドレスを関数f()に書き換えているわけですね。
>>238 そうですね。もうちょっと勉強しないとだめですよね。
身の程を知れってことでしょうか。
>>241 おぉ、なるほど。buf1が書き換わってしまいますね。
溢れた値が先に詰まれた変数を書き換えているのですね。
>>242 一応買おうかと思い悩んでいるのですが、バイト代が入ったら買ってみます。
>>254 それを知りたいと思い簡単な例で解説してもらおうかと・・・。いや勉強します。
いくつか例を出して頂きましたので、あとはそこから自分で理解して行きたいと思います。
感謝いたします。
>>252 Haskell とか勉強した事ないかい?
あれには無限リストがあるよ。
無限配列ってのはおそらく、
値をメモリに置かず、生成していくのを、
配列操作の文法で実現できるかって話じゃないかね。
C++ なら [ ] や * のオーバーロードで実現できるだろうけど、
C だと無理やね。
バイナリがint型で int | int | int (たとえば、 10 20 30 …) という風に入っているのですが これをファイルのケツまで読み込んで表示したいのですが うまくいきません。どなたか御指導願えませんか int main(void) { int x,y,z; FILE *file; file = fopen("test.dat","rb"); //while(fread( &x , sizeof( int ) , 1 , file )!=EOF){ while(file!=NULL){ fread(&x,sizeof(x),1,file); fread(&y,sizeof(y),1,file); fread(&z,sizeof(z),1,file); printf("%d %d %d\n", x, y, z); } fclose(file); return 0; } これには 1 2 3 4 5 6 7 8 9 という値で試しています
1) 本当にバイナリで書かれているのか? メモ帳で test.dat を開くと 「1 2 3 4 3 5 6 7 8 9」 と見える→それテキストじゃ 2) sizeof(int) とバイナリファイルが想定している整数が同じ大きさか? 3) エンディアンの規定はどうなっているのか? <><><> 先に バイナリデータを作るプログラムを作って そのファイルを読み込むテストしてみたら? →それでうまくいくのなら、2) 3) が怪しい
どううまくいかないのだ?
バイナリで書き込んだデータで試しています。 int main(void) { int buf[] = { 1,2,3,4,5,6,7,8,9 }; FILE *file; file = fopen("test.dat","wb"); fwrite(buf,sizeof(buf),1,file); fclose(file); return 0; } これでデータを生成してから読み込んでいます 上のソースで読み込んだときは 1 2 3 4 5 6 7 8 9 7 8 9 7 8 9 …終わらず 、です どうやったら 7 8 9で終えられるのか教えてください
>>265 while (file!=NULL) で回してるからそーなる。
freadの戻り値をチェックするんだー
1+2+3+4+5+6+.....と無限ループ的に加算して行き 累積加算結果が50を超えた時にループを抜けると言った処理をしたいのですが、どうすればいいのでしょうか? 因みに配列やポインタは使わないものし、ループ関数はwhileを使うものとします 実行結果 1+2+3+4+5+6+7+8+9+10=55
失敗ソース、多分加算方法が可笑しいんだとは思います・・・ 近いことは出来ている気がするのですが(´・ω・`) #include <stdio.h> main () { int num0; num0 = 0; while (num0 < 50) { num0 = num0++; printf ("%d+",num0); // 1+2+3... if (num0 > 50) printf ("=%d",num0); } return 0; }
進行経過を示す変数と それまでの総和を保持する変数は分けなきゃ # それまでの総和を公式で求めるなら それはそれで有りだが
>>266 調べているとEOFが使え無そうなのでそうしていたのですが
freadで読み込んだ値が○なら終了という風にすればよいのでしょうか
その終了の値はバイナリの場合は何が入るのでしょうか
>>270 そういう時、(ファイル形式がどうなってようが) fread について調べる。
>>268 このキモイインデントはどっかで見たな。w
まぁそれはおいといて。
#include <stdio.h>
int main(void) {
int num0=0, i=0;
while (num0 < 50) {
++i;
num0 += i;
if ( num0<50 ) { printf ("%d+",i); } else { printf ("%d",i); }
}
printf ("=%d",num0);
return 0;
}
これでいいんじゃね?
>>268 どうやったらこんなインデントで書けるんだよww
で変換したのかと。専ブラかなんかにそういう機能あるのかな?
>>271 freadの確認をしましたら「読み込みデータの数よりも小さい数、または0を返す」とありました
そこで
>>262 のソースにif(x==0) break;
という風にしたのですが変わらずです…助けてください
>>269 最初はnum0とnum1に分けてやってたのですが
上手くいかなかったのでnum0だけにしてみたんですけど・・・
やはり二つ必要でしたかorz
>>272 おお、動きました!
表示を全部ifに投げると言う発想は無かったです・・・
>>272-273 余り他人のソースを見たことが無いものでして・・・
取り敢えず{があればインデントって感じなのです。。。
私のソースは、そんなに可笑しいですか?
(センスは良く可笑しいと言われますが・・・)
>>275 ちゃんと fread の仕様を読め。
"関数の戻り値" をチェックするわけだから (引数の書き換え値をチェックするのではない)
if (fread(&x, sizeof(x), 1, file) != 1) break;
if (fread(&y, sizeof(y), 1, file) != 1) break;
if (fread(&z, sizeof(z), 1, file) != 1) break;
こうなる
>>277 関数の戻り値ですね…勘違いしていました
while(fread( &x , sizeof( int ) , 1 , file )!=NULL){
//while(file!=NULL){
//fread(&x,sizeof(x),1,file);
fread(&y,sizeof(y),1,file);
fread(&z,sizeof(z),1,file);
printf("%d %d %d\n", x, y, z);
}
でも出来ました。
ありがとうございました
fread(&x,sizeof(x),1,file); xのサイズのものを1個読んで、結果は? 読めたら1、読めなかったら0だろ。 もっとでかい数で指定した場合でも、その数未満なら最後まで読んだことになる。
C言語のアルゴリズムの授業書に、以下の様な物があるのですが
あるアンケートの結果を配列Kに集計したい
アンケートの回答は0,1,2,3,4の数字であり、Nに入力されるものとする
流れ図は以下の通りである
http://www.imgup.org/iup385775.png これってC言語化できると思いますか?
僕はフローそのものに間違いがある気がするんですが
というかNを入力以降のフローの意図することが理解できません
(1 += K(N)って何がしたいんだろうか・・・
しかも表示するわけでも、ファイルに書き出すわけでもなくEND)
フローがおかしいね。 1 += K(N) は明らかに k[N] += 1 の誤植だが、 入力が 0, 1, 2, 3, 4 なのに N != 1 ってのは明らかに変。 出力に関しては、そのフローのさらに後でするだけだろう。 これは集計処理のフローなだけっしょ。
1 += K(N) は、その前のほうを見て想像するに、 k[n] += 1 としたいんだろ。 N != 1はバグだろうけど、そのまま書けない事も無いw 出力が無くたってプログラムは書ける。
>>282 アンケートで (1) を選ぶと集計が止まるシステムの完成!
まさに仕様ミスだな
>>280 を自分なりにフローに忠実に言語化してみたのですが
上手くいきません、と言うか自分で見ても明らかに可笑しい箇所が解ります
解るんですが、解決策が解りません
(配列の概念は大まかには理解してます)
#include <stdio.h>
#include <conio.h>
main () {
int k; // kを配列化出来ない(k[i]ないしk[n]ないしk[i||n]は無理)
int i,n;
for (i = 0; i < 5; i++)
k[i] = 0;
// 暫定的に9を採用
for (n = getche (); n != 9; k[n] + 1); // ココが何もかも可笑しい
return 0;
}
int k[5] でいいだろ。 あとfor文でまとめようとしなけりゃいい。
getche の返す値は文字コードだから、 '0' を引かないとダメやね。 というか、scanf でも使う問題ではないのか?
>>285 こんな感じですか?(コンパイル通りませんが・・・)
というか、k[n]のnに数値を代入し、k[n]に足し込んで行くのに
k[i]が何の為にあるのかがわからないんですが・・・(´・ω・`)
main () {
int k[5]; // 初期化式の使用は題意に反する
int i,n;
for (i = 0; i < 5; i++) // 配列初期化
k[i] = 0;
while (n != 9) {
/*
!足し込み
入力された値をnに入れる
k[n] + 1とすることで入力された値に足しこんで行く
*/
n = getche ()
k[n] + 1;
}
return 0;
}
>>286 scanfだと改行入るから良くないんじゃないかなー・・・なんて思ったんですが
因みに
>>280 は問題ですらない(流れ図と説明みたいな感じ)ので、特にこれといった指定はありませんが
余り複雑なものになると、僕自身が理解できなく(ry
k[i]とk[n]はk=nの時同じものを指す
この場合、do 〜 while 使いましょう。
+= をなぜ + に変えるのかが分からない。
っと、do while でも判別時期がずれるか。 無限ループにして、入力後にif 文で break でどうか。
わけがない
なにやってるのか、段々理解不能になってきました(´・ω・`)・・・ でも、これが理解できないと授業についていけないorz #include <stdio.h> main () { int k[5]; // 初期化式の使用は題意に反する int i,n; for (i = 0; i < 5; i++) k[i] = 0; do { scanf ("%d",n); if (i == n) k[n] += 1; } while (k[n] != 9); return 0; }
298 :
デフォルトの名無しさん :2007/05/24(木) 18:27:52
サルベージage
字面通りにしか理解できんのか・・・。 変数の中に値が入ってるのは理解できてるのか?
アッ−
>>299 int k[5];で領域が5つ確保され
for (i = 0; i < 5; i++) k[i] = 0;でk[0]〜k[4]に0が代入される
(k[0]、k[1]、k[2]、k[3]、k[4]の中の値は全て0)
scanf ("%d",n);でnにint型の値が代入される
} while (k[n] != 9);k[n]が真ならば継続(後判定)
と言うところまでは理解できてます
if (i == n) k[n] += 1; でnがiならば k[n]は+1される・・・ですよね?
iは0ですね
つまり0を入力した時に、k[n]は+1されるんでしょうか??
n や k を何の為に使うか分かってないのかな。 n はアンケートの 0, 1, 2, 3, 4 の数値を入力させたもので、 k はそれぞれの数値に対する票数でしょ。 それが分かれば、もうちょい分かるんじゃね?
>scanf("%d",n);でnにint型の値が代入される されません scanf("%d", &n); >if(i==n) k[n] += 1; なぜそこで i と n を比較しなければいけない衝動にかられたのかと
if(i == n) ここってi == 4 になっちゃうよね? てことはなんかへんじゃない? 俺も初心者なんでちがかったらメンゴ
k[n] += 1 だけでいいのに。 問題は、nが0〜4以外の場合と、9の場合。 1を足す前に9かどうか比較すればいい。 5以上なら抜ける、でもいい気がするがその辺は フローチャートがなおされたら即座に反映できるようにしておけ。
>>304 for 抜けた後の i の値は 5 になるお
よく教科書の例文にreturn(0)が付いているけど、実際に必要な場合はどんなときですか? 値を返すというのはどこに返しているんですか?
>>308 k[i] と k[n] は i == n の時に同じ、と言っただけなのだが・・・。
>for(i = 0; i < 5; i++) k[i] = 0;でk[0]〜k[4]に0が代入される
>(k[0]、k[1]、k[2]、k[3]、k[4]の中の値は全て0)
これが何でこうなるかは分かってる?
>>309 main の話か?
main関数はOSに値を返す
あと、return に括弧つけたらダメ。 retrun(0); とかミスしてもコンパイル通っちゃうから。
>>310 >k[i] と k[n] は i == n の時に同じ
済みません、言っていることが良くわかりません(´・ω・`)
if (i == n) k[i] = k[n];???
>これが何でこうなるかは分かってる?
forの中身が初期化式;ループ式?;カウンタであり
初期化式がi = 0なので、iには0が代入されます
つまりk[i]のiに0が入るということです
そしてk[0]になり、k[0] = 0;となります
そしてiは0なのでi < 5は真(1)でありループします
i++がカウンタなのでiにはは1が代入され、k[1]になり
k[0] = 0;となる
を繰り返し
iが5に成る時
i < 5は偽(0)となるので、forを抜けます
と理解しています
>>314 訂正、ボケました
そしてiは0なのでi < 5は真(1)でありループします
i++がカウンタなのでiにはは1が代入され、k[1]になり
k[1] = 0;となる
>>314 それが分かってるのなら、
k[n] += 1; が何をするものか、
何をしたいものなのかは分かると思うんだけど。
>>314 「i と n が等しい値だったら
k[i] で参照しているところと k[n] で参照しているところは同じ」
問題のアルゴリズムについての話ではない。 配列の一般論
>>k[i] と k[n] は i == n の時に同じ >済みません、言っていることが良くわかりません(´・ω・`) 例えば i が 2 で n が 2 なら、 k[i] も k[n] も k[2] になるだろ。 それだけの話。
>>309 プロセスAが内部で別のプロセスBを呼んだときに戻り値として受け取ったりする
>>317 等しい値ならば、何故iとnを別ける必要があるのでしょうか?
また、k[i]で参照している場所とk[n]で参照している場所は同じとありますが
iとnは別の文字なのに、どうして同じ場所を参照させることが出来るのでしょうか?
>>320 > 等しい値ならば、何故iとnを別ける必要があるのでしょうか?
別に i を入力に使いまわしても良いが、
フローがそう指示してるからでしょ?
>iとnは別の文字なのに、どうして同じ場所を参照させることが出来るのでしょうか?
この認識から外れられない以上
配列とその中身へのアクセスの仕方が理解できないと思われる
>>320 別の文字だったら何か困る事でもあるのか?
値が同じなら、そんな事どうだっていいじゃん。
>>321 確かにフローの指示だからというのはあるのですが
別けているのには、何か特別な意味があるのかな?と思いましたので
(別けることによるメリットなど)
>この認識から外れられない以上
つまり添え字には意味がないと言うことでしょうか?
自分が見るC言語サイトや、参考書、教本にも、添え字についての具体的な説明が一切無いので・・・
(これが添え字、と書いている程度)
>>322 混乱してきませんか?
returnはmainならOSに値を返し、他の関数へ値を返すことができる、()は不必要と。 ありがとうございました。 それで、main内のreturnは必要あるんですか?
>>324 戻り値の型が int である以上 return は必要、というのが C の話。
C++ だと return 0; なら省略可能。
>>323 混乱してきません。
変数の中に入ってる値に注目して考えてみ。
main関数が0を返すのはプログラムが正常終了した事をOSに通知するため。 異常終了の場合は0以外の何かの値を返す。
>>323 添え字に使う「変数名」に意味はない。 (歴史的に i j k x y は多用されるよねー ってだけ)
その「添え字になった変数の値」のみが重要
mainに返り値があればプログラムが正常に終了したか何らかの処理に失敗して異常終了したかを 後で確認するのに便利、てくらいかと 最初のうちは深く考えずに中身に凝ればいいんじゃないかな
>>326 余り良くわかりませんが
例えば
hensu[a]
hensu[b]
hensu[c]
は全て同一のアドレスを参照していると言うことでしょうか?
何でリロードしないかな、俺
a=1; b=1; hensu[a];//hensu[1]; hensu[b];//hensu[1];
>>331 a や b や c の中に入ってる値による。
変数名にこだわり過ぎ。 そんなんじゃ k[i + 1] とか k[2 * 5] とか k[n / 2] とか理解できんぞ。
>>333 なるほど、そういうことですか
これでやっと、iとnが同一と言う理屈が理解できました
こんな馬鹿に長々教えてくださり、本当に有り難うございました
なるほどreturnの用途がよくわかりました わかりやすく教えてくれてありがとう、助かりました
>>335 k[i +1]は、i = 5ならば、k[6]ということで
k[2 * 5]は、k[7]
k[n / 2]は、n = 8ならば、k[4]ということでしょうか?
>k[2 * 5]は、k[7] k[10]
いま、とある問題をしてるんですが 「復改が必要な場合は、全てにおいてputcharを使って改行しなさい」 って指定されてるんですが、\n以外に何かあるのでしょうか
>>338 2つ目は + と見間違えただけだろうと思っとく。
それ意外は問題ない。
これで課題も解けるね。
>>339 素で掛け算と足し算、間違えました
恥ずかしいorz。。。
>>341 有り難うございました
良い勉強になりました
複改って復帰+改行の事でしょ? だったら\r\n。 復帰が\rで改行が\n。
そもそも C の標準関数のレベルでは複改は \n であると決まっている。 それを OS に渡す時に \r になるか \r\n になるか \n のままなのかは OS 次第。
putcharで改行するのは putchar("%r"); ではエラーがでました、ご教授して頂ければ幸いです
突っ込みどころが多すぎて、 どう誘導していいのか分からない。 とりあえず putchar の仕様くらいヘルプでも man でもいいから調べとけ。
ある文字列の一部、つまり文字を整数型に直したいのですがatoiだとエラーが出てしまいます atoiのように文字を整数型に直してくれる関数はありますか?
関数は要らない その文字から'0'を引け
>>350 atoi は普通に使えばエラーの出るはずのない関数だが・・・。
数字がなければ 0 を返す。
エラーになるのって、渡しちゃいけないアドレスを渡した時くらいだぜ。
あ、文字を、だからそれでいいのか。
少し書き方がおかしかったですが、例えば文字型の変数に"12345"と格納してある場合に '3'だけを指定して整数に直したいのですがatoiでどのように指定させればいいのかちょっと分からないのです
atoi じゃ無理。無理矢理やっても効率悪い。
>>351 でファイナルアンサー。
strchr()使えばいいんじゃないのか、多分
char* foo = "12345"; int num = foo[2] - '0'; /* 3 の書かれてる場所な */
c=='\n'; putchar(c); でも改行されなかった
有難うございます 勉強になりました 参考にしていろいろ試してみたいと思います
というか、何故直接 '\n' を putchar に渡そうとしないのかが分からない
putchar('\n'); ってやればいいのに
c=='\n';//==なので'\n'が代入されない。=を使う。 putchar(c);//cに'\n'が入ってないので当然改行されない。 putchar("\r");//文字列じゃだめ。文字を渡す。 putchar('\n');//OK
"\r" じゃなくて、"%r" とか書いてたんだぜ・・・
あ、ほんとだ。 見間違えた。 奴をみくびっていたようだ。
368 :
デフォルトの名無しさん :2007/05/24(木) 20:51:23
日本IBMに入りてー(~ヘ~;)ドラマ『お金が無い!』みたいなビルかっこぇぇと思ってたら日本IBMでした。
それなり以上の大学に入ってそれなり以上の努力すりゃ入れるよ。
370 :
デフォルトの名無しさん :2007/05/24(木) 21:01:58
Fランク大学オワタ(οдО;) オワタクナイ(~ヘ~;)! 資格は足の裏の米粒っていわれるけど、、ソフトウェア開発技術者の資格とればなんとかなる?
巻き返したいなら今からでも受験やり直したら? 現役と比べて2年のブランクまでなら新卒扱いになる。 今大学1回なら今から必死で勉強して国立にでも入って 大学内で必死に勉強すれば入れるよ。3回以上ならオワタだけど。
373 :
デフォルトの名無しさん :2007/05/24(木) 21:26:34
>>371 すごぃな(~ヘ~;)なんか、、、アドバイスを、、4月下旬からC言語やって、ポインタ、ファイル操作とかやって、猫でもにそってやってるんだが、、、次からどないしょう、、
まずIBMに入るのを諦めることからやってみよう
375 :
デフォルトの名無しさん :2007/05/24(木) 21:34:40
>>374 そうします。(~ヘ~;) いろいろアプリケーション作りたいなぁ、、、、、
作りたいアプリケーションがあるなら、それを作ればいい。 その中で、色々覚える事もあるだろう。
377 :
デフォルトの名無しさん :2007/05/24(木) 21:43:47
なにかアプリケーションを作ってみようと思います。取り敢えず、アプリケーション作り書いたる本読みながら作ってみたりして、そこから自分で前に進んでみます。でも、、C言語の入門書やったぐらいやけど大丈夫かなぁ。。
>>373 アドバイスできるほどプログラム知ってる人じゃないけど
とにかくなんか作ってみる事をおすすめします。
僕は高校入った頃にとある開発プロジェクトに混ぜてもらって
そこで色々学んだので。これは稀有なケースだと思うけど…
連結リストやハフマン符号化とかのアルゴリズムも人のソースから学んだっす
(読んだ時は名前知らなかったからデータチェインとか自分で名づけてた)。
とにかく何か作ってみて何度も壁にぶちあたって乗り越えてを繰り返すと
いつの間にかある程度プログラムの構造やコンピュータのアーキテクチャに詳しくなってる筈だと思います。
そこから本読んで正しい知識得て間違った知識を排除すれば良い感じになるかと。
あとソフ開だけ取りたいならこんな事しなくても専用の勉強するだけで余裕だと思います。
僕でも試験1日前に対策本ざっと眺めて過去問やっただけで取れちゃったので。
ここまで書いてて思ったけど完全にスレ違いですね。でも勿体無いから書き込んじゃう。
データチェインかっこいいな
380 :
デフォルトの名無しさん :2007/05/24(木) 21:57:51
ニートです
あらかじめ決まっている4人分の身長、体重のデータを2次元配列に格納して 平均と体重とBMIをだせってプログラムを組んでるんですけどまったくわからない・・・ なにかアドバイスになるものありますか?お願いします
参考書読め
身長と体重のペアを1次元として、それが4つ
まったくわからないなら宿題スレへ丸投げすれば?
例えば 配列array[]があって、while文でarray[]の全ての要素を表示するにはどうしたらいいでしょう? int i=0; while(array) { printf("%d\n", array[i]); i++; } これじゃダメですよね。
>387 int i=0, size; size = sizeof a / sizeof a[0]; while(i<size) { printf("%d\n", array[i]); i++; }
>>387 int array[AMAX];
とする場合、
int i=0;
while( i<AMAX ) {
printf("%d\n", array[i]);
i++;
}
何で for とセットで配列を教えないのか、 教えてる人の気が知れないよ。
1+2+3+…8+9+10 この計算するプログラムはどうすればいいですか? forの中身が分からない
int i,sum; sum = 0; for(i=1;i<=10;i++) sum += i;
printf("%d\n",sum);
int i,sum; sum = 0; for(i=1;i<=10;i++) sum = (1+10)*10/2;
int i, n, sum; n=10; for(i=1;i<=n;i++) if(n%2) sum=n*((n+1)/2); else sum=(n/2)*(n+1);
399 :
デフォルトの名無しさん :2007/05/25(金) 12:18:06
3*3の行列の逆行列を求めるプログラムを知りたいです。お願いします!
俺がモテモテでお金に困らないプログラムを知りたいです!おながいしまつ!
>>401 つ[ マザーボードごと交換が必要です ]
読み込むソースはこのようにしました。(きのう262で聞いたものです) #include <stdio.h> int main(void) { int x,y,z; char inFileName[256],outFileName[256]; FILE *file, *file2; printf("Input Bynary Data >"); scanf("%s",inFileName); if((file = fopen(inFileName,"rb")) == NULL) { printf("入力ファイル(%s)をオープンできない。\n",inFileName); return 0; } printf("Out put File Name >"); scanf("%s",outFileName); file2=fopen(outFileName,"w"); while(1){ if (fread(&x, sizeof(int), 1, file) != 1) break; if (fread(&y, sizeof(int), 1, file) != 1) break; if (fread(&z, sizeof(int), 1, file) != 1) break; //printf("%d %d %d\n", x, y, z); fprintf(file2,"%d %d %d\n", x, y, z); } fclose(file); fclose(file2); return 0; }
gzファイルは環境によってはDL時にブラウザが展開しちゃう場合があるからな まずはバイナリエディタで調べてみてはどうか
バイナリで中身を見てみて、適当に先頭部分に 1 2 3〜7 8 9 などの値を入れてみたのですが…変な値が出てきて。 int main(void) { int buf[] = { 1,2,3,4,5,6,7,8,9 }; FILE *file; file = fopen("test.dat","wb"); fwrite(buf,sizeof(buf),1,file); fclose(file); return 0; } これで生成したデータは読み込んで、そのまま表示しているのですが。 1 2 3 4 5 6 7 8 9 | int SizeX | int SizeY | int SizeZ |\n | 3D raw data [...] | この形式が 改行まで含んでいるのか、それとも含んでいないのか あるいは 1行目 Xのサイズ Yのサイズ Zのサイズ|改行 2行目以降 xyzxyzxyzxyz…xyz それともgzでやはり圧縮されておかしくなってるのか… どうにも確認の方法がなくて…
だからよ、バイナリエディタでまず改行の有無を見てみたらいいじゃん ちょっとみてみたけど、そんな仕様にはなってないみたいだよ それと、外からファイルを持ってくるのならエンディアンに注意な。
つーか、.gzならgzipで展開すればいいジャマイカ。
バイナリ扱うのが初めてなもので、わからないことが多すぎでした
バイナリで開いたところ、始めのほとんどが0でおかしいな…と
>>408 コンソールに渡してgzipで解凍しようとしたのですが
gzip形式では無いとエラーがでてしまって
今ダウンロードしてみた。 確かに落ちてきた段階で展開されているね。 例えば、aneurism.rawとかskull.rawで256*256*256→16777216バイトでサイズ的にもいいみたい。 後は単純に、グレイ256諧調のxyデータが256枚z方向に並んでるイメージっぽい。 例えばIrfanViewならrawデータ用プラグインを使って幅256、高さ65536、8bppで見える。 #このままでも歯並びがよく判るのさw
IrfanViewで見られるのですか!? さっそく試してみます!
412 :
410 :2007/05/25(金) 15:26:50
ちなみに.vol.bz2の方は、bzip2で展開すると先頭のほうにテキストで情報が追加された.rawだと言うことが判る。 #って、ここまで全然Cに関係してこないや。
<条件> ・ビリヤード台がおいてある ・台の左下端の座標は(0,0)、右上端の座標は(2,1)とする ・位置(x0、y0)に手玉 ・手玉の初速度(v0x,v0y) ・手玉の位置、初速度はscanfをつかって入力する <問題> ・手玉はどこに衝突するか? ・衝突位置の座標を表示する ・ポケットにおちることは考えなくてもよい ・20回のバンクを考慮して21カ所解答 お願いします!!
>>410 >>412 ありがとうございます!見られました!
ここから数値データに…もっていければ一番なのですが
もう少し頑張ります
手玉のサイズさえ考慮しないのなら、ビリヤードなんて言うことないのに。 #手玉と的玉でImaginaryBallなんて話が出てきたりすると面白いのだが。
>>415 ものすごーく横着したければ、IrfanViewでPGM(勿論Ascii)で保存すれば数値の書かれたテキストになるw
なるほど、そこから必要な数値を抜き出せるわけですね ようやく先に進むことが出来そうです。本当にありがとうございました!
#include<stdio.h> main() { int a; int f; int i; int t; printf("aaaaa\n"); scanf("%d",&f); for(t=0;t==1;t++){ if(f==2){i++;} else{a++;} } f=0; printf("AAAAA\n"); scanf("%d",&f); for(t=1;t==2;t++){ if(f==1){i++;} else{a++;} } printf("%d個\n",a); printf("%d個\n",i); return; } もう何やってるのかもわからない
>419 aとiに値が入ってない forループはどちらも実行されない なにがしたいのかさっぱりわからない
マルチスレッドプログラミングをしているのですが、たとえばtest()という関数を作ったとします。 スレッドAとスレッドBにおいて、同時にtest()という関数を呼び出したらどうなるのでしょうか? 普通にtest()という関数がそれぞれのスレッドで独立して並列処理されるだけでしょうか?
>>421 基本はそう。内部に静的変数があるとぶつかるので要注意。
#その点では、標準関数のうちのいくつかも使えない。
グローバル関数はいけませんよね?
排他処理してればいい。 リエントラントとか再入可能という言葉も調べてね。
425 :
421 :2007/05/27(日) 11:47:21
つまり、その関数内において、静的変数やグローバル変数を使用している場合は 排他処理をする、それらの変数を使用していない場合は特に何もする必要はないという事ですかね? あと、その関数自体を全て排他処理したらプログラムがフリーズしてしまいました。 なんか排他処理を色んなところで使ってると時々プログラムが応答なしになります。 排他処理を細かく分けてちょくちょくやれば正常に動いたり・・・ 一体何が起きているのでしょうか?
>>425 別のスレッドが使ってるスタックは当然ながら別のもの、といえばわかるかな。
複数のオブジェクトに同時に排他かけるとデッドロックを起こす場合がある。
>>425 グローバル変数にしても静的変数にしても同じだけれど、単に衝突を避けるだけではダメかも知れないよ。
例えば、strtok()のように一回目の呼び出しでセットして二回目以降でそれを利用するような場合、
それを静的変数で実装していたら読み書きを排他するだけではどっちみちまともに動かない。
double *p; p = 0; printf("元のアドレス = %x\n", p); printf("1を加えた後のアドレス = %x\n", ++p); printf("1を加えた後のアドレス = %x\n", ++p); printf("1を加えた後のアドレス = %x\n", ++p); pのアドレスを0で初期化してアドレスの変化を見たのですが、出力結果が 元のアドレス = 0 1を加えた後のアドレス = 8 1を加えた後のアドレス = 10 1を加えた後のアドレス = 18 のようになりました。double型のサイズは8なのでアドレスが8ずつ増えたりすればまだ理解できるのですが、 なぜ+8→+2→+8→+2・・・のような不規則な変化をするのでしょうか?
429 :
428 :2007/05/27(日) 16:49:41
書き込んだ瞬間、「あ、16進数だからか」ということに気がつきました 何やってるんだオレは・・・ お騒がせしました
>>426 オブジェクトってのは変数とか関数の事でしょうか?前提知識が少なくてすみません。
デッドロックについて調べたのですが、具体的にどんな状況で起こるかが分かりませんでした。
スレッドAでグローバル変数X、Yに対して X++; Y++; という操作を、
スレッドBで Y++; X++; という操作をミューテックスで排他制御をした場合を考えたとき、
スレッドAでXにアクセスした瞬間に、スレッドBがYにアクセスした時に、お互いの終了待ちを待つ
デッドロックが起こるのでしょうか?
私の感覚だと、スレッドAがXにアクセスする直前にWaitForSingleObject()を行った時点で、
AがReleaseMutex()をするまでスレッドBは変数Yにすらアクセス出来ない感じなのですが。
スレッドA
WaitForSingleObject()
X++;
Y++;
ReleaseMutex()
スレッドB
WaitForSingleObject() //スレッドAがReleaseMutex()するまでココで待機
X++;
Y++;
ReleaseMutex()
>>427 strtok()って便利そうな関数があるんですねw
これと排他制御を組み合わせるとどうなるか、考えるにはちょっとまだ俺の頭が足りないようです・・・
>>430 デッドロックっていうのは、2つのプロセスorスレッド(それぞれをP(A), P(B)とする)が
ある資源(変数でもいいし、ファイルとかでもいい。R(A), R(B)とする)を互いに取り合って止まる状態
具体的には、P(A)・P(B)は両方ともR(A), R(B)を必要とし、かつ両方の資源を排他的かつ同時に利用できないとダメだとする
ここでP(A)がR(A)を、P(B)がR(B)を排他利用出来る状態になったとする。
すると処理を完了するためにP(A)はR(B)を、P(B)はR(A)をそれぞれ要求する訳だけど
それは既に相手に排他利用されているので確保できず、解放されるのを待つしかなくなる
しかし両方ともそれをやり始めるので結局いつまで経っても終わらずそこでストップ
これがデッドロック。並列処理で他にも問題になるものにスタベーションってのもあるがそれは全くの別物
あと、strtok()はmanpageにも書かれているようにスレッドセーフではないから
基本的にマルチスレッドで使うと変な挙動をする
排他制御でどうこうするより大人しくReentrant版を使うのが吉
>>430 strtok()はマルチスレッドから使っちゃダメな例として挙げただけだよ。
>>428 ポインタ管理に癖のある環境もあるから、実際に意味のある変数を指さない値を代入するのは危険(或いは好ましくない)よ。
#0(所謂NULL)は例外。
たまたま0x8, 0x10, 0x18になっただけで、そこに何か置ける訳でもないし。
>>431 つまり、構造的に排他処理の入れ子状態になってる時に起こるって事でしょうか?
先ほどの私の例だと特に問題はなく、
スレッドA
WaitForSingleObject(1)
X++;
WaitForSingleObject(2)
Y++;
ReleaseMutex(2)
ReleaseMutex(1)
スレッドB
WaitForSingleObject(2)
Y++;
WaitForSingleObject(1)
X++;
ReleaseMutex(1)
ReleaseMutex(2)
のような時にデッドロックが起こると・・・。もし違ったらごめんなさい。
だとしたら、私のプログラムでデッドロックが起こる事はないような気もしますが・・・。
Mutexは一つしか作成してないですし。ちょっとスレッドプールによるデッドロックというのも
見かけたので、そっちについても調べてみます。
>>432 ポインタの先にアクセスしないのに何が危険なのか
ポインタ変数そのものはただの変数
未定義動作だから何が起こるかはわからんが、そのくらいなら何も危険ではなかろう。
ポインタ演算は配列(動的なのを含む)のアドレスに対してしか、 その有効性が保証されてないからな。 NULL に何を足しても NULL になる処理系があっても 文句はいえないんじゃないだろうかね? まあ、そんな無駄な処理を入れることはないだろうけど。
ってことはこういうコードは保証されていないって事になるのか たまに使うことがあるのに… orz #include<stdio.h> #define OFFSETOF(type, member) (int)(&((type*)0)->member) typedef struct{ double x, y, z; }vect3d; int main(void){ printf("%d\n", OFFSETOF(vect3d, x)); printf("%d\n", OFFSETOF(vect3d, y)); printf("%d\n", OFFSETOF(vect3d, z)); return 0; }
offsetof は stddef.h にあるだろ? 何で自分で定義してるの?
それは
>>436 で言うところのポインタ演算じゃないと思うが、
それはそれで規約で許されてるかどうかは微妙だな。
GCC も、__builtin_offsetof って言うビルトイン関数(関数と言っていいのか微妙だが)を使って実装してる。
440 :
電波高専生 :2007/05/27(日) 18:51:32
すいません。課題を明日までに終わらせないといけなくて困ってます。 でも馬鹿なもんで全然わかりません。 そこで皆さんに教えてもらいたくてきますた。 マイクロI/Oカードをポケットコンピュータにつないで作るプログラム なんですけど 「インターフェースボード上のディップスイッチの入力値(2進数)とは 逆の反転した値を表示するプログラムを作成せよ。」 って問題なんですけどわかりますか?
できなきゃできなかったでいいじゃん。 分かりませんでしたー、で。
442 :
電波高専生 :2007/05/27(日) 19:06:29
留年しますそれじゃ ちなみに普通のディップSWの入力を出力するプログラムは main() { int a; FILE *fp; fp=fopen("pio","r+"); pioset(0xf0); clrscr; while(1){ a=pioget(); a=a/16; gotoxy(5,1); printf("SW date=%4d",a); pioput(a); } fclose(fp); }
printf("SW date=%4d",a); ↓ printf("SW date=%4d",~a); 但し a のビット数と pioget(); で取得できる有効なビット数の違いに注意
有効なビット数が決まってたら xor だろ。
そもそも、d や u じゃなくて x で出力した方がいいとかはないのかな。
>>439 ろくに規約も読んでないくせに
適当な事を言わないでくれますか
初心者を騙してるというより
自分が知らないように見える
正しい事知ってるなら、それをここで言えばいいのにね。 何で文句だけ言って後は放置なのか理解できない。
いや、知らないし
入力された文字が、半角英数字か日本語か調べたいのですが、そのような関数はないのでしょうか? 文字が入力されるたびに、入力文字のバイト数を測るにしても、 半角カタカナなどを入力された場合、1バイトになるためにその方法は使えません。 何かいい方法はないでしょうか?
>>450 それって半角英数字以外は(記号なんかも含めて)全部日本語扱いになるの?
int nlz(unsigned k) { double xx = (double) k + 0.5; int n = 1054 - (*((unsigned *) &xx + LE) >> 20); return n; } 先頭の 0 の個数を数えるルーチンらしいけど、 このポインタ演算の部分が規約違反なのが原因で、 ちゃんと動作しないことがあるらしいね。 共用体使って書いても規約違反らしいが。
>>451 IMEを使って変換して入力するようなものは全て日本語とします。
要は変換の作業がある文字と、そうでない文字に分けたいです。
半角英数字記号 -> abcd...xyz, AB...XYZ, 0123...89, @+:=^|\...etc
日本語 -> あいう〜わをん、0123…89、アイウ…ワオン、@+とか色々
>>452 規約規約って気持ち悪いな。
規格言え馬鹿
ごめん。間違えた。
>>453 それじゃ定義が曖昧だな。
文字コードがいくらからいくらまでが、と具体的によろ。
>>453 よくわからないからテキトーに答えるけど、
>文字が入力されるたびに、入力文字のバイト数を測るにしても、
>半角カタカナなどを入力された場合、1バイトになるためにその方法は使えません。
バイト数測った後、半角カタカナかどうか判定するんじゃ駄目なの?
バイト数とかより、普通は文字コードの範囲で見ないか?
エラーメッセージがイミフ
/tmp/cc8ncWpL.s: Assembler messages:
/tmp/cc8ncWpL.s:363: Error: missing or invalid immediate expression `' taken as 0
/tmp/cc8ncWpL.s:363: Error: suffix or operands invalid for `call'
/tmp/cc8ncWpL.s:369: Error: missing or invalid immediate expression `' taken as 0
/tmp/cc8ncWpL.s:369: Error: suffix or operands invalid for `call'
/tmp/cc8ncWpL.s:374: Error: missing or invalid immediate expression `' taken as 0
/tmp/cc8ncWpL.s:374: Error: suffix or operands invalid for `call'
/tmp/cc8ncWpL.s:380: Error: missing or invalid immediate expression `' taken as 0
/tmp/cc8ncWpL.s:380: Error: suffix or operands invalid for `call'
/tmp/cc8ncWpL.s:386: Error: missing or invalid immediate expression `' taken as 0
/tmp/cc8ncWpL.s:386: Error: suffix or operands invalid for `call'
/tmp/cc8ncWpL.s:392: Error: missing or invalid immediate expression `' taken as 0
/tmp/cc8ncWpL.s:392: Error: suffix or operands invalid for `call'
/tmp/cc8ncWpL.s:397: Error: missing or invalid immediate expression `' taken as 0
/tmp/cc8ncWpL.s:397: Error: suffix or operands invalid for `call'
/tmp/cc8ncWpL.s:403: Error: missing or invalid immediate expression `' taken as 0
/tmp/cc8ncWpL.s:403: Error: suffix or operands invalid for `call'
/tmp/cc8ncWpL.s:409: Error: missing or invalid immediate expression `' taken as 0
/tmp/cc8ncWpL.s:409: Error: suffix or operands invalid for `call'
http://www.uploda.org/uporg826781.c.html ソースコード
プログラムのエラーなの?なんでアセンブラから?
$ って何?
え?
解決しますた。 すまそ
というか、半角カナはカナロックすれば直接入力できたとおもったが。
同フォルダ内の*.cファイルだけを拾いたいのだけど、 どうやればいいのか、よくわからないから教えて欲しい。 lsコマンドを勉強したけど、イマイチなわかり具合だ。
ls *.c
既存のものを使うわけじゃなくて、それを作りたいんだ。 すまない
正規表現でおk
>>470 ワイルドカードは正規表現とは大分違う。
>>469 正規表現へのトランスレータを書くか、自前で全部書くか。
既存のものを参考にするのが一番早いと思うが。
>>467 これじゃいかんの?
#include <stdio.h>
int main(void){
FILE *fp;
int moji;
fp=popen("/bin/ls *.c", "r");
while((moji=fgetc(fp))!=EOF) putchar(moji);
fclose(fp);
return 0;
}
ワイルドカードなんてそんなに難しいことはないぜよ。 a.b.c と a.*.c のマッチングを例にすると、 まず a. は普通にマッチして、次に * にぶつかる。 ここで、残りの b.c と .c のマッチングを再帰で行う。 まあ失敗するから、次は最初の1つを除いた .c と .c のマッチングをまた再帰で行う。 ここでマッチングに成功するので、マッチする、と。 再帰してるのは、ワイルドカードが複数あった場合にも対処できるから。
漏れも ls -r * に相当するものを(シェルや既存コマンドに頼らずにglibc, gccだけで)作りたいのですがわかりません>< *の部分はシェルが展開しているようなのですが、シェルのソースコードを読めということでしょうか? となるとOSによってかなり違いますよね..
dosのwildcardとshのwildcardは随分違うもんねぇ。
477 :
467 :2007/05/28(月) 20:11:04
opendirとreaddir使って、まずlsを作って、 readdirのd_nameに溜め込まれたものから strstrで".c"を探して、作りたい物が一応出来た。 まぁ、これでいいやw
478 :
475 :2007/05/28(月) 20:16:25
>>477 なるほど。サンクスです。オレもそれでいいやw
やってみます
"echo *.c"のほうがよくね?
$ echo *.c *.c
そんなshellが現存するとして、 $ls *.c ls: *.c: No such file or directory $ls *.c コマンドまたはファイル名が正しくありません のどちらかになるのがオチだろうに。
それはない
bash だとファイルが無いときはマッチングは無視されて そのままの文字列で渡されるお。
unix系だとreaddirとfnmatch WindowsならFindFirstFileにそのまま渡す それだけで充分
ls **/*c ls ~/*c
すみません。 UNIXでのCnoコンパイル/リンク時のオプションについて ここで聞いてもよいでしょうか?
ダメです。
Cのコンパイル/リンク・・・の typo か? 使ってるコンパイラのスレで聞いた方が早いと思うぞ。
S_ISDIR と S_ISLNK が同時に真になる事ってあるのでしょうか
あるけど、何でここで訊くの?
491 :
デフォルトの名無しさん :2007/05/29(火) 11:13:13
型についてですが、71ビットまでを乗算させた結果を画面に出力したいのですが ビットが足りないため0になってしまいますInt型とlong型で足りないのですが 71ビットまでの乗算が出来る型はあるのでしょうか?お願いします
492 :
デフォルトの名無しさん :2007/05/29(火) 11:15:33
連投すいません、コンパイラは: Borland C++ BuilderX Personal でした
多倍長計算でぐぐれ
>>493 31ビットが限界でした・・・。ここまでこれたので手動で頑張ってみます
引き続き多倍長計算を参考に色々と弄ってみます。有難うございました!
>>494 普通のCコンパイラならlong doubleで80ビット実数型が使える。
指数ビットがあるから精度は64ビットだけどそれでも足りない?
>>495 60bit以上まで表示出来ました!ここまで計算出来るなら嬉しいです
計算量減って助かりました有難うございます!
計算結果が0になるって事は元々下位のビットが0ばかりなの?
64 ビットの精度でいいんなら、 64 ビットの整数型を使えば。 ただ、BCC にあるのかどうかは知らんが。
71ビットはどこから出てきたんだ
俺も気になる
501 :
デフォルトの名無しさん :2007/05/29(火) 18:56:21
厨房ですいません。 C言語を独学で学びたいのですが、最初に学び始める本で、オススメはありますか?
このご時勢にcから入ったら、並みの人間ではモチベーションが続かないと思う。
505 :
デフォルトの名無しさん :2007/05/29(火) 20:07:33
C♯とC++は同じですか?
>>505 C#はJAVAに近い(J#あるけど)
C++はC言語の拡張(厳密言うと違うが…)
C++は本代がかなりかかるからお勧めしない
510 :
垣内 :2007/05/30(水) 15:57:38
夫が浮気してるみたいなんですが。
/ ̄ ̄\ ← 夫
/ _ノ \
| ( ●)(●) <おっと、それ以上は言うなよ…
. | (__人__)____
| ` ⌒/ ─' 'ー\
. | /( ○) (○)\
. ヽ / ⌒(n_人__)⌒ \
ヽ |、 ( ヨ | ←
>>510 / `ー─− 厂 /
| 、 _ __,,/ \
>>512 【審議中】
∧,,∧ ∧,,∧
∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) U) ( つと ノ(ω・` )
| U ( ´・) (・` ) と ノ
u-u (l ) ( ノu-u
`u-u'. `u-u'
514 :
デフォルトの名無しさん :2007/05/30(水) 21:24:00
課題 このプログラムをベースに入力する秒数を実数にして時間・分・秒数に変換するプログラムを作成する 教えてください ♯include <stdio.h> intmain(void) { int ji,fun,byou; printf("秒数=") scanf("%d",&byou); ji=byou/3600; byou=byou%3600; fun=byou/60; byou=byou%60; printf("%d時間%d分%d秒\n",ji,fun,byou); return0; }
>>514 なんでそんな明らかにコンパイル出来ないソースを書くかなぁ・・・
>>514 ♯include <stdio.h>
intmain(void)
{
int ji,fun,byou;
printf("秒数=")
scanf("%d",&byou);
fun=byou/60;
byou=byou%60;
ji=fun/60;
fun=fun%60;
printf("%d時間%d分%d秒\n",ji,fun,byou);
return0;
}
518 :
デフォルトの名無しさん :2007/05/30(水) 22:00:07
ジョブショップ型生産のプログラムだれか作って!!
520 :
デフォルトの名無しさん :2007/05/30(水) 22:10:02
教えてください aの値が10を超えたら0にしようと思ったのですが if (a < 10) a = 0; コレじゃだめなんですか? コンパイラはVC2003でつ 初心者すぎますかね?
a > 10
>>520 if (a < 10) だとaが10未満の場合だぞ
カワイイな
5時間経過… ∧,,∧ ∧,,∧ ∧ (´-ω-) (-ω-`) ∧∧ ( ´-ω) U) ( つと ノ(ω-` ) zzz... | U ( ´-) (-` ) と ノ u-u (l ) ( ノu-u `u-u'. `u-u'
>>526 いや、寝てないでとっとと審議で真偽を出さんかい、ゴルァ!
【
>>527 のギャグについて審議中】
∧,,∧ ∧,,∧
∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) U) ( つと ノ(ω・` )
| U ( ´・) (・` ) と ノ
u-u (l ) ( ノu-u
`u-u'. `u-u'
【審議中】 ババ バババ ババババ バババ ∧_,∧ ババ ∧_∧ バババ ∧_∧バ( ´・ω・∧_∧ (・ω・` ) ∧_∧ (´・ω・)=つ≡つ);;)ω(;;(⊂≡⊂=(・ω・`) (っ ≡つ=つ (っ>527⊂) ⊂=⊂≡ ⊂) / ) バ∧_∧| x |∧_∧ バ ( \ ( / ̄∪バ ( ´・) ∪ ̄∪(・` )ババ ∪ ̄\ ) ババババ/ ) バババ ( \ ババババ バババ `u-u'. バババ ババ `u-u'
審議というかリン(ry
ぬぬっ、心技一体でお前らの攻撃をすべてかわしてやった。ちゃんと審議せいや?
return 0;
ワロタ
534 :
520 :2007/05/30(水) 23:09:13
お・・・・・ 気が付かなかった
535 :
デフォルトの名無しさん :2007/05/31(木) 00:20:36
Turbo C++ Explorer をパソコンにインストールしたいのですが、 その時に Visual J# .Net Redistributable Package が必要なんですがこれをインストールしようとすると、 .NET Framework v1.0.3705 が必要と出てきてしまいます。 私のPCには.NET Framework v1.1.4322が入っており 上記のものをインストールする事が出来ません。 どうしたら良いのでしょうか?
536 :
デフォルトの名無しさん :2007/05/31(木) 00:39:43
#include <stdio.h> int main(void) { printf("逝ってよし"); reurn 0; }
reurn
538 :
デフォルトの名無しさん :2007/05/31(木) 00:49:49
re-urn ?
f-ck
sh*t
sexピー
柿ピー
文字列”あ”を16進数に戻したいんだけどどうやるの? char str[] = "あ"; unsigned int c = str[0]; ?????
>>543 printf() とか sprintf() とか
ふーむ、ありがと。
うーん、文字としての16進数じゃなくて、数値としても16進数が欲しいのです。 ”あ”が1バイト文字なのか2バイト文字なのか判定したいのです。
>>546 sizeof(str)が3なら2バイト文字だが、やりたいのはきっとそういうこ
とじゃないよね。
strにどんな文字コードで文字が入っているか(Shift_JISとかUTF-8とか)
はわかるのかい?
えーShift-JISです。1バイト目が0x81からどこそこまでは2バイト文字だっていう判定がやりたいのです。
>>548 であれば、
unsigned char c = str[0];
if (0x81 <= c && c <= 0x9f || 0xe0 <= c && c <= 0xfc) {
...
でいい。
ismbblead() とか IsDBCSLeadByte() が使えるなら、そっちを使ったほ
うがいいです。
>>549 ありがとう。なんか難しく考えすぎてました。
APIもあるんだ。
どうせなら ANSI 標準の mblen() を使っとけ。
以下はpをどの様に処理するのでしょうか? よろしくお願いします。 #define pletohs(p) ((short) \ ((short)*((const char *)(p)+1)<<8| \ (short)*((const char *)(p)+0)<<0))
関数で書くなら short pletohs(const char *p) { return (short)p[1] << 8 | (short)p[0]; } みたいなもんか。 その環境のバイトオーダに関係なく リトルエンディアンのshort値を取得したいんじゃないかね。 p は const unsigned char じゃないとヤバいと思うが。
名前からしてが ポインタ リトルエンディアン->ホストエンディアン short型
555 :
552 :2007/05/31(木) 22:20:59
>553,554 なるほど、ありがとうございます。助かりました。
質問です。 文字列の宣言には char *msg = "i love you"; char msg[] = "i hate you"; と2種類の方法があることを習ってしばらく経ちました。 仕組み自体は大体わかってます。 自分的には、大雑把な特徴としては char *msgは、原則書き換え不可 char msg[]は書き換えがラクチン、というイメージがあるのですが そうするとchar *msgの方は存在意義が無くないでしょうか? char *msgと書かれた部分は別にchar msg[]では替えが聞くのでは? ただそれなのにいろんな本を読めばchar *msgという宣言は腐るほどあります。 ポインタで宣言するメリットって何なんでしょうか?
>>556 while(*msg)putchar(*msg++);ができるあたり
>ポインタで宣言するメリットって何なんでしょうか? ポインタで充分なときに余計な配列を確保しない。 #詳細はお風呂上りにでも♪
static const char msg[]="i like you"; の方が最適化的に良い、ってのは誰の話だっけか
>>557-559 どうもです。やっぱり「エレガントな記法ができる」「無駄が省ける」程度の話であって
本質的に違いがあるわけではないのですかね。。。
>>558 おながいしまつ。期待してます。
本質的に違う。 char *msg = "i love you"; はどこかにある文字列リテラル(静的)へのアドレスが msg に代入される。 char msg[] = "i hate you"; は msg という配列変数を作って、その文字列で初期化する。 msg が静的でないなら、毎回コピーが発生する。
キーボードから1文字入力し、入力された文字が小文字なら大文字に、大文字なら小文字に変換するプログラムはどうやって作成するんでしょうか? ((中略)) if(64>a); { putchar(a-32); } else if(32>a) { putchar(a+32); という式を作ってみましたが、根本的に何かが違うみたいです
'A' <= a && a <= 'Z' 'a' <= a && a <= 'z'
そこでisupper/islowerとtoupper/tolowerと言われ まんまと罠に嵌るのが目に見える
〜の条件を満たしていないときは、入力文字をそのまま表示する はどのような感じでプログラムを組めばいいんでしょうか
if (!条件){ 表示(入力した文字); }
場合によっては
if(条件) {
/* 表示しない */
} else {
表示(文字);
}
の方が読みやすい事もある。
好みの問題だが。
条件をド・モルガンの法則で逆転させるのは
条件が読みづらくなることがあるので、あまり勧めない。
>>566 みたいに分かりやすい条件をベースにして、
! で条件をひっくり返すのがいい。
#define unless(pred) if(!(pred))
if(条件 == 満たしていない){ 表示(文字); }
>>568 制御文を勝手に増やすと
読みづらいと文句が(ry
571 :
デフォルトの名無しさん :2007/06/01(金) 07:49:55
VC2005を使っています。プログラムをコンパイルはできるのですが、デバッグなしで実行する段階で Debug Assertion Failed! Program:.. File:isctype.c Line:56 Expression:(unsigned)(c + 1) <= 256 というエラーがでます。このisctype.cは自分で作成したものではなく、実際にソースを呼んでも良くわかりません。 また、デバッグモードで実行すると プログラム '[492] test.exe: ネイティブ' はコード 3 (0x3) で終了しました。 と表示されます。 このエラーを改善するためにはどのようにすればいいでしょうか?
>>571 エラーには大きく分けて2通りある。
1つは、「ビルド時に発生するエラー」。この場合は、文法の誤り等がある。さらにコンパイルエラーとリンクエラーとに分かれる。
もう1つは、「実行時に発生するエラー」。この場合、実行時にOS上でありえない動作をしたらエラーが発生する(例外が発生するという)。
例えばプログラム実行時に0で除算したり、確保していない領域にたいして値を書き込もうとすると発生する。
この場合、実行時にエラーが発生している。
デバッグモードで1ステップずつ実行して、定義した変数の動きを追いかけたら?
MBCS系の is〜 関数に UNICODE 文字 渡したんじゃねーの?
入門篇なのに何言ってるか分からないぜ
Expression:(unsigned)(c + 1) <= 256 この関数に256以上の数値を渡したってことだべ。 実際にアサーション起こしたところで中断選んで、 デバッグのウィンドウの呼び出し履歴から、 自分で書いたソースの部分をダブルクリックか、右クリック+ソースコードへ移動、で クイックウォッチあたりで変数に何が入ってるか見てみよう。
577 :
576 :2007/06/01(金) 12:53:00
あ、中断ってのは、そのエラーのダイアログで[再試行]押してから[中断]な
C単文を書け。xのy乗を計算するC言語プログラム 反復にはwhile構造でお願いします。 誰か教えてくださいm(_ _)m
printf("%d % %d=%d\n",a%b); という風に%で計算したいのですが、いざ表示すると a % %d =%d になってしまうのですが、改善方法はないでしょうか
そもそも引数がおかしいんじゃね?
日本語でOK printf("%d % %d=%d\n", a, b, a%b); こういうことかい?
printf("%d %% %d=%d\n", a, b, a%b);
>>585 ば、ばか、本当に偉い人だったらどうするんだ
ば、ばか、本当にエロイ人だったらどうするんだ
うほっいいおt(ry
>>580 を意訳してみようと努力すると、
printf("%d %% %d=%d\n"a,b,a*b/100);
とか。
>>590 どう意訳するとそうなるんだ?
しかも等価式でなくなるし
意味不明
>>590 きっと、%使う→百分率→*100すりゃいいんでね?とかじゃねぇの?
よくわかんねぇけどw
>>593 *100でもねぇし、わがんねw
逝ってきます
アホスwwwwwwwwww
596 :
590 :2007/06/04(月) 00:48:13
>>580 > という風に%で計算したい
って有るから、なんとなく
> printf("%d % %d=%d\n",a%b);
は「a の b% は ???」みたいな解釈です。
Hello Worldからもう一度どうぞ
599 :
デフォルトの名無しさん :2007/06/04(月) 21:00:48
c言語関連のフローチャート(アルゴリズム)の勉強をしたいと思っているのですが 先輩方が使っているお勧めの参考書とかありますか?
フローチャートを勉強したいの?
はい
フローチャートを勉強したいの?
フローチャート≠アルゴリズム
アルゴリズムとフローチャートは別物だろ。
そうですかぁ、なんか勘違いしてたみたいです
アルゴリズムを勉強したいの?
はい
フローチャートとアルゴリズムを勉強したいの?
609 :
デフォルトの名無しさん :2007/06/04(月) 21:27:03
フローチャートです
はっきり汁
すみません、やっぱアルゴリズムです
最初からコテつけとけばよかったな〜 まぁ、いいや
アウロリズニにすていくわいくsかれれているサイトを教えて下さい。
アルゴリズム体操を研究してるサイトってありませんか?
>617 NHKへようこそ
ピンポンパン
621 :
デフォルトの名無しさん :2007/06/07(木) 13:34:32
配列で変数宣言のとき int tango[i]; int i = 0; ってできますか? 配列を使って単語の長さを調べてヒストグラムにするプログラムを作らなきゃならないんですけど 単語の長さがあらかじめ決まってないので、入力された単語の長さで配列の長さを調整できるようにしたいんです
C99 なら条件付きで可。 そうでないなら malloc。
624 :
デフォルトの名無しさん :2007/06/07(木) 16:49:19
初めまして、質問があるので宜しくお願いします。 C言語之参考書を買ったのですがハードウェアの事が書いてあり疑問があります 記号や文字列と連動しているので、ハード板でなく此処で質問させて戴きます どうして、1KBが1024B、1MBが1024KB等と 中途半端に1024なのでしょうか?どうして、10の〜上が、24と付くのでしょうか?
1024は中途半端じゃないから
メモリとかの記憶領域は 2の累乗で増えてくから
10進数を2進数に変えるプログラムを作りたいんですが、コンパイルは問題なくできるんですが、実行するとエラーが出て終了してしまいます。 何がいけないんでしょうか? なんど読み返してもさっぱりわからんとです・・・ #include <stdio.h> int main(void) { int binary[10]; int a,b,t,i; printf("a:"); scanf("%d",&a); printf("b:"); scanf("%d",&b); t = a + b; for(i=0;i<10;i++) binary[i]=0; while(t >= 0){ binary[i] = t % 2; i--; t = t / 2; } for(i=0;i<10;i++) printf("%d",binary[i]); printf("\n"); return 0; }
while(t>=0)
最初のforループを抜けた時の i の値は10
だから、最初にいきなりbinary[10] にアクセスしてる
あと
>>629 の部分で無限ループ
632 :
624 :2007/06/07(木) 17:11:36
皆さん、ありがとうございます、うーん難しいです どうして2^(10n)、2の階上が(10n)なのでしょうか? 実際は10×10…でなく、2×2…なんでしょうか? だとしたら、どうして10の〜上と書いてあるのですかね?
階乗じゃねえだろ
コンピュータは二進数がベースだから。人間に分かりやすいとか関係ないの。 2^0=1 2^1=2 2^2=4 2^3=8 2^4=16 2^5=32 2^6=64 2^7=128 2^8=256 2^9=512 2^10=1024 2^12=4096 2^16=65536 2^24=16777216 2^31=2147483648 2^32=4294967296 2^64=18446744073709551616 はコンピュータ・プログラミングの世界でよく出てくるから暗記しとけ。
まあ1024はたまたま2進数の1024と10進数の1000が近かったから そのままキロで使ってるだけだけどね。
636 :
628 :2007/06/07(木) 17:18:01
本当だ、ありがとうございます 最初のForループを for(i=0;i<=9;i++) binary[i]=0; に変更しました。これでi=9になりますね あとよくわからないのが while(t>=0) がなんで無限ループに入っちゃうんでしょうか? while(t >= 0){ binary[i] = t % 2; i--; t = t / 2; } で、例えばt=6の場合は t = t / 2; により 6 → 3 → 1 → 0 で4ループで終わりというふうに考えてたんですけど 何故か無限ループ・・・ while(t!=0) にしたら直りましたけど
>>637 あ、そうか(汗
すみませんでした
恥ずかしい
0以下にはならないんですよね
ややっこしい
>636 forループが終了するのはi<=9を満たさないとき、つまりi=10になったときだからなんにも変わってないぞ。
>>639 本当だ・・・
for(i=0;i<=9;i++)
binary[i-1]=0;
に変更
難しいなあ
binary[i] = t % 2; で常に代入する while 抜けた後の i は、次に判断するであろう場所を指す だから全体を 0 で初期化しなくてもなんとかなりそうだとは思う
あ、違うわ i=9にしないと駄目か 全然だめだ
>>624 自分でも「K」と大文字で書いているじゃないか。
それは「killo (×1000)」ではない。
二進接頭辞も使ってあげてください
intならbinary[10]じゃ全然足りなくね? #include <stdio.h> int main(void) { int binary[32] = {0}; int a,b,t,i; printf("a:"); scanf("%d",&a); printf("b:"); scanf("%d",&b); t = a + b; i=0; while(t){ binary[i++] = t % 2; t = t / 2; } while(i--) printf("%d", binary[i]); printf("\n"); return 0; }
a+b<0 のときに変な出力されるけどね
648 :
1/2 :2007/06/07(木) 18:47:27
#include <stdio.h> #define BITDEPTH 32 #define MSB BITDEPTH-1 #define LSB 0 #define SIGN_BIT MSB // 10進数の整数を0と1が入る配列に変換 void dec2bin(int dec, int bin[BITDEPTH]) { unsigned int i; // 符号ビットの判定 if (dec < 0) { bin[SIGN_BIT] = 1; dec *= -1; } else bin[SIGN_BIT] = 0; // 符号ビットの前から最下位ビットまで探査 for (i = MSB-1; i > LSB; --i) { if (dec & (2 << (i-1) )) bin[i] = 1; else bin[i] = 0; } // 最下位ビットを判定 if (dec & 1) bin[LSB] = 1; else bin[LSB] = 0; }
649 :
2/2 :2007/06/07(木) 18:48:13
// 変換した二進数を表す配列を文字列にして表示 void out_bin(int bin[BITDEPTH]) { char str[BITDEPTH + 1]; unsigned int i; // 文字列を作る for (i = 0; i < BITDEPTH; ++i) { if (bin[MSB -i] != 0) str[i] = '1'; else str[i] = '0'; } str[BITDEPTH] = '\0'; printf("bin:%s", str); } int main() { int bin[BITDEPTH]; dec2bin(-100, bin); out_bin(bin); return 0; } 駄目出しお願いします
650 :
デフォルトの名無しさん :2007/06/07(木) 19:18:20
>>648 (>628とかもだ)
printfを随所に置く(必要なら1行毎にでも)とかデバッガを使うとかで、
変数の値の変化や処理の流れが自分の思っている通りなのかを確認しましょう。
これを「デバッグ」と言います。
デバッグなしでプログラム作るなんて不可能だよ。
こういうことって、初心者向けの本やサイトに書いてないものなの??
書いてなくても自然に思い付くな
>>650 デバッガは一応VSのを使ってます
一発目だとエラーでたり変な値出たりして大変だったので
ウォッチ式や変数ビューア、エディットコンティニューとか使って何とか書き直しました
これら無しじゃ多分完成してません
最初は
>>652 出力方法を変えたい時や、IDEの機能を使ってのデバッグの簡単化の為に別関数にしただけです
そういう意図で分けるのってよくないんでしょうか?
>>653 ん、まあ別にいいとは思うけど。
符号ビットをわざわざ処理してるのは、
負の値が2の補数形式でない場合でも、
2の補数形式として出力するようにするため?
あと、
if (dec & (2 << (i-1) )) bin[i] = 1;
は
if (dec & (1 << i)) bin[i] = 1;
にしない理由はあるの?
あと出力時に文字列を生成してから出力してるけど、
putchar で随時出力しないのはデバッガ云々のため?
>>654 >符号ビットをわざわざ処理してるのは
符号と、絶対値に問題を分けたかったからです
あと2の補数形式による表現を忘れたのも原因です(汗
>if (dec & (2 << (i-1) )) bin[i] = 1;
>if (dec & (1 << i)) bin[i] = 1;
これは完璧に思いつきませんでした
どうにか-1を消す方法が無いかと考えたんですが、
結局思いつかなくてそのままにしてました
>putchar で随時出力しないのはデバッガ云々のため?
これも切り分けですかね
一緒に考えるのも変わらない気がするんですが
個人的に分けて考える方がやりやすいんで、その癖です
そういや
>>648 とした場合は、
逆に2の補数形式「じゃない」方の形式になるんだったわ。
間違えたっす。
if 文の条件には、ちゃんと条件式を書いた方がいい、と俺は思う。 if ((dec & (1 << i)) != 0) みたいに。 ま、文法上は問題ないんだけどね。 まあ、それ以前に bin[i] = ((dec & (1 << i)) != 0); とすれば if 文要らないんだけど。
短いプログラムならデバッガ使うまでもなく脳内トレースで十分なんだが。
脳内トレースができるなら、そもそもこんなとこで質問なんかしないだろ。
660 :
デフォルトの名無しさん :2007/06/07(木) 23:51:03
自作関数について質問なんですが 文法は 型 自作関数名(型 変数名 、型 変数名) となってますが、自作に渡す仮引数が一つしかない場合は 型 自作関数名(型 変数名) でもかまわないんでしょうか?
かまわん
三つなら 型 自作関数名(型 変数名, 型 変数名, 型 変数名) だぞ
ここで訊く前にコンパイルしてみようという発想はないのかね?
作ってからダメと言われたら無駄になると思ったんで・・・ 例題1 #include <stdio.h> main(void) { float fahr,celsius; int lower,upper,step; lower = 0; upper = 300; step = 20; fahr = lower; printf("華氏 \t 摂氏\n"); while(fahr <= upper){ celsius = (5.0/9.0) * (fahr-32.0); printf("%3.0f\t%6.1f\n",fahr,celsius); fahr = fahr + step; } return 0; } 例題1を自作関数を使って計算させろという問題なんですが 下に続く
>作ってからダメと言われたら無駄になると思ったんで・・・ こういう考えじゃ上達しないよ。 ダメと言われてもいいからとりあえずやってみる。 それが上達への近道。
試作って言葉を知らんのか? 適当な関数作って、試してみればよかろう。 void test1( int a, int b) { puts("test1"); } void test2( int a) { puts("test2"); } これを書くのと、ココに書き込むの。どっちが早い? (慣れてないと、こっちのほうが早いのかな?)
#include <stdio.h> float conve(int m); main(void) { int i; printf(" 華氏\t 摂氏\n"); for(i=0;i<=300;i+=20){ printf(" %3d\t%6.1f\n",i,conve(i)); } return 0; } float conve(int fahr) { float celsius; celsius = (5.0/9.0)*(fahr-32.0); return celsius; } こんな感じOKでしょうか? 何か変更した方がいい点とかあったら教えてください とりあえず授業では初歩的な部分しか習ってません For While Swhitch If 一次配列 くらいです
>>665 >>666 そうですね
まだ自作関数の理解が不十分だったんで聞いちゃいました
でももうなんとなく理解できました
アドバイス。 つ【Swhitch】のすp(ry プロトタイプ宣言と実体の引数の名前が違う。混乱の元になるのであわせたほうがベター mainにint型を返すことを明確に示しましょう。 隅をつつこうと思えば、まだまだあるけど今はこんなもん?
>>669 switch ですね・・・修正
>プロトタイプ宣言と実体の引数の名前が違う。混乱の元になるのであわせたほうがベター
参考書では別の名前を使っていたので別にしないといけないものだと思ってました
たしかに混乱しますね
名前は同じに修正しました
隅をつつくと何がでてくるのかちょっと気になりますね・・・
>参考書では別の名前を使っていたので別にしないといけないものだと思ってました 何て本だか気になる。
ぱっと見だけど、 float conve(int fahr)は float fahr_to_celsius(float fahr) { return (5.0/9.0)*(fahr-32.0); } かな。 関数名を処理内容に沿った名前へ。 結果がfloatなので仮引数もfloat型に。
>>671 プログラミング言語C K&R です
>>672 どうもです、ちょっと修正して見やすくしてみました
#include <stdio.h>
#define lower 0 /* 華氏の下限 */
#define step 20 /* きざみ */
#define upper 300 /* 華氏の上限 */
float conve(float fahr);
int main(void)
{
float f; /* 華氏 */
f = lower;
printf(" 華氏\t 摂氏\n");
while(f<=upper){
printf(" %3.0f\t%6.1f\n",f,conve(f));
f+=step;
}
return 0;
}
float conve(float fahr)
{
float celsius;/* 摂氏 */
celsius = (5.0/9.0)*(fahr-32.0);
return celsius;
}
>>673 向上心すごいね、プログラム楽しい?がんばってね。
defineは大文字にしたほうがいいかな?
このばあい、whileよりfor文が良いかと。 for (f = lower; f <= upper; f += step)
この例題を見るたびに、華氏だと日本人には馴染みが薄くて、初学者向きじゃねーなと思う。
飛行機乗ったときに外気温が英語で表示されたときくらいだなー、見るの
> while(f<=upper){ > for (f = lower; f <= upper; f += step) 諸兄ら、floatの比較演算はどう思う? 俺は、この場合はintにすべきだと思うのだが。 (f==upperのときループが実行されるのを期待してるので) で、こう? conve((float)i)
>>678 浮動小数に加算するとそもそも誤差がでるから避けるのが無難だが
まぁこの程度なら別にいいと思うがな
680 :
デフォルトの名無しさん :2007/06/08(金) 03:58:21
3行3列の行列の各要素を入力ファイルから読み込み、出力ファイルに書きこんで出力せよ。って宿題が全くできません。誰か教えてください。
>>678 ループ回数を確実に制御しなければならない場合はintで回すね。
比較演算子に不等号が入っているならそんなに心配せんでも医院で内科医。
>floatの比較演算 詳しく知らないけど、浮動小数点の加算の誤差は 必ず実際の数より小さくなるんだっけ? 指数の展開の仕方に寄るんだろうけど 個人的には300Kの値が表示されない時がありそうで怖い。
>>683 必ずかどうかは知らないけれど、大きくなることは少ないとは思う。
まぁ、整数でループ制御するべきだね。
685 :
684 :2007/06/08(金) 12:20:44
訂正。 この場合は条件自体がすべて整数だから、実数でも問題はない。 つまり、(精度が間に合う範囲であれば)整数同士の加算を実数で行なっても誤差は出ない。 具体的には、800万辺りまでは問題がない。
>>685 甘いな。仮数部は23ビットだが最上位の1は省略されるから、実質24ビットの精度がある。
だから16777216と16777215はきちんと区別できる。16777215+1が16777216になるかはしらね。
16777215+1は16777216になるが、 16777216+1は16777216のままだな。 まあ、当たり前の話だが。
688 :
デフォルトの名無しさん :2007/06/08(金) 15:23:42
Visual Studio 2005を使ってプログラミングをしています。 とりあえずプログラムを実行すると、“続行するには何かキーを押してください . . .” という表示が出て、何かキーを押すと終了するようになっています。 しかし、出来た実行ファイル(.exe)を実行すると一瞬コンソール画面が表示されて “続行す(ry”が表示されずに終わってしまいます。 実行ファイルでも同じような動作をさせたいのですが、どのようにすればいいのでしょうか? プログラム終了直前でscanfで何かを入力待ちにするのもいいのですが、この場合何かキーボードを 押しただけでは終了しませんし、何も入力せずにEnterキーを押しただけでは終了しません。 何かいい方法はないでしょうか?
gets
#include <windows.h> if(IsDebuggerPresent()) getch(); しとけ それかCtrl+F5
cmd.exe /k というショートカットをSendToに入れておいて渡す
この質問、毎週2,3回見るんだけどなんとかならんのかw
694 :
デフォルトの名無しさん :2007/06/08(金) 15:36:59
>>689-691 ありがとうございます。しかし、Enterキー以外のものを押された時は
その後Enterキーを押さないと処理が終わらないようですね・・・。
>>688 >“続行するには何かキーを押してください . . .”という表示が出て
実はこの時点でもうあなたが書いたプログラムは実行し終わった後なんですよ。
“続行す(ry”というのは、pauseというコマンドプロンプト(cmd.exe)の組み込みコマンドです。
適当なバッチファイルを作って、あなたが書いたプログラムを実行した後pauseをすれば
同じような動作になります。
というか、コマンドプロンプトを起動してその上であなたが書いたプログラムを実行すれば、
たぶんそれがあなたが望む状態なんじゃないかと思います。
696 :
デフォルトの名無しさん :2007/06/08(金) 15:59:00
>>695 なるほどです。system("pause")ってやってみたら、目的の動作をしました。
ありがとうございます。
だいたいCUIのプログラムをダブルクリックで実行するなと。 コマンドプロンプトで実行するものだよ。
698 :
デフォルトの名無しさん :2007/06/08(金) 19:39:48
実行結果を 0 2 4 6 8 10 としたいのですが #include <stdio.h> int main( void ) { int i; int vc[6]={0,2,4,6,8,10}; for (i=5;i>=0;i--){ /*表示*/ printf("%d", data[i]); } putchar('\n'); return(0); } でやると8行目が 'data' : 定義されていない識別子です 配列または、ポインタでない変数に添字が使われました。 と表示されるのですが何がいけないんでしょうか?
>int vc[6]={0,2,4,6,8,10}; >for (i=5;i>=0;i--){ /*表示*/ >printf("%d", data[i]); 素で理解できてない? 単に呆け? それとも釣り?
>>698 data[i]
はどこにある?
あと表示が 0 2 4 6 8 10 なのになぜ逆順で?
>>699 答:理解する気がまったくない。
なぜなら宿題の回答さえ得られれば良いから。
702 :
デフォルトの名無しさん :2007/06/08(金) 19:55:23
きっと今日からC言語を始めたんだよ。 data[i]をvc[i]に変えたらいいんだよ。 あと、for(i=5;i>=0;i--)をfor(i=0; i<6; i++)にした方が目的の結果が得られるかもしれない。 きちんとfor文が何をやっているのか、変数の定義と使い方を理解した方がいいと思うよ。
おまいらやさしいなw
704 :
デフォルトの名無しさん :2007/06/08(金) 21:17:07
>>702 ありがとうございます
あとあと、
要素型がdouble型であり4個の要素をもつ配列vzを用意して、順番にキーボードから値を読み込み、その後、その内容を表示するプログラムを作成しなさい(表示は8桁、小数点以下2表示)
実行結果例
vz[0]=1,3
vz[1]=2,5
vz[2]=6,1
vz[3]=8,2
------------------------
vz[0]= 1,3
vz[1]= 2,50
vz[2]= 6,10
vz[3]= 8,20
にしたいんですがどうやればいいんでしょうか?
宿題スレにいけよ
教育担当がかわいそうだな 仕事で必要だから教えようとしているのに 自分で考えようとしない 会社には、ごくつぶしなんか雇う余裕は無いのに… 足を引っ張るだけの要員なんて不必要
>>704 言いたかないが、自分で克服してこそ身につく。
あまりにも質問が酷すぎ。
こんな奴をちゃんと入社試験やら面接やらで落とさない会社も悪い。 勿論一番悪いのは704だが。
社員なの?
社員乙
shi ne
データを入力→データベースとして保持→xを入力→それがデータベースに含まれているかを 判定するプログラムを 作ってるのですがelse文がif文と一致しないというエラーが出てしまいます なぜですか? #include<stdio.h> int main(void) { int a[99]; int n,i,x; printf("n?"); scanf("%d",&n); printf("data?"); for(i=0;i<n;i++){ scanf("%d",&a[99]); } printf("x?"); scanf("%d",&x); {for(i=0;i<n;i++){ if(x==a[99])break; } printf("データベースに含まれている\n");} else printf("含まれていない"); return(0); }
どこから突っ込んでいいかわからんほどひどいな。
>>712 インデントが消えちゃって分かりにくいけど、とりあえず君のソースはこうなってる。
#include<stdio.h>
int main(void) {
for(i=0;i<n;i++){
}
{
for(i=0;i<n;i++){
if(x==a[99]) break;
}
else printf("含まれていない");
}
>>715 分かりやすいサイト紹介してくれてサンキュ!
malloc関数に関する質問です。 #include <stdlib.h> #include <stdio.h> struct st { int a; }; void func(struct st* b) { b = (struct st*)malloc(sizeof(struct st*)); printf("2.func:%p\n",b); // free(b); } void main(void) { struct st* a = NULL; printf("1.main:%p\n",a); func(a); printf("3.main:%p\n",a); } を実行すると 1.main:00000000 2.func:00431EA0 3.main:00000000 Press any key to continue と出力されます。次の出力 1.main:00000000 2.func:00431EA0 3.main:00431EA0 Press any key to continue を期待していたのですが、うまくいきません。何が原因でしょうか?
718 :
717 :2007/06/09(土) 00:01:27
インデント入れ直しました。 malloc関数に関する質問です。 #include <stdlib.h> #include <stdio.h> struct st { int a; }; void func(struct st* b) { b = (struct st*)malloc(sizeof(struct st*)); printf("2.func:%p\n",b); // free(b); } void main(void) { struct st* a = NULL; printf("1.main:%p\n",a); func(a); printf("3.main:%p\n",a); } を実行すると 1.main:00000000 2.func:00431EA0 3.main:00000000 Press any key to continue と出力されます。次の出力 1.main:00000000 2.func:00431EA0 3.main:00431EA0 Press any key to continue を期待していたのですが、うまくいきません。何が原因でしょうか?
720 :
716 :2007/06/09(土) 00:02:52
tabが入らないorz スレ汚してスマソ
#include <stdio.h> void f(int x) { x = 5; } int main() { int i; f(i); printf("%d\n", i); return 0; } これで5が出力されないのと同じ理由。 このコードでxをintへのポインタ型にすればいいように、 718のfuncのbも、struct st*へのポインタ型にすればいい。
>>717-718 void func(struct st** b) {
*b = (struct st*)malloc(sizeof(struct st*));
printf("2.func:%p\n",*b);
// free(b);
}
void main(void) {
struct st* a = NULL;
printf("1.main:%p\n",a);
func(&a);
printf("3.main:%p\n",a);
}
こんな感じじゃないかな?
>>718 君がやっているのはこれと同じ
これのポインタ版ってだけ
void func(int b)
{
b=10;
}
int main(void)
{
int a=0;
printf("%d\n",a);
func(a);
printf("%d\n",a);
return 0;
}
ポインタのアドレスを渡さなきゃダメ
int a = 10; int *b = &a; //関数へ引数を渡すのと同じ b = (int*)20; //bを直接触ってもaが変わるはずも無い。
>719 - 723 早いレスありがとう!言われてい見れば確かに721さんや723さんの言うとおりだ。
楽しい楽しいポインターぁ♪
727 :
712 :2007/06/09(土) 02:01:27
712の続きです。あれからいろいろと格闘しまして、少し進んだのですが とまってしまったのでヒントください。先ほどの問題をxとの差の絶対値が 最小のものだけを出力させるという方法でプログラムするのですが その方法がわかりません。すべて出力させてしまいます。どうすればええのでしょう? #include<stdio.h> int main(void) { int a[99]; int n,i,x,c; printf("n?"); scanf("%d",&n); printf("data?"); for(i=0;i<n;i++){ scanf("%d",&a[i]); } printf("x?"); scanf("%d",&x); for(i=0;i<n;i++){ c=x-a[i]; if(c>=0)printf("%d\n",c); else if(c<0)printf("%d\n",-c); } return(0); }
728 :
デフォルトの名無しさん :2007/06/09(土) 02:50:40
実行ファイルのアイコンを変更したいのですが、256色が最高なのでしょうか? 綺麗なアイコンをBitmapで作成し、それをリソースのアイコンに貼り付けたら 色が制限され、またところどころが微妙に透過されてしょぼくなってしまいます。 一般のフリーソフトのアイコンなどは綺麗な色になってるのですが、どのようにしているのでしょうか? 一応開発環境はVisual Studio 2005でC言語を使用しています。
普通はまず大きい画像で作ってから小さく変換してる
730 :
728 :2007/06/09(土) 04:06:54
>>729 僕の場合はベクターの画像(32*32)のスクリーンショットを取り、それをペイントに貼り付けて、
bmpファイルにして保存し、それをリソースでicoに貼り付けるといった方法をとってます。
一応ドットで描いてるわけではないので、大きい画像で作って小さく変換するのと作業的には
あまり変わらないと思うのですが、どうなのでしょうか?
なんかワロタ
あっ、でも
>>731 だとEnterキーを押さんとあかんね・・・systemなら何でも良いみたいだが。
>>731 それだとエンター押さないと終わらない気が。
個人的にはsystem関数使うぐらいならgetch()のが気持ちが良いかも。
一応windowsでもlinuxでも用意されてるし。
linuxのgetch()はクセあるけど・・・。
んじゃこうしよう。 void bk(void) { printf("続行するにはEnterキーを押してください . . .Enterキーだぞ?ちゃんと押せよ?"); getchar(); }
winならkbhitとか
>>734 Unixだと端末が普通行編集モードになってるから、そこからいじらないとダメ。
>>733 「systemなら」じゃなくてpauseがそういうコマンド。
>>737 > 「systemなら」じゃなくてpauseがそういうコマンド。
知ってるよ、いちいちうぜーんだよ、補足しなくても良いわボケが
739 :
デフォルトの名無しさん :2007/06/09(土) 16:40:00
system("pause"); って括弧と括弧の中を書くのが面倒だから省略しただけだろ 揚げ足取りってうぜーよな、日ごろそういうことで他人の気分を害して 女にも相手にされずにモテねーから、こういう場所ででけぇ面して気分をよくしているんだろうね(プ
なんで必死なんだ? スルーしとけよ
土曜日は出現率高いな
省略しすぎで間違いの域に達してんだよカス
>>737 だからgetchって書いてんじゃん。
cursesかncurses使うのが前提って意味だよ。
言葉足らんかったかな。
>>737 やや、マジでこれは揚げ足取りだな。しかも「だからなに」って感じのまったく意味も無い指摘。これがゆとりってやつか。
746 :
デフォルトの名無しさん :2007/06/09(土) 17:05:44
742 名前:デフォルトの名無しさん 投稿日:2007/06/09(土) 16:44:01 省略しすぎで間違いの域に達してんだよカス 省略しすぎで間違いの域に達してんだよカス 省略しすぎで間違いの域に達してんだよカス 省略しすぎで間違いの域に達してんだよカス 省略しすぎで間違いの域に達してんだよカス 省略しすぎで間違いの域に達してんだよカス 省略しすぎで間違いの域に達してんだよカス ↑こいつ最高にキモメンメガネデヴピッツァw
>>742 ← こういうこと言う奴ってさぁ、突然会話に入り込んできて
それまで会話をしていた人の流れを無視して勝手なことを言うタイプだよな。
んで、相手の機嫌を悪くして「何お前勝手に話しに割り込んできてんだよ?」って
相手から不快感を買って、干されて孤立するタイプなんだよねw
んで、なぜか自分が悪いのに、周りが悪いんだよ!周りが虐めるぅ〜って
被害妄想ぶっこいて最後は自殺しちゃうんだよね。
そもそも、何かキーを押して継続する流れは
>>696 以前で話に出ているから
system("pause");ってのはわかり切っていたこと。systemだけでとは誰も言っていないんだよねぇ。
やだね、早とちりして他人の気分を害する香具師って。
>746 ちょ、なんで決め台詞から入ってんのw
750 :
デフォルトの名無しさん :2007/06/09(土) 17:31:27
>>688 です。僕のした質問のせいでこんな事になってごめんなさい。
あと、
>>728 をよろしくお願いします。
753 :
デフォルトの名無しさん :2007/06/09(土) 17:49:04
一つの自作関数で2つ以上の実引数を返したい場合はどうしたらいいんでしょうか? 例えば簡単なので 1+1 と1+2 の計算を自作関数でやらせてそれぞれの結果をメインに返す場合は どのように書くんですか?
ポインタ渡せばいいだろ
1.構造体を返す 2.答えを格納する変数をポインタで引数として渡す
家のパソコンでC言語を使いたいのですが、どんなソフトがいいでしょうか? 学校ではemacsを使っているのでmeadowあたりに目をつけているのですが・・・ 何かオススメのものがあったらお願いします
>>753 それは引数ではなく返り血(ギャアッ!
学校の環境がLinuxならcygwin入れたらemacs, gcc, make等々学校と同じ環境になるよ。
あえてココでVMWareを勧めてみる。
スペックががが…
>>751 ありがとうございます。IcoFx落としてみました。
ちょっといじったのですがなんとか出来そうなのでがんばってみます。
764 :
デフォルトの名無しさん :2007/06/09(土) 23:46:22
質問です。 現在学校の課題で、リスト構造に関する問題が出題されています。 この問題というのが、既存のリスト構造に新たなノードの生成、追加及び削除等の操作を行う、というものです。 「ノードの生成、追加及び削除等の操作」に関してはなんとかなりそうなんですが、「既存のリスト構造」を構築する手順(表記方法)がイマイチ分かりません・・・。 プログラムリストにそれらのリスト構造を記述する表記方法を教えていただけませんか? ちなみに、リスト構造のメンバは、学籍番号、学年、名前の3つです。
リスト構造を定義せずに、どうやって生成・追加・削除の実装が出来るんだろう…
>「既存のリスト構造」を構築する手順(表記方法)がイマイチ分かりません・・・。 手順はアルゴリズムかなと想像できるけど、(表記方法)がつくとよくわからんね。 フローチャートでも書いてほしいのだろうか。
生成と追加ができれば構築できるだろ
768 :
デフォルトの名無しさん :2007/06/10(日) 00:25:59
すいません、補足します。 僕の言う「ノードの生成」は、ノードの作成を求めるアルゴリズムを作成することができる(実際は自信ないですが・・・)という意味であって、プログラムの実行開始と同時にノードを作成するということです。 しかし、プログラムリストを作成する段階でそういったリスト構造を記述する方法が未だに分かりません。 よかったらどなたかアドバイスをいただけませんか? たとえば↓のようなものです。 struct student{ char id[20]; char name[20]; int gakunen; }seito={"20000403","Yojigen Taro",1}; この例だと先頭のノードしか作成することができないように思ったんですが、このようなノードを複数個作成したいと考えています。
student seito[] = { {"20000403","Yojigen Taro",1}, {"20000403","Yojigen Taro",1}, {"20000403","Yojigen Taro",1}, {"20000403","Yojigen Taro",1}, {"20000403","Yojigen Taro",1}, }; こういうこと?
770 :
デフォルトの名無しさん :2007/06/10(日) 00:35:43
ありがとうございます。やってみます!
771 :
デフォルトの名無しさん :2007/06/10(日) 01:14:05
1|#include <stdio.h> 2|#include <stdlib.h> 3| 4|struct student 5|{ 6| int id[20]; 7| int gakunen; 8| char name[20]; 9| struct student *next; 10|} 11|struct student seito; 12|student seito[] = { 13| { 7,3,"hukuda "}, 14| {13,3,"kataoka "}, 15| {18,5,"sato "}, 16| { 2,1,"toyoshima"}, 17| {14,4,"tanikawa "}, 18| }; ・ ・ ・ ・ というプログラムを作成し、実行したところ、 ”エラー E2349 kadai.c 12:宣言の構文エラー” が表示されました。やはり間違いがあるんでしょうか? どなたか教えていただけませんか?
structが足りない ついでに上の宣言と変数名がかぶってる
9| struct student *next; 10|} 11|struct student seito; この辺が変だとおもわないかい? 他に何の言語使えるかしらんけどさ、 Cはsyntaxなエラーを出すとき、発生点を通り過ぎて出てくる 行数が出たら、そこから上を探すと、変なところを見つけやすい
>773 エラーメッセージから考えるとそこは;のコピペし忘れだと思うけど。
775 :
デフォルトの名無しさん :2007/06/10(日) 01:32:35
みなさんの指示を受けて、以下のように訂正してみました。 1|#include <stdio.h> 2|#include <stdlib.h> 3| 4|struct student 5|{ 6| int id[20]; 7| int gakunen; 8| char name[20]; 9| struct student *next; 10|}; 11|struct student seito[] = { 12| { 7,3,"hukuda "}, 13| {13,3,"kataoka "}, 14| {18,5,"sato "}, 15| { 2,1,"toyoshima"}, 16| {14,4,"tanikawa "}, 17| }; ・ ・ ・ ・ しかし、今度は12〜16行目において”移植性のないポインタ変換”とのエラーが表示されました。 ポインタ変換・・・って何ですか?で、どう訂正していけばいいでしょうか? ご迷惑おかけします・・・。
idにおいてint型配列に対してint型をぶち込んでいるから そもそも、idは配列である必要はあるのかい?
IDは配列の必要があるのか?
{ intの配列 int charの配列 構造体へのポインタ } に対して { 7 3 "hukuda " } { 13 3 "kataoka " } : ってもうどんだけ〜
779 :
デフォルトの名無しさん :2007/06/10(日) 01:41:14
>776さん >777さん すいません、勝手に余計なことしてたみたいです!^^; どうにかエラーも消えました! 今後も質問などさせていただくかもしれないのでみなさんにも迷惑かけるかもしれませんがよろしくお願いします。 ありがとうございました^^
780 :
デフォルトの名無しさん :2007/06/10(日) 01:41:57
>778さんも!
うどんだけ〜
782 :
782 :2007/06/10(日) 14:17:01
他のアプリが「落ちている」かどうかをチェックするプログラムを作りたいのですが、 どうしたら良いのでしょうか? 具体的に言うと↓ 「問題が発生したため、xHibernate.exe を終了します。 ご不便をおかけして申し訳ありません。」 こういった感じのメッセージが出ているアプリを検出したいです。 ちなみに、その「落ちている」方のアプリは自分で作った訳ではないので手を入れれません。 よろしくお願いいたします。
784 :
782 :2007/06/10(日) 14:45:55
>>783 返信ありがとうございます。
この方法だと、無理っぽいですね。
「問題が発生したため、xHibernate.exe を終了します。 ご不便をおかけして申し訳ありません。」
このメッセージが出ている間は、xHibernate.exeは存在していることになっているみたいです。
エラー報告を送信する、送信しないで、「送信しない」を選んで初めて、ウインドウが消えるみたいですね。
「問題が発生したため、xHibernate.exe を終了します。 ご不便をおかけして申し訳ありません。」
このメッセージが出ている時も「落ちている」と判断したいです。
落ちている、の定義は?
スレ違い
787 :
782 :2007/06/10(日) 14:55:50
>>785 「問題が発生したため、xHibernate.exe を終了します。 ご不便をおかけして申し訳ありません。」
↑このメッセージが出ている時か、そもそもそのプロセスが存在してない時ですね。
プロセスが存在していないのを検出するだけだったらFindWindowで出来たのですが、
FindWindowだと、
「問題が発生したため、xHibernate.exe を終了します。 ご不便をおかけして申し訳ありません。」
このメッセージが出ている時も反応してしまうので・・・。
テンプレ化されていない俺ルール振りかざすなドアフォ
適当に言ってみると カーネルモードとかじゃないと無理じゃね
「問題が発生(ry」のWindowを検索すればいいんでね?
792 :
デフォルトの名無しさん :2007/06/10(日) 16:56:06
#include<stdio.h> int main() { int kinsyu[]={10000,5000,2000,1000,500,100,50,10,5,1}; int zankin,i,mai; i=0; printf("給料を入力してください。:"); scanf("%d",&zankin); while(i<10){ mai=zankin/kinsyu[i]; zankin=zankin%kinsyu[i]; printf("%s円が%d枚\n",kinsyu[i],mai); i=i+1; } return 0; } なんですが、コンパイルはうまく いきますが、実行してデータ入力すると エラーが起こります。 私のソースが問題なのか 他に問題なのかのご指摘をお願いします。 初心者すぎてくだらない質問すいません。
%s → %d
"%s円が..." kinsyu[i] ってw
795 :
792 :2007/06/10(日) 17:07:08
>>793 さん
>>794 さん
ご指摘ありがとうございます。
恥ずかしいです。
何故か、配列は%sでと勘違いしていました。
どうもありがとうございました。
文字列は%sでね^^
問題が解けません・・・。誰か@から教えてください キーボードから入力された10進数を、2進数として出力するプログラムをつくりなさい。 2進数への変換は、商が0になるまで10進数を2で割りl、あまりを逆の順番で並べる方法を用いる。 ただし、入力は正の整数であって最大値は16838とする。
>>797 例、5を二進化
5 % 2 = 1
5 / 2 = 2
2 % 2 = 0
2 / 2 = 1
1 % 2 = 1
A. 101
――――
>>782 それは要するにSEHで応対するハンドラが現れなかった状態だから
デバッガとしてプロセスにアタッチすればそういうこともWindowsから伝わってくると思う
801 :
デフォルトの名無しさん :2007/06/10(日) 21:33:20
今度引き継いだCのプログラムが分からないです。 なんか他の言語で言うところのオーバーロードっぽいこと やってるんですよ。 引数渡して関数呼んでんですけと、その引数が関数ポインタなんですね。 で、行った先の関数が、名前が同じでいろんな種類の関数ポインタを引数に とりそうな見てくれしてんです。 int func_one(int a){ return a; } int func_two(int a,int b){ return a+b; } int func(int (*abc)(int,)){ return abc(100); } int func(int (*abc)(int,int)){ return abc(100,200); } int main(){ int one,two; one=func(func_one); two=func(func_two); printf("one=%d two=%d\n,one,two); return 0; } こんな感じ。 すいません、アドバイスください。教本みたいなのないでしょうか?
CではなくC++使っているとしか思えない
> int func(int (*abc)(int,)){ > return abc(100); > } > int func(int (*abc)(int,int)){ > return abc(100,200); > } これ、Cだとコンパイラに怒られると思うんだけど... 元の通り?
>>801 これCのプログラム?
int func(int (*abc)(int,)){
ってのと
int func(int (*abc)(int,int)){
って同じ名前でエラーじゃん!
>>801 「こんな感じ」では今のコンピュータはいうこと聞いてくれないぞ
>>801 「アドバイスください」って具体的に何のアドバイスを求めてるんだ?
808 :
801 :2007/06/10(日) 21:47:55
レスくれたみなさんごめんなさい! makefileみたらg++でコンパイルしてました。 本当にごめんなさい!!!
>>808 何を持ってCのプログラムだと思ったのか、小一時間(ry
810 :
デフォルトの名無しさん :2007/06/10(日) 22:48:41
初心者です。質問です。2次元配列の受け渡しの仕方がよく分からないんですが、 別の関数でいろいろ値を格納した2次元配列を、構造体のなかに保存して、 他の関数でもその2次元配列を使えるようにしたいんです。 typedef struct INFO{ int iw,ih; int **gazou; ←←ココ } Info; int main(void) { Info pi; kakunou(*pi); //ここらへんでいろいろ構造体の2次元配列を //表示したり値を変えたりしたい。 return 0; } void kakunou(PNMInfo pi) { int g[pi.ih][pi.iw]; //ここらへんでgにいろいろ値を代入する *pi.gazou = &g; ←←ココ } 「←←ココ」と書いた行の2箇所をどのように書けばうまく値を受け渡すことができるんでしょうか? (上記のはわかんないのでテキトーに書いてます) 二次元配列の時、ポインタをどういうふうに使えばいいかよく分からないんです。 よろしくお願いします。
>>810 ごめん。
全体的におかしくて、何をどういったら良いのか分からない。
とりあえず、無理に2次元配列使おうとするより
malloc()使って1次元配列で何とかする方が良いと思うよ。
812 :
810 :2007/06/10(日) 23:23:16
そうですか・・・。 とりあえず2次元配列は使いたいんですよね・・・。 で、その2次元配列を関数とか構造体と受け渡すことをしたいんです。
>>812 とりあえず動的なサイズの2次元配列を宣言することは出来ない。
それでも2次元配列的な使い方をしたいなら考えてみるけど。
>>812 おとなしく、仮想二次元で一次元配列を使うのがいいよ。
二次元配列風アクセスはできるけど、その手間よりも仮想二次元のほうが楽だし。
>>814 810ではないけど、「仮想二次元」て何?
C++ で演算子オーバーロード使えば
仮想二次元でかつ二次元配列風にアクセスできるようにはできるね。
どうしても C でやりたいというなら、
何かアクセス用の関数を作ったらいい。
>>815 int n[5 * 10];
int i, j;
for(i = 0; i < 5; i++)
for(j = 0; j < 10; j++)
n[i * 10 + j] = i + j;
みたいなの。
そもそも配列とポインタを同じものとして考えるから詰まるんじゃね? 始めの概念を理解するとかのあたりならそれでもいいかもしれないけど
>>816 そういう奴か。
ありがとう。
俺なりに解釈したら、こういう意味かと思った。
void kakunou(Info *pi)
{
int i,j;
pi->buf = (int *)malloc(sizeof(int) * pi->ih * pi->iw); // 画像のバッファを入れるところ
pi->gazou = (int **)malloc(sizeof(int *) * pi->ih); // 2次元的アクセスのためのポインタの配列
for(i = 0;i < pi->ih;i++){
pi->gazou[i] = &pi->buf[pi->iw * i];
}
// ココまで2次元配列の作成
for(i=0;i<pi->ih;i++){
for(j=0;j<pi->iw;j++){
pi->gazou[i][j] = i*j;
}
}
}
連投失礼。
>>818 の上にあるコードも
>>810 向けに書いとこう。
#include <stdio.h>
#include <stdlib.h>
typedef struct INFO{
int iw,ih;
int **gazou; //←←ココ
int *buf;
} Info;
void kakunou(Info *pi);
void kaihou(Info *pi);
int main(void)
{
Info pi;
int i,j;
pi.iw = 10;
pi.ih = 5;
//kakunou(*pi); // ← 間違い
kakunou(&pi);
//ここらへんでいろいろ構造体の2次元配列を
//表示したり値を変えたりしたい。
for(i=0;i<pi.ih;i++){
for(j=0;j<pi.iw;j++){
printf("%3d", pi.gazou[i][j]);
}
printf("\n");
}
kaihou(&pi);
return 0;
}
820 :
デフォルトの名無しさん :2007/06/10(日) 23:59:11
cで数学の√にあたる計算式、もしくは記号ってありますか? 素数を調べるのにルートが必要なんです
821 :
デフォルトの名無しさん :2007/06/11(月) 00:01:07
>>820 math.hを読み込んでsqrt。
コンパイル(ていうかリンクだが)の時に、-lmオプション。
>>820 素数を調べるのに、一般的に√は使う必要ないがな。
>>821 ありがとうございます
でも、<stdio.h>規制があるんです
>>822 入力した整数nが素数かどうかを判定する課題なんです
√n を 2〜n-1 で割っていくプログラムなら処理が早いと思ったんで
割る数の自乗が n 以下になるようにすれば、 別に sqrt なんて要らない。
ループ内で毎回掛け算するのは、いまどきの環境では気にしないのかね。
するほどのものじゃないね。
昔からね
ルートを求める時の計算量とループの中で二乗することの計算量ってそんなに違うか?
ルートが1回なのと、二乗がループ毎にだったら違うだろうね。 んなもん、ローカルの中にループの外で入れれば同じだけど。
√は一回でいい。 でも、かけ算は毎回。 ということだろう。
ルート一回の計算と掛け算一回を同列にすんなよw
じゃーどっちが計算量多いの?
でも、この場合厳密な平方根はいらないよな。
どっちが計算量多いかなんてsqrtの実装とか最適化とかのレベルじゃね? CPUの命令も関わってくるだろうし。ってかそこまで気にするほどのもんじゃないと思う。
ちょっと面白い課題かも。 できるだけ計算量の少ない方法で、与えられた N の平方根の整数部を求めよ。
エラトステネスのふるいを使うなら、普通は素数票作りながらチェックしていくだろ? 前回のループで判定に使った素数まではチェックなしで判定に使用して、 それ以降の部分だけかけ算使ったチェックをすれば、ほとんどかけ算せずに済む。
837 :
デフォルトの名無しさん :2007/06/11(月) 02:19:50
C言語なんですが for( i = 0 ; getchar(str[i]) != EOF && i < STR_MAX ; i++ ) こんな感じで書くことは出来ないんでしょうか? エラーが出るってことは無理なんですよね 前に何かの参考書でこのような式を見たような気がしたんですけど・・・
>>837 getcharをそこでするか?普通に str[i]!=EOFでええやろ?w
勘違いしてました・・・ for( i = 0 ; str[i] = getchar() != EOF && i < STR_MAX ; i++ ) でした
>>840 まず、演算子の優先順位。
わかんなかったら、調べるか括弧つけろ
>>840 っつか、何がしたいのかさっぱり分からん。getcharは何に使いたいんだ?
入力を受け付けて str に入れたいのか?それとも、str の終端を見つけて
何かfor文で処理したいのか?
まあ初心者のころはfor文に何でも詰め込もうとするわな
844 :
840 :2007/06/11(月) 02:55:13
for( i = 0 ; str[i-1] != EOF && i < STR_MAX ; i++ ) str[i] = getchar(); で配列に文字列を入れたいんですけど、 for( i = 0 ; (str[i] = getchar()) != EOF && i < STR_MAX ; i++ ) と書いた方がコードが短くなるので良いもかと思ってました
wakero!!
そのgetcharの直後に判定入れてbreak;したほうが自然だろう
あと、気がついたかどうか知らんが != は = より優先順位が高いので それじゃあ str[i] = (getchar() != EOF) ということになるよ
そしてその後ろの&&も=より、、(以下略
849 :
840 :2007/06/11(月) 04:03:57
完成した #include <stdio.h> #define STR_MAX 256 #define EOS '\0' int main(void) { char buf,str[STR_MAX]; int i,a; /* 配列に文字列を入力&ENDの判定 */ printf("a〜zのアルファベットを入力して下さい\n"); for( i = 0 ; i < STR_MAX ; i++ ){ str[i] = getchar(); if( str[i] == EOF || str[i] == '\n' ){ str[i] = EOS; break; } } /* アルファベットをソート */ for( i-=1 ; 0 <= i ; i--){ for( a = i -1 ; 0 <= a ; a-- ){ if( str[i] < str[a]){ buf = str[i]; str[i] = str[a]; str[a] = buf; } } } printf("%s\n",str); return 0; }
850 :
デフォルトの名無しさん :2007/06/11(月) 04:14:32
謎がすべて解けた
851 :
デフォルトの名無しさん :2007/06/11(月) 11:36:02
質問です。 char型の配列の先頭アドレスが2の乗数に なっているかどうかは、性能に影響ありますか? 影響あるとしたら、 C言語で charの1次元配列を複数確保するとき、 1番目の配列の長さは2の乗数にしておいた方が よいですか?
>>851 >char型の配列の先頭アドレスが2の乗数に
>なっているかどうかは、性能に影響ありますか?
CPUによる(奇数アドレスへのアクセスが遅くなるCPUはある)
>C言語で charの1次元配列を複数確保するとき、
>1番目の配列の長さは2の乗数にしておいた方が
>よいですか?
コンパイラが勝手にやってくれることが多い
2の乗数ってなんだろう……
854 :
851 :2007/06/11(月) 13:02:33
>>852 ありがとうございました。
>>853 2を何度も掛けた値のことです。
たとえば、2の3乗は、2×2×2=8
2の倍数や4の倍数でないとパフォーマンスが落ちたり、 そもそもアクセスできないプロセッサは普通に存在するが 2のn乗でなければ困るようなプロセッサは見た事がないな。
>>852 2の冪乗なんてアドレスを要求するようなプロセッサはないな。
それだと例えば、32ビットアドレス空間だと30箇所ほどしか高速アクセスできないことになってしまう。
#つーか、「2の乗数」で冪の意味というのは無理がありすぎ。
852も「倍数」と解釈したんだろ。
ただ高速なアルゴリズムでプログラム書こうとすると自動的に 2のべき乗に制限される場合ってない? FFTとか
虚覚えも甚だしいとしかいいようがないが、 それサンプル数の話で、しかも「自動的に」は有り得ない。
互いに素な NxM FFT とかアルゴリズム自体は存在するもんな。 2^N FFTが一番シンプルってのはあるけど。
最も高速にやろうとする場合>自動的に
#define AAA::BBB::CCC XXX これがエラーになってしまうんですが、どうのようにかいたらいいんでしょうか?
エスパー回答 #define XXX AAA::BBB::CCC
そもそも C じゃないし。 あと、名前空間なら namespace XXX = AAA::BBB::CCC; と、 型なら typedef AAA::BBB::CCC XXX; とすべき。 CCC がテンプレートなら仕方がないところあるけど。
865 :
862 :2007/06/11(月) 15:45:15
Cじゃなかったですね。すいません。 しかしどうにかしてソースコード中のAAA::BBB::CCCをXXXに置き換えたいです。 無理でしょうか?
>>865 >Cじゃなかったですね。すいません。
ではさようなら。
XXXが型なら namespace AAA { namespace BBB { typedef ::XXX CCC; } } 名前空間ならnamespace CCC = ::XXX; 関数なら::XXXを呼ぶinline関数 変数ならconst参照で我慢 クラステンプレートなら今は::XXXを継承したクラステンプレートCCCを作ってごまかす
868 :
862 :2007/06/11(月) 16:19:58
話すと長くなるんですが、言語はC++/CLIでInitializeComponentっていう デフォルトでできてくる関数があって、これはデザイナがよむため 変更不可です。読むといってもC++として#defineやtypedefはちゃんと読むわけでは ないみたいで、この関数内だけ見てるみたいです。 それでこの関数内でgcnew AAA::BBB::CCCがあるんですが、ここをXXXに変更すると デザイナが読み込みできません。XXXはAAA::BBB::CCCを継承したものですが、 デザイナで適切に読ませるためのコーディングがよくわからないので放置してます。 つまりXXXも型なのでtypedefは使えないんです。
って、置換できないみたいだな。 つか、gcnew かよ。
C ではない、ということが判った時点で失せろっつーの。 他の奴も相手すんな。
873 :
862 :2007/06/11(月) 16:57:18
Cとして理解していただいていいですよ。
>>862 不可能みたいですが・・・
#defineはあくまでトークンレベルでしか置換できないみたいですね。
裏技があればとおもったんですが。
マクロじゃ無理だから C の範囲を超える。 あっち行け。
875 :
デフォルトの名無しさん :2007/06/11(月) 18:53:13
#define STR_SIZE 157 char str1[STR_SIZE]; scanf("%文字数s",str1); printf("%d\n",(strlen(str1)) OS:XP C言語の質問なんですが scanfの文字数の部分に#defineで定義した記号定数名を入れると入力した文字数が1と表示されてしまいます しかし直接、数値を指定してやるとちゃんとした文字数が表示されます ここには記号定数名は使えないってことでしょうか? そうだとちょっと不便ですね 何か良い方法ありませんか?
#define TO_STR(text) #text scanf("%" TO_STR(STR_SIZE) "s", str1);
877 :
851 :2007/06/11(月) 19:15:11
このスレを念のために再読しに来て、
打ち間違えてたことに気付かされました。
>>851 >char型の配列の先頭アドレスが2の乗数に
>なっているかどうかは、性能に影響ありますか?
「2の倍数」が正しいです orz
>>853 853の書き込みを見た時点で気がつくべきでした
878 :
デフォルトの名無しさん :2007/06/11(月) 19:20:55
このスレでいいのか不安ですが、質問します。(スレ違いでしたら、誘導して下さい) MinGw とか gcc は、よく使っています。Cygwin は以前使っていました。 MS 社の Visual C, C++ を使ったこともあります。 さて、今現在 MSYS + MinGw 環境で複素数演算をやろうとしたとき、どのような方法が いいのでしょうか。/mingw/include/complex.h は見えるので、けっこう手軽にできそう なのですが、具体的手順が Web 検索してもわかりませんでした。 よろしくアドバイスのほど、お願いします。
>>878 Cでどうしてもやりたいのか、C++でいいのか先ずははっきりしる。
>>877 おいお前
2の倍数=偶数だぞw
お前が言いたいのは”2のべき乗”じゃないのか?
>>878 "どのような方法"が何を意味するか良く分からないが、Cならこんな感じか?
#include <stdio.h>
#include <complex.h>
int main(void) {
complex val0,val1,val;
val0 = 2.0 + 3.0i;
val1 = 4.0 + 5.0i;
val = val0 * val1;
printf("%.5f + %.5fi\n",val);
return 0;
}
>>883 一応Mingwとあったんでそれで。-ansi -pedanticどちらかつけると通らんけど。
>>886 >scanf ("%s", &ope);
これをどうにかすればいいと思うよ
>>887 それを如何にかする方法を聞きたいのですが・・・
scanf ("%c", &ope); もしくは static char ope[100000000]; /* 足りねーか? */ switch (ope[0]){
>>888 char ope[256];
scanf ("%s", ope);
switch (*ope) {
printf ("%d %c %d = %d", dat1, *ope, dat2, ans);
テキトーでいいならこれで
891 :
878 :2007/06/11(月) 22:22:31
どうもありがとう。
>>879 >Cでどうしてもやりたいのか、C++でいいのか先ずははっきりしる。
いや、C より C++ のほうがずっと有利だ!とおっしゃるのなら、その理由をお教え下さい。
>>881 どうも、ありがとうございました。
#include <stdio.h>
#include <complex.h>
int main(void) {
complex val0, val1, val;
val0 = 2.0 + 3.0i;
val1 = 4.0 + 5.0i;
val = val0 * val1;
printf("(*) %g + %g * %%i\n", val);
val = val0 + val1;
printf("(+) %g + %g * %%i\n", val);
return 0;
}
これをやってみました。計算できているようです。
もう少し甘えて質問です。Web 上に、このあたりの説明・解説文書はないのでしょうか。(英語可)
見つからなかった。検索のしかたがヘタなんでしょうね。
>C++に有利な点があるとすれば、C99が普及していないということ でも、それはC++にとってもあんまりうれしいことじゃないんだよなぁ。 C++の規格としては直接C99に対応してくれてなくてもコンパイラ自体が C99に対応してくれてればC++からもたいていその機能を利用できるもんなんだけどなぁ。
>>889 scanf ("%c", &ope);では想定通りに動作しません
static char opeは、習っていないので・・・
>>890 出来ました
有難う御座いました
でも、なんで[256]なんですか?
ポインタとか、よく解らない物で・・・
また、scanfのが、&opeではなくopeであるのは何故でしょうか?
というか、このソースを作るように指示してある問題は、
ポインタを使わないことが前提だったりするんですよね(そもそも、まだ習ってないですから・・・
> [256] 配列 Cでもポインタとは一応関係ない機能
>>894 >>889 とかぶるけど、ポインタがいやならこういう書き方もできる
switch (ope[0]) {
printf ("%d %c %d = %d", dat1, ope[0], dat2, ans);
ぶっちゃけ、やってることは変わんないんだけどね?
あと256は適当 128でも64でも10でもなんでもいい。1以下だとまずいけど。
「やさしいC」という本の335ページにmalloc()関数の説明が載ってまして 以下のコードが載ってるんですが一部判りません。 int main(void) { char *str; int num; printf("何文字のaを用意しますか?\n"); scanf("%d", &num); str = (char *) malloc(sizeof(char) * (num + 1)); ・ ・ ・ } これで確保されたメモリの場所を表すポインタstrが得られる、とあるのですが、 判らない事も無いんですが、最後の行の「 = 」の後「 malloc( 」の前にある (char *)←このキャスト式みたいの何なんでしょうか? 無くてもいいような気がするんですが。。。
>>898 mallocはvoid *を返す関数。strはchar *なので型が違う代入になる。
コンパイラによってはこの型違いの代入を禁止、もしくは警告してくるのでその抑制。
というより、出来ることなら型の異なるものの演算等はないことが望ましいから。
ANSI準拠ならいらないけどな
902 :
898 :2007/06/12(火) 08:57:17
>>899-900 レスありがとうございます<(_ _)>
なるほどキャスト式だったんですか・・・。
でも、そうすると
str = (char) malloc(sizeof(char) * (num + 1));
こうなるような気がするんですが
(char *) の後ろにつてるアスタリスクはどういった意味なのでしょうか(・_・)?
またレスに「mallocはvoid *を返す関数」という部分がありますが、
これもアスタリスクがわからないのですが、
voidを返すというのもよくわかりません。
「voidは値を返さない」という意味ですよね?
なのにvoid型?という型が存在するのですか?、、、、難しいなぁ。
voidとvoid*は違う void*はどの型のポインタにもなれる
>>902 だからポインタだって
voidっていうのは型がないって言うくらいに理解しておけ
>>902 おまい、ポインタ全く分かってないだろ。
まずはポインタを勉強汁。
906 :
デフォルトの名無しさん :2007/06/12(火) 14:59:29
添字 0 1 2 3 4 値 9 4 7 2 5 int型arrayの各要素は表のとおりである。キーボードから要素番号(添字)を読み込むとその要素の値を表示するプログラムを作成しなさい(arrayの各要素の値は初期化で設定) 実行結果例1 要素番号を入力:3 -------------------------- array[3]=2 実行結果例2 要素番号を入力:4 -------------------------- array[4]=5 としたいのですがプログラムを教えてください
宿題は自分でやりましょう
908 :
902 :2007/06/12(火) 16:14:24
>>903-905 レスありがとうございます。
一応、ポインタはわかってるつもりだったんですが、まだまだだったようです。
「やさしいC」には説明がなくてよくわからないのですが、
ネットで調べた感じだと、おそらく、変数や配列に型があるように、
ポインタにも型みたいな物があるんだと想像してます。
int a;
int *Pt;
これはint型の変数a、と
「int型の数が入る変数を指す”メモリ上のアドレスを格納できるポインタを”宣言している」のであって。
ポインタ(アドレス)自体には型は無く、入るのはアドレスのみ、と考えていたんですが、
どうやらポインタ自体に型のような物があり、「int*」「char*」こんな風に表現してるようです。
いいんですよね?(゜∀゜;
でキャスト式を使って「(char*)Pt」こんな風にすると、ポインタの型が変更できる考えとります。
「ポインタに入るのは番地よって、型が無く、番地であるなら、何でも何時でも入れられる。」
こう考えていたのが間違いだったと考えてます。
str = (char*) malloc(sizeof(char) * (num + 1));
とすると↑は、malloc()関数が「void*」という型のアドレス(ポインタ)を返している(返すと決まっている)。
ポインタstrは「char*型のポインタ」?なのでvoid*型のアドレス(ポインタ)を中に格納できない。
でキャスト式を使って型変換をしている、となって合点がいきます。
これでいいんですよね(゜∀゜;?
麻奈さん説明してくれよー(´Д`;
>>908 試しに実行してみて
char *p = 0;
int *q = 0;
p += 1;
q += 1;
printf("%p , %p\n", p, q);
ポインタってのは実態はアドレス。けど、それにもちゃんと型を指定する必要があるということ。 それ以外の説明は要らん。
>>908 ポインタ変数の加算、減算とかしたことないのかな
912 :
908 :2007/06/12(火) 17:29:03
>>909 普通に通りますね。
00000001 , 00000004
こう表示されます。
・・・これはどう考えればいいんでしょうか?
なぜに4が???
ん、そうかポインタその物であるpとqに1をプラスした
そすると次の変数の番地に移動したのか・・・・な?
そうすると次の番地はchar型の場合1バイト繰り上がったって
int型の場合は4バイト繰り上がってる・・・・。
こんな・・・・ような・・・・気もするけど。。。
うーーん。
まだダメっぽい orz
>>911 したことある・・・・と思う。
まあ所詮、はじめてまだ2週間ぐらいの超初心者ですので(゜∀゜;ハハハ
>>912 ポインタを1増やすと型のバイト数だけアドレスが増えるんだよ
int型が4バイトの場合は4増える
>>912 …なんか他の言語経験あり?
えらく飲み込みが早い気がするんだが。
void* はただ漠然とアドレスを表すだけのポインタ型。 int n; void *p = &n; とすれば、p は n のアドレスで初期化される。 でも、void* になってしまうと元の型が分からないので、 *p というように参照することはできない。 *(int*)p のようにキャストすれば大丈夫。 とまあ、そんな感じ。 908 ならこれで理解できると思う。
916 :
912 :2007/06/12(火) 18:07:25
>>914 VB、正確にはVBAがちょこっとできます。
あとC#もちょこっとできます、といっても売り上げをグラフにして遊んでるぐらいですが。
職場のIT担当なんですが、DQN社長にC言語マスター指令を出されたので勉強中です。
なんかサーバの勉強もして来いとか言われてるんですが、、、、管理者やらされるのかなあ(´Д`;自信ナサス
>>910 >>915 ありがとうございます<(_ _)>
なんとか判ります、少なくとも判った気になっております。
でも
char *p = 0;
int *q = 0;
これでポインタ初期化できるんですね。
初めて知りました。
てっきり
char a, *b;
b = &a;
こうしないといけない、しなければならないのかとばっかり・・・・。
まあ、こういうレベルな訳なんですが・・・(´Д`;
>>916 0 はヌルポインタ。
NULL と書いてもいいけど(というか NULL と書いた方がいいと思うけど)。
まあ、
int *p = 0;
printf("%p\n", p);
で 0 と表示されるかどうかは環境依存だがね。
その環境を教えて欲しい、まじで。
>>919 えーと、、、ヌルポインターが0でないのと、 char *p = 0が0じゃなくなるのは何か関係あるのか?
char *p = 0 の0はヌルポインタをあらわして、 整数の0をあらわしているわけではない。
>>917 そもそも printf() の "%p" で void * ではないポインタを渡すこと自体、どうなの?
?
void* <-> T* は暗黙の型変換が行われる。 (Tは任意の不完全型かオブジェクト型) ただし、右向き変換のとき、変換後の型で境界調整がされていない場合の動作は未定義。
C++ならキャストしろ屋ゴルスァって怒られるんだよね…
>>922 すまんす。
確か void* でキャストしないとダメやね。
そういえば、qsortや、bsearch の比較関数って、 あ、いいのか。なんでもないです。
929 :
916 :2007/06/12(火) 21:56:51
>>917 なるほど!!
ヌルポインタ、空のポインタってのがあって、0はヌルポインタを指していたんですね。
これで合点がいきました。
「そういうもんなんだろう」ぐらいに曖昧に考えてたんで、、、。
どうも丁寧にありがとうございました。
>>921 何言ってんの
変数に0を入れてるのに0じゃないことなんて無い
>>926 別スレで
sizeof(int) != sizeof(void*) な環境での可変引数でヌルポ渡すのに
0 ではなく (void*)0 と明示する必要はある
って話はあった
テキストファイル000.dat〜100.datまで作って、 000.datのなかには000\n(ぜろぜろぜろ改行です。) と書いて、001.datには0001\nとかいて・・・と100までファイルを 作りたいです。 これをFILE *fp[101]とせずに、FILE *fpとして、一つだけのfpでやりたいのですがどうしたらよいか教えてほしいです。 よろしくお願いします。
934 :
デフォルトの名無しさん :2007/06/12(火) 22:22:23
openしたらクローズすればよい
>>633 たぶんこんな感じ
#include <stdio>
int main(void)
{
FILE *fp;
int i;
char buf[20];
for(i=0;i<=100;i++)
{
sprintf(buf,"%03d.dat",i);
fp=fopen(buf,"w");
・・・・・・
・・・・・・
fclose(fp);
}
return 0;
}
("w") < なんとなく、ハロウィンのかぼちゃに見えたんだ・・・
937 :
933 :2007/06/12(火) 22:43:16
>>935 ありがとうございます。早速やってみます。
コンパイラの仕事と実行時の仕事は区別することがわかれば自ずと
>>938 0 になる整数式は、ポインタへのキャスト(明示的にしろ暗黙的にしろ)により、
ヌルポインタに変換される。
0 というリテラルがヌルポインタを表しているわけではない。
だから、これもヌルポインタ。
char *p = 1 - 1;
つまり、
>>921 は間違い。
C言語なら
>>921 だろうが
>>930 だろうが大差ない。
どっちが正しいかは日本語の問題に思える。
C++も含め、他の言語はシラネ。
char *p = 0; < これ自身が不適切だって突っ込みはねーのかよ?w
NULL と書いた方がいいという点なら
>>917 で突っ込まれてるが、
それ以外に不適切な点はそこには1つもないぞ。
むしろ、p += 1; の方が不適切だな。
ヌルポインタへのポインタ演算は規格上どうなるか分からんのでは。
>>943 char *p;
なんだからsizeof(char)だけ進むだけだろ。
void *p;
なら不適切。
#include <stdio.h> int main(void) { char *p={"abc"}; printf("%p -%s- \n",p,p); *p=0; printf("%p -%s- \n",p,p); p=0; printf("%p -%s- \n",p,p); return 0; }
>0 になる整数式は、ポインタへのキャスト(明示的にしろ暗黙的にしろ)により、 ( ・∀・)つ〃∩ ヘェー
ぬるぽを返したり代入したりする場合はNULLマクロ使っちゃっていいんじゃない?
int *a ,b; a = &b; *a = 111; printf("ポインタaの値は%dです。\n", *a); これはビルドできるのに int *a = 0; *a = 111; printf("ポインタaの値は%dです。\n", *a); これはできないですね、、、。 大学でnullはできるだけ使わないようにと教授が言ってたけど それに関係してるのかな。。
下の例ではaは何も指してないだろ
ポインタの実態はアドレス。これ以上議論しても無駄。適切に使えないのは それに関して理解していないから。
>>950 printf("%p\n", a);でaの値を比べてみ
そうかnullは、アドレス00000000で初期化している訳ではなくて アドレス自体がnull、空なんだ。 だから指してる変数が存在しない、ビルドできないと・・・。 また一つ判ったぞー。
C++は必要だった筈
>nullはできるだけ使わないように えっ?
NULLはポインタ変数への代入と比較なら全然おkだよ ポインタ以外との演算やNULLに加算とかしちゃ駄目って事のはず
お前らほんっとうにぬるぽだな
961 :
デフォルトの名無しさん :2007/06/13(水) 01:33:33
>∠二 ゞ
( ・∀・). | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' . V`Д´)/
(_フ彡 / ←
>>960
実際の0番地をポイントしたいときはどうするの int *a = (int *)0x00000000; でええのか
>>958 うん、言われた。
nullはできるだけ使わない事
gotoは一切使わない事
do while文もできるだけ使わない事
switch文もできるだけ使わない事
どれも理由は知らない、、、けど下の3っつは何となく想像はつく。
おいおい、どこの馬鹿教授だよwww 今後信用し続けてたりすると、いつか痛い目にあうなそれ。 「このループはどうやって、抜けたらいいんでしょうか?」 「NULLで判断しろよ」 「え? nullはできるだけ使わない事、って教授が言ってましたけど?」 「・・・??」 switchを使うとパッと見わかりやすくなるし、 コマンドラインからの引数処理は、たいていこれ使ってるぞ。
>nullはできるだけ使わない事 たとえばfopen()の戻り値チェックはどうするの? >gotoは一切使わない事 多重ループからの脱出や例外処理に移行したいときにスムーズに書けるのに? >do while文もできるだけ使わない事 必ず一回はループに突入させなければいけないときに無駄なフラグ変数を使えと? >switch文もできるだけ使わない事 巷に溢れるイベント処理系の関数の立場は? どれも適材適所なので、弁えて使えばいいだけの話。
「できるだけ」っていうのは使う必要がないところで無理やり使うなということさ
967 :
デフォルトの名無しさん :2007/06/13(水) 11:30:37
C言語を学ぶときに一番効率的で表示もいいエディターを教えて下さい。
VisualStudio
970 :
C++ :2007/06/13(水) 12:45:31
IDがネ申だったので記念真紀子
NULLは0や””との違いを説明するのが面倒だから禁止にしたのだろう。 大学なんぞ専門学部でも無い限り基礎しか教えない。 文字列操作以外は知らなくても何とかなる。 文字列はきついので「できるだけ」と言ったのだろう。 gotoは知らなくても問題無いし、実際俺も使わないようにしてるので 禁止というのはよくわかる。 do whileも無くても問題ないしDQNが使うとバグの元になるから敬遠してるのだろう。 上級者でも疲れてたりするとたまーーに間違うし。 switchは知ってた方がいいと思うが、知らなくても力技で何とかなるし ifで複雑な分岐をする場合に耐性がついていいと考えたのだろう。 深いネストは慣れていないと錯乱する。 深くネストするな、という議論もあるかもしれんが。 以上、勝手な想像。
初心者は鳴き禁止、面前でやれ。 みたいなもんだ。たいした意味はない。
>do whileも無くても問題ないしDQNが使うとバグの元になるから敬遠してるのだろう。 >上級者でも疲れてたりするとたまーーに間違うし。 それは上級者とは言わんなぁ。 つーか、どう間違うのか具体的なサンプル希望。
while(){}が間違うのと同程度にdo{}while()も間違うといっているのだろうw
>>974 それだと禁止する理由にならないようなw
他の言語をやってたからrepeat-until(つまりdo-whileとは逆論理)と勘違いするって言ってた香具師はいたな。
制御構造はなるべく少なくしておきたいんだろう。
まあ
>>972 だなあ
>>971 while {} は for で代替できるが、do {} while はそうはいかん。
だが、まあ初学者に対しての話なんだから
俺も
>>972 に同意しとこう。
オレ、オレ、情報系の学部だったけど 最初の授業の「hello world」でポインタ使わされたぜw しかも初心者の内は「配列禁止」で全部ポインタでレポート出されたぜwww 初心者の内は配列つかっちゃダメってどうなのよ
初心者はCを使うべきじゃないし Cを使うならポインタ(のラッパーとも言うべき配列も含む)使いまくるべき。 中途半端な使い方するならCを使う意味がない。
>>978 別に珍しい事じゃない、そういう入門書もすくなからずある。
まあ変わってるにはちがいないが。
ポインタから入った方が配列とか、分かりやすいんだぜ? と、アセンブラから入った人間が申しております
組込の部署に配属された者です。担当した案件では、構造体のメンバにアクセスするのに、 演算子ではなく、ベースアドレス+オフセットを使用してコーディングされています。当 然ながら、なんだってこんな面倒なことをするのか、と聞いたところ、組込のようにリソ ースが限られた環境では、負荷を考慮してこのような手法を使用することもある、とのこ とでした。 僕としては、今時のコンパイラなら適切に処理してくれそうなものだし、組込とはいえ今 のCPUなら大した負荷にもならないのではないか、と思っています。ただしこの考えに根 拠が有るわけではありません。 そこで質問なのですが、リソースが限られた環境では、現在でもアドレス+オフセットで アクセスしたりするものなのでしょうか? 組込なので通常よりも更にメモリ操作が重要 になることは理解しているのですが。
>>982 組み込みっつっても幅が広い。
今時のコンパイラ、今時のCPUといわれても・・・
メンバ参照したときのアセンブラコードと ベース+オフセット参照したときのアセンブラコードを比較すれば良いと思うよ。 構造体を一切使わず(宣言も含めて)、一貫してそうしているのなら アライメントを制御できないコンパイラを使ってるから… というのはありえるかもしれん
使ってるコンパイラのオプティマイズが激しく糞なのか それともその部s(ry
>>981 でも、ポインタの加減算はなにがなんでも 1byte 単位と勘違いする罠
987 :
982 :2007/06/13(水) 20:20:41
コンパイラはgcc、CPUはペンティアム4です。だから、将に「今時」といって良いと思い ます。ただし質問の意図はもうちょっと俯瞰的なもので、現在であっても条件によっては このような手法が取られることが有るのかどうかが知りたい、という物でした。 アセンブラコードの比較は現在の私から敷居が高いのですが、参考になりました。尚、こ のような手法を取ったのは、担当者の趣味も反映されているような気はします。
ていうか変数とか要らなくね? static unsigned char *mem[10000000]; だけで十分じゃね?
>>986 いや、その勘違いがないようにポインタから入った方がいいと思うんだ。
>>987 ???どこが組み込みwwww
(クロス開発なんだろうけど・・・・)
>>987 組み込みの実行環境のCPUと開発環境のPCのCPUは関係ない。
携帯とかだとスペックはかなり上がってきてるけど、
冷蔵庫とかだと、クソ低い。
下手するとOSすら乗らん。
>>987 スレの流れからするとペンティアム4がターゲットCPUってことでいいのかな?
993 :
987 :2007/06/13(水) 20:40:09
>>990 あ、勿論ターゲットの方がペンティアムです。因みにOSはVxWorksです。
ターゲットとしてはかなり高性能だと思います。入社したてなので案件の
詳細は知りません。
おまいら誰か次スレたてないの? 俺は無理でした
>>982 そうやってるやつと、そうやってないやつの2種類でコンパイルして、
バイナリを比較してみればいいじゃないの。
そんな外出レスでスレ埋めんなタコ もう少し空気嫁よ
>>995 せめてアセンブリコードを出力して比較しろよ
999 :
987 :2007/06/13(水) 21:02:55
皆さん回答をありがとう。参考になりました。
987のモチベーションの低下を懸念しつつgets(1000)!!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。