トップページ⇒tech
1001コメント286KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/09/17(土) 00:26:58
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

C言語なら俺に聞け! Part 113
http://pc8.2ch.net/test/read.cgi/tech/1125136478/

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
0153デフォルトの名無しさん2005/09/18(日) 13:56:32
誰だ俺のディスクを使ってるのは!
0154デフォルトの名無しさん2005/09/18(日) 14:00:22
俺俺、俺だよ俺。
0155デフォルトの名無しさん2005/09/18(日) 14:12:24
if文とかの条件式の型って、何でもいいの?
よく本には「0が偽で、0以外が真」と説明されてるけど、
int型とか、unsined型とか、ポインタ型とか、float型とか、
特に変換とかかからず、個別の型ごとに判別されてるのですか?

C++みたいに、bool型に変換されてから判別されるみたいな
感じとは違うの?
0156デフォルトの名無しさん2005/09/18(日) 14:12:47
>>152
自分だけだとしても、途中でエラーになったら
トランザクションを復帰できない >142 は
危険ですな。
まあ >>141 も、折角だから
7. 元ファイルを一時的な別の名前に変更
8. 新ファイルを元ファイルの名前に変更
9. 元ファイルを削除。
までやって欲しいところ。
(システムによっては unlink/link が適切か)
0157デフォルトの名無しさん2005/09/18(日) 14:13:14
>>152
そうか。
ポインタだけ先頭に戻して、最後は消せばいいんだな。
消し方知らないけど。
0158デフォルトの名無しさん2005/09/18(日) 14:17:10
>>156
そのやり方はファイルをロックしておかないと。

>>155
実際なんでもいい。
ただfloatはだめだろ。
0159デフォルトの名無しさん2005/09/18(日) 14:21:30
>>147
戻り値はポインタじゃないと、リストの先頭部分が解放できなくなる。

あと、リストを作るなら、リストサイズも返して欲しいところ。
戻り値が0なら失敗、それ以外なら成功という感じで成否判定にも使えるし。
(ポインタがNULLかどうかを見てもいいんだけどね)
0160デフォルトの名無しさん2005/09/18(日) 14:32:15
>>159
もしかして最初の一件を値で返し、2件目以降はそのつどメモリ割り当てなわけですか?
それだと最初の一件目は開放しなくていいわけですが、
そんな非効率なことするんですか?

そういうやり方するならC++でも使ったらどうかと思うんですがね。

メモリサイズが大きくなると、オーバーヘッドの大きい
Windowsのメモリアロケートを使うことになるからめちゃめちゃ遅いよ

ヒープだけで済む小さいのならC標準ので1件ずつアロケートしても使えるが、
そもそも開放がめちゃめちゃ大変だ。
データが壊されたらそっから先は開放できなくなるし。
0161どりーむ2005/09/18(日) 15:08:39
今ファイルの読み込みを試みようとしようとしてるんですが、
うまい事いきません。
もし足りない所があれば助言よろしくおねがいします。
コード

struct MovieItem{
long callNo;
char title[50];
bool status;
int frequency;
MovieItem *next;
};


0162どりーむ2005/09/18(日) 15:09:58
すいません。
貼り付ける場所間違えました^−^;
当方はC++ですので。
ではw
0163デフォルトの名無しさん2005/09/18(日) 16:06:04
>>138です。
>>141さん以下いろいろ教えてくださった皆様。
ありがとうございます。
実は、その場で、一行だけ削除する関数かなんかあればいい名と考えていましたが、
ないようで、
メモリを沢山食いそうで落ちてしまいそうな感じもあり、
テキストファイルの分割も考えに入れ、
教えていただいた方法で、やっていこうと思います。
ありがとうございました。
0164デフォルトの名無しさん2005/09/18(日) 16:32:49
>38,40
いつまでも、こだわるようで申し訳ありませんが、
例えば下記プログラムなんかreallocだけでスッキリ
と分かりやすい、と思われませんか?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{

char *jo;
jo = realloc(NULL,30 );
strcpy( jo, "Nissyは馬鹿じゃない、" );

jo = realloc( jo, 60 );
strcat( jo, "しかし、頭が固い!\n" );

printf( jo );

realloc( jo,0 );

return 0;
}
0165デフォルトの名無しさん2005/09/18(日) 16:33:54
>>164
思わない。最初のNULLをタイプするだけ無駄。
0166デフォルトの名無しさん2005/09/18(日) 16:39:14
>>164
jo=NULL;
とやってからループ内で1回だけ
jo = realloc( jo, size * i );
と書くんなら意味があるけどね。

size が0の時は開放のみなんだろうか?
0167デフォルトの名無しさん2005/09/18(日) 16:48:26
>166
>size が0の時は開放のみなんだろうか?

C言語辞典にはそう書いてありました。
別の本にもmallocやfreeの代わりに使える。
が、
それは好ましくない…とは。

0168デフォルトの名無しさん2005/09/18(日) 16:52:28
領域確保にはmallocなりcallocといったのがあるし
解放にはその名の通りfreeがあるんだから
それ使った方がすっきりするしわかりやすい
0169デフォルトの名無しさん2005/09/18(日) 16:53:51
アロケートしたものを全部開放してくれるsuperfreeが欲しい。
0170デフォルトの名無しさん2005/09/18(日) 16:54:07
>164
どう、こっちの方がもっとスッキリしない?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
char *po;

po = malloc( 30 );
strcpy( po, "確かに常識的ではない、" );

po = realloc( po, 60 );
strcat( po, "さらに、その上、馬鹿だ!\n" );

printf( po );

free( po );

return 0;
}
0171デフォルトの名無しさん2005/09/18(日) 17:13:25
struct vec { char *data, int capacity, int size };

void expand(struct vec *v, int n)
{
  if (v->capacity < n)
    v->data = realloc(v->data, v->capacity = n);
}

みたいのがあって、expand()はv->dataが0の場合にも呼ばれ得る、
みたいなケースなら、わざわざif()で分けるよりは
realloc()一本のほうがすっきりする、かも知れない。
0172デフォルトの名無しさん2005/09/18(日) 17:20:01
>>164
お前ならそう言い出すと思ったから、
おまえは俺ら常人とは違い、天才だと教えてやったろう。
天才は天才の集まる所でやっててくれ。何時までもウザイから。
0173デフォルトの名無しさん2005/09/18(日) 17:26:39
>>164
センスゼロ。
いいたい・やりたいことをいかにクリアに表現するか、そのためだけに
現在に至る言語の進歩があったと言っても過言じゃない。

「可能」「不可能」だけで言ったら、高水準言語なんてものはこの世に
いらなくなるんだよ。

「メモリを解放したい」んなら単にfree()と言え。それがそのものズバリ
であって、一番クリアだから。

realloc()は一般には「メモリを再確保する」するための関数だから、
そうしたいときに使え。realloc()をfree()やmalloc()の代わりに
使っているコードを見た人は、プログラマの真意をまず疑う必要が
出てくる。バグなのか、アホなのか、etc...
余計な手間がここで生じる。
0174デフォルトの名無しさん2005/09/18(日) 17:26:42
>>166や>>171のようなケースなら、そう書く人いるだろうね。

>>164の場合は同じ関数使ってるから、
文字の関係で綺麗にかかれているように見える”のかもしれない”けど、
>>170のソースの方が自然に理解できると思う。

>>164のソースは正直コメント無しでぱっと見たら、一瞬???と思うよ。
0175デフォルトの名無しさん2005/09/18(日) 17:38:56
天才は放置で。
0176デフォルトの名無しさん2005/09/18(日) 17:41:17
>>164
ふつう、そういうのをしたかったら
そういう機能を持ったラッパー関数を作るんですよ
ライブラリの仕様変更にも追従できるし
0177デフォルトの名無しさん2005/09/18(日) 17:43:34
>>97
ソースを見渡したときに引数がないことが明示されていてわかりやすい。
0178デフォルトの名無しさん2005/09/18(日) 17:53:16
>>97
ANSI/ISO以前のいわゆるK&R Cにはプロトタイプが存在せず、
関数は
char *foo();
のように仮引数無しで宣言された。

ANSI規格においても、後方互換性の点からこのスタイルでの
宣言が認められ、その場合は(C++のように)「引数無し」
ではなく、古いC同様に「引数は任意であり型チェックはしない」
という意味とされた。そのため、「引数無し」を明示するために
別途voidが導入された訳だ。

0179デフォルトの名無しさん2005/09/18(日) 17:53:20
>>164の作るライブラリの関数プロトタイプって纏まってそうだなw
引数がこれの時はこうなって云々...
0180デフォルトの名無しさん2005/09/18(日) 17:56:32
>>164はgrep, tail, headなどのユーティリティを認めず
なんでもsedやawkでやる人。

で、
head -10よりsed 10qの方が美しくわかりやすいと信じて疑わない。
0181デフォルトの名無しさん2005/09/18(日) 18:09:52
もしくは赤ん坊
全ての会話が"ダァ"で成り立つと理解している
0182デフォルトの名無しさん2005/09/18(日) 18:14:23
1,2,3,ダァ!!!
0183デフォルトの名無しさん2005/09/18(日) 18:15:44
兵卒だろ
「イエスサー」以外の言葉を話せないw
0184猛勉強中(59)2005/09/18(日) 18:25:48
>>177>>178
なるほどです!
わざわざ返事くれてありがとうございます。
今日は、「ポインタ完全制覇」っていう本がいい感じだったんで、
読んでますー。

・配列の中身を参照する時に、a[i]とかするけど、この[]は配列とは全く無関係だ。
・Cには多次元配列は存在しない。

この二つはなかなか知られてないみたいですね。
0185デフォルトの名無しさん2005/09/18(日) 18:31:41
>>184
なんか、誤解を招く表現だな。
気をつけろよ。へんな理解の仕方すると、混乱するぞ。
0186デフォルトの名無しさん2005/09/18(日) 18:32:19
>・配列の中身を参照する時に、a[i]とかするけど、この[]は配列とは全く無関係だ。
意味ワカンネ
a[i]が*(a+i)のシンタックスシュガーである つうこと?
>・Cには多次元配列は存在しない。
Cを書く人間なら全員知っているのでは?
・・・ああ。配列の配列を使ったことのない人もいるか
0187猛勉強中(59)2005/09/18(日) 18:33:54
>>185
これに対する説明が書いてないんですが、これってどういう事なんですかね?
多次元配列は存在しないなら、

word[256][256]

とかは何なんでしょう・・・
0188デフォルトの名無しさん2005/09/18(日) 18:37:58
>>187
多次元配列、これは二次元配列。
0189デフォルトの名無しさん2005/09/18(日) 18:41:04
配列の配列、だろが
0190デフォルトの名無しさん2005/09/18(日) 18:41:27
>>187
説明もなくそんなわけわからん主張してるのか、その本?
結構有名だから、マトモな本かとおもっていたが、大丈夫かそれ?
ちなみに、俺は読んだことない。

>・配列の中身を参照する時に、a[i]とかするけど、この[]は配列とは全く無関係だ

無関係ってことはない。メモリ上の連続したエリアを配列として使用するときに[]を使う。
ちなみにこれは演算子です。

プログラミング言語には、同じものを表現するのに複数の異なる方法がある場合があり、
これをシンタックスシュガー(構文糖)という。
特に、Cでは、本来異なる概念である「ポインタ」と「配列」が、表現上同じように見えたり、
暗黙に変換されたりするシンタックスシュガーがある。
わかりやすいところでは、関数の引数で、

void foo(int a[])

こういう宣言方法があるが、これは配列を表していない。見た目は配列に似ているがこれは

void foo(int *a)

の別の記述法なだけ。

だからといって、a[] と *a が常に同じわけではないことに注意。
関数の引数の表現時にのみ発生するシンタックスシュガーがあり、いわばこれは特例だとい
うことをゆめゆめわするるべからず。
0191デフォルトの名無しさん2005/09/18(日) 18:43:40
俺は、a[i]が、i[a]とも書ける、ってことを、「ポインタ完全制覇」を
読んで初めて知ったな。それ以外で驚いたことはなかった。
0192デフォルトの名無しさん2005/09/18(日) 18:45:52
俺は、a+iが、i+aとも書ける、ってことを、「たしざん完全制覇」を
読んで初めて知ったな。それ以外で驚いたことはなかった。
0193デフォルトの名無しさん2005/09/18(日) 18:48:08
>>191
それ、ちゃんと理由も書かれていたか?
かかれていなけりゃ、そりゃ糞本かもだな。
0194猛勉強中(59)2005/09/18(日) 18:48:18
>>188>>189
二次元配列以上のものを多次元配列っていうんじゃないんですか?
本によっては、「Cでは多次元配列を定義できる」ってなってるし
いまいち理解に困ります。
配列の配列ってのはわかりますが、それは多次元配列(2次元配列)
とはいわないんですかね?

>>190
すっごいわかりやすいです。
テキストファイルに保存しときますw
いやー、まじでこのスレ良すぎる。
すごい人達全員にカテキョしてもらってるみたいだ。
0195デフォルトの名無しさん2005/09/18(日) 18:48:58
>166
どうなんでしょう?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
//必ずポインタをNULLで初期化する安全第一のプログラマにとっては

char *jo=NULL;

jo = realloc(jo,30 );//と統一した書き方が出来る。
strcpy( jo, "Nissyは馬鹿じゃない、" );

//さらに、誤ってもう一度
jo = realloc(jo,30 );

//と、やっても悪影響はない。
//jo = malloc( 30 );と2回やると中味が消えてしまうけど。

jo = realloc( jo, 60 );
strcat( jo, "しかし、頭が固い!\n" );

printf( jo );

realloc( jo,0 );
//但し、これをもう一度やったらOUT!だけどね。freeも同じだけど。
return 0;
}
0196デフォルトの名無しさん2005/09/18(日) 18:50:23
先ず、「多次元配列」の定義を言ってくれ。
0197デフォルトの名無しさん2005/09/18(日) 18:53:29
>>197
うん君が正しいよ。目から鱗だ有難う。
0198デフォルトの名無しさん2005/09/18(日) 18:54:02
やっちまったぜwwwwwww
>>197は>>195宛な
0199デフォルトの名無しさん2005/09/18(日) 18:58:57
>>187
>・Cには多次元配列は存在しない。

ある意味では正しいが、ある意味では正しくない。
プログラミング言語(の実装)が多次元配列をどうあつかっているかは、いろいろあるが、
多次元配列の実装は2つに分類される。

(1)まとまったメモリエリアを一次元配列として確保し、それは次元の数だけ分割して多次元配列として使う。
Cはこの方法をとっていて、
 int a[10][10];
 int data = a[y][x]; 
は内部的には、
 int a[100];
 int data = a[ y * 10 + x]:
と実装されているかもしれないということ。
見方によってはこれはあくまでも一次元配列であり、「多次元配列は存在しない」といえるかもしれない。

(2)配列への配列をつかった表現。
 int a[10], b[10];
 int *p[2];
 p[0] = &a[0]; p[1] = &b[0];
こうすることで、data = p[y][x] というアクセス方法が取れる。
この場合、a, と bは必ずしも、連続したメモリ上にある必要はなく、またサイズも同じである必要がない。
可変長配列をサポートする言語では、たいていこれに似た方法がとられている。

どっちも、結果的に多次元配列を扱うことはできている。
あとは何を基準に判断するかの問題。
0200デフォルトの名無しさん2005/09/18(日) 18:59:12
Cには無いんだけど dat[a,b]といった表現をするのが2次元配列

dat[a][b]ってのが配列の配列
dat[a]ってだけで意味があるところ(使う事ができる)なのがミソ
02011992005/09/18(日) 19:00:22
× それは次元の数だけ分割して多次元配列として使う。
○ それを次元の数だけ等分割して多次元配列として使う。
0202デフォルトの名無しさん2005/09/18(日) 19:10:11
>>195
コテハン名乗ってくれ。あぼーんするから。
0203猛勉強中(59)2005/09/18(日) 19:11:10
>>199
また保存行きですw
なるほどー、Cでは(1)の方を使うから、解釈の仕方で両方の意味に考えられると。
で、(2)の方なんですが、これは確実の多次元配列として扱えてますよね?
これがCで使えるなら、多次元配列としていいような気がします。

>>200
呼び方の問題なんですかねー、多次元配列として扱う>>199の(2)のようにできるなら
多次元配列は存在するといってもいい気がしますが、dat[a,b]っていう書き方ができ
ない以上、多次元配列は存在しないと言わざるを得ないって事なのかな。
0204デフォルトの名無しさん2005/09/18(日) 19:11:23
>>195
> realloc( jo,0 );
> //但し、これをもう一度やったらOUT!だけどね。freeも同じだけど。

freeの代わりに使うとしても、
jo = realloc( jo,0 );
と、常に戻り値を入れておけば事故もないんじゃないかな。

free したいのかどうかはコードなめないと分からないと思うけど。
0205デフォルトの名無しさん2005/09/18(日) 19:11:25
>>200
FORTRAN77 は dat(a, b) とか書けるけど、
dat(1, b) というのを関数に渡して、
その関数内部では列行列であるかのように扱うことができるぞ。
0206猛勉強中(59)2005/09/18(日) 19:31:48
今日夜バイトいったら、一週間くらいでかけるんで、しばらく書き込めないです。

けど、ノーパソと「Cの掟」と「ポインター完全制覇」もって、勉強はするんで、
質問したい事とかめっちゃたまるっぽいですが、そん時はよろしくお願いします。
0207猛勉強中(59)2005/09/18(日) 19:35:39
てか、この掲示板て携帯からみれるんですか?
0208デフォルトの名無しさん2005/09/18(日) 19:36:49
>>207
ウザいからもうこないでくれ
0209猛勉強中(59)2005/09/18(日) 19:40:22
すいません、いけました。
おふぉな質問して申し訳ない。
0210デフォルトの名無しさん2005/09/18(日) 19:50:09
ファイル入出力でつまずいてます。 なにかいい本ありますか?
初歩的なことからわからないんです。

できれば、ファイル入出力だけでなく、C全般についてのいい本もお願いします
0211デフォルトの名無しさん2005/09/18(日) 19:52:30
Cの場合は、配列の配列(敢えて言うなら多重配列)を多次元配列のように扱えると解釈するべきではないかな。

>必ずポインタをNULLで初期化する安全第一のプログラマにとっては
安全第一というより、安直第一というべきだろう。
そういう、「0フィルしておけば安全」という間違った考えがバグを生みデバッグを困難にすることに繋がることも理解すべきだ。
0212デフォルトの名無しさん2005/09/18(日) 19:55:45
すいません。C言語で立方体のさいころをつくりたいのですが
これは、展開図に直して連結リストで作ってみると考えたのですがどうでしょうか?


0213デフォルトの名無しさん2005/09/18(日) 19:57:00
>>212
> C言語で立方体のさいころをつくりたい

立方体さいころ組立工作機械の制御でもやるのかね?
0214デフォルトの名無しさん2005/09/18(日) 19:58:08
>>212
それはCの質問なのか?
アルゴリズムの質問のように読めるのだが。
#そうだとしても、言葉足らずではあるが。
0215デフォルトの名無しさん2005/09/18(日) 20:00:42
>>212
稜線のリストか何かを作りたいのか?
0216デフォルトの名無しさん2005/09/18(日) 20:03:03
たぶん宿題だろ
0217デフォルトの名無しさん2005/09/18(日) 20:06:32
>>213
以前就職活動で受けてた会社の入社テストに、さいころの展開図の問題があったんです。
内容はさいころをこの角度から見て(3面だけ見えてました)
展開図に直すと次のいずれになりますか?というものだったんですけども、、、。

それをC言語でつくってみようと思ったんです。
0218デフォルトの名無しさん2005/09/18(日) 20:09:11
でプログラムでなにがどうなるのがつくりたいんだ?
02192122005/09/18(日) 20:12:32
皆さんレスありがとうございます。すいません、言葉足らずでした。
今からアルゴリズムの本の「連結リスト」の部分をわからないなりに読んでみようと思います。
また、行き詰まったらすいませんが知恵を貸して下さい。
0220デフォルトの名無しさん2005/09/18(日) 20:12:34
つーか、スレ違いを相手にするのは鬼違い。
0221デフォルトの名無しさん2005/09/18(日) 20:25:06
「多次元配列がない」という言葉が意味したいことは、
int x[A][B]; の時に x[a][B-1] と x[a+1][0] のメモリが
連続してることが規格上保証されている、
ということを言いたいわけなのだろうか?
離してもいいものも作ろうと思えば作れるが、
言語的にパッと書けるものでもない、と。

もしくは、内部的には x[a][b] は (*x)[a * B + b] のように
一次元的なインデックスに直され、B という値が再利用されるので、
配列へのポインタで int(*)[B] のように
サイズが必要になってしまうというようなことを言いたいのか。
x を int** へ代入できないよ、全くの別物だよ、
というようなことが言いたいのか。
0222デフォルトの名無しさん2005/09/18(日) 20:40:32
Cでは単に配列の配列を多次元配列の替わりにしてるから
サポートレベルが低いってことじゃまいか。

実際ただの(一次元)配列に比べて不便で扱いづらいでしょ、
例えばサイズの不定な多次元配列を扱ったりする場合に。
0223デフォルトの名無しさん2005/09/18(日) 20:43:22
なるほどね。それが一番的確な回答に思える。
0224デフォルトの名無しさん2005/09/18(日) 20:44:47
多次元配列って、普通サイズ固定じゃないのかな。
行列にしたって、行や列が可変サイズじゃ意味がないし。
0225デフォルトの名無しさん2005/09/18(日) 20:47:40
>>224
サイズを問わない汎用的な関数を書きたい
というケースなら珍しくないでしょ?
0226デフォルトの名無しさん2005/09/18(日) 20:53:02
どのみちCでは静的に確保しない限りサイズは知りようがないんだが
0227デフォルトの名無しさん2005/09/18(日) 20:55:41
そのへん、C99ならある程度の可能性がある。
どこまでで限界が来るか、一度試してみたいな。
0228デフォルトの名無しさん2005/09/18(日) 22:15:43
>>226
分かってて言ってるんだろうが

ただの1次元配列の場合は
void vector_fn(int array[], int size)
のようにすればよい。

2次元配列の場合は
void matrix_fn(int array[], int m, int n)
のようにして、キャストを使い1次元配列の「ふり」をして渡すしかない。
で、関数内では1次元配列上で明示的にオフセット計算をする羽目になる。
マクロを使えば多少は楽になるとは言え、これは醜いし、不便だろう。
少なくとも、Cが多次元配列に対して良きサポートを提供しているとは
お世辞にもいえない。
0229デフォルトの名無しさん2005/09/18(日) 22:24:28
それは多次元というより、配列そのもののサポート状況じゃないか?
一次元配列でも、サイズ情報は別に渡さなきゃならないわけだし。
0230デフォルトの名無しさん2005/09/18(日) 22:47:04
そういう時は動的に確保するか
ポインタテーブル作れってことだけど、面倒っちいわな。
void foo(int array[][B]) のようなこともできはするけど、サイズ固定だしな。
0231デフォルトの名無しさん2005/09/19(月) 01:24:25
初歩的な質問なんですが、
char buf[128];
と
char *buffer = malloc(128);

ってどっちがいいんですか?
0232デフォルトの名無しさん2005/09/19(月) 01:28:29
用途を言え
0233デフォルトの名無しさん2005/09/19(月) 01:30:05
>>231
ケースバイケースです。以上。
0234デフォルトの名無しさん2005/09/19(月) 01:30:47
>>231
普通は
 ・確保したバッファを呼び出し元の関数に返したい場合
 ・途中でバッファのサイズを拡張する可能性がある場合
 ・サイズが128ではなくてデカ過ぎる場合
はmallocを使う。それ以外なら上で良いでしょう。
0235デフォルトの名無しさん2005/09/19(月) 01:48:56
>>232
デバッグ用にprintfっぽく使えるメッセージボックスを作ろうと思ったんですが・・・
しょっちゅう呼び出す関数は確保→開放ってやると遅くなるかと思って・・・

>>234
ありがとうございます。
0236デフォルトの名無しさん2005/09/19(月) 02:05:02
>>235
デバッグでパフォーマンスは気にしない。
0237デフォルトの名無しさん2005/09/19(月) 02:29:41
デバッグでなくても、
メッセージボックスの表示のオーバーヘッドで
全く気にならないはずだ。
0238デフォルトの名無しさん2005/09/19(月) 02:31:56
>>211
メモリを保持してないポインタはNULLにしておくべきだろ
アロケート目的に使わないならfreeしないから関係ないけど。

>、「0フィルしておけば安全」という間違った考えがバグを生みデバッグを困難にする
それはどんな状況ですか?
そういう経験はしたことないんですけど。
0239デフォルトの名無しさん2005/09/19(月) 02:59:03
×0フィルしておけば安全
○NULL フィルしておけば、NULL フィルしないよりは安全

NULL フィルしたからといってバグがなくなるわけではないが、バグ検出に役に立つ。
NULL へのアクセスは大抵の環境で実行時エラーが出る。
NULL フィルしなかった場合は、偶然どこかの正常なアドレスを指してる可能性がある。
例えば、昔ポインタとして使われたスタック領域と同じところに
そのポインタが割り当てられたときなどは、可能性としては十分あり得る。

代入が直後にある場合などは必要ないと思うかもしれないし、
実際入れなくても現時点では何も問題はないが、
後の拡張やコードの移動により問題が発生する可能性はある。
NULL フィルのオーバーヘッドが気になるような状況でもない限り、
NULL フィルしといた方が安全ってのは正しい。
0240デフォルトの名無しさん2005/09/19(月) 03:07:09
わざわざデバッグビルドで固定値を突っ込んでくれるコンパイラもあるというのに……
0241デフォルトの名無しさん2005/09/19(月) 03:12:14
0とNULLの区別がつかない人って、初心者に良くいるよね。
0242デフォルトの名無しさん2005/09/19(月) 04:01:36
>>241
詳しく
0243デフォルトの名無しさん2005/09/19(月) 04:23:47
>>241
それは紛らわしい書き方なんだが、
かといって正確に書こうとするとややこしい。

>>242
http://www.kouno.jp/home/c_faq/c5.html#0
0244デフォルトの名無しさん2005/09/19(月) 04:54:06
>>240
それはコンパイラに依存すると言うことですよね?
いちいちコンパイラの仕様を確認しなければならず、
違っていればやり方を変えなければならないと言うことですよね?

デバッグビルドとリリースビルドで動作が違ってくるって事ですよね?
デバッグビルドで取り除けるバグを、リリースビルドで見つけなければならないと言うことで、
デバッグが大変になりますよね?
0245デフォルトの名無しさん2005/09/19(月) 04:57:23
阿呆はだまってろよ
0246デフォルトの名無しさん2005/09/19(月) 05:07:28
でも、ぶっちゃけリリース版でしか再現しないバグってのがあるから困りもんだ。
0247デフォルトの名無しさん2005/09/19(月) 05:09:44
>>245
自分の主張と、間違ってると思われる発言を書けよ

自分のアホは指摘されたくないってか?
0248デフォルトの名無しさん2005/09/19(月) 05:20:59
>>240
もしかしてコンパイラに固定値突っ込ませてデバッグ後、
固定値突っ込むのをOFFにするオプションつけたデバッグビルドでもデバッグするのかな?

少しでもコードを取り除きたいならそれもいいかもね。
めんどくさ。
0249デフォルトの名無しさん2005/09/19(月) 05:22:12
>>246
ねーよwwwwwwwwwwww
0250デフォルトの名無しさん2005/09/19(月) 05:25:00
>>247が何故かものすごく必死な件に付いて
0251デフォルトの名無しさん2005/09/19(月) 05:33:59
悔しかったらCYGWINの/usr/bin/share/docと/usr/bin/share/manを
間違って上書きしちゃったどうしようdocだけ最インストできそうだけど
manはどうしようってなってる俺をどうにかしてみろよおめーら
02522512005/09/19(月) 05:36:21
ワワワワワ
激しく誤爆しちまったじゃねえか
ついでにすれ違い覚悟で聞いてみるけど
どうしたら一番効率よくもどにもどせれる?
■ このスレッドは過去ログ倉庫に格納されています