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

【ANSI-C】 C言語なら俺に聞け!  Part 129

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2006/08/27(日) 15:43:44
このスレは標準Cのみの限定スレです。
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

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

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
前スレ
【ANSI-C】 C言語なら俺に聞け!  Part 128
http://pc8.2ch.net/test/read.cgi/tech/1151282084/


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

【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145524/
C/C++の宿題を片付けます 73代目
http://pc8.2ch.net/test/read.cgi/tech/1155355501/
新・推薦図書/必読図書のためのスレッド 1
http://pc8.2ch.net/test/read.cgi/prog/1146889623/
0951デフォルトの名無しさん2006/09/30(土) 12:45:29
typedef A B;
0952デフォルトの名無しさん2006/09/30(土) 12:46:18
compatible typeじゃないからねぇ。。。
0953デフォルトの名無しさん2006/09/30(土) 12:48:31
test((A)test2);

動く保証は全くない。
0954デフォルトの名無しさん2006/09/30(土) 12:48:33
メンバを一つずつ代入すればいいだろ。
0955デフォルトの名無しさん2006/09/30(土) 12:49:28
というか>>953Cじゃ絶対無理だろ。組み込み型じゃないんだから。
0956デフォルトの名無しさん2006/09/30(土) 12:52:23
castはscalar typeじゃないと。
0957デフォルトの名無しさん2006/09/30(土) 12:58:24
おk
現状で最適なのは
・作り直す
・unionしちゃう
くらい
0958デフォルトの名無しさん2006/09/30(土) 13:00:28
それがいいんだよ。互換性が無い型同士でキャスト。
これほど刺激的な事もそうそうないだろ?
0959デフォルトの名無しさん2006/09/30(土) 13:05:08
何人張り付いてんだよw
0960デフォルトの名無しさん2006/09/30(土) 13:07:11
共用体にはしたくないので作り直すしかなさそうですね
ありがとうございました
0961デフォルトの名無しさん2006/09/30(土) 13:16:39
>>790
vbのspaceみたいなもんやろ?
0962デフォルトの名無しさん2006/09/30(土) 14:45:54
>>949
本当にメンバが完全に同一ならとりあえずはtest(*(A*)&test2);で行けると思う。
0963デフォルトの名無しさん2006/09/30(土) 15:07:31
>>962
なんでそんな面倒なキャストするの?
0964デフォルトの名無しさん2006/09/30(土) 15:23:44
>>962
親子関係のないクラスはこれぐらいしたらんと。
0965デフォルトの名無しさん2006/09/30(土) 15:36:51
>>964
スレ違い
0966デフォルトの名無しさん2006/09/30(土) 15:39:02
構造体のパディングの問題があるので、そんなキャストはしてはいけません。
0967デフォルトの名無しさん2006/09/30(土) 15:43:48
>966
>Aという型とBという型を作ったとします。メンバの数は同じで型もすべてintです

パディング?
0968デフォルトの名無しさん2006/09/30(土) 15:54:50
現実には問題が出にくそうだけど気持ち悪いな
0969デフォルトの名無しさん2006/09/30(土) 16:06:42
>>967
少なくともメンバの型の並びが同じなら、パディングもまた同じ場所。
0970デフォルトの名無しさん2006/09/30(土) 16:06:47
>>967
>Aという型とBという型を作ったとします。メンバの数は同じで型もすべてintです

よって、同じメモリの割り当てをされると結論づけられるとでも思ってるの?
そんなこと規格書のどこに書いてあるの?
0971デフォルトの名無しさん2006/09/30(土) 16:07:46
>>969
Cってメモリレイアウトまで規定してたっけ?
してなければそんなに強く言わないほうがいいよ
0972デフォルトの名無しさん2006/09/30(土) 16:09:03
配列は連続領域だ、とかそういうことじゃないか?
0973デフォルトの名無しさん2006/09/30(土) 16:13:00
Cの配列ですらメモリ上連続かどうか分からなかった希ガス…たしか、うん、たぶん?(ポインタ+nの位置を”指せば”いいだけだから連続じゃなくてもいいはず)
構造体の表記とメモリレイアウトが完全に一致するかどうかなんてコンパイラの気分次第かもしれないし

とりあえずトリッキーなことをするときは仕様書とにらめっこしてからじゃないと「こうだ」とは言えないから困る
0974デフォルトの名無しさん2006/09/30(土) 16:23:38
うざ
0975デフォルトの名無しさん2006/09/30(土) 16:30:04
MONSOONもウザいが、それ以外の奴の方がもっとウザいな
0976デフォルトの名無しさん2006/09/30(土) 16:39:20
>>975
あれ?コテ入れ忘れてるよ?
0977デフォルトの名無しさん2006/09/30(土) 16:52:30
>>970
今目の前にあるコンパイラがそうなら別に不満はないが。
0978デフォルトの名無しさん2006/09/30(土) 16:54:00
>よって、同じメモリの割り当てをされると結論づけられるとでも思ってるの?

じゃないと、

A a;
A b;

memcmp(&a,&b,sizeof(A));

とか出来なくなりますよね。
0979デフォルトの名無しさん2006/09/30(土) 16:57:16
>>978
それは駄目なんじゃね?とか言ってみる。
0980デフォルトの名無しさん2006/09/30(土) 17:04:10
>>979
そうなるとsizeof(A)の値が不定になっちゃいませんか?
09819792006/09/30(土) 17:04:29
嘘でした。
0982デフォルトの名無しさん2006/09/30(土) 17:32:32
取り敢えずうんこは苦い、まで読んだ。
0983デフォルトの名無しさん2006/09/30(土) 17:43:27
bcパッドでコンパイルコマンドのgccをしたいんですけど、どうやったらいいでしょうか?
0984デフォルトの名無しさん2006/09/30(土) 17:54:44
そんなことオレが知るかよ。
質問するスレを間違えてんじゃねえのか。
0985デフォルトの名無しさん2006/09/30(土) 18:07:11
>>978
いやmemcmpとかANSIで規定されてる関数だけど、そもそもCさんとは無関係でしょ?
(Cの思想が「必要なものは全てライブラリに」だから)
で、表記とそれのメモリレイアウトの関係を決めるのはCのコンパイラさんだけど、その決め方の規約みたいなのをちゃんと読んだ上での話なんだよね?
0986デフォルトの名無しさん2006/09/30(土) 18:27:10
コンパイラ屋さん以外は、Cの規約とかあんまり読まないんじゃない?
0987デフォルトの名無しさん2006/09/30(土) 18:46:51
そうでもないよ。
移植あるし。
0988デフォルトの名無しさん2006/09/30(土) 19:25:48
とりあえず978は平気なはず。
JIS X 3010:2003 6.2.6の註(42)に構造体の代入にmemcpyを使っても良いと書いてある。

C++だが、JIS X 3014:2003 9.2 14〜17節にて、
非静的データメンバが同一なC互換構造体・共用体 (POD)同士は配置適合であり、
962のようなことをしても平気というようなことが書かれてある。
たぶんCにも同じような規定があると思うんだけどな。
0989デフォルトの名無しさん2006/09/30(土) 19:58:09
次スレ
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/
0990デフォルトの名無しさん2006/09/30(土) 20:03:50
よし、ものども移住だ!
0991デフォルトの名無しさん2006/09/30(土) 21:02:14
cpyはいいけどcmpはだめだろ
0992デフォルトの名無しさん2006/09/30(土) 21:44:14
何で盛り上がってるかと思えば・・・
0993デフォルトの名無しさん2006/10/01(日) 02:20:50
>>991
その理由は?

memcpyでコピーできるならメモリイメージは同じはずです。
0994デフォルトの名無しさん2006/10/01(日) 02:32:04
パディングのせいで途中に初期化されていない領域が
あるかもってことでしょう。きっと。
0995デフォルトの名無しさん2006/10/01(日) 02:44:15
>>994 yes

というわけで、個人個人のバカが見えてくるスレになってきました
0996デフォルトの名無しさん2006/10/01(日) 07:45:12
ん?構造体が宣言時に初期化されてる訳じゃないからmemsetでの0うめは当たり前でしょう。
0997デフォルトの名無しさん2006/10/01(日) 08:24:08
なにその後づけ設定。
つか、
struct tag
{
int a, b;
} A =
{
0
};

とかでもbん中は初期化されますぜ。
0998デフォルトの名無しさん2006/10/01(日) 08:32:01
>>996
それが義務付けられているわけではないのだから、当てにするのは間違い。
ましてそういう習慣のままC++に移行してどつぼにはまる原因になりかねない。
0999デフォルトの名無しさん 2006/10/01(日) 10:40:12
ぬるぽ
1000デフォルトの名無しさん2006/10/01(日) 10:42:23
はい次

【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/l50
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。