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

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

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

過去スレ
Part 1 ttp://pc8.2ch.net/test/read.cgi/tech/1146700389/ Part 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/
2デフォルトの名無しさん:2007/05/16(水) 16:55:31
関連スレ
C/C++の宿題を片付けます 86代目
http://pc11.2ch.net/test/read.cgi/tech/1165718021/
くだすれC言語(初心者用) Part.2
http://pc11.2ch.net/test/read.cgi/tech/1172099763/
スレを勃てるまでもないC/C++の質問はここで 2
http://pc11.2ch.net/test/read.cgi/tech/1178503366/
はきだめC/C++下級者の質問箱 2
http://pc11.2ch.net/test/read.cgi/tech/1156206091/

関連リンク
C 関数検索 man on WWW
http://www.linux.or.jp/JM/
初心者のためのポイント学習C言語
http://www9.plala.or.jp/sgwr-t/
WikibooksのC言語の教科書
http://ja.wikibooks.org/wiki/C%E8%A8%80%E8%AA%9E
3デフォルトの名無しさん:2007/05/16(水) 17:15:04
だから要らんと言ってるのに。
4デフォルトの名無しさん:2007/05/17(木) 00:39:44
質問お願いします。
scanfを使って2つの変数を入力したいんですが、
sanf("%d",&a,b);
こんな感じで良いのでしょうか?動作環境がないため確認お願いします。
5デフォルトの名無しさん:2007/05/17(木) 00:40:45
>>4
sanf("%d %d",&a,&b);
6デフォルトの名無しさん:2007/05/17(木) 00:41:32
コピペしたら失敗した

>>4
scanf("%d %d",&a,&b);
7デフォルトの名無しさん:2007/05/17(木) 00:43:05
>>5
早速の回答ありがとうございました。
8デフォルトの名無しさん:2007/05/17(木) 01:41:51
二次元配列の引渡しはどうしたら良いですか?
main関数の中で宣言した int a[3][3]をほかに自分で宣言、定義した関数に渡すときとか。
9デフォルトの名無しさん:2007/05/17(木) 01:50:38
そのままaを渡せばいい
引数の宣言は int a[][3] でいいかな
10デフォルトの名無しさん:2007/05/17(木) 02:04:14
>>9
回答、ありがとうございました
11デフォルトの名無しさん:2007/05/17(木) 15:53:01
newで確保した領域を中身を消すことなく再割り当てってできますか?
12デフォルトの名無しさん:2007/05/17(木) 15:56:26
>>11
cにはnewなんてありません。
13デフォルトの名無しさん:2007/05/17(木) 16:17:42
入力した文章中の単語を1行に一つずつ印字するプログラムを書け。
(ここでの単語とは、ブランク,タブ,改行文字で区切られた文字)
例えば、
This is a book.
と入力すると、
This
is
a
book.
と表示される。

while((c=getchar()) != EOF)
という文を使って文章を入力するらしいのですが、どうやって表示させればいいのかわかりません。
教えてください。
14デフォルトの名無しさん:2007/05/17(木) 16:20:01
いやです。
1513:2007/05/17(木) 16:21:45
そうですか。
すみませんでした。
16デフォルトの名無しさん:2007/05/17(木) 17:34:16
printf
17デフォルトの名無しさん:2007/05/17(木) 17:50:57
>13
while((c=getchar())!=EOF) {
putchar(c);
if(c==' '||c=='\t'||c=='\n') putchar('\n');
}
18デフォルトの名無しさん:2007/05/17(木) 19:04:11
>>17
改行セパレータの時に二重改行しちゃうかららめぇ。
if(c==' '||c=='\t'||c=='\n') putchar('\n'); else putchar(c);
1913:2007/05/17(木) 20:03:29
>>18
これだと、Enterを押したときに表示されませんか?
理想としては、while文が終わった後に、まとめて表示させたいのですが。
20デフォルトの名無しさん:2007/05/17(木) 20:13:17
>>3
こうやってスレの使い分けも出来ない莫迦が存在する限り、このスレは必要なんですよ。
21デフォルトの名無しさん:2007/05/17(木) 20:15:55
>>19
それは>13に書かれた要件を超えた要求だな。
そもそも○投げなら宿題スレにいけ。
2213:2007/05/17(木) 20:19:04
>>21
宿題スレってものがあったんですね
本当にすみませんでした
23デフォルトの名無しさん:2007/05/17(木) 20:21:36
>>22
スレの先頭くらい見ような。

>1 名前:デフォルトの名無しさん[] 投稿日:2007/05/16(水) 16:53:13
>C言語の入門者向け解説スレです。
>・C++言語はスレ違いです。
>・分からない事をなるべく詳しく書いて下さい。
>・ソースコードを晒すと答えやすくなるかもしれません。
>・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

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

>過去スレ
>Part 1 ttp://pc8.2ch.net/test/read.cgi/tech/1146700389/ Part 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/

>2 名前:デフォルトの名無しさん[] 投稿日:2007/05/16(水) 16:55:31
>関連スレ
>C/C++の宿題を片付けます 86代目
http://pc11.2ch.net/test/read.cgi/tech/1165718021/
>くだすれC言語(初心者用) Part.2
http://pc11.2ch.net/test/read.cgi/tech/1172099763/
>スレを勃てるまでもないC/C++の質問はここで 2
http://pc11.2ch.net/test/read.cgi/tech/1178503366/
>はきだめC/C++下級者の質問箱 2
http://pc11.2ch.net/test/read.cgi/tech/1156206091/
24デフォルトの名無しさん:2007/05/17(木) 20:21:47
>>20
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
http://pc11.2ch.net/test/read.cgi/tech/1170338926/

くだすれC言語(初心者用) Part.2
http://pc11.2ch.net/test/read.cgi/tech/1172099763/

【初心者歓迎】C/C++室 Ver.34【環境依存OK】
http://pc10.2ch.net/test/read.cgi/tech/1169039760/
25デフォルトの名無しさん:2007/05/17(木) 21:18:06
gccで作成したa.outをexeにしたいのですがどうすればいいのでしょうか?
26デフォルトの名無しさん:2007/05/17(木) 21:26:28
2725:2007/05/17(木) 23:01:48
>>26
有難う御座いました。
28sage: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); /* 右の配列を クイックソートする */
}
29デフォルトの名無しさん:2007/05/18(金) 04:15:50
strcmp(line[i],line[middle])<0

line[i]-line[middle]<0

にしてみたら?その下も同じ。

strcmpは文字列を比較する関数であって、
1文字をあらわすline[i]の比較には使えない。
30デフォルトの名無しさん:2007/05/18(金) 05:12:33
>>28
line[middle]と同じ値は左右どっちに移動すると思う?

>>29
そんなミスだったらコンパイル通らないでしょ。
3130:2007/05/18(金) 05:27:53
> line[middle]と同じ値は左右どっちに移動すると思う?

これはちょっと言葉が足りなかった、すまん。
1, 2, 50, 1, 1
こんな例で考えてみればわかるかな。
32デフォルトの名無しさん:2007/05/18(金) 06:33:22
C言語で、C#でArrayListに構造体を突っ込んだような可変長の構造体を扱いたいのですが
どういう風に組むのがいいでしょうか?
33デフォルトの名無しさん:2007/05/18(金) 06:42:16
>>32
C++でvectorを使う
34デフォルトの名無しさん:2007/05/18(金) 06:54:25
>>32
malloc() realloc() free() などを使うといいと思うよ
35デフォルトの名無しさん:2007/05/18(金) 10:46:41
関数を呼び出す時(環境は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)がオフセットアドレスですか?
36デフォルトの名無しさん:2007/05/18(金) 11:11:57
仮想メモリ上でのリニアなオフセットです
37デフォルトの名無しさん:2007/05/18(金) 11:33:49
セレクタとオフセットって、いつの時代の人だ…
38デフォルトの名無しさん:2007/05/18(金) 11:53:15
なつかしいなおいw
3935:2007/05/18(金) 12:16:52
あれ、今はじめて読む486って言う本で勉強してるんですが、最近ではセグメントの管理の仕方ってまた変わってるんですか?
その本ではリアルモードの時に関数へのfarポインタにセレクタ値16ビットと関数のオフセットアドレスをくっ付けたものを代入して
プロテクトモードに移行してからそのポインタを参照してました
40デフォルトの名無しさん:2007/05/18(金) 12:30:50
>>39
>環境はWinXP
これでかなーり事情が変わるので Advanced Windows でも嫁となる
41デフォルトの名無しさん:2007/05/18(金) 12:57:06
>>39
OSのブート部分を書くのでない限り、セグメントのことは忘れてあげて
ください。

4235:2007/05/18(金) 16:22:25
>>40,41
あ、9x系まではそうだったからいつの時代だよってことですか…了解です
43デフォルトの名無しさん:2007/05/18(金) 16:52:24
>>39
はじめて読む486だったら、もっと後のページで32ビットアドレスの話が出てくるはず。
これはようするにオフセットが32ビットになっているモード。
Win32アプリケーションは、その32ビットアドレスのモードで動く。
35のコードで出力された32ビットのアドレスも全てオフセット値。

ちなみに、Win16アプリケーションなら16ビットセレクタと16ビットオフセットを使う。
44デフォルトの名無しさん:2007/05/18(金) 18:25:45
入力はfgetsを使えとよく言われていますが、
fgetsは読み込んだ文字列がバッファに入りきったかどうか判別できませんよね?

改行で読み終わった場合は、バッファに改行コードがあるかどうかで読みきれたかどうか
判別できます。しかしEOFで読み終わった場合はそれが判別できないと思うのですが。

入力→バッファがあふれたらstdinをクリアして再入力

という処理を確実に行うにはどうすればいいのでしょうか。
4535:2007/05/18(金) 18:48:21
>>43
ありがとうございます、もう少し読み進めてみます
46デフォルトの名無しさん:2007/05/18(金) 18:55:50
>>44
>EOFで読み終わった場合はそれが判別できないと思うのですが。
char buf[1000];
fgets(buf,1000,stream);
だとして
文字数のチェックして999未満ならEOF、または改行で終了した
そして最後に改行文字がなければEOFって判断できるんじゃない?
47デフォルトの名無しさん:2007/05/18(金) 18:59:19
fgetsは改行認識しないだろ。
48デフォルトの名無しさん:2007/05/18(金) 19:01:07
BCBのヘルプ
fgets は,stream から文字を読み込んで文字列 s に格納します。読み込みは n-1 個の文字を読み込むか,または改行文字を読み込んだときに終了します。
改行文字で終了した場合には fgets は,s の最後に改行文字を格納します。
s に読み込まれた文字の最後にはヌルターミネータが付加されます。
49デフォルトの名無しさん:2007/05/18(金) 19:02:42
>>44
>EOFで読み終わった場合は
読み込み中にファイルの終わりに達したら
そこまでのデータが読み込まれる。

更に読もうとしたら NULL が返るし、feof() を呼べば 0 以外が返る。

>バッファがあふれたらstdinをクリアして再入力
バッファを拡張して続きを読めばいいでないの。

>>47
fread() と間違えてる?
50デフォルトの名無しさん:2007/05/18(金) 19:09:30
>更に読もうとしたら NULL が返るし
バッファぴったりに読んだ場合、更に読もうとしたら入力待ちにならない?
51デフォルトの名無しさん:2007/05/18(金) 19:14:57
追記可能なストリームならそうなるな。
52デフォルトの名無しさん:2007/05/18(金) 19:17:10
>>48,49
思いっきりボケてたわスマン
恥ずかしい・・・
53デフォルトの名無しさん:2007/05/18(金) 19:24:36
>>50
ごめん、俺よくわかってない、入力待ちって?
>バッファぴったりに読んだ場合
char buf[10];
fgets(buf,10,stream);
として9文字の入力を読み込んだときってこと、それとも10文字?
54デフォルトの名無しさん:2007/05/18(金) 19:26:25
キーボードバッファが空の状態でfgets呼んだら入力待ちになる、ってことじゃね?
55デフォルトの名無しさん:2007/05/18(金) 19:45:42
まあ普通は改行入れるし、Ctrl-Dは入力してないときに入れるもんだから影響ないか
56デフォルトの名無しさん:2007/05/18(金) 19:49:05
>>54
そういうこなのかな
stdinから読み込んでバッファが空になったら入力待ちになるのは当然な気が・・・
それでも問題にはならないと思うけど
こんなコードでも問題なく動作するし
#include <stdio>
int main()
{
FILE *in;
char buf[5];
while(fgets(buf,5,stdin)!=0)
{
printf("%s ",buf);
}
return 0;
}
57デフォルトの名無しさん:2007/05/18(金) 19:49:46
FILE *in; は消し忘れでした
58デフォルトの名無しさん:2007/05/18(金) 19:59:43
1回の入力(待ち)で確実に全入力を取得したいってことだよ
2回目の入力待ちは避けたい場合ね。
59デフォルトの名無しさん:2007/05/18(金) 20:00:30
>>56
改行含めて4文字以下のときにアウトだろ
60デフォルトの名無しさん:2007/05/18(金) 20:03:39
>>58
そういうことか

>>59
>>58って事ならアウトだね、確かに
6144:2007/05/18(金) 20:33:05
質問の内容が具体的でなかったようで、申し訳ありません。
安全な入力を実現するにはどうすればいいかを考えており、
検証するためにテストプログラムを作っています。

http://www.uploda.net/cgi/uploader4/index.php?file_id=0000013415.c

このプログラムで、改行で読み終える場合はバッファオーバーフローの
危険を回避することが出来たのですが、EOFで入力を終了した場合の
対応策を考えられなかったので、このような質問をしました。
6244:2007/05/18(金) 22:05:46
>>61で「バッファオーバーフロー」という言葉を使いましたが、
適切ではありませんね。すみません。

バッファサイズを超える入力を受けたとき、環境に依存しない方法で
stdinをクリアし、再入力を促す。ということです。
63デフォルトの名無しさん:2007/05/18(金) 22:15:50
>>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;
}
6463: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'そのものをスキップする
でバッファ内には残らなくなる・・・的な・・・
6544:2007/05/19(土) 10:27:49
>>63
stdinの読み捨ては簡単にすることが出来ましたが、EOFで読み終わったとき
無限ループにはまってしまいます。
6663:2007/05/19(土) 18:39:31
>>65
EOF入力でも再入力を求めたほうがいいの?
それともEOFが入力されたら終了していい?
6744:2007/05/19(土) 19:49:47
>>66
可能なら再入力を求めるほうがいいですね。
6863:2007/05/19(土) 20:06:13
そか
scanf("%*[^\n]%*c"); を rewind(stdin); に変えると環境によってはうまくいくんだけど
MS的にはおkとしている
でも他の環境だと・・・
環境依存なものはダメだよね?
69デフォルトの名無しさん:2007/05/19(土) 20:18:49
ちょっと待て。EOFってことは標準入力がクローズされていると思うんだが。
7044:2007/05/19(土) 20:26:58
>>68
環境依存OKだとその方法で出来てしまうんですよね…。

if (feof(stdin)) {
/* エラー処理 */
exit(1);
}

このへんで妥協するしかないですかね。
どうやらfgetsはEOFで読み終わった場合はstdinにEOFが残された状態になるらしく、
再入力を求める場合、どうしても無限ループになってしまいます。
7163:2007/05/19(土) 20:41:25
>>69
そうなの?
ファイルの終端に達したからといってクローズされるとは思わないけど
それとも勝手に閉じられてしまうの?

>>70
って事は環境依存はダメって事ね
7244:2007/05/19(土) 20:51:11
>>71
>って事は環境依存はダメって事ね
そうですね。お手数かけてすみません…。
73デフォルトの名無しさん:2007/05/19(土) 22:01:13
clearerr(stdin)ってどうだろう?
7463:2007/05/19(土) 22:06:10
>>73
ダメ
実証もしたよ
75デフォルトの名無しさん:2007/05/20(日) 00:26:01
線形代数の勉強中で、プログラムを使って行列式を計算するプログラムを作ろうと思いました。
しかし行列をtempという作業用行列に渡す時にエラーが出ます。

http://www.uploda.org/uporg815439.c.html

環境はgcc3.3.6

どこがいけないのでしょうか。教えてください。
ちなみにベクトルの代入は成功してるようです。
76デフォルトの名無しさん:2007/05/20(日) 00:44:28
>>75
多次元配列(厳密にはただの配列と一緒なんだが・・・)を仮引数とするときは
最初(最後だったかもしれん)の1つ以外は指定しなければならないという制限があったはず
そうしないとコンパイラがポインタ値をいくつスライドさせりゃいいのか分からんからな
77デフォルトの名無しさん:2007/05/20(日) 00:54:00
完成プログラム(?)です。
http://www.uploda.org/uporg815517.c.html
一応行列式は算出してくれます。
でもこれだと100次元にするときはいちいち3を100に書き換える必要がある。
これじゃ次元をint nで渡してる意味がない。
せめて[][2]を[][n]という形でかけるといいのですが、やりかたはないでしょうか?
7863:2007/05/20(日) 01:00:21
>>75
関数宣言で
int a_substitute(int a[][])
としているでしょ
関数に配列を渡すときには”配列”としてではなく”ポインタ”として渡される
引数に配列が使えるのはコンパイラ段階で引数が分かっていることが前提
ところがコンパイラ上で渡された配列のサイズが不明なためコンパイルできない

int a_substitute(int a[][2]) とすればコンパイルは通る
と計算といってるけど、これからその部分書くの?
7963:2007/05/20(日) 01:01:59
>>77
#define N 100

int a_substitute(int a[][N])

とかはダメ?
80デフォルトの名無しさん:2007/05/20(日) 01:02:26
>>78
プログラムうp遅れすまそ。
上にうpしたやつです。名前はmatrix.cといいます。
しかしこれでは希望の仕様を満たさない。
どうすればいいのやら・・・これが出来たら次は外積のプログラムを作りたいのですが。
これでは応用が効かない。
81デフォルトの名無しさん:2007/05/20(日) 01:02:28
>>77
手持ちのC99仕様書によるとこういう宣言も認められるらしいが使ったことないので分からん
試してみてくれ

T foo(int n, int m, T' a[n][m]);
82デフォルトの名無しさん:2007/05/20(日) 01:03:53
>>79
main関数内で行列なりベクトルなりの次元を取得して
それを引数にするためプリプロセッサでは無理ですね。
それでは書き換えるのと大差ない。
83デフォルトの名無しさん:2007/05/20(日) 01:04:45
>>81
ど、どういう意味ですかその宣言方法は。
なんか光明が
84デフォルトの名無しさん:2007/05/20(日) 01:07:58
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)
//後略
ってやるのはどう?
関数に渡すときにキャストして。
85デフォルトの名無しさん:2007/05/20(日) 01:10:07
>>83
おそらくC99で追加された可変長配列(配列宣言時にConstantでなくVariableを大きさとして指定できる配列)を
仮引数並びに使ってるんだろうが詳しくは知らん
gcc3.3.6ならC99対応してるだろうからおそらく通るとは思うが通らない可能性も否定できん
86デフォルトの名無しさん:2007/05/20(日) 01:13:47
#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");
87デフォルトの名無しさん:2007/05/20(日) 01:14:50
            break;
            
            case 'N':
            case 'n':
                printf ("N");
                        
            break;
            
        default:
        printf ("$");
        }
    }
    
    return 0;
    }
8863:2007/05/20(日) 01:15:53
>>82
実行段階でのサイズを変更をしたいのね

>>84
double det(double **a, int n){
じゃないかと・・・
89デフォルトの名無しさん:2007/05/20(日) 01:16:21
おっ!!!
なんとなくやってみたら出来たっ!!
(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]がいいか。どちらがベストかは微妙です。
90デフォルトの名無しさん:2007/05/20(日) 01:19:00
>88
配列わかってねー
91デフォルトの名無しさん:2007/05/20(日) 01:19:18
>>86-87が失敗ソースなのですが

メッセージを出し、キーを入力させ
入力したキーを表示させます

もし入力されたキーがzなら終了
z以外なら再入力を促し
YないしyならYを表示→終了
NないしnならNを表示→終了
それ以外なら$を表示→終了

としたいのですが、どうも再入力を受け付けてくれません
この場合、変数を増やしてやるほかに方法は無いのでしょうか?
rewind (stdin);を入れてやれば、一応は解決したのですが
こうするとバッファデータが全部ロストするみたいなので、余り良くないんじゃないかなぁ・・・と

それとrewind (stdin);を入れて、再入力した場合
何を入れても$が表示されてします
復改というのでしょうか?
\nが混じるのが問題みたいなんですが
これを除去する良い方法はないのでしょうか?
92デフォルトの名無しさん:2007/05/20(日) 01:19:52
>>84
むつかしい。理解不能でつ
キャストとかポインタが連発するともう解析不可能・・・
9363:2007/05/20(日) 01:22:23
>>90
ごめん、勘違いした
94デフォルトの名無しさん:2007/05/20(日) 01:22:24
>>84
その方法だと、配列が小さいときは良いが、でかくなったときにオーバーヘッドが大きすぎないか?
95デフォルトの名無しさん:2007/05/20(日) 01:22:52
>>91
訂正
”それとrewind〜方法はないのでしょうか?”は無視してくださってかまいません

ですが、改行を読み飛ばす方法は教えてくださると幸いです
調べたらgetchar ();をダブらせるといいとか、fgetsで関数を組むみたいなことを見つけたのですが
いかんせん上手くいきません・・・
96デフォルトの名無しさん:2007/05/20(日) 01:23:40
つーか84は
*temp(i*n+j) = *a(i*n+j)
だろ
97デフォルトの名無しさん:2007/05/20(日) 01:24:02
>>95
現在stdinにある文字を改行含めて読み飛ばすならこれでいける
scanf("%*[^\n]%*c");
98デフォルトの名無しさん:2007/05/20(日) 01:27:38
>96
なんか混ざってるw
p[i*n+j]もしくは*(p+i*n+j)が正解
99デフォルトの名無しさん:2007/05/20(日) 01:45:40
>>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)];
100デフォルトの名無しさん:2007/05/20(日) 01:48:51
>>97
>>86-87の派生版に
それを組み込んでみたんですが、上手く動作しません

原因は大体解ってるんですが、やり方がわからないんですよね・・・

ソース
http://www.borujoa.org/upload/source/upload11705.c

scanf("%*[^\n]%*c");の組み込み位置が可笑しいのは解ってるんですが
(一応、前のtextに引っ掛けてるつもりです)
全部読み飛ばすと判定が出来なくなるというか、入力する意味が失われますので
getcharで読み飛ばしを試みてるのですが、どうしても読み飛ばされないです

どうすればswitchの判定を有効に出来るのでしょうか?
(printfで確認した限りでは、defaultしか動いてない)
101デフォルトの名無しさん:2007/05/20(日) 02:06:38
どうでもいいけど激しく読みにくいインデントスタイルだな。

処で、switchがまともに動かない直接原因ではないが、getchar()の戻り値はintで受けるべき。
で、EOFが帰ってきたらその処理もした方がよさそうだが。
102デフォルトの名無しさん:2007/05/20(日) 09:44:13
エディタはemacsに限る。viはうんこ
103デフォルトの名無しさん:2007/05/20(日) 09:58:38
Meadowのインスコにadmin権限が必要ってのを何とかしてくれ
104デフォルトの名無しさん:2007/05/20(日) 10:14:55
関数を通して配列を作って、それを返り値にすることは出来ますか?
double * make_rotate_array(double angle)
のように例えば角度を引数として回転行列をreturnしてくれるような。
一度やったら
なんかローカル変数のポインタを参照にしちゃってます
的なことをいわれて凹んだ。ここでmallocですかね?
105デフォルトの名無しさん:2007/05/20(日) 12:45:10
Cなら呼び出し側でメモリ確保する方が一般的。
106デフォルトの名無しさん:2007/05/20(日) 14:22:06
質問です。
コマンドライン引数でファイル名を受け取りその中身(テキスト)を標準出力する
というプログラムを作っていて、ある時から「MZP」という文字列が出力されるようになりました。
MZPってなんなんですか?
107デフォルトの名無しさん:2007/05/20(日) 14:26:52
MZヘッダの一部
108デフォルトの名無しさん:2007/05/20(日) 19:52:56
>>106
Windowsの.exeとかをバイナリエディタで開けば解るお
109デフォルトの名無しさん:2007/05/21(月) 05:35:11
OS:VineLinux
コンパイラ:gcc

こんばんは、ppm形式(フルカラーraw形式)の画像のピクセルごとの,R,G,Bの色のデータを
メモリを動的に確保して1次元の配列にぶち込みました。
これを任意の角度回転しようと考えているのですが、
どうも1次元の配列ですと直交座標で扱いにくく困っています。
そこで新たに二次元配列を動的に確保して・・・とも考えたのですが
元画像、出力画像のデータを取り込んでいるので、得策でもないような気がします。
なんとか直交座標系として扱いつつ、元画像を回転させて出力画像を作る方法ありませんでしょうか?
ソースがあるだとかよい案があればよろしくお願い致します。
110デフォルトの名無しさん:2007/05/21(月) 08:41:47
>>109
何が問題なのか判らない。全く同じ質問を他のスレでもしていたようだが
貰ったレスに対しても碌な返事していなかったようだし、
少々落ち着いて他人に伝えるという努力をしてみるといいかもしれない。
そもそも、画像の回転の方法は判っているのか?
どうも、画像処理の基礎知識も幾何数学の素養も無い気がしてならない。
111デフォルトの名無しさん:2007/05/21(月) 08:50:18
というか画像処理に関する知識がないから考えようもない。
専門じゃないんで・・・
112デフォルトの名無しさん:2007/05/21(月) 08:52:39
専門じゃないのなら、他人任せ(ひとまかせ)にするか勉強するか、どっちかしかないと思うのだが。
前者なら、具体的な要件をまとめて宿題スレへ、後者は勝手にどうぞ。
コーディングに際して何か疑問があるようならここかどこか、適当なスレで承ります。
113デフォルトの名無しさん:2007/05/21(月) 09:07:31
>>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
どうもありがとうございます
使ってみてダメなようであれば質問スレに行くことにします。
115デフォルトの名無しさん:2007/05/21(月) 14:10:45
>>114
そうやって数学まで落としてくれればわかりやすい。
つまり1次元配列で3次元の基底変換をしたいんだろ

無理に決まってんじゃん・・・
3*3の回転行列が必要に決まってる。
高崎先生がおれにそう教えてくれたっ!
116デフォルトの名無しさん:2007/05/21(月) 14:34:03
まじめにC言語学びなおしたいってすこしおもったけど
117デフォルトの名無しさん:2007/05/21(月) 14:42:53
C++に進もうぜ!!
118デフォルトの名無しさん:2007/05/21(月) 16:26:26
嫌です
119デフォルトの名無しさん:2007/05/21(月) 16:45:58
じゃあC#でいいや
120デフォルトの名無しさん:2007/05/21(月) 16:55:48
嫌だっていってます
121デフォルトの名無しさん:2007/05/21(月) 17:07:00
*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;
}
122デフォルトの名無しさん:2007/05/21(月) 17:09:56
>>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コンパイラを使用してます
124デフォルトの名無しさん:2007/05/21(月) 17:30:27
>>123
標準入力を使うのはやめた方がいい。
リダイレクトされると泣ける。
125デフォルトの名無しさん:2007/05/21(月) 17:31:31
^H ^J ^K ^L が渡ってくるかもしれないし、
shell が喰ってしまってアプリケーションに渡らないかもしれない
126デフォルトの名無しさん:2007/05/21(月) 18:03:44
>>124,>>125さん、ありがとうございます

標準入力でもう少しがんばってみます

127121:2007/05/21(月) 18:14:53
>>122さん
ありがとうございます。
この関数部分についてはうまく行くようになりました。
しかし他の部分でもバグが出て泣きそうです。
でもしばらくは自力で頑張ってみます。
128デフォルトの名無しさん:2007/05/21(月) 19:31:26
Numerical Recipes in C
って本を大学の図書館で借りてきた。
楽しみだおわくわく

数値計算においてはC>>>>>>>>>C++
C++は必要なし。
129デフォルトの名無しさん:2007/05/21(月) 20:00:30
その本は糞
130デフォルトの名無しさん:2007/05/21(月) 20:16:21
>>128
C++を使うと複素数演算がきれいに出来る
131デフォルトの名無しさん:2007/05/21(月) 20:26:07
rubyでいいじゃん、オブジェクト指向なら
132デフォルトの名無しさん:2007/05/21(月) 20:26:45
Numerical Recipes in C++の方が糞
何せC++で書く意味が無いようなプログラムがずらずら並んでる
しかも糞高い
133デフォルトの名無しさん:2007/05/21(月) 20:28:11
FFTに興味があったから
134デフォルトの名無しさん:2007/05/22(火) 10:31:54
>>128
>数値計算においてはC>>>>>>>>>C++
何を比べているのかさっぱり判りませんが、そのあたりが
「莫迦は不等号を好んで使う」と言われる所以なんでしょうね。

>>130
C99 にもありますね<複素数
もっとも gcc くらいしか選択肢がないですが。
135デフォルトの名無しさん:2007/05/22(火) 10:43:42
Numerical Recipes in C って、
FORTRAN のから無理矢理作った感じの本。
いくつかバグもあったと思うよ。
まあ、理論のところは役に立つと思うけど。
136デフォルトの名無しさん:2007/05/22(火) 11:05:15
FORTRANから無理やりCに移植してさらに無理やりC++に移植したのが
Numerical Recipes in C++ということなのか、そりゃあ仕方ないな
137デフォルトの名無しさん:2007/05/22(火) 11:06:38
>>134
つ[icc]
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関数では、その関数を呼び出すようにしなさい。
139デフォルトの名無しさん:2007/05/22(火) 11:36:46
宿題スレ池よカス
140デフォルトの名無しさん:2007/05/22(火) 11:41:35
他人の問題を解いて欲求満たすエロい人たちの巣窟です

C/C++の宿題を片付けます 87代目
ttp://pc11.2ch.net/test/read.cgi/tech/1179025919/
141デフォルトの名無しさん:2007/05/22(火) 12:33:03
偉くはないが本当にエロいそのスレの住人の俺に対する挑戦状か?
142デフォルトの名無しさん:2007/05/22(火) 13:30:07 BE:77640285-2BP(222)
エロいですが何か。
143デフォルトの名無しさん:2007/05/22(火) 16:44:04
絶対に許さないよ
144デフォルトの名無しさん:2007/05/22(火) 19:18:06
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");
145デフォルトの名無しさん:2007/05/22(火) 19:18:58
//続きです。
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;
}
146デフォルトの名無しさん:2007/05/22(火) 19:23:41
つPAE
147デフォルトの名無しさん:2007/05/22(火) 19:56:16
C言語ってオブジェクト指向じゃありませんよね。
なんで構造体があるのにオブジェクト指向じゃないんですか?
メソッドがないからですか?
継承がないからですか?

オーバーロードが出来ないのがいたすぎ
148デフォルトの名無しさん:2007/05/22(火) 19:57:25
継承がないから、というのが一番大きいと思う。
149デフォルトの名無しさん:2007/05/22(火) 20:07:46
Cでもオブジェクト指向的なプログラミングができんわけではない
150デフォルトの名無しさん:2007/05/22(火) 20:13:18
まあ、どのレベルまで言語的に実装されてるか、だな。
151デフォルトの名無しさん:2007/05/22(火) 20:20:57
>>147
構造体とOOPは何の関係もないし
オーバーロードとOOPもまた、何の関係もない。
152デフォルトの名無しさん:2007/05/22(火) 20:23:07
Cで単継承はできる。
が、文法の枠組みの外の実装となるので、書き辛い
153デフォルトの名無しさん:2007/05/22(火) 20:26:28
構造体でクラスっぽいものが実装できる以上、
オブジェクト指向的なプログラミングはできるし、
それに構造体が必須なのも事実。
154デフォルトの名無しさん:2007/05/22(火) 20:35:35
int *p;
int x = 10;

p = &x;

printf("%d", *p);

これでは10が表示されるみたいですが、
char *p;

p = "aaaa";

printf("%s", *p);

こうするとエラーがでます。printf("%s", p)とすればaaaaと表示されます。
1番目に書いたほうは理解できたのですが、
同じように考えて2番目もするとエラーでした。
この違いはなんなんでしょうか?
155デフォルトの名無しさん:2007/05/22(火) 20:37:17
char に対応するフォーマットは %c
156デフォルトの名無しさん:2007/05/22(火) 20:49:27
>>154
"%d"は値を10進表記で出力
"%s"は値を0終端文字列の先頭アドレスとみなして文字列を出力
157デフォルトの名無しさん:2007/05/22(火) 20:56:47
>>154
cの言語仕様自体には文字列型というものは無いんだ。
文字の配列を文字列として扱う関数が標準で用意されているだけ。

char ** p;
char * x = "aaaa";
p = &x;
printf("%s", *p);
これでaaaaが出るよ。
158デフォルトの名無しさん:2007/05/22(火) 20:58:51
課題の中でわからない問題が2問あるんだけど聞いてもいいかすら?
多分ベテランさんなら楽勝だと思うんだけど、俺C言語苦手だなぁ・・・。
159デフォルトの名無しさん:2007/05/22(火) 21:00:27
解いてくれ、なら不可。
やってみたけどうまくいかない、というのなら、
自分で書いたソース付きでさらに条件付きで可。
160デフォルトの名無しさん:2007/05/22(火) 21:02:58
>>155-157
アリガトス
161デフォルトの名無しさん:2007/05/22(火) 21:03:30
>144
off_tとかでぐぐれ。
162デフォルトの名無しさん:2007/05/22(火) 21:10:29
CにあってC++にないものってありますか?
ないとしたらC言語はとっくに消えていると思うのですが。
どうも++って名前が気にいらない。
163デフォルトの名無しさん:2007/05/22(火) 21:11:51
歴史
164デフォルトの名無しさん:2007/05/22(火) 21:12:37
こんぱうんどりてらる、とか。
可変長配列、とか。
165デフォルトの名無しさん:2007/05/22(火) 21:16:18
>>159
ソース付きというか初めからソース書いてて一つ穴開いてるんだけど
開いてる部分を埋めて動作を記入しろって問題。
実際埋めて実行してみたんだけど、間違ってるような気がしてならない。
166デフォルトの名無しさん:2007/05/22(火) 21:16:59
>>162
仕様の少なさ
167デフォルトの名無しさん:2007/05/22(火) 21:17:45
>>165
結果が正しいなら、とりあえずそれで提出したら?
間違ってたら、それはそれで勉強になる。
168デフォルトの名無しさん:2007/05/22(火) 21:18:57
>>163
あれ、俺書き込もうとしてやめたはずなんだが…
169デフォルトの名無しさん:2007/05/22(火) 21:19:39
計算機ソフトウェアで8パズルを解くプログラムを書けとか・・・無理っすよ。
170163:2007/05/22(火) 21:20:24
>>168
脊髄反射した。後悔はしていない
171デフォルトの名無しさん:2007/05/22(火) 21:21:04
>>169
日文でおk
172168:2007/05/22(火) 21:25:29
>>170
さよかw
ID出ないから本当に書き込んじゃったのかと思ったよ
173デフォルトの名無しさん:2007/05/22(火) 21:25:54
既出かもしれませんが、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;
}
---------------------------------------------------------------------

つづく...
174173: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 バイト以上の
領域にも代入されているということになって
メモリの領域破壊につながらがらないのでしょうか?

どうかご教授をお願い致します。
175デフォルトの名無しさん:2007/05/22(火) 21:32:48
...経由で引数渡しすると、int以下の連中が
みんなintへ昇格するから。
176デフォルトの名無しさん:2007/05/22(火) 21:33:37
1) 汎整数拡張。
2) 変換指定子 x は unsigned int を期待する。 hx なら unsigned short int
177デフォルトの名無しさん:2007/05/22(火) 22:34:42
>>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に
加えたところ、ばっちり表示できました。
178173:2007/05/22(火) 23:11:32
>> 175
printf の引数渡しの段階で型変換が行われていたんですね。

勉強になりました。ありがとうございました。
179デフォルトの名無しさん:2007/05/22(火) 23:17:58
関数の中にswitch文入れたりするのっておかしいですか?
180デフォルトの名無しさん:2007/05/22(火) 23:19:58
それは普通です。
関数の外に書く方がおかしいです。
181デフォルトの名無しさん:2007/05/22(火) 23:39:10
そもそも関数の外には書けない
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)
*****
***
*
185デフォルトの名無しさん:2007/05/22(火) 23:55:26
はいはい、頑張ってね。
186デフォルトの名無しさん:2007/05/22(火) 23:55:51
こういう回答に懲りたら次は宿題スレにでも逝っとけ

#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}
187デフォルトの名無しさん:2007/05/22(火) 23:56:21
#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;}

宿題なら宿題スレへ
188デフォルトの名無しさん:2007/05/22(火) 23:57:24
はいはい結婚結婚
189デフォルトの名無しさん:2007/05/22(火) 23:59:06
これ定番のネタなの?w
190デフォルトの名無しさん:2007/05/23(水) 00:00:52
お前ら釣られてんのわからんの?
191182:2007/05/23(水) 00:04:17
>>186-187
ありがとうございます。
こんな風にもできるんですね。
宿題スレ行きます。
>>190
釣りじゃないです。
192182:2007/05/23(水) 00:05:30
宿題すれに行ったら射精しました。
193デフォルトの名無しさん:2007/05/23(水) 00:12:36
自分の説明不足を棚に上げて
自分が意図した答えではないと腹を立てるのが日本の世間一般だから

何事にも察しと思いやり
194デフォルトの名無しさん:2007/05/23(水) 08:15:01
2000*1000*500*3位の画像データ(ハイビジョン画像500枚くらい)を扱いたいんですが何かいい方法があれば教えて欲しいです。お願いします。
195デフォルトの名無しさん:2007/05/23(水) 08:17:31
小数点以下50桁まで扱えませんか?
196デフォルトの名無しさん:2007/05/23(水) 08:19:39
扱えます。
197デフォルトの名無しさん:2007/05/23(水) 08:22:05
そういうときはもう、多桁に長けたアルゴリズムを使いましょう
198デフォルトの名無しさん:2007/05/23(水) 08:24:30
>>196
なにを使うのですか?
どのように表示を
199デフォルトの名無しさん:2007/05/23(水) 08:29:24
printf("%.50f", 1e-50);
200デフォルトの名無しさん:2007/05/23(水) 08:48:14
>>197
けたけたw
201デフォルトの名無しさん:2007/05/23(水) 13:57:13
多倍長演算
202デフォルトの名無しさん:2007/05/23(水) 14:49:00
動的な3次元のポインタの使い方を教えてください。ポインタの使い方が不慣れなもんでよく分かりません。現在、3次元の1000*500*300の配列を計算したのですが、配列が大きすぎるのか計算途中でハングアップしてしまいます。どうかお願いします
203デフォルトの名無しさん:2007/05/23(水) 14:59:30
>>202
8バイト実数だとして1.1GByteか。豪気だな。
204デフォルトの名無しさん:2007/05/23(水) 15:02:17
>>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;
}
}
}
205202:2007/05/23(水) 15:12:06
>>204
ありがとうございます!
申し訳ないですが、ここからどのように数値を読み込んで、どのように値を入れたらいいでしょうか。
初歩的なところが分かってなくてすいません。
206デフォルトの名無しさん:2007/05/23(水) 15:37:18
そもそもcharですら150MBの作業領域が必要になるようなアルゴリズムを修正した方がいいと思うがな
207デフォルトの名無しさん:2007/05/23(水) 16:00:59
>>205
なんだ、そのレベルか。だったら諦めろ。それが一番楽だ。
208デフォルトの名無しさん:2007/05/23(水) 16:06:21
>>204
最初から
  typedef int MyElement; // 要素の型。int でも double でも好きなように。
  typedef MyElement (*MyArray)[500][300];
みたいにしといて
  MyArray array = malloc(1000 * sizeof(*array));
で確保すりゃ
  array[999][499][299] = 0;
直感的。
209デフォルトの名無しさん:2007/05/23(水) 16:29:44
必ずそのサイズ必要になるなら、それが一番楽かもね。
210デフォルトの名無しさん:2007/05/23(水) 18:07:57
動的にやるなら***pが必要になると思うんだぜ?
211デフォルトの名無しさん:2007/05/23(水) 18:19:57
>>210
>204
212デフォルトの名無しさん:2007/05/23(水) 18:23:05
イミフ
213デフォルトの名無しさん:2007/05/23(水) 21:56:59
C言語じゃなくてmakeの質問なんですが、詳しい人がいそうなのでここで質問させてください。
.oファイルをソースとは別の場所に出力したいのですが、
コンパイル自体は -c obj/$< のようなオプションでディレクトリobjに出力できるのですが、
リンクのときどう書けばいいか分かりません。
分かるかたいましたら教えてください。
214デフォルトの名無しさん:2007/05/23(水) 22:11:24
makeスレだってあるだろ
215デフォルトの名無しさん:2007/05/23(水) 22:18:26
makeスレは人がいません
216デフォルトの名無しさん:2007/05/23(水) 22:51:27
それはどこのmakeだ?
gnu make? bsd make? imake? nmake?
217デフォルトの名無しさん:2007/05/23(水) 22:52:52
よそでやれ。迷惑だ
218デフォルトの名無しさん:2007/05/23(水) 23:13:35
wildcard でソース一覧を作って、
patsubst で *.c を obj/*.o に置換しる。
219デフォルトの名無しさん:2007/05/23(水) 23:31:43
キーボードからアルファベット1文字を入力し、その文字の次の文字を出力するプログラムは
どのようにして作るのでしょうか?
220デフォルトの名無しさん:2007/05/23(水) 23:34:33
次の文字って?
A→BとかB→Cとか?
Zの次は?
221デフォルトの名無しさん:2007/05/23(水) 23:36:17
そです、A→Bです
Zは入力しない方針で
222デフォルトの名無しさん:2007/05/23(水) 23:48:27
>219
'A' + 1, 'B' + 1でいいんじゃないの
だからchに文字が読み込まれているとしてch + 1にすればいいじゃない。
Zはそれなりに表示されるし。
223デフォルトの名無しさん:2007/05/24(木) 00:11:05
こういうことすると、ASCIIコードが対応してない環境だと
うんぬん言われるけど、このほかに方法はあるのかと俺は知りたい。
224デフォルトの名無しさん:2007/05/24(木) 00:15:11
char c;
switch(c)
{
case 'A': c='B';break;
case 'B': c='C';break;
・・・・
}
とか
225デフォルトの名無しさん:2007/05/24(木) 00:15:56
if(ch=='A')return 'B';if(ch=='B')return 'C';・・・
26文字くらいならアリだと思う
226デフォルトの名無しさん:2007/05/24(木) 00:19:09
*(strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 'A')+1);

実際はエラーチェックいるけど。
227デフォルトの名無しさん:2007/05/24(木) 00:20:12
static const char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ.";
int ch = getchar();
char * p = strchr(table, ch);
if (p) ch = p[1];
putchar(ch);
228デフォルトの名無しさん:2007/05/24(木) 00:27:18
文字コード32を引いた文字を出すプログラムを作成するのが課題なんですが
どのようにしてプログラムを組めばいいのでしょうか
229デフォルトの名無しさん:2007/05/24(木) 00:34:44
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があればそちらも教えていただきたいです。
注文が多くて申し訳ありません。
コードだけでもわかれば後は自分で弄って理解したいと思います。
よろしくお願いします。
235デフォルトの名無しさん:2007/05/24(木) 04:21:57
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; }
236デフォルトの名無しさん:2007/05/24(木) 04:22:33
>>234
int main() {char buf[4]; gets(buf); return 0;}
必要なのはこれだけ。後はデバッガで追えばバッファオーバフローで異常動作を引き起こす様子を観察できる。
どうやってそれをやればいいか判らないようなら、諦めろ。
237デフォルトの名無しさん:2007/05/24(木) 04:26:17
>>236
もうその程度のレベルの低いレスをしているくせに、諦めろとか言っちゃっているところが
(・∀・)ニヤニヤもんだね
238デフォルトの名無しさん:2007/05/24(木) 04:40:25
>>234

「プログラミング初心者」がそんなトピックに手を出すのが大間違い。

> かなり詳しく書いていてもハードルが高くて理解できない実例ばかり

これが理解できるまでは無駄だろう。
239デフォルトの名無しさん:2007/05/24(木) 05:02:35
相手の理解力も重要だが、答える側が適切に理解させられる知識を持っていないのに
お前そんなのも分からんのか?やめろとか偉そうに上から物を言っちゃっている
井の中の蛙だから墓穴を掘って笑われるんだよw
240デフォルトの名無しさん:2007/05/24(木) 05:33:32
っつかgets()はありえない。これを使う時点で(ry
241デフォルトの名無しさん:2007/05/24(木) 05:34:08
>>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.
と入力すると…
242デフォルトの名無しさん:2007/05/24(木) 05:37:02
>>234
「HACKING: 美しき策謀」 でも読んどけ。
243デフォルトの名無しさん:2007/05/24(木) 05:42:16
変数が書き換わるのなんか、どんな初心者でも理解できるだろ。
>>234がより気にしてるのは、「任意の関数を呼び出す」の方。

まあそれも>>235に書いてある通りで、
>>236みたいな書き込みは何の助けにもなってないとは思うよ。
236に235が理解できるかすら疑問。
244デフォルトの名無しさん:2007/05/24(木) 05:52:06
リターンアドレスを書き換えるのは基本だな。
245デフォルトの名無しさん:2007/05/24(木) 07:44:31
>>240>>241
元質の趣旨を理解できてる?
246デフォルトの名無しさん:2007/05/24(木) 08:02:02
x86アセンブラの話を延々ここで質問者が
理解するまで進める、というような趣旨か?
247デフォルトの名無しさん:2007/05/24(木) 08:07:10
          ____ ..::/     \  おはようございますw
        /     \  ─    ─\      ___
今沖田w /  ─    ─\ ⌒  ⌒  ヽ     /      \
     /    ⌒  ⌒  ヽノ(、_, )ヽ    |  / ―   ―  \  仕事?ありえませんねw
    |       ,ノ(、_, )ヽ    |-=ニ=-   / /   ⌒  ⌒   ヽ
     \     -=ニ=-   /:.      <  |     ,ノ(、_, )ヽ     |
    ノ            \⌒ ̄ ⌒⌒〜 \    -=ニ=-    /
   〜⌒ ⌒ ̄⌒ ⌒ ̄ ⌒⌒〜         >        <
                   \    /⌒ ⌒ ̄⌒ ⌒ ̄ ⌒⌒〜



    ――      l   ‐┼― ‐┼― _l_ヾ
       ー―  ト―  | ⌒  rー、    | |
   ―‐―       l    / ー  _ノ  / J

          | ̄ ̄|  ーヽ-〃 ヽ_ノ   ‐┼―
          |二二|   _ヽ  γ、ノ`ヽ   | ⌒
          |__|  (_ ,   lノ ヽ_ノ   / ー‐
248デフォルトの名無しさん:2007/05/24(木) 08:13:15
無間配列はどうやって作るのでしょうか?
それとも無間配列を作ることは不可能なのでしょうか?
249デフォルトの名無しさん:2007/05/24(木) 08:15:05
なにそれ
250デフォルトの名無しさん:2007/05/24(木) 08:17:18
>>248
無限と言いたい? それとも、可変長?
251デフォルトの名無しさん:2007/05/24(木) 08:23:08
「むげんはいれつ」か?
Cは[]のオーバーロードが出来ないので、gtter,setter関数で実現すべし。
252デフォルトの名無しさん:2007/05/24(木) 08:58:21
有限の中でやっていることに対して無限はないだろ。敢えて言うなら可変。
253デフォルトの名無しさん:2007/05/24(木) 09:06:16
>>246
それはもちろん、「VCでデバッガで」と言ってる人に対しての皮肉ですよね?
254デフォルトの名無しさん:2007/05/24(木) 09:37:49
関数呼び出し時にスタックにどんな値がどのように積まれ、使われるか。
それがわからんやつに何を説明しても無駄。
255デフォルトの名無しさん:2007/05/24(木) 09:43:51
引数の順に積むのか? 逆順に積むのか? レジスタ優先割り当てを行うのか?
積まれた引数の巻き戻しは 呼び出し側で整理するのか 呼び出された関数側で整理するのか
256デフォルトの名無しさん:2007/05/24(木) 11:04:56
>>254
「だったらそこから説明しろ」とか言いかねないな。
何れにしろこのスレの範疇ではないが。
257デフォルトの名無しさん:2007/05/24(木) 13:35:32
Linux上のgccで書いているのですが、
たとえばpid=1234のプロセスがまだ生きているかどうかを調べるには
どうしたらいいのでしょうか?

教えて君でスマソ
258デフォルトの名無しさん:2007/05/24(木) 13:57:13
それは C の質問というよりは、
Linux の質問な気がするよ。
259257:2007/05/24(木) 14:04:52
そうですね....どもです(´・ω・`)
Linux板逝ってきます
260234:2007/05/24(木) 14:27:43
ご回答くださり有難うございます。
>>235
短くてわかりやすい例ですね。
mainに戻るアドレスを関数f()に書き換えているわけですね。
>>238
そうですね。もうちょっと勉強しないとだめですよね。
身の程を知れってことでしょうか。
>>241
おぉ、なるほど。buf1が書き換わってしまいますね。
溢れた値が先に詰まれた変数を書き換えているのですね。
>>242
一応買おうかと思い悩んでいるのですが、バイト代が入ったら買ってみます。
>>254
それを知りたいと思い簡単な例で解説してもらおうかと・・・。いや勉強します。

いくつか例を出して頂きましたので、あとはそこから自分で理解して行きたいと思います。
感謝いたします。
261デフォルトの名無しさん:2007/05/24(木) 14:31:45
>>252
Haskell とか勉強した事ないかい?
あれには無限リストがあるよ。

無限配列ってのはおそらく、
値をメモリに置かず、生成していくのを、
配列操作の文法で実現できるかって話じゃないかね。
C++ なら [ ] や * のオーバーロードで実現できるだろうけど、
C だと無理やね。
262デフォルトの名無しさん:2007/05/24(木) 16:22:01
バイナリが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 という値で試しています
263デフォルトの名無しさん:2007/05/24(木) 16:29:42
1) 本当にバイナリで書かれているのか?
 メモ帳で test.dat を開くと 「1 2 3 4 3 5 6 7 8 9」 と見える→それテキストじゃ
2) sizeof(int) とバイナリファイルが想定している整数が同じ大きさか?
3) エンディアンの規定はどうなっているのか?

<><><>
先に バイナリデータを作るプログラムを作って そのファイルを読み込むテストしてみたら?
→それでうまくいくのなら、2) 3) が怪しい
264デフォルトの名無しさん:2007/05/24(木) 16:31:35
どううまくいかないのだ?
265デフォルトの名無しさん:2007/05/24(木) 16:34:29
バイナリで書き込んだデータで試しています。

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で終えられるのか教えてください
 
266デフォルトの名無しさん:2007/05/24(木) 16:37:07
>>265
while (file!=NULL) で回してるからそーなる。
freadの戻り値をチェックするんだー
267デフォルトの名無しさん:2007/05/24(木) 16:38:21
1+2+3+4+5+6+.....と無限ループ的に加算して行き
累積加算結果が50を超えた時にループを抜けると言った処理をしたいのですが、どうすればいいのでしょうか?

因みに配列やポインタは使わないものし、ループ関数はwhileを使うものとします

実行結果
1+2+3+4+5+6+7+8+9+10=55
268デフォルトの名無しさん:2007/05/24(木) 16:40:41
失敗ソース、多分加算方法が可笑しいんだとは思います・・・
近いことは出来ている気がするのですが(´・ω・`)

#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;
    }
269デフォルトの名無しさん:2007/05/24(木) 16:44:54
進行経過を示す変数と それまでの総和を保持する変数は分けなきゃ

# それまでの総和を公式で求めるなら それはそれで有りだが
270デフォルトの名無しさん:2007/05/24(木) 16:45:51
>>266
調べているとEOFが使え無そうなのでそうしていたのですが
freadで読み込んだ値が○なら終了という風にすればよいのでしょうか

その終了の値はバイナリの場合は何が入るのでしょうか
271デフォルトの名無しさん:2007/05/24(木) 16:48:56
>>270
そういう時、(ファイル形式がどうなってようが) fread について調べる。
272デフォルトの名無しさん:2007/05/24(木) 16:49:30
>>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;
}

これでいいんじゃね?
273デフォルトの名無しさん:2007/05/24(木) 16:59:09
>>268
どうやったらこんなインデントで書けるんだよww
274デフォルトの名無しさん:2007/05/24(木) 17:02:42
&nbsp; で変換したのかと。専ブラかなんかにそういう機能あるのかな?
275デフォルトの名無しさん:2007/05/24(木) 17:03:09
>>271
freadの確認をしましたら「読み込みデータの数よりも小さい数、または0を返す」とありました

そこで
>>262のソースにif(x==0) break;
という風にしたのですが変わらずです…助けてください
276デフォルトの名無しさん:2007/05/24(木) 17:04:57
>>269
最初はnum0とnum1に分けてやってたのですが
上手くいかなかったのでnum0だけにしてみたんですけど・・・

やはり二つ必要でしたかorz

>>272
おお、動きました!
表示を全部ifに投げると言う発想は無かったです・・・

>>272-273
余り他人のソースを見たことが無いものでして・・・
取り敢えず{があればインデントって感じなのです。。。

私のソースは、そんなに可笑しいですか?
(センスは良く可笑しいと言われますが・・・)
277デフォルトの名無しさん:2007/05/24(木) 17:06:28
>>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;
こうなる
278デフォルトの名無しさん:2007/05/24(木) 17:11:10
>>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);
}

でも出来ました。
ありがとうございました
279デフォルトの名無しさん:2007/05/24(木) 17:12:19
fread(&x,sizeof(x),1,file);
xのサイズのものを1個読んで、結果は?
読めたら1、読めなかったら0だろ。
もっとでかい数で指定した場合でも、その数未満なら最後まで読んだことになる。
280デフォルトの名無しさん:2007/05/24(木) 17:29:19
C言語のアルゴリズムの授業書に、以下の様な物があるのですが

あるアンケートの結果を配列Kに集計したい
アンケートの回答は0,1,2,3,4の数字であり、Nに入力されるものとする
流れ図は以下の通りである
http://www.imgup.org/iup385775.png

これってC言語化できると思いますか?
僕はフローそのものに間違いがある気がするんですが

というかNを入力以降のフローの意図することが理解できません
(1 += K(N)って何がしたいんだろうか・・・
しかも表示するわけでも、ファイルに書き出すわけでもなくEND)
281デフォルトの名無しさん:2007/05/24(木) 17:33:13
フローがおかしいね。
1 += K(N) は明らかに k[N] += 1 の誤植だが、
入力が 0, 1, 2, 3, 4 なのに N != 1 ってのは明らかに変。

出力に関しては、そのフローのさらに後でするだけだろう。
これは集計処理のフローなだけっしょ。
282デフォルトの名無しさん:2007/05/24(木) 17:37:12
1 += K(N) は、その前のほうを見て想像するに、
k[n] += 1 としたいんだろ。
N != 1はバグだろうけど、そのまま書けない事も無いw
出力が無くたってプログラムは書ける。
283デフォルトの名無しさん:2007/05/24(木) 17:39:50
>>282
アンケートで (1) を選ぶと集計が止まるシステムの完成!

まさに仕様ミスだな
284デフォルトの名無しさん:2007/05/24(木) 17:52:35
>>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;
    }
285デフォルトの名無しさん:2007/05/24(木) 18:05:37
int k[5] でいいだろ。
あとfor文でまとめようとしなけりゃいい。
286デフォルトの名無しさん:2007/05/24(木) 18:14:12
getche の返す値は文字コードだから、
'0' を引かないとダメやね。
というか、scanf でも使う問題ではないのか?
287デフォルトの名無しさん:2007/05/24(木) 18:15:10
>>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;
    }
288デフォルトの名無しさん:2007/05/24(木) 18:17:17
>>286
scanfだと改行入るから良くないんじゃないかなー・・・なんて思ったんですが
因みに>>280は問題ですらない(流れ図と説明みたいな感じ)ので、特にこれといった指定はありませんが
余り複雑なものになると、僕自身が理解できなく(ry
289デフォルトの名無しさん:2007/05/24(木) 18:18:07
k[i]とk[n]はk=nの時同じものを指す
290デフォルトの名無しさん:2007/05/24(木) 18:18:14
この場合、do 〜 while 使いましょう。
291デフォルトの名無しさん:2007/05/24(木) 18:18:42
+= をなぜ + に変えるのかが分からない。
292デフォルトの名無しさん:2007/05/24(木) 18:19:11
>>289
ちょ i=n っしょw
293デフォルトの名無しさん:2007/05/24(木) 18:19:28
>>289
i == n の時、だな。
294デフォルトの名無しさん:2007/05/24(木) 18:21:00
っと、do while でも判別時期がずれるか。
無限ループにして、入力後にif 文で break でどうか。
295デフォルトの名無しさん:2007/05/24(木) 18:21:00
わけがない
296デフォルトの名無しさん:2007/05/24(木) 18:22:45
>>294
だな。
297デフォルトの名無しさん:2007/05/24(木) 18:27:20
なにやってるのか、段々理解不能になってきました(´・ω・`)・・・
でも、これが理解できないと授業についていけない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デフォルトの名無しさん:2007/05/24(木) 18:29:33
字面通りにしか理解できんのか・・・。
変数の中に値が入ってるのは理解できてるのか?
300デフォルトの名無しさん:2007/05/24(木) 18:32:36
アッ−
301デフォルトの名無しさん:2007/05/24(木) 18:34:35
>>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されるんでしょうか??
302デフォルトの名無しさん:2007/05/24(木) 18:41:05
n や k を何の為に使うか分かってないのかな。
n はアンケートの 0, 1, 2, 3, 4 の数値を入力させたもので、
k はそれぞれの数値に対する票数でしょ。

それが分かれば、もうちょい分かるんじゃね?
303デフォルトの名無しさん:2007/05/24(木) 18:41:07
>scanf("%d",n);でnにint型の値が代入される
されません
 scanf("%d", &n);

>if(i==n) k[n] += 1;
なぜそこで i と n を比較しなければいけない衝動にかられたのかと
304デフォルトの名無しさん:2007/05/24(木) 18:43:05
if(i == n)
ここってi == 4 になっちゃうよね?
てことはなんかへんじゃない?
俺も初心者なんでちがかったらメンゴ
305デフォルトの名無しさん:2007/05/24(木) 18:44:17
k[n] += 1 だけでいいのに。
問題は、nが0〜4以外の場合と、9の場合。
1を足す前に9かどうか比較すればいい。
5以上なら抜ける、でもいい気がするがその辺は
フローチャートがなおされたら即座に反映できるようにしておけ。
306デフォルトの名無しさん:2007/05/24(木) 18:46:30
>>304
for 抜けた後の i の値は 5 になるお
307デフォルトの名無しさん:2007/05/24(木) 18:49:57
>>306
Oh!確かにそうでしたorz
308デフォルトの名無しさん:2007/05/24(木) 18:50:07
>>302
余り解ってないかもです・・・

ただ、配列って言うのは連続した変数みたいなものですよね?

題意に反する書き方で書くなら、配列を使って表現できるのですが
これだとまるで別物ですね
(数が多くなると不利だし、配列の特長を微塵にも生かせていない、ただの変数となんら変わりが無い)
http://www.borujoa.org/upload/source/upload11805.c

>>303
>>293でi == n の時とあったので・・・

>>304,306

>>305
それはif breakですか?
309デフォルトの名無しさん:2007/05/24(木) 18:50:27
よく教科書の例文にreturn(0)が付いているけど、実際に必要な場合はどんなときですか?
値を返すというのはどこに返しているんですか?
310デフォルトの名無しさん:2007/05/24(木) 18:56:58
>>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 の話か?
311デフォルトの名無しさん:2007/05/24(木) 19:00:20
>>310
mainです
312デフォルトの名無しさん:2007/05/24(木) 19:00:20
main関数はOSに値を返す
313デフォルトの名無しさん:2007/05/24(木) 19:03:13
あと、return に括弧つけたらダメ。
retrun(0); とかミスしてもコンパイル通っちゃうから。
314デフォルトの名無しさん:2007/05/24(木) 19:04:08
>>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を抜けます

と理解しています
315デフォルトの名無しさん:2007/05/24(木) 19:05:38
>>314訂正、ボケました

そしてiは0なのでi < 5は真(1)でありループします 
i++がカウンタなのでiにはは1が代入され、k[1]になり 
k[1] = 0;となる
316デフォルトの名無しさん:2007/05/24(木) 19:05:42
>>314
それが分かってるのなら、
k[n] += 1; が何をするものか、
何をしたいものなのかは分かると思うんだけど。
317デフォルトの名無しさん:2007/05/24(木) 19:06:55
>>314
「i と n が等しい値だったら
k[i] で参照しているところと k[n] で参照しているところは同じ」

問題のアルゴリズムについての話ではない。 配列の一般論
318デフォルトの名無しさん:2007/05/24(木) 19:07:25
>>k[i] と k[n] は i == n の時に同じ
>済みません、言っていることが良くわかりません(´・ω・`)
例えば i が 2 で n が 2 なら、
k[i] も k[n] も k[2] になるだろ。
それだけの話。
319デフォルトの名無しさん:2007/05/24(木) 19:07:25
>>309
プロセスAが内部で別のプロセスBを呼んだときに戻り値として受け取ったりする
320デフォルトの名無しさん:2007/05/24(木) 19:12:00
>>317
等しい値ならば、何故iとnを別ける必要があるのでしょうか?
また、k[i]で参照している場所とk[n]で参照している場所は同じとありますが
iとnは別の文字なのに、どうして同じ場所を参照させることが出来るのでしょうか?
321デフォルトの名無しさん:2007/05/24(木) 19:13:59
>>320
> 等しい値ならば、何故iとnを別ける必要があるのでしょうか?
別に i を入力に使いまわしても良いが、
フローがそう指示してるからでしょ?

>iとnは別の文字なのに、どうして同じ場所を参照させることが出来るのでしょうか?
この認識から外れられない以上
配列とその中身へのアクセスの仕方が理解できないと思われる
322デフォルトの名無しさん:2007/05/24(木) 19:14:07
>>320
別の文字だったら何か困る事でもあるのか?
値が同じなら、そんな事どうだっていいじゃん。
323デフォルトの名無しさん:2007/05/24(木) 19:18:30
>>321
確かにフローの指示だからというのはあるのですが
別けているのには、何か特別な意味があるのかな?と思いましたので
(別けることによるメリットなど)

>この認識から外れられない以上
つまり添え字には意味がないと言うことでしょうか?
自分が見るC言語サイトや、参考書、教本にも、添え字についての具体的な説明が一切無いので・・・
(これが添え字、と書いている程度)

>>322
混乱してきませんか?
324デフォルトの名無しさん:2007/05/24(木) 19:19:23
returnはmainならOSに値を返し、他の関数へ値を返すことができる、()は不必要と。
ありがとうございました。
それで、main内のreturnは必要あるんですか?
325デフォルトの名無しさん:2007/05/24(木) 19:21:10
>>324
戻り値の型が int である以上 return は必要、というのが C の話。
C++ だと return 0; なら省略可能。
326デフォルトの名無しさん:2007/05/24(木) 19:22:17
>>323
混乱してきません。

変数の中に入ってる値に注目して考えてみ。
327デフォルトの名無しさん:2007/05/24(木) 19:22:52
328デフォルトの名無しさん:2007/05/24(木) 19:23:40
main関数が0を返すのはプログラムが正常終了した事をOSに通知するため。
異常終了の場合は0以外の何かの値を返す。
329デフォルトの名無しさん:2007/05/24(木) 19:25:26
>>323
添え字に使う「変数名」に意味はない。 (歴史的に i j k x y は多用されるよねー ってだけ)
その「添え字になった変数の値」のみが重要
330デフォルトの名無しさん:2007/05/24(木) 19:26:08
mainに返り値があればプログラムが正常に終了したか何らかの処理に失敗して異常終了したかを
後で確認するのに便利、てくらいかと
最初のうちは深く考えずに中身に凝ればいいんじゃないかな
331デフォルトの名無しさん:2007/05/24(木) 19:26:28
>>326
余り良くわかりませんが

例えば
hensu[a]
hensu[b]
hensu[c]
は全て同一のアドレスを参照していると言うことでしょうか?
332デフォルトの名無しさん:2007/05/24(木) 19:27:12
何でリロードしないかな、俺
333デフォルトの名無しさん:2007/05/24(木) 19:28:37
a=1;
b=1;
hensu[a];//hensu[1];
hensu[b];//hensu[1];
334デフォルトの名無しさん:2007/05/24(木) 19:30:02
>>331
a や b や c の中に入ってる値による。
335デフォルトの名無しさん:2007/05/24(木) 19:30:52
変数名にこだわり過ぎ。
そんなんじゃ k[i + 1] とか k[2 * 5] とか k[n / 2] とか理解できんぞ。
336デフォルトの名無しさん:2007/05/24(木) 19:30:58
>>333
なるほど、そういうことですか
これでやっと、iとnが同一と言う理屈が理解できました

こんな馬鹿に長々教えてくださり、本当に有り難うございました
337デフォルトの名無しさん:2007/05/24(木) 19:31:00
なるほどreturnの用途がよくわかりました
わかりやすく教えてくれてありがとう、助かりました
338デフォルトの名無しさん:2007/05/24(木) 19:33:19
>>335
k[i +1]は、i = 5ならば、k[6]ということで
k[2 * 5]は、k[7]
k[n / 2]は、n = 8ならば、k[4]ということでしょうか?
339デフォルトの名無しさん:2007/05/24(木) 19:33:58
>k[2 * 5]は、k[7]
k[10]
340デフォルトの名無しさん:2007/05/24(木) 19:36:03
いま、とある問題をしてるんですが
「復改が必要な場合は、全てにおいてputcharを使って改行しなさい」

って指定されてるんですが、\n以外に何かあるのでしょうか
341デフォルトの名無しさん:2007/05/24(木) 19:36:13
>>338
2つ目は + と見間違えただけだろうと思っとく。
それ意外は問題ない。
これで課題も解けるね。
342デフォルトの名無しさん:2007/05/24(木) 19:36:31
>>339
素で掛け算と足し算、間違えました
恥ずかしいorz。。。
343デフォルトの名無しさん:2007/05/24(木) 19:36:57
>>340
質問の意味が分からん。
344デフォルトの名無しさん:2007/05/24(木) 19:38:11
>>341
有り難うございました
良い勉強になりました
345デフォルトの名無しさん:2007/05/24(木) 19:40:47
複改って復帰+改行の事でしょ?
だったら\r\n。
復帰が\rで改行が\n。
346デフォルトの名無しさん:2007/05/24(木) 19:43:41
>>345
んなもん OS による
347デフォルトの名無しさん:2007/05/24(木) 19:49:54
そもそも C の標準関数のレベルでは複改は \n であると決まっている。
それを OS に渡す時に \r になるか \r\n になるか \n のままなのかは OS 次第。
348デフォルトの名無しさん:2007/05/24(木) 20:19:05
putcharで改行するのは

putchar("%r");
ではエラーがでました、ご教授して頂ければ幸いです

349デフォルトの名無しさん:2007/05/24(木) 20:22:02
突っ込みどころが多すぎて、
どう誘導していいのか分からない。

とりあえず putchar の仕様くらいヘルプでも man でもいいから調べとけ。
350デフォルトの名無しさん:2007/05/24(木) 20:23:52
ある文字列の一部、つまり文字を整数型に直したいのですがatoiだとエラーが出てしまいます
atoiのように文字を整数型に直してくれる関数はありますか?
351デフォルトの名無しさん:2007/05/24(木) 20:26:48
関数は要らない
その文字から'0'を引け
352デフォルトの名無しさん:2007/05/24(木) 20:28:18
>>350
atoi は普通に使えばエラーの出るはずのない関数だが・・・。
数字がなければ 0 を返す。
エラーになるのって、渡しちゃいけないアドレスを渡した時くらいだぜ。
353デフォルトの名無しさん:2007/05/24(木) 20:29:30
>>351
1文字しか対応できないじゃん
354デフォルトの名無しさん:2007/05/24(木) 20:30:12
あ、文字を、だからそれでいいのか。
355デフォルトの名無しさん:2007/05/24(木) 20:30:23
少し書き方がおかしかったですが、例えば文字型の変数に"12345"と格納してある場合に
'3'だけを指定して整数に直したいのですがatoiでどのように指定させればいいのかちょっと分からないのです
356デフォルトの名無しさん:2007/05/24(木) 20:31:23
atoi じゃ無理。無理矢理やっても効率悪い。
>>351 でファイナルアンサー。
357デフォルトの名無しさん:2007/05/24(木) 20:34:09
strchr()使えばいいんじゃないのか、多分
358デフォルトの名無しさん:2007/05/24(木) 20:34:32
char* foo = "12345";
int num = foo[2] - '0'; /* 3 の書かれてる場所な */
359デフォルトの名無しさん:2007/05/24(木) 20:37:19
c=='\n';

putchar(c);

でも改行されなかった
360デフォルトの名無しさん:2007/05/24(木) 20:37:33
有難うございます
勉強になりました
参考にしていろいろ試してみたいと思います
361デフォルトの名無しさん:2007/05/24(木) 20:39:23
>>359
== だからじゃね
362デフォルトの名無しさん:2007/05/24(木) 20:40:20
というか、何故直接 '\n' を putchar に渡そうとしないのかが分からない
363デフォルトの名無しさん:2007/05/24(木) 20:40:25
>>359
...........
364デフォルトの名無しさん:2007/05/24(木) 20:44:28
putchar('\n');
ってやればいいのに
365デフォルトの名無しさん:2007/05/24(木) 20:44:40
c=='\n';//==なので'\n'が代入されない。=を使う。
putchar(c);//cに'\n'が入ってないので当然改行されない。

putchar("\r");//文字列じゃだめ。文字を渡す。

putchar('\n');//OK
366デフォルトの名無しさん:2007/05/24(木) 20:46:45
"\r" じゃなくて、"%r" とか書いてたんだぜ・・・
367デフォルトの名無しさん:2007/05/24(木) 20:48:43
あ、ほんとだ。
見間違えた。
奴をみくびっていたようだ。
368デフォルトの名無しさん:2007/05/24(木) 20:51:23
日本IBMに入りてー(~ヘ~;)ドラマ『お金が無い!』みたいなビルかっこぇぇと思ってたら日本IBMでした。
369デフォルトの名無しさん:2007/05/24(木) 20:56:12
それなり以上の大学に入ってそれなり以上の努力すりゃ入れるよ。
370デフォルトの名無しさん:2007/05/24(木) 21:01:58
Fランク大学オワタ(οдО;)   オワタクナイ(~ヘ~;)!      
   資格は足の裏の米粒っていわれるけど、、ソフトウェア開発技術者の資格とればなんとかなる?
371デフォルトの名無しさん:2007/05/24(木) 21:06:24
>>370
高校生の俺でも持ってるっす…
372デフォルトの名無しさん:2007/05/24(木) 21:10:48
巻き返したいなら今からでも受験やり直したら?
現役と比べて2年のブランクまでなら新卒扱いになる。
今大学1回なら今から必死で勉強して国立にでも入って
大学内で必死に勉強すれば入れるよ。3回以上ならオワタだけど。
373デフォルトの名無しさん:2007/05/24(木) 21:26:34
>>371すごぃな(~ヘ~;)なんか、、、アドバイスを、、4月下旬からC言語やって、ポインタ、ファイル操作とかやって、猫でもにそってやってるんだが、、、次からどないしょう、、
374デフォルトの名無しさん:2007/05/24(木) 21:31:50
まずIBMに入るのを諦めることからやってみよう
375デフォルトの名無しさん:2007/05/24(木) 21:34:40
>>374そうします。(~ヘ~;) いろいろアプリケーション作りたいなぁ、、、、、
376デフォルトの名無しさん:2007/05/24(木) 21:37:33
作りたいアプリケーションがあるなら、それを作ればいい。
その中で、色々覚える事もあるだろう。
377デフォルトの名無しさん:2007/05/24(木) 21:43:47
なにかアプリケーションを作ってみようと思います。取り敢えず、アプリケーション作り書いたる本読みながら作ってみたりして、そこから自分で前に進んでみます。でも、、C言語の入門書やったぐらいやけど大丈夫かなぁ。。
378デフォルトの名無しさん:2007/05/24(木) 21:47:37
>>373
アドバイスできるほどプログラム知ってる人じゃないけど
とにかくなんか作ってみる事をおすすめします。
僕は高校入った頃にとある開発プロジェクトに混ぜてもらって
そこで色々学んだので。これは稀有なケースだと思うけど…
連結リストやハフマン符号化とかのアルゴリズムも人のソースから学んだっす
(読んだ時は名前知らなかったからデータチェインとか自分で名づけてた)。
とにかく何か作ってみて何度も壁にぶちあたって乗り越えてを繰り返すと
いつの間にかある程度プログラムの構造やコンピュータのアーキテクチャに詳しくなってる筈だと思います。
そこから本読んで正しい知識得て間違った知識を排除すれば良い感じになるかと。
あとソフ開だけ取りたいならこんな事しなくても専用の勉強するだけで余裕だと思います。
僕でも試験1日前に対策本ざっと眺めて過去問やっただけで取れちゃったので。

ここまで書いてて思ったけど完全にスレ違いですね。でも勿体無いから書き込んじゃう。
379デフォルトの名無しさん:2007/05/24(木) 21:53:43
データチェインかっこいいな
380デフォルトの名無しさん:2007/05/24(木) 21:57:51
>>378ありがとうございました(≧ω≦)
381デフォルトの名無しさん:2007/05/24(木) 23:40:36
>>378
で、今なにしてんの?
382デフォルトの名無しさん:2007/05/25(金) 00:01:09
ニートです
383デフォルトの名無しさん:2007/05/25(金) 00:23:21
あらかじめ決まっている4人分の身長、体重のデータを2次元配列に格納して
平均と体重とBMIをだせってプログラムを組んでるんですけどまったくわからない・・・
なにかアドバイスになるものありますか?お願いします
384デフォルトの名無しさん:2007/05/25(金) 00:24:03
参考書読め
385デフォルトの名無しさん:2007/05/25(金) 00:39:54
身長と体重のペアを1次元として、それが4つ
386デフォルトの名無しさん:2007/05/25(金) 00:46:10
まったくわからないなら宿題スレへ丸投げすれば?
387デフォルトの名無しさん:2007/05/25(金) 01:11:44
例えば
配列array[]があって、while文でarray[]の全ての要素を表示するにはどうしたらいいでしょう?

int i=0;
while(array) {
printf("%d\n", array[i]);
i++;
}
これじゃダメですよね。
388デフォルトの名無しさん:2007/05/25(金) 01:14:02
>>381
高校す。今年卒業す。
389デフォルトの名無しさん:2007/05/25(金) 01:15:58
>387
int i=0, size;
size = sizeof a / sizeof a[0];
while(i<size) {
printf("%d\n", array[i]);
i++;
}
390デフォルトの名無しさん:2007/05/25(金) 01:18:19
>>387
int array[AMAX];
とする場合、
int i=0;
while( i<AMAX ) {
printf("%d\n", array[i]);
i++;
}
391デフォルトの名無しさん:2007/05/25(金) 01:23:59
>>389
>>390
ありがとう、目から鱗。
392デフォルトの名無しさん:2007/05/25(金) 01:47:48
何で for とセットで配列を教えないのか、
教えてる人の気が知れないよ。
393デフォルトの名無しさん:2007/05/25(金) 08:06:22
1+2+3+…8+9+10
この計算するプログラムはどうすればいいですか?
forの中身が分からない
394デフォルトの名無しさん:2007/05/25(金) 08:10:16
int i,sum;
sum = 0;
for(i=1;i<=10;i++)
sum += i;
395デフォルトの名無しさん:2007/05/25(金) 08:11:21
printf("%d\n",sum);
396デフォルトの名無しさん:2007/05/25(金) 08:15:38
>>394
お早いレスありがとう(・ω・)
397デフォルトの名無しさん:2007/05/25(金) 09:58:40
int i,sum;
sum = 0;
for(i=1;i<=10;i++)
 sum = (1+10)*10/2;
398デフォルトの名無しさん:2007/05/25(金) 10:13:31
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の行列の逆行列を求めるプログラムを知りたいです。お願いします!
400デフォルトの名無しさん:2007/05/25(金) 12:25:55
>>399
丸投げは宿題スレへどうぞ。
401デフォルトの名無しさん:2007/05/25(金) 13:12:54
俺がモテモテでお金に困らないプログラムを知りたいです!おながいしまつ!
402デフォルトの名無しさん:2007/05/25(金) 14:03:39
>>401
つ[ マザーボードごと交換が必要です ]
403デフォルトの名無しさん:2007/05/25(金) 14:07:32
どなたかご存知の方いたら教えてください
ttp://www.cb.uu.se/~tc18/code_data_set/3D_images.html
ここのrawデータを使いたいのですが仕様は
ttp://www.cb.uu.se/~tc18/code_data_set/Code/Libvol/man/volformat-man.html
ここのページにある
.raw files : all data is written in binary :
| int SizeX | int SizeY | int SizeZ |\n
| 3D raw data [...] |
The 3D raw data is just the dump of the matrix of voxel.
In fact, raw data format depends of the machine where it is generated. So it's not very portable.
とあってint型でバイナリを3つ取るソースを書きました。

raw.gzを落としてきて、まず、解凍しようとしたのですが、アーカイブじゃないと言われ
そのまま読み込んだら、明らかにおかしい値が出てきました
どなたか、バイナリに詳しい方、お教え願えませんか
404デフォルトの名無しさん:2007/05/25(金) 14:12:25
読み込むソースはこのようにしました。(きのう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;
}
405デフォルトの名無しさん:2007/05/25(金) 14:19:17
gzファイルは環境によってはDL時にブラウザが展開しちゃう場合があるからな
まずはバイナリエディタで調べてみてはどうか
406デフォルトの名無しさん:2007/05/25(金) 14:29:07
バイナリで中身を見てみて、適当に先頭部分に
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でやはり圧縮されておかしくなってるのか…
どうにも確認の方法がなくて…
407デフォルトの名無しさん:2007/05/25(金) 14:34:52
だからよ、バイナリエディタでまず改行の有無を見てみたらいいじゃん
ちょっとみてみたけど、そんな仕様にはなってないみたいだよ
それと、外からファイルを持ってくるのならエンディアンに注意な。
408デフォルトの名無しさん:2007/05/25(金) 14:41:01
つーか、.gzならgzipで展開すればいいジャマイカ。
409デフォルトの名無しさん:2007/05/25(金) 14:45:20
バイナリ扱うのが初めてなもので、わからないことが多すぎでした
バイナリで開いたところ、始めのほとんどが0でおかしいな…と

>>408コンソールに渡してgzipで解凍しようとしたのですが
gzip形式では無いとエラーがでてしまって

410デフォルトの名無しさん:2007/05/25(金) 14:59:38
今ダウンロードしてみた。
確かに落ちてきた段階で展開されているね。
例えば、aneurism.rawとかskull.rawで256*256*256→16777216バイトでサイズ的にもいいみたい。
後は単純に、グレイ256諧調のxyデータが256枚z方向に並んでるイメージっぽい。
例えばIrfanViewならrawデータ用プラグインを使って幅256、高さ65536、8bppで見える。
#このままでも歯並びがよく判るのさw
411デフォルトの名無しさん:2007/05/25(金) 15:12:31
IrfanViewで見られるのですか!?
さっそく試してみます!
412410:2007/05/25(金) 15:26:50
ちなみに.vol.bz2の方は、bzip2で展開すると先頭のほうにテキストで情報が追加された.rawだと言うことが判る。
#って、ここまで全然Cに関係してこないや。
413和田っちあっちゃん:2007/05/25(金) 15:30:04
<条件>
・ビリヤード台がおいてある
・台の左下端の座標は(0,0)、右上端の座標は(2,1)とする
・位置(x0、y0)に手玉
・手玉の初速度(v0x,v0y)
  ・手玉の位置、初速度はscanfをつかって入力する
<問題>
・手玉はどこに衝突するか?
  ・衝突位置の座標を表示する
  ・ポケットにおちることは考えなくてもよい
  ・20回のバンクを考慮して21カ所解答

お願いします!!
414デフォルトの名無しさん:2007/05/25(金) 15:33:30
>>413
丸投げは宿題スレへ。
415デフォルトの名無しさん:2007/05/25(金) 15:41:28
>>410 >>412
ありがとうございます!見られました!

ここから数値データに…もっていければ一番なのですが
もう少し頑張ります
416デフォルトの名無しさん:2007/05/25(金) 15:42:04
手玉のサイズさえ考慮しないのなら、ビリヤードなんて言うことないのに。
#手玉と的玉でImaginaryBallなんて話が出てきたりすると面白いのだが。
417デフォルトの名無しさん:2007/05/25(金) 15:44:27
>>415
ものすごーく横着したければ、IrfanViewでPGM(勿論Ascii)で保存すれば数値の書かれたテキストになるw
418デフォルトの名無しさん:2007/05/25(金) 16:24:48
なるほど、そこから必要な数値を抜き出せるわけですね

ようやく先に進むことが出来そうです。本当にありがとうございました!
419デフォルトの名無しさん:2007/05/25(金) 19:37:57
#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;
}
もう何やってるのかもわからない
420デフォルトの名無しさん:2007/05/26(土) 01:27:28
>419
aとiに値が入ってない
forループはどちらも実行されない

なにがしたいのかさっぱりわからない
421デフォルトの名無しさん:2007/05/27(日) 09:54:12
マルチスレッドプログラミングをしているのですが、たとえばtest()という関数を作ったとします。
スレッドAとスレッドBにおいて、同時にtest()という関数を呼び出したらどうなるのでしょうか?
普通にtest()という関数がそれぞれのスレッドで独立して並列処理されるだけでしょうか?
422デフォルトの名無しさん:2007/05/27(日) 10:11:15
>>421
基本はそう。内部に静的変数があるとぶつかるので要注意。
#その点では、標準関数のうちのいくつかも使えない。
423デフォルトの名無しさん:2007/05/27(日) 10:20:36
グローバル関数はいけませんよね?
424デフォルトの名無しさん:2007/05/27(日) 10:27:34
排他処理してればいい。
リエントラントとか再入可能という言葉も調べてね。
425421:2007/05/27(日) 11:47:21
つまり、その関数内において、静的変数やグローバル変数を使用している場合は
排他処理をする、それらの変数を使用していない場合は特に何もする必要はないという事ですかね?

あと、その関数自体を全て排他処理したらプログラムがフリーズしてしまいました。
なんか排他処理を色んなところで使ってると時々プログラムが応答なしになります。
排他処理を細かく分けてちょくちょくやれば正常に動いたり・・・
一体何が起きているのでしょうか?
426デフォルトの名無しさん:2007/05/27(日) 11:56:18
>>425
別のスレッドが使ってるスタックは当然ながら別のもの、といえばわかるかな。
複数のオブジェクトに同時に排他かけるとデッドロックを起こす場合がある。
427デフォルトの名無しさん:2007/05/27(日) 12:16:59
>>425
グローバル変数にしても静的変数にしても同じだけれど、単に衝突を避けるだけではダメかも知れないよ。
例えば、strtok()のように一回目の呼び出しでセットして二回目以降でそれを利用するような場合、
それを静的変数で実装していたら読み書きを排他するだけではどっちみちまともに動かない。
428デフォルトの名無しさん:2007/05/27(日) 16:48:10
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・・・のような不規則な変化をするのでしょうか?
429428:2007/05/27(日) 16:49:41
書き込んだ瞬間、「あ、16進数だからか」ということに気がつきました
何やってるんだオレは・・・
お騒がせしました
430デフォルトの名無しさん:2007/05/27(日) 16:59:38
>>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
これと排他制御を組み合わせるとどうなるか、考えるにはちょっとまだ俺の頭が足りないようです・・・
431デフォルトの名無しさん:2007/05/27(日) 17:18:48
>>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版を使うのが吉
432デフォルトの名無しさん:2007/05/27(日) 17:29:37
>>430
strtok()はマルチスレッドから使っちゃダメな例として挙げただけだよ。

>>428
ポインタ管理に癖のある環境もあるから、実際に意味のある変数を指さない値を代入するのは危険(或いは好ましくない)よ。
#0(所謂NULL)は例外。
たまたま0x8, 0x10, 0x18になっただけで、そこに何か置ける訳でもないし。
433デフォルトの名無しさん:2007/05/27(日) 17:31:57
>>431
つまり、構造的に排他処理の入れ子状態になってる時に起こるって事でしょうか?
先ほどの私の例だと特に問題はなく、

スレッドA
WaitForSingleObject(1)
  X++;
  WaitForSingleObject(2)
    Y++;
  ReleaseMutex(2)
ReleaseMutex(1)

スレッドB
WaitForSingleObject(2)
  Y++;
  WaitForSingleObject(1)
    X++;
  ReleaseMutex(1)
ReleaseMutex(2)

のような時にデッドロックが起こると・・・。もし違ったらごめんなさい。
だとしたら、私のプログラムでデッドロックが起こる事はないような気もしますが・・・。
Mutexは一つしか作成してないですし。ちょっとスレッドプールによるデッドロックというのも
見かけたので、そっちについても調べてみます。
434デフォルトの名無しさん:2007/05/27(日) 17:40:10
>>432
ポインタの先にアクセスしないのに何が危険なのか
ポインタ変数そのものはただの変数
435デフォルトの名無しさん:2007/05/27(日) 18:15:32
未定義動作だから何が起こるかはわからんが、そのくらいなら何も危険ではなかろう。
436デフォルトの名無しさん:2007/05/27(日) 18:20:32
ポインタ演算は配列(動的なのを含む)のアドレスに対してしか、
その有効性が保証されてないからな。
NULL に何を足しても NULL になる処理系があっても
文句はいえないんじゃないだろうかね?
まあ、そんな無駄な処理を入れることはないだろうけど。
437デフォルトの名無しさん:2007/05/27(日) 18:26:25
ってことはこういうコードは保証されていないって事になるのか
たまに使うことがあるのに… 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;
}
438デフォルトの名無しさん:2007/05/27(日) 18:33:27
offsetof は stddef.h にあるだろ?
何で自分で定義してるの?
439デフォルトの名無しさん:2007/05/27(日) 18:37:28
それは >>436 で言うところのポインタ演算じゃないと思うが、
それはそれで規約で許されてるかどうかは微妙だな。
GCC も、__builtin_offsetof って言うビルトイン関数(関数と言っていいのか微妙だが)を使って実装してる。
440電波高専生:2007/05/27(日) 18:51:32
すいません。課題を明日までに終わらせないといけなくて困ってます。
でも馬鹿なもんで全然わかりません。
そこで皆さんに教えてもらいたくてきますた。
マイクロI/Oカードをポケットコンピュータにつないで作るプログラム
なんですけど
「インターフェースボード上のディップスイッチの入力値(2進数)とは
逆の反転した値を表示するプログラムを作成せよ。」
って問題なんですけどわかりますか?
441デフォルトの名無しさん:2007/05/27(日) 18:55:14
できなきゃできなかったでいいじゃん。
分かりませんでしたー、で。
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);
}
443デフォルトの名無しさん:2007/05/27(日) 19:17:03
printf("SW date=%4d",a);

printf("SW date=%4d",~a);

但し a のビット数と pioget(); で取得できる有効なビット数の違いに注意
444デフォルトの名無しさん:2007/05/27(日) 19:29:48
有効なビット数が決まってたら xor だろ。
445デフォルトの名無しさん:2007/05/27(日) 19:37:25
>>443
それだと負数が出て問題ありでしょ?
446デフォルトの名無しさん:2007/05/27(日) 19:41:49
そもそも、d や u じゃなくて x で出力した方がいいとかはないのかな。
447デフォルトの名無しさん:2007/05/27(日) 19:47:42
>>439
ろくに規約も読んでないくせに
適当な事を言わないでくれますか

初心者を騙してるというより
自分が知らないように見える
448デフォルトの名無しさん:2007/05/27(日) 19:58:08
正しい事知ってるなら、それをここで言えばいいのにね。
何で文句だけ言って後は放置なのか理解できない。
449デフォルトの名無しさん:2007/05/27(日) 19:59:17
いや、知らないし
450デフォルトの名無しさん:2007/05/27(日) 21:14:54
入力された文字が、半角英数字か日本語か調べたいのですが、そのような関数はないのでしょうか?
文字が入力されるたびに、入力文字のバイト数を測るにしても、
半角カタカナなどを入力された場合、1バイトになるためにその方法は使えません。
何かいい方法はないでしょうか?
451デフォルトの名無しさん:2007/05/27(日) 21:18:01
>>450
それって半角英数字以外は(記号なんかも含めて)全部日本語扱いになるの?
452デフォルトの名無しさん:2007/05/27(日) 21:22:07
int nlz(unsigned k)
{
    double xx = (double) k + 0.5;
    int n = 1054 - (*((unsigned *) &xx + LE) >> 20);
    return n;
}

先頭の 0 の個数を数えるルーチンらしいけど、
このポインタ演算の部分が規約違反なのが原因で、
ちゃんと動作しないことがあるらしいね。
共用体使って書いても規約違反らしいが。
453デフォルトの名無しさん:2007/05/27(日) 21:22:24
>>451
IMEを使って変換して入力するようなものは全て日本語とします。
要は変換の作業がある文字と、そうでない文字に分けたいです。

半角英数字記号 -> abcd...xyz, AB...XYZ, 0123...89, @+:=^|\...etc
日本語 -> あいう〜わをん、0123…89、アイウ…ワオン、@+とか色々
454デフォルトの名無しさん:2007/05/27(日) 21:24:28
>>452
規約規約って気持ち悪いな。
規格言え馬鹿
455デフォルトの名無しさん:2007/05/27(日) 21:27:41
ごめん。間違えた。
456デフォルトの名無しさん:2007/05/27(日) 21:28:55
>>453
それじゃ定義が曖昧だな。
文字コードがいくらからいくらまでが、と具体的によろ。
457デフォルトの名無しさん:2007/05/27(日) 21:30:21
>>453
よくわからないからテキトーに答えるけど、
>文字が入力されるたびに、入力文字のバイト数を測るにしても、
>半角カタカナなどを入力された場合、1バイトになるためにその方法は使えません。
バイト数測った後、半角カタカナかどうか判定するんじゃ駄目なの?
458デフォルトの名無しさん:2007/05/27(日) 21:35:24
バイト数とかより、普通は文字コードの範囲で見ないか?
459デフォルトの名無しさん:2007/05/27(日) 22:07:42
エラーメッセージがイミフ
/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
ソースコード

プログラムのエラーなの?なんでアセンブラから?
460デフォルトの名無しさん:2007/05/27(日) 22:13:43
$ って何?
461デフォルトの名無しさん:2007/05/27(日) 22:14:26
え?
462デフォルトの名無しさん:2007/05/27(日) 22:15:47
解決しますた。
すまそ
463デフォルトの名無しさん:2007/05/27(日) 23:56:23
>>452
frexpを使ってできそうな気がする
464デフォルトの名無しさん:2007/05/28(月) 06:27:18
というか、半角カナはカナロックすれば直接入力できたとおもったが。
465デフォルトの名無しさん:2007/05/28(月) 07:54:01
>>464
>>453に挙がってる文字は全て直接入力できるだろ。
466デフォルトの名無しさん:2007/05/28(月) 08:34:50
>>465
どうやって?
467デフォルトの名無しさん:2007/05/28(月) 17:01:32
同フォルダ内の*.cファイルだけを拾いたいのだけど、
どうやればいいのか、よくわからないから教えて欲しい。

lsコマンドを勉強したけど、イマイチなわかり具合だ。
468デフォルトの名無しさん:2007/05/28(月) 17:03:37
ls *.c
469デフォルトの名無しさん:2007/05/28(月) 17:05:56
既存のものを使うわけじゃなくて、それを作りたいんだ。 すまない
470デフォルトの名無しさん:2007/05/28(月) 17:06:33
正規表現でおk
471デフォルトの名無しさん:2007/05/28(月) 17:15:45
>>470
ワイルドカードは正規表現とは大分違う。

>>469
正規表現へのトランスレータを書くか、自前で全部書くか。
既存のものを参考にするのが一番早いと思うが。
472デフォルトの名無しさん:2007/05/28(月) 17:19:54
>>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;
}
473デフォルトの名無しさん:2007/05/28(月) 18:28:19
ワイルドカードなんてそんなに難しいことはないぜよ。

a.b.c と a.*.c のマッチングを例にすると、
まず a. は普通にマッチして、次に * にぶつかる。
ここで、残りの b.c と .c のマッチングを再帰で行う。
まあ失敗するから、次は最初の1つを除いた .c と .c のマッチングをまた再帰で行う。
ここでマッチングに成功するので、マッチする、と。

再帰してるのは、ワイルドカードが複数あった場合にも対処できるから。
474デフォルトの名無しさん:2007/05/28(月) 19:39:11
>>472
感動すた
475デフォルトの名無しさん:2007/05/28(月) 19:41:16
漏れも ls -r * に相当するものを(シェルや既存コマンドに頼らずにglibc, gccだけで)作りたいのですがわかりません><

*の部分はシェルが展開しているようなのですが、シェルのソースコードを読めということでしょうか?
となるとOSによってかなり違いますよね..
476デフォルトの名無しさん:2007/05/28(月) 19:43:59
dosのwildcardとshのwildcardは随分違うもんねぇ。
477467:2007/05/28(月) 20:11:04
opendirとreaddir使って、まずlsを作って、
readdirのd_nameに溜め込まれたものから
strstrで".c"を探して、作りたい物が一応出来た。
まぁ、これでいいやw
478475:2007/05/28(月) 20:16:25
>>477
なるほど。サンクスです。オレもそれでいいやw
やってみます
479デフォルトの名無しさん:2007/05/28(月) 20:33:32
"echo *.c"のほうがよくね?
480デフォルトの名無しさん:2007/05/28(月) 20:36:06
$ echo *.c
*.c
481デフォルトの名無しさん:2007/05/28(月) 20:50:37
そんなshellが現存するとして、
$ls *.c
ls: *.c: No such file or directory
$ls *.c
コマンドまたはファイル名が正しくありません
のどちらかになるのがオチだろうに。
482デフォルトの名無しさん:2007/05/28(月) 20:57:00
それはない
483デフォルトの名無しさん:2007/05/28(月) 21:34:06
bash だとファイルが無いときはマッチングは無視されて
そのままの文字列で渡されるお。
484デフォルトの名無しさん:2007/05/28(月) 21:58:30
unix系だとreaddirとfnmatch
WindowsならFindFirstFileにそのまま渡す
それだけで充分
485デフォルトの名無しさん:2007/05/28(月) 22:03:31
ls **/*c
ls ~/*c
486デフォルトの名無しさん:2007/05/29(火) 01:22:54
すみません。
UNIXでのCnoコンパイル/リンク時のオプションについて
ここで聞いてもよいでしょうか?
487デフォルトの名無しさん:2007/05/29(火) 01:27:43
ダメです。
488デフォルトの名無しさん:2007/05/29(火) 01:28:34
Cのコンパイル/リンク・・・の typo か?
使ってるコンパイラのスレで聞いた方が早いと思うぞ。
489デフォルトの名無しさん:2007/05/29(火) 01:35:25
S_ISDIR と S_ISLNK が同時に真になる事ってあるのでしょうか
490デフォルトの名無しさん:2007/05/29(火) 01:39:33
あるけど、何でここで訊くの?
491デフォルトの名無しさん:2007/05/29(火) 11:13:13
型についてですが、71ビットまでを乗算させた結果を画面に出力したいのですが
ビットが足りないため0になってしまいますInt型とlong型で足りないのですが
71ビットまでの乗算が出来る型はあるのでしょうか?お願いします
492デフォルトの名無しさん:2007/05/29(火) 11:15:33
連投すいません、コンパイラは: Borland C++ BuilderX Personal でした
493デフォルトの名無しさん:2007/05/29(火) 11:25:25
多倍長計算でぐぐれ
494デフォルトの名無しさん:2007/05/29(火) 11:41:57
>>493
31ビットが限界でした・・・。ここまでこれたので手動で頑張ってみます
引き続き多倍長計算を参考に色々と弄ってみます。有難うございました!
495デフォルトの名無しさん:2007/05/29(火) 12:26:15
>>494
普通のCコンパイラならlong doubleで80ビット実数型が使える。
指数ビットがあるから精度は64ビットだけどそれでも足りない?
496デフォルトの名無しさん:2007/05/29(火) 13:12:29
>>495
60bit以上まで表示出来ました!ここまで計算出来るなら嬉しいです
計算量減って助かりました有難うございます!
497デフォルトの名無しさん:2007/05/29(火) 13:18:52
計算結果が0になるって事は元々下位のビットが0ばかりなの?
498デフォルトの名無しさん:2007/05/29(火) 17:41:32
64 ビットの精度でいいんなら、
64 ビットの整数型を使えば。
ただ、BCC にあるのかどうかは知らんが。
499デフォルトの名無しさん:2007/05/29(火) 17:47:04
71ビットはどこから出てきたんだ
500デフォルトの名無しさん:2007/05/29(火) 18:11:49
俺も気になる
501デフォルトの名無しさん:2007/05/29(火) 18:56:21
厨房ですいません。
C言語を独学で学びたいのですが、最初に学び始める本で、オススメはありますか?
502デフォルトの名無しさん:2007/05/29(火) 19:00:12
このご時勢にcから入ったら、並みの人間ではモチベーションが続かないと思う。
503デフォルトの名無しさん:2007/05/29(火) 19:03:03
>>501
C#がお勧め
504デフォルトの名無しさん:2007/05/29(火) 20:01:20
>>501
独学なんだから他人に頼るな
505デフォルトの名無しさん:2007/05/29(火) 20:07:33
C♯とC++は同じですか?
506デフォルトの名無しさん:2007/05/29(火) 20:10:21
まるっきり別物

>>501
推薦図書スレ池
507デフォルトの名無しさん:2007/05/29(火) 20:16:08
>>505
C#はJAVAに近い(J#あるけど)
C++はC言語の拡張(厳密言うと違うが…)
508デフォルトの名無しさん:2007/05/29(火) 20:25:27
>>505
少なくともC言語とは違います。
>>1 yondene
509デフォルトの名無しさん:2007/05/29(火) 20:46:13
C++は本代がかなりかかるからお勧めしない
510垣内:2007/05/30(水) 15:57:38
夫が浮気してるみたいなんですが。
511デフォルトの名無しさん:2007/05/30(水) 17:11:19
>>510
あなたはどちらの言語様でしょうか?
512デフォルトの名無しさん:2007/05/30(水) 17:37:00
   / ̄ ̄\  ← 夫
 /   _ノ  \
 |   ( ●)(●)  <おっと、それ以上は言うなよ…
. |     (__人__)____
  |     ` ⌒/ ─' 'ー\
.  |       /( ○)  (○)\
.  ヽ     /  ⌒(n_人__)⌒ \
   ヽ   |、    (  ヨ    | ← >>510
   /    `ー─−  厂   /
   |   、 _   __,,/     \
513デフォルトの名無しさん:2007/05/30(水) 17:44:15
>>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;
}

515デフォルトの名無しさん:2007/05/30(水) 21:28:06
>>514
なんでそんな明らかにコンパイル出来ないソースを書くかなぁ・・・
516デフォルトの名無しさん:2007/05/30(水) 21:30:10
>>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;
}
517デフォルトの名無しさん:2007/05/30(水) 21:33:07
>>514
つか、宿題スレにも!
518デフォルトの名無しさん:2007/05/30(水) 22:00:07
ジョブショップ型生産のプログラムだれか作って!!
519デフォルトの名無しさん:2007/05/30(水) 22:06:59
>>518
スレ違い
520デフォルトの名無しさん:2007/05/30(水) 22:10:02
教えてください

aの値が10を超えたら0にしようと思ったのですが
if (a < 10) a = 0;
コレじゃだめなんですか?

コンパイラはVC2003でつ

初心者すぎますかね?
521デフォルトの名無しさん:2007/05/30(水) 22:14:32
a > 10
522デフォルトの名無しさん:2007/05/30(水) 22:15:12
>>520
if (a < 10) だとaが10未満の場合だぞ
523デフォルトの名無しさん:2007/05/30(水) 22:20:14
カワイイな
524デフォルトの名無しさん:2007/05/30(水) 22:22:20
>>520
if(10<=a)a=0;
525デフォルトの名無しさん:2007/05/30(水) 22:36:57
>>513の審議は終わったかね?
526デフォルトの名無しさん:2007/05/30(水) 22:40:11
5時間経過…
    ∧,,∧  ∧,,∧
 ∧ (´-ω-) (-ω-`) ∧∧
( ´-ω) U) ( つと ノ(ω-` )  zzz...
| U (  ´-) (-`  ) と ノ
 u-u (l    ) (   ノu-u
     `u-u'. `u-u'
527デフォルトの名無しさん:2007/05/30(水) 22:41:53
>>526 いや、寝てないでとっとと審議で真偽を出さんかい、ゴルァ!
528デフォルトの名無しさん:2007/05/30(水) 22:44:09
>>527のギャグについて審議中】
    ∧,,∧  ∧,,∧
 ∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) U) ( つと ノ(ω・` )
| U (  ´・) (・`  ) と ノ
 u-u (l    ) (   ノu-u
     `u-u'. `u-u'
529デフォルトの名無しさん:2007/05/30(水) 22:44:48
【審議中】
 ババ        バババ  ババババ
    バババ ∧_,∧  ババ ∧_∧ バババ
  ∧_∧バ( ´・ω・∧_∧ (・ω・` ) ∧_∧
 (´・ω・)=つ≡つ);;)ω(;;(⊂≡⊂=(・ω・`)
 (っ ≡つ=つ  (っ>527⊂)  ⊂=⊂≡ ⊂)
 /   ) バ∧_∧| x |∧_∧ バ (   \
 ( / ̄∪バ (  ´・) ∪ ̄∪(・`  )ババ ∪ ̄\ )
  ババババ/    )  バババ (   \ ババババ
 バババ  `u-u'. バババ ババ `u-u'
530デフォルトの名無しさん:2007/05/30(水) 22:46:27
審議というかリン(ry
531デフォルトの名無しさん:2007/05/30(水) 22:47:14
ぬぬっ、心技一体でお前らの攻撃をすべてかわしてやった。ちゃんと審議せいや?
532デフォルトの名無しさん:2007/05/30(水) 22:48:35
return 0;
533デフォルトの名無しさん:2007/05/30(水) 22:58:15
ワロタ
534520: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;
}
537デフォルトの名無しさん:2007/05/31(木) 00:47:05
reurn
538デフォルトの名無しさん:2007/05/31(木) 00:49:49
re-urn ?
539デフォルトの名無しさん:2007/05/31(木) 00:50:51
f-ck
540デフォルトの名無しさん:2007/05/31(木) 00:51:48
sh*t
541デフォルトの名無しさん:2007/05/31(木) 01:02:47
sexピー
542デフォルトの名無しさん:2007/05/31(木) 01:04:05
柿ピー
543デフォルトの名無しさん:2007/05/31(木) 03:06:03
文字列”あ”を16進数に戻したいんだけどどうやるの?

char str[] = "あ";
unsigned int c = str[0];
?????
544デフォルトの名無しさん:2007/05/31(木) 03:18:41
>>543
printf() とか sprintf() とか
545デフォルトの名無しさん:2007/05/31(木) 03:30:46
ふーむ、ありがと。
546デフォルトの名無しさん:2007/05/31(木) 04:08:29
うーん、文字としての16進数じゃなくて、数値としても16進数が欲しいのです。
”あ”が1バイト文字なのか2バイト文字なのか判定したいのです。
547デフォルトの名無しさん:2007/05/31(木) 04:21:13
>>546
sizeof(str)が3なら2バイト文字だが、やりたいのはきっとそういうこ
とじゃないよね。

strにどんな文字コードで文字が入っているか(Shift_JISとかUTF-8とか)
はわかるのかい?

548デフォルトの名無しさん:2007/05/31(木) 04:37:02
えーShift-JISです。1バイト目が0x81からどこそこまでは2バイト文字だっていう判定がやりたいのです。
549デフォルトの名無しさん:2007/05/31(木) 05:05:56
>>548
であれば、

unsigned char c = str[0];
if (0x81 <= c && c <= 0x9f || 0xe0 <= c && c <= 0xfc) {
...
でいい。

ismbblead() とか IsDBCSLeadByte() が使えるなら、そっちを使ったほ
うがいいです。
550デフォルトの名無しさん:2007/05/31(木) 05:28:15
>>549
ありがとう。なんか難しく考えすぎてました。
APIもあるんだ。
551デフォルトの名無しさん:2007/05/31(木) 11:55:10
どうせなら ANSI 標準の mblen() を使っとけ。
552デフォルトの名無しさん:2007/05/31(木) 22:00:15
以下はpをどの様に処理するのでしょうか?
よろしくお願いします。


#define pletohs(p) ((short) \
((short)*((const char *)(p)+1)<<8| \
(short)*((const char *)(p)+0)<<0))
553デフォルトの名無しさん:2007/05/31(木) 22:08:30
関数で書くなら

short pletohs(const char *p) {
return (short)p[1] << 8 | (short)p[0];
}

みたいなもんか。
その環境のバイトオーダに関係なく
リトルエンディアンのshort値を取得したいんじゃないかね。
p は const unsigned char じゃないとヤバいと思うが。
554デフォルトの名無しさん:2007/05/31(木) 22:16:35
名前からしてが
ポインタ リトルエンディアン->ホストエンディアン short型
555552:2007/05/31(木) 22:20:59
>553,554

なるほど、ありがとうございます。助かりました。
556デフォルトの名無しさん:2007/05/31(木) 22:22:57
質問です。
文字列の宣言には
char *msg = "i love you";
char msg[] = "i hate you";
と2種類の方法があることを習ってしばらく経ちました。
仕組み自体は大体わかってます。
自分的には、大雑把な特徴としては
char *msgは、原則書き換え不可
char msg[]は書き換えがラクチン、というイメージがあるのですが
そうするとchar *msgの方は存在意義が無くないでしょうか?
char *msgと書かれた部分は別にchar msg[]では替えが聞くのでは?
ただそれなのにいろんな本を読めばchar *msgという宣言は腐るほどあります。
ポインタで宣言するメリットって何なんでしょうか?
557デフォルトの名無しさん:2007/05/31(木) 22:24:31
>>556
while(*msg)putchar(*msg++);ができるあたり
558デフォルトの名無しさん:2007/05/31(木) 22:27:41
>ポインタで宣言するメリットって何なんでしょうか?
ポインタで充分なときに余計な配列を確保しない。
#詳細はお風呂上りにでも♪
559デフォルトの名無しさん:2007/05/31(木) 22:33:53
static const char msg[]="i like you";
の方が最適化的に良い、ってのは誰の話だっけか
560デフォルトの名無しさん:2007/05/31(木) 22:58:00
>>557-559
どうもです。やっぱり「エレガントな記法ができる」「無駄が省ける」程度の話であって
本質的に違いがあるわけではないのですかね。。。
>>558
おながいしまつ。期待してます。
561デフォルトの名無しさん:2007/05/31(木) 23:00:30
本質的に違う。

char *msg = "i love you";

はどこかにある文字列リテラル(静的)へのアドレスが msg に代入される。

char msg[] = "i hate you";

は msg という配列変数を作って、その文字列で初期化する。
msg が静的でないなら、毎回コピーが発生する。
562デフォルトの名無しさん:2007/06/01(金) 00:09:12
キーボードから1文字入力し、入力された文字が小文字なら大文字に、大文字なら小文字に変換するプログラムはどうやって作成するんでしょうか?

((中略))
if(64>a);
{
putchar(a-32);
}

else if(32>a)
{
putchar(a+32);


という式を作ってみましたが、根本的に何かが違うみたいです
563デフォルトの名無しさん:2007/06/01(金) 00:13:52
'A' <= a && a <= 'Z'
'a' <= a && a <= 'z'
564デフォルトの名無しさん:2007/06/01(金) 00:19:07
そこでisupper/islowerとtoupper/tolowerと言われ
まんまと罠に嵌るのが目に見える
565デフォルトの名無しさん:2007/06/01(金) 01:18:53
〜の条件を満たしていないときは、入力文字をそのまま表示する

はどのような感じでプログラムを組めばいいんでしょうか
566デフォルトの名無しさん:2007/06/01(金) 01:19:54
if (!条件){
 表示(入力した文字);
}
567デフォルトの名無しさん:2007/06/01(金) 01:23:49
場合によっては

if(条件) {
 /* 表示しない */
} else {
 表示(文字);
}

の方が読みやすい事もある。
好みの問題だが。

条件をド・モルガンの法則で逆転させるのは
条件が読みづらくなることがあるので、あまり勧めない。
>>566 みたいに分かりやすい条件をベースにして、
! で条件をひっくり返すのがいい。
568デフォルトの名無しさん:2007/06/01(金) 01:26:38
#define unless(pred) if(!(pred))
569デフォルトの名無しさん:2007/06/01(金) 01:28:38
if(条件 == 満たしていない){
 表示(文字);
}
570デフォルトの名無しさん:2007/06/01(金) 01:31:00
>>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) で終了しました。
と表示されます。

このエラーを改善するためにはどのようにすればいいでしょうか?
572デフォルトの名無しさん:2007/06/01(金) 08:52:26
>>571
まずソースを貼れ
573デフォルトの名無しさん:2007/06/01(金) 12:27:42
>>571
エラーには大きく分けて2通りある。
1つは、「ビルド時に発生するエラー」。この場合は、文法の誤り等がある。さらにコンパイルエラーとリンクエラーとに分かれる。
もう1つは、「実行時に発生するエラー」。この場合、実行時にOS上でありえない動作をしたらエラーが発生する(例外が発生するという)。
例えばプログラム実行時に0で除算したり、確保していない領域にたいして値を書き込もうとすると発生する。

この場合、実行時にエラーが発生している。
デバッグモードで1ステップずつ実行して、定義した変数の動きを追いかけたら?
574デフォルトの名無しさん:2007/06/01(金) 12:31:53
MBCS系の is〜 関数に UNICODE 文字 渡したんじゃねーの?
575デフォルトの名無しさん:2007/06/01(金) 12:43:16
入門篇なのに何言ってるか分からないぜ
576デフォルトの名無しさん:2007/06/01(金) 12:49:27
Expression:(unsigned)(c + 1) <= 256

この関数に256以上の数値を渡したってことだべ。
実際にアサーション起こしたところで中断選んで、
デバッグのウィンドウの呼び出し履歴から、
自分で書いたソースの部分をダブルクリックか、右クリック+ソースコードへ移動、で
クイックウォッチあたりで変数に何が入ってるか見てみよう。
577576:2007/06/01(金) 12:53:00
あ、中断ってのは、そのエラーのダイアログで[再試行]押してから[中断]な
578デフォルトの名無しさん:2007/06/01(金) 14:12:10
C単文を書け。xのy乗を計算するC言語プログラム 反復にはwhile構造でお願いします。

誰か教えてくださいm(_ _)m
579デフォルトの名無しさん:2007/06/01(金) 14:19:28
>>578
宿題は宿題スレへ。
580デフォルトの名無しさん:2007/06/02(土) 16:25:14
printf("%d % %d=%d\n",a%b);

という風に%で計算したいのですが、いざ表示すると
a % %d =%d
になってしまうのですが、改善方法はないでしょうか
581デフォルトの名無しさん:2007/06/02(土) 16:32:36
そもそも引数がおかしいんじゃね?
582デフォルトの名無しさん:2007/06/02(土) 16:32:37
日本語でOK

printf("%d % %d=%d\n", a, b, a%b);
こういうことかい?
583デフォルトの名無しさん:2007/06/02(土) 16:33:40
printf("%d %% %d=%d\n", a, b, a%b);
584デフォルトの名無しさん:2007/06/02(土) 16:34:31
>>583
正解
585デフォルトの名無しさん:2007/06/02(土) 16:36:34
>>584
偉そう
586デフォルトの名無しさん:2007/06/02(土) 16:39:59
>>585
ば、ばか、本当に偉い人だったらどうするんだ
587デフォルトの名無しさん:2007/06/02(土) 16:51:53
>>582
バカ
>>584
正解
588デフォルトの名無しさん:2007/06/02(土) 16:55:10
ば、ばか、本当にエロイ人だったらどうするんだ
589デフォルトの名無しさん:2007/06/02(土) 17:06:32
うほっいいおt(ry
590デフォルトの名無しさん:2007/06/03(日) 18:55:18
>>580
を意訳してみようと努力すると、
printf("%d %% %d=%d\n"a,b,a*b/100);
とか。
591デフォルトの名無しさん:2007/06/03(日) 21:23:37
>>590
どう意訳するとそうなるんだ?
しかも等価式でなくなるし
592デフォルトの名無しさん:2007/06/03(日) 21:28:15
意味不明
593デフォルトの名無しさん:2007/06/03(日) 23:28:35
>>590
きっと、%使う→百分率→*100すりゃいいんでね?とかじゃねぇの?
よくわかんねぇけどw
594デフォルトの名無しさん:2007/06/03(日) 23:37:23
>>593
*100でもねぇし、わがんねw
逝ってきます
595デフォルトの名無しさん:2007/06/03(日) 23:38:22
アホスwwwwwwwwww
596590:2007/06/04(月) 00:48:13
>>580
> という風に%で計算したい
って有るから、なんとなく
> printf("%d % %d=%d\n",a%b);
は「a の b% は ???」みたいな解釈です。
597デフォルトの名無しさん:2007/06/04(月) 00:49:32
>>596
偽者乙
598デフォルトの名無しさん:2007/06/04(月) 07:52:51
Hello Worldからもう一度どうぞ
599デフォルトの名無しさん:2007/06/04(月) 21:00:48
c言語関連のフローチャート(アルゴリズム)の勉強をしたいと思っているのですが
先輩方が使っているお勧めの参考書とかありますか?
600デフォルトの名無しさん:2007/06/04(月) 21:02:35
フローチャートを勉強したいの?
601デフォルトの名無しさん:2007/06/04(月) 21:07:37
はい
602デフォルトの名無しさん:2007/06/04(月) 21:08:26
フローチャートを勉強したいの?
603クマーッ!!:2007/06/04(月) 21:09:54
フローチャート≠アルゴリズム
604デフォルトの名無しさん:2007/06/04(月) 21:10:29
アルゴリズムとフローチャートは別物だろ。
605デフォルトの名無しさん:2007/06/04(月) 21:14:03
そうですかぁ、なんか勘違いしてたみたいです
606デフォルトの名無しさん:2007/06/04(月) 21:17:48
アルゴリズムを勉強したいの?
607デフォルトの名無しさん:2007/06/04(月) 21:20:42
はい
608デフォルトの名無しさん:2007/06/04(月) 21:24:48
フローチャートとアルゴリズムを勉強したいの?
609デフォルトの名無しさん:2007/06/04(月) 21:27:03
フローチャートです
610デフォルトの名無しさん:2007/06/04(月) 21:27:46
はっきり汁
611デフォルトの名無しさん:2007/06/04(月) 21:29:00
すみません、やっぱアルゴリズムです
612デフォルトの名無しさん:2007/06/04(月) 21:29:36
ttp://www.tecmo.co.jp/product/argus/
え?ぜんぜん違う?気にするなYO!
613デフォルトの名無しさん:2007/06/04(月) 21:59:48
>>607>>609
は俺の書き込みじゃないよ〜
614デフォルトの名無しさん:2007/06/04(月) 22:01:26
>>611>>613も騙りです
フローチャートについて詳しく書かれている参考書を教えてください
615デフォルトの名無しさん:2007/06/04(月) 22:08:43
最初からコテつけとけばよかったな〜
まぁ、いいや
616デフォルトの名無しさん:2007/06/04(月) 22:08:45
アウロリズニにすていくわいくsかれれているサイトを教えて下さい。
617デフォルトの名無しさん:2007/06/04(月) 22:24:22
アルゴリズム体操を研究してるサイトってありませんか?
618デフォルトの名無しさん:2007/06/04(月) 22:31:12
619デフォルトの名無しさん:2007/06/04(月) 22:31:31
>617
NHKへようこそ
620デフォルトの名無しさん:2007/06/07(木) 08:41:50
ピンポンパン
621デフォルトの名無しさん:2007/06/07(木) 13:34:32
配列で変数宣言のとき

int tango[i];
int i = 0;

ってできますか?
配列を使って単語の長さを調べてヒストグラムにするプログラムを作らなきゃならないんですけど
単語の長さがあらかじめ決まってないので、入力された単語の長さで配列の長さを調整できるようにしたいんです
622デフォルトの名無しさん:2007/06/07(木) 13:41:14
C99 なら条件付きで可。
そうでないなら malloc。
623デフォルトの名無しさん:2007/06/07(木) 14:44:12
624デフォルトの名無しさん:2007/06/07(木) 16:49:19
初めまして、質問があるので宜しくお願いします。
C言語之参考書を買ったのですがハードウェアの事が書いてあり疑問があります
記号や文字列と連動しているので、ハード板でなく此処で質問させて戴きます
どうして、1KBが1024B、1MBが1024KB等と
中途半端に1024なのでしょうか?どうして、10の〜上が、24と付くのでしょうか?
625デフォルトの名無しさん:2007/06/07(木) 16:51:37
1024は中途半端じゃないから
626デフォルトの名無しさん:2007/06/07(木) 16:52:58
メモリとかの記憶領域は 2の累乗で増えてくから
627デフォルトの名無しさん:2007/06/07(木) 16:52:59
>>624
2^(10n)
628デフォルトの名無しさん:2007/06/07(木) 16:57:14
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;
}
629デフォルトの名無しさん:2007/06/07(木) 17:01:01
while(t>=0)
630デフォルトの名無しさん:2007/06/07(木) 17:07:48
>>628
無限ループ
631デフォルトの名無しさん:2007/06/07(木) 17:08:01
最初のforループを抜けた時の i の値は10
だから、最初にいきなりbinary[10] にアクセスしてる
あと>>629の部分で無限ループ
632624:2007/06/07(木) 17:11:36
皆さん、ありがとうございます、うーん難しいです
どうして2^(10n)、2の階上が(10n)なのでしょうか?
実際は10×10…でなく、2×2…なんでしょうか?
だとしたら、どうして10の〜上と書いてあるのですかね?
633デフォルトの名無しさん:2007/06/07(木) 17:13:42
階乗じゃねえだろ
634デフォルトの名無しさん:2007/06/07(木) 17:15:00
コンピュータは二進数がベースだから。人間に分かりやすいとか関係ないの。
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
はコンピュータ・プログラミングの世界でよく出てくるから暗記しとけ。
635デフォルトの名無しさん:2007/06/07(木) 17:16:42
まあ1024はたまたま2進数の1024と10進数の1000が近かったから
そのままキロで使ってるだけだけどね。
636628: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デフォルトの名無しさん:2007/06/07(木) 17:18:33
>>636
(0>=0)は真か偽か
638デフォルトの名無しさん:2007/06/07(木) 17:19:50
>>637
あ、そうか(汗
すみませんでした
恥ずかしい
0以下にはならないんですよね
ややっこしい
639デフォルトの名無しさん:2007/06/07(木) 17:20:13
>636
forループが終了するのはi<=9を満たさないとき、つまりi=10になったときだからなんにも変わってないぞ。
640デフォルトの名無しさん:2007/06/07(木) 17:22:46
>>639
本当だ・・・
for(i=0;i<=9;i++)
binary[i-1]=0;
に変更

難しいなあ
641デフォルトの名無しさん:2007/06/07(木) 17:28:10
binary[i] = t % 2; で常に代入する
while 抜けた後の i は、次に判断するであろう場所を指す

だから全体を 0 で初期化しなくてもなんとかなりそうだとは思う
642デフォルトの名無しさん:2007/06/07(木) 17:28:12
あ、違うわ
i=9にしないと駄目か
全然だめだ
643デフォルトの名無しさん:2007/06/07(木) 17:29:23
>>624
自分でも「K」と大文字で書いているじゃないか。
それは「killo (×1000)」ではない。
644デフォルトの名無しさん:2007/06/07(木) 17:30:59
二進接頭辞も使ってあげてください
645デフォルトの名無しさん:2007/06/07(木) 17:31:19
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;
}
646デフォルトの名無しさん:2007/06/07(木) 17:47:45
>>645
なんてエレガントな・・・
647デフォルトの名無しさん:2007/06/07(木) 17:50:54
a+b<0 のときに変な出力されるけどね
6481/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;
}
6492/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行毎にでも)とかデバッガを使うとかで、
変数の値の変化や処理の流れが自分の思っている通りなのかを確認しましょう。
これを「デバッグ」と言います。
デバッグなしでプログラム作るなんて不可能だよ。


こういうことって、初心者向けの本やサイトに書いてないものなの??
651デフォルトの名無しさん:2007/06/07(木) 19:30:47
書いてなくても自然に思い付くな
652デフォルトの名無しさん:2007/06/07(木) 19:34:32
>>648-649
int 配列に一旦変換するのは必須なわけ?
直接出力しちゃダメなの?
653デフォルトの名無しさん:2007/06/07(木) 19:42:47
>>650
デバッガは一応VSのを使ってます
一発目だとエラーでたり変な値出たりして大変だったので
ウォッチ式や変数ビューア、エディットコンティニューとか使って何とか書き直しました
これら無しじゃ多分完成してません
最初は

>>652
出力方法を変えたい時や、IDEの機能を使ってのデバッグの簡単化の為に別関数にしただけです
そういう意図で分けるのってよくないんでしょうか?
654デフォルトの名無しさん:2007/06/07(木) 20:20:05
>>653
ん、まあ別にいいとは思うけど。

符号ビットをわざわざ処理してるのは、
負の値が2の補数形式でない場合でも、
2の補数形式として出力するようにするため?

あと、

if (dec & (2 << (i-1) )) bin[i] = 1;



if (dec & (1 << i)) bin[i] = 1;

にしない理由はあるの?

あと出力時に文字列を生成してから出力してるけど、
putchar で随時出力しないのはデバッガ云々のため?
655デフォルトの名無しさん:2007/06/07(木) 20:39:32
>>654
>符号ビットをわざわざ処理してるのは
符号と、絶対値に問題を分けたかったからです
あと2の補数形式による表現を忘れたのも原因です(汗

>if (dec & (2 << (i-1) )) bin[i] = 1;
>if (dec & (1 << i)) bin[i] = 1;
これは完璧に思いつきませんでした
どうにか-1を消す方法が無いかと考えたんですが、
結局思いつかなくてそのままにしてました

>putchar で随時出力しないのはデバッガ云々のため?
これも切り分けですかね
一緒に考えるのも変わらない気がするんですが
個人的に分けて考える方がやりやすいんで、その癖です
656デフォルトの名無しさん:2007/06/07(木) 21:19:21
そういや >>648 とした場合は、
逆に2の補数形式「じゃない」方の形式になるんだったわ。
間違えたっす。
657デフォルトの名無しさん:2007/06/07(木) 21:22:15
if 文の条件には、ちゃんと条件式を書いた方がいい、と俺は思う。

if ((dec & (1 << i)) != 0)

みたいに。
ま、文法上は問題ないんだけどね。

まあ、それ以前に

bin[i] = ((dec & (1 << i)) != 0);

とすれば if 文要らないんだけど。
658デフォルトの名無しさん:2007/06/07(木) 23:25:31
短いプログラムならデバッガ使うまでもなく脳内トレースで十分なんだが。
659デフォルトの名無しさん:2007/06/07(木) 23:34:37
脳内トレースができるなら、そもそもこんなとこで質問なんかしないだろ。
660デフォルトの名無しさん:2007/06/07(木) 23:51:03
自作関数について質問なんですが
文法は

型 自作関数名(型 変数名 、型 変数名)

となってますが、自作に渡す仮引数が一つしかない場合は

型 自作関数名(型 変数名)

でもかまわないんでしょうか?
661デフォルトの名無しさん:2007/06/07(木) 23:52:12
かまわん
662デフォルトの名無しさん:2007/06/07(木) 23:55:22
三つなら
型 自作関数名(型 変数名, 型 変数名, 型 変数名)
だぞ
663デフォルトの名無しさん:2007/06/07(木) 23:56:34
ここで訊く前にコンパイルしてみようという発想はないのかね?
664デフォルトの名無しさん:2007/06/08(金) 00:16:32
作ってからダメと言われたら無駄になると思ったんで・・・

例題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を自作関数を使って計算させろという問題なんですが 下に続く
665デフォルトの名無しさん:2007/06/08(金) 00:19:37
>作ってからダメと言われたら無駄になると思ったんで・・・
こういう考えじゃ上達しないよ。
ダメと言われてもいいからとりあえずやってみる。
それが上達への近道。
666デフォルトの名無しさん:2007/06/08(金) 00:19:39
試作って言葉を知らんのか?
適当な関数作って、試してみればよかろう。

void test1( int a, int b) {
puts("test1");
}
void test2( int a) {
puts("test2");
}

これを書くのと、ココに書き込むの。どっちが早い?
(慣れてないと、こっちのほうが早いのかな?)
667デフォルトの名無しさん:2007/06/08(金) 00:20:06
#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 一次配列 くらいです
668デフォルトの名無しさん:2007/06/08(金) 00:21:43
>>665
>>666
そうですね
まだ自作関数の理解が不十分だったんで聞いちゃいました
でももうなんとなく理解できました
669デフォルトの名無しさん:2007/06/08(金) 00:24:43
アドバイス。
つ【Swhitch】のすp(ry

プロトタイプ宣言と実体の引数の名前が違う。混乱の元になるのであわせたほうがベター
mainにint型を返すことを明確に示しましょう。

隅をつつこうと思えば、まだまだあるけど今はこんなもん?

670デフォルトの名無しさん:2007/06/08(金) 00:36:15
>>669
switch ですね・・・修正

>プロトタイプ宣言と実体の引数の名前が違う。混乱の元になるのであわせたほうがベター
参考書では別の名前を使っていたので別にしないといけないものだと思ってました
たしかに混乱しますね
名前は同じに修正しました

隅をつつくと何がでてくるのかちょっと気になりますね・・・
671デフォルトの名無しさん:2007/06/08(金) 00:46:57
>参考書では別の名前を使っていたので別にしないといけないものだと思ってました
何て本だか気になる。
672デフォルトの名無しさん:2007/06/08(金) 01:03:07
ぱっと見だけど、
float conve(int fahr)は
float fahr_to_celsius(float fahr)
{
return (5.0/9.0)*(fahr-32.0);
}
かな。

関数名を処理内容に沿った名前へ。
結果がfloatなので仮引数もfloat型に。
673デフォルトの名無しさん:2007/06/08(金) 01:09:56
>>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;
}
674デフォルトの名無しさん:2007/06/08(金) 01:14:09
>>673
向上心すごいね、プログラム楽しい?がんばってね。
defineは大文字にしたほうがいいかな?
675デフォルトの名無しさん:2007/06/08(金) 01:19:04
このばあい、whileよりfor文が良いかと。
for (f = lower; f <= upper; f += step)
676デフォルトの名無しさん:2007/06/08(金) 01:19:26
この例題を見るたびに、華氏だと日本人には馴染みが薄くて、初学者向きじゃねーなと思う。
677デフォルトの名無しさん:2007/06/08(金) 01:23:03
飛行機乗ったときに外気温が英語で表示されたときくらいだなー、見るの
678デフォルトの名無しさん:2007/06/08(金) 02:13:27
> while(f<=upper){
> for (f = lower; f <= upper; f += step)
諸兄ら、floatの比較演算はどう思う?
俺は、この場合はintにすべきだと思うのだが。
(f==upperのときループが実行されるのを期待してるので)
で、こう?
conve((float)i)
679デフォルトの名無しさん:2007/06/08(金) 02:18:22
>>678
浮動小数に加算するとそもそも誤差がでるから避けるのが無難だが
まぁこの程度なら別にいいと思うがな
680デフォルトの名無しさん:2007/06/08(金) 03:58:21
3行3列の行列の各要素を入力ファイルから読み込み、出力ファイルに書きこんで出力せよ。って宿題が全くできません。誰か教えてください。
681デフォルトの名無しさん:2007/06/08(金) 03:59:36
>>678
ループ回数を確実に制御しなければならない場合はintで回すね。
比較演算子に不等号が入っているならそんなに心配せんでも医院で内科医。
682デフォルトの名無しさん:2007/06/08(金) 04:02:59
683デフォルトの名無しさん:2007/06/08(金) 10:30:54
>floatの比較演算
詳しく知らないけど、浮動小数点の加算の誤差は
必ず実際の数より小さくなるんだっけ?
指数の展開の仕方に寄るんだろうけど
個人的には300Kの値が表示されない時がありそうで怖い。
684デフォルトの名無しさん:2007/06/08(金) 12:16:40
>>683
必ずかどうかは知らないけれど、大きくなることは少ないとは思う。
まぁ、整数でループ制御するべきだね。
685684:2007/06/08(金) 12:20:44
訂正。
この場合は条件自体がすべて整数だから、実数でも問題はない。
つまり、(精度が間に合う範囲であれば)整数同士の加算を実数で行なっても誤差は出ない。
具体的には、800万辺りまでは問題がない。
686デフォルトの名無しさん:2007/06/08(金) 12:32:38
>>685
甘いな。仮数部は23ビットだが最上位の1は省略されるから、実質24ビットの精度がある。
だから16777216と16777215はきちんと区別できる。16777215+1が16777216になるかはしらね。
687デフォルトの名無しさん:2007/06/08(金) 14:27:08
16777215+1は16777216になるが、
16777216+1は16777216のままだな。
まあ、当たり前の話だが。
688デフォルトの名無しさん:2007/06/08(金) 15:23:42
Visual Studio 2005を使ってプログラミングをしています。
とりあえずプログラムを実行すると、“続行するには何かキーを押してください . . .”
という表示が出て、何かキーを押すと終了するようになっています。
しかし、出来た実行ファイル(.exe)を実行すると一瞬コンソール画面が表示されて
“続行す(ry”が表示されずに終わってしまいます。

実行ファイルでも同じような動作をさせたいのですが、どのようにすればいいのでしょうか?
プログラム終了直前でscanfで何かを入力待ちにするのもいいのですが、この場合何かキーボードを
押しただけでは終了しませんし、何も入力せずにEnterキーを押しただけでは終了しません。
何かいい方法はないでしょうか?
689デフォルトの名無しさん:2007/06/08(金) 15:27:16
gets
690デフォルトの名無しさん:2007/06/08(金) 15:30:33
#include <windows.h>

if(IsDebuggerPresent()) getch();
しとけ
それかCtrl+F5
691デフォルトの名無しさん:2007/06/08(金) 15:30:41
>>688
つ[getchar()]
692デフォルトの名無しさん:2007/06/08(金) 15:33:30
cmd.exe /k
というショートカットをSendToに入れておいて渡す
693デフォルトの名無しさん:2007/06/08(金) 15:34:57
この質問、毎週2,3回見るんだけどなんとかならんのかw
694デフォルトの名無しさん:2007/06/08(金) 15:36:59
>>689-691
ありがとうございます。しかし、Enterキー以外のものを押された時は
その後Enterキーを押さないと処理が終わらないようですね・・・。
695デフォルトの名無しさん:2007/06/08(金) 15:42:23
>>688
>“続行するには何かキーを押してください . . .”という表示が出て
実はこの時点でもうあなたが書いたプログラムは実行し終わった後なんですよ。
“続行す(ry”というのは、pauseというコマンドプロンプト(cmd.exe)の組み込みコマンドです。
適当なバッチファイルを作って、あなたが書いたプログラムを実行した後pauseをすれば
同じような動作になります。

というか、コマンドプロンプトを起動してその上であなたが書いたプログラムを実行すれば、
たぶんそれがあなたが望む状態なんじゃないかと思います。
696デフォルトの名無しさん:2007/06/08(金) 15:59:00
>>695
なるほどです。system("pause")ってやってみたら、目的の動作をしました。
ありがとうございます。
697デフォルトの名無しさん:2007/06/08(金) 18:01:09
だいたい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' : 定義されていない識別子です
配列または、ポインタでない変数に添字が使われました。
と表示されるのですが何がいけないんでしょうか?
699デフォルトの名無しさん:2007/06/08(金) 19:42:38
>int vc[6]={0,2,4,6,8,10};
>for (i=5;i>=0;i--){ /*表示*/
>printf("%d", data[i]);
素で理解できてない?
単に呆け?
それとも釣り?
700デフォルトの名無しさん:2007/06/08(金) 19:49:07
>>698
data[i]
はどこにある?

あと表示が 0 2 4 6 8 10 なのになぜ逆順で?
701デフォルトの名無しさん:2007/06/08(金) 19:53:17
>>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文が何をやっているのか、変数の定義と使い方を理解した方がいいと思うよ。
703デフォルトの名無しさん:2007/06/08(金) 20:52:17
おまいらやさしいな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
にしたいんですがどうやればいいんでしょうか?
705デフォルトの名無しさん:2007/06/08(金) 21:29:25
宿題スレにいけよ
706デフォルトの名無しさん:2007/06/08(金) 21:35:20
教育担当がかわいそうだな
仕事で必要だから教えようとしているのに
自分で考えようとしない

会社には、ごくつぶしなんか雇う余裕は無いのに…
足を引っ張るだけの要員なんて不必要
707デフォルトの名無しさん:2007/06/08(金) 21:49:23
>>704
言いたかないが、自分で克服してこそ身につく。
あまりにも質問が酷すぎ。
708デフォルトの名無しさん:2007/06/08(金) 21:56:12
こんな奴をちゃんと入社試験やら面接やらで落とさない会社も悪い。
勿論一番悪いのは704だが。
709デフォルトの名無しさん:2007/06/08(金) 22:00:50
社員なの?
710デフォルトの名無しさん:2007/06/08(金) 22:02:15
社員乙
711デフォルトの名無しさん:2007/06/08(金) 22:24:50
shi ne
712デフォルトの名無しさん:2007/06/08(金) 22:38:38

データを入力→データベースとして保持→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);
}

713デフォルトの名無しさん:2007/06/08(金) 22:44:39
どこから突っ込んでいいかわからんほどひどいな。
714デフォルトの名無しさん:2007/06/08(金) 22:46:50
>>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デフォルトの名無しさん:2007/06/08(金) 22:58:07
とりあえずこの辺を順番に読んだ方がいいと思う。その方が早い。
http://homepage1.nifty.com/toshio-k/prog/c/
716デフォルトの名無しさん:2007/06/08(金) 23:03:14
>>715
分かりやすいサイト紹介してくれてサンキュ!
717デフォルトの名無しさん:2007/06/08(金) 23:59:37
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
を期待していたのですが、うまくいきません。何が原因でしょうか?
718717: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
を期待していたのですが、うまくいきません。何が原因でしょうか?
719デフォルトの名無しさん:2007/06/09(土) 00:02:41
>>717
ポインターのポインターを使えば?
720716:2007/06/09(土) 00:02:52
tabが入らないorz
スレ汚してスマソ
721デフォルトの名無しさん:2007/06/09(土) 00:04:34
#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*へのポインタ型にすればいい。
722デフォルトの名無しさん:2007/06/09(土) 00:05:44
>>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);
}
こんな感じじゃないかな?
723デフォルトの名無しさん:2007/06/09(土) 00:07:56
>>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;
}
ポインタのアドレスを渡さなきゃダメ
724デフォルトの名無しさん:2007/06/09(土) 00:32:07
int a = 10;
int *b = &a; //関数へ引数を渡すのと同じ
b = (int*)20; //bを直接触ってもaが変わるはずも無い。
725デフォルトの名無しさん:2007/06/09(土) 00:32:50
>719 - 723
早いレスありがとう!言われてい見れば確かに721さんや723さんの言うとおりだ。
726デフォルトの名無しさん:2007/06/09(土) 00:44:46
楽しい楽しいポインターぁ♪
727712: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言語を使用しています。
729デフォルトの名無しさん:2007/06/09(土) 03:20:52
普通はまず大きい画像で作ってから小さく変換してる
730728:2007/06/09(土) 04:06:54
>>729
僕の場合はベクターの画像(32*32)のスクリーンショットを取り、それをペイントに貼り付けて、
bmpファイルにして保存し、それをリソースでicoに貼り付けるといった方法をとってます。
一応ドットで描いてるわけではないので、大きい画像で作って小さく変換するのと作業的には
あまり変わらないと思うのですが、どうなのでしょうか?
731デフォルトの名無しさん:2007/06/09(土) 05:34:10
>>696 >>688 亀だがこんなのはどうだろうか?
#include <stdio.h>
void bk(void) {
printf("続行するには何かキーを押してください . . .");
getchar();
}
int main(void) {
bk();
return 0;
}

ttp://www.bohyoh.com/CandCPP/C/Library/system.html
systemはstdlib.hが必要らしいが
732デフォルトの名無しさん:2007/06/09(土) 06:02:16
なんかワロタ
733デフォルトの名無しさん:2007/06/09(土) 06:06:03
あっ、でも >>731 だとEnterキーを押さんとあかんね・・・systemなら何でも良いみたいだが。
734デフォルトの名無しさん:2007/06/09(土) 06:09:03
>>731
それだとエンター押さないと終わらない気が。

個人的にはsystem関数使うぐらいならgetch()のが気持ちが良いかも。
一応windowsでもlinuxでも用意されてるし。
linuxのgetch()はクセあるけど・・・。
735デフォルトの名無しさん:2007/06/09(土) 07:43:41
んじゃこうしよう。
void bk(void) {
printf("続行するにはEnterキーを押してください . . .Enterキーだぞ?ちゃんと押せよ?");
getchar();
}
736デフォルトの名無しさん:2007/06/09(土) 16:12:09
winならkbhitとか
737デフォルトの名無しさん:2007/06/09(土) 16:31:56
>>734
Unixだと端末が普通行編集モードになってるから、そこからいじらないとダメ。

>>733
「systemなら」じゃなくてpauseがそういうコマンド。
738デフォルトの名無しさん:2007/06/09(土) 16:38:51
>>737
> 「systemなら」じゃなくてpauseがそういうコマンド。
知ってるよ、いちいちうぜーんだよ、補足しなくても良いわボケが
739デフォルトの名無しさん:2007/06/09(土) 16:40:00
system("pause"); って括弧と括弧の中を書くのが面倒だから省略しただけだろ
揚げ足取りってうぜーよな、日ごろそういうことで他人の気分を害して
女にも相手にされずにモテねーから、こういう場所ででけぇ面して気分をよくしているんだろうね(プ
740デフォルトの名無しさん:2007/06/09(土) 16:42:50
なんで必死なんだ?
スルーしとけよ
741デフォルトの名無しさん:2007/06/09(土) 16:43:23
土曜日は出現率高いな
742デフォルトの名無しさん:2007/06/09(土) 16:44:01
省略しすぎで間違いの域に達してんだよカス
743デフォルトの名無しさん:2007/06/09(土) 16:44:17
>>737
だからgetchって書いてんじゃん。
cursesかncurses使うのが前提って意味だよ。
言葉足らんかったかな。
744デフォルトの名無しさん:2007/06/09(土) 16:54:26
>>737
やや、マジでこれは揚げ足取りだな。しかも「だからなに」って感じのまったく意味も無い指摘。これがゆとりってやつか。
745デフォルトの名無しさん:2007/06/09(土) 16:55:54
>>737
これはひどい
746デフォルトの名無しさん:2007/06/09(土) 17:05:44
742 名前:デフォルトの名無しさん 投稿日:2007/06/09(土) 16:44:01
省略しすぎで間違いの域に達してんだよカス
省略しすぎで間違いの域に達してんだよカス
省略しすぎで間違いの域に達してんだよカス
省略しすぎで間違いの域に達してんだよカス
省略しすぎで間違いの域に達してんだよカス
省略しすぎで間違いの域に達してんだよカス
省略しすぎで間違いの域に達してんだよカス

↑こいつ最高にキモメンメガネデヴピッツァw
747デフォルトの名無しさん:2007/06/09(土) 17:07:56
>>742 ← こういうこと言う奴ってさぁ、突然会話に入り込んできて
それまで会話をしていた人の流れを無視して勝手なことを言うタイプだよな。
んで、相手の機嫌を悪くして「何お前勝手に話しに割り込んできてんだよ?」って
相手から不快感を買って、干されて孤立するタイプなんだよねw
んで、なぜか自分が悪いのに、周りが悪いんだよ!周りが虐めるぅ〜って
被害妄想ぶっこいて最後は自殺しちゃうんだよね。
748デフォルトの名無しさん:2007/06/09(土) 17:19:38
そもそも、何かキーを押して継続する流れは >>696 以前で話に出ているから
system("pause");ってのはわかり切っていたこと。systemだけでとは誰も言っていないんだよねぇ。
やだね、早とちりして他人の気分を害する香具師って。
749デフォルトの名無しさん:2007/06/09(土) 17:24:17
>746
ちょ、なんで決め台詞から入ってんのw
750デフォルトの名無しさん:2007/06/09(土) 17:31:27
>>688です。僕のした質問のせいでこんな事になってごめんなさい。
あと、>>728をよろしくお願いします。
751デフォルトの名無しさん:2007/06/09(土) 17:39:22
ttp://iconcube.vis.ne.jp/f/s-m/
別に、他のソフトで作成して、アイコンにしたものを取り込めば良い
752デフォルトの名無しさん:2007/06/09(土) 17:45:38
>>737=>>742=上げ足取り厨
その他厨
これでFA
753デフォルトの名無しさん:2007/06/09(土) 17:49:04
一つの自作関数で2つ以上の実引数を返したい場合はどうしたらいいんでしょうか?
例えば簡単なので 1+1 と1+2 の計算を自作関数でやらせてそれぞれの結果をメインに返す場合は
どのように書くんですか?

754デフォルトの名無しさん:2007/06/09(土) 17:54:59
ポインタ渡せばいいだろ
755デフォルトの名無しさん:2007/06/09(土) 17:55:16
1.構造体を返す
2.答えを格納する変数をポインタで引数として渡す
756デフォルトの名無しさん:2007/06/09(土) 18:10:16
家のパソコンでC言語を使いたいのですが、どんなソフトがいいでしょうか?
学校ではemacsを使っているのでmeadowあたりに目をつけているのですが・・・
何かオススメのものがあったらお願いします
757デフォルトの名無しさん:2007/06/09(土) 18:11:10
>>753
それは引数ではなく返り血(ギャアッ!
758デフォルトの名無しさん:2007/06/09(土) 18:13:09
759デフォルトの名無しさん:2007/06/09(土) 18:14:43
学校の環境がLinuxならcygwin入れたらemacs, gcc, make等々学校と同じ環境になるよ。
760デフォルトの名無しさん:2007/06/09(土) 18:33:51
あえてココでVMWareを勧めてみる。
761デフォルトの名無しさん:2007/06/09(土) 18:35:39
スペックががが…
762デフォルトの名無しさん:2007/06/09(土) 18:40:46
>>758さん
>>759さん
>>760さん

返信ありがとうございます!
一通り試してからぢれかにしようと思います
763デフォルトの名無しさん:2007/06/09(土) 19:27:29
>>751
ありがとうございます。IcoFx落としてみました。
ちょっといじったのですがなんとか出来そうなのでがんばってみます。
764デフォルトの名無しさん:2007/06/09(土) 23:46:22
質問です。
現在学校の課題で、リスト構造に関する問題が出題されています。
この問題というのが、既存のリスト構造に新たなノードの生成、追加及び削除等の操作を行う、というものです。
「ノードの生成、追加及び削除等の操作」に関してはなんとかなりそうなんですが、「既存のリスト構造」を構築する手順(表記方法)がイマイチ分かりません・・・。
プログラムリストにそれらのリスト構造を記述する表記方法を教えていただけませんか?
ちなみに、リスト構造のメンバは、学籍番号、学年、名前の3つです。
765デフォルトの名無しさん:2007/06/09(土) 23:59:27
リスト構造を定義せずに、どうやって生成・追加・削除の実装が出来るんだろう…
766デフォルトの名無しさん:2007/06/10(日) 00:04:11
>「既存のリスト構造」を構築する手順(表記方法)がイマイチ分かりません・・・。 

手順はアルゴリズムかなと想像できるけど、(表記方法)がつくとよくわからんね。
フローチャートでも書いてほしいのだろうか。
767デフォルトの名無しさん:2007/06/10(日) 00:09:21
生成と追加ができれば構築できるだろ
768デフォルトの名無しさん:2007/06/10(日) 00:25:59
すいません、補足します。
僕の言う「ノードの生成」は、ノードの作成を求めるアルゴリズムを作成することができる(実際は自信ないですが・・・)という意味であって、プログラムの実行開始と同時にノードを作成するということです。
しかし、プログラムリストを作成する段階でそういったリスト構造を記述する方法が未だに分かりません。
よかったらどなたかアドバイスをいただけませんか?

たとえば↓のようなものです。
struct student{
char id[20];
char name[20];
int gakunen;
}seito={"20000403","Yojigen Taro",1};
この例だと先頭のノードしか作成することができないように思ったんですが、このようなノードを複数個作成したいと考えています。
769デフォルトの名無しさん:2007/06/10(日) 00:30:43
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:宣言の構文エラー”
が表示されました。やはり間違いがあるんでしょうか?
どなたか教えていただけませんか?
772デフォルトの名無しさん:2007/06/10(日) 01:17:49
structが足りない

ついでに上の宣言と変数名がかぶってる
773デフォルトの名無しさん:2007/06/10(日) 01:18:48
9| struct student *next;
10|}
11|struct student seito;

この辺が変だとおもわないかい?
他に何の言語使えるかしらんけどさ、
Cはsyntaxなエラーを出すとき、発生点を通り過ぎて出てくる
行数が出たら、そこから上を探すと、変なところを見つけやすい
774デフォルトの名無しさん:2007/06/10(日) 01:23:52
>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行目において”移植性のないポインタ変換”とのエラーが表示されました。
ポインタ変換・・・って何ですか?で、どう訂正していけばいいでしょうか?
ご迷惑おかけします・・・。
776デフォルトの名無しさん:2007/06/10(日) 01:35:18
idにおいてint型配列に対してint型をぶち込んでいるから
そもそも、idは配列である必要はあるのかい?
777デフォルトの名無しさん:2007/06/10(日) 01:36:13
IDは配列の必要があるのか?
778デフォルトの名無しさん:2007/06/10(日) 01:38:23
{
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さんも!
781デフォルトの名無しさん:2007/06/10(日) 01:43:19
うどんだけ〜
782782:2007/06/10(日) 14:17:01
他のアプリが「落ちている」かどうかをチェックするプログラムを作りたいのですが、
どうしたら良いのでしょうか?

具体的に言うと↓
「問題が発生したため、xHibernate.exe を終了します。 ご不便をおかけして申し訳ありません。」
こういった感じのメッセージが出ているアプリを検出したいです。

ちなみに、その「落ちている」方のアプリは自分で作った訳ではないので手を入れれません。

よろしくお願いいたします。
783デフォルトの名無しさん:2007/06/10(日) 14:29:27
>>782
Win32 API でアプリケーションを列挙する方法
http://support.microsoft.com/kb/175030/ja

これで、xHibernate.exeがあるかどうかチェックするとか。
784782:2007/06/10(日) 14:45:55
>>783
返信ありがとうございます。
この方法だと、無理っぽいですね。
「問題が発生したため、xHibernate.exe を終了します。 ご不便をおかけして申し訳ありません。」
このメッセージが出ている間は、xHibernate.exeは存在していることになっているみたいです。
エラー報告を送信する、送信しないで、「送信しない」を選んで初めて、ウインドウが消えるみたいですね。

「問題が発生したため、xHibernate.exe を終了します。 ご不便をおかけして申し訳ありません。」
このメッセージが出ている時も「落ちている」と判断したいです。

785デフォルトの名無しさん:2007/06/10(日) 14:52:09
落ちている、の定義は?
786デフォルトの名無しさん:2007/06/10(日) 14:52:35
スレ違い
787782:2007/06/10(日) 14:55:50
>>785
「問題が発生したため、xHibernate.exe を終了します。 ご不便をおかけして申し訳ありません。」
↑このメッセージが出ている時か、そもそもそのプロセスが存在してない時ですね。
プロセスが存在していないのを検出するだけだったらFindWindowで出来たのですが、
FindWindowだと、
「問題が発生したため、xHibernate.exe を終了します。 ご不便をおかけして申し訳ありません。」
このメッセージが出ている時も反応してしまうので・・・。
788デフォルトの名無しさん:2007/06/10(日) 15:02:33
>>787
環境依存スレ池
789デフォルトの名無しさん:2007/06/10(日) 15:04:47
テンプレ化されていない俺ルール振りかざすなドアフォ
790デフォルトの名無しさん:2007/06/10(日) 15:10:32
適当に言ってみると

カーネルモードとかじゃないと無理じゃね
791デフォルトの名無しさん:2007/06/10(日) 16:42:38
「問題が発生(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;
}
なんですが、コンパイルはうまく
いきますが、実行してデータ入力すると
エラーが起こります。
私のソースが問題なのか
他に問題なのかのご指摘をお願いします。
初心者すぎてくだらない質問すいません。
793デフォルトの名無しさん:2007/06/10(日) 16:58:43
%s → %d
794デフォルトの名無しさん:2007/06/10(日) 17:00:13
"%s円が..."
 kinsyu[i]

ってw
795792:2007/06/10(日) 17:07:08
>>793さん
>>794さん
ご指摘ありがとうございます。
恥ずかしいです。
何故か、配列は%sでと勘違いしていました。
どうもありがとうございました。

796デフォルトの名無しさん:2007/06/10(日) 17:11:55
文字列は%sでね^^
797デフォルトの名無しさん:2007/06/10(日) 17:43:52
問題が解けません・・・。誰か@から教えてください

キーボードから入力された10進数を、2進数として出力するプログラムをつくりなさい。
2進数への変換は、商が0になるまで10進数を2で割りl、あまりを逆の順番で並べる方法を用いる。
ただし、入力は正の整数であって最大値は16838とする。
798デフォルトの名無しさん:2007/06/10(日) 17:51:56
>>797
こちらへ
テンプレに沿って質問してね

C/C++の宿題を片付けます 89代目
http://pc11.2ch.net/test/read.cgi/tech/1181087371/
799デフォルトの名無しさん:2007/06/10(日) 17:56:37
>>797
例、5を二進化

5 % 2 = 1
           5 / 2 = 2
2 % 2 = 0
          2 / 2 = 1
1 % 2 = 1

A. 101
――――
        
800デフォルトの名無しさん:2007/06/10(日) 20:57:46
>>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;
}
こんな感じ。
すいません、アドバイスください。教本みたいなのないでしょうか?



802デフォルトの名無しさん:2007/06/10(日) 21:36:37
CではなくC++使っているとしか思えない
803デフォルトの名無しさん:2007/06/10(日) 21:39:13
> int func(int (*abc)(int,)){
> return abc(100);
> }
> int func(int (*abc)(int,int)){
> return abc(100,200);
> }

これ、Cだとコンパイラに怒られると思うんだけど...
元の通り?
804デフォルトの名無しさん:2007/06/10(日) 21:41:03
>>801
C でそんなことできるか?
805デフォルトの名無しさん:2007/06/10(日) 21:43:29
>>801
これCのプログラム?
int func(int (*abc)(int,)){
ってのと
int func(int (*abc)(int,int)){
って同じ名前でエラーじゃん!
806デフォルトの名無しさん:2007/06/10(日) 21:44:23
>>801
「こんな感じ」では今のコンピュータはいうこと聞いてくれないぞ
807デフォルトの名無しさん:2007/06/10(日) 21:45:24
>>801
「アドバイスください」って具体的に何のアドバイスを求めてるんだ?
808801:2007/06/10(日) 21:47:55
レスくれたみなさんごめんなさい!

makefileみたらg++でコンパイルしてました。

本当にごめんなさい!!!
809デフォルトの名無しさん:2007/06/10(日) 22:00:03
>>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箇所をどのように書けばうまく値を受け渡すことができるんでしょうか?
(上記のはわかんないのでテキトーに書いてます)
二次元配列の時、ポインタをどういうふうに使えばいいかよく分からないんです。
よろしくお願いします。
811デフォルトの名無しさん:2007/06/10(日) 23:07:07
>>810
ごめん。
全体的におかしくて、何をどういったら良いのか分からない。
とりあえず、無理に2次元配列使おうとするより
malloc()使って1次元配列で何とかする方が良いと思うよ。
812810:2007/06/10(日) 23:23:16
そうですか・・・。
とりあえず2次元配列は使いたいんですよね・・・。
で、その2次元配列を関数とか構造体と受け渡すことをしたいんです。
813デフォルトの名無しさん:2007/06/10(日) 23:37:13
>>812
とりあえず動的なサイズの2次元配列を宣言することは出来ない。
それでも2次元配列的な使い方をしたいなら考えてみるけど。
814デフォルトの名無しさん:2007/06/10(日) 23:42:14
>>812
おとなしく、仮想二次元で一次元配列を使うのがいいよ。
二次元配列風アクセスはできるけど、その手間よりも仮想二次元のほうが楽だし。
815デフォルトの名無しさん:2007/06/10(日) 23:46:51
>>814
810ではないけど、「仮想二次元」て何?
816デフォルトの名無しさん:2007/06/10(日) 23:49:41
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;

みたいなの。
817デフォルトの名無しさん:2007/06/10(日) 23:49:56
そもそも配列とポインタを同じものとして考えるから詰まるんじゃね?
始めの概念を理解するとかのあたりならそれでもいいかもしれないけど
818デフォルトの名無しさん:2007/06/10(日) 23:52:44
>>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;
}
}
}
819デフォルトの名無しさん:2007/06/10(日) 23:54:48
連投失礼。
>>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オプション。
822デフォルトの名無しさん:2007/06/11(月) 00:06:26
>>820
素数を調べるのに、一般的に√は使う必要ないがな。
823デフォルトの名無しさん:2007/06/11(月) 00:19:15
>>821
ありがとうございます
でも、<stdio.h>規制があるんです

>>822
入力した整数nが素数かどうかを判定する課題なんです
√n を 2〜n-1 で割っていくプログラムなら処理が早いと思ったんで
824デフォルトの名無しさん:2007/06/11(月) 00:26:18
割る数の自乗が n 以下になるようにすれば、
別に sqrt なんて要らない。
825デフォルトの名無しさん:2007/06/11(月) 00:29:25
ループ内で毎回掛け算するのは、いまどきの環境では気にしないのかね。
826デフォルトの名無しさん:2007/06/11(月) 00:32:27
するほどのものじゃないね。
827デフォルトの名無しさん:2007/06/11(月) 00:36:40
昔からね
828デフォルトの名無しさん:2007/06/11(月) 00:44:30
ルートを求める時の計算量とループの中で二乗することの計算量ってそんなに違うか?
829デフォルトの名無しさん:2007/06/11(月) 00:47:20
ルートが1回なのと、二乗がループ毎にだったら違うだろうね。
んなもん、ローカルの中にループの外で入れれば同じだけど。
830デフォルトの名無しさん:2007/06/11(月) 01:11:53
√は一回でいい。
でも、かけ算は毎回。
ということだろう。
831デフォルトの名無しさん:2007/06/11(月) 01:14:00
ルート一回の計算と掛け算一回を同列にすんなよw
832デフォルトの名無しさん:2007/06/11(月) 01:15:18
じゃーどっちが計算量多いの?
833デフォルトの名無しさん:2007/06/11(月) 01:17:39
でも、この場合厳密な平方根はいらないよな。
834デフォルトの名無しさん:2007/06/11(月) 01:27:47
どっちが計算量多いかなんてsqrtの実装とか最適化とかのレベルじゃね?
CPUの命令も関わってくるだろうし。ってかそこまで気にするほどのもんじゃないと思う。
835デフォルトの名無しさん:2007/06/11(月) 01:28:15
ちょっと面白い課題かも。
できるだけ計算量の少ない方法で、与えられた N の平方根の整数部を求めよ。
836デフォルトの名無しさん:2007/06/11(月) 01:31:52
エラトステネスのふるいを使うなら、普通は素数票作りながらチェックしていくだろ?
前回のループで判定に使った素数まではチェックなしで判定に使用して、
それ以降の部分だけかけ算使ったチェックをすれば、ほとんどかけ算せずに済む。
837デフォルトの名無しさん:2007/06/11(月) 02:19:50
C言語なんですが

for( i = 0 ; getchar(str[i]) != EOF && i < STR_MAX ; i++ )

こんな感じで書くことは出来ないんでしょうか?
エラーが出るってことは無理なんですよね
前に何かの参考書でこのような式を見たような気がしたんですけど・・・
838デフォルトの名無しさん:2007/06/11(月) 02:20:44
>>837
getcharをそこでするか?普通に str[i]!=EOFでええやろ?w
839デフォルトの名無しさん:2007/06/11(月) 02:21:59
ttp://www.bohyoh.com/CandCPP/C/Library/getchar.html
> int getchar(void);
どう考えても使い方が不適切です、ありがとうございました。
840デフォルトの名無しさん:2007/06/11(月) 02:27:00
勘違いしてました・・・

for( i = 0 ; str[i] = getchar() != EOF && i < STR_MAX ; i++ )

でした
841デフォルトの名無しさん:2007/06/11(月) 02:35:49
>>840
まず、演算子の優先順位。
わかんなかったら、調べるか括弧つけろ
842デフォルトの名無しさん:2007/06/11(月) 02:42:11
>>840
っつか、何がしたいのかさっぱり分からん。getcharは何に使いたいんだ?
入力を受け付けて str に入れたいのか?それとも、str の終端を見つけて
何かfor文で処理したいのか?
843デフォルトの名無しさん:2007/06/11(月) 02:44:45
まあ初心者のころはfor文に何でも詰め込もうとするわな
844840: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++ )

と書いた方がコードが短くなるので良いもかと思ってました
845デフォルトの名無しさん:2007/06/11(月) 02:58:29
wakero!!
846デフォルトの名無しさん:2007/06/11(月) 03:00:33
そのgetcharの直後に判定入れてbreak;したほうが自然だろう
847デフォルトの名無しさん:2007/06/11(月) 03:05:30
あと、気がついたかどうか知らんが
!= は = より優先順位が高いので
それじゃあ str[i] = (getchar() != EOF) ということになるよ
848デフォルトの名無しさん:2007/06/11(月) 03:08:03
そしてその後ろの&&も=より、、(以下略
849840: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の乗数にしておいた方が
よいですか?
852デフォルトの名無しさん:2007/06/11(月) 11:50:12
>>851
>char型の配列の先頭アドレスが2の乗数に
>なっているかどうかは、性能に影響ありますか?
CPUによる(奇数アドレスへのアクセスが遅くなるCPUはある)

>C言語で charの1次元配列を複数確保するとき、
>1番目の配列の長さは2の乗数にしておいた方が
>よいですか?
コンパイラが勝手にやってくれることが多い
853デフォルトの名無しさん:2007/06/11(月) 12:37:18
2の乗数ってなんだろう……
854851:2007/06/11(月) 13:02:33
>>852
ありがとうございました。

>>853
2を何度も掛けた値のことです。
たとえば、2の3乗は、2×2×2=8
855デフォルトの名無しさん:2007/06/11(月) 13:05:29
2の倍数や4の倍数でないとパフォーマンスが落ちたり、
そもそもアクセスできないプロセッサは普通に存在するが
2のn乗でなければ困るようなプロセッサは見た事がないな。
856デフォルトの名無しさん:2007/06/11(月) 13:16:22
>>852
2の冪乗なんてアドレスを要求するようなプロセッサはないな。
それだと例えば、32ビットアドレス空間だと30箇所ほどしか高速アクセスできないことになってしまう。
#つーか、「2の乗数」で冪の意味というのは無理がありすぎ。
857デフォルトの名無しさん:2007/06/11(月) 13:26:34
852も「倍数」と解釈したんだろ。
858デフォルトの名無しさん:2007/06/11(月) 13:28:38
ただ高速なアルゴリズムでプログラム書こうとすると自動的に
2のべき乗に制限される場合ってない? FFTとか
859デフォルトの名無しさん:2007/06/11(月) 13:39:49
虚覚えも甚だしいとしかいいようがないが、
それサンプル数の話で、しかも「自動的に」は有り得ない。
860デフォルトの名無しさん:2007/06/11(月) 13:45:38
互いに素な NxM FFT とかアルゴリズム自体は存在するもんな。
2^N FFTが一番シンプルってのはあるけど。
861デフォルトの名無しさん:2007/06/11(月) 13:46:49
最も高速にやろうとする場合>自動的に
862デフォルトの名無しさん:2007/06/11(月) 15:27:15
#define AAA::BBB::CCC XXX

これがエラーになってしまうんですが、どうのようにかいたらいいんでしょうか?
863デフォルトの名無しさん:2007/06/11(月) 15:30:18
エスパー回答
#define XXX AAA::BBB::CCC
864デフォルトの名無しさん:2007/06/11(月) 15:36:24
そもそも C じゃないし。

あと、名前空間なら namespace XXX = AAA::BBB::CCC; と、
型なら typedef AAA::BBB::CCC XXX; とすべき。
CCC がテンプレートなら仕方がないところあるけど。
865862:2007/06/11(月) 15:45:15
Cじゃなかったですね。すいません。
しかしどうにかしてソースコード中のAAA::BBB::CCCをXXXに置き換えたいです。

無理でしょうか?
866デフォルトの名無しさん:2007/06/11(月) 15:53:24
>>865
>Cじゃなかったですね。すいません。
ではさようなら。
867デフォルトの名無しさん:2007/06/11(月) 16:04:42
XXXが型なら
namespace AAA
{
  namespace BBB
  {
    typedef ::XXX CCC;
  }
}
名前空間ならnamespace CCC = ::XXX;
関数なら::XXXを呼ぶinline関数
変数ならconst参照で我慢
クラステンプレートなら今は::XXXを継承したクラステンプレートCCCを作ってごまかす
868862:2007/06/11(月) 16:19:58
話すと長くなるんですが、言語はC++/CLIでInitializeComponentっていう
デフォルトでできてくる関数があって、これはデザイナがよむため
変更不可です。読むといってもC++として#defineやtypedefはちゃんと読むわけでは
ないみたいで、この関数内だけ見てるみたいです。

それでこの関数内でgcnew AAA::BBB::CCCがあるんですが、ここをXXXに変更すると
デザイナが読み込みできません。XXXはAAA::BBB::CCCを継承したものですが、
デザイナで適切に読ませるためのコーディングがよくわからないので放置してます。

つまりXXXも型なのでtypedefは使えないんです。
869デフォルトの名無しさん:2007/06/11(月) 16:20:34
>>865
置換はしちゃいけないわけか?
870デフォルトの名無しさん:2007/06/11(月) 16:22:18
って、置換できないみたいだな。

つか、gcnew かよ。
871デフォルトの名無しさん:2007/06/11(月) 16:23:48
C++/CLI について語ろうぜ Part2
http://pc11.2ch.net/test/read.cgi/tech/1142147319/

こっちに行ったら。
そういう事をやっていいのかすら分からんから。
872デフォルトの名無しさん:2007/06/11(月) 16:36:00
C ではない、ということが判った時点で失せろっつーの。
他の奴も相手すんな。
873862:2007/06/11(月) 16:57:18
Cとして理解していただいていいですよ。>>862

不可能みたいですが・・・
#defineはあくまでトークンレベルでしか置換できないみたいですね。
裏技があればとおもったんですが。
874デフォルトの名無しさん:2007/06/11(月) 17:05:26
マクロじゃ無理だから 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と表示されてしまいます
しかし直接、数値を指定してやるとちゃんとした文字数が表示されます
ここには記号定数名は使えないってことでしょうか?
そうだとちょっと不便ですね
何か良い方法ありませんか?
876デフォルトの名無しさん:2007/06/11(月) 19:02:47
#define TO_STR(text) #text

scanf("%" TO_STR(STR_SIZE) "s", str1);
877851: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 検索してもわかりませんでした。
よろしくアドバイスのほど、お願いします。
879デフォルトの名無しさん:2007/06/11(月) 20:10:58
>>878
Cでどうしてもやりたいのか、C++でいいのか先ずははっきりしる。
880デフォルトの名無しさん:2007/06/11(月) 20:23:46
>>877
おいお前
2の倍数=偶数だぞw
お前が言いたいのは”2のべき乗”じゃないのか?
881デフォルトの名無しさん:2007/06/11(月) 20:39:53
>>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;
}
882デフォルトの名無しさん:2007/06/11(月) 20:39:57
>>880
>856
883デフォルトの名無しさん:2007/06/11(月) 20:43:00
>>881
それなんて拡張言語?
884デフォルトの名無しさん:2007/06/11(月) 20:44:59
>>883
一応Mingwとあったんでそれで。-ansi -pedanticどちらかつけると通らんけど。
885デフォルトの名無しさん:2007/06/11(月) 20:53:26
>>883
C99
886デフォルトの名無しさん:2007/06/11(月) 21:36:06
http://www.borujoa.org/upload/source/upload12253.c
このソースだと11行目で入力した数値が14行目で消滅するのですが
何か良い解決策はないでしょうか?
887デフォルトの名無しさん:2007/06/11(月) 21:42:57
>>886
>scanf ("%s", &ope);
これをどうにかすればいいと思うよ
888デフォルトの名無しさん:2007/06/11(月) 21:47:32
>>887
それを如何にかする方法を聞きたいのですが・・・
889デフォルトの名無しさん:2007/06/11(月) 21:50:49
scanf ("%c", &ope);
もしくは
static char ope[100000000]; /* 足りねーか? */
switch (ope[0]){
890デフォルトの名無しさん:2007/06/11(月) 21:50:57
>>888
char ope[256];
scanf ("%s", ope);
switch (*ope) {
printf ("%d %c %d = %d", dat1, *ope, dat2, ans);

テキトーでいいならこれで
891878: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 上に、このあたりの説明・解説文書はないのでしょうか。(英語可)
見つからなかった。検索のしかたがヘタなんでしょうね。
892デフォルトの名無しさん:2007/06/11(月) 22:30:39
http://seclan.dll.jp/c99d/c99d06.htm

C++に有利な点があるとすれば、C99が普及していないということ
C99対応コンパイラよりは、少なくともstd::complexが使える程度の実装を持った
C++コンパイラのほうが多いはず。
893デフォルトの名無しさん:2007/06/11(月) 22:38:16
>C++に有利な点があるとすれば、C99が普及していないということ

でも、それはC++にとってもあんまりうれしいことじゃないんだよなぁ。
C++の規格としては直接C99に対応してくれてなくてもコンパイラ自体が
C99に対応してくれてればC++からもたいていその機能を利用できるもんなんだけどなぁ。
894デフォルトの名無しさん:2007/06/11(月) 22:49:31
>>889
scanf ("%c", &ope);では想定通りに動作しません
static char opeは、習っていないので・・・

>>890
出来ました
有難う御座いました

でも、なんで[256]なんですか?
ポインタとか、よく解らない物で・・・

また、scanfのが、&opeではなくopeであるのは何故でしょうか?

というか、このソースを作るように指示してある問題は、
ポインタを使わないことが前提だったりするんですよね(そもそも、まだ習ってないですから・・・
895デフォルトの名無しさん:2007/06/11(月) 22:59:47
> [256]
配列
Cでもポインタとは一応関係ない機能
896デフォルトの名無しさん:2007/06/11(月) 23:08:02
>>894
>>889とかぶるけど、ポインタがいやならこういう書き方もできる
switch (ope[0]) {
printf ("%d %c %d = %d", dat1, ope[0], dat2, ans);
ぶっちゃけ、やってることは変わんないんだけどね?
897デフォルトの名無しさん:2007/06/11(月) 23:10:40
あと256は適当
128でも64でも10でもなんでもいい。1以下だとまずいけど。
898デフォルトの名無しさん:2007/06/12(火) 02:20:26
「やさしい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 *)←このキャスト式みたいの何なんでしょうか?
無くてもいいような気がするんですが。。。
899デフォルトの名無しさん:2007/06/12(火) 02:24:59
>>898
mallocはvoid *を返す関数。strはchar *なので型が違う代入になる。
コンパイラによってはこの型違いの代入を禁止、もしくは警告してくるのでその抑制。
というより、出来ることなら型の異なるものの演算等はないことが望ましいから。
900デフォルトの名無しさん:2007/06/12(火) 06:47:55
ANSI準拠ならいらないけどな
901デフォルトの名無しさん:2007/06/12(火) 07:26:30
902898:2007/06/12(火) 08:57:17
>>899-900
レスありがとうございます<(_ _)>
なるほどキャスト式だったんですか・・・。
でも、そうすると

   str = (char) malloc(sizeof(char) * (num + 1));

こうなるような気がするんですが 
(char *) の後ろにつてるアスタリスクはどういった意味なのでしょうか(・_・)?

またレスに「mallocはvoid *を返す関数」という部分がありますが、
これもアスタリスクがわからないのですが、
voidを返すというのもよくわかりません。

「voidは値を返さない」という意味ですよね?
なのにvoid型?という型が存在するのですか?、、、、難しいなぁ。
903デフォルトの名無しさん:2007/06/12(火) 09:43:48
voidとvoid*は違う
void*はどの型のポインタにもなれる
904デフォルトの名無しさん:2007/06/12(火) 11:21:26
>>902
だからポインタだって
voidっていうのは型がないって言うくらいに理解しておけ
905デフォルトの名無しさん:2007/06/12(火) 12:41:07
>>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

としたいのですがプログラムを教えてください
907デフォルトの名無しさん:2007/06/12(火) 15:01:01
宿題は自分でやりましょう
908902: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*型のアドレス(ポインタ)を中に格納できない。
でキャスト式を使って型変換をしている、となって合点がいきます。

これでいいんですよね(゜∀゜;?
麻奈さん説明してくれよー(´Д`;
909デフォルトの名無しさん:2007/06/12(火) 16:24:15
>>908
試しに実行してみて
char *p = 0;
int *q = 0;

p += 1;
q += 1;
printf("%p , %p\n", p, q);
910デフォルトの名無しさん:2007/06/12(火) 17:00:51
ポインタってのは実態はアドレス。けど、それにもちゃんと型を指定する必要があるということ。
それ以外の説明は要らん。
911デフォルトの名無しさん:2007/06/12(火) 17:02:25
>>908
ポインタ変数の加算、減算とかしたことないのかな
912908:2007/06/12(火) 17:29:03
>>909
普通に通りますね。

00000001  , 00000004

こう表示されます。
・・・これはどう考えればいいんでしょうか?
なぜに4が???

ん、そうかポインタその物であるpとqに1をプラスした
そすると次の変数の番地に移動したのか・・・・な?
そうすると次の番地はchar型の場合1バイト繰り上がったって
int型の場合は4バイト繰り上がってる・・・・。

こんな・・・・ような・・・・気もするけど。。。
うーーん。
まだダメっぽい orz

>>911
したことある・・・・と思う。
まあ所詮、はじめてまだ2週間ぐらいの超初心者ですので(゜∀゜;ハハハ
913デフォルトの名無しさん:2007/06/12(火) 17:33:08
>>912
ポインタを1増やすと型のバイト数だけアドレスが増えるんだよ
int型が4バイトの場合は4増える
914デフォルトの名無しさん:2007/06/12(火) 17:33:37
>>912
…なんか他の言語経験あり?
えらく飲み込みが早い気がするんだが。
915デフォルトの名無しさん:2007/06/12(火) 17:47:30
void* はただ漠然とアドレスを表すだけのポインタ型。

int n;
void *p = &n;

とすれば、p は n のアドレスで初期化される。
でも、void* になってしまうと元の型が分からないので、
*p というように参照することはできない。
*(int*)p のようにキャストすれば大丈夫。

とまあ、そんな感じ。
908 ならこれで理解できると思う。
916912: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;
こうしないといけない、しなければならないのかとばっかり・・・・。
まあ、こういうレベルな訳なんですが・・・(´Д`;

917デフォルトの名無しさん:2007/06/12(火) 18:11:17
>>916
0 はヌルポインタ。
NULL と書いてもいいけど(というか NULL と書いた方がいいと思うけど)。

まあ、

int *p = 0;
printf("%p\n", p);

で 0 と表示されるかどうかは環境依存だがね。
918デフォルトの名無しさん:2007/06/12(火) 18:26:43
その環境を教えて欲しい、まじで。
919デフォルトの名無しさん:2007/06/12(火) 18:35:53
920デフォルトの名無しさん:2007/06/12(火) 18:56:58
>>919
えーと、、、ヌルポインターが0でないのと、 char *p = 0が0じゃなくなるのは何か関係あるのか?
921デフォルトの名無しさん:2007/06/12(火) 19:08:47
char *p = 0 の0はヌルポインタをあらわして、
整数の0をあらわしているわけではない。
922デフォルトの名無しさん:2007/06/12(火) 19:18:25
>>917
そもそも printf() の "%p" で void * ではないポインタを渡すこと自体、どうなの?
923デフォルトの名無しさん:2007/06/12(火) 19:24:39
924デフォルトの名無しさん:2007/06/12(火) 19:31:20
void* <-> T* は暗黙の型変換が行われる。
(Tは任意の不完全型かオブジェクト型)

ただし、右向き変換のとき、変換後の型で境界調整がされていない場合の動作は未定義。
925デフォルトの名無しさん:2007/06/12(火) 19:45:32
C++ならキャストしろ屋ゴルスァって怒られるんだよね…
926デフォルトの名無しさん:2007/06/12(火) 19:56:40
>>924
可変引数に型変換も何もないわけだが。
927デフォルトの名無しさん:2007/06/12(火) 21:08:07
>>922
すまんす。
確か void* でキャストしないとダメやね。
928デフォルトの名無しさん:2007/06/12(火) 21:36:22
そういえば、qsortや、bsearch の比較関数って、



あ、いいのか。なんでもないです。
929916:2007/06/12(火) 21:56:51
>>917
なるほど!!
ヌルポインタ、空のポインタってのがあって、0はヌルポインタを指していたんですね。
これで合点がいきました。
「そういうもんなんだろう」ぐらいに曖昧に考えてたんで、、、。
どうも丁寧にありがとうございました。
930デフォルトの名無しさん:2007/06/12(火) 22:06:29
>>921
何言ってんの
変数に0を入れてるのに0じゃないことなんて無い
931デフォルトの名無しさん:2007/06/12(火) 22:07:37
>>926
別スレで
sizeof(int) != sizeof(void*) な環境での可変引数でヌルポ渡すのに
0 ではなく (void*)0 と明示する必要はある
って話はあった
932デフォルトの名無しさん:2007/06/12(火) 22:19:02
>>931
へぇ。ガッ
933質問です。:2007/06/12(火) 22:19:40
テキストファイル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したらクローズすればよい
935デフォルトの名無しさん:2007/06/12(火) 22:28:59
>>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;
}
936デフォルトの名無しさん:2007/06/12(火) 22:35:45
("w") < なんとなく、ハロウィンのかぼちゃに見えたんだ・・・
937933:2007/06/12(火) 22:43:16
>>935

ありがとうございます。早速やってみます。
938デフォルトの名無しさん:2007/06/12(火) 22:54:57
え?
>>930>>921はどっちが正しいの?
939デフォルトの名無しさん:2007/06/12(火) 23:05:50
コンパイラの仕事と実行時の仕事は区別することがわかれば自ずと
940デフォルトの名無しさん:2007/06/12(火) 23:11:38
>>938
0 になる整数式は、ポインタへのキャスト(明示的にしろ暗黙的にしろ)により、
ヌルポインタに変換される。
0 というリテラルがヌルポインタを表しているわけではない。

だから、これもヌルポインタ。

char *p = 1 - 1;

つまり、>>921 は間違い。
941デフォルトの名無しさん:2007/06/12(火) 23:13:47
C言語なら>>921だろうが>>930だろうが大差ない。
どっちが正しいかは日本語の問題に思える。
C++も含め、他の言語はシラネ。
942デフォルトの名無しさん:2007/06/12(火) 23:14:20
char *p = 0; < これ自身が不適切だって突っ込みはねーのかよ?w
943デフォルトの名無しさん:2007/06/12(火) 23:17:41
NULL と書いた方がいいという点なら >>917 で突っ込まれてるが、
それ以外に不適切な点はそこには1つもないぞ。

むしろ、p += 1; の方が不適切だな。
ヌルポインタへのポインタ演算は規格上どうなるか分からんのでは。
944デフォルトの名無しさん:2007/06/12(火) 23:21:26
>>940
それ、ちがってるだろ。
945デフォルトの名無しさん:2007/06/12(火) 23:25:36
>>943
char *p;
なんだからsizeof(char)だけ進むだけだろ。

void *p;
なら不適切。
946デフォルトの名無しさん:2007/06/12(火) 23:26:32
#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;
}
947デフォルトの名無しさん:2007/06/12(火) 23:27:19
>0 になる整数式は、ポインタへのキャスト(明示的にしろ暗黙的にしろ)により、

( ・∀・)つ〃∩ ヘェー
948デフォルトの名無しさん:2007/06/12(火) 23:41:46
>>944
違わないよ。
949デフォルトの名無しさん:2007/06/12(火) 23:49:31
ぬるぽを返したり代入したりする場合はNULLマクロ使っちゃっていいんじゃない?
950デフォルトの名無しさん:2007/06/13(水) 00:06:40
int *a ,b;
a = &b;
*a = 111;
printf("ポインタaの値は%dです。\n", *a);

これはビルドできるのに


int *a = 0;
*a = 111;
printf("ポインタaの値は%dです。\n", *a);

これはできないですね、、、。
大学でnullはできるだけ使わないようにと教授が言ってたけど
それに関係してるのかな。。
951デフォルトの名無しさん:2007/06/13(水) 00:08:52
下の例ではaは何も指してないだろ
952デフォルトの名無しさん:2007/06/13(水) 00:09:13
ポインタの実態はアドレス。これ以上議論しても無駄。適切に使えないのは
それに関して理解していないから。
953デフォルトの名無しさん:2007/06/13(水) 00:11:08
>>950
printf("%p\n", a);でaの値を比べてみ
954デフォルトの名無しさん:2007/06/13(水) 00:11:21
そうかnullは、アドレス00000000で初期化している訳ではなくて
アドレス自体がnull、空なんだ。
だから指してる変数が存在しない、ビルドできないと・・・。
また一つ判ったぞー。
955デフォルトの名無しさん:2007/06/13(水) 00:15:07
ヌルポインタのビットパターンが0でない例については CFAQ 5章 ヌルポインター 参照
http://www.kouno.jp/home/c_faq/c5.html#17
956デフォルトの名無しさん:2007/06/13(水) 00:22:31
>>899を書いたものなんだが、>>898はまだいるのかな?
スマンが俺は嘘を教えてしまったらしい。

malloc関数はvoid *を返すがそれを代入する際にキャストは必要ない。
俺も間違って覚えていたようだ。
実際に、VCで確認したが警告等は出なかった。

ttp://ja.wikipedia.org/wiki/Malloc
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa16.html

ただ、多くのサイトで「キャストが必要」と説明されていて、実際にそう覚えている人も多いと思う。
個人的には知識の一つとして覚えておいて、するしないは周りにあわせる等でいいと思う。
俺は今後もキャストすると思う。↓みたいなミスを避けたいってのが理由。
int * p = malloc( sizeof( double ) * 100 );
957デフォルトの名無しさん:2007/06/13(水) 00:23:29
C++は必要だった筈
958デフォルトの名無しさん:2007/06/13(水) 00:48:26
>nullはできるだけ使わないように
えっ?
959デフォルトの名無しさん:2007/06/13(水) 00:55:19
NULLはポインタ変数への代入と比較なら全然おkだよ
ポインタ以外との演算やNULLに加算とかしちゃ駄目って事のはず
960デフォルトの名無しさん:2007/06/13(水) 01:05:36
お前らほんっとうにぬるぽだな
961デフォルトの名無しさん:2007/06/13(水) 01:33:33
  >∠二 ゞ
  ( ・∀・). | | ガッ
 と    ) | |
   Y /ノ 人
    / ) <  >__Λ∩
  _/し'  . V`Д´)/
 (_フ彡      /  ←>>960
962デフォルトの名無しさん:2007/06/13(水) 07:37:00
実際の0番地をポイントしたいときはどうするの
int *a = (int *)0x00000000;
でええのか
963デフォルトの名無しさん:2007/06/13(水) 08:25:45
>>958
うん、言われた。
nullはできるだけ使わない事
gotoは一切使わない事
do while文もできるだけ使わない事
switch文もできるだけ使わない事

どれも理由は知らない、、、けど下の3っつは何となく想像はつく。
964デフォルトの名無しさん:2007/06/13(水) 08:33:42
おいおい、どこの馬鹿教授だよwww
今後信用し続けてたりすると、いつか痛い目にあうなそれ。

「このループはどうやって、抜けたらいいんでしょうか?」
「NULLで判断しろよ」
「え? nullはできるだけ使わない事、って教授が言ってましたけど?」
「・・・??」


switchを使うとパッと見わかりやすくなるし、
コマンドラインからの引数処理は、たいていこれ使ってるぞ。
965デフォルトの名無しさん:2007/06/13(水) 08:42:53
>nullはできるだけ使わない事
たとえばfopen()の戻り値チェックはどうするの?

>gotoは一切使わない事
多重ループからの脱出や例外処理に移行したいときにスムーズに書けるのに?

>do while文もできるだけ使わない事
必ず一回はループに突入させなければいけないときに無駄なフラグ変数を使えと?

>switch文もできるだけ使わない事
巷に溢れるイベント処理系の関数の立場は?

どれも適材適所なので、弁えて使えばいいだけの話。
966デフォルトの名無しさん:2007/06/13(水) 10:02:45
「できるだけ」っていうのは使う必要がないところで無理やり使うなということさ
967デフォルトの名無しさん:2007/06/13(水) 11:30:37
C言語を学ぶときに一番効率的で表示もいいエディターを教えて下さい。
968デフォルトの名無しさん:2007/06/13(水) 11:31:15
VisualStudio
969デフォルトの名無しさん:2007/06/13(水) 12:37:57
情報系の教授には変な奴もいるからな。
鵜呑みにしない方がいいぞ。
ttp://www.pro.or.jp/~fuji/computerbooks/c/c.modula2.html
970C++:2007/06/13(水) 12:45:31
IDがネ申だったので記念真紀子
971デフォルトの名無しさん:2007/06/13(水) 13:22:45
NULLは0や””との違いを説明するのが面倒だから禁止にしたのだろう。
大学なんぞ専門学部でも無い限り基礎しか教えない。
文字列操作以外は知らなくても何とかなる。
文字列はきついので「できるだけ」と言ったのだろう。

gotoは知らなくても問題無いし、実際俺も使わないようにしてるので
禁止というのはよくわかる。

do whileも無くても問題ないしDQNが使うとバグの元になるから敬遠してるのだろう。
上級者でも疲れてたりするとたまーーに間違うし。

switchは知ってた方がいいと思うが、知らなくても力技で何とかなるし
ifで複雑な分岐をする場合に耐性がついていいと考えたのだろう。
深いネストは慣れていないと錯乱する。
深くネストするな、という議論もあるかもしれんが。

以上、勝手な想像。
972デフォルトの名無しさん:2007/06/13(水) 13:33:20
初心者は鳴き禁止、面前でやれ。 みたいなもんだ。たいした意味はない。
973デフォルトの名無しさん:2007/06/13(水) 15:31:11
>do whileも無くても問題ないしDQNが使うとバグの元になるから敬遠してるのだろう。
>上級者でも疲れてたりするとたまーーに間違うし。
それは上級者とは言わんなぁ。
つーか、どう間違うのか具体的なサンプル希望。
974デフォルトの名無しさん:2007/06/13(水) 15:32:26
while(){}が間違うのと同程度にdo{}while()も間違うといっているのだろうw
975デフォルトの名無しさん:2007/06/13(水) 15:42:34
>>974
それだと禁止する理由にならないようなw
他の言語をやってたからrepeat-until(つまりdo-whileとは逆論理)と勘違いするって言ってた香具師はいたな。
976デフォルトの名無しさん:2007/06/13(水) 16:00:46
制御構造はなるべく少なくしておきたいんだろう。
まあ>>972だなあ
977デフォルトの名無しさん:2007/06/13(水) 16:01:03
>>971
while {} は for で代替できるが、do {} while はそうはいかん。

だが、まあ初学者に対しての話なんだから
俺も >>972 に同意しとこう。
978デフォルトの名無しさん:2007/06/13(水) 16:16:03
オレ、オレ、情報系の学部だったけど

最初の授業の「hello world」でポインタ使わされたぜw

しかも初心者の内は「配列禁止」で全部ポインタでレポート出されたぜwww

初心者の内は配列つかっちゃダメってどうなのよ
979デフォルトの名無しさん:2007/06/13(水) 16:23:26
初心者はCを使うべきじゃないし
Cを使うならポインタ(のラッパーとも言うべき配列も含む)使いまくるべき。
中途半端な使い方するならCを使う意味がない。
980デフォルトの名無しさん:2007/06/13(水) 16:25:20
>>978
別に珍しい事じゃない、そういう入門書もすくなからずある。
まあ変わってるにはちがいないが。
981デフォルトの名無しさん:2007/06/13(水) 18:19:32
ポインタから入った方が配列とか、分かりやすいんだぜ?

と、アセンブラから入った人間が申しております
982デフォルトの名無しさん:2007/06/13(水) 19:49:56
組込の部署に配属された者です。担当した案件では、構造体のメンバにアクセスするのに、
演算子ではなく、ベースアドレス+オフセットを使用してコーディングされています。当
然ながら、なんだってこんな面倒なことをするのか、と聞いたところ、組込のようにリソ
ースが限られた環境では、負荷を考慮してこのような手法を使用することもある、とのこ
とでした。

僕としては、今時のコンパイラなら適切に処理してくれそうなものだし、組込とはいえ今
のCPUなら大した負荷にもならないのではないか、と思っています。ただしこの考えに根
拠が有るわけではありません。

そこで質問なのですが、リソースが限られた環境では、現在でもアドレス+オフセットで
アクセスしたりするものなのでしょうか? 組込なので通常よりも更にメモリ操作が重要
になることは理解しているのですが。
983デフォルトの名無しさん:2007/06/13(水) 20:00:50
>>982
組み込みっつっても幅が広い。
今時のコンパイラ、今時のCPUといわれても・・・
984デフォルトの名無しさん:2007/06/13(水) 20:02:10
メンバ参照したときのアセンブラコードと
ベース+オフセット参照したときのアセンブラコードを比較すれば良いと思うよ。

構造体を一切使わず(宣言も含めて)、一貫してそうしているのなら
アライメントを制御できないコンパイラを使ってるから… というのはありえるかもしれん
985デフォルトの名無しさん:2007/06/13(水) 20:05:00
使ってるコンパイラのオプティマイズが激しく糞なのか
それともその部s(ry
986デフォルトの名無しさん:2007/06/13(水) 20:15:31
>>981
でも、ポインタの加減算はなにがなんでも 1byte 単位と勘違いする罠
987982:2007/06/13(水) 20:20:41
コンパイラはgcc、CPUはペンティアム4です。だから、将に「今時」といって良いと思い
ます。ただし質問の意図はもうちょっと俯瞰的なもので、現在であっても条件によっては
このような手法が取られることが有るのかどうかが知りたい、という物でした。

アセンブラコードの比較は現在の私から敷居が高いのですが、参考になりました。尚、こ
のような手法を取ったのは、担当者の趣味も反映されているような気はします。
988デフォルトの名無しさん:2007/06/13(水) 20:25:43
ていうか変数とか要らなくね?
static unsigned char *mem[10000000];
だけで十分じゃね?
989デフォルトの名無しさん:2007/06/13(水) 20:30:09
>>986
いや、その勘違いがないようにポインタから入った方がいいと思うんだ。
>>987
???どこが組み込みwwww
(クロス開発なんだろうけど・・・・)
990デフォルトの名無しさん:2007/06/13(水) 20:34:27
>>987
組み込みの実行環境のCPUと開発環境のPCのCPUは関係ない。
携帯とかだとスペックはかなり上がってきてるけど、
冷蔵庫とかだと、クソ低い。
下手するとOSすら乗らん。
991デフォルトの名無しさん:2007/06/13(水) 20:36:33
>>987
スレの流れからするとペンティアム4がターゲットCPUってことでいいのかな?
992デフォルトの名無しさん:2007/06/13(水) 20:37:55
>>987
Pen4が載ったシステムに組み込み?
993987:2007/06/13(水) 20:40:09
>>990
あ、勿論ターゲットの方がペンティアムです。因みにOSはVxWorksです。
ターゲットとしてはかなり高性能だと思います。入社したてなので案件の
詳細は知りません。
994デフォルトの名無しさん:2007/06/13(水) 20:43:40
おまいら誰か次スレたてないの?
俺は無理でした
995デフォルトの名無しさん:2007/06/13(水) 20:46:10
>>982
そうやってるやつと、そうやってないやつの2種類でコンパイルして、
バイナリを比較してみればいいじゃないの。
996デフォルトの名無しさん:2007/06/13(水) 20:47:01
そんな外出レスでスレ埋めんなタコ
もう少し空気嫁よ
997デフォルトの名無しさん:2007/06/13(水) 20:48:58
C言語なら俺に聞け(入門篇) Part 14
http://pc11.2ch.net/test/read.cgi/tech/1181735298/
998デフォルトの名無しさん:2007/06/13(水) 20:55:25
>>995
せめてアセンブリコードを出力して比較しろよ
999987:2007/06/13(水) 21:02:55
皆さん回答をありがとう。参考になりました。
1000デフォルトの名無しさん:2007/06/13(水) 21:05:37
987のモチベーションの低下を懸念しつつgets(1000)!!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。