C++相談室 part9

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
現在最高のプログラム言語と言われるC++についてのご相談承ります。
(´∀`).。o(関連URLは>>2-5の辺り)
2デフォルトの名無しさん:02/07/22 23:27
(゚∀゚≡゚∀゚)
ISO/IEC 14882 International Standard
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
スレ建ておつかれー
( ゚ペ)ノ オナーニな1行目ですな
8デフォルトの名無しさん:02/07/22 23:35
■関連スレ■

VisualC++相談室 3
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=969458279
新C++Builder相談室(C++Builder相談室 Part2)
http://pc.2ch.net/test/read.cgi/tech/997074601/
C Builder相談室 Part3
http://pc3.2ch.net/test/read.cgi/tech/1016065855/
9モナ吉:02/07/22 23:37
( ・∀・)ノ擂れさん御着かれー
>>7
たまにはセンセーショナルな見出しをと思いました。
11デフォルトの名無しさん:02/07/23 00:22
C++は配列型の代入がないのが気持ち悪い
ぜんぜん最高じゃない
>>11 vector
>>11
配列のコピーって事?vectorを使えばいいじゃないか。
>>12,>>13
ケコーンしようよ(w
1511:02/07/23 00:30
ちがうちがう
typedef int inth[10][19] ;
inth a,b ;
とかやったら
a=bで要素の代入ができるべきだ!!
コピーできない組み込み型があるのは気持ち悪い
>>15
それはC++の配列型が自分自身の大きさに関する情報を持たないため。
C言語との互換性を重視した結果です。
何故出来ないのか?
その理由は
配列型同士のコピーをしたいなら、構造体の中に配列を宣言して、
それ同士をコピーすればよい。って、こんなトリッキーなテクニック
はCだけで実行すべき。C++はコンテナがあるんだからそれを
使え。
memcpy( a, b, sizeof(a));
みたいなことをしたらいいんでは?(C的発想)
ちょっと複雑なクラスになるとdieだけどなー
2011:02/07/23 00:39
>>18
そうそうそれが言いたいんだよ
構造体につつめば出来るというのに
そのままだと出来ないのはおかしい!

配列渡しが見た目には値渡しなのに
強制的にポインタ渡しになって気持ち悪すぎ
2111:02/07/23 00:42
やっぱりJavaが最高だね
C++キモイ
>>11 boost::array ...
やはりJava厨だったか..
手元の資料の到着予定時刻と違う。ややフライング気味。
Java厨は排他的だな(ワラ
2611:02/07/23 00:48
>>21
だれ?
わたしはすでにC++&STL&Boostにどっぷり漬かってるから
いまさらC++から抜け出せない

>>22
あれは面白いね。あの初期化リストがふるくさい構文だと気づくまで
ちょっととまどったけど
古くさい構文って?
2811:02/07/23 01:00
構造体要素の初期化のこと
コンストラクタ呼び出しの初期化しかしなくなって久しいものだから

boost::array<int,4> a = { { 1, 2, 3 } };
みたいな。(マニュアルより)
>>28
> コンストラクタ呼び出しの初期化しかしなくなって久しいものだから
「しか」って、・・・幸せな環境でやってんだな。
3011:02/07/23 01:07
職業プログラマじゃないから当然!!
3129:02/07/23 01:13
>>30
自分の基準で古臭いなんて言ってくれるなよ。
あの初期化が無かったら、すごく困る環境だってあるんだ。
3211:02/07/23 01:17
まあまあ落ちつけ
あの初期化はあるんだから
3329:02/07/23 01:28
貴様それでもあの初期化構文は古臭いと申すかっ?
トリアエズ、ゼンブアゲデカイテルオマエヨリハオチツイテイル
3411:02/07/23 01:36
互換性のためだけにあるとしか思えないなあ
(見やすい)プロパティの初期化自体は必要だから
C99の指定初期化子のようなものを導入してほしいなあ
でもコンストラクタも併用できたほうがいいから
c++builderの__propertyみたいのもほしいなあ
C++の気持ち悪いものの一つだなあ
3529:02/07/23 01:43
>>34
> 互換性のためだけにあるとしか思えないなあ
ROM環境ってやつでいまだに必要だ。
コンストラクタ通すとRAMに逝ってしまう。
>>34
propertyはtemplateで作れよ
3711:02/07/23 01:58
>>35
あ〜なるほど静的な初期化かあ
隙間なく初期化することしかできなくて
簡便なCの構造体初期化がむいてるわけかあ
しかしそういうところでC++を使うのかなあ

>>36
そういうことじゃなくてプロパティとして初期化を…
もしかしてできるのか?ちょっと調べてみる
propertyクラスを作って代用しろってことだよ
39デフォルトの名無しさん:02/07/23 02:10
>>37で思ったんですが、

C++コンパイラとCコンパイラ、両方使える環境なら、
Cを選ぶ理由って何かありますか?
チームのスキルとかは、たぶんそれが現実的だけど、とりあえず無視するとしたら?
4011:02/07/23 02:11
う〜やっぱりだめだった
当然だけどもpropertyクラスを作っても
プロパティとして振舞ってはくれない…
Bjarneなんとかしろ!!
>Cを選ぶ理由って何かありますか?
無いに一票。
転載。
たとえば、こんなの。
もう少し変更すれば、うまい具合に使える。

#include <stdio.h>

template<class T>
class property{
private:
void (*m_setter)(const T);
T (*m_getter)();
property(){;}

public:
property(void (*setter)(const T), T (*getter)() ){
m_setter = setter;
m_getter = getter;
}
~property(){;}

operator T(){
T dummy = (T)0;
if(m_getter)
dummy = m_getter();
return dummy;
}

T &operator=(T value){
if(m_setter)
m_setter(value);
return value;
}
T operator=( property<T> obj ){
*this = (T)obj;
return (T)*this;
}
};

int I;
void setI(const int i){
I = i;
}

int getI(){
return I*10;
}

void main(){
property<int> pi(setI, getI);
pi = 10;
pi = pi;
printf("%d", (int)pi );
}
>Cを選ぶ理由って何かありますか?

何も無い。
44nanashin:02/07/23 08:17


VC.netでDLL開発をしています。
DLLのプロジェクトとそれを実行するプロジェクトの二つのプロジェクトを平行して開発しており、
どちらのプロジェクトでもdllのヘッダmydll.hをincludeしているのですが、
小クラスが大クラスのメンバでありかつdllから大クラスへのポインタをインポートしている時に
大クラスから小クラスのオブジェクトは見えるのですが、そこから小クラスのメソッドにアクセスしようとすると
未解決の外部シンボルというエラーが出てしまいます。どなたかアドバイスを・・・
具体的には

---------------mydll.h----------------------
myClass{
vector<mySubClass *> subs;
}

mySubClass{
void submethod()
.........
}

------------myProg.cpp--------------------
#include "mydll.h"

MYDLL_API myClass * class; //MYDLL_APIはvoid _delspec(dllimport) と同じこと
class->subs.at(0)->submethod();//????
submethod

SubClass:submethod()が未解決の外部シンボル・・・
というエラーになってしまいます。

45nanashin:02/07/23 08:52
自己レスです
大クラス直接クラス内のメソッドを
class->メソッドとしても未解決のシンボルになってしまいますね。
でも良く考えたら関数の中身がどこにあるかわからないので
そういう風になる気がしてきました。

なのでclassか関数かをdllexportすれば良かろうと思ったので
MYDLL_API 小メソッド::submethod

MYDLL_API mySubclass{....}
みたいにやって見たのですが、どちらもdllexportが許可されませんでした・・・
46nanashin:02/07/23 09:02
さらに自己レスです。とかなんとかやってたら
class MYDLL_API myClass{ ...}
でいいのですねMYDLL_APIの位置を間違えておりマシたので解決ヽ(´ー`)ノ
>Cを選ぶ理由って何かありますか?

選ぶやつ(いるならば)に聞いてみてください
>>39
1 移植性を重視する場合。(C++ の処理系、まだ C と比べると処理系間の差が
 大きいから)
2 既存のコードが C で書かれている場合。C++ にしても、あまり嬉しくない。
3 OS の API など、多くの環境で使うことを前提とするバイナリインターフェースを
 提供する場合。(ただし Windows に限って言えば COM や .NET があるから、
 C++ の方が逆に楽)
4 バイナリの大きさや、メモリ使用量の制約が厳しい場合。組込用の C++ 使うと
 いう選択肢はアリ。

でも C++ 使わない理由は、年々減ってると思うよ。
49すみません:02/07/23 20:08
VC++でDLLを作りました。
ソースの拡張子は cpp で、 __stdcall でエクスポートしています。

VC++でコンソールアプリのプロジェクト(HelloWorldアプリケーション)
を作成して作ったDLLをコールするサンプルプログラムを作りました。
うまくリンク出来ました。

VC++でコンソールアプリのプロジェクト(空のプロジェクト)を
作成して、メインのソースは、拡張子 .c としました。
プロジェクトをビルドすると、リンク時にLINK2001というエラーが
出て、DLL内の関数が見つからないと言われてしまいます。

DLL側がC++でコンパイルされていて、呼び出すメイン側が
Cでコンパイルされている事が原因のような気がするのですが、
解決方法がわかりません。

どなたか判る方いらっしゃいませんか?
__declspec(dllexport)
51すみません:02/07/23 20:35
>>50
はい。
DLL側で自動作成されたヘッダファイルの中に、
#ifdef XXXXXX
__declspec(dllexport)
#else
__declspec(dllimport)
#endif
という感じのロジックが自動作成されています。

DLLを呼び出す側でもこのインクルードファイルを
インクルードしています。
但し、呼び出す側では、明示的に #define していないので、
__declspec(dllimport) が有効になっていると思います。

ここに何か追加しないといけないんでしょうか?
extern "C" {
};
で宣言を囲む
53nanashin:02/07/23 22:24
extern "C"{
};
は入門書にそうなってたのでやってはいるが
良く意味がわからない・・・
C++ではなくCにするという意味なんだろうけど・・・
>>53
C++では関数の多重定義などの機能を、リンカの重大な変更無しに実現する
ために、「名前マングリング」を行う。

これは、同一名の関数の名前に異なる名前を付加し、異なった関数として扱う
ための内部的テクニックであって、コンパイラによってその実現方法は異なる
ものの、リンカに変更を加えていない処理系では大同小異である。

どのように「名前マングリング」が行われるのか直に目で見たければ、ソース
のコンパイル結果をアセンブリ出力して、関数にどんなラベルがついているか
見ればよい。

extern "C" キーワードは、そのような「名前マングリング」を行わないことを
コンパイラに指示し、従来のCでコンパイルされたオブジェクトとのリンクを可能
にする。
>>54
extern "C" キーワードは、そのような「名前マングリング」を行わないことを
コンパイラに指示し、従来のCでコンパイルされたオブジェクトとのリンクを可能
にする。

どうあがいてもDLLのエクスポート関数には妙なpostfix付いたりするけどね。
>>55
それは呼び出し規約の整合を取るため、
MSのコンパイラが自分で規約を作っているだけ。
Borlandだとまた別だろ。

それから、DEFファイルで好みの名前でエキスポートできるよ
>>55
そうそう、それで、VC++とBC++間のリンクが、extern "C"付けてもうまく
いかないことがあるみたい。
58デフォルトの名無しさん:02/07/23 23:17
>>57
そんなことはない。
VC++とBC++の間のリンクで問題があるのは、long doubleを使った場合や、他方の
ランタイムライブラリに依存した処理がある場合だけだと思うけど。
>>57-58
どっちが正しいの?
>>58
そうか・・・・実は他スレ
http://pc3.2ch.net/test/read.cgi/tech/1002377328/
で悩んでた奴がいるんだが、答えてやれなかった。
57が正しい。
VCはstdcall規約だと名前の後ろに@xって付くけど、
borlandだと付かない
58が正しい。
DEFファイルを使えば任意の名前でexportできる。
>>62
非常に原始的だがね。
C++をあそこまで拡張したあげくにこのていたらく。
>>62
extern "C"だけじゃうまくいかないって話じゃん。
DEFファイルを持ちだせば、__cdeclの関数もVBで使える名前に変えられちゃうし、
望むままにできちゃうじゃないか。
65デフォルトの名無しさん:02/07/24 01:01
ほ、ほ、保守!
66すみません:02/07/24 10:02
お礼が遅れてしまって申し訳ない。
昨日の夜、出来ました。
具体的には(自動作成されたマクロは展開して書いておきます)、
VisualC++のDLLでexportする関数は、
extern "C" __declspec(dllexport) long __stdcall func(long n);
extern "C" __declspec(dllexport) long __stdcall func(long n)
{
return n;
}
としておいて、DLLを作成し、
これをコールするC側では、
__declspec(dllimport) long __stdcall func(long n);
int main(int argc, char *argv[])
{
func(10);
return 0;
}
とすれば、C++で作成したDLLをCから呼び出すことが出来ました。

皆の衆THX
67デフォルトの名無しさん:02/07/24 12:07
おめでとう。
68デフォルトの名無しさん:02/07/24 13:12
質問があります。

struct Base {
 void func(void) {}
 Base(void) { func(); }
};

struct Derived : public Base {
 void func(int) {}
 Derived(void) { func(); } // Base::func()と書かないとダメ
};

上のように継承先でメンバ関数をオーバーライドした場合
"基底クラス::関数名"と書かないとコンパイルではじかれますが、
こうなる理由として積極的なものってあるんでしょうか?
というのは、引数から適切なメンバ関数を見つけるとすれば
上の場合はどこにも曖昧な点がない、つまりDerivedのコンストラクタで
指定したfunc()はBaseのfunc()だと一意に判ると思うのですが…。
6911:02/07/24 13:28
プログラマのミスで引数にあやまりがあるのかどうかチェックするために
同名の基底クラスのメンバは隠蔽される。
さまざまなチェック機構はC++の開発支援の目玉の一つ。
おかげで文法が気持ち悪い。
(純粋仮想の)=0だとか(メンバ関数の)constだとか
7068:02/07/24 14:15
>>69
ありがとうございます。納得しました。
71デフォルトの名無しさん:02/07/24 21:11
すみません、超初心者です。
Functionが3つ、まずはget_data functionでarrayに5つ整数をstoreして、
mainに戻り、mainでユーザーに任意の整数を入力してもらい、
その後、findnum functionでその整数がarrayの中にあるかどうか確かめる
というプログラムに四苦八苦してます。
findnumはpointerを使用しなければなりません。
  私が思うにfindnumでは、整数がarrayの中に見つかった場合、
arrayの何番目のデータがユーザーの入力した任意の整数と同じなのか
を返さなければならないので、pointerのaddress(&)を返さなきゃいけないと思うのですが、
どうもpointerの概念をちゃんと理解していないらしく、やり方がわかりません。

7271_main:02/07/24 21:14
#include <iostream.h>

void getdata(int []);
int findnum(int (*));

const int FAIL = 0;

void main(void)
{
int num[5];

cout << "Please input the five numbers\n ";
cout << "to store in the array.\n ";
cout << "After storing them in the array, \n";
cout << "this program will search the number.\n\n";

getdata(num);

int rc = findnum(num);

if(rc!=FAIL)
{
cout << "Found it\n\n";
} // End if
else
cout << "The program could not find the number.\n\n";

} //End of function main
73デフォルトの名無しさん:02/07/24 21:14
おいお前ら!ウインドウズプログラミングしてたら以下のようなエラーがでますた。
Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)
どうすればいいんですか?教えてください(゚Д゚)ゴルァ!!
>>73
-Wオプションをつけなかったから、WinMain()がメイン関数だと見なされて
ないだけだろう(゚Д゚)ゴルァ!!
75デフォルトの名無しさん:02/07/24 21:19
ちゃんとつけてるぞ(゚Д゚)ゴルァ!!
7671:02/07/24 21:19
71です。続きです。

void getdata(int *Number[])
{
for (int i=0; i<5; i++)
{
cout << "Please input # ";
cout << (i+1) << " number : ";

cin >> (*Number)[i];

} // End of for
} // End of function getdata

int findnum(int (*no))
{
int value = 0;

cout << "Enter the number you search for : ";
cin >> value;

for (int i=0; i<5; i++, no++)
{
if (value == *no)
{
return (i);

} // End of if

return FAIL;
} // End of for


} // End of function findnum

>>75
おかスィなあ。そのエラーは、いまだにC++コンパイラがmain()をメイン
関数だと思っちょるエラーだぞい。
7875:02/07/24 21:23
bcc32 -W test.cppじゃなくて
bcc32 test.cpp -Wというようにしてた。
オプションのつけ方間違えた…
鬱打詩嚢
mainを定義する
>>79
それやると、ウィンドゥズプログラムとして動かないものが出来上がって
しまう。mainとWinMain両方定義しておけばいいけど。
WinMain()なしでもWindowsプログラムを作る方法があるらしい。
main()中でGetModuleHandle(NULL)してインスタンスハンドルを得るらしい。
MozillaのwinEmbedで見た。
ttp://lxr.mozilla.org/mozilla1.0/source/embedding/tests/winEmbed/winEmbed.cpp
話題につられて書いてしまったが、Windowsプログラムがどうこうというのは
スレ違いか?

…逝ってくる。
>>81
なかなか面白いですね。スタートアップコードが本来処理する部分を
自分で書くわけですね。それでもまだマルチスレッド動作の時に大丈夫
かという不安は残ります。

>>82
http://pc3.2ch.net/test/read.cgi/tech/1018239290/ 当たりで書くと
喜ばれる話題かもしれません。
main()からウィンドウ作るとコンソールも画面に残って嫌
subsystemをconsoleからwindowsにすればいい。
86デフォルトの名無しさん:02/07/24 23:29
よくわかりました。
int main()
{
main();
return 0;
}
88デフォルトの名無しさん:02/07/25 23:07
C++でprintfを使うのは良くないですか?
coutとか使いにくくてしょうがないのですが。
>>88
いいんじゃないかな。
>>88
慣れれば使いやすいよ それに便利

void Print(std::ostream &os)
{
 os << "プリントしたい中身を書く";
}
みたいなの作っておけば
Print(std:cout);はもちろん

std::ofstram of("hoge.txt");
Print(of); もできるし

std::ostringstream os;
Print(os); ともできる
printfとかじゃこんな事するのはめんどくない?
まぁ適材適所だと思いますけど
v(^・^)v
9288:02/07/25 23:23
レスありがとうございます。
まだ勉強中の身で生意気を言ってみたのですが…

適材適所。そうですね。
両方を選んで使えるようになる為、しっかり勉強します。
ただただ、楽な方に逃げるところでした。
>>90
fprintf()

どっちかってーとクラスごとにoperator<<を定義してがすがす流すほうが利点じゃないか?
94名無しさん:02/07/25 23:49
>>93
禿同
95デフォルトの名無しさん:02/07/26 02:23
代入演算子の戻り値ってconst付ける?
俺は付けない方が正しいと思ってたんだけど、最近付けてるソースよく見る。

Foo& operator =(const Foo &bar);
const Foo& operator =(const Foo &bar);
>>95
(a=3)=4;
>>96
そう、俺もそれが根拠。
迷った時は組み込み型の真似。

でもじゃあなんでconst付けてる奴がいるの?
>>97
逆だよ。組み込みの型なら、96はコンパイルできない
Σ(・∀・;)エッ
>>99
やってみて。
bcc, g++, cl
全て通るようですが・・・。
10295=97:02/07/26 02:46
>>98
どんなコンパイラ使ってんだ?
>>101
.cppだと通る
.cだと通らない
Σ(・∀・;)ソリャCナラ・・・
105103:02/07/26 02:50
じゃあ俺スレちがいじゃん。ごめん
ホントだ、知らなかった。勉強になりました >103
でもこのスレ C++ でしょ。
じゃあ>>95の主張は正しいね。
やべぇ、どうしてCで>>96が通らないのかわからないぞ、俺。
まあ、C++的にはそれでいいわけだから、C++プログラマとしては
恥じる必要はないのか…?
>>108
Cの仕様ということでは?
>>108
(a=3) が右辺値だから。
それより、>>96 みたいなコードを見て病的だと思わないのは
ヤバいかもしれません。
11111:02/07/26 07:25
=はC++ではLvalueを返して、CではLvalueを返さないからね。
前置++とかもそうだね。Cに参照型がないことを考えれば
もっともだけども、C++での参照型のあつかいは
コンパイラへの遠慮のせいか中途半端で気持ち悪い。
どうせ実装はポインタになっちょうのにね
自動的に参照か値か判断されるのもなあ、
かといってref修飾子もエレガントじゃないしなあ
112デフォルトの名無しさん:02/07/26 18:33
質問なんですが、
a[4][4]:
のとき、
&a
は何を表すんでしょうか?単に
a
と書くときとの、意味の違いを教えてください。

#ひょっとして、文法的に間違ってるのかな?gccでは通るんだけど。
>>112
a[0][0]:

のアドレス。だから一緒かと。
まぁ、偶然の一致な訳だけど。
11411:02/07/26 19:19
>>112
T a[4][4]なら式で評価されると
aはT(*)[4]で&aはT(*)[4][4]だから別物だよ。
11でも書いたけど配列の仕様は気持ち悪いよね
>>112
俺はそのへん、全然分からん。怖いから、そんなコード書くような状況になったら、
すぐにvectorに逃げるよ。
11611:02/07/26 21:55
aはぜひともT[4][4]として評価されてコピー演算をサポートして
ほしいね。typeidやsizeofではT[4][4]なんだから。
それでT[4][4]からT(*)[4]のキャストをサポートすれば
いいんだから。気持ち悪いったらありゃしない。
そろそろ嫌われるな、おれ
C++とC#はどう違うん?
>>117
根本的に・・・。
>>112

これでわかる?

てすとぷろぐらむ
---------------
#include <stdio.h>


int main()
{
int a[2][4];

printf("adr a = %x\n", a);
printf("adr a+1 = %x\n", a+1);
printf("adr &a = %x\n", &a);
printf("adr &a+1 = %x\n", &a+1);

return 0;
}


-------------------

じっこうけっか
-------------------
adr a = 12ff6c
adr a+1 = 12ff7c
adr &a = 12ff6c
adr &a+1 = 12ff8c
120119:02/07/26 22:36
ごめんわすれてた
sizeof(int)は4ね。
121デフォルトの名無しさん:02/07/27 00:46
int a[3][4]; とあった場合

aという表記は、int [4]という型の要素を3つ持つ1次元配列。
a は &a[0] と同義なので、今言った1次元配列の先頭要素への
ポインタのこと。つまり、int (*)[4]ということになる。
&a は配列a全体へのポインタという意味になり、int(*)[3][4]
という型になる。

まとめると、
a --> &a[0] --> int (*)[4]
a[i] --> &a[0][0] --> int *
a[i][j] --> int
&a --> int (*)[3][4]
122デフォルトの名無しさん:02/07/27 00:49
a[i] --> &a[0][0] --> int * は間違いで
a[i] --> &a[i][0] --> int * でした。
>>121
わかりやすい
124デフォルトの名無しさん:02/07/27 01:00
>>111さん
>>=はC++ではLvalueを返して、CではLvalueを返さないからね。
>>前置++とかもそうだね。

はじめて知りました。試して感激。てっきりC++でも、式の結果は左辺値でなく
値と思ってました。これってストラウストラップの本とか見ても載ってなさそう
なんですが、どこかに説明ありますか?ちなみに後置++は値ですね。何故だろう。。
12511:02/07/27 01:45
C++ 3rdの6.2(Operator Summary)に書いてあるようだよ
それによると?:もLvalueを返せるようだね
後置++はインクリメント前の値を返すから
これを参照で返す仕様にするとインクリメントのタイミングが
ややこしくなるし、不自然だね
126デフォルトの名無しさん:02/07/27 02:03
>>125さん
ホントだ、載ってました。6.2.1ですね。
どうもです。

by 124
互換性のある型だよね・・・。
128デフォルトの名無しさん:02/07/27 03:57
>>121
3次元配列の場合はどうなるの?
といってみるテスト
129121:02/07/27 07:37
何次元でも考え方は同じ。配列を要素に持つ配列とか
配列の配列を要素に持つ配列とかいうふうに考えていけば
良いと思う。結局は1次元配列に帰着されるということ。
ちなみに121の"表記"というのは"配列"のこと。

int a[3][4][5]; とあった場合

aという配列は、int [4][5]という型の要素を3つ持つ1次元配列。
ややこしいけど言葉にすると、「"int型の要素を5つ持つ配列"を要素
として4つ持つ配列」を要素として3つ持つ1次元配列。
プログラム中でaと書くと、それは&a[0]を意味し、直前に言った
1次元配列の先頭要素へのポインタとなり、その型は
int (*)[4][5]となる。

a[i]という配列は、int [5]という型の要素を4つ持つ1次元配列。
言葉にすると、"int型の要素を5つ持つ配列"を要素として4つ持つ
1次元配列。プログラム中でa[i]と書くと、それは&a[i][0]を意味し、
直前に言った1次元配列の先頭要素へのポインタとなり、その型は
int (*)[5]となる。

a[i][j]という配列は、int型の要素を5つ持つ1次元配列。
プログラム中でa[i][j]と書くと、それは&a[i][j][0]を意味し、
直前に言った1次元配列の先頭要素へのポインタとなり、その型は
int *となる。

でもってa[i][j][k]はint。

&a はaという配列全体へのポインタという意味になり、その型は
int (*)[3][4][5] となる。

頭がおかしくなりそうだけど。
130112:02/07/27 08:37
房なわたしの質問におつきあいいただきありがとうございます。
なんとなく分かったような気がしました。

うちの大学の教授に聞いても分からなかったし、どのポインタ関連の本を
読んでも書いてなかったので質問したんですが、
まさかこんなに丁寧に答えてくれるとは思いませんでした。
ありがとうございました。
stlのvectorで大きなオブジェクトを生成後、追加していきたいのですが

BigObj obj; // と一旦作って
obj.hoge = moge;
obj.hoge2 = moge2;
... と色々変更して

最後にpush_backするとコピーの手間が余計な気が済ます
あらかじめ確保されたvectorの領域を直接書き換えられないでしょうか?

array.reserve(適当);

BigObj &obj = array.end();
obj.hoge = moge;
array.resize(array.size()++);

とか、あんま美しくないんですけど、他にやる以外方法ないんでしょうか?
>>131
BigObjにデフォルトコンストラクタつくって、std::vectorに
デフォルト値つっこんでから変更したら?
>>131
vector使う意味あまりなさそう
134446:02/07/27 14:05
c++をコンパイラ・実行できるフリーソフトってありますか?cの方は見つかったのですがなかなかみつからなくて。。。
お願いします。
gcc
>>134
実行ってことは、インタプリタが欲しいん?
>>134
プラットフォームを書いてくれないと何とも…。
UNIX系だったら最初からコンパイラついてると思うし。

WindowsだったらやっぱりBorland C++ Compilerかねぇ。
138デフォルトの名無しさん:02/07/27 15:43
>>134
とりあえず、gccだな。Windows, Mac(X), UNIXどれででも使える。
139Rina ◆tI333vNE :02/07/27 16:30
>>134
とりあえず, yaccとlexで….
…嘘です, ごめんなさい.
>>139
yaccとlexって言いたかったの?
141Rina ◆tI333vNE :02/07/27 16:35
自分でコンパイラから書けと言いたかったのです.
…よくよく考えたら, 自分で書こうとして放置プレイした
まんまなんで, 人の事言えないなぁとw
>>141
でも、コンパイラがないと、yaccやlexだけではコンパイラ作れないよね。
143Rina ◆tI333vNE :02/07/27 16:37
あ…そういわれてみれば.
オブジェクトの書き出しにスマートな方法解説してるページってありません?

見たので一番シンプルだったのは operator<< オーバーライトで
BinWriter << メンバ1 << メンバ2 << メンバ3
見たいに書いてるやつ。

でもグローバルに operator<<が大量に発生するんだよね…
基底クラスを工夫すればもっといい書き方あるかなぁ…?

145  :02/07/28 02:23
すいません。宿題でバイナリーサーチツリーを使った
電話帳というのを作らないといけないのですが、ちょっと
エラーが解決できなくって・・。
バイナリーサーチツリー自体は完成して、で、テンプレートを
使ってどんなオブジェクトでも収納できるようにしたんですよ。
テストしてみるとIntのときは問題なくうごいているんですが、
いざ自分の作ったPersonというクラスを収納しようとすると
コンパイルはできるんですが、ビルドの際に

LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/BinaryTreeNode.exe : fatal error LNK1120: 1 unresolved externals

というメッセージがでて実行できません。これは一体
どうすればよいのでしょうか?自分なりに検索してプロジェクト
の設定のところをいじってみたんですが、もう行き詰まってしまい
ました・・。どなたかご存知のかたいらっしゃいますでしょうか。
_main …
>>145
Personをintに直したら通るんか?
別のところもいじったか?
>>145
なんでバイナリサーチでわざわざツリーを作るんだ?
バイナリサーチじゃなくて、2分木でデータベースを作る課題か?
149   :02/07/28 02:36
>>147
はい。
Person を int に直したらちゃんと動いてくれます。
ためしに乱数を入れてみて表示したらちゃんとソート
されてました。

>>148
うん??なんででしょう?いや、実際よく
わかんないっす・・汗
150デフォルトの名無しさん:02/07/28 02:37
構造体のアドレスの渡し方なんですが
関数側渡して値を入れさせてますが、どうも反映されません。
構造体の定義を変数の前でやると「NULL」入ってるし
変数の後でやったら「セグメンテーション違反」なるし。
何がおかしいのでしょう…。解る方教えて下さい…。

int main(void){ int i,terms; FORMTERM *term; terms=Get_Form(term); printf("Content-type: text/plain\n\n"); printf("FORM VARIABLE\n"); for(i=0;i
int main(void){ int i,terms; FORMTERM *term; terms=Get_Form(term);


www-cms.phys.s.u-tokyo.ac.jp/%7Enaoki/CIPINTRO/CCGI/SRC/form.cc を参考にしました。
>>150
殺人級に読みにくい
152    :02/07/28 02:43
>>148
あ!そうそう!それです!
2分木の各ノードにPersonというクラス
を収納したいんですよ。
Personは NameとNumber(共にString)を
持ってるだけの単純なクラスです。
>>149
Personの定義部と、ツリーに格納する周辺のコードを貼ってよ
154デフォルトの名無しさん:02/07/28 02:44
>>144
テンプレート使え。
但し 
template <class T> writer& oeprator<<(writer& w, T &t)
と汎用なのは禁句。特別バージョンとあいまいさが解決できないから。

class tを一度ラップして書きましょう

まぁ宿題スレへ行け。
スレ違い。
宿題スレは潰れた
158     :02/07/28 02:53
>>155

逝ってきます
159デフォルトの名無しさん:02/07/28 03:01
五年ぐらい前に組んだC++のチャット用プログラムが
急にエラー起こすようになりました。
ブラウザのバージョンアップについていけないっていうことありますか?
あるとすれば、どんな理由が多いでしょうか
は?
・環境
・使用ライブラリ(WinInet/Winsock)
とか記載しろよ
Y2k
2001/9/9問題
163デフォルトの名無しさん:02/07/28 03:06
非決定性有限状態オートマトソってなんですか?
164デフォルトの名無しさん:02/07/28 03:06
あとDFA?も教えてください
>>163-164
C++関係なくない?
DFAはdeterministic finite automatonだっけか?
166163:02/07/28 03:18
ゴーグレで調べたらC++のコードが出てきたもんでC++でやるのが普通なのかと思ってました
そうでもないんですね(^∀^;)
167デフォルトの名無しさん:02/07/28 03:42
基底クラスのstaticなメンバ変数を派生クラスから
使いたいんですが、複数の派生クラスを作ると
"すでに定義されています"というエラーが出てしまいます。

// A.h
class A {
protected :
static int num;
};

// B.h
class B : public A {};

// B.cpp
int B :: num = 1;

// C.h
int C :: num = 2;

// C.cpp
class C : public A {};

numはそれぞれの派生クラスで定義しないといけないんでしょうか?
>>167
B::numもC::numも実体はA::numだからエラーが出て当然じゃないの?
>>167
static int num; の実体は一つしか存在しません。いくら派生しても
同じです。

だから二重定義エラーが出る。
170デフォルトの名無しさん:02/07/28 03:58
C++不要論。
>>170
ん?どうした?
172デフォルトの名無しさん:02/07/28 04:08
実は言語は破綻していてライブラリでカバーしているだけなのを
おくびにも出さない必死なC++厨
はぁ。
(((;゚Д゚)))) .。oO(煽られてる・・・どうしよう
175デフォルトの名無しさん:02/07/28 04:23
ライブラリの支援を得てどうにか実用レベルのC++
しかもそれらを安全に使うためにはより多くの知識が要求される
ライブラリでなんとかするんならVBでもできる罠
つまり費用対効果で見るとVB以下。
(((;゚Д゚)))) .。oO(煽られてる・・・どうしよう
(´-`).。oO(>>175おもしろいw)
178デフォルトの名無しさん:02/07/28 04:27
C++はストリームを<<で表現したかっただけちゃうんかと小一時間・・
179デフォルトの名無しさん:02/07/28 04:34
核心をつかれ黙り込んでしまうC++厨。

   〜〜〜〜〜〜〜〜〜〜〜〜終了


〜〜〜〜〜〜〜〜〜〜〜〜終了

                 〜〜〜〜〜〜〜〜〜〜〜〜終了

       〜〜〜〜〜〜〜〜〜〜〜〜終了
       /■ヽ
      (´Д`)
  (( ─━OO━─ ))
        ∪∪
>>180
やせたいのかい?
182デフォルトの名無しさん:02/07/28 04:40
コラコラ、終了したスレを荒らさないようにな。
183デフォルトの名無しさん:02/07/28 04:42
std::system("cdplayer");
> C++はストリームを<<で表現したかっただけちゃうんか

Σ(゚Д゚) それが核心だったのかー
185デフォルトの名無しさん:02/07/28 04:57
必死なC++厨とは裏腹に中身がCのままのなんちゃってCプラプラグラマのなんと多いことか。
所詮現実にはCが築いた資産の価値を認める世間とそうせざるを得ない現実。
ふー
187デフォルトの名無しさん:02/07/28 05:04
>186=反論できないヤシ=バカ=C++厨=シネってこった
188デフォルトの名無しさん:02/07/28 05:06
必死だねぇ
ここは相談室なんで、↓行って好きなだけ罵倒して下さい。

・C++について言いたいことがあればどうぞ ++
http://pc.2ch.net/test/read.cgi/prog/1017746969/
190デフォルトの名無しさん:02/07/28 05:13
では相談いたします。
みなさんはなぜそんなに盲目C++信者なんですか?
いつ絶滅してくれますか?教えてください。よろしくお願いします。
191Stroustrupは神様です:02/07/28 05:14
C++ばんざ〜い
>>190
おいたが過ぎますぞ。
何で190はこんなに必死に煽ってるんでしょうか?
194デフォルトの名無しさん:02/07/28 05:22
>190
同意。みんなCに帰ろう
195デフォルトの名無しさん:02/07/28 05:25
>190
同意。C++は先細って行くだろうな
一人で帰ってろ低能。
197デフォルトの名無しさん:02/07/28 05:34
>196
同意。C++は自分の重みでつぶれてしまうだろうな
ジサクジエンどすか?
199デフォルトの名無しさん:02/07/28 05:44
>198
同意。C++厨はC++開発者の自作自演。このスレもその道具。そこまでしてはやらせたいのか・・。
200デフォルトの名無しさん:02/07/28 05:48
>199
同意。200
201デフォルトの名無しさん:02/07/28 05:58
で??
202デフォルトの名無しさん:02/07/28 06:00
で?
sage
204デフォルトの名無しさん:02/07/28 06:41
ヘタレが作ったC++プログラムは、トレースする気が起こらん。
Cならマシだが。なんつー漏れがヘタレか。
>>204
随分簡単な悩みですね。
>>204
言語に関わらず、残念なコードをトレースするのはつらい。
まともなソースブラウザがあればそうでもない。
C++が糞なのは、例外がたんまり織り込まれた構文で、
言語自体の能力はまともだし、面白いと思うが。
プリプロセッサを引きずったのが最大の敗因と考える。
>>207
>C++が糞なのは、例外がたんまり織り込まれた構文で、言語自体の能力はまともだし、面白いと思うが。
文の始まりと終わりが対局だぞ・・・?
s/構文で/構文だけで/
ポインタって知ってる?みたいなJavaやperlのコードを見ると悲しくなりますヨ
イテレータって知ってる?みたいなC++のコードを見ると鬱になりますヨ
>>210
PerlはともかくJavaは参照しかないんだからポインタの基本はわかってて然りっしょ。
>>212
いやそうでもない・・・ポインタ渡しだというのに、実体渡しであるかのように
書かれたコードを見て激しくウツになったよ。
JavaもPerlもそのレベルのコーダが一人居ると死ねるね。
>>213
思いっきり引数に3足してたりとか?w
>>214
それならダメな人ってすぐに分るけど・・・
具体的には、関数にインスタンスを渡してるんだが、
その関数が中身を書き換えるような操作をするのね。
それに気づいてない。
216デフォルトの名無しさん:02/07/28 12:20
204です。

意味不明な情報隠蔽はトレース隠蔽(言葉変)に思えてきて。
トレースというより、ウォーリーを探している感じ。
そのうち、トレースしていた場所が何処だったか分からんように
なったり。

ま、自分の理解力が足らんのだろうと、自戒する。
void hoge(SomeClass *p)
{
if(p->SomeMethod() != 0)
{
p->SomeField =0;
return;
}
}

これは許容範囲でしょ?



void hoge(SomeClass *p)
{
if(p->SomeMethod() != 0)
{
p = p->GetNextSomeClass();
return;
}
else
{



}

これも問題ない。
引数はポインタのコピーだからそのコピーをいじっても引数のポインタの値は変わらない。

何が問題?

素人でスマソ。
俺も早く働きてぇ。
どれほどバカなコードがまかに通ってるのか見てみたい。
>>218
>がまかに通ってるのか見てみたい。

ミスタイプにしてはキーの位置が離れすぎてるぞ?w
は?
>>218 の周囲ではバカな言い回しがまかり通ってるみたいだな。
かに通ってます
223デフォルトの名無しさん:02/07/28 13:14
正直、218とは働きたくない
みんな待て。かな入力なら「に」と「り」の位置は妙に近い。
でも>>223と同意。
かな入力のプログラマ萎え
>>225
あー、ほらなんつったっけ、日本語ベースなあれは……
Mind
>>226
ここではIMEの日本語入力方法のことじゃん?
普通ローマ字入力じゃね?
くだらねえ
じゃあ、なんかおもしろそうな質問してくれYO
質問いいですか?

あの、VC++で、CGIにデータを送りたいんですが
どういう関数を使えばいいんでしょうか?
send
えと、sendについて調べてみました。
実際のところはsendだけでいいんでしょうか?
送るだけならsend
当然sendをするに当たって前準備などをしなければならない。
>>231
とりあえずインターネット(つーか、TCP/IP)とのデータのやりとりには
WinSockっつーAPI体系を使うのが普通なのでそれを調べてみては。

っていうか、このスレって処理系依存、環境依存の話もOKなのか?
漏れは最近見始めたからよく知らないんだが。
C++のスレって言うと、言語仕様だとかライブラリだとかの話題
なんじゃないの?とふと思った。
>>235
環境に依存していたとしても、C++的な問題の可能性があるなら
ここで振ってもいいのでは?

おしえて君は勘弁だが、なんでもかんでも環境依存うぜえという
わけではないと思うぞ。
>>235
> C++のスレって言うと、言語仕様だとかライブラリだとかの話題
原則としてはそうだけど、C++ だと Java や Perl と比較すると標準ライブラリが
全然充実してないし、非標準でも TCP/IP の話などは多くの環境で共通する話
題なので、あまり厳密にやらんでも良いかと。

もし他に適切なスレがあるようなら、やんわりと誘導するって事で。
オブジェクトのファイルへの出力のエレガントな方法を教えてください
シリアライズまでは求めません

つか、みんなどうしてんの??
初心者本はfwirte止まりだし、アホかと。
ToStringメソッドとか
240 ◆JAPH9PWA :02/07/29 11:12
>>238
普通はoperator <<をオーバーロードするんじゃないかな。


#include <iostream>
namespace my{
class Foo{};

// この関数はnamespaceの中にあるにもかかわらず、適切に呼ばれる
template <class charT >
std::basic_ostream<charT>&
operator << (std::basic_ostream<charT>& os, Foo&)
{
return os << "Foo";
}

} // namespace my

int main ()
{
my::Foo a;
std::cout << a << std::endl;
std::wcout << a << std::endl;
}
<<オーバーロードいいんだけど、

save対象の全種のオブジェクトに対して書く必要があるでしょ。それはエレガントじゃないと。
基本形 MyObj について書くのはいいけど MyObj をSTLと組み合わせた場合なんかどうするのかと。

template<classT> saver& oeprator<<(saver&, T &t) と
template<classT> saver& operator<<(saver&, vector<T> &t)
はあいまいさが解決できずに共存できない罠…

242 ◆JAPH9PWA :02/07/29 11:55
「save対象の全種のオブジェクトに対して書く必要がない」方法なんてあるの…?。
STLとの組み合わせならfor_each()を使うなりすればいいし。

ていうか
template<class T> saver& oeprator<<(saver&, T &t)
template<class T> saver& operator<<(saver&, vector<T> &t)
これがどう曖昧なのか分からないんですが、私の知識不足?
243 ◆JAPH9PWA :02/07/29 12:02
って、templateか。

そりゃ曖昧ですよ。
でもoperatorの右オペランドを一般化するなんてそんな無茶な、ってな気がしますが。
template<class T> ostream& operator<<(ostream &o, const T& t) {
 T::const_iterator i, e;
 e = t.end();
 for(i=t.begin(); i!=e; ++i) o << *i;
}

template<> ostream& operator<<(ostream &o, const 任意& t){...}
245デフォルトの名無しさん:02/07/29 16:57
質問です。以下のプログラムでsizeof(&a)がポインタの
サイズでなく、配列全体のサイズを返すのですが何故ですか?
その他は納得しています。
int main()
{
double d;
int a[2][3];

cout << sizeof(d) << endl; //8と表示
cout << sizeof(&d) << endl; //4と表示
cout << sizeof(int) << endl; //4と表示
cout << sizeof(a) << endl; //24と表示
cout << sizeof(a[0]) << endl;//12と表示
cout << sizeof(&a) << endl; //24と表示??なんで?
}
>>245
親切設計
aなんて物は本来存在せず、単なるシンタックスシュガーだから。
&a[0]と汁
>>247
aは存在するでしょ?a[0]とかがシンタックスシュガーでしょ?
シンタクスシュガー って何? 検索しても、 肝心の解説がみつからん
bcc: 8 4 4 24 12 24
vc++: 8 4 4 24 12 24
g++: 8 4 4 24 12 4
>>248 は?
ポインタと配列勉強しようね。
・シンタックスシュガー
    文法を簡便化するために、作られた記法。
でも、なんで 24になるわけ? 普通a[0]と解釈されるわけでしょ?
エラーとかならわかるけど
>>245
それについての合理的な説明は今まで聴いたこと無い。
ただ文法としてそう決められているというだけ。
K&Rにもそんな記述は載っていないから
素直にsizeof(a)を使うほうが無難。
書いてある本発見
様は、2次元配列か、ポインタの1次元配列か区別が出来ないということらしい

int a[2][3];
int *a[2];
int **a;
int (*a)[3];

どれも a[][]でアクセス出きるのが、上の4パターンのどの宣言かわからんらしい
要は、int a[2][3]に関してsizeof(&a)なんてやるな、と。
逆にsizeof(&a)を使う「べき」ってケースはあるの?
25811:02/07/29 17:55
なんだとおおお!!
sizeof(a)==sizeof(&a)だなんて、そんな馬鹿な!!!!
bccで試したらtypeid(a)==typeid(&a)==INT[2][3]だと!そんなアホな!!!
The result of unary & operator is a pointer to its operand.
って書いてあるだろうが。どこにも特例は出てないぞ!!
でてたら誰か教えてくれ!!!

gccが正しいとみた
↑の4パターン(添字を変えたところで)のどれも 24にはならないような…?
260デフォルトの名無しさん:02/07/29 17:58
>>247
sizeofの被演算子で配列名指定すると配列全体のサイズ
が返ってくるのは常識だが。その他の文脈ではaは&a[0]
の意味になるはず。
ttp://member.nifty.ne.jp/maebashi/programmer/pointer.html より。

<配列→ポインタの読み換え>

式の中では、配列は「先頭要素へのポインタ」に読み換えられる。

int a[10];

の時、式の中では、a と &a[0]は同じ意味となる。

ただし、以下の個所は例外である。

1、sizeof演算子のオペランド

sizeof演算子は、ポインタのサイズではなく、配列自体のサイズを返す。


2、& 演算子のオペランド

& 演算子は、配列全体のアドレスを返す。
配列から読み換えられたポインタは左辺値を持たないため、
& 演算子のオペランドにはならないはずであるが、この例外規則のため、
& でアドレス(配列の先頭要素のアドレスではなく、配列全体のアドレス)が 取得できる。
この規則は初心者を混乱させることがある
(例えば scanf("%s", buf) でなく、scanf("%s", &buf)と書いても 正常に動いてしまう)が、
メリットは今ひとつわからない。


3、初期化時の文字列リテラル

char の「配列」を初期化する場合の文字列リテラルは、
中括弧内に文字を区切って書く初期化子の省略形である。
char の「ポインタ」を初期化する場合の文字列リテラルとの 違いに注意すること。
262245:02/07/29 18:08
>>254
aは配列オブジェクトですよね。
型でいうとint [2][3]です。つまりサイズは24バイト。
&aは配列全体へのポインタで(ANSI規格より)、型は
int (*)[2][3]ですよね。ポインタなんだから、double d
に対するsizeof(&d)と同じく4バイトが正しいと思うんです。

>>255
なんか正しそう。なんて本ですか?

>>256,257
単なる興味だけです。。どうも気持ち悪くて。
配列全体のアドレスっつうのは、範囲ということなのか?
26411:02/07/29 18:14
>>262
>&aは配列全体へのポインタで(ANSI規格より)、型は
>int (*)[2][3]ですよね。ポインタなんだから、double d
>に対するsizeof(&d)と同じく4バイトが正しいと思うんです。

よしよし、同志だな。ただdouble*とint(*)[2][3]の
サイズが同じだとはどこにも決まっていないな。
問題はtypeid(a)==typeid(&a)なことだ!!
動的に二次元配列もどきをつくるとき、いったんポインタの1次元配列を
つくるよね。
静的な配列にも概念的にはこれが存在するが、その実装はコンパイラ依存だし
直接アクセスすることもできないから、Cでは今回の件に関して
このような仕様になっているんじゃないの?
26611:02/07/29 18:18
>>263
具体的にアドレスが何なのかは処理系依存だったと思う
267245:02/07/29 18:20
>>258
gccが正しいのかな?それだと何も疑問無いんだけどな。

>>255
int a[2][3]; --> int [2][3]型 -->配列全体のサイズ
int *a[2]; --> int* [2]型 -->ポインタ二つ分のサイズ
int **a; --> int **型 -->int*へのポインタのサイズ
int (*a)[3]; --> int (*)[3]型 -->配列へのポインタのサイズ

cout << sizeof(int [2][3]) << endl;
cout << sizeof(int* [2]) << endl;
cout << sizeof(int **) << endl;
cout << sizeof(int (*)[3]) << endl;
と明示的に型指定すると24,8,4,4と出るなあ。
これは納得。bcc5.5.1です。
268254:02/07/29 18:23
>>262=245
>...と同じく4バイトが正しいと思うんです。
思うんですとか言われても現実にはsizeof(&a)=24という
腐った仕様が厳然と存在してしまっている。
君の取るべき道は三つだ。
・そういうものかと納得する。
・あきらめてC/C++をやめる。
・憶測や妄想を捨て作者に歴史的経緯を聞いてここで報告する。
気持ちはわからんでもないが、正直どうでもいい話だ。
270245:02/07/29 18:24
>>264
>ただdouble*とint(*)[2][3]の
>サイズが同じだとはどこにも決まっていないな。
>問題はtypeid(a)==typeid(&a)なことだ!!

そうなんです。
27111:02/07/29 18:28
>>268
設計者のミスに違いない!!!
次のバージョンに期待
272245:02/07/29 18:30
>>268>>269
その仕様が言語仕様なのか処理系依存なのか
分かればスッキリするんですが。

・見なかったことにします。
皆さん忘れてください。
仮想関数のアドレスを表示しようとすると "1" としか表示されない
のですが、なぜでしょうか?

class A {
public:
virtual void print() const { cout << 10 << endl; }
};

class B : public A {
public:
void print() const { cout << 20 << endl; }
};

int main()
{
typedef void (A::*afunc)() const;

cout << "A::print = " << hex << (afunc)A::print << endl;
cout << "B::print = " << hex << (afunc)B::print << endl;
}
>>272
言語仕様。
>>273
A::printってなによ?非staticでしょ?
27611:02/07/29 18:41
>>272
int a[2][3];
について
int (*p)[2][3]=&a;
が可能であるが、
array to pointer conversionではint[2][3]はint(*)[3]へ
変換されるはずだから、typeid(a)==typeid(&a)だとすると
上のはおかしい。つまり変換(standard convertion)は行われていない。
そこで&aはsizeof(&a)でもtypid(&a)でも式でもint(*)[2][3]となるはず。
だから(typeid(a)==typeid(&a)が)ANSIから外れているのはまず間違いない。
>>275
うーんメンバ関数のアドレスを表示したいんです。
例えば

A aa;

としておいて、

(aa.*a)(); とすれば、"a"、つまり10が表示されます。関数を呼び出す
のではなく、関数のアドレスを表示したいのです。
>>277
((char*)aa + (char*)&A::print)
>>278
エラー E2031 virtual.cpp 20: 'void (A::*)() const' から 'char *' へのキャストはできない(関数 main() )
と出てしまいました。
280245:02/07/29 18:55
>>276
確かに、
int (*p)[2][3]=&a; で
sizeof(p)は4を返しますからね。
>>277
メンバ変数なら0からキャストするとして、メンバ関数は無理じゃないの?
ましてや仮想関数だし
>>279
&aa
>>281
ということは、メンバ関数のアドレスを取って呼び出すことは可能でも、
メンバ関数のアドレスを表示することは不可能ということなのでしょうか。

仮想関数でなくしても(virtualを取っても)、やはりできないようです。
>>282
(char *)&aa + (char *)&A::print としても同じエラーが出ます。
reinterpret_cast<A*>(0)->print
は?
28611:02/07/29 19:08
>>283
ど〜よ
class A{
public:
virtual void foo(void) {}
} ;
main(){
void (A::*t)(void)=&A::foo;
void *p=&t;
cout<<hex<<*(int*)p<<endl;
}
>>285
だめみたいです。やはり無理みたいです。
エラー E2094 virtual.cpp 24: << 演算子が使われたがクラス ostream では void (* (_closure )())() 型のための定義が存在しない(関数 main() )
>>287
printf("%xで出すのはどうだい?
>>286
うまくいきました!どうやら、メンバ関数のポインタは、一度 void * に
代入して、コンパイラを騙してから、アドレスを見る必要がありそうですね!
>>288
それでもうまくいきました。つまり、出力演算子 << が対応してないための
ようです。
29111:02/07/29 19:17
ちと冗長だった
class A{
public:
virtual void foo(void) {}
} ;
main(){
void (A::*t)(void)=&A::foo;
cout << hex << *(int**)(void*)&t<<endl;}

>>288
その手があったか
>>291ありがとうございます。
cout << hex << *(int*)(void*)&t<<endl;} でもいいようですね。
もっと単純にしてもよい。
cout << hex << *(unsigned*)&t<<endl;
29411:02/07/29 19:26
>>292
サイズが同じ型なら何でも。思いっきり処理系依存だけども
ただ、これがメンバ関数へのアドレスであるという保証はどこにも…
ビットパターンがそうだというだけで
29511:02/07/29 19:28
>>293
あちゃ〜〜、下手うった
>>294
そうですね。手持ちの本「C++標準ライブラリ」で、Cの "%p" に当たる
出力方法を探してみましたが見つかりませんでした。

処理系依存にならない方法があればいいのですがわかりません。
C++の内部のメカニズムをいじくり回すようなプログラムは書きにくく
なっているのかな。
>>296
つーか、"%p"自体が元々処理系依存。
29811:02/07/29 19:38
処理系依存はsizeof(void(A::*)(void))と
*(T*)&tのsizeof(T)を一致させる話ね。いちおう
>>255 の本だけど
エキスパートCプログラミング 知られざるCの深層 アスキー出版

面白い本だけど、今回の問題はコラム扱いで >>255以上の事はあまりのってない
立ち読みするなら P261 だ
>>255 の本に以下のような記述あり

次のような配列への参照は、最初の要素へのポインタに自動では置き換えられない
1sizeof()の中の配列
2&演算子によって配列のアドレスが取得される場合
3配列が、初期化に使われる文字列リテラル、またはワイド文字列リテラルの場合
cout << sizeof("テストだゴルァ") <<endl;
cout << sizeof(&"テストだゴルァ") <<endl;

両方とも 同じ結果です
302300:02/07/29 21:22
ガイシュツでした スマソ
245の質問自体が112あたりの外出
304245:02/07/30 01:54
>>299
どうもです。今度見てきます。
http://www.bohyoh.com/CandCPP/FAQ/FAQ00084.html
this.じゃなくて、this->とか(*this).じゃないと駄目だよなぁ…。
でもメール受け付けてないし、直りそうに無いな。。
306デフォルトの名無しさん:02/07/30 06:16
C++とC言語ってどこがどう違うんですか?
いやーC++最高
生産性が高くなるし、コードは簡潔で見易くこの上ない
308デフォルトの名無しさん:02/07/30 07:43
>>300>>261が正しいとすると、
&aで配列全体のアドレス(ポインタ)になって、sizeof(&a)で、
int (*p)[2][3]=&a;sizeof(p);になって結局4になるのが
正しいように見えるけど?
&aと書いた時点で、それはもう配列じゃなくて配列へのポインタ
に変わってしまってるわけだから、>>300の1番目の規則は
適用できないはず。

配列全体のサイズを返してしまう処理系が間違ってるか、もしくは
本の記述が間違ってるとしか考えられない。
>>308
2番目の規則が適用されるんじゃないの?
310308:02/07/30 07:47
&aのaは2の規則により特別に配列だけど、&aの返す値はアドレスってことね。
その値をsizeofに渡してるわけだから1の規則はあてはまらない。
1はアドレスじゃなくて配列の名前を渡した時だから。
311308:02/07/30 07:48
>>309
二番目の規則が適用されるのはわかってるけど、
それでも1が無いとsizeofの値は4になるはずだと思うんだが。
>>310
1はsizeof()の中の配列とかいてあるだけで、名前で渡すとか、
アドレスで渡すとか書いてないよ
313308:02/07/30 07:57
>>312
いや、でも「配列へのアドレス」はポインタとは言えるかもしれないが、
配列じゃないだろ。
>>261のURL見ても、a[10]のaのことを配列と言ってるようだし。
まず、この場合は4にならなくちゃおかしい。

それで、「配列への参照」とは言えるかも知れない。だから、>>300
の方はあってるかもしれない。
でもそうなるとint (*p)[2][3]=&a;sizeof(p);だって、配列全体
の大きさにならなくちゃおかしい。これだって「配列への参照」だから。
でも過去レスでは4になったと言っている。
となると、結局どっちにしろ駄目だと思うんだが…
>>313
pはポインタだろ。配列の先頭を指す
315308:02/07/30 07:59
>>314
そう思うよ。だけど、&aだってそうだろ。
>>315
pは左辺値になりうる。
&aは左辺値じゃないだろ?
別物だよ
317308:02/07/30 08:03
>>316
まあそうだな。
だったら、左辺値のポインタならポインタのサイズになって、右辺値の
ポインタならsizeofは配列全体を返すというべきだ。
それなら、つじつまが合う。
でもそうだとすると>>300>>261の記述は間違ってるぞ。
右辺値とか左辺値とか言ってない。そもそも「右辺値のアドレス」には
変換されないと言ってるように感じられる。
>>317
左辺値の話は、あなたが
>そう思うよ。だけど、&aだってそうだろ
と書き、pと&aを同一視しようとしたから書いただけ。
319308:02/07/30 08:08
>>318
そう思ったのなら、俺の言い方が悪かったかな。
どちらもポインタではあるといいたかっただけ。

俺が一番問題にしたいのは、本の記述と処理系の動作が違ってるのでは
ないかということ。
>どちらもポインタではあるといいたかっただけ
&aはポインタであると確定しているの?
321308:02/07/30 08:14
>>320
少なくとも「アドレス」とは言ってるな。あと、>>261のリンク先では
&a[0]等、「&なになに」をポインタと言ってる。
それに、「配列はポインタに置き換えられる」と言ってる場合のポインタは
右辺値のアドレスじゃないとおかしい。a[10]の時のaは左辺値では無いから。
ポインタの実装に関する規定は何ら無く、多くの処理系では直接アドレスを
割り当てているだけでは?つまり処理系依存
323308:02/07/30 08:18
>>322
その件はまた一つの議論になるし、処理系依存でも俺はアドレスと言ってしまっていいと思うが、
ここではそういう議論は置いといて、便宜上「アドレス」と読んで話しをすすめれば
いいんじゃないかな。>>261もそうしているようだし。
>>323
いいんじゃない?
どうした?つづけてください。
(長文かいていたらすまそ)
326308:02/07/30 08:29
とりあえず、俺は言いたいことは言ったよ。
俺の中では記述と現実が食い違ってるって結論だから、
返事待ち。
323で話を切ったのはそっちだよ。
俺の中では処理系依存である部分の違いを細かく追及することが無意味だって
結論です。
328308:02/07/30 08:34
>>327
だから、その話は関係ないのでは?それは表現の問題で、
>>300>>261はその問題を無視し(あるいは無視せず)、アドレスとして
話しを進めている。だから、それにのっとてここではポインタはアドレスと
して話を進めればいいのではないかって俺は言ってる。
で、sizeofの返す値の問題はまた別の問題だ。
この件について、配列のアドレスとポインタの関係は中核なんだが。
あなたが納得できない理由がそこにある。
fjくさいな
おわったか。
332308:02/07/30 08:43
>>329
もう少し詳しく説明してくれない?
>>300>>261も(便宜上?)アドレス=ポインタ(右辺値)としながら
話しを進めてると思うし、そうなってる以上、実際にアドレス=ポインタで
あろうとなかろうと、話には関係ないと思う。
333308:02/07/30 08:44
まとめると、

<現実(過去レスによるとbccらしい)>
1.左辺値pの時sizeof(p);は4
2.右辺値&aの時sizeof(&a);は配列のサイズ
<本の記述>
A.sizeof(配列)は配列のサイズ
B.配列とアドレスは別物(そうでないと記述に整合性が無い)
「便宜上」ポインタ=アドレスとするから、
>この規則は初心者を混乱させることがある
などという表記にいたる。
実際にはそうでないのだから。あくまで便宜上に過ぎない
335308:02/07/30 08:49
>>334
俺は便宜上に過ぎなくても関係ないと思うが。
じゃあ、ポインタが実際は「アドレス」じゃなくて、現実には「アドレフ」なるものだったと
すると(w、今までの話は「アドレス」を「アドレフ」に置き換えて話せばいいだけじゃない。
>>335
ちがうと思う。
便宜上の仮定を置いたために配列のアドレスに関して例外的条項が発生した。
これはよりおおきなルール(実際の仕様)に帰れば吸収される例外である。
アドレフってなんだ?名称の問題ではない。
337308:02/07/30 08:53
>>336
ん?例外的条項なんて事はとっくにわかってるよ。
で、その例外的条項を解説したのが>>300>>261なんだろ?
でも、その解説と現実が違ってるじゃないかということ。

あと、アドレフは適当ね。俺が勝手に作った言葉。
>>337
だから、解説は便宜上の仮定の下になされたものであるから、現実と違って
当然だ。それはここにおける便宜上の仮定が常には真でないことによる
339308:02/07/30 08:56
てか、「便宜上の仮定を置いたため」だとは思わないけどね。
それに、処理系依存でもなんでも数値で位置を表してたらなんでも「アドレス」だ
よ。OSの割り当てた物理アドレスと同じ数値じゃなかったとしてもね。
まあ、この二つの論点は今までの議論とは全く関係ないと思うけど。
>>339
>思わないけどね。
って根拠は無いのですか?(その後ろにそれに、と続いているから)
コンパイラを実装して多分見方が変わる。
そろそろ出かけねばならんので、早めに切り上げたい。
341308:02/07/30 09:00
>>338
ということは、「便宜上の仮定」なるもので話してるため、仮定と
現実とが食い違ってるってこと?
でも、その違いは関係ないように見えるんだけど。今回の違い
には影響ないと思うんだけど。sizeofの値の違いね。
どこがどのように影響してるんだ?これが判らないので詳しく解説してほしい。
それに、仮に影響があるとしても、そうなると、仮定のもとで説明するのは
間違いというか、問題があることになる。でも、仮定で説明しちゃってる。
どっちにしろまずい。
342308:02/07/30 09:02
>>340
便宜上の仮定を置いたためじゃなくて、それとは関係ない例外規則じゃない?
配列の先頭要素へのポインタに変換されない例を解説してるわけでしょ?
343308:02/07/30 09:02
>>340
というか、ここは2chなので切り上げてもらっても結構ですよ。
後でまた話すこともできるし、このまま放置するのも自由だし。
便宜上の仮定を正円とすれば、Cの仕様はそこからわずかに飛び出ている。
だが、その正円を超えた部分は極少しであるから通常は問題ない。
今回の件はたまたまはみ出した部分。すなわち自分が動的に配列を割り当てた
時に生じる先頭へのポインタに相当する静的な配列におけるそれがコード内
つまりプログラマが制御できる範囲内にないことに起因する
>>343
お言葉に甘えて失礼する
346308:02/07/30 09:08
>>344
なんか意味わからんけど、ポインタの値=アドレスという仮定には
関係ないように見えるね。
仮定が間違いだと言うなら、ポインタの値=何かの数値で良いんだろ?
これで文句ないだろ。
で「何かの値」と「配列」は別物なわけだ。
ところが、sizeof (&a)すなわちsizeof(何かの値)が配列全体のサイズを返してる。
これは一体どういうことなんだ?
記述では sizeof(配列)が配列全体のサイズなはずだったのでは?
質問
「配列への参照は、最初の要素へのポインタになる」
っていうのは、規格書のどこに書かれてるんですか?
sizeof(配列)が配列全体のサイズであることと、sizeof(&a)も
そうであることとは矛盾無いのに
349308:02/07/30 09:27
>>347
例外がいくつかあるらしいけど、ISO99の方だと、6.3.2.1の3に書いてあった。
>3 Except when it is the operand of the sizeof operator or the unary & operator, or is a
>string literal used to initialize an array, an expression that has type ‘‘array of type’’ is
>converted to an expression with type ‘‘pointer to type’’ that points to the initial element of
>the array object and is not an lvalue. If the array object has register storage class, the
>behavior is undefined.
これみると、本の記述じゃなくて処理系が違ってる?ように思えるが・・・
1993の方は持ってない。

>>348
なんで?右側はsizeof(ポインタ)じゃあないの?
350308:02/07/30 10:11
cygwinのg++使ったらちゃんとsizeof(&a)は4返した…
と思ったら過去ログにもそう書いてたったね。
g++と>>300>>261と規格書が正しくて、VCとBCCが間違ってると
すれば全てのつじつまが合う。。。
ていうか、もう俺はそうに違いないと確信しました。
規格書にあってないとすると・・・・
完全準拠は名乗れない!?
352308:02/07/30 10:59
あと、ISO99みると、&は「アドレスを返す」と明記されてるので、少なくとも
ISO99ではポインタはアドレスだな。
あと、「処理系にまかされてるから違う」って言うが、処理系がどんなめちゃくちゃな割り当てをし
ても、最低限、違うポインタを区別できるような値が割り当てられるわけだから、
「アドレス」と呼べるだろう。
ここでの「アドレス」はOSの割り当てた物理アドレスとは違って、もっと一般的な意味。
言葉の定義の問題。
>>352
ついでに教えてくれ、どこに書いてあった?
教えてクンですまそ
&a = ポインタ という大前提はどこに記述されてるのか教えちくり
355353:02/07/30 11:16
自分で調べる前に掻きこんじまった
すまそ

C99の6.5.3.2
3
The unary & operator returns the address of its operand.
If the operand has type ‘‘type’’ ,
the result has type ‘‘pointer to type’’.

長いので後は略
356デフォルトの名無しさん:02/07/31 06:13
保守保守ほほ
357デフォルトの名無しさん:02/07/31 07:59
aが配列なら。aと&aはまったく同じだろ。

>>300は、aまたは&aを&(a[0])と読み替えるシンタックスシュガーが
働かない条件だろ?
358デフォルトの名無しさん:02/07/31 08:16
>>357
全然違う。
aは配列型であって、これは例外を除いて最初の要素へのポインタへ変換される。
次に、&aは配列全体へのポインタ。最初の要素へのポインタとは型が違う。
>>300は前者の例外。
359デフォルトの名無しさん:02/07/31 08:19
>>357
>aまたは&aを&(a[0])と読み替えるシンタックスシュガーが
>働かない条件だろ?

これを言うなら、
「aを(&a[0])と読み替えることができない条件だろ?」となる。
ついでに、これはシンタックスシュガーではない。あくまで
aと(&a[0])は違うものであって、前者の型変換作業が行われ
て結果的に同じなる事が多い。
360学生:02/07/31 08:56
あの・・・
デフォルト実引数は関数の宣言・定義、どちらに書くべきでしょうか
>>357
112から読み直せ
宣言
363学生:02/07/31 10:10
>>362
ご返答ありがとうございました。
364デフォルトの名無しさん:02/07/31 12:25
コメントについて質問なんだけど

""の中で*/を使うとそこでコメントが終了してるみたいなんだけど。
どうなん?

[例]

/*
" */ "


>>364 そうなんよ なんや困りはりますえ?
366364:02/07/31 12:35
" // "
" /* "
は無効化されてるのに
" */ "
だけ有効になってるのってどう考えてもおかしいと思うんだが。

一気にコメントアウトしたときに
めっちゃ不便やん。

/*
....
cout << " */ "; //ここでコメント終了かよ
....
*/
367デフォルトの名無しさん:02/07/31 12:37
>>364
だってコメントの中の"〜"は文字列と見なされないし。
>>366 あんたはんちょかやな

コメントには /* */を使うのやえ コメントアウトは
普通 #if 〜#end でおすえ
369デフォルトの名無しさん:02/07/31 12:43
>>368
> #end

さらしあげ
370364:02/07/31 12:46
ようわからんが、
複数行に渡るコメント/**/
は""の中にあるかも判断すると
コンパイラ作るのが面倒になるから
単純に最初の*/で判定してるってことで納得しました。
371デフォルトの名無しさん:02/07/31 12:47
//a.h
#ifndef __A__
#define __A__
int getvalue();
#endif

//a.c
#include "a.h"
int getvalue() { return 0; }

//main.c
#include "a.h"
int main() {
return getvalue();
}

//makefile
main : main.obj a.obj
bcc32 main.obj a.obj
main.obj : main.c a.h
bcc32 -c main.c
a.obj : a.c a.h
bcc32 -c b.c

というふうなプログラムをコンパイルしているのですが、
main.c をコンパイルすると getvalue の宣言がないと警告がでます。
一応実行は出来るようですが、どうすれば出なくなるでしょうか?
372デフォルトの名無しさん:02/07/31 12:50
>>370
ちげーよ
/*が来るとその後に*/が来るまでは何がこようとすべてコメントとみなして"があっても文字列としてみないだけ。もちろんint i;とあってもそれは単なるコメントと見なす。
>>369 あんたはんはいけずや かなんわ

>>371 extern お使いやす
374デフォルトの名無しさん:02/07/31 12:52
>>371
とりあえずint getvalue();はint getvalue(void);にしろ
37511:02/07/31 12:52
>>366
なんだそりゃ!!!!
つまり"〜*/〜"は"〜*""/〜"と書けということか
コメントの中身を評価(?)されてしまったら困ると思うのだが・・・
377デフォルトの名無しさん:02/07/31 12:55
>>371
間違いはなさそうだが、とりあえずプリプロセッサにかけたものをみてみろ。
37811:02/07/31 12:55
>>372
なるほど、よく考えたら当然だ
379371:02/07/31 12:57
>>373-374
getvalue(void) に直したら extern を付けなくても警告が出なくなりました。
原因はよくわかりませんが。

どうもありがとうございました。
380364:02/07/31 12:57
>>372
ああ、なるほど!!
/* " */ "
先に/*があるから後の"が無視されて*/が文字列になってないのか。
381デフォルトの名無しさん:02/07/31 12:59
>>379
まじ!?
結構細かいんだね。BCCって。
プロトタイプの場合、voidをつけないと関数呼び出し時に引数リストをどんなものにしてもコンパイラがエラーを出さないからつけたほうがいいよ。
後の
~~~~?
>>371
C++ なら void 書いても書かなくても同じだと思うけど。
a.c/main.c か。
あと、__A__ とか、インクルードガードに _ 使う人多いんだけど、
いちおうダメだよね。
38411:02/07/31 13:01
>>381
それはCの場合でC++では空の引数リストはvoidと同じ
>>383
何がだめなの?
386デフォルトの名無しさん:02/07/31 13:02
>>384
.cだからCだとオモタ
38711:02/07/31 13:03
とおもったら>>371はCじゃん!!!1
>>384
いいかげんに名無しに戻ったほうがいいと思うよ。
389364:02/07/31 13:04
>>382
>後ろの"
/*の後ろの"
__で始まるのは処理系依存の識別子だっけ?
391383:02/07/31 13:05
>>385
予約されてる識別子。
392デフォルトの名無しさん:02/07/31 13:07
>>391
__FILE__とかか?
393デフォルトの名無しさん:02/07/31 13:08
float型の変数の値を標準出力に出力したいのです。
wsprintf でまず変換しようとしましたが、これは整数のみできないようなのです。
方法がありましたらお願いします。
394デフォルトの名無しさん:02/07/31 13:09
>>393
printf("%f\n",f);
これじゃだめなのか!?
>>393
std::cout << f << std::endl;
じゃないの?
396デフォルトの名無しさん:02/07/31 13:10
>>394
あ!できました。すごい!!
ありがとうございました。
>>396
あんたがすごいよ
39811:02/07/31 13:12
>>393
>>396
何がなんだか分からん!
399C厨:02/07/31 13:13
そういえばここってC++スレだったのね(^_^;)
ごめん。スレ立てるまでもない・・・スレかと思っていた。
C厨はこのスレに来ないで。。(;;)
お願い
401デフォルトの名無しさん:02/07/31 13:15
>>400
ごめん。本当にごめん。
402400:02/07/31 13:16
いや間違えただけならいいんだ。言い過ぎた。
C++でprintf使ったら駄目ってこと?
>>403
だめじゃない。でもC++らしくない。
>>404
でも
cout << "(" << number << ")" << endl;
っていうようなのはなんとなくダセエ
>>405
そゆときどうしてる?
>>406
fprintfを使っていマス
>>407
わしも。
409デフォルトの名無しさん:02/07/31 14:19
あるnamespace内にオーバーロードされた複数の同名の関数があって、
そのうちの片方だけをusingすることは可能ですか?
>>405 boost使います。
>>409
usingする方法は分からないのだけれども
インラインのラッパを用意してやれば片方だけ使えるようになるよ
>>411
ありがとう。
>>383
> あと、__A__ とか、インクルードガードに _ 使う人多いんだけど、
> いちおうダメだよね。
処理系が予約してるから、ね。俺は一度だけ、標準ヘッダのインクルードガードと
衝突して泣いた経験がある。

ただ VC++ みたく「処理系が勝手に _ 付きのインクルードガードをつける」場合に
は問題ないんじゃない? あれは重複しない文字列 (GUID) 使ってるし。
414デフォルトの名無しさん:02/07/31 14:56
float,doubleを最高の精度で
文字列にするにはどうすればいいのでしょうか?
ポータビリティ無視なら、BASE64とか使えばいいじゃん。
>>414
もとのデータはそんなに正確なのかい?
417414:02/07/31 15:10
精度指定はあとから考えようと思うのですが、
まず初めは
float -> string -> float
みたいな処理をしても
一致させたいのです。
>>417
なんでそんなことを?
>>417 それは原理的に>>415のいうようなバイナリのまま保存しなければ無理だと思うよ
420414:02/07/31 15:18
>>415〜419
ありがとう。がんばってみます。
421デフォルトの名無しさん:02/07/31 16:48
>>417
float の全ビットパターンについて
sprintf(buf, "%.15g", f1);
sscanf(buf, "%g", &f2);
assert(f1 == f2);
を試してみたことがあるが、NaN,Infを除いて一致したよ。
>float の全ビットパターンについて
スゲー、floatが32bitってことは43億通りになるんかいな?
なにがスゲーんだ???
たいして時間かからないでそ。
>>421
ビットパターンのセットってintとかからキャストしてぶっこむの?
425421:02/07/31 17:38
>>424
キャストで予期しない変換がおこると嫌なので、memcpy しました。
テストコードはこんな具合っす。

float f1, f2;
for (unsigned long u = 0; u != 0xFFFFFFFF; ++u) {
  int e = (u >> 23) & 0xff;
  if (e == 0 || e == 0xff) continue; // NaN or Inf
  memcpy(&f1, &u, sizeof(f1)); // f1 = *(float*) &u;
  sprintf(.... 以下 >>421 と同じなので略

PenIII 700MHz で2〜3日で終わったよ。
>>425
そんなにかかるのかー。一瞬自分もやってみようとしたけど
それを聞いておいて良かったw
427デフォルトの名無しさん:02/07/31 17:49
c++に標準で用意されているらしい
複素数ライブラリってどうやって使うんですか?
complexをincludeするんじゃないの?
429421:02/07/31 17:57
>>426
実際に試したのは sscanf ではなく istringstream 経由の
istream >> float なので、sscanf なら3日もかからず早く終わるかも。
試してみるなら、途中経過を入れておくと良いっす。
if (u % 0x10000 == 0) printf("%08lx,%g", u, f1);

430421:02/07/31 18:03
ちなみに >>425 のコメントは少々間違っていた。
e == 0 は 0 or Denormal です。
e == 0xff が NaN or Inf です。
423 :デフォルトの名無しさん :02/07/31 17:13
なにがスゲーんだ???
たいして時間かからないでそ。


SETI@home、UDはカレにおまかせ♥
なんで電気代を払ってまで奴らの金儲けに強力せにゃならんのだ
献血と同じで無意味だ
献血は無意味じゃねぇよ
>>433
献血も無意味だよ。
死ぬ奴は死なしておけば良いんだ。
>>434 それはそれなりの主張だと思うけど、
 その主張の先は、
 「じゃキミ生きてなくてもいいよ。キミが生きてる事は俺には無意味だ」
 とか「俺には迷惑だよ」となる
436デフォルトの名無しさん:02/07/31 20:04

 こ こ は C + + に つ い て

 相 談 す る ス レ で す 。
437デフォルトの名無しさん:02/07/31 20:09
なぜ下の条件がないと
f1≠f2
になってしまうのでしょうか?

int e = (u >> 23) & 0xff;
if (e == 0 || e == 0xff) continue; // 0 or Denormal or  NaN or Inf
438デフォルトの名無しさん:02/07/31 20:13
348も355もC++じゃなくってc99じゃねえか。
どっかにC++の規格書落ちてねえのかよ。
>>439
それはまずかないですか?
>>440
何故?
>>442
売り物じゃないの?
>>437
NaNもしくはInfの場合は、
f1==f2がfalseになるからではなくて?

ってかNaNかInfの時ってf1==f2はtrue?false?
どっち?
例外がでますた
数じゃないものを比較しちゃいけねえよ
NaNはデータベースでいうところのnullみたいなもんだな
C++の規格書にははっきりとはポインタがアドレスだって書いてないな…
しかし、allocation functionはアドレスを返し、返されたポインタがどうたら
と書いてあるところはある…。
アドレスとポインタを同一視してると思えるような文は所々にあるな。
>>448
なにがいいたいの?
>>449
ポインタはC++ではアドレスなのか。そうでないのか。
規格書の記述ではわかりづらいが前者のようだということ。
>>450
それが重要なの?
>>451
一応ね。人にポインタを説明する時に頻出事項だし。
ぜひ確認しておきたいことではあるね。

ただし、一般にアセンブラなどで使ってる「アドレス」とは
異なる意味でのアドレスだということは確かだな。
ポインタの値はimplementation-definedだとはっきり書いてあるし。
>>450>>452が矛盾してやしない?
>>453
いや、そう思いやすいかもしれないけど、そうではないと思う。
implementation-definedでかつアドレスなんだと思う。
勝手に処理系がつけた値を「アドレス」と呼んでしまえば、矛盾しない。
言葉の定義の問題だけど。
>>454
implementation-defined は、ようはどう定義しても間違いではないって
意味でしょ?例えば「aが整数だ」というルールがあったときに、
あんたはa=0だと主張しているに過ぎないんじゃない?
>>455
だから、もしも0という言葉が整数全体を表す言葉にも使える
ものだったとしたら(実際は違うけど)OKだよな?

あと、いくらimplementation-defined だと言っても
全く自由というわけではないぞ。当然他の規則と矛盾しない
ようにしなくてはならない。
仮定法過去だね。
>>457
そうだが。
いろいろな記述を見るに、アドレスはポインタだと考えないとつじつまが合わない。
決定的なのはさっきのallocation functionの記述。
それから、constやvolatileに関してはアドレスがポインタだと明記してある。
例えば、allocation functionの説明でもアドレスはポインタだとして
解説してるようだが、それ以外にもconstやvolatileに関してはアドレスが
ポインタだとはっきり明記してある。
この場合は確実にimplementation-definedで、かつアドレスなんだよ。
ん?なんか二度同じことを説明してしまった。スマソ。
460デフォルトの名無しさん:02/07/31 22:52
>>448
本当に規格書読んだ?
ISO/IEC 14882:1998(E)
5.3.1
2
The result of unary & operator is a pointer to its operand.
>>460
ん?その部分は勿論読んだぞ。
「&はポインタを返す」だろ。
でも、ポインタがアドレスとはその部分だけでは断定できまい。
「&がアドレスを返す」と書いてない以上。
まあ、&は「address-of operator」って名前らしいが…

しかし、それ以外のいろんな記述を見るに、アドレスがポインタらしいと
いうのが俺の意見。
462460:02/07/31 23:04
アドレスとポインタを混同してたわ。
46311:02/07/31 23:49
>constやvolatile(のT型)に関してはアドレスがポインタ
なだけでその他はそうであるとは限らない。ということだと思いまっせ。
>>463
文脈から見るに、その部分は「〜へのポインタ」という言い方をconstなど
に適用するとどうなるかを説明した文であって、そこだけアドレスがポインタ
だということを説明した文じゃないと思うわけよ。
それに、何度も言ってるように、他でアドレスとポインタを混同したような文がいくつもある。
比較的証拠っぽいのは14.3.2のプログラムのコメントとか、thisポインタが
アドレスだとかな。
46511:02/08/01 00:08
>>464
おおその通りだ。へたうった。例外はメンバポインタの場合だけだ
3.9.3.5 In this International Standard,
the notation {\it cv} (or {\it cv1}, {\it cv2}, etc.),
used in the description of Types,
represents an arbitrary set of cv-qualifiers,
なんとなく、ニュアンス的には、&aがアドレスなのは当たり前の前提事項だから、
適当にアドレスと書いたり書かなかったりしてしまってるように見える。
まあ断定は出来ないけど。
コピペできるpdfがほしい
>>467
% cp foo.pdf bar.pdf
できますが、何か? もしかしてパーミッションの問題か?
pdfコピペできるっしょ?
470 :02/08/01 02:07
>>468
コピーしているようにしか見えないが、どこでペーストしてる?
>>470
foo.pdf で取り込み(コピー)、bar.pdf で貼り付け(ペースト)では?

# cp コマンドで名前変えて連続コピーってできたっけか?
# シェルスクリプト書く方が早そうだけど
int *i;

int* i;
の違いって何ですか?
*の位置
474472:02/08/01 02:38
・・・・・。
475 :02/08/01 02:44
>>472
違いはない。書き手のセンスの問題。
int * i;
int/*
Accept: */*
i
;
478デフォルトの名無しさん:02/08/01 07:00
if (hoge) {

};

とかみたいにブロックの後に ; を付ける人が偶にいますが、
これってどうですか?
意図が見えない。
480488:02/08/01 08:40
漏れのアクロバットリーダーでは
テキスト選択のボタンが使えなくなってる。なんでだろ。
ちゃんと ISO+IEC+14882-1998.pdf を購入した人なら、>>2 にある
html版の Final draft を使わせてもらってよいんじゃないかな。
つーか、html 化された正式版仕様書ってないの?
ちなみに >>5 にある ansi_iso_iec_14882_1998.pdf は海賊版ぽい。
ダウンロードした人の話では正式版とはファイルサイズが異なるらしい。
(ΦωΦ)フフフ・・・・for_eachサイコー
>>481 プ
ISO/IEC 14882は 2.8M 2.1M の2つのタイプが存在するのを知らないのか?
それから、なぜ正規購入者でなければwebのFDを利用できないんだ?
頭に虫沸いてない?
>>483
> ISO/IEC 14882は 2.8M 2.1M の2つのタイプが存在するのを知らないのか?
うん、知らない。2.8M のやつってどこが配布してるの? 2.1M のやつとは
何か違いがある?

> なぜ正規購入者でなければwebのFDを利用できないんだ
FD って一般に公開されてなかったと思ったから。実際のところ、FDの
ライセンスはどうなってるの?

上記2点、よければ教えてよ。
俺のは2.72Mだが何か?
486デフォルトの名無しさん:02/08/01 15:39
structの使い方についての質問です。例えば、
struct A { int i; float f; };のようなstructを定義して、
これをmain()の中で、A *a=new a[10];(あるいは、A a[10];)
として、他の関数の中で使うには、その関数はどう定義
すればよいのでしょうか?void func(A* a[]){}ではダメでした。
ここでいうfunc()の中で、a[5]->iを使いたいのです。
よろしくお願いします。
487デフォルトの名無しさん:02/08/01 15:43
>>478
struct{
...
};
でセミコロンをつけ忘れないように普段から慣れさせておくため。
>>486
void func(A a[]) ;
とか
void func(A *a) ;
489486:02/08/01 16:09
自分で解決できました。この場合
void func(A a[10])でいいのですね。
490489:02/08/01 16:20
>>488さん、ありがとうございます。
そちらのほうが良さそうですね。
a[10]としてしまうのとどう違うんでしょうか。
491デフォルトの名無しさん:02/08/01 16:29
何故あなたはC++を使うのですか?
>>490
結果に違いはないです。 ないからわざわざ10と書くこたな(略
493初心者:02/08/01 17:00
ないなら別に10と書いても(略
2文字余計にタイプするだけで指が疲れる。。
>>494
そんなこと言ったら、2chに書き込む方がよっぽど指が疲れるYO!
つか、10個の配列だよ、と断りを入れておけば、9個しか用意しないで呼び出したやつに文句(略
っていうか、C++なんだからvector使えYO!
>>493
C, C++ だと仮引数の配列はポインタに縮退するから、わざわざ a[10] と
書くのは

 誤解を助長してる

としか思えんなぁ。だいたい要素数 10 個の配列にしか適用できない関数って
時点で、何か間違ってるような気がする。

俺なら

1. 構造体にして、そのポインタを引き渡す
2. 要素数も同時に引数として渡す or vector 使う
3. 番兵を使う

どれかにするけどな。
499デフォルトの名無しさん:02/08/01 19:34
C++初心者です.RECT構造体についての質問です.
RECT myrect;
---------------------------------------------------
myrect.top = 0;
myrect.left = 0;      問題はこの部分です
myrect.bottom = 100;
myrect.right = 100;
---------------------------------------------------
CreateHatchBrush(HS_CROSS,GetSysColor(COLOR_WINDOW));
FillRect(hwnd,&myrect,hbrush);
のようにして,ウィンドウの任意の領域を白紙に戻したいのですが,
RECT構造体(myrect)の(座標の)初期化がうまくいきません.
GetClientRect(hwnd,&myrect);
として座標を取得するしかないのでしょうか?
また,任意の領域を白紙に戻す方法でもっと良い方法があるんでしょうか?
よろしくお願いします.
500かかし:02/08/01 19:46
あの相談したいことがあるのですか、
ここの掲示板に書くことではないと思うのですがどこに書けばいいか
分からないのでアドバイスをお願いします。

「DevelopperStudio」とは、何のことでしょうか?
探してもさっぱり  (+_+)
皆さん!!この件に関して知っていることがあれば
メールかRe>でお願いします。

@かかし
Developper Studioは探しても見つかりません。
Developer Studioを探して下さい。
502499:02/08/01 20:44
解決しました.

RECT *root;

void Draw(void)
{
RECT *p = new RECT;
p->top = 0;
p->left = 0;
p->bottom =100;
p->right =100;
root = p;
}
とする事で代入できました.
ポインタを使ってしかメンバには代入できないのですね.
Cでは
RECT myrect;
のように構造体myrectを宣言すれば myrect.メンバ名
もしくは、myrectを指すポインタ->メンバ名
でアクセスできたのと思うのですが.
newもしくはmallocを使ってポインタの指す構造体を直接作らないと
いけないんですねえ.
間違いがあれば指摘お願いします.
&a で渡して、A(*)[10] 型で受け取るようにしたらどうだろう。
要素数を間違えて渡したらコンパイル時に型不一致で引っかかって
くれる。
>>499>>502
いってることがよくわからないんだけど…。
RECTみたいな単純な構造体メンバへのアクセスって別にCもC++もかわらないよ?
505デフォルトの名無しさん:02/08/02 00:23
メンバ関数のポインタを使ってメンバ関数を呼び出そうとしているのですが、
class Base {
 void Function();
void Main();
 void (Base::*funcPtr)();
};
void Base::Main() {
 funcPtr = &Base::Function;
 (*funcPtr)(); // ここでエラー
}
としても
error C2171: '*' : 'void (__thiscall Base::* )(void)' のオペランドが無効です。
error C2064: 関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。
とエラーが出てしまいます。
メンバ関数を呼び出す際は何か特別な構文などが必要なのでしょうか?
>505
(Base::funcPtr)();
とか
>>505
インスタンスを与えればよい。

class Base {
void Function();
void Main();
void (Base::*funcPtr)();
};
void Base::Main() {
Base b;
funcPtr = &Base::Function;
(b.*funcPtr)();
}
>>506
コンパイル通らないっすよ。
(this->Base::*funcPtr)()
510506:02/08/02 00:35
>508
コンパイルは通った。リンクで引っかかるんだろ
つか、厨でした。逝ってきます
>>510
うーんコンパイラによるような。
BCC5.6だとコンパイルエラー。「メンバポインタの不正な使用」だとさ。
>>509
なるほど。その手があったか。
512506:02/08/02 00:41
むう......うちのgccだと509がコンパイルエラーになる......何故?
>>505

class Base {
void Function();
void Main();
void (Base::*funcPtr)();
};
void Base::Main() {
funcPtr = &Base::Function;
(this->*funcPtr)();
}
51411:02/08/02 00:49
>>512
わざわざ指定するなら当然
(this->*Base::funcPtr)()
515506:02/08/02 00:54
>513
>514
Oh!イケたよ!(コンパイルだけしか試してないが)
せんきゅう!
しかしなんでthis->が要るのかな?
「->*」「.*」が演算子なんだよな?

>>514 意味わかんない。
「->*」「.*」が演算子なんだよな?

ちゃう
518513:02/08/02 00:59
Function宣言しかしてないやん…。。。
なんでリンク時にエラー吐くのかと思ったYO!

thisが必要なのは、関数ポインタは暗黙のthisが使われないとかなんとか。
519506:02/08/02 01:00
>517
ん?あってるっしょ?「->*」「.*」で単独の演算子として優先順位と結合性が定義されてるみたいよ?
52011:02/08/02 01:01
>>516
>>506>>509で困ってるようだったから

>「->*」「.*」が演算子なんだよな?

そう
521506:02/08/02 01:02
>518==513
そうなのれすか。ややこしいなあ
メンバ関数へのポインタは通常の関数のポインタとは意味が違って、
単なるオフセットなのだそうだ。
だからインスタンスなりthisなりの実体を渡さないとコンパイルでき
ないのでは。
523505:02/08/02 01:03
>>506-518
ありがとうございます。
funcPtr = &Base::Function;
でいかにして現在のオブジェクトのメンバであるかを表すのか
ということを考えていたのですが、ご指摘の通りthisポインタで
指定するということで解決することが出来ました。
本当にありがとうございました。
524506:02/08/02 01:14
>522
???だったらメンバ変数と一緒じゃない???
あれ?なんか激しく勘違いしてるのかな?ごめ、もっとC++勉強してきます.....
>>522 ダウト
526505:02/08/02 01:19
>>519
>>522
この関連記事だけで知らないことが2つも。
とても勉強になります。

そこまで詳しくC++の内側まで書いてある本は
どのような物があるのでしょうか?
52811:02/08/02 01:23
virtualな関数へのポインタはどういう実装が考えられる?
>>528 意味わかんない。
530506:02/08/02 01:31
>528
フツーにインスタンスごとに関数ポインタ保持、じゃダメですかね?
ところでメンバ関数ってインスタンスごとに生成されたりしないよね?それともこの時点で間違ってる?
53111:02/08/02 01:33
うっひゃ〜〜〜〜〜
メンバ関数ポインタは12byteもあるのか。
上のほうでウソ書いちゃったな。ごめん

>>529
こういうのどう解決してるのかな〜と思って
#include <iostream>

struct A { virtual void f(void) { std::cout << "A" << std::endl ;}} ;
struct B : A { void f(void) { std::cout << "B" << std::endl ;}} ;

int main() {
A a, *p ;
B b ;
void (A::*f)(void) = &A::f ;

p = &a ;(p->*f)() ;
p = &b ;(p->*f)() ;
return 0 ;
}
532 :02/08/02 01:41
>>531
> メンバ関数ポインタは12byteもあるのか。

実装によるだろ。VC++は4byteだし。

> こういうのどう解決してるのかな〜と思って

VC++の場合だと、void A::__call_f() {f();} のような関数を
勝手に作るみたいだ。
>>531
仮想関数の場合、BCCでコンパイルしてTurbo Debuggerで中身を
覗いてみたら、インスタンスの生成時にメンバ関数へのアドレスを
保持しているみたい。
534デフォルトの名無しさん:02/08/02 01:50
struct cls {
 int f();
 int f() const;
};
cls c;
main() {
 c.f(); /***/
}

/***/のところでconstのほうを呼ぶ方法ありますか?
53511:02/08/02 01:53
>>532
>実装によるだろ
ハハハ、そんな当然のこと書かんでもいいって

>void A::__call_f() {f();}
なるほどね〜。それは簡単だ

>>533
仮想関数テーブルのこと?
>>534
struct cls {
void f() { cout << "f()" << endl; }
void f() const { cout << "f() const" << endl; }
};

cls c;
const cls cc;

int main() {
c.f();
cc.f();
}
>>535
ははあ、これが仮想関数テーブルなのでしょうか。Aのインスタンスには
一つ、Bのインスタンスには二つのアドレスを代入しています。
538 :02/08/02 02:07
>>534
static_cast<const cls&>(c).f();
539534:02/08/02 02:09
>>536
ねた?非constオブジェクトから呼ぶには?
>>538>>539
struct cls {
void f() { cout << "f()" << endl; }
void f() const { cout << "f() const" << endl; }
};

cls c;
const cls cc;

int main() {
c.f();
const_cast<const cls &>(c).f();
}

でもよいようだ。
const_castじゃないの?
542534:02/08/02 02:11
>>538
やはりキャストかconstとして他の関数に渡すしかない?
543デフォルトの名無しさん:02/08/02 02:11
>>537
なんかよくわからんな。bccは

>>534
じゃあ、私もねたを一つ
(c.*(int(cls::*)()const)&cls::f)();
初めてconst_castの使い方がわかったよ。

int main() {
c.f();
const_cast<const cls &>(c).f();
cc.f();
const_cast<cls &>(cc).f();
}
>>543
多分、BをAにダウンキャストした時にAのメンバ関数が正しく呼ばれる
ようにアドレスを二つ代入しておく必要があるのでしょう。

それと、そのキャストすごいですね。
>>534
int f(); のほうを別の名前にしてください。

同じ名前なのに自然に使い分けれないって状態が問題だと思うんだけど、どうよ。
547534:02/08/02 02:19
>>546
実際は
iterator begin();と
const_iterator begin() const;
なのよ・・・。
>>546
これは関数の多重定義になっているみたいですね。呼び出す
インスタンスがconst型かそうでないかで呼び出す関数が変わる
ようです。
iteratorからconst_iteratorへの変換は必ず存在するはずだが
>>549
Effective STLのP114、第4章に、そのような内容の事が書かれています。
>>534
というわけで、なぜconst_iteratorがほしいのか、
もうちょっと状況を説明してみて欲しいのです。
552534:02/08/02 02:32
>>549-550
サンクス、しらなんだ。
自作のhash_mapだったので・・・。
>>551
const型のコンテナにinsertやeraseを適用できるとまずいからでは?
>>553
コンテナがconstなら、もとからconst_iteratorしか取り出せない。
ん?const型のコンテナって、container<const T>って話?
そんなコンテナ作れるの?
>>554
もとい、コンテナをconst型であるかのように取り扱うと言い直します。
container<const T>は無理です。
556デフォルトの名無しさん:02/08/02 04:38
valarrayってどう?
>>556
そう言われてみれば、使ったこと一度もないな。何に使えるんだっけ。
>>557
valarray<int> a; で a+=2; とやると、aのすべての要素に +=2 を
してくれるらしい。
>>558
面白そう。かけ算とかは簡単に出来るのかな?
行列として。
valarrayで行列の積って具体的にいい記述の仕方あるのかね?
561デフォルトの名無しさん:02/08/02 17:40
例外処理のコストを気にしますか?
>>561
コストが問題になるときだけ気にします。
ほとんどの場合、気にならない。
>>562
コンストラクタ内での例外を避けるために、コンストラクタは静的な
初期化しかさせずにCreate()とか戻り値を返せる普通のメンバで
リソース等の動的な獲得をするのって、設計的に良くないですかね?
valarrayのslice, gsliceの使い方がよくわかりません。

これらを使うと、多次元配列として扱えるようになるらしいのですが。
566デフォルトの名無しさん:02/08/02 22:20
おまえらちゃんと例外をキャッチしてますか?
sageでなくてもOK・・・?
ビルドした実行ファイルのアイコンを任意のものへ変更したいです。
リソースファイルは作成出来ます。
その後はどうすれば・・?
ソースファイルと同一ディレクトリに置いてビルドしても反映されないのですが・・・
参照出来るログは「アイコン」で検索しました。
MSのVC++を使用しています。
>>567
スレ違い
>>568
なぜ・・?
>>566
してない。異常終了してから考える。
>>566
投げない。
>>564
ストラウストラップ御大の言葉、「リソースの獲得は初期化」って言葉は知らんのかな?

コンストラクタでリソースを獲得して、デストラクタで解放する。そうすることで、
オブジェクトの生存期間とリソースの生存期間が一致するから、
リソースリークを減らせる。Create()で獲得してDestroy()で解放するような
機構だと、そのオブジェクトの機能を使う前にCreate()を行うことをプログラマが
保証しなくちゃならん(さらに、終了前にDestroy()を行うことも)けど、コンストラクタと
デストラクタなら、コンパイラが自働的に保証してくれる。

例外を避けるためにコンストラクタでリソース獲得をしないってのは、はっきり言って
本末転倒。コンストラクタでエラー報告をするために例外はある、ってのはさすがに
言い過ぎだろうけど、コンストラクタの例外を避けることのメリットはほとんど無いぞ。

って、ここまで書いて気づいたが、>>564はそれを知った上で、敢えて質問してるのか……?
だとしたら、俺個人としては、例外が使えないコンパイラで仕事をしなけりゃならん、
という状況でしか、そう言う設計はしない。


>>566
栞「たまにしか出ないから、例外って言うんですよ」
まあネタは置いといて。bad_allocはほったらかしかなぁ。bad_allocが来ても、
メモリがない状況でどんな対処すりゃいいのかわからんし。それ以外の例外は
キャッチして処理してるけど。
例外に何を投げる?
空っぽのクラス?
文字列?
enum?
std::runtime_errorか、それの派生クラス
575反goto原理主義者:02/08/03 00:45
大域脱出に例外送出を使うのはアリですか?

try {
 while (hoge) {
  while (fuga) {
   if (monyu) {
    throw false;
   }
  }
 }
}
catch (bool) {}
>>575
いやぁぁぁ!
>>575
多分速度が遅い。gotoの方がいいと思う。
>>575
文脈で決める
>>564
漏れは、とりあえずコンストラクトは完了させる。コンストラクタの中で
エラーが発生したときはエラーフラグを立てて以降の処理を中断する。
インスタンスを生成したあとにエラーフラグをチェックして、エラーなら
即 delete。デストラクタでは、コンストラクタで構築が完了したものに
ついてのみ破棄。
bcc5.6で浮動小数演算オーバーフローすると
プログラムが止まるんだけど普通?
(処理は戻ってこないし何のエラーも表示されない)
>>580
スレッドがクラッシュするぞ。

#include <iostream>
#include <exception>
using namespace std;

int main()
{
double d = 0.0;

try {
while (true) {
d += 1e308;
cout << d << ' ';
}
}
catch (const exception &err) {
cout << "overflow occured." << endl;
}
}
582デフォルトの名無しさん:02/08/03 05:05
COMの質問になります。環境はVC6.0で、C++初心者です。

http://www8.plala.or.jp/nitoyon/download/iwebbrowser2.lzh
このソースを基に、IEコンポーネントではなくShockwaveFlashコンポーネントを使用したいのです。
CComPtr<IShockwaveFlash>と出来れば良いのですが、IShockwaveFlashの定義は無いんですね。

それで、このIShockwaveFlashの定義はどうすれば良いのでしょうか?
自分で適当に定義してしなければならないんでしょうか・・。
COMについてよく理解出来ていないのですが、どうか御教授お願いします。(__)


あと、これは良く分からずにやってみたのですが。
typedef int (*flash_play) (int);

longpunkIE[256];
(flash_play)( ( 4 * 28 ) + &punkIE); //メソッド28番が playメソッド
なんて、直接メソッドのポインタを指定すれば動くかナァ、と思ったのですが
やはりそう上手い具合にはいかなくて強制終了が出ちゃいますでした。(;゚∀゚;)
というか、本人がナニをやっているのかよく分かっていなくてアレなのですが・・。

もしよろしければ、このvtableを用いたやり方?も御指導頂ければありがたいです。
583582:02/08/03 05:13
ああう。下のソース、間違えてるはタブも省略されちゃう罠で・・すいません。

こちらと読み替えてください。(__)
typedef int (*flash_play) (int);

flash_play   play ;
long      punkIE[256];

play = (flash_play)( ( 4 * 28 )+ &punkIE);
(play)(&play);

(・ω・`)
584デフォルトの名無しさん:02/08/03 09:10
このスレでいいのかわかりませんが、

Lapack++ をWindows環境にインストールしたいのですが
どうすればいいのでしょう?
Unix環境でのインストール方法ならNETに書かれているのですが。

コンパイラとしてはBorlandのフリーのを使ってます
>>584
ソースをDLして中身を見てみたが、特に変なことさえしてなければ、
各ディレクトリのmakefileをBCC用に書き換えれば行けそうだ。
>>583
俺もわからないです(_ _)
587デフォルトの名無しさん:02/08/03 12:37
>>585
makefileを書き換えるってどういうことっすか?
その名のファイルが存在することは承知してます
>>582
COMの基礎とvtableのVC++での実装を勉強するか、
あるいはCOMを「単に使う側」としての使い方を勉強するか
どっちかをまずやれ
>>582 多少遅くなるけどIDispatchから呼び出すか、
IShockwaveFlashをIDLから作れ

なお、スレ違い発言だが、初心者なら VC6を無理に使うより VBか Delphiで呼ぶ方がいいだろう
VBならIDispatchから Delphiなら両方の方法を使って呼び出せる
>>581
やっぱりそうか。エラーメッセージが出ないから
バグがどこにあるか分からなくて困ったよ
>>587
元々のmakefileがLinuxを想定して書かれているので、例えば
オブジェクトファイル名の拡張子が .o で終わるなど、このまま
ではWindowsでコンパイルできない。

またシェルコマンドとして rm が使われていたり、出力ファイル名
として a.out が使われていたりする。これらを .obj や del など
で置き換える必要がある。

ということ。

それから、Linuxのシステムコールを使っているファイルがある
ので、それも Windows用に書き換える必要あり。
浮動小数点数の文字列変換について。
Windowsでは_gcvt()などがありますが、
UNIX系ではなにがあるんでしょうか?
sprintf














逝ってきます
>>593
それだとstdio.hをインクルードしないといけないですよね。
iostream.hとstdio.hを一緒にインクルードすると実行速度が
落ちるというような話を聞いたのですが本当でしょうか?
#include <sstream>
std::ostringstream ostr;
ostr<<"おっぱい:\t"<<3.14;
cout<<ostr.str()<<endl;
>>595
VC6.0でコンパイルしたら、
error C2679: 二項演算子 '<<' : 型 'class std::basic_string<char,struct std::char_traits
<char>,class std::allocator<char> >' の右オペランドを扱う演算子は定義されていません。
(または変換できません)(新しい動作;
というエラーがでました。
597デフォルトの名無しさん:02/08/03 19:05
>>591
レスありがとうございます
なんとなくわかりましたが現在の知識では
どうにもなりそうにありません

このへん読んどけみたいなHPとかありますか?
たびたびすいません
598デフォルトの名無しさん:02/08/03 19:27
テンプレートに関して質問があります。
以下の文がg++(2.95)ではコンパイルが通らないのですが(VC.NET+STLport4.5.3はOK)、
何が悪いのでしょうか?エラーメッセージには
'template parameters not used in partial specialization'
とありますが…。

template<typename T, typename U>
struct Base {
 template<typename V> struct traits {};
 struct traits<T> { typedef T value_type; };
 struct traits<U> { typedef U value_type; };
};
VC++6で通ったYO!
600598:02/08/03 21:22
>>599
いや…そこをg++でなんとか…。
何がしたいのかイマイチ分からん
traits<typename T>
603598:02/08/03 23:02
>>601
Baseクラスが持つ2つのコンテナを統一的なインターフェースで
処理する関数を書きたいのです。つまり

//---------------
template<typename T, typename U>
struct Base {
 std::vector<T> mTList;
 std::vector<U> mUList;

 template<typename V> struct traits {};
 struct traits<T> { typedef MyIterator<T> iterator; };
 struct traits<U> { typedef MyIterator<U> iterator; };

 MyIterator<T> begin(T) { return mTList.begin(); }
 MyIterator<T> end(T) { return mTList.end(); }
 MyIterator<U> begin(U) { return mUList.begin(); }
 MyIterator<U> end(U) { return mUList.end(); }

 template<typename V, typename W)
 void func(void) {
  for (traits<V>::iterator i=begin(V); i!=end(V); ++i) {
   W()(i); // 処理
  }
 }
};

Base<TypeA,TypeB> x;

x.func<TypeA,MyOperation>();
x.func<TypeB,MyOperation>();
//---------------

こんな感じで…。

>>602
4-5行目のstruct traits<T>をstruct traits<typename T>にせよということでしょうか?
文法エラーが出ました…。
604582:02/08/04 00:37
>>588
>>599
様、どうもです。(__)

IDispatchは知らなかったです。
お蔭様でhttp://www.hcn.zaq.ne.jp/no-ji/reseach/990905.htmを発見しますた
何か糸口が見えたような気がします。

VCですが、あるアプリケーション用のDLLを作っていたので、
どうにもそれに規定されていて、VCを使うしかなかったんです。
また、個人的なアプリケーションを作るときにDelphiを学んでみようと思います。

どうもありがとうございました。
>>604
そのページ結構痛い
http://www.hcn.zaq.ne.jp/no-ji/reseach/20011008.htm
>私の普段の頭の中はオブジェクト指向になっているのですが
とか。
606デフォルトの名無しさん:02/08/04 02:06
union AAA{
     struct INA{int a;INA(int val){a=val;}};
     INA ina;
     AAA(int a):ina(12){}
};
structなら通るのにunionだとエラーになるのはどうしてなのでしょうか?
さっぱりわかりません。
>>606
なんでunionにしたいのかがわからん。
ネタはsageでな
>>606
そりゃ当然。共用体はメンバ関数を持つことはできない。
610デフォルトの名無しさん:02/08/04 02:28
>>609
union AAA{
    void func(){}
};
がダメだということですか??

ネタじゃないやい。・゚・(ノД`)・゚・。
>>610
そうですダメです。
>>610
これが限度
struct AAA{
union {
struct INA{int a;};
INA ina;
} ;
AAA(int a){ina.a=12;}
} ;
613デフォルトの名無しさん:02/08/04 02:39
union AAA{
void func(void){cout<<"union"<<endl;}
void func(int a){cout<<a<<endl;}
};
void main(){
AAA aaa;
aaa.func();
aaa.func(12);
}
エラーにならずに走るんですが・・・?ルール上ダメということなのですか?
struct INA{int a;INA(int val){a=val;}};
これ(コンストラクタの宣言されたクラス)が
unionのデータメンバになれない。
>>613
C++第3版§10.4.12によると、共用体はメンバ関数を持つことが
できるそうだ。但し静的なメンバは持つことができない。

コンストラクタやデストラクタまで持つことができるように書いて
ある。
もとい。コンストラクタやデストラクタは持つことができない。
>>606をclでコンパイルしたら
error C2620: union 'AAA' : メンバ 'ina' でデフォルト コンストラクタが用いられ
ています。
って。
>>617
コンストラクタを取ったらコンパイル通らない?
今のねたって、できたとして、誰か実際に使うの?
共用体のメンバがデフォルトコンストラクタを持つことが出来ない
621デフォルトの名無しさん:02/08/04 09:09
>>572
でも、配列やコンテナに突っ込みたい時もあるから、
コンストラクタでもメンバ関数でも初期化出来るように
する方がいいと思う。Destroy()でなくデストラクタ
で解放する形で書くと、デフォルトコンストラクタでも
一定の初期化コード(ポインタに0を入れるとか)を実行
する必要が出て来て、多少の無駄は生じるけど。
>>603
template<class V> struct traits { typedef MyIterator<V> iterator; };
で駄目な理由が分からん。
同じ関数が使う場所(プログラムの中)によって
結果が異なるというバグに悩まされてます。
なにか原因は考えられますか?

構造体のポインタを受け取って、その構造体に
処理を施すvoid型関数なんですけど・・・。
void型関数って何?
戻り値の型がvoidって事?

>使う場所によって 結果が異なる

どこかでスタックを壊している
>>623
もらって来た構造体の中身によって、バグが顕在化したりしなかったり
するとか、グローバル変数の影響を受けているとか、単にヒープが
壊れているとか、気付かないうちにオーバーロードしているとか。
>>624
そうです。戻り値の型がvoidってことです。
使い方が間違ってました、すみません。

>>624-625
どうやったらスタックとかヒープを壊せるんですか?
それってハード的なことではないのですよね。

グローバル変数については大丈夫だと思います。
オーバーロードについては調べてみます。
>>625
スミマセン、この場合のオーバーロードって
どういう意味ですか?
意図しない関数が呼ばれていること、ぐらいの意味ではないかなあ
メソッド名の隠蔽のルールは意外に複雑なので注意したほうがいいッスよ
>>626
ポインタがらみのバグがあれば、メモリのどこかに変なデータが
書き込まれる。たいていデータを書き込むのはスタックかヒープ
だから(と言うかそれ以外の所に書き込むと大抵OSが異常終了させる)
「スタック|ヒープが壊れる」と表現する。
630 :02/08/04 12:44
>>623
初期化していない変数を使ってるんだろ。
あるいは配列の外にアクセスしてるとか、静的変数やグローバル変数を関数ないで
使ってるとか
632623:02/08/04 15:48
みなさま、レスありがとうございます。

>静的変数やグローバル変数
静的変数は使ってません。グローバル変数は
const unsigned char を関数内部でいくつか使ってます。

ただいまいろいろ調査中です・・・。
うう、すんません、ageちゃいました。
どうでもいいが、C++ライクなキャストをしたことがない。
(foo*)と(foo*)(void*)が違う値になったりするから、
恐くてCスタイルキャストは使えない。
まあsignedの取り外し程度なら安全だろうけど。
static_cast<foo*>(bar)

static_cast<foo*>(static_cast<void*>(bar))
>>635
まじですか?怖っ
638572:02/08/04 23:58
>>621
『コンテナ』が、std::vectorやstd::listやらのことを指してるんなら、
こいつらは、標準の規定ではデフォルトコンストラクタを必要と
しなかったはずだよ。
配列の場合は、数が少ないなら Hoge array[] = {'a','b','c','d'};
って初期値を与えればいいだけだし、そもそも配列を使う状況なら、
たいていはvectorにしておけば代用可能だし。
コピーコンストラクタが初期化関数よりもコストがかかりすぎるのなら、
コンテナはインスタンスへのポインタを持つようにすればいいし。
その場合も、管理の手間を切り離すために、スマートポインタにして。

まあ、俺としては、『デフォルトコンストラクタ+初期化関数』
なんてのは不要(というか、やってはいけない設計)だと思ってるから、
こういうのを駆使して、デフォルトコンストラクタを使わなくてもいいように
してる。『コンパイラが保証してくれる』っていうメリットを、最大限に
享受したいから。

ん? 今ふと思ったけど、コンストラクタが2つ以上の引数をとる場合、
配列の初期化ってどうやるんだろう……? 誰か教えてちょ。
>>638
std::vector<Foo> v(3);

// v[0], v[1], v[2] には何が入る?
640572:02/08/05 13:34
>>639
それは、プログラマが「デフォルトコンストラクタでインスタンスを3つ生成してくれ」
ってコードを書いてるから必要になってるだけ。その場合はデフォルトコンストラクタを
用意しなきゃならないのは当たり前でしょ。プログラマの方から、そうしてくれと
頼んでるんだから。
vector自身は「デフォルトコンストラクタを持っておけ」なんて要求をしてはいない。
上のコードは、プログラマがその要求をしただけ。
(説明が下手でスマヌ。More Effective C++ の項目4を参考にしてくれ)

で、話を元に戻すけど。結局、俺が言いたいのは、>>621
>でも、配列やコンテナに突っ込みたい時もあるから、
>コンストラクタでもメンバ関数でも初期化出来るように
>する方がいいと思う。
に関する意見。この書き方だと、>>621は「後で誰か(本人も含めて)がこのクラスを配列や
コンテナに入れたがるかも知れないから、その為にデフォルトコンストラクタを用意しておくのが
良い設計なんじゃないか」ってことを言いたいんだと思うけど。
俺は、それは違うと思う。>>638で書いたとおり、配列もコンテナもデフォルトコンストラクタが
必要、と言うわけではない(←部分否定)。だから、配列やコンテナの事を考えてデフォルト
コンストラクタを用意しました、ってのは「クラスの良い設計」として意味のあるパラメータでは
ないと思う。
そうすると、
・引数つきコンストラクタで、コンパイラが初期化の保証してくれるクラス
・デフォルトコンストラクタ+初期化関数で、プログラマが初期化の保証をするクラス
では、上の方がいいんじゃないかと思うんだけど。どうよ?
(反論のネタとしては、>>561-564の「例外処理のコスト」あたりかなー)
641デフォルトの名無しさん:02/08/05 13:56
例外処理ってどんぐらい高いの
上の方に大域脱出に thow を使うって例があったけど、
goto に比べて 100 倍以上重かった。
643デフォルトの名無しさん:02/08/05 14:14
そもそも例外ってどういう処理になっているの?
goto
Cにあるgetopt.hと同じようなものはC++にはある?
それともC++でもgetopt.hを使うのか?
自分で探してみても自作getopt.cppとかにしかヒット
しないんだよ。
なかったら自分で作るからいいんだけど。
誰か知ってる人いたら教えて。
646645:02/08/05 14:55
書き忘れた、Linuxのgcc 2.9.5。
コンストラクタで例外発生させると、発生後のオブジェクトの状態がわけ分からなくならない?
>発生後のオブジェクトの状態がわけ分からなくならない?
そうならないように、例外が発生したら
それまでコンストラクタ中で確保したリソースを全て開放してから
死ぬように作っておかないといけない。
Derive *d = new Derive();
で例外ったときに、単純にdelete dで後始末できるのかなあという疑問。
例外がBaseのコンストラクタで起きていて、Derive固有のメンバ変数が未初期化の状態だったりすると、
変な動作しそうじゃない? その回答も>>648に含まれているのかもしれないけど、よく分かんない。
Derive() {
 try {
  リソース確保
 } catch ( ) {
  リソース解放
  throw
 }
}

こんな感じ?
651649:02/08/05 16:15
「プログラミング言語C++(第3版)」を斜め読みしたところ、P430に例が載っていた。
基底クラス群の初期化の途中で例外が発生したら、
成功した分だけ暗黙にデストラクタが呼び出される(ように作る)
ってことで合ってる? なるほど・・・。
>>644
それだけだと、

 スタックの巻き戻し(一時変数のデストラクタ呼び出し)
 対応する catch を見つける

なんつー処理ができない。もう少し面倒だよ。
>>651
Yes

コンストラクタ中で例外が発生すると、対応するデストラクタが呼ばれないから、

 自前で try - catch を書く
 auto_ptr などのスマートポインタを使う
 メンバ変数の初期化を使う

いずれかで対応する。
例外として(藁
newに失敗したインスタンスのdeleteは不要。
655デフォルトの名無しさん:02/08/06 01:05
標準のストリームクラスで、

istream.read(buffer, offset, streamsize) ではなく
istream.read(buffer, streamsize)

という形式になっている理由がわかりません。

ストリームの使用者は
ランダムアクセスよりも順次アクセスの頻度が高いと仮定して、
後者の性能を高めるためでしょうか?
>>655
ランダムアクセスしまくりたいの?
>>655
ランダムアクセス出来ないデバイスを抽象化しやすいようにするため
658デフォルトの名無しさん:02/08/06 05:45
もしよかったら、どなたかこの板で編み出されたVC6で通るtypelist.h等を
わけていただけませんか?
659質問小僧A:02/08/06 16:19
今C++勉強中で、ある程度ソースかけるようになりました。
簡単なリスト作成ツールなどをせこせこ作って自己満足してますw
で、今作成したプログラムはDOS窓で動くんです。
それをwindowsの窓で動くプログラムにしたいのですが、なにからはじめればいいでしょうか?
参考書、やり方などなんでもいいので、教えていただけないでしょうか?
>>659
「猫でも」
661質問小僧A:02/08/06 16:36
>>660
そこは無論聞く前に見て、勉強しました。
ですが、いまいちしっくりこないというか、微妙な感じというか・・・
>>659
C++BuilderかC++.NET買え。
それ以外の方法は効率が悪すぎる。
所詮Winだから・・・・。
664デフォルトの名無しさん:02/08/06 16:44
>>659
環境ぐらい書かないとアドバイスしようがない。
       /■ヽ
      (´Д`)
  (( ─━OO━─ ))
        ∪∪
666デフォルトの名無しさん:02/08/06 17:02
>>659

「プログラミングWindows」を読む。
それで難しいと感じたら、C++ Builderでやってみる。
>>658
http://www.42ch.net/UploaderSmall/source/1028634544.zip
いちおう確認したけど、LokiPortの存在は知ってるよな?
>>667
あれはVC6だめじゃないの?
669デフォルトの名無しさん:02/08/07 02:31
クラスの演算子のオーバーライド(ロード?)でリンカのエラーがでます

error LNK2005: "bool __cdecl operator<(double const &,class TestClass const &)" (??M@YA_NABNABVTestClass@@@Z)
はすでに foo.obj で定義されています

ヘッダファイルに直接以下のように書いているのですが、なにがダメなのでしょうか?

// 比較演算子(upper_boundで必要)
bool operator < ( const double &a, const TestClass &v )
{
  return v.x < a;
}

なぜか解りませんがinlineを付けるとエラーが出ませんでした。
>>669
そのままinlineつけておけばいい
671669:02/08/07 02:33
あ、普通に考えると定義だけヘッダに書いて、中身はcppでかくのかな?
でもinlineではエラーにならないのが解りません。
>>671
ヘッダに実装を書いた場合、そのヘッダを複数回includeすると、
実体も複数できるからリンク時エラーになる。
inlineにすれば実際には関数を作らないのでエラーにならん
>>670>>672
ああなるほど。言われてみればそうですね。
ありがとうございます。
訂正:>>669
 ○ return a < v.x;
 × return v.x < a;
675デフォルトの名無しさん:02/08/07 05:45
画面を更新させるにはどうすればよいのでしょうか?
Sleepを使ったら文がいっきに表示されて困っています。
画面を更新する命令を呼べよ
677デフォルトの名無しさん:02/08/07 07:47
画面を更新する命令ってなんですか?
678質問小僧A:02/08/07 09:55
>>662
買うお金が・・・

>>664
すいません。環境かいてませんでした(汗
開発環境はVisualC++6.0です。OSはWin2000とWin98です。

>>666
さっそくその本立ち読みしに大学までいってきます。
ところで・・・獣の数字・・・w
679デフォルトの名無しさん:02/08/07 12:34
>>678
学生だろ?アカデミックパックで安いものじゃん
そもそも今の学生って俺たちより余程金持ってるじゃん
>>677
知らんよ。というか 675 が意味不明だから、補足しろと言ってるんじゃないの?
>>667
ありがとう!
682質問小僧A:02/08/07 20:27
>>679
それは偏見なのでは・・・(汗
少なくとも私は貧乏生活です・・・
成人祝いに買って貰ったVisualStudioで頑張ってるんです。
683デフォルトの名無しさん:02/08/07 20:59
>>682
MFC使えばいいんじゃないか?
自分は良いサンプル集めて勉強してる。
ダイアログアプリなら簡単だよ。

684質問小僧A:02/08/07 21:12
>>683
その良いサンプルをできればおしえていただけませんか?
はっきりいってどこから手をつければいいのか・・・
685デフォルトの名無しさん:02/08/07 21:31
VC6にもサンプルついてると思うけど
自分は主にココにある物を参考にしてる。
http://www.codeproject.com/
http://www.codeguru.com/
CDialogだったらボタンとかリストとかを
ダイアログエディタでくっつけて、動作は自分で記述することになるよ。
MSDNにCButtonやCListBox,CListCtrlがあるからそのメンバ関数とかをみれば
使い方は分かる。

686デフォルトの名無しさん:02/08/07 23:13
age
687デフォルトの名無しさん:02/08/08 00:44
NT4.0でVisualC++6.0を使っています。
ネットワーク経由のメッセージを契機に、
特定プログラムを起動するサービス(NT4.0上で動作)を
作りたいと考えています。
NT4.0サービスを作成・インストールする部分がわからないのですが、
参考になる書籍など、ご存知でしたら教えてください。
MSDNを見ると、「ATL COM AppWizard を使う」とありましたので、
早速使ってみたのですが、どこに記述してよいやらわかりません。
よろしくお願いします。
688 :02/08/08 00:57
>>687
サービスとCOMに何の関係が?
>>688
あるじゃん。COM を使わずに直接 API 叩く方法もあるが、ふつーは COM の
形で実装するし、そのための Wizard も用意されてる。
690デフォルトの名無しさん:02/08/09 00:17
includeした先にある名前って
グローバルスコープ?ファイルスコープ?
どちらになる?
691 :02/08/09 00:18
>>690
もうちょい具体的に
>>690
意味がわからん。
includeしてもスコープは何も変わらん
694デフォルトの名無しさん:02/08/09 00:21
ファイルスコープって??
695 :02/08/09 00:22
>>694
そのファイルの中だけに限定されたスコープ
my.hで
#include <stdio.h>
をするとここではprintfを使うものの
#include "my.h"
をしたときにprintfという名前を占有してほしくないとする
どうにもならない?
namespace使うとふるいヘッダでエラーが出ることがあるし
プリプロセッサの出力は翻訳単位と言う(第三版から)
>>696
private_my.hをつくれ。
699 :02/08/09 00:27
>>696
ヘッダファイルの中からprintf()呼ぶ気か?
printfは例えばで実際にはwindows.hなんだが
>>698
どういうこと?
>>700
my.h内でincludeするのではなく、別にprivate_my.h等を作ってこっちで
includeすればいいじゃん。で、private_my.cpp等にprintfを必要を
必要とするモジュールを封じ込める
>>701
テンプレートはどうにもならん?
exportがサポートされないとだめかな?
>>702
なにがやの?
膨大なdefineマクロと膨大な関数名
>>704
マクロはともかく、標準関数は std ネームスペースに封じられてるから問題ない。
問題は Win32 API だけど、こいつはどうにもならんね……。
defineやめてconstとinlineにして
::windowsに閉じ込めるバージョンがあればいいんだが
namespace windows {

#include <windows.h>

}
は?
>>707
そもそも KERNEL32.DLL とか USER32.DLL にある API の本体が、namespace
なし、extern "C" でコンパイルされておろうが。
709つまづきさん:02/08/09 01:13
これの意味を理解できるように教えてくだされ
for (sum=0, i=0; i<v.size(); i++)
vectorクラスでデータの総和をとる計算の一部なんだけどわからない(欝
>>709
size()は要素数を返す。ってゆーかイテレータを使うだろ普通
711710:02/08/09 01:17
ついでにaccumulateも
>>710
むしろ std::accumulate を使うと思われ。
やはりC++はCをやってからの方がいいな。
forを知らずにvectorとはこれいかに。
714つまづきさん:02/08/09 01:24
えっとまだ本を読んでる状態なんで・・・・
iがv.sizeより小さかったらi++と判断したらいいのかなぁ
この後にsum += v[i] が続いてるんだけど
>>714
その部分も予め書きなよ。
716つまづきさん:02/08/09 01:27
すんません
717デフォルトの名無しさん:02/08/09 01:29
自分は
709のスタイルなんだが、
iterator使ったコーディングにするとどう違ってくるの?
>>715
いってることは正しいが書かなくてもわかるな普通。
それよりforを知らないのが信じられない。
719つまづきさん:02/08/09 01:29
v[i]っていうのは何をさしてるんですか?
for(std::vector<int>::const_iterator i = v.begin(); i != v.end(); ++i)
{
  sum += *i;
}
かな?
>>719
キーワードは STL と vector だ。あとは「プログラミング言語 C++」を読め。
>>717
sum=0;
for(vector<int>::iterator vi=v.begin();vi!=v.end();vi++)
sum+=*vi;
みたいな
723つまづきさん:02/08/09 01:37
using namespace std ;
void main ( )
{
 vector < int > v ;
 int i, data, sum ;

 cout << "数値以外の文字を入力して終了" << endl ;

 while ( cin.good ( ) ) {
cin >> data ;
if ( cin.good ( ) ) v.push_back ( data ) ;
}               

for ( sum = 0, i = 0 ; i < v.size ( ) ; i ++ ) {
sum += v[i] ;
cout << v[i] << " - " << sum << endl ;
}
}
できればforからの文を日本語で説明して欲しい
>>723
さすがに C++ の「いろは」から解説を頼むのは、スレ違いだと思われ。とりあえず
本を読んで、最低限の知識を身につけてクレ。
723は多分、STLのvectorを知らないんだと思われ。
STLの解説がある本をお勧めする。
726つまづきさん:02/08/09 01:53
>>724
そりゃそだね、とりあえずこれはとばして読み続けてみるよ
>>725
まだ本の最初のほうだからでてきてないのかも
727717:02/08/09 02:14
コンテナのある部分の合計を取るような関数を作ったときに
iteratorで記述してれば、記述は大変だが、使うときに便利になる。

アルゴリズムの記述が、特定のポインタでなく、様々なコンテナに
適用できる点がiteratorのいいところということだと思った。

>>727
さらに一歩進んで、template 関数 or 関数オブジェクトにしないと、あまり嬉しくないと
思うが。
729nns:02/08/09 12:14
連番ファイルに切られたファイル(使うのは連番MPEG2ストリームファイル)をビット単位でうまいこと読み書きできるクラスのサンプルどこかにありませんか?
一応作ってはいるんだが挫折しそう。
730デフォルトの名無しさん:02/08/09 12:30
std::stringをpublic継承させて機能を追加したクラス、
CStringを作りたいと思っています。

class CString :
  public std::string
{
public:
  // 追加機能いろいろ省略。
private:
  static void* operator new(size_t);
};

「仮想デストラクタのないクラスからpublic継承してはいけない」
というのはC++の常識らしいですが、こういう風にnewを自分で禁止しておけば、
ポインタからアクセスすることがなくなるので問題はないと思うのですが、
どうでしょうか? これでも、まだなにかやばい事が起こり得る抜け道って
ありますか?

731デフォルトの名無しさん:02/08/09 13:14
可変引数リストで質問なのですが、
sscanfを別の関数から呼びたいのですが、
どうやったら...の部分を渡せるのでしょうか?
sprintfの場合は、vsprintfでva_listを渡せばできるのですが、
sscanfにはvsscanfのようなものは見あたりません。

test(const char* buffer,const char* format,...)
{
//sscanf が呼びたい
va_list arg;
va_start(arg, format);
int i = sscanf(buffer,format,arg);//うまくいかない。
va_end(arg);
return i;
}
sscanf(const char*,const char*,...);
>>730
newできないと残念だから、継承させないでstd::stringのインスタンスを
メンバに持たせたらどう?
ちょっとめんどくさくなるけど。
>>731
ちなみにそれで何をするの?
734731:02/08/09 14:00
>>733
スイマセン。よく調べてみたら、
sscanfはdoubleの変換ができないようなので
atoi,atof系を使わないとだめですね。

C++的には

double d;
std::stringstream a;
a << "123.456789";
a >> d;
try {
6nbsp;int *ip = new int[-1];
}
catch (std::bad_alloc &a) {
 cerr<<"(・∀・)マンコー"<<endl;
}
736デフォルトの名無しさん:02/08/09 15:05
>>734
> sscanfはdoubleの変換ができないようなので

そんなことないでしょ?
737731:02/08/09 15:32
>>736
MSDNの
scanf 関数の型フィールド文字に
e、E、f、g、G
はfloatのポインタと書いてある。

でもやっぱり、sscanf使えないと面倒だなぁ。(鬱
738デフォルトの名無しさん:02/08/09 15:41
>>737
MSDNをよく読んでみましょう。
739731:02/08/09 17:12
>>738
ありがとう!!doubleやっぱり使えるんですね。
「printf 関数と wprintf 関数の書式指定フィールド」を参照してください。
とあるのにリンク先をクリックすると
scanf 系関数の書式指定フィールド
になっている罠
だったんだねぇ。

731の件は sscanf.cにソースがあり解決しました。

後一つだけ質問させてください。お願いします。
sscanfを Cでコンパイル(*.c)すると問題ないのですが、
C++でコンパイル(*.cpp)するとRUNTIMEエラーがでてしまうのですが、
どうしたら回避できるのでしょうか?
(浮動小数点の場合に起きています。)

#include<stdio.h>
int main()
{
double d;
sscanf("123.456","%f",&d);
}
>>739
>sscanf("123.456","%f",&d);

sscanf("123.456","%lf",&d);
741731:02/08/09 18:48
sscanfの前にsprintfを実行したら
floating-point support not loaded
とでていたのがそれ以後、不思議と直りました。
>>740 ありがとうざいました。
742デフォルトの名無しさん:02/08/09 18:48
>>730
CString* ps = new CString[1];
743730:02/08/09 20:40
>>732
いや、メンバで持たせるのはちょっとやってみたんですが、stringが持ってる
関数を全部委譲させようとすると、かなりの量の作業が必要なので。
で、いくつか委譲作業をやってる途中で思ったのです。『public継承って、もともと
こういう面倒な記述をしなくていいようにするために出来たんじゃないの?』って。
そう思って冷静に考えたら、委譲の保守の労力と、ポインタ間接が一個増えることによる
効率の悪化、このふたつの変わりに得られるメリットが、string*経由のdeleteという
落とし穴を回避できる、ってのは、あんまりじゃないですか。
だから、なんとかpublic継承させたいんです。

>>742
おおっと。そうですね。たしかに、それも回避しておかないと。
>>743
> で、いくつか委譲作業をやってる途中で思ったのです。『public継承って、もともと
> こういう面倒な記述をしなくていいようにするために出来たんじゃないの?』って。
いいえ。
その手の用途にはprivate継承とusingを使うのが定石。
publicで済ませるのは、暗黙の型変換が考えられない場合
(traitsとかね)だけ。
746730:02/08/09 22:51
>>744
いや、あの。どうせなら、どういう歴史的経緯があったのか、教えてくださいよ。知ってるんでしょ?

>>745
private継承とusing……? private継承でも、using宣言でCStringのスコープに
stringの各関数をインポートできる、ってことですか? もしそうなら、
ひとつのusing宣言でstringをまるごとインポートできればいいんですけど……。
ま、調べてみます。
ところで、
>publicで済ませるのは、暗黙の型変換が考えられない場合
ってのは、どういう意味ですか? 「暗黙の型変換はよくない」と
前提した上で、CStringからstringへの暗黙の型変換がいっぱい起こりうるから
public継承はやめとけよ、って意味でいいんでしょうか。
747744:02/08/09 23:02
>>746
public 継承は実装の再利用ではなく、あくまで OOP のパラダイムを実現する
ための機能。あまり書き方は良くないんだが「プログラミング言語 C++」に記述
があるよ。
>>746
なんでそんなことするの?
std::stringにどんな拡張をする計画なの?
C++サードは色々なことが載ってて役に勃つ!
マンセー
750730:02/08/10 00:42
>>747
ありがとですー。

>>748
// 最初に現れる指定文字位置を探す。日本語を含んだ文字列でも正常動作する。
int Find(char ch) const;

// 最初に現れる指定文字で分割できる部分文字列(左側)を返す。日本語含んでもOK。
CString FindLeft(char ch) const;

// 最初に現れる指定文字で分割できる部分文字列(右側)を返す。日本語含んでもOK。
CString FindRight(char ch) const;

// 文字列が "10" "-5" 等ならtrue。
bool IsDigit(void) const;

こんな感じです。
>>750
メンバにする必要ある?
752744:02/08/10 01:00
>>751
もし新規に文字列クラスを設計するという話なら、メンバ関数にする内容だろう。
ただ std::string を拡張しようって話なら、

「やめとけ」

と思うけど。あと CString っつー名前も MFC, WTL と重複するから、避けた方が
良いかもしれん。
753731:02/08/10 01:08
訂正:やはり、sscanfにはfloatしか渡せないみたい。
結論:標準の 文字列->倍精度浮動小数 の精度には疑問が残った。

#include<stdio.h>
#include<iostream>
#include<sstream>

int main()
{
double dResult;float fResult;char buf[255];
std::cout << "original data:" << "200.123456789012" << std::endl;
sprintf(buf,"%f",(200.123456789012));
sscanf(buf,"%f",&fResult);
sscanf(buf,"%f",&dResult);
std::cout << fResult << std::endl;
std::cout << dResult << std::endl;
printf("%.15g\n",fResult);
printf("%.15g\n",dResult);

sscanf(buf,"%.15g",&fResult);
sscanf(buf,"%.15g",&dResult);
std::cout << fResult << std::endl;
std::cout << dResult << std::endl;
printf("%.15g\n",fResult);
printf("%.15g\n",dResult);

std::cout << "strtod" << std::endl;
char *stopstring;
double dResult2 = strtod(buf,&stopstring);
std::cout << dResult2 << std::endl;
printf("%.15g\n",dResult2);

std::cout << "atof" << std::endl;
double dResult3 = atof(buf);
std::cout << dResult3 << std::endl;
printf("%.15g\n",dResult3);

std::cout << "stringstream" << std::endl;
double dResult4;
std::stringstream stream;
stream << buf;
stream >> dResult4;
printf("%.15g",dResult4);

double Test = 200123456789012;//地道に変換したことを考える。
Test *= 1E-12;
printf("%.15g\n",Test);//これぐらいの精度は欲しい。
}
>>753
そのsscanf()の使い方、間違ってるって。
MSDN読めよ。
>>753
こんなに時間かけて、その結論かよ…
早く寝ろ。
>>753
ネタ?
"%lf"?
758デフォルトの名無しさん:02/08/10 01:35
sscanf(buf,"%lf",&dResult);
sscanf(buf,"%l.15g",&dResult);

759730:02/08/10 01:39
>>751>>752
というと、ネームスペースレベルの関数にしたほうがいいってことですか?

それはそれとして、最初の質問に戻りますけど『仮想デストラクタのない
クラスからpublic継承したい』場合って、>>730>>742以外に、クラス設計で
注意すべき点ってありますかね?
>>759
すまん、俺あんま分かってないんだと思うけど、仮想デストラクタの無い
クラスを継承することに関する問題と、それがpublic継承/private継承である
ということと、なんか関係あるの?
単に、delete時に導出クラスのデストラクタが呼ばれないだけじゃないの?
永レスごめん
class TreeObj3D
{
public:
int Obj;
TreeObj3D *pParent;
TreeObj3D **pChild;
DWORD ChildNum;
DWORD size;
TreeObj3D();
virtual ~TreeObj3D();

TreeObj3D &operator [](DWORD n){return(**(pChild+n));}

void addChild(int aObj);
void del();
};
typedef class TreeObj3D TREEOBJ3D,FAR *LPTREEOBJ3D;
void PrTree(TreeObj3D a,DWORD n,DWORD u,DWORD v,DWORD w,BOOL b)
{
char str[8];
int i;
if(b)
{
cout<<" ";
for(i=0;i<n-1;i++)
{
cout<<" ";
/* if(v&(DWORD)pow(2,i)) cout<<" | ";
else*/ cout<<" ";
}
cout<<"---";
}
if(u&&a.pParent!=NULL&&w==a.pParent->ChildNum-1) v&=~u;
//if(u) v&=~u;
wsprintf(str,"%03d",a.Obj);
cout<<str;
if(a.ChildNum) cout<<"---";
if(a.pParent!=NULL&&a.pParent->ChildNum) v|=(DWORD)pow(2,n-1);
for(i=0;i<a.ChildNum;i++)
{
if(a.pParent!=NULL&&w==a.pParent->ChildNum-1) u|=(DWORD)pow(2,n-1);
if(i==0) PrTree(**(a.pChild+i),n+1,u,v,i,FALSE);
else PrTree(**(a.pChild+i),n+1,u,v,i,TRUE);
}
if(!a.ChildNum) cout<<endl;
}
PrTree()で木構造を表示するんですが
親→子へ引っぱる"|"を入れるのがむずくて困ってます
"-"は出来たんですが・・・
誰か助けてくり


762761:02/08/10 01:57
あれTABは駄目かと思って半角スペースでインデント入れたのに
なってくれない・・・
見にくくてごめん
763デフォルトの名無しさん:02/08/10 01:58
lines(n)=replace(lines(n),"""",chr(93)+chr(45)+chr(93))
764744:02/08/10 02:01
>>759
> 『仮想デストラクタのないクラスからpublic継承したい』
だから、するなよ……。
vectorって自己参照ポインタ使えないんですか?
VC5.0だと使えなかったので木構造を自力で実装しましたでふ

2重カキコとか出るし・・・
766730:02/08/10 02:18
>>760
『単に』って、それが問題だから相談してるんですが。

>>764
じゃあ、これをpublic継承以外でエレガントに解決する方法を教えてください。

namespace {
  typedef void (*FUNC)(void);
  class CTable :
    public map<string,FUNC>
  {
  public:
    CTable(){
      (*this)["hoge"] = &Hoge;
      (*this)["sage"] = &Sage;
      (*this)["moge"] = &Moge;
      (*this)["hage"] = &Hage;
    }
  };
}

void foo(const string& str){
  static CTable table;
  // tableをいろいろ使う。省略。
}
>>766
> じゃあ、これをpublic継承以外でエレガントに解決する方法を教えてください。
要求仕様を明記してくれ。コードだけ見ても、意図するところが分からん。
730 は何でこんなに態度がでかいの?(w

っつか、質問する側が喧嘩を売ってどうするよ。
CStringクラスのデストラクタで何か解放しなければならないものがあるの?
>>769
横から口を挟むのも何ですが、
最低でも文字列解放しなきゃメモリリークなんじゃ・・・!?
ようしらんけどデストラクタでfree()してるんじゃないの?
>>770
何か勘違いをしていると思われ
772名無しさん:02/08/10 02:38
DirectShowについて詳しく書かれた本おしえて
文字列ってstringのバッファをそのまま利用してるんじゃ
なかったのか・・。
774デフォルトの名無しさん:02/08/10 02:39
>>772
マイクロソフトのチュートリアルが詳しい&&易しい
775770:02/08/10 02:42
CStringってリサイズできなかったけ?
出来るんならメモリ確保してるんじゃないの
>>770
それじゃぁstd::stringの出番なさそうじゃん。
やっぱりCStringっていう名前がよくない(w
>>775
ちなみに、ここでいっているCStringは、一般的なものではないみたいです
779770:02/08/10 02:46
>>778
そーですか
過去レス見てないのでごめんなちゃい
>>730
別に仮想デストラクタでなくてもパブリック継承すること自体は
問題ないと思うがね。しなくてもかまわないこともあるしな。
implemented-usingだと多態はまずいからprotectedやprivateに
するだろうな
今回はメンバ関数を増やしたいだけだから何の問題もなかろう
概念的包括も問題ないから混乱しないだろうし
781780:02/08/10 03:01
二行目>“仮想デストラクタに”しなくてもかまわないこともあるしな。
>>780
同意ですなぁ。日本語処理用になんか変なメンバを追加してなけりゃ。
783770:02/08/10 03:12
過去レス斜め読み

std::stringをpublicメンバで持たせるとか
短絡過ぎ?
>>783
面白いが、730は激しく嫌がりそうだ。
>>783
既出。というか、俺もその方が良いと思うけど。
.演算子をオーバーロードできればよかったのにな。
チームでやってなきゃ隠蔽なんてどーでもイイしね
あなだらけ(w

788785:02/08/10 03:21
ごめん、ボケをかました。
>>786
そんなことができたら、何を信じて生きていけばいいかが分からなくなるw
オーバーロードできても新しいメンバ呼出せなくなるからどのみち駄目か。
>>786
継承だけでなく、委譲のサポートがあれば良かったとは思うが。private 継承して
メンバ関数全て using すりゃ良いんだが、面倒だよねぇ。
>>791
リファレンスヘルプからusingをオートマで吐き出すツール作ったら売れるかな?
結構簡単そう
>>792
売れないと思う。

---
#include <string>
class MyString : deletgate std::string {};
---

とか書いておくと、適当なヘッダを出力してくれるツールならともかく。

……これって名前空間やらテンプレートやらへの対応を考えると、フルスペックの
C++ パーサ書く必要があるな。
794792:02/08/10 03:43
UMLみたいにちょこっとのスケルトンなら簡単なんじゃない?
こんなの誰でも作れるか・・・
795730:02/08/10 10:55
>>767
では、>>766を踏まえて要求仕様を。
やりたいことを簡単に説明すると、switch分岐の、動的な変更です。
fooに文字列"hoge"が渡されたら、関数ポインタ経由でHoge()を呼び出します。
fooに文字列"sage"が渡されたら、関数ポインタ経由でSage()を呼び出します。
fooに未知の文字列が渡されたら、例外を出すなどのエラー処理をします。
『この文字列ならこの関数を呼び出す』というペアのいくつかはコンパイル時に
決定していますが、実行時に新たなペアが増える場合もありますし、
減る場合もあります。
『現時点で、ここには分岐できるが、ここには分岐できない』といった動的な情報は、
プログラム全体でひとつしかありません。
そういう状況です。それを達成するのに最もエレガントなコードが、>>766
のコードのつもりです。
・動的な分岐はmapの連想配列でこなす。
・ひとつしかない動的な情報は、ローカルstaticオブジェクトが保有。
・コンパイル時に決定されているペアは、オブジェクトのコンストラクタで入力。
という方針です。
もし、More Effective C++ を持ってるんでしたら、項目31を参照してください。
同じようなことをやってあります(ただし、あっちは絶対にpublic継承を
やりたくないのか、面倒な手段で実現してあります)。

>>780-782
C++3rdを持っていないのでEffective C++ からの引用ですが、
『C++標準規格は、この点について極めて明確に述べている。
基底クラスのポインタを介して派生クラスのオブジェクトを削除しようと
するとき、その基底クラスに仮想でないデストラクタがあると、
その結果は不定となる』
だそうです。プログラマとしての直感から言えば、たしかに、派生クラスで
メンバを追加してなくてデストラクタで何もしてないんなら、正常に
動いてくれそうな予感はします。けど、そういった条件は全く書かれずに
『不定』だと書いてあるんですから、やっちゃいけないというか、
『やれないようにクラス設計する覚悟がなければpublic継承してはいけない』
んではないでしょうか。
>>795
分岐フラグに文字列そのものを使っている時点であまりエレガントだとはおもわんが。
>>795
「基底クラスのポインタを介して派生クラスのオブジェクトを削除」しようとしなければ、問題ない。
よって766のコードは問題ない。
stringから派生した新たな文字列クラスを作ってみたところで、mapに入るのは派生クラスではなくstringであるから、何ら問題ない。
・・・という回答で良いの?
798730:02/08/10 14:08
>>796>>797
あ、ごめんなさい。例が悪かったせいで、えらく勘違いさせちゃってたみたいです。
やりたいのは『switch分岐の動的な変更』です。
文字列で分岐しているのは深い意味はありません。

>>796
じゃあ、class CTable : public vector<pair<int,FUNC> > で。

>>797
そっちは関係ありません。CTableの方。仮想デストラクタのない、
mapからpublic継承してますよね? つっこんで欲しいのは、そこ。
あと、「(前略)〜削除しようとしなければ、問題ない」のはあたりまえです。
じゃあ、間違って削除しないようにするためにどうすのか、それをコンパイラに
強制させる方法はないのか、ってことを聞きたいんです。
>>798
あなたの例からは、継承させる必要性を感じないのだが?
CTableにstd::vectorやstd::mapの一般的なメソッドは必要なのか?

new とか new[] する必要がないなら、それだけ禁止さえしておけば
public継承で別に問題ないのでは?と俺は思うけれど。

>>767
初期化時以外は完全に std::map として扱いたいという要求なら、
この方がわかりやすい気がする。

map<string, FUNC>& funcMap()
{
 static struct initialize {
  initialize()
   {
    map_["hoge"] = &Hoge;
    map_["hage"] = &Hage;
   }
  map<string, FUNC> map_;
 } unique_instance;
 return unique_instance.map_;
}

そうでなくて、実行時用の操作メソッドをもった一個のクラスとしてCTableを
作りたいなら、当然実装詳細である map は private に隠すべきでしょう。
767じゃねぇ>>798だ。鬱氏。
>>798
間違って削除出来ないようにする。では逆にどういう状況では削除出来る可能性があるか?
766の例だと、foo内で delete &table; とかやらない限り、そんなことは無いと思う。
もうちょっと起こりそうな例を・・・
それとも delete &table; さえも間違って起きないようにしたい?
803802:02/08/10 15:31
あぁ。わけのわからんことを書いた気がする。
delete &table; だったら、基底クラスのポインタを介して派生クラスのオブジェクトを削除したことにならんよな。
むー?意図がいまいち読めん。混乱してきた。
804デフォルトの名無しさん:02/08/10 16:50
最高の道具あげ。
805730:02/08/10 16:53
>>799
必要です。逆に聞きたいです。CTableは、単にコンストラクタでの
初期化のためだけにクラス化しているのです。それだけのために、
map,vectorの便利な関数を全部隠蔽されてしまうのは、とてつもなく不便だと
感じませんか? あとから「あ、やっぱり使うから付け足そう」などと
するより、最初から全部使えた方が余計な再コンパイルは不要で、
便利ですよね?

>>800
キタ━━━━(゚∀゚)━━━━!!!!
なるほど、これは素晴らしいです。そっかー。こうすればいいのか……。

>>802
いや、「起こりそうかどうか」なんて、どうでもいいんです。
誰かが「仮想デストラクタのないクラスをpublic継承させちゃいかんよな」って
言ったとき、>>766みたいなコードをあなたが書いてたとして、「いや、
基底クラスからdeleteさせられることがほとんどありえないなら、
public継承するけど」って言えますか? そして、説得できますか?
俺は、無理だと思います。だから俺は、「いや、基底クラスからdeleteされることが
ありえないようなクラス設計をした上でなら、public継承させるけど」
って言いたいので、そう言う道を探してるんです。

>>803
map<string,FUNC>* p = &table;
delete p;
ならどうだろう……? new,new[]といっしょに、delete,delete[]も
privateで隠蔽しといた方が安全ですかね……?
>>799
> あなたの例からは、継承させる必要性を感じないのだが?
同意。メンバ変数として map 持つよな。

class CFuncDispatcher
{
  typedef void (*func_type)();
  std::map<std::string, func_type> func_table_;
public:
  CFuncDispatcher()
  {
    func_table_["foo"] = &foo;
    func_table_["bar"] = &bar;
  }
  void operator()(const std::string& s)
  {
    return (*func_table_[s])();
  }
};


(俺なら、さらにテンプレートクラス化すると思うけど)
>>805
> あとから「あ、やっぱり使うから付け足そう」などと
> するより、最初から全部使えた方が余計な再コンパイルは不要で、
> 便利ですよね?
おいおい。何のためのカプセル化だよ…。
808730:02/08/10 17:14
>>807
だから、mapとしての機能は、もともと全部使いたいんですよ。
カプセル化をやろうなんて思ってないんです。クラスにしたのは、
デフォルト入力データの初期化を行うのに、コンストラクタが
都合がいいからであって。そのためにmapの機能が制限されてしまうのは、
まったく不本意なんです。
>>808
> だから、mapとしての機能は、もともと全部使いたいんですよ。
例が悪い、というか 798 と言ってることが違う。ころころ要求仕様を変えて
逆ギレしないように。

C 言語での配列の初期化
void (*func_table)[] = { &foo, &bar, &woo };
みたいに、定義と初期化をまとめたいっつー話なのね?
>>805
new してないものを delete する奴は、別問題だと考えて、ここでは new 出来なくするくらいでいいんじゃなかろうか。

new してないものを delete する・・・例えば
void foo(int*p){
 delete p;
}
void bar(){
 int i = 1;
 foo(&i);
}
こんな事する奴は、そもそも防ぎようがない。諦めれ。
日本語をうまく扱える文字列は、もうどうでもいいのか。
812730:02/08/10 18:11
>>809
ああ、失礼。要するに、STLのコンテナとしての機能は、
何ひとつ損ないたくない、ってことを言いたいんでして。
で、そうです。定義と初期化をまとめたいんです。
理想はコンパイル時に初期化が済んでるといいんですけどね。
それはさすがに無理っぽいです。

>>810
ですね。VCでちょっと実験してみましたけど、派生クラス側でoperator deleteを
禁止しても、呼び出されるdeleteは基底クラス側だから、>>810的な
コードを書かれたら防ぎようがないんですね。まいった……。

>>811
いや、どうでもよくはないんです。>>759以降、レスがもらえないから
話が出来ないだけでして。
>>812
違うネタをふったのはあんただよ
>>812
ちなみに、今何をつくってるんすか?
815デフォルトの名無しさん:02/08/10 18:31
データ用のクラスを作って
STLコンテナとの
多重継承にして、
データ用のクラスでデータ管理すればいいんでない?
>>812
俺なら、こんな感じで書くかねぇ。

typedef void (*func_type)();
struct func_tbl {
  const char *d_str;
  func_type d_func;
};

typedef map<string, func_type> dispatcher;

dispatcher
dispatcher_creator(struct func_tbl *p)
{
  dispatcher d;
  for (; p->d_str != NULL; ++p)
    d.insert(dispatcher::value_type(p->d_str, p->d_func));
    // 重複エラーのチェックをすること
  return d;
};

int
main()
{
  struct func_tbl tbl[] = {
    { "foo",   &foo },
    { "bar",  &bar },
    { NULL, NULL },
  };

  dispatcher d(dispatcher_creator(tbl));

  return 0;
}
>> 定義と初期化をまとめたいんです。

勝手にまとめろやごるぁ。

dispatcher& funcMap()
{
 static const dispatcher::value_type initial_values[] = { ... };
 static dispatcher unique_instance( &initial_values[0]
                   , &initial_values[sizeof(initial_values)/sizeof(table_type::value_type)] );
 return unique_instance;
}
818817:02/08/10 22:13
まちがえちったぞごるぁ
s/table_type/dispatcher
>>812
日本語を上手く扱える文字列としてstd::wstringを使わない理由は?
820730:02/08/11 09:03
>>814
ゲームです。

>>815-818
興味深いアイデア、いろいろありがとうございます。でも、>>800より
言いかと考えると、どれも微妙ですね。

>>819
ああ! そういや、そんなのがあるってのをなんかで見たような……。
ちょっとぐぐってみました。えーと。マルチバイト文字をstringで
読み込んで、標準関数(?)の mbstowcs()でwstringに
入れてしまえば、全部の文字が2バイト単位で扱える。で、テキスト
出力したいときはwcstombs()でマルチバイト文字でstringに戻せる。
……でいいんでしょうか。Webじゃあんまりいい情報が見つからないんで、
なにかお勧めの書籍があったら教えてください。
戻したりするのが限りなくうざい
>>820
> でも、>>800より言いかと考えると、どれも微妙ですね。
変数定義と初期化をまとめたいって話なら、おれは 817 か 818 だと思うがね。
800 だと初期化に使う内容が、変数の定義部分と離れてしまう。

逆に、多くの箇所で同一の値で初期化された map を利用するのなら 800 だ
ろう。

(相変わらず要求仕様が曖昧なんで、どっちが良いのか良く分からんが)
823デフォルトの名無しさん:02/08/11 17:14
std::string str = "abcd\nefgh\nijkl\n"
のような文字列を\nで分割したいのですが、
C風でなくC++風に分割するにはどうすればよいのでしょうか?

例えばstr1にabcd、str2にefgh、str3にijklのようなイメージです。

findで\nを探してsubstrで取り出すという方法を考えたのですが、
より良い方法はあるのでしょうか・
824コギャルとHな出会い:02/08/11 17:15
http://kado7.ug.to/net/


朝までから騒ぎ!!
   小中高生
 コギャル〜熟女まで
   メル友
  i/j/PC/対応

女性の子もたくさん来てね
                 
全国デ−トスポット情報も有ります。
全国エステ&ネイル情報あります。
825デフォルトの名無しさん:02/08/11 17:15
>>823
strtok
>>823
boost::regexかboost::tokenizerを使うのが簡単だけども
標準ライブラリではないな
>>825
ありがとうございます。
stringのままよりこちらの方が良いですか。
>>826
そちらが簡単ですか。
標準ライブラリ以外でも大丈夫なので
そちらも調べてみたいと思います。
ありがとうございました。
829デフォルトの名無しさん:02/08/11 17:27
C++を勉強しているのですが、vectorがよくわかりません。

#include <iostream>
#include <vector>
using namespace std;
class hoge {
public:
 hoge() { cout << "hoge()" << endl; }
 ~hoge() { cout << "~hoge()" << endl; }
};
int main() {
 {
  vector< hoge* > v;
  for (int i = 0; i < 3; i++) v.push_back(new hoge);
  for (int i = 0; i < 3; i++) v.pop_back();
 }
 return 0;
}

スコープを抜けてvectorが削除されるときか、さもなくば
pop_back()で要素を削除したときにhogeのデストラクタを
呼び出して欲しいのですが、うまくいきません。

何かいい方法はないでしょうか。
>>829
vector<hoge> を使えばいい。
>>830
vector<boost::shared_ptr<hoge> > もな。
832デフォルトの名無しさん:02/08/11 17:51
boost::shared_ptr を使えば良い
>>830-832
vector<hoge>だと一時オブジェクトができるのがちょっと厭だったんです。

shared_ptrというものがあるんですか。
それを調べてみます。

どうもありがとうございました。
834デフォルトの名無しさん:02/08/11 17:58
この場合にauto_ptrだけは使わないようにな。
なんでC++ってポインタ(参照含む)の種類がたくさんあるんだろうね。
複雑なだけじゃん。
836デフォルトの名無しさん:02/08/11 17:59
>>833
>vector<hoge>だと一時オブジェクトができるのがちょっと厭
*まずは* それを気にしない、メモリ管理の事は自分の責任にしない、というのが
C厨を脱する1手段である気もするけどな。

まぁ、いつまでもそれじゃ駄目なんだけどさ。


>>836
禿童
>836
std::string& を返す関数を書いてしまい慌ててEffectiveあたり買いにいく罠、だな。

>>835
> なんでC++ってポインタ(参照含む)の種類がたくさんあるんだろうね。
それが分かれば C++ 中級認定。
ポインタの種類?
>>835
もともとポインタはアドレスと型の情報しかない。メモリはCではプログラマが完全に管理するものだった。
C++でも初期のころはそうだった。後に参照ができSTLができた。
ポインタをプログラマが管理するのは苦痛である。それをSTLで簡単に管理することが可能になった。
しかしそれは無理やりに近い方法である。そのためスマートな解決策がなく結果としていろんなものが出来てしまった。
メモリの管理は簡単になったかもしれないが、反対に実装を詳しく知らないとバグを入れやすくなってしまった。
ポインタの管理を言語側にすべて任せてスマートに解決したものがGC
C++を使っている以上、メモリの管理は難しい。
842デフォルトの名無しさん:02/08/11 18:21
C++の日本語のリファレンスマニュアルネット上にありませんか?
843842:02/08/11 18:24
すみませんみつけたからいいです
ふつーの、GUIを持つアプリケーションをつくるならどうでもいいけどね。
Strutsなんかを見ているとGCありの言語が羨ましくなる。
>>843
どこだ?あるのか?
なんだGCなんて略すなよ
調べちゃったじゃないか
がべこれ
演算子関数の為に(省略)
>>846
略さないで書く奴なんでイネーヨ(藁
なんでC++って標準GUIライブラリが無いんですか?
>>850
必要ないから
>>851
C++でGUIアプリを書かないっていうことですか?
入れてとこうかって話あったんだけどさ、
その標準ライブラリで作られるGUIが、あんまりかっこわるくてさ、
俺が反対しといた。ごめんな。
>>853
GUIのかっこよさって実装でどうにかすればいいだけじゃないんですか?
だから個人個人で勝手にかっこよく実装してくださいってことにしたのよ。俺ら。
>>855
なんで設計や仕様を統一させなかったのですか?
入ったとしてもX.hとかWindows.hとかOS依存になるだろうな。
いや、統一しようと結構頑張ってるけどさ、コンパイラ作る人がわからずやでさ。
困ったもんだね。
あ、858は856へね。
そういやGUIと関係ない標準クラスライブラリ(STLじゃなく)も無いような気がしますが。
なんで
> STLじゃなく
ってSTLを除くの?あれ結構頑張って作ってるよ、俺ら。
>>861
面白くない。
  ,、__,、 
 ( '・ω・) ショボーン
 (、っiョc)
  ゙'ー'゙ー'゙
オモロくないけど、標準クラスライブラリってSTLじゃないとしたらどんな物を指してるの?
iosとかでしょ。
>>864
Java の socket やら GUI 周りのライブラリみたいのを想像してるんじゃないのか?
socketまわりは何かあれば嬉しいなといつも思うけど。
VCL使うべし
>>868
それ「標準」ライブラリじゃないし、その候補でさえない……。

>>867
使ったことないんだが Common C++ Libraries とか、どう?
http://sourceforge.net/projects/cplusplus/
>>869
イマイチもいいとこ
std::string strの中にある\nの数を調べるために

int allnum = 0;
for(const char* i = str.c_str(); i != NULL; i++) {
   if(*i == 0x0d && ++*i == 0x0a)
      allnum++;
}

と書いてみたんですが、もっといい方法はありますか?
872871:02/08/11 22:31
間違えました
int allnum = 0;
for(const char* i = str.c_str(); i != NULL; i++) {
   if(*i == 0x0d && *(++i) == 0x0a)
      allnum++;
}
c_str使ってる時点でやる気を感じない。
とりあえずfindつかって書いてごらんよ。
>>873
数を数えるなら count_if だろう。

class IsChr
{
  const char ch_;
public:
  IsChr(const char ch) : ch_(ch) {}
  bool operator()(const char ch) const { return ch == ch_; }
};

cout << count_if(s.begin(), s.end(), IsChr('\n')) << endl;
875デフォルトの名無しさん:02/08/11 22:49
少しきれいでないのが微妙ですがこんな感じでいかがでしょうか?
int allnum = 0;
int pos = 0;
while(true) {
   if((pos = s.find("\n", pos)) == std::string::npos)
      break;
   allnum++;
}
>>874
countで最初やろうとしていたんですがcount_ifですか。
これから調べてみたいと思います
877874:02/08/11 22:53
>>876
この場合 count の方が良いな。
cout << count(s.begin(), s.end(), '\n') << endl;
879878:02/08/11 22:55
二足遅かった…。。。
>>877-878
countでOKでしたか。最初やったらエラーが出でて・・・
ありがとうございます。
count_ifはもっと複雑な検索条件を指定する時に使うといいね。
882デフォルトの名無しさん:02/08/12 01:07
883デフォルトの名無しさん:02/08/12 01:17
通常の方法およびクラス方法の差は何ですか。C++はルビーより非常に劣っている言語ですが、さらにC++にいくらかのクラス方法がありますか。それが悪い頭と紳士に尋ねているので、初期に答えてください。
こうして基本的なアルゴリズムを知らない人が増えるのであった。
>>883
英語で書いてください。
886デフォルトの名無しさん:02/08/12 01:21
>>864
クラス方法およびアルゴリズムとのどの関係がそこにありますか。知らせてください。
>>865
それはここで日本の掲示板ではありませんか。
私は、日本語を流暢に話すことができるので、満足であると思います。
>>886
なんて書いてあるか理解できません。
>>883>>886
日本人で地でやっているとしたら天才。
多分一度英語に機械翻訳してからまた日本語に戻しているのだろうが。
889デフォルトの名無しさん:02/08/12 01:27
私の日本の能力は非常に素晴らしい。あなたの頭が悪いので、病院へ行くために推薦します。また、もはや現われないでください。あなたの考察に感謝します。愚か、氏、887
C++ is superior to Ruby.
891デフォルトの名無しさん:02/08/12 01:29
ッヒヤッヒャッ。
892デフォルトの名無しさん:02/08/12 01:31
この試みは私が開発した翻訳エンジンをテストするために遂行されました。それはしませんが、それら[説明で]あなたへの―ま、それは少しの程度および希望に関連させます。
>>889
どうする>>888でばれたぞ。
>>892
あなたの作成したかもしれない翻訳エンジンは、どちらかと言うと改良するための
必要が存在すると思うかもしれません。
下らん外人もどきは無視。
おまえら人口無能相手に何を必死になって居るんだ
>>896
いや盆休みで暇なんでちょうどいい暇潰しにと思って。
hikikomori is very superior to 2channeler.

hikky! >>>>>> Rubyist
899デフォルトの名無しさん:02/08/12 01:50
答えをまだ得ることができませんか。
しない、1レベルがより高く来られる場合、1つ、この掲示板?容易なものは単に聞かれます。
それは理解します(そのようなもの)?排泄物BAKA--それは死ぬことができます(よ答え)それは糞です、何、容易なもの糞。
それは、ものが何を使用しなければならないか尋ねています、どのように、クラス方法として。
class _899 {
public: void hang_up()
{
   ||    
   ||    
   ||      yesterday...
 ∧||∧  
(  ⌒ ヽ
 ∪  ノ 
  ∪∪

}
};
読めないので英語に戻す。

Can't an answer be obtained yet?
the case where bend and one level comes more highly
-- one and this bulletin board --
it is only asked to an easy thing It is the ?
excrement BAKA to understand (such a thing).
-- It (よ答え) from which it can die is what and
the easy thing excrement which are excrement.
It is as the class method to how that is asking
what a thing must use.
902デフォルトの名無しさん:02/08/12 01:56
あなたは恐らく理解しませんが、ルビーは素晴らしい言語です。
それは、オブジェクト指向のスクリプト言語として他のスクリプト言語を圧倒する実行および美しい言語明細を行っています。
例えば、スキーム、SmallTalkなどが比較的美しい言語であると言われていますが、ルビーは遅れる優位によって一層の美および一層の現実性を装備しています。
もちろん、Perl、ピュートーンなどは問題外です。
日本語との類似性では、選択が単にルビーを持つでしょう。
ルビーのLinuxの分配の採用の例は増加していました。
分配はすべて、1年後に、ルビーの標準の採用を行なうでしょう。
ルビーは将来のスクリプト言語です。

それは、長くなりましたが、KOPIPEではありません。
場合、KOPIPE[承認することができる人々は、ルビーのものを理解することができない人々に会います、そして/この発言]、それらは幸福です。
なぁ、翻訳するのは簡単だが翻訳されたものを元に戻すのは
難しいことを暗号に利用できんか?
日本語→英語→日本語を何回もして、もはや原文のニュアンスが
失われている。
この際どこまでくずれるかやってみたら
Rubyは松本死のonaniy!さ。
907デフォルトの名無しさん:02/08/12 01:59
どうやって翻訳してるんだ?
その翻訳そふとかなり完成度高そうじゃないか?
>>904
それ他の言語への翻訳も間に入れて何回も繰り返してみたんだが
翻訳がおかしくなるのはある程度までなんだよな。
もちろん原文とは違うがある程度で内容の劣化が止まる。
だからなにと言われても困るが。
>>908
例えばExciteで翻訳繰り返していると、途中で劣化が止まるね。
恐らく複数の異なるエンジン間で翻訳を繰り返しているのだろう。
>>907
俺はExcite(または同じ翻訳エンジン)とみた。
Exciteは変換できないとき>>899のように括弧がでてくるからな。
OCN翻訳サービスもあるよ。これとExciteを代わりばんこに使えば
ひどく崩れるのでは?
http://www.ocn.ne.jp/translation/?R
>>902 ここまで崩れたぞ(w

あなたは恐らく理解しませんが、ルビーは素晴らしい言語です。
実行により実行することができる美しい言語詳細はオブジェクト指向のスクリプト言語
として他のスクリプト言語を圧倒します。例えば、遅れの優位による、美および多数の
現実性、それによってSUKIMU、SmallTalkなどがそうだったと言わ?黷トいましたが、
ルビーおよび設備は実行されました、その、さらに比較的、美しい言語(多数[ほとんど
遠くに])([多数]の内部の)――さらに(自然)問題にならず、それはさらに多く(恐らく距離中の)
である選択は、同じPerlを持った日本語としてポイントにルビーを単に持っています、
PYU調子など。ルビーのLinuxの分配の採用の例は増加していました。分配はすべて、
1年後にルビーの標準を採用するでしょう。ルビーは将来のスクリプト言語です。それは、
長くなりましたが、KOPIPEではありません。更に、人々、KOPIPE[私はそれを人々に会うこの
発言と見なすことができません、また、それは、それがそのように現われる(しかしながら)こと
を受理することができないものを持っています、この人、そしてルビー](および/)、また、
それらは幸福です。
913デフォルトの名無しさん:02/08/12 02:20
「女が欲しくて気が狂いそうです。」
-> 「彼は、女性を望むように見えて狂気でしょう。」
-> 「恐らく、彼は、女性を望むように見えて、精神異常です。」
-> 「恐らく、彼は、女性を望むように見えて、精神の混乱です。」(以下同じ)
902の
"〜そして/"
ってemacsかな?

それにしても902みたいな翻訳って難しいな。
915デフォルトの名無しさん:02/08/12 02:36
あっちょんぶりけっ
けっの中の最初のあっちょん
けっの中の始めのあっちょん
けっの中で始められたあっちょん
けっの中によって始められることができたあっちょん
けっの内部によって始められることができたあっちょん
トンボ釣りの帰り道に、ちんちんをつまんで、おしっこで日暮れの町に水をまいた。
陰茎は、トンボ釣りにその方法に後ろにはさまれました。また、水は薄明かりの町の小便によってその中でまき散らされました。
陰茎は方法でトンボ釣りに挿入されて戻りました。さらに、水は、その中の薄い光の町の尿によってまき散らされました。

すぐに止まるね。
方法によって、それは、陰茎によってトンボ釣りに再び挿入されました。
更に、その中の薄い光の町の尿は、水曜日までにまき散らされました。
>>911 そこはExciteと翻訳エンジンが同じだ。どちらもAMIKAI
>>897
せっかくの良スレが駄レスで埋まるのは、とても悲しいものです。
920デフォルトの名無しさん:02/08/12 19:04
恐らく、分かりやすい説明が、構造オブジェクトの違いに関するクラスで
与えられる場合、それは保存されます。彼はさらに単にC++を理解しません。
>>920
その文自体が理解できましぇん
>>920
日本語変。
>>921,922
それは、それが素晴らしく熟練した場合、悪いですか、それ、
日本ですが、よろしく、私?ここに来るあなたは、それがC++に
健康でそれに非常に来る、と思います。更に、私がこの日本語
のようにC++を滑らかに書くことができれば、それは嬉しい。
>>923
どこの翻訳エンジンだ?昨日からいるようだが。
>>924
これは自動的に翻訳エンジンです。結果はどうですか。それはそれぞれを
装備一完全に良いタッチです。それ,また私がそれでいると思います。確実に、
それは爆発的に糞です。
>>925
どこの外国人か知らんが商用に使おうとか思うなよ。
927 :02/08/12 19:32
日本人だと思われ
御前等、放置スキルマックスでお願いします
英語書けないようだしな。
Exciteの和英の翻訳精度悪くなったような気がするのは俺だけ?
和英じゃなくて英和だ、、
C++等をフリーでダウンロードできる所誰か知らないでしょうか。
知っていたらぜひ教えていただきたいのですが。
C言語スレの2に書いてる
>>932
C++なら既にあるじゃないか。
君の心の中に(略)
935デフォルトの名無しさん:02/08/13 00:00
borland のや cygwinのgccや win用のgccとかあるよ
borland の奴だとBCC Developerと一緒に使うといいよ
gccはGCC Developerだっけかな?(こっちは使った事無い)
すみませんもうちょいと詳しく教えてもらえますか?
具体的にどのようにすればいいのですか?
何もしらないもので・・^^;
>何もしらないもので・・^^;
じゃあ自分で調べたら?
調べて分からなかったら, そこで初めて人に聞くといい.
じゃないとプログラミングの勉強始めても身に付かないよ.
939デフォルトの名無しさん:02/08/13 00:26
それは素晴らしい翻訳、borland、それはそれぞれを
装備一完全に良いタッチです。それ,また私がそれでいると思います。確実に、
それは爆発的に糞です。COBOL。

http://www.borland.co.jp/cppbuilder/freecompiler/
うう・・・なんて人思いのいい2ちゃんねらなんでしょ・・・(ノ_・、)
私はDQNなんですぐ答えを・・・

http://www.cygwin.com/download.html

GNU + Cygwin + Window = Cygwin(・∀・)イイ!
941932:02/08/13 00:30
いろいろありがとうございますーーー
早速ためしてみまーーす
>>932
最も強いものは「BASIC」です。これはあなたのために必要になります。
コンパイラーの設置によって最初につまずくでしょう。これは運命です。
次に、言語の参照の壁があります。次に、さらにオブジェクト指向の壁があります。
今後危険な多くの方法があります。
>>942
だからExciteはもうイイって. 正直目障り.
それはそれに見えますか、それは何かによって誤解されます?私は英国民のクリスです。エキサイトは何ですか。
私は、この糸によって非常にエキサイトです。私はすべてを知っています「C、C++"言語。「GNU」の仕事も終わりました。
「INTEL」の仕事も終わりました。それは非常に面白い。私は、今「2CHANNEL」の仕事を行っています。
それは非常に面白い。特に、ASCII芸術の事務長のアルゴリズムは非常に賞賛されます。
英語もロクに使えないのにExciteの力を借りてつまんねーネタつくんな。
結局ここはC++の相談室なわけだけど、
なにを相談したいの?
相談することないなら
スレ違い、以上。
947デフォルトの名無しさん:02/08/14 06:27
template<class T>class TCA{
friend class T;
private:
void func(void){cout<<"TCA"<<endl;}
};

class A{
public:
TCA<A> tca;
A(){tsa.func();}
};
なんでエラー??
948デフォルトの名無しさん:02/08/14 06:31
間違えた
tca.func();
template<class T>class TCA{
friend T;
private:
void func(void){cout<<"TCA"<<endl;}
};

class A{
public:
TCA<A> tca;
A(){tsa.func();}
};
>>949だ。すまん、注釈書こうと思ったら間違って投稿しちまった.

 friend class T;
じゃなくて
 friend T;
とするところが変更点…って見れば分かるか.
951デフォルトの名無しさん:02/08/14 06:41
サンクスです。久々にfriend使ったらぼけてました。逝ってきます
952デフォルトの名無しさん:02/08/14 07:26
ヘボい事言ってみますけど、
friendは使わないほうがいいんでしょ?
goto並みっすか?
953デフォルトの名無しさん:02/08/14 07:28
directxをはじめようと思うのですがC++の基礎知識とかなくてもできますか?
C言語しかできないんですが。
>>953
いちおうC++でなくCからでも使えるようになっとるよ・・・・
>>952
iteratorを作るような時は、逆にfriendを積極的に使った方が、
publicメンバを減らせてカプセル化を強められるということもある。
要は使い方次第。
演算子のオーバライド辺りで、メンバ関数よりfriend関数にした方が良いパターンが
あったような気がするが……
ん―、思い出せん。
>>956
ああ、何を言いたいのか分かった。

class Hoge{
  int n_;
public:
  Hoge() : n_(0) {}
  Hoge(int i) : n_(i) {}
  friend Hoge operator +(const Hoge& lhs,const Hoge& rhs){
    return lhs.n_ + rhs.n_;
  }
};

Hoge a(3);
Hoge b(4);
Hoge c = a + b;
c = 3 + b;// friendなら通る。
c = a + 4;

ってなケースのことだな。
friendなら、暗黙の型変換をやってくれるからどれも通るけど、
friendにしてないと、通らないやつが出てくる、というお話。
>>957
うむ。3.operator+(b) という構文は許されないからねえ。
そろそろ新スレ立ててみるよ。ちょっと汚れてしまったから心機一転。
立てました。新スレ
「C++相談室 part10」
http://pc3.2ch.net/test/read.cgi/tech/1029315669/
次スレも立ったし埋めsage
埋めsage
std::cout << "埋めsage" << endl;
なかなか埋まらないsage
sage
sageろやゴルァ!!
967デフォルトの名無しさん:02/08/25 13:47
悩みに悩んでたんですが、
思い切って聞きますね。
UNLZA32.DLLの扱いについて
質問したいのですが、
どこのスレへいったらいいのでしょうか?
どこへいってもすれ違いと言われてしまいそうで
困りはてています。
ここでお聞きしてもいいのでしょうか?
>>967
そんなDLL初めて聞いた。何する奴?
969967:02/08/25 13:56
すみません、タイプミスしました。

UNLZA32.DLL

UNLHA32.DLL
でした。
http://www.ntus.net/nubak/manual/japanese/UNLHA32.TXT

これ見る限り, APIドキュメントも同梱されてるみたいだが…?
971967:02/08/25 14:08
>970
わざわざすみません、
一通りドキュメントには目を通したんですが、
どうにもわからなくて。。
ここで具体的に聞いていいですか?
>969
扱いといっても色々あって回答に困る。
 拾ってきたアプリ(用DLL)の使用方法が分からないの?
 自作アプリからDLLを使う方法が分からないの?
 権利面とかの扱いが分からないの?
>971
下記あたりをキーにGoogleで検索して見てください。
 DLL LHA 動的リンク
すぐに詳しく書いてあるページがヒットすると思う。
>>971
とりあえずここに詳しい解説があるよ。
http://www.hyuki.com/writing/techask.html
975967:02/08/25 14:32
ありがとうございます。
自分の症状書いてたので
レスに気付きませんでした。
とりあえず>974さんに教えていただいた
ところに解決策があることを期待して行って来ます。
それから聞いても遅くないですしね。、
ありがとうございました。
976967:02/08/25 17:30
>973
教えていただいた、キーワードでも
さわりくらいの解説しかヒットしませんでした。
>974
散々探したのですが
本当にこのURLであってますか?
サイト内検索でLHAと検索しても
ヒットしなかったんですが。。

とりあえず解説サイトはないとして、
心置きなく質問させてもらいますね。
でもちょっとタイミング悪いみたいなんで、
次スレ待ってます。
>>976
解説サイトはあるが、それが967の求めているかどうかがわからない、というだけ。
>>974をちゃんと読んで、自分が何を求めているのか、正しく提示せよ、ということ。
978デフォルトの名無しさん:02/08/25 19:53
C++ のテンプレートについての基本的な質問です。

- main.cc

#include<cstdio>

template <typename T> void func(T a);

int main(int argc,char *argv[]){
func('c');
}

-func.cc

template <typename T> void func(T a){
return;
}

の様に別ファイルにテンプレート関数を記述した時、コンパイルは通るのですが、リンクで以下のエラーメッセージが発生します。なぜなのでしょうか?

main.o: In function `main':
main.o(.text+0xc): undefined reference to `void func<char>(char)'
collect2: ld returned 1 exit status

コンパイラは、gcc version 2.95.3 を使用しています。
よろしくおねがいします。

それではfunc.ccをコンパイルするときには func<char> が必要かどうか
分らない。
>>978
export付けてないからでしょ。それと、exportキーワードをサポートしている
処理系はほとんどないから、分割コンパイルは難しいかも。
See C++ 3rd, C.13.10
982デフォルトの名無しさん:02/08/25 20:35
c++でウインドウを作るのってどうやるの?
どっかいいサイトあったら教えて
983またかよ、、:02/08/25 20:44
984デフォルトの名無しさん:02/08/25 21:05
回答をありがとうございます。

979> それではfunc.ccをコンパイルするときには func<char> が必要かどうか
979> 分らない。

とありますが、必要である事をコンパイラへ知らせるには、どのようにすれば良いのでしょうか?

980> export付けてないからでしょ。それと、exportキーワードをサポートしている
980> 処理系はほとんどないから、分割コンパイルは難しいかも。

export をサポートしていないコンパイラでは、どうやっても無理と言う事でしょうか? export をサポートしているコンパイラは、どの様な種類の物があるのでしょうか?

981> See C++ 3rd, C.13.10

これは、何ですか?

983> http://www.kumei.ne.jp/c_lang/index.html

C++ の文法について書かれたページですね。しかしここには、この問題の解決法は記述されていないようです。

983のリンクの Windows SDK編 第1部にウィンドウの作り方からあるよ。
986デフォルトの名無しさん:02/08/25 21:22
なるほど、983 は 982 に対する返答ですね。失礼しました。
>>984
>981> See C++ 3rd, C.13.10
>これは、何ですか?

See=見ろ
C++ 3rd=プログラミング言語C++ 第3版
C.13.10=付録Cの13(テンプレート)の10(明示的なインスタンス生成)
See → 眺める
Oppai → おっぱい
989デフォルトの名無しさん:02/08/26 05:04
なるほど、わかりました。 > 987

ファイル func.cc 内に、

template void func<char>(char);
template void func<int>(int);

を記述する事により、実際に使用する型各々のコンパイル結果がオブジェクトファイル内に生成される訳ですね。

どうもありがとうございました。
990デフォルトの名無しさん:02/08/26 17:51
990
991デフォルトの名無しさん:02/08/26 17:51
よーし、パパ1000取っちゃうぞー
992デフォルトの名無しさん:02/08/26 17:52
もうちょっと!
993デフォルトの名無しさん:02/08/26 17:52
993ゲット
994
やっと995か
996!
997だ!あとちょっと!念願の1000ゲットなるか!
998…すごい!
999SITNAM:02/08/26 18:00
 ∧⊂ヽ   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 (゚Д゚)ノ <  1000ゲット!
 (|  |   \__________
〜|  |
 ∪∪
1000SITNAM:02/08/26 18:00
やったー!1000打!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。