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


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

【初心者お断り】ガチ規格準拠C専用スレ Part133



1 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 14:52:45 ]
このスレは標準C規格や規格に合致した移植性の高い記法・技法に関するスレです。
C言語初心者の初歩的な質問、GUIなどの標準Cではできない事の質問、
ソース丸投げ、宿題、書籍 などは専門の別スレッド↓があるのでそちらへ。

C言語なら俺に聞け(入門篇) Part 24
pc11.2ch.net/test/read.cgi/tech/1201083176/
【初心者歓迎】C/C++室 Ver.47【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1200464091/
C/C++の宿題を片付けます 103代目
pc11.2ch.net/test/read.cgi/tech/1200318925/

【書き込む前に】
・まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
・質問する前には最低限検索を。
・エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

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

【このスレのログ】
前スレ:pc11.2ch.net/test/read.cgi/tech/1190261457/
他の過去ログ:nssearch.hp.infoseek.co.jp/clang/

【このスレ住人としての心得】
わざとスレ違いあるいはごく低レベルな質問を繰り返して
流れを妨害する荒らしがいます。適当に誘導して放置してください。

206 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 16:33:09 ]
>>204
配列じゃなくてstd::vectorに連続性要求があるんだけど

207 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 16:52:19 ]
まぁ「レガシーAPIにstd::vector渡せますか?」
というのはC++のFAQだよな

次の規格ではstd::stringもそうなるんだっけ

208 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 16:57:42 ]
std::string::c_str() があるのにそんな必要あるの?

209 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 17:07:54 ]
現在のc_strはコピーが発生する可能性があってパフォーマンスに響くかもしれない。

210 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 17:10:49 ]
どう考えても>193がおかしい
Cにはvectorが存在しないのだから互換性が問題になるはずがない

211 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 17:12:25 ]
Cで書かれたライブラリとのバイナリ互換性とか

212 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 17:50:29 ]
>>206
だから連続性要求の話なんて誰もやってないんだってば・・・。
境界チェックの話だ。

213 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 17:53:11 ]
そもそもだなぁ
なんで std::string::c_str() な話がこのスレで出てくる?


214 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 18:11:46 ]
もし境界チェックを行う必要が無いという仕様が
大昔はマシンパワーが弱かったからという問題で作られたのなら
C++ を作る時に std::vector で at でも operator[] でも境界チェックをすれば良かった。
でもそうしなかったということは、それだけの問題じゃないってことだろう。
という話。



215 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 18:16:35 ]
だからCもC++も基本的に効率側に仕様を倒すんだよ

安全性はライブラリで頑張る方針

216 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 18:22:08 ]
そういうこと。
昔マシンパワーが弱かったからじゃなくて、
マシンパワーに関わらず効率を取るってこった。

217 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 18:31:08 ]
マシンパワーが高くなっても 10 分かかっている処理は速い言語で 5 分にしたいよ。
アプリにもよるけど。


218 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 18:32:57 ]
>>215
> 効率側に仕様を倒す

ちゃう, 特に C に関しては高級言語だと思ってはいけない

freestanding な環境でも動作可能, つか, 標準ライブラリを使用せず
(libgcc とかは微妙だけど)に動作可能なバイナリを吐き出せる事も
求められている.

実際 crt.o を自前で書けば, 標準ライブラリを使わずに実行イメージを
作ることが可能(しつこいけど libgcc とかは微妙)

境界チェックに関しては微妙だけど...


219 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 18:34:22 ]
>>212
だから境界チェックしてない理由(の1つ)に連続性要求と同じ理由は考えられないのかと
言ってるだけなんだが。
std::vectorがCにないから互換性の問題がないなら
operator[]で境界チェックをやることだって互換性の問題を起こさない

220 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 18:39:34 ]
>>219
連続性要求は C++98 ではなく C++03 で導入された。

221 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 19:19:52 ]
>>203
世の中Cで書いたプログラムのターゲットは3GHzクラスばかりじゃないんだよ。

222 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 19:37:35 ]
>193は自分のレスをもう一回冷静に読み直せ
>191はvectorの境界チェックのみの話しかしていない
だからそもそも互換性や連続性の話は関係ない
お前が勝手にoperator[]全般の話を持ち出したから話がかみ合ってないだけだ

223 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 19:43:16 ]
これは俺のカンだけど
>>193はoperator[]はあらゆるオブジェクトで同じもんだと思ってるね
でなきゃ互換性なんてセリフ出るはずがない

224 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 19:48:39 ]
>>219
vectorの連続性要求の理由はそのほうが直感的かつ便利だからであってCとの互換性からではない。
なぜならvectorはCに存在しないから。C++にしか存在しないものがCとC++の間での互換性で問題になる は ず が な い 。



225 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 19:50:43 ]
>>224 だったらスレタイ読んで出直してこい


226 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 19:53:11 ]
>>225
お前はレスの流れを読むべきだな

227 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 21:48:21 ]
>>221
で、それがどうかしたのか?

非常にタイトな部分には、チェックをはずせるようにしとけばいいだけだろ。

しょぼい環境の奴は、頭もしょぼいのか? (w

228 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 21:52:24 ]
仕様と処理系の区別もつかないくらい耄碌してるのか。

229 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 23:26:28 ]
「ディフォルトは検査するが、指定した部分の検査をしなくてもいいように指示できる」

と言う言語仕様にすればいいだけ。

どこに処理系の話が出てくるんだ?

# 耄碌爺って他人を耄碌してると思いたがるよな。(w

230 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 23:33:09 ]
C言語の仕様は
「チェックなんて効率の悪い事はデフォルトではしない。検査は各々自己責任でやれ」
というスタンスなんだよ

231 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 00:14:36 ]
耄碌してんじゃなくて若くて無知なだけだったか。

232 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 00:21:52 ]
>>230-231
はぁ? いまごろ何言ってんの?

そんなこと >>192 に書いてある。

耄碌爺はちょっと前のレスすら覚えてないらしいな。

病院に行った方がいいぞ。

233 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 01:14:18 ]
話の整理

197 「Cぐらい男らしい言語じゃないとOSなんて組めないよねー」
  ↑ 偏見というほどでもないがたぶん誇張
203 「そんなことはない、今のマシンのスペックなら(他の言語でも)十分いけるよ」
  ↑ 正しいとは言い切れないが間違いではない
221 「そんな高スペックの環境ばかりじゃないんだよ」
  ↑ ここがずれてる 203はそんな環境でCでない(チェックの厳しい)言語を使えとは言ってない
227 「低スペックな環境なら(その言語の機能で)チェック外すようにできればいいだろ」
  ↑ まあ正論
230 「Cはそういう言語じゃないんだよ」
  ↑ Cでない言語の話をCの話と勘違いしている

というわけで話の理は203にある
だが煽るのはやめろ

234 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 02:40:18 ]
自演乙、と言えばいいのか?



235 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 05:16:42 ]
すっかり違う言語にかわっちゃうような機能を、オプションでつけはずし?
配列とポインタが交換可能なのはC言語の特徴ですよ。
ポインタが配列を指してるかどうかのチェックからするんですか?


236 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 05:47:52 ]
ああ、そうか、>>203は最初からC言語の話なんかしてないのか。
>>233 解説ありがとう。

ということで、スレ違いだな。

237 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 12:44:06 ]
C言語は最適化のヒントを与える機能を追加すれば後は拡張しなくていいよ。
C言語の役割はある程度ポータビリティーがあって可能な限り性能を出すこと。
どんなに CPU の性能が上がってもこの需要はなくならない。


238 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 15:40:22 ]
できることが増えるスピードよりやりたいことが増えるほうが速いからな

239 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 22:33:30 ]
>>235
相変わらず、頭固いネェ。

> 配列とポインタが交換可能なのはC言語の特徴ですよ。

未だに配列アクセスよりポインタアクセスの方が常に速いとか
思ってるんだろうな...。

240 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 06:08:38 ]
頭の固い人間 VS 論点がズレている人間
の対決はいつ見ても不毛

241 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 10:01:59 ]
>>239
君の脳内言語の話はスレ違いだ。


242 名前:デフォルトの名無しさん [2008/05/20(火) 22:05:48 ]
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?

243 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 22:23:18 ]
>>242
それなんてコピペ?

こんな感じでよろしいか?

244 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 22:27:14 ]
おk



245 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 00:41:16 ]
>>241
反論できなくなったら、脳内言語ときたか。

だったら、>>221 あたりでそう書きゃいいと思うが、
しょせん耄碌爺には無理か。(w

246 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 01:18:38 ]
煽るな

247 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 01:38:16 ]
>>245
>>233 >>236

248 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 10:51:11 ]
>>245
つまりこういう事だな。
「脳内言語だって気が付くのが遅せーんだyp」

249 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 23:45:16 ]
昔の知識で煽ったら、反撃くらって撃沈しただけだろ。

250 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 01:22:46 ]
俺言語の話なんかする奴が悪いな

251 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 04:36:43 ]
俺言語君の知識は、最近のCPUは速いって事だけだったからな。
反論する余地は無いな、たしかに。

252 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 07:42:58 ]
お前らも煽るな

253 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 10:44:54 ]
大勢のフリした一人だろ。煽っているのは。

254 名前:デフォルトの名無しさん [2008/05/22(木) 11:51:11 ]
おやそくの一言が出ました。



255 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 11:55:57 ]
お夜食?

256 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 12:18:30 ]
↓ タイプミスをプギャーして勝ち誇るAAをどーぞ

257 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 12:19:49 ]
m9(^д^)

258 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 17:41:00 ]
ぐぐってもプギャーの意味分からなかった。

259 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 22:44:05 ]
> 俺言語君の知識は、最近のCPUは速いって事だけだったからな。
> 反論する余地は無いな、たしかに。

にもかかわらず反論してた爺は哀れだな。(w

260 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 05:38:05 ]
いつまでも爺爺言ってる奴が根に持ちすぎてて怖い
将来犯罪起こしそうだな

261 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 07:38:27 ]
脳内言語だと解ってからは、だれも反論なんかしちゃいないのにな。

262 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 23:57:40 ]
>>261
> 脳内言語だと解ってからは、だれも反論なんかしちゃいないのにな。

>> 反論してた

爺は日本語も不自由らしい。(w

263 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 01:01:27 ]
俺言語の話してるのに、C言語の話だと思って反論してやんのプギャー
こうですね、よくわかります。



264 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 01:50:10 ]
ひっかかった、くやしいムキー。
こうですね、よくわかります。



265 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 02:09:10 ]
いつまでやってんの!

266 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 02:26:07 ]
ケンカはやめて(><)

267 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 11:46:20 ]
爺で検索すればいいからわかりやすいな

268 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 17:49:54 ]
C89 との違いのみを完全に全て列挙したような資料ってありますか?

269 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 17:51:43 ]
C89 と C99 との違い・・・です。

270 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 18:03:32 ]
完全かどうかは知らないけど
seclan.dll.jp/c99d/
とか

271 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 17:40:59 ]
!0の値は1ですか?不定ですか?

272 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 17:42:57 ]
1です

273 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 17:49:09 ]
ありがとう

274 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 19:06:31 ]
>>270
結構詳しいですが、完全なんですかね・・・。
何か漏れがあるとかいう話はないんでしょうか。



275 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 22:52:00 ]
究極的にはC99の規格票買ってきて突き合わせるしかないだろ

276 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 12:22:33 ]
意味情報を利用しても、C (C89) の文法はLALR(2)ではないかという
疑問がありますので質問です。

構文規則はK&Rのものしか参照できないので、もしかしたら仕様書の
ものと違うかもしれないのですが、

compound-statement:
 { declaration-list_opt statement-list_opt }

という構文規則で、

int foo;

typedef int foo; /* 型名とグローバル変数の名前空間は独立 */

void bar(void)
{
 foo ?? /* ?? を読むまで、fooは宣言の一部であるとしてシフトするか、
     文の一部であるとして、宣言を空にリダイレクションするか、決められない */

と思うのですが、間違いがどこかにありますでしょうか?

277 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 12:30:47 ]
>型名とグローバル変数の名前空間は独立
この仮定が間違ってる。

278 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 12:57:24 ]
型名も変数名も全て「一般の識別子」だよ
違うのは構造体タグだろ

279 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 15:10:44 ]
識別子と言うことと、名前空間の管理は全然別の話だよ。

280 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 16:14:06 ]
Cの名前空間は4種類。
・ラベル
・タグ
・メンバ
・その他すべて(typedefした型名や一般の変数の名前を含む)
つまり二つのfooは同じ名前空間を持つ。
これを同じスコープ(この場合ファイルスコープ)で使ったら当然衝突する。
スコープが異なるなら識別子の優先順位と隠蔽によってまったく問題なく処理できる。

281 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 17:07:45 ]
C言語 名前空間 でググルとほとんどどんぴしゃの内容が...

uyota.asablo.jp/blog/2006/08/24/497407

282 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 17:11:45 ]
>>281
まちがってるなぁ
そこでa a;が許されるのはスコープが違うからであって名前空間が違うからじゃない

283 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 20:47:48 ]
グローバルな型名はローカル変数名でシャドウされる?

284 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 21:40:28 ]
されるよ。



285 名前:284 mailto:sage [2008/06/01(日) 21:43:56 ]
たとえば、

typedef int a;
a main(){
a a;
a b; // error
return 0;
}

286 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 05:48:23 ]
型を宣言するとき
defineではなくtypedefを使わないといけない明確な理由って
なんですか?

今まで普通に使ってきたけど、新人にどう説明すればいいか
悩んでいます。

287 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 06:04:08 ]
>>286
typedef char * pchar;
pchar a, b;
sizeof(b)=?

#define pchar char *
pchar a, b;
sizeof(b)=?

288 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 06:38:47 ]
>>286
あと、たとえば型size_tを要求する関数があったとして、
#define size_t int
とかやると、size_tの変数を渡してもintで宣言した変数渡しても、コンパイラには区別がつかない。


289 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 07:12:47 ]
>>286
typedef char *pchar;
const pchar a;   → a が const

#define pchar char *
const pchar a;   → *a が const

主にポインタ関連で困ったことになる。

290 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:46:28 ]
>>288
もともとCのtypedefは弱いtypedefだから区別ないけどね

291 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:48:33 ]
>>286
関数ポインタ形とか配列型だと、構文の都合上で#defineではできないってのもあるね。

292 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 21:08:43 ]
defineじゃデバッグ時にこまるじゃん

293 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 23:22:48 ]
typedefにはスコープがある。
defineには無い。

294 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:24:03 ]
typedefにはスープがある。
defineには無い。



295 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 01:19:44 ]
define には名前空間がない。

296 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 07:28:02 ]
typedefにも名前空間はない

297 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 07:44:55 ]
我輩には名前がない。


298 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 10:16:06 ]
うちの女房にゃひげがある

299 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 17:02:02 ]
さぁみんな、微妙に勘違いする仕事に戻るんだ!

300 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 21:50:30 ]
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?

こうですね、わかります

301 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 21:54:55 ]
全てのビットが0のポインタを得るにはどうすればいいでしょうか。
次のようなのを考えましたがなんかイマイチ。

void *p;
p = (void*)(1-1);
p = (void*)!1;
p = (char*)1-1;
memset(&p, 0, sizeof p);

302 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:00:00 ]
この中では memset(&p, 0, sizeof p); が最も確実。
上の2つはもしかしたら上手くいかないかもしれない。
3つ目は明らかに間違い。

303 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:21:41 ]
いや、3つ目もいいんじゃないか?

304 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:27:52 ]
一番下以外は未定義動作



305 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:23:38 ]
こういうのは?
p = (void*)(int)0;

306 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:27:42 ]
整数をポインタにキャストした場合の動作は定義されない。

307 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:58:57 ]
>>306 んなこたーない。

308 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 00:40:19 ]
ポインタ型は、(何らかの)整数型と情報を失わずに相互変換できる。

309 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 00:41:02 ]
別に0というリテラルがヌルポインタとして使えると定義されてるわけじゃないぞ。
コンパイル時に0になると決定できる定数式は全部ヌルポインタとして使える。
だから
p = (void*)(1-1);
p = (void*)!1;
はヌルポインタ。

310 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 11:28:03 ]
>>309
だから、NULLポインタは全ビット0とは限らない、って話だろうが

311 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 11:38:15 ]
だから上二つは上手くいく保証がないってことだろ

312 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 20:05:28 ]
上3つでねーの

313 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 22:02:13 ]
memset() の第2引数が定数の0だと本当にビットパターンが0になるの?
bzero() がもともとそういう仕様だから確実じゃない?

314 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 22:09:41 ]
>>313
もちろん。関数の引数は常に値渡しだ。
ということは memset() が受け取った値0は必ず変数に代入されて処理される。
変数0がヌルポインタに変換されることは絶対にない。



315 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 22:25:46 ]
> void *memset(void *s, int c, size_t n);
> memset() は s で示されるメモリ領域の先頭から n バイトを c で埋める。

man にはこれくらいしか書いていないけど、c が int だと意味が分かりにくい。
一旦 c が char に変換されてから n バイト書き込むということか?

316 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 22:42:53 ]
1の補数表現を許しているから
"0"が"+0"や"-0"という場合があって
それで(charにして)埋めた場合にどうか、という話だろうな。

俺は知らん。

317 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 23:38:36 ]
>>316
考えにくいけど、もし通常の定数0が-0だったとしても、
ヌル文字が全ビットゼロであることが保証されているから、
少なくとも文字定数\0は全ビット0のはずだね
というわけでmemsetでゼロクリアするときは\0を使おう


318 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 23:43:20 ]
なんでわざわざ難しく考えるんだ?
実際、仕事でプログラムを作るときは仕様などを考えることに
時間を割くのに、お前達はコーディングに時間を割きそうだな。

319 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 23:48:20 ]
プログラム板で仕様を語ってどうするよ
ここはガチ規格スレだぜ

320 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 00:54:09 ]
糞仕様書のせいでコーディングに時間を割かなければいけないことならよくあります。

321 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:04:29 ]
>>311
違う。
上手くいかない保証があるってことだ。

322 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:06:28 ]
>>317
通常の整数定数0の全ビットが0であることも保証されていると記憶しているが。

323 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:11:35 ]
定数の全ビットが0でもメモリに記憶されたときもそうなるの?

324 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 14:10:15 ]
>>321
上手くいかない保証って...、なんだそりゃ。



325 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 17:28:14 ]
>>323
ならなかったらビット演算で死ねるだろ

326 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 18:22:05 ]
メモリ上でどうなっていても演算の結果が正しければいいんだよ。

327 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 21:29:54 ]
C で言う所のメモリ上のビット配列ってのは
整数型の変数でビット演算によって参照できる値だっしょ。

328 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:47:38 ]
C89で、名前は同じで引数の有無や個数が異なるマクロを複数定義することって認められてたっけ?

つまり、
#define A 0
#define A(x) x

329 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:52:31 ]
前スレで話が出て、できるってことだったような

330 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:12:28 ]
gcc でエラーになるけど。

331 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:14:47 ]
>>329
情報d
前スレ見てきたところ、同じ名前のマクロを同時に複数定義することはできないと書いてあったわ。

332 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:53:16 ]
>>331
ごめん完璧まちがって記憶してたわ

333 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 16:17:14 ]
ここにいる人って、アプリ屋?それともファーム屋?
なんか、話だけを見ると、アプリ屋のほうが多いような気が・・・

334 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 16:20:07 ]
>>333 その区別に何の意味がある?区別のしかたもよくわからんしな。



335 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 17:53:26 ]
まるでファーム屋が多くて然るべきだと言いたげに読めるのは、俺の日本語力が弱いせいですか?

336 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 18:12:04 ]
スレ違いだと思う

337 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:18:53 ]
ファーム屋(笑)

338 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:21:21 ]
マ板でやれ

339 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:42:49 ]
俺はいわゆるファーム屋だが、
アプリ屋>>>>>ファーム屋
という印象がある。
はっきりいって、組込みソフト開発者はC言語と少しのハードウェア知識があれば、
あとは、仕様理解で仕事ができる。

様々な新しい技術を吸収し、開発しているアプリ屋のほうが技術は高い。

340 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:34:39 ]
組み込み系のスレあたりを見てる印象だと、
組み込み屋には実装至上主義で、仕様ナニソレ、という雰囲気がある。

このスレにいるのは、なんちゃってであっても自分で処理系を書いたり
したことがあるような、アプリよりはシステム寄りの人が多いんでは?

341 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:19:06 ]
そりゃ偏見だ。
アプリ屋だろうがファーム屋だろうが底辺を見ればやっぱり底辺。
上をみればちゃんとしたひとも居る。

ただ、ちゃんとしたアプリ屋がシステム方面に行ってしまうのと同様に
ちゃんとしたファーム屋はハードに行っちゃう事が多い。

342 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:33:49 ]
最近組み込みは年々ハードが高性能化、開発サイクルの短期化で、
少人数の職人的な開発者での開発は限界に来てますよ

これからはアプリに近い開発方法論でやっていこうという欧米の流れ

343 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:49:36 ]
>>339
> 様々な新しい技術を吸収し、開発しているアプリ屋のほうが技術は高い。

新しい技術って Ajax とか Web 2.0 とかのこと?

まあ、そう言う新しい言葉を理解するのも技術力のひとつではあるが。

344 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:12:15 ]
…(^^;;



345 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:54:00 ]
>様々な新しい技術を吸収し、
訳:新しくリリースされたアプリの使い方を覚えて、


346 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:38:00 ]
アプリ屋の俺から言わせてもらえば、
 アプリ屋→頭ゆるゆるで使えない奴が多い
 ファーム屋→頭かたすぎて使えない奴が多い

347 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 22:09:04 ]
自称技術者の93.2%は使えないから、そんなもんhだろう。

348 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 14:15:43 ]
int a = 3; { int a = a; printf( "%d", a ); }

このとき表示される数字は 3 ですか?それとも不定ですか?
JIS X 3010-1993 を少し読んだんですが分かりませんでした。

349 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 14:22:43 ]
>>348
規格を見ずに gcc でテストしてみたところ
2147344384
と出力された

350 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 14:47:43 ]
>>349
規格的には不定だよ. {} の中では新たなスコープが有効になるので
{} 内の a が 宣言された瞬間に {} 外の a は shadow される
# 言い方が厳密じゃないんだけど、言いたいこと分かってね

Lisp 系言語の
(let ((a 3)) (let ((a a)) (???? a))) ==> (let ((a 3)) (lambda (a) (??? a)) a)
みたいな物を, 求めてはいけない


351 名前:349 (>>348 じゃないよ) mailto:sage [2008/08/06(水) 14:56:08 ]
>>350
こういうのはOKですか?
int a = 3; { int b = a; int a = b; printf( "a=%d b=%d", a, b ); }

352 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 15:01:52 ]
>>351 いや、だから…
言い方が悪かったのかorz
{} 外の名前が {} 内で宣言されたら shadow される

処理系によっては「{} 外の a」が意味をなす場合もあるかも知れないが
可搬なプログラムを書こうと思ったら、その事実に依存してはならない


353 名前:349 mailto:sage [2008/08/06(水) 15:07:08 ]
>>352
規格では変数の宣言順序に関係なく
同一スコープ内で同名の変数が現れた場合には
外側の変数は見えなくなる

だから >>351 は次のようにしないと動作の保証ができないということですね
int a = 3; { int b = a; { int a = b; printf( "a=%d b=%d", a, b ); } }

354 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 16:13:40 ]
JIS X 3010-1993 には以下のように書いてあるけどこれからは判断できなかった。

6.1.2.1 識別子の有効範囲
識別子は、有効範囲(scope)と呼ぶプログラムテキストの範囲にあるときだけ、可視(visible)
(すなわち、使用可能)とする。有効範囲は、関数、ファイル、ブロック、及び関数原型の4種類とする。

識別子を宣言する宣言子又は型指定子がブロック内又は関数定義の仮引数宣言子の並びに現れる場合、
その識別子はブロック有効範囲(block scope)をもち、その範囲は対応するブロックを閉じる}によって
終了する。

字句的に同一な識別子のより外側の宣言が同一の名前空間にある場合、外側の宣言は現在の
有効範囲が終了するまで不可視となり、その後再び可視となる。

二つの識別子は、有効範囲が同じ場所で終わる場合、そしてその場合に限り同じ有効範囲を持つ。




355 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 16:48:27 ]
そうか?
はっきり書いてあると思うんだが。

356 名前:349 mailto:sage [2008/08/06(水) 23:17:37 ]
>>354 を読んで解釈のひとつとして

int a, *p=&a; // これは OK
int *q=&b, b; // これは NG

ということは有効範囲とは変数の宣言順序によって変化するのではないか?
>>351 の int b=a; の時点ではブロック内で変数 a が未定義であるため
外側の a が可視だから動作が保障されるのでは?

357 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 23:58:57 ]
いや、shadowされているが未定義である状態。

358 名前:349 mailto:sage [2008/08/07(木) 00:23:41 ]
>>357
>>354 のこの部分
>識別子を宣言する宣言子又は型指定子がブロック内又は関数定義の仮引数宣言子の並びに現れる場合、
>その識別子はブロック有効範囲(block scope)をもち、その範囲は対応するブロックを閉じる}によって
>終了する。

これは有効範囲の終わりについてのみ言及しており、
変数自体は変数宣言以降から有効になるのではないの?

359 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 00:29:19 ]
だからそういっているんだが。

360 名前:349 mailto:sage [2008/08/07(木) 00:52:52 ]
shadow されるのは
1.同一変数名の定義されているブロックの開始部分からなのか
2.それとも同一変数名が宣言された後なのか

というところで 2 で解釈可能では?

ちなみに下記のコードで gcc および Borland C++ Compiler では、警告も無し

// 出力結果は a=2.000000 *p=3 が保障される?
#include<stdio.h>
int main(){
int a=3;

{
int *p=&a;
double a=2.0;
printf("a=%f *p=%d\n", a, *p);
}
return 0;
}

361 名前:349 mailto:sage [2008/08/07(木) 01:15:04 ]
>>360
int *p=&a;
の行が規格としては
1.エラーになるべきか
2.未定義(実装依存、鼻から悪魔)か
が知りたいのですが

>>357 さんは 2 ということでしょうか?

362 名前:349 mailto:sage [2008/08/07(木) 01:16:35 ]
>>361 に追記
3.定義済み (>>360 のコードは規格に沿っている)

363 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 01:17:28 ]
ISO の、ダウンロードできるドラフトでは >354 が引用した部分の直後にスコープの開始位置に
ついての説明があった。それによると、変数名のスコープが始まるのは変数宣言内の変数名の
直後。

ってことで >351 は OK 。

364 名前:349 mailto:sage [2008/08/07(木) 01:20:49 ]
>>363
ありがとうございます
スッキリしました
これでゆっくり眠れます








[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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