C言語なら俺に聞け! Part 76

このエントリーをはてなブックマークに追加
windowsでもちゅるんできますか?
またちゅるんか!
>>688
これ作ったのアニヲタじゃんw 審査員も普通にわかったりするんかな。
これでakuがsokuコンパイル&実行→sokuがzanコンパイル&実行…で無限ループに
なったらおもしろいな。
725デフォルトの名無しさん:04/04/23 14:25
作ったのは多分日本人だね。
悪・即・斬!
D・V・D!
if ((p = malloc(..)) == NULL)
  return;
if ((fp = fopen(..)) == NULL){
  free(p);
  return;
}
if (fwrite(..)) == -1){
  fclose(fp);
  free(p);
  return;
}

エラー処理が延々と長くなっていくんだけど、なんかカコイイ!記述方法って
ない? オブジェクト指向方面でなんか解法があったと思ったけど、わからん…
if ((p = malloc(..)) == NULL) goto END;
if ((fp = fopen(..)) == NULL) goto END;
if (fwrite(..)) == -1) goto END;
END:
fclose(fp);
free(p);
return;

で、どう?カコイイくは無いと思うが。
C++でならtry...catchがあるけど、ここCスレだし。
>>729を簡略化して

#define try(val, fn) {if ((val = fn) == NULL) goto END;}

と定義してから

try(p, malloc(...))
try(fp, fopen(...))
END:
(後処理)

とか。fwriteをどうするかは聞かんでくれ。
>>728
if ((p = malloc(..)) == NULL) goto MALLOC_ERROR;
if ((fp = fopen(..)) == NULL) goto FOPEN_ERROR;
if (fwrite(..)) == -1) goto FWRITE_ERROR;
goto NULLPO;
FWRITE_ERROR:
fclose(fp);
FOPEN_ERROR:
free(p);
MALLOC_ERROR:
return;
NULLPO:
>>728
おいおい、fwrite()の戻り値を-1と比較しちゃダメじゃん。
733デフォルトの名無しさん:04/04/23 23:02
UNIXのwriteの勘違いしているんだろうな。
fwriteの戻り値の型はsize_t(符号無し整数)だ。
それくらい統一しろよ・・・。
735デフォルトの名無しさん:04/04/23 23:34
PASCALって何につかうんすか?
あとFARも教えて
736デフォルトの名無しさん:04/04/23 23:36
>>734
ハァ?
737デフォルトの名無しさん:04/04/23 23:56
今日始めてCを触ったんですが。

int main()
{
double kai;
double pai = 3.14;
kai = 10 * pai;
printf("%f\n");

return 0;
}

これで、31.400000というのがprintされたんですけど、
この0の数ってのはどこから来てるのかよくわかりません。
31.4と表示するにはどうすればいいのでしょうか。
738デフォルトの名無しさん:04/04/24 00:15
パソコンは数字を二進数で扱っているので少数は
どうしても誤差が生じる。

int main()
{
double kai;
double pai = 3.14;
kai = 10 * pai;
printf("%.1f\n",kai); //%の後に.(ドット)ね

return 0;
}
739デフォルトの名無しさん:04/04/24 00:16
>>737
ネタで言ってるだろ
小数点が必要だからって何故にdoubleなんてつかうんだ
最近まで、%E が意味不明だった者ですが、
たぶん %.1f だと思います。

ネタではないです
intやshortを使ったのですが、0.000000となるのでだめぽと思ったんです

%.1fにすると確かに出来ました。
これは小数点以下1桁を表してるんですかね


ありがとうございました
>>737
>printf("%f\n");
>これで、31.400000というのがprintされたんですけど、

嘘をつくな。
このコードでは何が表示されるか解らんはずだ。
C言語以前の問題なんですがお願いします。
LSI-C 試食版 と
C Pad 開発環境 を
ダウンロードしろと言われたのですが
LSI-C 試食版を落としてからどうすればいいのか
分かりません。どうかお願いします。
744デフォルトの名無しさん:04/04/24 00:38
管制塔がどうこうという話で
初期化で疑問に思う事がでてきました。
memset(strtmp,NULL,MAX_PATH);
memset(strtmp,'\0',MAX_PATH);

NULLはゼロと解釈してますが この場合どう違うのでしょう
>>744
値としては0だが、ポインタとしての0番地を表すのに使うためにある名前なので、
NULLをそこにいれるのは単に間違い。
コンパイルは通ってしまうが。
>>744
>memset(strtmp,NULL,MAX_PATH);

NULLは多くの環境で(void*)でキャストした0が使われる。
memset()の第二引数の型はintなので本来の意味的には

>memset(strtmp,'\0',MAX_PATH);

が正しい。

# 文字定数の型はint
>>744
NULLはNullポインタであって、ゼロではないです。
748デフォルトの名無しさん:04/04/24 00:47
>>745 >>746
分かり良い説明ありがとうございます。
まさにコンパイル通っているので うちのシステムにも問題があると
わかりました。流用ソースの殆どがNULLでコード書いてあるのです。
>>742
書き忘れただけなんじゃねーの
>今日始めてCを触ったんですが。
ここがネタっぽいんだよなぁ。
>>748
まあ、

#define NULL 0

なんて定義があるはずなので実際には変わらないけどね
#define ((void *)0) かもしれない。
今日始めてCを触ったんですが

符号付整数型の負の最大値を-1で割って正しい結果をだしたいのですが
どうしたらいいですか
>>753
>今日始めてCを触ったんですが
嘘だろ?
ごめんなさい
はじめてのCで早くいっちゃいました。
そういや昔「はじめてのC」って本があったな。
電車の中で読むとなぜか周りが引きます。
>>728
fp=NULL;
p=malloc(..);
if(p) fp = fopen(..);
if(fp){
fwrite(..);
fclose(fp);
}
if(p) free(p);
return;
760753:04/04/24 02:51
とりあえず
1の補数表現を用いてる環境系でコンパイル
という結論に達しました
761デフォルトの名無しさん:04/04/24 03:50
enumって、#defeineでやるのとちがって、
「まちがって同じ数値を定義しちゃう」ことがないっていう利点がありますよね?

で、ほかに利点ってありますか?
たとえば、その型以外の変数にその値を代入したり比較したらエラーにしてくれるとか、
逆にその型で宣言した変数にそれ以外のものを代入したらエラーにしてくれるとか
そういう機能はないのですか?
あと、たとえば、型ごとに名前空間が別だとか、そういうのがあればいいのに。
>その型以外の変数にその値を代入したり比較したらエラーにしてくれるとか、
コンパイル時に警告出力しないか?

>逆にその型で宣言した変数にそれ以外のものを代入したらエラーにしてくれるとか
コンパイル時に警告出力しないか?
763デフォルトの名無しさん:04/04/24 03:59
> これで、31.400000というのがprintされたんですけど、

円周率は3だろ。
764デフォルトの名無しさん:04/04/24 04:02
> 小数点が必要だからって何故にdoubleなんてつかうんだ

floatつかうやつはぼけ。
昔からのCのユーザーならかならずdouble使う。
765デフォルトの名無しさん:04/04/24 04:04
> NULLはゼロと解釈してますが この場合どう違うのでしょう

ちがいますゼロがNULLなんです。
766デフォルトの名無しさん:04/04/24 04:05
> 値としては0だが、ポインタとしての0番地を表すのに使うためにある名前なので、

これは大うそ

やーい > しったか
767デフォルトの名無しさん:04/04/24 04:06
> NULLはNullポインタであって、ゼロではないです。

でもゼロはナルポインターです
768デフォルトの名無しさん:04/04/24 04:12
>>762
VC++6.0ですが、-W3でも-W4でも出ませんよ > 警告
>>761
>たとえば、その型以外の変数にその値を代入したり比較したらエラーにしてくれるとか、
>逆にその型で宣言した変数にそれ以外のものを代入したらエラーにしてくれるとか

全く理解できない。enum型以外のenumって何だ?
要するにデータ型の問題ですか?
ポインタの0がぬるぽで
char型の配列に入ってるのはchar型の0

>>768
データ型に互換性があると、勝手にキャストするような...

* $FreeBSD: src/sys/sys/_null.h,v 1.5 2003/12/26 06:11:43 obrien Exp $
*/

#ifndef NULL

#ifdef _KERNEL
#define NULL (void *)0
#else
#if defined(__LP64__)
#define NULL 0L
#else
#define NULL 0
#endif
#endif /* _KERNEL */

#endif
winでCygwin使って書いてるんですけど、上手くいきませんのでご助言
お願いします。
状況
バイナリファイルを開こうとするとfopenに失敗する場合がある。
テキストファイルやexeファイルは上手く開けるが、JPGやMP3については
常に失敗してしまう。

なにが間違っているのでしょうか?