C言語なら、俺に聞け! <9>
■ このスレッドは過去ログ倉庫に格納されています
0001C言語ハッカー Kusakabe Youichi
NGNGあちこちの言語に手を出したが結局極めたのはC言語だけだった。
大体のことなら分かるからオレに聞け。
だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。
・comp.lang.c Frequently Asked Questions
http://www.eskimo.com/~scs/C-faq/top.html
・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
・前スレ C言語なら、オレに聞け! <8>
http://pc.2ch.net/test/read.cgi/tech/1005811510/l50
0263Kusakabe Youichi
NGNG> まぁ char *buf = (char*)malloc( size ); と
> 書ければすむ話なんですがね。
っていうか、その表記が許されたとしても、
「宣言と代入が離れすぎていて、freeが先におこなわないことを保証できない」
コードって問題でしょ?
たとえば宣言をmallocからの代入の「すぐ近く」に置くことで、
freeがそれより前の行になってしまうようなものはコンパイル時にエラーに
できちゃうわけで。
> better C としてのC++利用。
Cでもできますね > ブロックの先頭以外に変数宣言を書く。
> 初期化は、こういうことを為かもしれませんね。
> char *a = NULL; char *b = NULL;
>
> if( !a = malloc( size ) ) goto error;
> if( !b = malloc( size ) ) goto error;
> --snip--
> error:
> free(a); free(b)
はい。たぶんそういうことをやりたいんでしょうね。
でもそれはずいぶん汚い書き方ですよね。そっちのほほうを何とかすべきで
あって、「NULLを入れておかないと危険」なような書き方自体に問題がある
わけです。
0264デフォルトの名無しさん
NGNGfree(hoge)hoge=NULL; なんだけどなあ・・・
つまりhogeにはまともなポインタかNULL以外入って欲しく無いし
それでバグ取りがやり易かったり超実用的なんだけど・・・
こんな事言うと「そんなヘボい構造自体が」とか言われそうだけど
私が書いたんじゃないんだよなあ
って言うと「そもそもそう言う設計自体が」って来るんだろねえ (^∀^)アハハッ
0265Kusakabe Youichi
NGNG> if(hoge)free(hoge); と言うより
> free(hoge)hoge=NULL; なんだけどなあ
なるほどfreeしたあとですか?
だったら、宣言時だけじゃあだめですね。
(freeしたたびに代入ですかー)
> つまりhogeにはまともなポインタかNULL以外入って欲しく無いし
でもそれはfreeに渡す変数だけじゃなく、すべてのポインターに関して
言えるのでは?
(ある時点でその指しているものが無意味に成ってしまうポインター変数なんて
いくらでもありそうですし)
> それでバグ取りがやり易かったり超実用的なんだけど
ですからそれは「本末転倒」ってやつですね。
「わかりにくいプログラム」を「わかりやすく直す」ことをせずに、
デバッグしやすくする方法って感じですね。
0266デフォルトの名無しさん
NGNG構造体ポインタはちょっと、、とか平気で言っちゃう人もプロジェクトには居る訳ですね
嫌あなたが超絶天才的C言語完全体なのはわかりますがね。
実際そう言う人とやってくのが仕事な訳ですよ、ええ。
そう言う人相手に「for使うならカウンタの初期化は無駄です」なんて
教えると会社潰れる位のつけ払う事になりますわ、多分
0267デフォルトの名無しさん
NGNG0268Kusakabe Youichi
NGNG> とにかくこの人は言ってる事がかなりヤバイです、いやホント。
「ということにしたい」のですね? :)
> 構造体ポインタはちょっと、、とか平気で言っちゃう人もプロジェクトには居る訳ですね
意味がわからないですが...
「構造体ポインタは使わないほうがいい」という人がプロジェクトにいたりする
っていう意味ですか?
っていうか、そんな人が平気で存在できるようなプロジェクトや会社に
自分がいるっていう事実はどう認識しているのですか? :)
> 実際そう言う人とやってくのが仕事な訳ですよ、
自分のあまりにも情けない環境を「世の中のごくふつう」だと
思い込みたいからといって、事実をねじまげるには無理がありますね :)
0269Kusakabe Youichi
NGNG> 糞壁はその存在自体が壮大なネタだからね
こういうのがいっぱい暴れて会話の邪魔をするところなんですね。
2chって。
0270デフォルトの名無しさん
NGNG0271デフォルトの名無しさん
NGNG氏んだです (´ー`)
0272Kusakabe Youichi
NGNG> Kusakabe Youichi先生は4徹でデバッグとかした事有りますか?
それって何ですか? > 4徹
0273デフォルトの名無しさん
NGNGえっネタじゃ無いんですか? (^^;
0274iku
NGNGあ い うのデータを
CSVにあ,い,うという形で出力する方法を知りたいのですが,
教えて頂けないでしょうか?
それともう一つ,
もしその出力するCSV1にデータが存在していた場合,
初期化してからデータ出力をしたいのですが,
どうすれば初期化できるのでしょうか?
よろしくお願いします。m(_ _)m
0275Kusakabe Youichi
NGNG> こんにちは。ikuと言います。
> あ い うのデータを
> CSVにあ,い,うという形で出力する方法を知りたいのですが,
> 教えて頂けないでしょうか?
ふつうに書けばいいのでは?
でも文字列は全部「"」で括ってたような > ふつうのCSV
> それともう一つ,
> もしその出力するCSV1にデータが存在していた場合,
> 初期化してからデータ出力をしたいのですが,
man fopen
0277デフォルトの名無しさん
NGNGここでしつこく語ってるかと言うと、fjでは突っ込まれるのが怖くて
発言できなかったから。
0278デフォルトの名無しさん
NGNG要するに、日本語を含んだスペース区切りのCSVを
コンマ区切りにCSVに直した言ってことか?
普通にスペースをコンマにReplaceすりゃいいじゃん。
C言語でやると漢字の2バイト目にスペースと同じ文字コードが
含まれてる可能性があって、分岐がめんどくさくなるような。
0279Kusakabe Youichi
NGNG> なんで、こいつは、fjでほとんど発言しなかったfree()問題を
> ここでしつこく語ってるかと言うと、
はつみみですね。fjで何度か話題になったのは、
「exitするときにいちいちfreeコードは意味があるか?」という
話題なので、全然ちがう話題ですね。
> fjでは突っ込まれるのが怖くて発言できなかったから。
ということにしたいわけですね? :)
(それで私の発言は見なかったことにしてるのですね^^)
0280デフォルトの名無しさん
NGNGCODE COMPLETE 読みましょう。
私は dangling pointer 嫌いです。ただ C だと全面的に dangling pointer
を追放するのは難しい(いちいち NULL を自分で代入しないとならなず、現実
的ではない)から、諦めてますけど。
C++ を使う場合には「所有する」オブジェクトに関しては std::auto_ptr な
どのスマートポインタを多用しますし、また関連を張るために使うポインタに
ついては NULL or 意味のあるポインタ値が常に保たれるように注意します。
0281名無し
NGNGvisualC++でそのプログラムを
見るにはどうしたらいいのんですか?
0282デフォルトの名無しさん
NGNG0283デフォルトの名無しさん
NGNG> Cでもできますね > ブロックの先頭以外に変数宣言を書く。
できませんよ。途中にブロックを作ってその先頭に変数宣言を
書くことはできますが。
0284Kusakabe Youichi
NGNG> >>263
> > Cでもできますね > ブロックの先頭以外に変数宣言を書く。
>
> できませんよ。
いえできますよ。
> 途中にブロックを作ってその先頭に変数宣言を書くことはできますが。
そりゃもちろんできますね。でもそれは「ブロックの先頭」ですね。
逆アセンブルすればいい。MSDNをよく調べろ。
つーか、コンパイルがなんであるか良く分かってないだろ。
0286デフォルトの名無しさん
NGNGC99からはブロックの途中から変数宣言できるようになったんですか?
ANSI X3.159 の古い規格しか知らない物で。
0288デフォルトの名無しさん
NGNGC99からできるようになったのよ。
http://std.dkuug.dk/JTC1/SC22/WG14/ 参照のこと。
厳密じゃなくてもいいなら http://seclan.dll.jp/ あたりもお手軽かも。
# 単にCと言った場合は混乱するなあ。規格の趣旨から言うと現行規格は
# ISO/IEC 9899:1999のみなんだけどさ。
0289Kusakabe Youichi
NGNG> C99からはブロックの途中から変数宣言できるようになったんですか?
なってますよ。
for (int i = 0; ... みたいなのもできるし。
複合定数も、指定付き初期化も。
0290デフォルトの名無しさん
NGNGC99サポートしたコンパイラなんてまだ一般的ではないんだから、一言
「C99では」と前置きしとけ。
0291Kusakabe Youichi
NGNG> ここはニュースグループじゃないんだから(Iyぢ無駄な引用はするなボケ。
また「ニュースグループ」とかわけのわからないこと言うやつがいた :)
0292Kusakabe Youichi
NGNG> # 単にCと言った場合は混乱するなあ。
混乱しないでしょ? override...じゃないや、えっとようするに
新しいのが古いのを上書きしてるんだし。
0293デフォルトの名無しさん
NGNG0294デフォルトの名無しさん
NGNGJIS があるやん。
0295288
NGNG> override...じゃないや、えっとようするに
outdate
> 新しいのが古いのを上書きしてるんだし。
288でもそのように書いたつもりですが。
ANSI X3.159-1989、ISO/IEC 9899:1990、ISO/IEC 9899:1999のそれぞれで仕様が
異なる場合はC89、C90、C99と明記することが多くありません? (いまだにC9Xと
呼んでる人もいるけど)
念の為、これはISO/IEC JTC1/SC22/WG14のmailing archiveやcomp.lang.cを読んだ感想です。
C99に対応していないgcc2.95.3を使っている俺としては、
C99でしか使えないことは明記して貰うとありがたい。
0297Kusakabe Youichi
NGNG> > 新しいのが古いのを上書きしてるんだし。
> 288でもそのように書いたつもりですが。
> ANSI X3.159-1989、ISO/IEC 9899:1990、ISO/IEC 9899:1999のそれぞれで仕様が
> 異なる場合はC89、C90、C99と明記することが多くありません?
うーん、C90っていう言い方はあまり聞かないですね。
C89でまとめちゃってる気がする。
> (いまだにC9Xと呼んでる人もいるけど)
C99をそう呼ぶひとってのは、確実にC90とはいいそうにないですね。
0298288
NGNG> うーん、C90っていう言い方はあまり聞かないですね。
ほとんど一緒ですから。
> C99をそう呼ぶひとってのは、確実にC90とはいいそうにないですね。
そんなことないですよ。C99がdraftのころは自分のことをC9Xと呼びつつ、
ANSIを参照するときはC89、ISOを参照するとき(めったにないけど)はC90
と書いてました。その時のくせがまだ抜けない人もいるみたいです。
0299デフォルトの名無しさん
NGNGネタにマジレスですか?
0300デフォルトの名無しさん
NGNG0301デフォルトの名無しさん
NGNGそれがC言語と関係あるのか? 荒らしたいならプログラマー板の隔離スレに
いけ、ヴァカ。
0302namber
NGNGint **a;
としたときの動的変数のメモリ確保の方法がわかりません。
例えば、
int a[3][3];
と同じ大きさのメモリを確保する場合どうしたらよいでしょう。
どうぞよろしくおねがいします。
0303デフォルトの名無しさん
NGNGint a[3][3] の置き換えならば、
int **a; ではなくて、
int (*a)[3]; であろう。
0304デフォルトの名無しさん
NGNGC FAQ見れ。
0306デフォルトの名無しさん
NGNGprintf("%s", s);
printf(s);
これって実行結果同じ?
0307デフォルトの名無しさん
NGNG文字列に代入文字があると変わる。
だからprintf(s)は危険。
0308デフォルトの名無しさん
NGNGもう
「K&R読め」
の時代でなくて
「C99の規格書読め」
という時代なの?
0309307
NGNGとりあえず、printf関数の第一引数は文字列定数にするべき。
#include <stdio.h>
main()
{
char *s;
s = "%%";
printf("%s", s);
printf("\n");
printf(s);
printf("\n");
}
--------------
%%
%
こんなふうに、、、
0311デフォルトの名無しさん
NGNGそれはまだいいよ。
#include <stdio.h>
main()
{
char *s;
s="%d";/* %sとでもよい */
printf(s);
}
----------------------
こういうことをすると、必要な引数が足りなくて、無いものを参照しようとして実行時にエラーになると思う。
0312311
NGNG○ /* %sとかでもよい */
0313デフォルトの名無しさん
NGNGよし、盛大に騙ってやろう。
まず、C99では以下のような関数定義が可能になった。
もちろん今までのようなold styleも許される。
int
main(argc, argv)
int argc;
char **argv;
{ return 0; }
0314デフォルトの名無しさん
NGNG変数宣言をカーリーブランケットの外に出せるってこと?
0315デフォルトの名無しさん
NGNG∩
| |
| |
| |
| |
∧_∧ | | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ´Д`)// < 先生!その場合プロトタイプ宣言はどうなりますか!
/ / \___________
/ /| /
__| | .| | __
\  ̄ ̄ ̄ ̄ ̄ \
||\ \
||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
|| || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
.|| ||
0316C99ならここを読め
NGNGhttp://seclan.s5.xrea.com/c99d/
デニス・リッチー氏インタビュー――CとUNIXの開発者が見る未来
http://www.idg.co.jp/lwonline/backnumber/200101/20010112_01_report.html
0317デフォルトの名無しさん
NGNG・・・
一応突っ込んどくね。
0318デフォルトの名無しさん
NGNGこれが2chでいう
「ネタニマジレスカコワルイ」
という奴なのか・・・?
0319デフォルトの名無しさん
NGNG0320デフォルトの名無しさん
NGNGプロトタイプ宣言など必要ない。
型の正当性はプログラマが保証すればよい。
あと、予約語にはentryというのが追加された。
これはエントリポイントを生成し、関数の途中から処理を実行できる。
例えば
int neta(int a)
{
a++;
entry dayo:
a++:
return a;
}
gomen = neta(2);の場合、gomen:4となるが、
gomen = neta.dayo(2)の場合、gomen:3となる。
0321デフォルトの名無しさん
NGNG. ∩
|::|
|::|
∧_∧ |::| ./ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
(:∵´Α`)/:/< 先生!僕は先生しんじてます!
/:∵:∵:∵:/ \____________
/::/|:∵:∵:∵/
__|::| .|:∵:∵:∵|
\  ̄ ̄ ̄ ̄ ̄ ̄ ̄\
||\ \
||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
|| || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
.|| ||
0322デフォルトの名無しさん
NGNGIn article >>710, 710 仕様書無しさん wrote:
> > そんな変なことを言うひともいるんですね。
> そうですよね、ふつー上京は東京に行くことだし、
はつみみです。
730 :仕様書無しさん :01/12/04 18:13
>>722
じょうきょう【上京】
地方から都へ行くこと。現在は,東京へ行くこと。
(新辞林 by 三省堂 @Yahoo! DICTIONARIES)
とありますよ。
「地方から都へ行くこと。」「東京へ行くこと。」のどちらが「普通」かと言
えば現在では後者といっておかしくないでしょう?
744 :スバリ回答 :01/12/04 18:20
民明書房国語辞典
じょうきょう【上京】 [名][自サ]地方から都に出ること。京都へ出ること。
やはり、日下部氏は正しかった。
752 :Kusakabe Youichi :01/12/04 18:27
In article >>741, 741 困った wrote:
> 清水国語辞典
> じょうきょう【上京】 ジヤウキヤウ[名][自サ]地方から都に出ること‥豕・惱个襪海函
>
> 誤植ですね。
民明書房国語辞典 じょうきょう【上京】 [名][自サ]地方から都に出ること。京都へ出ること。
0323デフォルトの名無しさん
NGNGprintf("%s",str);
と書きますが、HTML的には
printf("%s%",str);
と前と後ろと囲ってもらわないと気持ち悪いです。
0324デフォルトの名無しさん
NGNGその辞書そのものが捏造かもしらんじゃん。
コンパイラー トロジャンという言葉を知らんのか。
0325デフォルトの名無しさん
NGNG厨房相手に反応すんのやめようよ(・∀・)
0326デフォルトの名無しさん
NGNG∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ・∀・)< 辞典はやっぱり民明書房だね♪
( ) \_______
| | |
(__)_)
0327デフォルトの名無しさん
NGNG0328デフォルトの名無しさん
NGNGどうしようもないレスで age るな、バカ。日下部先生を鑑賞するスレはプログラマー板
にあるから、こっちに来るように。
0329デフォルトの名無しさん
NGNG#define Today 25
と
const int today=25;
と書くのとは、どちらがいいのでしょうかね?
みなさんはどちらを書くんですか?教えてください。(出来れば理由などもあればお願いします)
よろしくお願いします。
0330デフォルトの名無しさん
NGNGenum のほうがよいんじゃない?
理由:gdbで25がtodayに読める
0331名無しさん@お腹いっぱい。
NGNG#include <math.h>
int N;
double M=10.0+h,h,pi=M_PI; ←ここのhと
void integ();
double f(double);
main()
{
h=1.5;
integ();
h=0.5;
integ();
void integ() ←ここが
{
double daikei=0.,simpson=0.;
int i;
N=M/h;
for(i=-N;i<=N;i++){daikei +=f(i*h);}
daikei *=h;
for(i=-N;i<=N;i+=2){simpson +=4.*f(i*h);}
for(i=-N;i<=N-1;i+=2){simpson +=2.*f(i*h);}
simpson *=h/3.0;
printf("\n h=%lf\n",h);
printf("sqrt(pi)=%15.10e\n",sqrt(pi));
printf("daikei =%15.10e\n",daikei);
printf("simpson =%15.10e\n",simpson);
}
}
double f(double x)
{
return exp(-x*x);
}
コンパイルしてもうまくいかないんですけど、どうしてでしょうか?
よろしかったら教えてください。
0332Kusakabe Youichi
NGNG> 例えば、
> int a[3][3];
> と同じ大きさのメモリを確保する場合どうしたらよいでしょう。
(sizeof(int) * 3 * 3)では?
0333Kusakabe Youichi
NGNG> char *s;
> printf("%s", s);
> printf(s);
> これって実行結果同じ?
sのなかにバックスラッシュや%がなければね。
0334Kusakabe Youichi
NGNG> だれかC99について盛大に語って。
> もう
> 「K&R読め」
> の時代でなくて
> 「C99の規格書読め」
> という時代なの?
K&RもC99対応のが出るのでは?
0335Kusakabe Youichi
NGNG> >>306
> とりあえず、printf関数の第一引数は文字列定数にするべき。
なんで連体形?
0336Kusakabe Youichi
NGNG> >>313
> 変数宣言をカーリーブランケットの外に出せるってこと?
ライナスがいつも持っているやつですね! > ブランケット
ライナス 《漫画 Peanuts に登場する Lucy の弟;
いつも安心毛布 (security blanket) を持ち歩くインテリ少年》
―民明書房刊『ライナスのすべて』より
0337デフォルトの名無しさん
NGNG0338デフォルトの名無しさん
NGNGネタはやめれ。
0339デフォルトの名無しさん
NGNGsizeof(int[3][3])じゃだめ?
0340デフォルトの名無しさん
NGNG用途おしえて
0341デフォルトの名無しさん
NGNGprintf("kusakabe");
0342デフォルトの名無しさん
NGNGvoid callback(void)
{
;
}
用途は実行速度を飛躍的に高める。
0343Kusakabe Youichi
NGNG> todayを25置き換える場合、
> #define Today 25
> と
> const int today=25;
> と書くのとは、どちらがいいのでしょうかね?
第4章に書いてありますね。
0344デフォルトの名無しさん
NGNGvoid inarticle(char *wrote)
{
puts("kusakabe");
}
0345Kusakabe Youichi
NGNG> double M=10.0+h,h,pi=M_PI; ←ここのhと
> void integ() ←ここが
> コンパイルしてもうまくいかないんですけど、
いくわけないですね。
> どうしてでしょうか?
書き方がまちがっているからです。
0346Kusakabe Youichi
NGNG> >>332
> sizeof(int[3][3])じゃだめ?
問題ないね。
0347デフォルトの名無しさん
NGNG> double M=10.0+h,h,pi=M_PI; ←ここのhと
宣言前にhを参照してるし、hは定数でない。
> void integ() ←ここが
標準的なCでは関数定義はネストできない。
0348デフォルトの名無しさん
NGNGくさかべ名乗ればいいから
ラクに皮肉や否定ができるな。
0349デフォルトの名無しさん
NGNGもともと匿名なんだから、他人の名を借りなくても出来るだろ。
糞壁名乗ってるのは遊んでるだけ。
0350Kusakabe Youchi
NGNGということにしたいのですね?:)
0351デフォルトの名無しさん
NGNG> (sizeof(int) * 3 * 3)では?
ホントに?
問:
int a[3][3];において常に&a[0][3] == &a[1][0]は成り立つか。
(10点)
0352むぎ茶
NGNG0353デフォルトの名無しさん
NGNG成り立つ
0354重複しない乱数考えてみたよ1/2
NGNG#include <memory.h>
#include <time.h>
#include <malloc.h>
#include <stdlib.h>
/* 「くじびき」構造体*/
struct lot{
int *begin; /* 配列先頭*/
int size; /* 配列の要素数 */
int current; /* 配列内の現在の参照オフセット*/
int limit; /* 配列内の現在の有効領域終端オフセット */
};
/* 初期化 */
int init_lot(struct lot* L){
int i,v;
if(!L || !L->begin || L->size<1) return -1; /*err*/
L->limit = L->size - 1;
memset(L->begin,0xff,sizeof(int) * L->size);/* -1は値が未設定とする*/
srand(time(NULL));
i=0;
for(v=0; v<L->size; v++){
if((i+=rand()) >= L->size) i %= L->size;
while(*(L->begin+i)!=-1){ i = (i>=L->size ? 0 : i+1);}
*(L->begin+i) = v;
}
L->current = 0;
return 0;
}
0355重複しない乱数考えてみたよ2/2
NGNGint draw_lot(struct lot* L){
int ret;
if(!L || !L->begin || L->size<1 || L->limit<0) return -1; /* err */
if(L->limit > 0){
L->current += rand();
if(L->current > L->limit) L->current %= L->limit;
}
ret = *(L->begin + L->current);
*(L->begin + L->current) = *(L->begin + L->limit);
*(L->begin + L->limit) = ret;
L->limit--;
return ret;
}
/* リセット */
int reset_lot(struct lot* L){
if(!L || !L->begin || L->size<1) return -1; /* err */
L->limit = L->size - 1;
srand(time(NULL));
return 0;
}
/* 使用例 (コマンドラインで配列サイズと試行回数を指定)*/
int main(int argc, char *argv[]){
struct lot lotlot;
int i, n, size=10,loop=10;
if(argc>1) size = atoi(argv[1]);
if(argc>2) loop = atoi(argv[2]);
lotlot.begin = malloc(sizeof(int)*size);
lotlot.size = size;
init_lot(&lotlot);
for(i=0;i<loop;i++){
while((n=draw_lot(&lotlot))!=-1) printf("%2d ",n);
printf("\n");
reset_lot(&lotlot);
}
free(lotlot.begin);
return 0;
}
0356デフォルトの名無しさん
NGNGなにがしかの関数呼び出しの際、そこに渡す引数名と
渡した後、そこの内部で使われる引数名は
似たような名前にしたらイカンとですか?
0357Kusakabe Youchi
NGNGそんなことも分からないような人がいるからですね:)
0358デフォルトの名無しさん
NGNGべつにそんなこと無いんじゃない?
0359デフォルトの名無しさん
NGNG必ずしもなりたたないよー。
0360同じような
NGNGそして関数に渡した
んで、maxを入れてることが分かりやすいようにと思って、渡され側にも「max」と入れようとしたら
「何やってるかわからなくなるから、そこは limit とでもしといて」
だって。
余計に分かりづらいやないかい。
0361デフォルトの名無しさん
NGNG残念はずれ。
■ このスレッドは過去ログ倉庫に格納されています