【初心者歓迎】C/C++室 vol.18

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2005/06/26(日) 13:43:20
>>950
そんな処理系もプロセッサも知らないんで、挙げられないよ。
でもそれは言語での保証が無いこととはまったく関係ないよ。

あんたが言語としての保証を必要としないのはわかった。
でもそれは言語での保証が無いこととは関係ないよ。
(あんたがC/C++標準委員会のコアメンバーでもなければね。)
953デフォルトの名無しさん:2005/06/26(日) 14:01:16
>>952は保証を軸にしてて、漏れは実質的標準を軸にして話してた訳か。
ちょっと不毛だった。

ただな、言語での保証が無いこととは関係ないが、実装には関係する。
浮動小数点に限らず、規定されていない範囲のことがな。
漏れはそういう視点から話してた訳。
954デフォルトの名無しさん:2005/06/26(日) 14:22:36
ここはプログラミング言語C/C++のスレでございます

>>943
unionが何なのか知らんだろオマエ
955デフォルトの名無しさん:2005/06/26(日) 14:39:15
>>951
このスレは機種依存OKだから、標準が外れていることを指摘しつつも
現実的な回答をするのが筋だろうな。つまり、数学者的な思考を提示
しつつも工学者的な選択枝を提供する、と。だから、>>945>>947
反発しあう必要もなく、両方の意見を聞いて、結局どうするべきかは
質問者が決めればいい。
956デフォルトの名無しさん:2005/06/26(日) 16:17:51
>>954
はぁ…?
知ってるからこそビット幅合わせないで
一体どんな目的に使うのか謎なんだけど
957デフォルトの名無しさん:2005/06/26(日) 16:27:55
>>956
unionの存在意義がわかってないな
958デフォルトの名無しさん:2005/06/26(日) 16:30:39
>>956
char と int を重ねるってだけでも十分意味を成す場面があるだろう。
自分の知っている特定用途以外想像できないのを偉そうに言うなよ。
959デフォルトの名無しさん:2005/06/26(日) 16:54:07
>>958
大抵うまくいくだろうが、一応規格外だ。

こういうのも見るけど、規格外なんだよな。
union {
struct { float v[3]; } vec;
struct { float x, y, z; } elem;
};
960デフォルトの名無しさん:2005/06/26(日) 17:03:25
>>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();
}
962デフォルトの名無しさん:2005/06/26(日) 17:11:29
>>960
>959は、きっと自分だけしか知らないノウハウを基準に>958を解釈しているんだよ。
963デフォルトの名無しさん:2005/06/26(日) 17:12:46
>>961
それができるのならローカル変数の意味がなくなってしまう。
どうしても引き数で渡すのがいやなら外部で定義するかC++ならクラスを利用しろ。
964デフォルトの名無しさん:2005/06/26(日) 17:13:45
>>961
無理
グローバル変数を経由するとかすればできるけど

つうかそんな事できたらグローバル変数とかわらんだろ
965デフォルトの名無しさん:2005/06/26(日) 17:14:50
そういう変態機能がEmacs Lispにあったような・・・
なんじゃこりゃーって感じだった
966デフォルトの名無しさん:2005/06/26(日) 17:17:23
関数内でスタックをごにょごにょすればできるやもしれん
環境依存だけど
967デフォルトの名無しさん:2005/06/26(日) 17:41:32
そこでファイルスコープですよ。
968デフォルトの名無しさん:2005/06/26(日) 17:43:37
いやC/C++では出来ませんでいいだろ。
969デフォルトの名無しさん:2005/06/26(日) 17:51:04
そこでlongjmp
970デフォルトの名無しさん:2005/06/26(日) 17:59:09
>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;
 }
}
971970:2005/06/26(日) 18:03:03
えらそうなこと書いておきながら凡ミス。
v.c じゃなくて v.data.c、v.n じゃなくて v.data.n だな。
自分でやるときには無名共用体を使うから間違えた。
972デフォルトの名無しさん:2005/06/26(日) 18:23:16
ダイナミックスコープ自体はサポートしてる言語あるじゃん。
Emacs Lisp とか Perl とか。
ttp://ja.wikipedia.org/wiki/動的スコープ
なのでやっぱり >968 なんじゃね?
973デフォルトの名無しさん:2005/06/26(日) 20:02:34
5桁のフィールドに対応した値 unsigned x = 15 があって、
std::vector<char> v に対して '0' '0' '0' '1' '5' の順で push_back() したいとき
(またはそれと等価な結果を得たいとき)
エレガントな方法は?

974デフォルトの名無しさん:2005/06/26(日) 20:08:03
>>973
size_t const end = v.size();
v.resize(end + 5 + 1);
sprintf(&v[end], "%05u", x);
v.resize(end + 5);
975デフォルトの名無しさん:2005/06/26(日) 20:26:43
>>970
で?それと、char c[sizeof(int)]となんの関係があると?
976959:2005/06/26(日) 21:06:38
>>970
いや、別に、ごく一般的なunionの用法なんですが・・・。
975と被るが、それとchar c[sizeof(int)]と何の関係があるの?
てっきりintをバイト単位でアクセスできることかと思ってたんだが。
それとも3バイト埋めることが合理的という事?
977デフォルトの名無しさん:2005/06/26(日) 21:14:55
多分970と959は畑が違うから相容れ無いはず。
970はLPARAM WPARAMなどを扱うWin系
959はWin以外の何かの畑の人とみた
978デフォルトの名無しさん:2005/06/26(日) 21:17:05
興味で訊くんですが、unionの他の使い方ってどんなのがあるんでしょう?
979デフォルトの名無しさん:2005/06/26(日) 21:18:04
>>943の例はただのキャストで置き換え可能なケースが多い気も
ワード境界に整列するようにアロケートしたいときとかに使うぐらいかな
malloc()の実装とかだと、さらにdoubleとかもメンバに入れるよな

>>970の例が、一番典型的なunionの使い方だと思う
型フィールド付+メモリ節約
まあ、C++なら邪悪とされるスタイルだが
980デフォルトの名無しさん:2005/06/26(日) 21:27:25
970マダー?
981975:2005/06/26(日) 21:28:28
>>977
俺ぁ激しくWinだが、char c[sizeof(int)]なんてやんない
982デフォルトの名無しさん:2005/06/26(日) 21:52:53
まぁWinsockにも使われている手法だから環境を限定させれば悪くは無い。
983デフォルトの名無しさん:2005/06/26(日) 21:55:12
> C++なら邪悪とされる
のはなんで?
984デフォルトの名無しさん:2005/06/26(日) 21:56:19
>>983
型フィールドみたいなものを使うぐらいなら継承を使え
というのがBjarne Stroustrup様の有難い教えです
985デフォルトの名無しさん:2005/06/26(日) 21:56:20
コンストラクタとかデストラクタとか
986デフォルトの名無しさん:2005/06/26(日) 21:56:24
素直にクラス+多態しろって事じゃないの
987デフォルトの名無しさん:2005/06/26(日) 21:59:04
>>983
オブジェクトにして渡した方がいいって話とかじゃないかな、switchいらんし。
先の例ではメンバが増えると、caseも増える。
988デフォルトの名無しさん:2005/06/26(日) 21:59:36
>>983
型で決められたメソッドを敢えて場合分けの嵐にする設計が美しくない。
というかC++の設計思想に反する。
989デフォルトの名無しさん:2005/06/26(日) 21:59:50
そうか、トンくす
990デフォルトの名無しさん:2005/06/26(日) 22:03:48
>>983大人気だな(w
991デフォルトの名無しさん:2005/06/26(日) 22:07:19
次スレ立てられなかった。
992デフォルトの名無しさん:2005/06/26(日) 22:20:53
関数のポインタの有効な使用方法ってどんなのがありますか?
入門書にのっている例文で有効そうなのは見つかりませんでした

そこからは見えない関数を渡してあげる以外に有効な方法ありますでしょうか?
993デフォルトの名無しさん:2005/06/26(日) 22:22:02
qsort
994デフォルトの名無しさん:2005/06/26(日) 22:22:27
ありとあらゆる種類のコールバック
995デフォルトの名無しさん:2005/06/26(日) 22:23:47
ファンクションテーブルによるイベントディスパッチ
996デフォルトの名無しさん:2005/06/26(日) 22:24:57
要するにテンプレートメソッドパターン
997992:2005/06/26(日) 22:37:38
勉強になります。ありがとうございました
998デフォルトの名無しさん:2005/06/26(日) 22:39:07
次スレマダー?チンチン
999デフォルトの名無しさん:2005/06/26(日) 22:45:43
【初心者歓迎】C/C++室 Ver.19【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1119793525/
1000デフォルトの名無しさん:2005/06/26(日) 22:46:22
#include <iostream>
int main()
{
  std::cerr << "1000" << std::endl;
  return 0;
}
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。