C言語なら、俺に聞け! <18>
■ このスレッドは過去ログ倉庫に格納されています
0001きょうはいいテンキーです。日下部陽一
NGNGいろいろな言語を極めたが、一番手になじむのはCだった。
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プログラマならこれを買っとけ。
・プログラミング言語C(K&Rと呼べば通だ)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/yfcbookshelf-22/250-3950205-1475419
K&Rで挫折するような救いがたいやつはこれでも読め
・作ってわかるCプログラミング(アヒル本と呼べば通だ)
http://dennou.gihyo.co.jp/books/void_c/
http://www.amazon.co.jp/exec/obidos/ASIN/477411328X/249-4698746-2014711
推薦図書/必読書のためのスレッド PART3
http://pc.2ch.net/test/read.cgi/tech/1016722820/
・前スレ C言語なら、俺に聞け! <17>
http://pc.2ch.net/test/read.cgi/tech/1019372139/l50
0286デフォルトの名無しさん
NGNG俺はnullのほうが好み。
でもキーの配置や文字数の関係でnilのほうが打ちやすいことがたった今判明。
とりあえず全角使いまくりのCの定数は片手で打てないので大嫌い。
0287デフォルトの名無しさん
NGNG0288デフォルトの名無しさん
NGNGちゃんとした規格を作った時に、
すでに0で無いコンパイラがあったんでないの?
0289デフォルトの名無しさん
NGNG>>275が言っているのは
#define NULL 1
とかいった実装には、仕様上はなりません。規格では
#define NULL 0 /* または ((void*)0) */
なので必ず偽になる、という意味だと思うがどうか?
0290286
NGNG×全角
○大文字
0291デフォルトの名無しさん
NGNG単純明快だと思うけど。
俺は NULL のほうが要らないと思う。初心者向けに媚びたから
よけいに混乱した。
0292デフォルトの名無しさん
NGNGTRONチップ上のCはnull pointerの表現が0でないと聞いたような気がする。
あとは、0番地のメモリとレジスタ0が同じになってる機械(昔はイパイあっ
た)とかだとnull pointerの表現を0にするのは嫌だろうな。
0293デフォルトの名無しさん
NGNGナルポインタの内部表現も全部0だったら、俺もそれがいいと思う。
そうでない実装があったとき激しく混乱すると思う。
(今でも十分NULLのせいで混乱してるけど)
0294ふか
NGNG関数のプロトタイプが必須のケースって?
漏れが思いつくのは
「2つ以上のアーカイブが相互に関数参照するとき」
以外思いつかないんだけど,あとある?
0295デフォルトの名無しさん
NGNG補足
構文的に、ifは条件式を受け取ることになってる。
if (条件式)
ね。
ここでifに条件式以外の式を渡したとき
if (式)
は
if ((式)!=0)という風に暗黙的に補われるんだ。こういう決まりなの。
んでもってifにポインタ値や、ポインタ値を返す式を渡すと、
if (ポインタ値)
は
if ((ポインタ値)!=0)
になるんだけど、
ポインタ値と0を比較するときには0はヌルポインタに置き換えられるという
ルールも適用されて、つまり、ヌルの時だけ偽、ヌル以外の時真になるわけ。
K&Rとかの文法の書いてあるページを、よーく見てみよう。
そのうちわかるようになるよ。
0296デフォルトの名無しさん
NGNG話題がNULLの在り方にシフト!
0297デフォルトの名無しさん
NGNGmainよりも後ろに関数を書くときとか。
というか書け!
0298デフォルトの名無しさん
NGNGそれおかしいよ。
int *p = NULL;
if (p)
が偽になる理由の説明になってない。
だいいち
#define NULL 1
でも別に規格違反ではない。
0299デフォルトの名無しさん
NGNG0 を NULL として扱う(内部でNULLに変換)のはあまりに強引だというだけ。
0じゃない機械があるなら変換しないでその値をNULLとして扱い、
定数NULLの値は実装依存って言う方がスッキリしてると思うんだtが
0300デフォルトの名無しさん
NGNGプロトタイプが必須なんてケースないんじゃない??
0301デフォルトの名無しさん
NGNGプロトタイプ書かないとsinやcosなんかがまともに動かない
処理系は山ほどあるだろ。
printfさえ動かない処理系もあるよ。
つか書け!
0302デフォルトの名無しさん
NGNG0303デフォルトの名無しさん
NGNG同意。
NULLの中身は不明ってしたほうがはるかにわかりやすい。
0304デフォルトの名無しさん
NGNGいろいろある。
void bar()
{
foo(4);
}
void foo(double a)
{
}
なとき、プロトタイプ宣言がないと引数がうまく渡せないでしょ。
同じくプロトタイプ宣言がないと、関数の戻り値が暗黙的にintを返すことにされちゃう。
困るでしょ。
ANSIスタイルで書いてて、呼び出し前に常に関数宣言を書いておけるなら、別にいらないけどね。
0305ふか
NGNGレスさんくす。
書きたいのはヤマヤマだが,
漏れだけでシステムつくってないし〜。
あと引数の仕変が起きた時,
ヘッダファイルのプロトタイプまで直すのがカタルイ〜。
漏れは違うけど,プロトタイプに変数名まで書くやつもいるしな〜。
0306デフォルトの名無しさん
NGNG標準ライブラリ(ヘッダ)とコンパイラはセットで考えようよ。
元がNULL==0の処理系でNULL=1とした場合に、
int*p=NULL;
if(p)
が偽にならないのはしょうがないだろ
0307298
NGNGはさすがにまずいな。すまん。
#define NULL ((void *)処理系依存の0でないビットパターン)
は別に規格違反ではない、に訂正。
あ、
#define NULL ((void *)1)
は規格違反じゃないね。他のどんなポインタとも等しくなければ。
0308デフォルトの名無しさん
NGNG労力をケチるな!
> プロトタイプに変数名まで書くやつもいるしな〜。
多くのコンパイラの標準ライブラリは書いていないか?
0309デフォルトの名無しさん
NGNGそれ以外は不自然だな、という考えの基にああなったとおもわれ。
memsetでポインタをクリアするとどうなるか、ってのもあるな。
0310デフォルトの名無しさん
NGNG内部でNULLと比較を行うライブラリはすべて動作未定義になるね。
0311デフォルトの名無しさん
NGNGプロトタイプには変数名も書いたほうがいいと思う派だな、漏れ。
引数の意味がちょっとおぼろげってとき、宣言みれば確認できるし。
IDEによっては引数ヒントでポップアップしてくれるし。
0312デフォルトの名無しさん
NGNGextern int usbmon_quit (const char*);
typedef struct {
int (*func) (const char*);
} CmdList;
static const CmdList cmd_list[] = {
{ usbmon_quit },
};
static void*
search_command (char* buf)
{
return cmd_list[0].func;
}
もとのソースからかなり省略していますが、ここで
search_command()の返り値の型は本来どのように記述すればよいのでしょうか?
関数へのポインタは一応分かったつもりだったんですが、
うまくいかなくて上のソースではvoid*でごまかしています。
0313デフォルトの名無しさん
NGNGかったるい??
それは引数名をわざわざ消すからだよ。
関数の宣言コピペするだけでOK。
0314デフォルトの名無しさん
NGNG0315デフォルトの名無しさん
NGNGそれでも偽になるよ
0316デフォルトの名無しさん
NGNGビットパターン 0 が null pointer だって教え方がまず間違ってるよ。
0317デフォルトの名無しさん
NGNGなるわけ無いじゃん。
元がNULL==0だったのに、勝手にユーザーがNULL=1にしても
確実に偽になると?
0318デフォルトの名無しさん
NGNGstruct CmdList *かな?
0319デフォルトの名無しさん
NGNGtypedefしたほうがいいよ。
0320デフォルトの名無しさん
NGNG>>299はそんなこと言ってないが?
0321298
NGNGいや、だからそれは違うって。
int *p=NULL;
if (p)
は偽になるが、その理由は「NULLが0だから」じゃないでしょってこと。
処理系の標準へッダでNULLを((void *)1)と定義していたとしても
int *p=NULL;
if (p)
は偽になる。
0322318
NGNG0323デフォルトの名無しさん
NGNG0324デフォルトの名無しさん
NGNGそれなら同意だが。
ユーザーが勝手に定義し直しても・・・ってことだとオモタヨ
0325デフォルトの名無しさん
NGNG何で消えたんだろ?
0326ふか
NGNGあれ?プロトタイプに引数名は書いた方がいいのか。
今,標準ライブラリヘッダもみたけど,たしかにそうだった・・・。
んじゃ,引数名書かないことの意義は?
あと話をまとめると
・動かない処理系がある
・書かないとコンパイラではint型と認識する
・漏れが >>294 で書いたアーカイブ間で相互参照するときに,
宣言しとかないとリンクできない
くらいですかね?
0327デフォルトの名無しさん
NGNGコンパイラはプロトタイプからは引数の型しか見ないから書いても書かなくてもよい。
でも書いた方が人間には優しい。
0328デフォルトの名無しさん
NGNGポインタという整数型にnilという状態を持たせたら、そのビットパターンは整数値として有効な範囲に
いる可能性が出てきますよね?
0329デフォルトの名無しさん
NGNGstdlib.hをインクルードしないで、
char *str;
str=(char *)malloc(478);
とかやってみな。
0330デフォルトの名無しさん
NGNG変数名が不適切なときの修正が楽。
0331デフォルトの名無しさん
NGNG>299
>ハードウェアで bitパターンが all 0 でない物がNULLポインタである可能性があるんだから
って言ってるじゃん。
0332デフォルトの名無しさん
NGNGファイルサイズをほんの少し小さくできる。
0333315
NGNG>>298=321とは別人だけど、321と同じようにとった
つうか、>>306の処理系云々と言うのは普通そうとると思うけど、
ユーザーが書きかえると思う人の方が多いの?
0334デフォルトの名無しさん
NGNG一宣言一行に収まって見た目が美しい。
…ってメリットにはならんな。
0335デフォルトの名無しさん
NGNGポインタは整数型じゃないけど?
0336デフォルトの名無しさん
NGNG> ポインタという整数型に
ってのがちょっと意味不明なんだけど、
ポインタという名前の整数型の変数に?
0337デフォルトの名無しさん
NGNG>ビットパターン 0 が null pointer だって教え方がまず間違ってるよ
>>299は
「ビットパターン 0 以外のものが null pointerである可能性がある」
としか読めないが?
0338デフォルトの名無しさん
NGNGプロトタイプ宣言はきちんと書いていますか?
0339デフォルトの名無しさん
NGNG必要ならやります(というかやらざるを得ない)が、何か?
0340デフォルトの名無しさん
NGNG0341デフォルトの名無しさん
NGNGhttp://www.inet-lab.org/ted/program/prog064.html#064.6
によると、
int (* search_command(char* buf))(const char*);
int (* search_command(char* buf))(const char*)
{
return cmd_list[0].func;
}
らしい。なんか奇妙な感じ。
0342ふか
NGNG。。。動きましたけど・・・(漏れも動くとはおもわなんだ)
#include <stdio.h>
int main(){
#define AL_SIZ (478)
char *str = NULL;
str=(char *)malloc(AL_SIZ);
if( !str ){
printf("alloc error\n");
return(0);
}
memset(str,0x00,AL_SIZ);
strcpy(str,"hoge hoge hoge\n");
printf("%s",str);
free(str);
return(0);
}
0343デフォルトの名無しさん
NGNG0344デフォルトの名無しさん
NGNG必要無くてもやる
0346ふか
NGNGなんですか,それ?
0347デフォルトの名無しさん
NGNGそりゃ動くだろ。
でもコンパイラに文句言われなかったか?
ものによっては言われないのかな。
0348デフォルトの名無しさん
NGNGそのくらいは普通
0349デフォルトの名無しさん
NGNG検索しろよ。
ところで、みんな本気で書いてるのか?
機械出力させるのが自然だと思ってたんだが。
0351デフォルトの名無しさん
NGNG高級言語マシンなら…
たしかWirthが作ったModula-2マシンのLilithや
Lispマシンにはあったはずだ。
今だと「dereferenceしたらトラップがかかるポインタ」っていう
くらいかな。0番地のページに保護をかけることができれば0で良い。
0352デフォルトの名無しさん
NGNG俺は200行でも以上だと思いますが。
0353デフォルトの名無しさん
NGNG関数をつくるたびにヘッダーファイルにコピペしてセミコロンをつけるだけじゃん。
0354ふか
NGNGワーニソグもなしでした。
尤も最近のC言語コンパイラは
//コメント
とか
処理の後の変数宣言までワーニングなしで通しちゃいますからねぇ・・・
0355デフォルトの名無しさん
NGNGそれで合ってるけど、猿にもわかるようにtypedefするのが親切ってもんでしょ。
0356デフォルトの名無しさん
NGNG激しく可読性が落ちないかな?
0358デフォルトの名無しさん
NGNG0359デフォルトの名無しさん
NGNGを機械にチェックさせるとミスが減るけど、
機械が本体から作ったプロトタイプだとチェックにならない。
0360デフォルトの名無しさん
NGNGコメントつければ大丈夫だYO!
0361デフォルトの名無しさん
NGNGそれは勘違いでは?
プロトタイプチェックしてほしいのは、その関数を使う人で、
関数を書く人にとっては自動でもいいような。
0362デフォルトの名無しさん
NGNGうどんが一玉あるんだけど、具になりそうなものは何も無いんだ。
(卵はあるけど月見うどん嫌い)
かけうどんざるうどん、どっちにするのがいいと思う?
0363デフォルトの名無しさん
NGNGざるうどんNULLポインタ添え
0364デフォルトの名無しさん
NGNG具無し焼きうどん
0365デフォルトの名無しさん
NGNGNULLの中身は0ですか?1ですか?
私は1の方がおいしいと思いますよ
0366デフォルトの名無しさん
NGNG-4
0367デフォルトの名無しさん
NGNG話題がうどんにシフト! (一時的)
0368デフォルトの名無しさん
NGNGそれ食べたことあるYO!
おいしかったYO!
スレ違いスマソ YO!
0369デフォルトの名無しさん
NGNGお、なるほど。
「本体書いた後へッダにコピペする」時のミスが減るかもね。
しかし、「呼び出し仕様が先に決まってる」って方が良くあるんじゃ?
0370ふか
NGNG0371デフォルトの名無しさん
NGNG0372デフォルトの名無しさん
NGNG誰か〜
0373デフォルトの名無しさん
NGNGうらやましいだろ。(´ー`)うどんマンセー・・・。
世界で最もうまい食べ物は
1.豆腐
2.うどん
3.おでん
だな。
0374デフォルトの名無しさん
NGNGハヤシライス様が抜けてるぞ。ワーストの話か?
0375デフォルトの名無しさん
NGNG0376デフォルトの名無しさん
NGNG1わさび
2鷹の爪
3故障
だな。
0377デフォルトの名無しさん
NGNGこれ嫌い。
void kansudesuyo(char mojiretsunano *)
と書いて。
0378udon.c
NGNG#include <stdio.h>
int main() {
srand(time());
if (rand()%2) {
puts("ざる");
} else {
puts("かけ");
}
return 0;
}
2回以上やると、やっぱり迷ってしまう罠。
0379デフォルトの名無しさん
NGNGtimeの実引数が足りません。
0380デフォルトの名無しさん
NGNG0381デフォルトの名無しさん
NGNGその考えたかやめれ。修羅場で修正したらどうせコメントなんか修正しないんだ
から。typedef 推奨だ。
extern int usbmon_quit (const char* s);
typedef int (*CmdFunc)(const char *);
typedef struct {
CmdFunc func;
} CmdList;
static const CmdList cmd_list[] = {
{ usbmon_quit },
};
static CmdFunc search_command(char * buff)
{
return cmd_list[0].func;
}
0382デフォルトの名無しさん
NGNG#include <stdlib.h>
もしときましょう。
0383ふか
NGNG多分今の環境には馴染まないので,出力ツールは使わないとはおもいますが,
そういうものがあるというのもまた勉強になったYO!
そいでは漏れはiStudyの続きをば・・・
0385デフォルトの名無しさん
NGNGやだもん
■ このスレッドは過去ログ倉庫に格納されています