【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131
at TECH
[前50を表示]
150:145
07/02/18 00:27:04
みなさんありがとうございます
言われてifの使い方調べて勉強になりました。
if(a) a≠0:真 a=0:偽 なので
!=0や==0を省略できるのですね
あとULですが、どの環境でも使えるものなのでしょうか?
151:デフォルトの名無しさん
07/02/18 00:33:45
>>150
整数リテラルのサフィックス UL は標準。どこでも使える。
152:デフォルトの名無しさん
07/02/18 02:09:52
あと>149が言い忘れてるけど、移植性考えるならabcもintではなくunsigned longで定義すること
153:デフォルトの名無しさん
07/02/18 03:36:36
abc のコピーを順次右シフトして 1 と and を取れば 1 の型を気にする必要なんかないのにな
154:145
07/02/18 06:11:09
多くのアドバイスありがとうございます。
int i ;
unsigned long abc ;
if( (abc & (1UL<<i)) != 0 )
または
unsigned long saveabc ;
saveabc = abc ;
if( ((saveabc>>i) & 1) != 0 )
こんな感じでどうでしょうか?
155:145
07/02/18 06:18:55
下のsaveabcは意味ないですね・・・コピーを順次右シフトどうやるんでしょう
156:デフォルトの名無しさん
07/02/18 06:30:43
>>=1
157:デフォルトの名無しさん
07/02/18 06:33:17
saveabc=abc;
for (i+......) {
if (saveabc & 1) { ... } /* 最下位ビットのみチェック */
/* チェック対象自身を右シフトしてしまえー */
saveabc >>= 1; /* saveabc = saveabc >> 1; */
}
順次右シフトは、上記を示唆してるんだと思うよ
158:145
07/02/18 13:16:34
なるほど、どうもありがとうございました
159:145
07/02/18 13:30:49
すみません今思いついたのですが、
int i ;
unsigned long abc ;
for( i=0 ; i<32 ; i++ ){
if( (abc>>i & 1) !=0 ){...}
}
これだとabcはunsigned longだし右に31シフトもできますでしょうか?
160:デフォルトの名無しさん
07/02/18 13:33:40
>>159 問題ない。
161:デフォルトの名無しさん
07/02/18 15:07:39
・ abc>>i & 1
・ abc & 1<<i
・ copyabc & 1 ... copyabc>>=1
・ mask=1 ... abc & mask ... mask<<=1
abcの値がその後必要ないなら
・ abc & 1 ... abc>>=1
も使える
162:145
07/02/18 15:46:30
大変勉強になりましたm(__)m
ありがとうございました
163:デフォルトの名無しさん
07/02/20 20:56:53
free()でメモリ領域を解放する時、何故解放するメモリ領域へのポインタだけで解放できるんでしょうか?
解放するメモリ領域のサイズも必要な気がするのですが。
164:デフォルトの名無しさん
07/02/20 21:25:58
>>163
その情報をポインタだけで引き出せるように管理しているから。
malloc/freeの実装の一例はK&Rに載ってる。
もちろんこれは一例で他にも実装方法はある。
165:デフォルトの名無しさん
07/02/20 21:51:42
回答ありがとうございます。
malloc()したときに割り当てた領域へのポインタとサイズを一緒に記録しておいて
free()するときに引数として渡されたポインタを元に割り当てた領域のサイズを計算して解放するというような感じですかね?
K&R持ってないので買って読んでみます。
166:デフォルトの名無しさん
07/02/20 22:03:57
>>165
そういう実装もあると思う。
K&Rのやり方は、
・mallocするときに管理用ヘッダ+要求されたサイズのメモリを確保
・mallocは管理用ヘッダのサイズ分アドレスを進めたポインタを返す
・freeは渡されてきたポインタから管理用ヘッダのサイズだけ戻して管理情報を得る
・各メモリ領域はリンクポインタで辿れるようになっている
という感じの実装だった(はず。今手元に本がない)。
167:デフォルトの名無しさん
07/02/20 22:07:11
>>166
空き領域の線形リストで、渡されたポインタで挟まれる部分を探す方式でなかったっけ?
K&R 探すか
168:デフォルトの名無しさん
07/02/20 22:15:24
>>167
うーん、そうだったかもしれない。ごめん。
169:デフォルトの名無しさん
07/02/20 22:18:11
>>168
いやいや。 俺も記憶だけで書いてるから…
>>165 とまあ、なんとかしてポインタから領域情報をひねりだしてるですよ
170:デフォルトの名無しさん
07/02/21 17:55:41
ちょっとK&R引っ張ってくる
171:デフォルトの名無しさん
07/02/24 17:08:02
標準化される前(つまりC89以前)の文字列リテラルの型はなんでしょうか?
現行規格では static char[] 型 です。
172:デフォルトの名無しさん
07/02/24 17:13:48
staticはautoなんかと同じ記憶クラス指定子だから、変数を修飾していて、型を修飾してるわけじゃないよ
173:デフォルトの名無しさん
07/02/24 17:18:06
まあでも静的記憶期間だと言いたいことはわかる
174:デフォルトの名無しさん
07/02/24 17:24:15
標準化される前は処理系依存なんだからその質問は無意味な気がするが
175:デフォルトの名無しさん
07/02/24 17:29:41
sizeof("ab") == sizeof("cde") が真ならchar*で、偽ならchar[]なんじゃね?
*"" = '\0'; でソレっぽいコンパイルエラーが出るならconstなんじゃね?
176:171
07/02/24 17:34:48
標準化される前だから >>174 の言う通りですね、、、
177:デフォルトの名無しさん
07/02/24 18:03:14
>>175
真っ赤な嘘書くなや。
178:デフォルトの名無しさん
07/02/25 01:33:02
ところで、文字列リテラルの型がなんであるのかを知りたい理由が聞きたいんだが
179:171
07/02/25 20:06:13
>>178
sizeof("1234567890") は char[11] のサイズか char* のサイズかを知る為
現行規格では char[11] のサイズ 11 になる
標準化前については、処理系依存で納得です。
180:171
07/02/25 20:09:09
>>179
補足
標準化される前は 文字列リテラルの型は char* だと某所で見た。
181:デフォルトの名無しさん
07/02/25 20:17:40
>>179
いやそうじゃなくて、文字列リテラルの型を知って
それを何に応用出来るの?って話だと思うぞ。
豆知識?
182:171
07/02/25 20:20:32
>181
だから
標準化前の sizeof("1234567890") の値を知る為。
その為に文字列リテラルの型が必要
でも処理系依存で納得した。
183:デフォルトの名無しさん
07/02/25 20:21:50
>>182
無限ループになりそうだからもうやめとく。
184:171
07/02/25 20:24:12
>>183
>>178 には「知りたい理由」 とありますが?
「何に応用出来るか?」とは書いてません。
185:デフォルトの名無しさん
07/02/25 20:30:16
くだらね
186:デフォルトの名無しさん
07/02/25 21:46:09
変なのにからまれて、171 の中の人も大変だな。
187:178
07/02/25 22:20:33
わかったわかった言い直すよ
どうして sizeof("1234567890") の値を知りたいのか教えてくれ
188:デフォルトの名無しさん
07/02/25 23:02:42
>>182
逆ではないのか?
文字列リテラルの型を間接的に測る手段としてsizeofを使うんだろうが。
189:デフォルトの名無しさん
07/02/25 23:13:57
ファイル操作に関して質問です。
GB単位のファイルを処理しているんですが
ファイルの一部を上書きする標準関数てあるのでしょうか?
あと指定した位置から後ろ全てを削除するような関数も探してます。
190:デフォルトの名無しさん
07/02/25 23:15:27
fseekして書き込めばいいんじゃないかな
191:デフォルトの名無しさん
07/02/25 23:17:05
ググればサンプルも見付かるよ。
192:189
07/02/25 23:27:21
fseek して fwrite ということですね!
ありがとうございます。
ファイルの後半を削るというのはやっぱり無理なんでしょうか?
193:デフォルトの名無しさん
07/02/25 23:31:32
Cの標準ライブラリではそういうことするのはないな。
Windows限定だったらSetEndOfFileなんてものもあるけど。
194:デフォルトの名無しさん
07/02/25 23:39:19
UNIXならtruncateか。
195:189
07/02/25 23:41:21
ありがとうございます。
fseek で調べたら上書きができるということはわかりました。
ただ挿入というようなことはできないと考えてよいのかな?
後半削除はないのですね。
ということは実現するには必要な部分だけファイルコピーということですね。
Windows 限定のコードではないので残念です。
差分とメタデータ使って実現するしかなさそうだな・・・。
196:デフォルトの名無しさん
07/02/25 23:41:47
0バイトをwriteするとそこから先が削れる場合もあるけど
処理系依存(そもそもwrite自体が処理系依存だが)
197:デフォルトの名無しさん
07/02/26 00:13:07
stdioでできることは、
ファイルを作ること
ファイルをリネームすること
ファイルの任意の位置から読むこと
ファイルの任意の位置に書くこと
だけで、ファイルのサイズやレコードのオフセットを変更することはできない。
というかそれらはファイルの中身ではなく、ファイルの管理方法に関わることなので、
必然的に処理系のファイルシステムに依存する。
ありとあらゆる環境で動作することを保証したいなら、
それはファイルをまるごと読んで必要な構成で別ファイルに書き出し
元ファイルを消してから元の名前にリネームするしかない。
ある程度ターゲットの環境が決まっていて、それぞれに有効な環境依存の技があるなら、
それぞれの環境のためのコードを書いて、プリプロセッサで処理系に適合させるのが有効。
198:デフォルトの名無しさん
07/02/26 04:57:47
そういうファイル処理するプロセスを環境ごとに作り、主プログラムからはそれを呼び出すというのも一つの手。
199:171
07/02/26 19:52:50
>>187
某所で、その話題を見たから気になっただけ。
>>188
確かにそうですね。
200:デフォルトの名無しさん
07/02/28 15:50:13
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
201:デフォルトの名無しさん
07/02/28 16:11:58
>>200
楽しいか?
202:デフォルトの名無しさん
07/03/01 00:55:09
>>201
C++相談室の「STLを使うと」から始まるコピペみたいに
テンプレ化せんとダメなんかなぁ?
203:デフォルトの名無しさん
07/03/05 22:32:01
ANSI Cの仕様について質問です。
mainはANSI Cではint main(void)またはint main(int argc, char *argv[])
と決まってるけど
K&Rではmain()となっていて戻り値intと引数voidを省略していますよね?
これもANSI準拠と言えるんでしょうか?
204:デフォルトの名無しさん
07/03/05 22:50:07
>>203
戻り値の省略はANSI準拠でない
205:デフォルトの名無しさん
07/03/05 23:56:49
JIS X 3010では
関数定義:
宣言指定子列opt 宣言子 宣言並びopt 複合文
宣言子:
ポインタopt 直接宣言子
直接宣言子:
識別子
( 宣言子 )
直接宣言子 [ 定数式opt ]
直接宣言子 ( 仮引数型並び )
直接宣言子 ( 識別子並び )
だからmain()は許されてるように読めるけど。どこかで明示的に禁止されてたっけ?
206:デフォルトの名無しさん
07/03/05 23:57:22
識別子並びの後ろにoptが抜けてた。
207:デフォルトの名無しさん
07/03/05 23:58:24
>>203だと関数定義なのか関数宣言なのか曖昧だな
208:デフォルトの名無しさん
07/03/06 00:16:26
Cの場合は省略時はintじゃなかったっけ
C++は確かダメだったような
209:デフォルトの名無しさん
07/03/06 00:18:29
許されてはいるけど、
コンパイラによっては警告が出るから鬱陶しい。
210:デフォルトの名無しさん
07/03/10 02:33:54
よくqsortに渡す関数ポインタを
int cmp(int* a,int* b)
{
return *a-*b;
}
と書いてるサイトを見かけるんですが、これは
qsortのプロトタイプの
int(*func)(const void* a, const void* b))
と関数ポインタの互換性が無いと思うんですが、これはアリなんですか?
211:デフォルトの名無しさん
07/03/10 02:36:13
>>210 ダメ
212:デフォルトの名無しさん
07/03/10 02:41:41
intの配列ならこうだな
int cmp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
213:デフォルトの名無しさん
07/03/10 02:41:50
>>210
それはオーバーフローを起こすアホコードだから絶対に真似しちゃダメ。
214:210
07/03/10 02:43:22
>>211
ですよねぇ・・・
更には
return *a-*b;
も何かやばい感じがするんですが
aに大きい負数が渡されるとおかしな事になるような・・・
215:デフォルトの名無しさん
07/03/10 02:43:29
>>212 もアホ確定。
216:デフォルトの名無しさん
07/03/10 03:06:11
多分、このスレの前スレで、Linuxのカーネルソースは
$ lint 〜
にパスしないと受け付けられない、みたいな書込みがあったように思うのですが、
この「〜」の部分のオプションが分かる方いらっしゃいますでしょうか?
217:デフォルトの名無しさん
07/03/10 03:46:02
サイトからソースを取得するプログラムについて質問したいのですが・・・
誰かいますか??
218:デフォルトの名無しさん
07/03/10 03:47:05
>>217
環境依存スレへどうぞ。
219:デフォルトの名無しさん
07/03/12 23:00:34
ANCI C言語辞典だと
return *a-*b;みたいな書き方してるけど
この辞典のサンプルソースはあてにならん
int型の配列のqsortの比較関数は下のような
感じになるんじゃないかな
int int_cmp(const void *a, const void *b)
{
if (*(int *)a < *(int *)b)
return (-1);
else if (*(int *)a > *(int *)b)
return (1);
return (0);
}
220:デフォルトの名無しさん
07/03/12 23:16:43
int int_cmp(const void *a, const void *b)
{
return *(int *)a == *(int *)b ? 0 : ( *(int *)a > *(int *)b ? 1 : -1 );
}
221:デフォルトの名無しさん
07/03/12 23:21:23
やはり、intを返すという基本設計がまずいな。
222:デフォルトの名無しさん
07/03/12 23:23:46
>やはり、intを返すという基本設計がまずいな。
>やはり、intを返すという基本設計がまずいな。
>やはり、intを返すという基本設計がまずいな。
223:デフォルトの名無しさん
07/03/12 23:28:40
よし、doubleを返すようにすればいいんだな!
アホかい
224:デフォルトの名無しさん
07/03/12 23:42:35
えーとじゃぁオレchar返すよ
225:デフォルトの名無しさん
07/03/12 23:43:55
たぶん彼は3値論理の型が欲しいと言っているんだろう
226:デフォルトの名無しさん
07/03/12 23:58:36
#define UNDER -1
#define EQUAL 0
#define OVER 1
227:デフォルトの名無しさん
07/03/13 05:33:23
そこはenumだろ常識的に考えて
228:デフォルトの名無しさん
07/03/13 06:17:15
_Bool返せよ。
229:デフォルトの名無しさん
07/03/13 06:39:41
おまえからそんなもの借りてないよ
230:デフォルトの名無しさん
07/03/13 06:44:58
>>228
_Boolじゃ3種類の値は返せないだろ
231:デフォルトの名無しさん
07/03/13 06:47:54
別に3種類も返す必要ないだろ。
232:デフォルトの名無しさん
07/03/13 06:52:19
qsortの比較関数か? なら最低3値返す必要があるよ。
233:デフォルトの名無しさん
07/03/13 06:55:27
クィックソートは3値ないとアルゴリズム的に実行不可能なわけ?
234:デフォルトの名無しさん
07/03/13 06:56:51
アルゴリズム的に実行不可能という意味がよくわからないけど、
qsortの仕様がそれを要求している。それだけ。知らなかったの?
235:デフォルトの名無しさん
07/03/13 07:09:43
>やはり、intを返すという基本設計がまずいな。
という流れできてるんだけど・・・・・・
236:デフォルトの名無しさん
07/03/13 07:42:29
>>233
C++のstd::sort()の場合、要求してるのは2値(bool値)のPredicateだし
別に不可能ってわけじゃない。
例えばcmp() は a > b ならtrue, さもなくばfalseを返すという仕様であると
して、もし同値かどうかの判定が必要であれば、
cmp(a,b)、cmp(b,a)の両者がfalseならば a == b と判断できるわけで。
>>234の言うように、C標準のqsort()の仕様が3値の比較関数を求めている
ってだけだ。
237:デフォルトの名無しさん
07/03/13 07:58:04
>>233
qsortはクイックソートではない
内部でどういうアルゴリズムで実装されててもいいことになっている
そういうわけで、a==bに対して非0を返すと、ソートが終わらなくなる可能性がある。
238:デフォルトの名無しさん
07/03/13 08:12:54
>>236-237 >>235
239:デフォルトの名無しさん
07/03/13 08:42:20
>>235
ああ、なるほど。流れはわかった。
が、intを返すのってそんなにまずい設計か?
ちょっとその辺の説明が欲しい。
むしろループの中で何度も呼ばれる関数なわけで、
intを返すのは性能の観点から当然の選択だと思うけどな。
240:デフォルトの名無しさん
07/03/13 08:46:49
>>239
>>221 がまずいって言い出したから、みんなで何がまずいんだよって叩いてる流れ
241:デフォルトの名無しさん
07/03/13 08:54:11
三値を返すのが不味いんだろ。型が問題なわけじゃない。
242:デフォルトの名無しさん
07/03/13 09:29:51
ネーミングから誰でも一度はする誤解だよな>qsortはクイックソート
243:デフォルトの名無しさん
07/03/13 10:31:22
要は、整数の比較関数を減算で行なうサンプルが問題なんだろ。
244:デフォルトの名無しさん
07/03/13 12:23:16
値の差が INT_MAX を超えるとアウトだからね…
245:デフォルトの名無しさん
07/03/13 12:57:11
まぁ必ずしも必要とは限らないのに、比較が2回必要な3値の関数を
求める仕様は糞と言ってもよいだろうな。
246:デフォルトの名無しさん
07/03/13 13:03:14
必要なソートアルゴリズムもあるから、そうなってるんだろ
247:デフォルトの名無しさん
07/03/13 13:12:03
>>237
×qsortはクイックソートではない
○qsortはクイックソートとは限らない
248:デフォルトの名無しさん
07/03/13 15:20:00
strcatを使用しないでchar型配列(str1とstr2)を連結したいのですが、
文字列str1の最後の'\0'に文字列str2の0からを一つずつ代入していけばいいのは
分かるのですが、やり方がわかりません。
どうすればできますか?
249:デフォルトの名無しさん
07/03/13 15:22:36
マルチすんなアホ
250:デフォルトの名無しさん
07/03/13 20:15:26
>>242
というかクイックソートを念頭に置いて名付けたんだろ。
単にこのスレ的にそう決めつけるのは誤ってるってだけで
>>244
実際の差を返す必要はないでしょ? 必要なのは符号だけで
251:デフォルトの名無しさん
07/03/13 20:17:15
>>250
おまえは何もわかってないな
252:デフォルトの名無しさん
07/03/13 21:22:59
>>250 後段
いちいち言われんと解らんのか。
>>213
253:デフォルトの名無しさん
07/03/13 21:42:38
なんで>>250の後段が>>213に関連してくるのかわからん。
誰か解説してくれ。
254:デフォルトの名無しさん
07/03/13 21:52:19
>>213の意味がわからんて事?
255:デフォルトの名無しさん
07/03/13 22:22:01
>>250 の意味が分かってもらえてないって事だろ。
256:デフォルトの名無しさん
07/03/14 00:21:36
>>213
なんでオーバーフロー起こすか解説きぼん
257:デフォルトの名無しさん
07/03/14 00:25:00
問:負の数が弐の補数の処理系において、
*a=0, *b=INT_MINの場合、どうなるか?
258:デフォルトの名無しさん
07/03/14 00:35:24
>>246
>>236を読め。2値さえ貰えれば十分のはずだから。
259:デフォルトの名無しさん
07/03/14 01:29:02
ダメだこりゃ。
260:デフォルトの名無しさん
07/03/14 01:32:05
>>213なんて分かりきった上で、全然別の次元の話をしているだけなのだが?
261:デフォルトの名無しさん
07/03/14 01:41:12
INT_MINの符号反転はINT_MINのままだから
int a = 0; int b = INT_MIN;のとき
>>210だと
cmp(&a, &b) < 0となってしまうのでダメってことか
で>>220だと
cmp(&a, &b) > 0となり正しいと。
262:デフォルトの名無しさん
07/03/14 01:47:31
>>250=256=260
だと最高なんだがなーw
263:デフォルトの名無しさん
07/03/14 01:58:02
450Kのコードっていったらどれくらいの規模のこと?
45万行ってこと?
264:デフォルトの名無しさん
07/03/14 02:01:41
450KiBかも知れず。
265:デフォルトの名無しさん
07/03/14 02:18:51
>>262
違うよ。いつまでもそんな下らない話題引っ張られても邪魔だから
引っ込んでろといってる。
266:デフォルトの名無しさん
07/03/14 02:21:24
stdc++のstd::sort()もソートアルゴリズムを指定していない点では同じだが
要求しているのは2値のPredicateだ。
何度も繰り返すが、3値のPredicateは要らないんだよ本来は。
整数のオーバーフローとかいう低レベルの下らない話とは全然別問題。
267:デフォルトの名無しさん
07/03/14 03:36:11
>>266
なんでここで全然関係のないstdc++が出てくるのかわからんがな。
規格においてqsortは安定でないことになっているから、
本来は3値も要らず、2値で十分てことだろ。
268:デフォルトの名無しさん
07/03/14 03:46:23
>>267
実際には順序付け集合に対する2値の述語関数があれば、
3値と同等のことは実現できる。だから、仮に3値が必要な場合であっても
2値の述語関数で十分なの。
>>236を読めよ。
269:デフォルトの名無しさん
07/03/14 03:59:52
結論:
比較関数をいっぱい呼びたい奴はC++を使っとけ
270:デフォルトの名無しさん
07/03/14 05:38:34
>>268
まったくだ。ifとwhileだけで構造化は実現できるのにforなんて無駄きわまりないな。
breakやcontinueなんてもっての他だ。gotoやlongjmpに至っては(ry
271:デフォルトの名無しさん
07/03/14 05:47:10
>>270
意味不明。馬鹿じゃないの。
構造化のための構文は*ユーザにとって*便利であり
*ユーザが*見通しの良いプログラムを書くのに役に立つ。
2値の述語関数で十分なのに3値の述語関数を要求するのは
*ユーザにとって*便利でも何でもないし、
それによって効率があがりもしない。
結局3値の比較が*実際に*必要である箇所では、比較が2度必要になるからだ。
しかし、3値の比較を*常に*ユーザ側に求めた場合、実際には必要でない
箇所でも2度の比較を行う羽目になる。
つまり、不便なだけでなく、効率が悪くなるのだ。
それはライブラリ側の怠慢であり手抜きであり仕様の欠陥でしかないよ。
272:デフォルトの名無しさん
07/03/14 05:47:59
>>270
まったくだ。lambdaさえあれば他になにも(ry
273:デフォルトの名無しさん
07/03/14 05:56:40
>>269
アホか。C++のほうがはるかにソートを楽に記述できる。
274:デフォルトの名無しさん
07/03/14 06:00:15
順序集合をソートする場合において、等値かどうかの比較が常に必要とは
限らないんだが、
わざわざそれを常にユーザに強いているのがCのqsort()の仕様。
C++のstd::sort()の場合は、そんな馬鹿なまねはしない。必要な場合は、
そして必要な場合のみに限って、2値のPredicateだけで等値かどうかの
判定をできるからだ。
275:デフォルトの名無しさん
07/03/14 06:59:21
そして、2値を返すなら、compの素直な実装方法による
オーバーフローがどうこうという面倒な話も発生しない。
276:デフォルトの名無しさん
07/03/14 07:34:36
Perlにはsortのために(としか思えない)わざわざ3値比較のための
演算子なんてものが用意されてるよね。
<=> とか cmp とか。これは笑ってしまう。
277:デフォルトの名無しさん
07/03/14 08:02:25
それはここでやる話じゃないだろ。
278:デフォルトの名無しさん
07/03/14 09:12:15
ここまで読んだ
とりあえず論点が完全にズレたまま進行してることはわかった
279:デフォルトの名無しさん
07/03/14 20:42:33
いつまでソートの話してんだよ。
280:デフォルトの名無しさん
07/03/14 21:31:47
例えば以下のような構造体をファイルで宣言した時
初期値として、
hoge.bar == NULL と hoge.foo == NULL は保証されているのでしょうか?
struct {
char *bar;
char **foo;
} hoge;
281:デフォルトの名無しさん
07/03/14 21:33:29
されるわけないでござる
282:デフォルトの名無しさん
07/03/14 21:40:01
え?その定義ならされるだろ。
まさかあれか、全ビット0がNULLとは限らないというあの流派か。
283:デフォルトの名無しさん
07/03/14 21:43:23
自動変数でも?
284:デフォルトの名無しさん
07/03/14 21:56:14
大域変数か静的変数なら初期化される。
ゼロフィルではなく、全てのメンバが0に。
285:デフォルトの名無しさん
07/03/14 22:01:03
ファイルで宣言ってのは、自動変数説を否定している、と俺は見たが。
関数で宣言、なら自動変数かもね。 深読みしすぎといわれればその通り。
286:デフォルトの名無しさん
07/03/14 22:06:00
C言語初心者です。
「C言語プログラミング能力認定試験」って取るメリットありますか?
287:デフォルトの名無しさん
07/03/14 22:09:52
スレ違いだよ
1級ならまだ許せるけど、履歴書に2級とか書かれたら(´,_ゝ`)プッ
288:デフォルトの名無しさん
07/03/14 22:16:35
私はまだ何も分からないのですが
プログラミングをするにあたってまず何をそろえて何をすればいいんでしょうか?
289:デフォルトの名無しさん
07/03/14 22:19:21
>>288
MSのサイトからコンパイラをダウソ。
290:デフォルトの名無しさん
07/03/14 22:21:24
まずはパソコンを買うことから始めます。
291:デフォルトの名無しさん
07/03/14 22:24:13
>>288
ボーランドコンパイラかVisual C++ Express。どっちも無料
インストール後、適当にPATH通せ
292:デフォルトの名無しさん
07/03/14 22:29:36
Knoppixをお勧めしてみるテスト
293:288
07/03/14 22:49:47
Visual C++ Expressのダウンロード及びセットアップ完了しました。
294:デフォルトの名無しさん
07/03/14 23:22:34
>>280
「ファイルで」というのが「関数の外で」宣言されたという意味なら、される。
この初期化は、配列でも構造体でも、全ての要素について「=0」と書いたかのように行われる。
よって不動小数点数は0.0に、ポインタはヌルポインタに正しく初期化される。
>>293
入門書を買って言語仕様を覚えろ。
295:デフォルトの名無しさん
07/03/14 23:27:15
関数内でもstatic付けた静的変数ならやっぱり0初期化される
296:デフォルトの名無しさん
07/03/15 00:19:35
>よって不動小数点数は0.0に、ポインタはヌルポインタに正しく初期化される。
大間違い。
297:デフォルトの名無しさん
07/03/15 00:39:01
>>296
俺は294じゃないけど間違いというならその理由を示してよ。
K&R A8.7初期化 より引用
> 明示的に初期化されない静的オブジェクトは、それ(あるいはそのメンバー)に定数
> 0が代入されたかのように初期化される。明示的に初期化されない自動オブジェク
> トの初期値は、不定である。
298:デフォルトの名無しさん
07/03/15 00:52:49
>>297
根拠を示さず「大間違い」とだけ言うのは小学生だってできる。
無視してかまわんだろう。
299:デフォルトの名無しさん
07/03/15 00:53:35
>>297
知らんがたぶん、>>282 じゃないのかな
300:デフォルトの名無しさん
07/03/15 00:59:15
>>299
違う。
301:デフォルトの名無しさん
07/03/15 01:00:15
>>299
>>297が示している通り、プログラマーが =0 と書いたのと同じように初期化される。
302:デフォルトの名無しさん
07/03/15 01:01:03
>>299
関係ないでしょ。だって
void *p = 0;
と書いてあるように初期化されるんでしょ。
これはpには全ビットが0の値が入るのではなくて、
NULLポインタが入るんだよ。
303:デフォルトの名無しさん
07/03/15 01:01:37
段階を追って詳しい説明になっていくのにワラタw
304:デフォルトの名無しさん
07/03/15 01:02:24
ゼロフィルで済む処理系ならBSSをロードする時に全部ゼロ埋めするだけだが、
それで済まない処理系で規格を満たすためには、初期化専用のコードを
コンパイラが吐き出して、スタートアップルーチンで呼ばれるようにする
んだろね。
なんかC++みたいだなw
305:デフォルトの名無しさん
07/03/15 01:06:45
不動じゃなくて浮動だろと言うつっこみだったんだよ!たぶん
306:デフォルトの名無しさん
07/03/15 01:07:23
>>302
それ実は俺もずっと気になってたんだけど
ポインタに0代入したらそれはNULLポインタと等価なの?
というか全ビット0がNULLとは限らない処理系ってあるの?
307:デフォルトの名無しさん
07/03/15 01:09:10
>306
CFAQには、そういう処理系も実在すると書いてあったよ
308:デフォルトの名無しさん
07/03/15 01:11:14
というか
ヌルポインタの内部表現が未既定なのも
ポインタがくるべき場所に整数定数0を書いたらヌルポインタに変換されるのも
規格がそう定めているからであって、そのような処理系が実在するからではない
309:デフォルトの名無しさん
07/03/15 01:15:45
>>306
> ポインタに0代入したらそれはNULLポインタと等価なの?
Yes.
ポインタの文脈では0はいつでもnull pointer constantとして扱われる。
310:デフォルトの名無しさん
07/03/15 01:16:21
ポインタに「値が0の整数定数式」を代入したり、(暗黙にでも)比較したりしたときは、
コンパイラが整数定数0を正しいヌルポインタの値に変換する。
値が0である整数変数を代入する場合はこれにあてはまらない。
あくまで定数だけである。
311:デフォルトの名無しさん
07/03/15 01:25:21
>>305
なっとく。
312:デフォルトの名無しさん
07/03/15 01:27:00
>>280が変数宣言を書けば、こんなにモメなかったろうにw
ぶっちゃけauto変数以外はリンカーがプログラムに引っ付けて実行形式で出力する。
実行するとローダーがフォーマットに従い元通りに展開してくれる
auto変数で使うスタック領域もローダーがフォーマットに従いサイズ分用意してくれるが、
0クリアする決まりが無いので未初期化として扱うのが決まりになってる。
ROMで実行されるプログラムでない限りは、こんな覚え方でいいような気がする。
313:デフォルトの名無しさん
07/03/15 01:29:48
NULLの定義が
#define NULL 0
#define NULL ((void*)0)
以外の処理系って見たことある?
俺は無いけど。
314:デフォルトの名無しさん
07/03/15 01:32:02
>>312
BSS(未初期化のstatic変数を格納する領域)も実行形式に
埋め込む処理系は少ないのでは。
スペースの無駄だからね。
315:306
07/03/15 01:37:05
物凄い参考になった。皆thx
316:313
07/03/15 01:39:15
ちなみに俺はC++の癖でCでもNULLと書かずに0と書いてしまう。
317:デフォルトの名無しさん
07/03/15 02:15:30
>>313
最近のgccとかは __null とかになってなかった?
318:デフォルトの名無しさん
07/03/15 03:16:08
そうだと困るハードがあるからNULLが0x00000000とは定めてないわけだよねぇ?
319:デフォルトの名無しさん
07/03/15 03:17:01
>>316
構わないと思う。
320:デフォルトの名無しさん
07/03/15 03:27:38
>>318
ハードにかかわらず、NULLを整数値として評価した場合は 0 として評価されるって規格で定められてたと思うけど。
321:デフォルトの名無しさん
07/03/15 03:43:29
>>320
あ、いやNULLの番地がって意味で
322:デフォルトの名無しさん
07/03/15 05:00:16
NULLを使わず0で初期化してる人がいるようだけど
俺したこと無い。
例えば
int *foo = 0;
とか
typedef struct{
int a;
char *p;
}hoge;
hoge *ho = 0;
とかしちゃったりするの?
323:デフォルトの名無しさん
07/03/15 05:01:38
>>322 もちろん。
324:デフォルトの名無しさん
07/03/15 05:06:01
標準ライブラリに含まれてる型名って、ファイルスコープの名前だから
関数ローカルや構造体メンバでその名前使っても問題ないよね?
jmp_buf とか va_list とか、マイナーなやつをうっかり使ってしまうことが
無いとは言えないんで、エディタのキーワードハイライトに全部
突っ込んでおこうかと思ったんだけど、よくよく考えたら
ファイルスコープでやらかさなけりゃ全然問題ないんじゃないかと。
325:デフォルトの名無しさん
07/03/15 08:35:49
>>313
DOSでラージメモリモデルの環境では0Lになっていると思う。
少なくともLSI C-86のヘッダではそうだった。
326:デフォルトの名無しさん
07/03/15 08:38:48
>>324
いや、それらはグローバルなので問題ありまくり。
衝突を避けたければ、ユーザコードの名前に特定のPrefixを付けるといった
規約を考えたほうがよい。
327:デフォルトの名無しさん
07/03/15 09:54:39
>>326
jmp_buf なんて何の規則も無い名前との衝突を避けようと思ったら、
関数ローカルや構造体メンバに int a; とすら書けないと思うんだが、
正気か?
328:デフォルトの名無しさん
07/03/15 10:22:35
>>327
は?
構造体タグ名、変数名、メンバー名は別の名前空間に属するから、
そのような例で同一の名前を用いても問題が生じるわけがないよ。
329:デフォルトの名無しさん
07/03/15 10:22:58
>321
単に「NULL」という言葉を「ヌルポインタ」という意味で使うと誤解を招きかねないのでやめたほうがいい
マクロNULLとヌルポインタは別のものであるから、区別できるように書くべき
330:デフォルトの名無しさん
07/03/15 10:27:24
>>328
元の質問 >324 がそう言って「問題ないよね?」って聞いたのに対して
>326 が「問題ありまくり」と返しているんだが。
331:デフォルトの名無しさん
07/03/15 10:30:11
>>330
同一の名前空間で同じ名前を重複させたら当然問題あるでしょ。
あなたがC言語の仕様に対する無知によって、的外れな例を挙げただけ。
332:デフォルトの名無しさん
07/03/15 10:40:58
>>331
構造体メンバは問題が生じるわけないってことか?
なら残りはローカル変数ってことでいいかい?
ファイルスコープの typedef である jmp_buf の名前空間は
ローカル変数といっしょで変数名だよね?
でもローカル変数ならスコープが重なるだけなんで、ライブラリの
jmp_buf を使うつもりじゃなくてうっかり(知らずに)ローカル変数名として
使っただけなら問題ないんじゃないの?
どうせ内側で宣言されたローカル変数しか参照しないんだから。
333:デフォルトの名無しさん
07/03/15 10:43:47
>>332
ヒント: 他人にものを聞く態度
>>336を読まなかったのかい?
jmp_bufは「ファイルスコープ」の名前ではありません。
334:デフォルトの名無しさん
07/03/15 10:52:50
typedef名と変数名の名前空間も別物です。
だから、
typedef int i;
i i;
のようなコードも合法。良いスタイルではないけどね。
335:デフォルトの名無しさん
07/03/15 11:11:43
>>333
「ファイルスコープ」じゃなくて「グローバルスコープ」って言いたいの?
ISO C99 の最新ドラフトを見てしゃべってるんだが、規格には
「グローバル」なんてスコープは無いよ。
6.2.1 で列挙されてるのは "file scope", "block scope",
"function prototype scope" の3種類だけ。 "global scope" で
検索してもひとつもヒットしない。なので >326 の言ってる
「グローバル」ってのはファイルスコープのことだと思った。
336:333
07/03/15 11:14:40
>>335
あーごめん。嘘ついたかも。
リンケージまで考えるとファイルスコープって一般にstaticなオブジェクトのこと
を指すと思うんだけど、今は名前の話だったな。ごっちゃになってたわ。
337:デフォルトの名無しさん
07/03/15 11:16:45
「C99 の最新ドラフト」はおかしいな。
>>334
で、同じく ISO C の最新ドラフトから、 6.2.3 に列挙されてる
名前空間は、ラベル名、タグ名、メンバ名、その他の4つ。
変数名も typedef 名も最後のその他で同じ名前空間です。
どんなコンパイラがそのコードを受け付けてくれるの?
手元の gcc ではやっぱりエラーになるよ。
:2: error: 'i' redeclared as different kind of symbol
:1: error: previous declaration of 'i' was here
338:334
07/03/15 11:20:54
あー名前空間同じだけど、typedef定義と変数宣言を
スコープ違う形で試したから受け入れられたっぽいな。
こっちもすまん。
339:デフォルトの名無しさん
07/03/15 11:22:19
>>329
確かに。お粗末でした。
340:324
07/03/15 11:57:28
えーと。つまり >324 はやっぱり問題ないってことでおk?
341:デフォルトの名無しさん
07/03/23 00:03:57
>>337
struct a {
int a;
};
typedef struct a a;
a b:
void c()
{
b.a = 0;
goto a;
a: ;
}
ってこと?
342:デフォルトの名無しさん
07/03/23 01:52:18
>>341
何がしたいのかわからん。
343:341
07/03/23 09:26:10
処理自体には意味ない。
ただ名前空間の分類としては、こういうことかな?と
aは全部違う名前空間ということで。
344:デフォルトの名無しさん
07/03/23 10:34:48
>>343
そうだよ。ちゃんとコンパイルできただろ?
345:デフォルトの名無しさん
07/03/30 01:20:19
↓のようなことって技術的に可能ですか?
何分↓スレに専門知識を持った人間がおらず、真偽が分からなかったので
ここで質問させていただきました
558 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:06:29 ID:ENSP49sq
そうだ
一応書いておくわ
CとかJavaとか言語でわけてる現状がそもそもおかしいから
ソースコード翻訳機作ってやってるよ
おまえも参加しろwww
役に立たない下っ端を使えるようにする秘策だぞwwww
561 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:12:11 ID:ENSP49sq
意味分からないのか??
コンパイラじゃなく
ソースコードをそれぞれに変換するってことだぞ
意味分からないかな??
564 名前: 麒麟です ◆qJFjoQ6aTk 投稿日: 2007/03/29(木) 22:14:33 ID:ENSP49sq
たとえば
Cで書いたコード100万行を
自動変換で
Javaコードに変換するって奴だwwwwww
分かるかな???
スレリンク(dame板)l50
346:デフォルトの名無しさん
07/03/30 01:27:44
>>345
マルチ氏ね!
347:デフォルトの名無しさん
07/03/30 02:31:56
はいはいわろすわろす
348:デフォルトの名無しさん
07/04/09 14:46:42
ファイルの作成された日時をゲットする方法を教えてくれい!
349:デフォルトの名無しさん
07/04/09 14:50:36
アイコンを右クリックしてプロパティを見る。
350:デフォルトの名無しさん
07/04/09 14:56:45
>349
そんなアホナ。。。
351:デフォルトの名無しさん
07/04/09 15:00:27
ワロタ
stat とか fstat で
352:デフォルトの名無しさん
07/04/09 15:11:31
環境依存
353:デフォルトの名無しさん
07/04/10 12:13:30
program.exe arg1 arg2 arg3 ....
と何個でも、何文字でも無制限にいけるのか?
354:デフォルトの名無しさん
07/04/10 12:27:41
引数の長さには通常制限があるが、環境依存。
ARG_MAXでぐぐれ。
355:デフォルトの名無しさん
07/04/10 12:39:20
制限はあるけどそれはプログラムの方の制限じゃないよ
356:デフォルトの名無しさん
07/04/10 20:30:12
ARG_MAXはPOSIXだと思う
357:デフォルトの名無しさん
07/04/11 00:27:46
うん
358:デフォルトの名無しさん
07/04/11 00:30:27
シェルの制限かと思ってた
359:デフォルトの名無しさん
07/04/12 22:37:03
>>349
できました! ありがとうございます!
360:デフォルトの名無しさん
07/04/13 01:54:24
>359
mjky
361:デフォルトの名無しさん
07/04/13 15:40:58
malloc とか free に一枚皮を被せるって常識なの?
void Free(void *ptr)
{
if (ptr != NULL) free(ptr);
}
こんなようなの、、、
362:デフォルトの名無しさん
07/04/13 15:50:03
少なくとも、free() にNULL渡すのは問題ない仕様だから
それは意味無いな。
363:デフォルトの名無しさん
07/04/13 15:50:40
違った delete に渡すのが問題無いんだった
364:デフォルトの名無しさん
07/04/13 15:51:15
>>361
常識ではないし、標準Cなら
| free 関数は、ptr が指す領域を開放し、その後の割付けに使用できるようにする。
| ptr が空ポインタの場合、何もしない。
ので、まったくの無駄。
もっとも、malloc/free のトレースをしたいという目的で
ラップするのはアリ。
365:デフォルトの名無しさん
07/04/13 16:46:05
メモリリーク検出には役立つかも知れない
366:デフォルトの名無しさん
07/04/13 23:45:45
>>361
ペアであるmalloc/freeのインターフェイスをよりペアらしくできるから、
オレはこんな感じにすることがある。
result_type my_malloc(void **ptr, int size)
{
*ptr = malloc(size);
return (NULL != *ptr) ? result_success: result_faild;
}
result_type my_free(void **ptr)
{
if (NULL == *ptr)
{
free(*ptr);
*ptr = NULL;
}
return result_success;
}
367:デフォルトの名無しさん
07/04/14 00:02:53
void**はないだろ、常識的に考えて…
368:デフォルトの名無しさん
07/04/14 00:04:43
スレタイを100回音読すべきだな
369:デフォルトの名無しさん
07/04/14 00:25:26
>>367
間違えやすいよな.C++なら参照使えばいいけど,
Cならマクロ使った方がいい局面かも.
370:デフォルトの名無しさん
07/04/14 00:42:17
自分用ツールだったら、よくmallocが0を返したら即exit(1)するラッパを使う。
C++を使えるときにはnewを使えばいいんだけど。
371:デフォルトの名無しさん
07/04/14 02:43:50
>>366
my_freeは、渡されてきたポインタがNULLの時にのみ解放してるけど、それでいいの?
というか単純ミスだよなw
372:デフォルトの名無しさん
07/04/14 02:57:19
my_free(NULL);
373:デフォルトの名無しさん
07/04/14 09:31:55
linuxの場合は、malloc()が成功したかどうかは、実際にメモリにアクセスするまで分からないから、
malloc()の戻り値をチェックするのは無駄だって説もあるな。
374:デフォルトの名無しさん
07/04/14 09:45:08
>>373
カーネルの設定換えれば検出できるようになるね。
さもなくば、calloc()で検出できるんじゃないか?
375:デフォルトの名無しさん
07/04/14 10:05:41
そんな環境依存の話を書かれても
376:デフォルトの名無しさん
07/04/14 10:12:33
つまり、このスレ的にはmalloc()の戻り値を検出するためだけのラッパは要らないということで。
377:デフォルトの名無しさん
07/04/14 10:23:45
仕様的にはmallocの時点で割り当て失敗かどうか検出できないのってどうなの?
378:デフォルトの名無しさん
07/04/14 10:31:26
WindowsもたぶんVirtualAlloc使うと、実際にアクセスするまで確保されない
ってこのスレじゃ関係ないね
379:デフォルトの名無しさん
07/04/14 11:49:59
今ググても見つからなかったけど、俺が読んだ文章だと「近代的なOSだと、そういうふうになってる」みたいな言い方だったね。
mallic()で0を返さないって。
380:デフォルトの名無しさん
07/04/14 11:54:59
マリックwwwww
381:デフォルトの名無しさん
07/04/14 15:47:16
>>373
malloc()は、システムコールじゃないよ。libcの関数だよ。
わかってる?
382:デフォルトの名無しさん
07/04/14 15:58:38
>>377
駄目。
malloc()の実装のサンプル(システムコールとの関係)はK&Rにも載ってるから
興味がある人は目を通して理解しておくと良いよ。
知ったかぶりすると恥ずかしいから。
Windowsで言うなら、
VirtualAllocは確保できなくても0以外を返すかもしれない(実際は知らない)けど
HeapAlloc(OSからもらったメモリを必要な分だけに区切って渡す)は
確保出来ないときは0(NULL)を返すということ。
(サイズ情報等を埋め込むから、必ず実際のメモリにアクセスする)
VC++なんかのmallocは、HeapAllocをそのまま呼んでるだけだし。
383:デフォルトの名無しさん
07/04/14 16:11:45
URLリンク(www.linux.or.jp)
> デフォルトでは、Linux は楽観的メモリ配置戦略を用いている。つまり、 malloc() が
> NULL でない値を返しても、そのメモリが実際に利用可能であることが保証されない。
> これは本当にまずいバグである。
なるほど、確かにこれはバグだと言っている
384:デフォルトの名無しさん
07/04/14 16:19:02
ヒント: 管理情報はアプリケーションに返すメモリブロックに隣接している必要はない
malloc()がどう実装されてるかなんてそれこそ環境依存以外の何者でもない
とはいえ利用可能でないのにNULLを返さないのは規格違反だろうな
385:デフォルトの名無しさん
07/04/14 16:23:15
なるほど、
アドレス空間が足りない時等「一般的にmallocがNULLを返す状況」では無く、
システム全体(カーネルと各プロセス最小限使用分)の「物理メモリ」が不足する状況で
プロセスの存在そのものが抹消されるわけね。
それも、自分自身とは限らないプロセスが。
386:デフォルトの名無しさん
07/04/14 16:25:23
とはいえ、どう考えても、これが「近代的なOS」と関係あるとは思えない。
「近代的なOS」が使っているのは、仮想記憶とデマンドページングだろ。
mallocが失敗してもNULLを返さないのとは関係ない。
387:デフォルトの名無しさん
07/04/14 16:26:27
つまり、このスレ的にはLinuxのlibc(におけるmalloc()の実装)は間違いだということですね。
388:デフォルトの名無しさん
07/04/14 16:30:32
Linuxはカーネルだけだから理論的にはまともな実装をしたlibcに置き換えることもできる。
glibcと言っておこう
389:デフォルトの名無しさん
07/04/14 16:31:52
>>384
でも、とりあえず、manでヒープの破壊について触れているくらいだから
今話題のLinuxのglibcの実装に関しては、
確保したブロックの前後に管理ブロックがあると、仮定しても構わないでしょ。
390:デフォルトの名無しさん
07/04/14 16:33:25
じゃあどういう状況でNULLを返さないことがあり得るんだろう。
アプリケーションに返すメモリがたまたまページ境界にまたがったときかな
391:デフォルトの名無しさん
07/04/14 16:38:02
>>390
いや、>>385な状況で、実際に物理メモリが足りないと判明する時でしょ。たぶん。
ページ境界の可能性もあるけど、大きなブロックを確保して真ん中にアクセスした時とかも。
ていうか、この場合、メモリ不足が
「アクセスするまでわからない」じゃなくて「絶対にわからない」だな。
分かった瞬間に検出することも出来ないまま殺されちゃうんだから。
>>373の「NULLチェックが無駄かも」という結論は一緒かもしれないけど。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5330日前に更新/213 KB
担当:undef