>>950 そんな処理系もプロセッサも知らないんで、挙げられないよ。
でもそれは言語での保証が無いこととはまったく関係ないよ。
あんたが言語としての保証を必要としないのはわかった。
でもそれは言語での保証が無いこととは関係ないよ。
(あんたがC/C++標準委員会のコアメンバーでもなければね。)
>>952は保証を軸にしてて、漏れは実質的標準を軸にして話してた訳か。
ちょっと不毛だった。
ただな、言語での保証が無いこととは関係ないが、実装には関係する。
浮動小数点に限らず、規定されていない範囲のことがな。
漏れはそういう視点から話してた訳。
ここはプログラミング言語C/C++のスレでございます
>>943 unionが何なのか知らんだろオマエ
>>951 このスレは機種依存OKだから、標準が外れていることを指摘しつつも
現実的な回答をするのが筋だろうな。つまり、数学者的な思考を提示
しつつも工学者的な選択枝を提供する、と。だから、
>>945と
>>947は
反発しあう必要もなく、両方の意見を聞いて、結局どうするべきかは
質問者が決めればいい。
>>954 はぁ…?
知ってるからこそビット幅合わせないで
一体どんな目的に使うのか謎なんだけど
>>956 char と int を重ねるってだけでも十分意味を成す場面があるだろう。
自分の知っている特定用途以外想像できないのを偉そうに言うなよ。
>>958 大抵うまくいくだろうが、一応規格外だ。
こういうのも見るけど、規格外なんだよな。
union {
struct { float v[3]; } vec;
struct { float x, y, z; } elem;
};
>>959 何が言いたいのかわからんな。
&vec.v[1] == &elem.y が保証されてないって話か?
char と int を重ねたいだけの話には関係ないんじゃない?
961 :
デフォルトの名無しさん:2005/06/26(日) 17:10:29
呼び出された関数内では、呼び出し元のローカル変数を参照することってできないんですか?
もちろん引数は使わないで。
下記のようなことがしたいのですが……
void sub_func()
{
int x=x_main;
}
void main_func()
{
int x_main=255;
sub_func();
}
>>960 >959は、きっと自分だけしか知らないノウハウを基準に>958を解釈しているんだよ。
>>961 それができるのならローカル変数の意味がなくなってしまう。
どうしても引き数で渡すのがいやなら外部で定義するかC++ならクラスを利用しろ。
>>961 無理
グローバル変数を経由するとかすればできるけど
つうかそんな事できたらグローバル変数とかわらんだろ
そういう変態機能がEmacs Lispにあったような・・・
なんじゃこりゃーって感じだった
関数内でスタックをごにょごにょすればできるやもしれん
環境依存だけど
そこでファイルスコープですよ。
いやC/C++では出来ませんでいいだろ。
そこでlongjmp
>959
union 使って↓な使い方することがあるんだよ。
つまり、union 内の型の間で変換はせず、サイズ節約のために使う。
そして >958 を読んでその意味を噛み締めてくれ。
typedef strcut {
enum { CHAR, INT, FLOAT, STRING } tag;
union {
char c;
int n;
float f;
char *str;
} data;
} VARIANT;
void func(VARIANT v)
{
switch(v.tag) {
case CHAR:
printf("%c", v.c);
break;
case INT:
printf("%d", v.n);
break;
}
}
971 :
970:2005/06/26(日) 18:03:03
えらそうなこと書いておきながら凡ミス。
v.c じゃなくて v.data.c、v.n じゃなくて v.data.n だな。
自分でやるときには無名共用体を使うから間違えた。
5桁のフィールドに対応した値 unsigned x = 15 があって、
std::vector<char> v に対して '0' '0' '0' '1' '5' の順で push_back() したいとき
(またはそれと等価な結果を得たいとき)
エレガントな方法は?
>>973 size_t const end = v.size();
v.resize(end + 5 + 1);
sprintf(&v[end], "%05u", x);
v.resize(end + 5);
>>970 で?それと、char c[sizeof(int)]となんの関係があると?
976 :
959:2005/06/26(日) 21:06:38
>>970 いや、別に、ごく一般的なunionの用法なんですが・・・。
975と被るが、それとchar c[sizeof(int)]と何の関係があるの?
てっきりintをバイト単位でアクセスできることかと思ってたんだが。
それとも3バイト埋めることが合理的という事?
多分970と959は畑が違うから相容れ無いはず。
970はLPARAM WPARAMなどを扱うWin系
959はWin以外の何かの畑の人とみた
興味で訊くんですが、unionの他の使い方ってどんなのがあるんでしょう?
>>943の例はただのキャストで置き換え可能なケースが多い気も
ワード境界に整列するようにアロケートしたいときとかに使うぐらいかな
malloc()の実装とかだと、さらにdoubleとかもメンバに入れるよな
>>970の例が、一番典型的なunionの使い方だと思う
型フィールド付+メモリ節約
まあ、C++なら邪悪とされるスタイルだが
970マダー?
981 :
975:2005/06/26(日) 21:28:28
>>977 俺ぁ激しくWinだが、char c[sizeof(int)]なんてやんない
まぁWinsockにも使われている手法だから環境を限定させれば悪くは無い。
> C++なら邪悪とされる
のはなんで?
>>983 型フィールドみたいなものを使うぐらいなら継承を使え
というのがBjarne Stroustrup様の有難い教えです
コンストラクタとかデストラクタとか
素直にクラス+多態しろって事じゃないの
>>983 オブジェクトにして渡した方がいいって話とかじゃないかな、switchいらんし。
先の例ではメンバが増えると、caseも増える。
>>983 型で決められたメソッドを敢えて場合分けの嵐にする設計が美しくない。
というかC++の設計思想に反する。
そうか、トンくす
次スレ立てられなかった。
関数のポインタの有効な使用方法ってどんなのがありますか?
入門書にのっている例文で有効そうなのは見つかりませんでした
そこからは見えない関数を渡してあげる以外に有効な方法ありますでしょうか?
qsort
ありとあらゆる種類のコールバック
ファンクションテーブルによるイベントディスパッチ
要するにテンプレートメソッドパターン
997 :
992:2005/06/26(日) 22:37:38
勉強になります。ありがとうございました
次スレマダー?チンチン
#include <iostream>
int main()
{
std::cerr << "1000" << std::endl;
return 0;
}
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。