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

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2007/11/05(月) 00:31:26
>>951
それならなおさらアドレス渡しでいいじゃん
953デフォルトの名無しさん:2007/11/05(月) 00:38:26
>引数の引き渡しには,値渡しと参照渡しがある.
>C言語では,特別なことをしない限り,変数は値渡し,配列は参照渡しになる
今まで配列も値渡しだと思っていました…納得できました。

ありがとございましたー
954920:2007/11/05(月) 11:44:12
検証してくださった方、ありがとうございます。

#include <stdio.h>
int main(void)
{
int c;
do {
printf("%d ", c = fgetc(stdin));
} while (c != EOF);
return 0;
}

このプログラムを実行し、
コマンドラインから"abc^Zdef"を入力すると、(^ZはCtrl+Z)

D:\c\my\test5>test5.exe
abc^Zdef
97 98 99 26

と表示され、入力待ちになります。
955920:2007/11/05(月) 11:44:52
それに対して、

61 62 63 1A 64 65 66

の内容のテキストファイル(↑は16進ダンプしたもの)をstdinにリダイレクトして
実行してみたところ、

D:\c\my\test5>test5.exe < test.txt
97 98 99 -1

このような結果になり、プログラムが終了しました。

プログラムは全てVC++2005でコンパイルしました。
どうやらコマンドラインの行中にEOF(0x1A)があった場合、
stdio.hで定義されたEOF(-1)ではなく、
テキストファイルでのEOF(0x1A)として読み込むようです…。

BCC5.5.1ではどちらの場合も、

97 98 99 -1

と表示され、プログラムが終了します。
956デフォルトの名無しさん:2007/11/05(月) 12:56:46
製品版では直ってるのかな。
一応、MSに報告したらどうだろ。
957デフォルトの名無しさん:2007/11/05(月) 13:09:38
別にエラーじゃないのでは?
EOFのASCIIコードを表示しているのだから
958デフォルトの名無しさん:2007/11/05(月) 13:11:09
EOFのアスキーコードじゃないよ。
959デフォルトの名無しさん:2007/11/05(月) 13:12:35
EOF じゃなくて SUB だな。
つーか単なる ^Z だが。
960920:2007/11/05(月) 13:52:32
>>958 >>959
http://ja.wikipedia.org/wiki/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB
>ASCIIでは例えば、改行文字は0x10、水平タブは0x09、EOF(End Of File、ファイル終端マーク)は0x1Aである。
961920:2007/11/05(月) 14:01:52
>>957
コマンドラインの行頭にあるEOFや、リダイレクトされたファイルにあるEOFは
stdio.hに定義されたEOF(-1)と読み取ることを考えると、一貫性が無いように思えます。
962デフォルトの名無しさん:2007/11/05(月) 14:12:08
ASCII に EOF なんて無いだろ。
それ書いたの誰だよ?

ttp://e-words.jp/p/r-ascii.html
ttp://ja.wikipedia.org/wiki/ASCII
ttp://www.mew.org/Newsletters/6.html
963デフォルトの名無しさん :2007/11/05(月) 18:42:18
そりゃ、文字コード体系表見てもEOFなんてあるわけないわな。
964デフォルトの名無しさん:2007/11/05(月) 21:29:32
c言語の除算はどのようなアルゴリズムで行っているんでしょうか?
わかる方がいればよろしくお願いします
965デフォルトの名無しさん :2007/11/05(月) 22:03:20
>>964
コンパイラによるんじゃないでしょうか。
あと、たぶん、かなりアセンブラよりの質問だと思います。
966デフォルトの名無しさん:2007/11/05(月) 22:04:36
CPUよりの話でしょう
浮動小数点や整数演算はハードでします
967デフォルトの名無しさん:2007/11/05(月) 22:09:11
テキストモードでfopenしたら0x1aで終了だろ
968デフォルトの名無しさん:2007/11/05(月) 22:13:31
いつまで、CP/Mの呪いをひきづらなければならないのやら。
969迷い人:2007/11/05(月) 22:36:25
こんばんは。つぎのようなプログラムがわかりません
1を入力すると

2を入力すると

xx

4を入力すると

xx

xxx

xx

xxxx

xx

xxx

xx

となるようなものです。途中まではかけたのですが肝心なところがよくわかりませんでした。
途中までは次のようになりました
970迷い人:2007/11/05(月) 22:37:28
#include <stdio.h>

void X_sequence (int n);
void X_triangle (int n);

main()
{
int n;
printf("Enter a number : ")
scanf("%d",&n);
X_triangle(n);
}

void X_sequence(int n)
{
int i;

for (i=1; i<=n; i++)
printf("X");
printf("\n");
}

void X_triangle(int n)
{・・・・こっからわかりません!

教えてくださいおねがいします
971デフォルトの名無しさん:2007/11/05(月) 22:39:06
if (n > 2) X_triangle(n - 1);
X_sequence(n);
if (n > 2) X_triangle(n - 1);
972デフォルトの名無しさん:2007/11/05(月) 22:39:22
printf("1を入力すると\n
x\n
2を入力すると\n
x\n
xx\n
x\n
4を入力すると\n
x\n
xx\n
x\n
xxx\n
x\n
xx\n
x\n
xxxx\n
x\n
xx\n
x\n
xxx\n
x\n
xx\n
x\n
");
973デフォルトの名無しさん:2007/11/05(月) 22:39:38
if (n >= 2) X_triangle(n - 1);
X_sequence(n);
if (n >= 2) X_triangle(n - 1);
974デフォルトの名無しさん:2007/11/05(月) 23:01:21
ふとオープンソースの午後のこーだのソース見てみたら、C言語だったけど、
どれくらい経験つめばこれくらい書けるようになるんですかね・・・
975デフォルトの名無しさん:2007/11/05(月) 23:15:15
>>974
5000時間くらい。
976デフォルトの名無しさん:2007/11/06(火) 00:19:12
すいません、質問させてください。
rand関数とか、abs関数とか、stdlib.hで宣言されてるってことを聞きました。
で、stdlib.hを探してみて実際に見たところ、確かに宣言されてたんですが、
これら関数の実体って、どのファイルに定義されているんでしょうか。
もしくは、ソースファイルはついてないんでしょうか?(当方Mac OSXです)
見てみたいな、と思いまして・・
977デフォルトの名無しさん :2007/11/06(火) 00:27:18
>>976
そういう関数はライブラリに中身がある
ヘッダーには呼び出しかたが書いてある。
実体を見たいなら、使ってるコンパイラメーカーに聞くしかない。
978976:2007/11/06(火) 00:31:18
>>977
早速のお返事ありがとうございました!了解です。
979デフォルトの名無しさん:2007/11/06(火) 00:33:50
scanfを使って整数型の変数に1〜100の値を入力された時のみ
続く処理をして、それ以外は再度入力を促すプログラムを作りたいです。

入力された値のエラーのチェックにはどんな処理が必要か
わからないので教えてください。

あと数値を入力してEnterを押して実行したあとに
前回入力した数値が残ったままになっているのを
消すにはどうすればいいですか?
980デフォルトの名無しさん :2007/11/06(火) 01:14:14
>>979
#include <stdio.h>
int main()
{
int num;
char buff[12] = {'\0'};
do{
puts("1〜100の数値入力");
fgets(buff,sizeof(buff),stdin);
sscanf(buff,"%d",&num);

}while(1 >= num || num >=100);

/*
1以上100以下の数値が入力されたときの
処理をここに書けば〜
*/
return 0;
}
981980:2007/11/06(火) 01:35:49
訂正
while(1 >= num || num >=100);
       ↓
while(1 > num || num >100);
982デフォルトの名無しさん:2007/11/06(火) 01:58:33
scanfっつてんだから、scanfを使うべきなんじゃなくて?

俺ならこう書くぞ
} while (!(1 <= num && num <= 100));
983デフォルトの名無しさん:2007/11/06(火) 02:02:57
論理演算が苦手そうに見えてもいいならそれでいいんじゃね?
984デフォルトの名無しさん:2007/11/06(火) 02:30:32
すいません。
!についての質問なんですが、

if ( !(fp = fopen("a.c","r")) )

もしこれでfpがNULLでない場合(どこかのメモリアドレスつまり正の整数値)、
if文が偽(つまりNULLつまり0)となると思うのですが、
何故、!(正の整数値)がNULLつまり0になるのですか??ANSIのそういう仕様ですか?


if ( !5 )は偽でNULLつまり0??

(ちなみに、現在ほとんどのstdio.hで #define NULL 0 となっている)
985デフォルトの名無しさん:2007/11/06(火) 02:33:54
!5といえば 1も2も3も・・・負数でさえ含まれますよね。0ももちろん含まれますが
986デフォルトの名無しさん:2007/11/06(火) 02:47:08
#include <stdio.h>

int main(void)
{
FILE *fp;
if ( fp = (FILE*)(NULL == NULL))
;
printf("fp = %p\n", fp);
printf("(int)fp = %d\n", (int)fp);
printf("!5 = %p\n", !5);
return 0;
}




結果
fp = 0x1
(int)fp = 1
!5 = 0x0
987デフォルトの名無しさん:2007/11/06(火) 02:58:34
NULL == NULLは真だから1が返るな
988デフォルトの名無しさん:2007/11/06(火) 05:52:39
>>985
!5は「5以外」じゃないよ。
5を真偽値として評価して真、その否定で結果偽。そんだけ。
989デフォルトの名無しさん:2007/11/06(火) 09:23:16
5以外は !=5 だわな。
990デフォルトの名無しさん:2007/11/06(火) 22:06:26
レビューってどうやってやってる・・・?
なんか自分で書いたソースなのに、うまく説明できなくて凹みまくってる・・・。
頭の中じゃどんな風に動くのかわかってるんだけど、説明となると10あるうち2しか伝える事ができない・・・
991デフォルトの名無しさん:2007/11/06(火) 22:41:32
君が超天才ならしょうがないけど、
凡人なら説明できない程度の理解としか周囲には写らないだろうよ。

誰にでも納得できる説明をする必要があるの?
仕事でレビュア対象に説明するだけなら、レビュアに疑問点・不明点を上げてもらって
それに回答することで納得して貰うのじゃダメ?

レビューの経験を積めば、レビュアの傾向が見えて対策も打てるけど、
例え経験不足だとしてもレビューの前に事前にレビュアと調整しておくって手もある。
凹む前にもっと考えて行動すべきだと思うけどね。
992979:2007/11/06(火) 22:43:34
>>980 >>981 >>982
色んなサンプルソース読んでみても
scanfはあまり使われてないみたいなので
gets,fgetsに変更してみようとおもいます。

なぜなのかは、ぐーぐるさんに聞いてきます
ありがとうございました
993デフォルトの名無しさん:2007/11/06(火) 22:55:21
>>991
あ、えーと、
現状まだまだ勉強の段階なんですが、
int main(void) じゃあそのvoidってナニ?なんでここにintとかおいてるの?っていう
いわば基礎中の基礎の部分なので、プログラムに一切関係のない人でも理解できるように発言して欲しい=学べる
ということなのでやってるんですが、経験をとにかく詰むしかないんですかね・・・うーん。
994デフォルトの名無しさん:2007/11/06(火) 23:20:34
自分で書いたソースを客観的に見ることができないなら、他人に見て貰うといい。
相談できる人が身近にいればその人に協力して貰うのがいい。
相談できる人がいない、探す気もないならここにソース晒してコメントを貰うのでもいいんじゃね?
995デフォルトの名無しさん:2007/11/06(火) 23:50:36
少しお尋ねしたいのですが、
struct _TEST a
{
int num;
char ch;
}test[100] = {0};

こうした場合、test配列の中身が全て0クリアされる動作は保証されていますか?
testが配列でない場合は動作が保証されているとどこかで伺った気はしたのですが
996デフォルトの名無しさん:2007/11/07(水) 00:10:58
保証されている。ついでに言えばtest[100] = { 1 };として場合であっても
1が入るのはtest[0].numだけであって、残りは全て0になる。
997デフォルトの名無しさん:2007/11/07(水) 01:06:24
>>996
ありがとうございます!
998デフォルトの名無しさん:2007/11/07(水) 04:38:52
http://www.geocities.jp/horie_ryu/page01/trans.c

こちらのプログラムをVS2005でそのまま実行しても'fopen'の宣言を確認してくださいと出ます。
同HP (ttp://www.geocities.jp/horie_ryu/page01.html) にあるc1.wavやらを読み込ませて実行したいのです。
fopenで配列を読んでいるのですが、ここにどうやってc1.wavなどを読み込ませればいいのでしょうか?
999デフォルトの名無しさん:2007/11/07(水) 05:12:45
調べてたらコマンドラインで実行すらしらなかったのでなんとかなるかもしれないので失礼します。すみません。
1000デフォルトの名無しさん:2007/11/07(水) 05:29:05
1000げっつ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。