[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/09 15:17 / Filesize : 213 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 131



1 名前:デフォルトの名無しさん [2007/02/01(木) 23:08:46 ]
このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

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

他の過去ログはここに
nssearch.hp.infoseek.co.jp/clang/
前スレ
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
pc10.2ch.net/test/read.cgi/tech/1159613789/


GUIなどの標準Cではできない事の質問,ソース丸投げ、宿題、書籍 は
専門の別スレッド↓があるのでそこへさようなら。

【初心者歓迎】C/C++室 Ver.34【環境依存OK】
pc10.2ch.net/test/read.cgi/tech/1169039760/
C/C++の宿題を片付けます 82代目
pc10.2ch.net/test/read.cgi/tech/1169575464/

159 名前:145 mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/02/18(日) 13:33:40 ]
>>159 問題ない。

161 名前:デフォルトの名無しさん mailto:sage [2007/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 mailto:sage [2007/02/18(日) 15:46:30 ]
大変勉強になりましたm(__)m
ありがとうございました

163 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 20:56:53 ]
free()でメモリ領域を解放する時、何故解放するメモリ領域へのポインタだけで解放できるんでしょうか?
解放するメモリ領域のサイズも必要な気がするのですが。

164 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 21:25:58 ]
>>163
その情報をポインタだけで引き出せるように管理しているから。
malloc/freeの実装の一例はK&Rに載ってる。
もちろんこれは一例で他にも実装方法はある。

165 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 21:51:42 ]
回答ありがとうございます。

malloc()したときに割り当てた領域へのポインタとサイズを一緒に記録しておいて
free()するときに引数として渡されたポインタを元に割り当てた領域のサイズを計算して解放するというような感じですかね?

K&R持ってないので買って読んでみます。

166 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 22:03:57 ]
>>165
そういう実装もあると思う。
K&Rのやり方は、

・mallocするときに管理用ヘッダ+要求されたサイズのメモリを確保
・mallocは管理用ヘッダのサイズ分アドレスを進めたポインタを返す
・freeは渡されてきたポインタから管理用ヘッダのサイズだけ戻して管理情報を得る
・各メモリ領域はリンクポインタで辿れるようになっている

という感じの実装だった(はず。今手元に本がない)。

167 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 22:07:11 ]
>>166
空き領域の線形リストで、渡されたポインタで挟まれる部分を探す方式でなかったっけ?

K&R 探すか



168 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 22:15:24 ]
>>167
うーん、そうだったかもしれない。ごめん。

169 名前:デフォルトの名無しさん mailto:sage [2007/02/20(火) 22:18:11 ]
>>168
いやいや。 俺も記憶だけで書いてるから…

>>165 とまあ、なんとかしてポインタから領域情報をひねりだしてるですよ

170 名前:デフォルトの名無しさん mailto:sage [2007/02/21(水) 17:55:41 ]
ちょっとK&R引っ張ってくる

171 名前:デフォルトの名無しさん [2007/02/24(土) 17:08:02 ]
標準化される前(つまりC89以前)の文字列リテラルの型はなんでしょうか?
現行規格では static char[] 型 です。

172 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 17:13:48 ]
staticはautoなんかと同じ記憶クラス指定子だから、変数を修飾していて、型を修飾してるわけじゃないよ

173 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 17:18:06 ]
まあでも静的記憶期間だと言いたいことはわかる

174 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 17:24:15 ]
標準化される前は処理系依存なんだからその質問は無意味な気がするが

175 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 17:29:41 ]
sizeof("ab") == sizeof("cde") が真ならchar*で、偽ならchar[]なんじゃね?
*"" = '\0'; でソレっぽいコンパイルエラーが出るならconstなんじゃね?

176 名前:171 [2007/02/24(土) 17:34:48 ]
標準化される前だから >>174 の言う通りですね、、、

177 名前:デフォルトの名無しさん mailto:sage [2007/02/24(土) 18:03:14 ]
>>175
真っ赤な嘘書くなや。



178 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 01:33:02 ]
ところで、文字列リテラルの型がなんであるのかを知りたい理由が聞きたいんだが

179 名前:171 [2007/02/25(日) 20:06:13 ]
>>178
sizeof("1234567890") は char[11] のサイズか char* のサイズかを知る為
現行規格では char[11] のサイズ 11 になる

標準化前については、処理系依存で納得です。

180 名前:171 [2007/02/25(日) 20:09:09 ]
>>179
補足
標準化される前は 文字列リテラルの型は char* だと某所で見た。

181 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 20:17:40 ]
>>179
いやそうじゃなくて、文字列リテラルの型を知って
それを何に応用出来るの?って話だと思うぞ。
豆知識?

182 名前:171 [2007/02/25(日) 20:20:32 ]
>181
だから
標準化前の sizeof("1234567890") の値を知る為。
その為に文字列リテラルの型が必要

でも処理系依存で納得した。

183 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 20:21:50 ]
>>182
無限ループになりそうだからもうやめとく。

184 名前:171 [2007/02/25(日) 20:24:12 ]
>>183
>>178 には「知りたい理由」 とありますが?
「何に応用出来るか?」とは書いてません。

185 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 20:30:16 ]
くだらね

186 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 21:46:09 ]
変なのにからまれて、171 の中の人も大変だな。

187 名前:178 mailto:sage [2007/02/25(日) 22:20:33 ]
わかったわかった言い直すよ

どうして sizeof("1234567890") の値を知りたいのか教えてくれ



188 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 23:02:42 ]
>>182
逆ではないのか?
文字列リテラルの型を間接的に測る手段としてsizeofを使うんだろうが。

189 名前:デフォルトの名無しさん [2007/02/25(日) 23:13:57 ]
ファイル操作に関して質問です。

GB単位のファイルを処理しているんですが
ファイルの一部を上書きする標準関数てあるのでしょうか?
あと指定した位置から後ろ全てを削除するような関数も探してます。


190 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 23:15:27 ]
fseekして書き込めばいいんじゃないかな

191 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 23:17:05 ]
ググればサンプルも見付かるよ。

192 名前:189 [2007/02/25(日) 23:27:21 ]
fseek して fwrite ということですね!
ありがとうございます。

ファイルの後半を削るというのはやっぱり無理なんでしょうか?

193 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 23:31:32 ]
Cの標準ライブラリではそういうことするのはないな。
Windows限定だったらSetEndOfFileなんてものもあるけど。

194 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 23:39:19 ]
UNIXならtruncateか。

195 名前:189 mailto:sage [2007/02/25(日) 23:41:21 ]
ありがとうございます。

fseek で調べたら上書きができるということはわかりました。
ただ挿入というようなことはできないと考えてよいのかな?

後半削除はないのですね。
ということは実現するには必要な部分だけファイルコピーということですね。
Windows 限定のコードではないので残念です。
差分とメタデータ使って実現するしかなさそうだな・・・。

196 名前:デフォルトの名無しさん mailto:sage [2007/02/25(日) 23:41:47 ]
0バイトをwriteするとそこから先が削れる場合もあるけど
処理系依存(そもそもwrite自体が処理系依存だが)

197 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 00:13:07 ]
stdioでできることは、
ファイルを作ること
ファイルをリネームすること
ファイルの任意の位置から読むこと
ファイルの任意の位置に書くこと
だけで、ファイルのサイズやレコードのオフセットを変更することはできない。
というかそれらはファイルの中身ではなく、ファイルの管理方法に関わることなので、
必然的に処理系のファイルシステムに依存する。

ありとあらゆる環境で動作することを保証したいなら、
それはファイルをまるごと読んで必要な構成で別ファイルに書き出し
元ファイルを消してから元の名前にリネームするしかない。
ある程度ターゲットの環境が決まっていて、それぞれに有効な環境依存の技があるなら、
それぞれの環境のためのコードを書いて、プリプロセッサで処理系に適合させるのが有効。



198 名前:デフォルトの名無しさん mailto:sage [2007/02/26(月) 04:57:47 ]
そういうファイル処理するプロセスを環境ごとに作り、主プログラムからはそれを呼び出すというのも一つの手。

199 名前:171 [2007/02/26(月) 19:52:50 ]
>>187
某所で、その話題を見たから気になっただけ。

>>188
確かにそうですね。



200 名前:デフォルトの名無しさん [2007/02/28(水) 15:50:13 ]
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?

201 名前:デフォルトの名無しさん mailto:sage [2007/02/28(水) 16:11:58 ]
>>200
楽しいか?

202 名前:デフォルトの名無しさん mailto:sage [2007/03/01(木) 00:55:09 ]
>>201
C++相談室の「STLを使うと」から始まるコピペみたいに
テンプレ化せんとダメなんかなぁ?

203 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 22:50:07 ]
>>203
戻り値の省略はANSI準拠でない

205 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 23:56:49 ]
JIS X 3010では
関数定義:
 宣言指定子列opt 宣言子 宣言並びopt 複合文
宣言子:
 ポインタopt 直接宣言子
直接宣言子:
 識別子
 ( 宣言子 )
 直接宣言子 [ 定数式opt ]
 直接宣言子 ( 仮引数型並び )
 直接宣言子 ( 識別子並び )
だからmain()は許されてるように読めるけど。どこかで明示的に禁止されてたっけ?

206 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 23:57:22 ]
識別子並びの後ろにoptが抜けてた。

207 名前:デフォルトの名無しさん mailto:sage [2007/03/05(月) 23:58:24 ]
>>203だと関数定義なのか関数宣言なのか曖昧だな



208 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 00:16:26 ]
Cの場合は省略時はintじゃなかったっけ
C++は確かダメだったような

209 名前:デフォルトの名無しさん mailto:sage [2007/03/06(火) 00:18:29 ]
許されてはいるけど、
コンパイラによっては警告が出るから鬱陶しい。

210 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 02:36:13 ]
>>210 ダメ

212 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 02:41:41 ]
intの配列ならこうだな
int cmp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}

213 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 02:41:50 ]
>>210
それはオーバーフローを起こすアホコードだから絶対に真似しちゃダメ。

214 名前:210 mailto:sage [2007/03/10(土) 02:43:22 ]
>>211
ですよねぇ・・・
更には
return *a-*b;
も何かやばい感じがするんですが

aに大きい負数が渡されるとおかしな事になるような・・・


215 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 02:43:29 ]
>>212 もアホ確定。

216 名前:デフォルトの名無しさん [2007/03/10(土) 03:06:11 ]
多分、このスレの前スレで、Linuxのカーネルソースは
$ lint 〜
にパスしないと受け付けられない、みたいな書込みがあったように思うのですが、
この「〜」の部分のオプションが分かる方いらっしゃいますでしょうか?

217 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 03:46:02 ]
サイトからソースを取得するプログラムについて質問したいのですが・・・
誰かいますか??



218 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 03:47:05 ]
>>217
環境依存スレへどうぞ。

219 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 23:21:23 ]
やはり、intを返すという基本設計がまずいな。

222 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 23:23:46 ]
>やはり、intを返すという基本設計がまずいな。
>やはり、intを返すという基本設計がまずいな。
>やはり、intを返すという基本設計がまずいな。

223 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 23:28:40 ]
よし、doubleを返すようにすればいいんだな!

アホかい

224 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 23:42:35 ]
えーとじゃぁオレchar返すよ

225 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 23:43:55 ]
たぶん彼は3値論理の型が欲しいと言っているんだろう

226 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 23:58:36 ]
#define UNDER -1
#define EQUAL 0
#define OVER 1

227 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 05:33:23 ]
そこはenumだろ常識的に考えて



228 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 06:17:15 ]
_Bool返せよ。

229 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 06:39:41 ]
おまえからそんなもの借りてないよ

230 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 06:44:58 ]
>>228
_Boolじゃ3種類の値は返せないだろ

231 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 06:47:54 ]
別に3種類も返す必要ないだろ。

232 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 06:52:19 ]
qsortの比較関数か? なら最低3値返す必要があるよ。

233 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 06:55:27 ]
クィックソートは3値ないとアルゴリズム的に実行不可能なわけ?

234 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 06:56:51 ]
アルゴリズム的に実行不可能という意味がよくわからないけど、
qsortの仕様がそれを要求している。それだけ。知らなかったの?

235 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 07:09:43 ]
>やはり、intを返すという基本設計がまずいな。
という流れできてるんだけど・・・・・・

236 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 07:58:04 ]
>>233
qsortはクイックソートではない
内部でどういうアルゴリズムで実装されててもいいことになっている

そういうわけで、a==bに対して非0を返すと、ソートが終わらなくなる可能性がある。



238 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 08:12:54 ]
>>236-237 >>235

239 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 08:42:20 ]
>>235
ああ、なるほど。流れはわかった。
が、intを返すのってそんなにまずい設計か?
ちょっとその辺の説明が欲しい。

むしろループの中で何度も呼ばれる関数なわけで、
intを返すのは性能の観点から当然の選択だと思うけどな。

240 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 08:46:49 ]
>>239
>>221 がまずいって言い出したから、みんなで何がまずいんだよって叩いてる流れ

241 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 08:54:11 ]
三値を返すのが不味いんだろ。型が問題なわけじゃない。

242 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 09:29:51 ]
ネーミングから誰でも一度はする誤解だよな>qsortはクイックソート

243 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 10:31:22 ]
要は、整数の比較関数を減算で行なうサンプルが問題なんだろ。

244 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 12:23:16 ]
値の差が INT_MAX を超えるとアウトだからね…

245 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 12:57:11 ]
まぁ必ずしも必要とは限らないのに、比較が2回必要な3値の関数を
求める仕様は糞と言ってもよいだろうな。

246 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 13:03:14 ]
必要なソートアルゴリズムもあるから、そうなってるんだろ

247 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 13:12:03 ]
>>237
×qsortはクイックソートではない
○qsortはクイックソートとは限らない



248 名前:デフォルトの名無しさん [2007/03/13(火) 15:20:00 ]
strcatを使用しないでchar型配列(str1とstr2)を連結したいのですが、
文字列str1の最後の'\0'に文字列str2の0からを一つずつ代入していけばいいのは
分かるのですが、やり方がわかりません。
どうすればできますか?

249 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 15:22:36 ]
マルチすんなアホ

250 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 20:15:26 ]
>>242
というかクイックソートを念頭に置いて名付けたんだろ。
単にこのスレ的にそう決めつけるのは誤ってるってだけで
>>244
実際の差を返す必要はないでしょ? 必要なのは符号だけで

251 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 20:17:15 ]
>>250
おまえは何もわかってないな

252 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 21:22:59 ]
>>250 後段
いちいち言われんと解らんのか。
>>213

253 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 21:42:38 ]
なんで>>250の後段が>>213に関連してくるのかわからん。
誰か解説してくれ。

254 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 21:52:19 ]
>>213の意味がわからんて事?

255 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 22:22:01 ]
>>250 の意味が分かってもらえてないって事だろ。

256 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 00:21:36 ]
>>213
なんでオーバーフロー起こすか解説きぼん

257 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 00:25:00 ]
問:負の数が弐の補数の処理系において、
*a=0, *b=INT_MINの場合、どうなるか?



258 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 00:35:24 ]
>>246
>>236を読め。2値さえ貰えれば十分のはずだから。

259 名前:デフォルトの名無しさん mailto:sage [2007/03/14(水) 01:29:02 ]
ダメだこりゃ。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<213KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef