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

C++相談室 part9

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさんNGNG
現在最高のプログラム言語と言われるC++についてのご相談承ります。
(´∀`).。o(関連URLは>>2-5の辺り)
0002デフォルトの名無しさんNGNG
C++ Final Draft International Standard
http://www.kuzbass.ru/docs/isocpp/

Boost
http://www.boost.org/
STLport
http://www.stlport.org/
Loki
http://www.moderncppdesign.com/

過去ログ
Part1
http://piza.2ch.net/tech/kako/980/980175292.html
Part3
http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
Part4
http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
Part5
http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
Part6
http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
Part7
http://pc.2ch.net/test/read.cgi/tech/1021787032/
Part8
http://pc3.2ch.net/test/read.cgi/tech/1025010364/
0003デフォルトの名無しさんNGNG
Part2
http://pc.2ch.net/tech/kako/996/996640937.html
0004デフォルトの名無しさんNGNG
(゚∀゚≡゚∀゚)
0005デフォルトの名無しさんNGNG
ISO/IEC 14882 International Standard
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
0006デフォルトの名無しさんNGNG
スレ建ておつかれー
0007デフォルトの名無しさんNGNG
( ゚ペ)ノ オナーニな1行目ですな
0008デフォルトの名無しさんNGNG
■関連スレ■

VisualC++相談室 3
http://piza2.2ch.net/tech/kako/993/993186053.html
VisualC++相談室 4
http://pc.2ch.net/tech/kako/1002/10021/1002165477.html
VisualC++相談室 5
http://pc.2ch.net/tech/kako/1006/10068/1006834463.html
VisualC++相談室 6
http://pc.2ch.net/tech/kako/1011/10116/1011615035.html
VisualC++相談室 【7】
http://pc.2ch.net/tech/kako/1017/10178/1017843192.html
VisualC相談室 【8】
http://pc.2ch.net/test/read.cgi/tech/1022499000/

C++Builder相談室
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/
0009モナ吉NGNG
( ・∀・)ノ擂れさん御着かれー
0010デフォルトの名無しさんNGNG
>>7
たまにはセンセーショナルな見出しをと思いました。
0011デフォルトの名無しさんNGNG
C++は配列型の代入がないのが気持ち悪い
ぜんぜん最高じゃない
0012デフォルトの名無しさんNGNG
>>11 vector
0013デフォルトの名無しさんNGNG
>>11
配列のコピーって事?vectorを使えばいいじゃないか。
0014デフォルトの名無しさんNGNG
>>12,>>13
ケコーンしようよ(w
001511NGNG
ちがうちがう
typedef int inth[10][19] ;
inth a,b ;
とかやったら
a=bで要素の代入ができるべきだ!!
コピーできない組み込み型があるのは気持ち悪い
0016デフォルトの名無しさんNGNG
>>15
それはC++の配列型が自分自身の大きさに関する情報を持たないため。
C言語との互換性を重視した結果です。
0017デフォルトの名無しさんNGNG
何故出来ないのか?
その理由は
↓
0018デフォルトの名無しさんNGNG
配列型同士のコピーをしたいなら、構造体の中に配列を宣言して、
それ同士をコピーすればよい。って、こんなトリッキーなテクニック
はCだけで実行すべき。C++はコンテナがあるんだからそれを
使え。
0019デフォルトの名無しさんNGNG
memcpy( a, b, sizeof(a));
みたいなことをしたらいいんでは?(C的発想)
ちょっと複雑なクラスになるとdieだけどなー
002011NGNG
>>18
そうそうそれが言いたいんだよ
構造体につつめば出来るというのに
そのままだと出来ないのはおかしい!

配列渡しが見た目には値渡しなのに
強制的にポインタ渡しになって気持ち悪すぎ
002111NGNG
やっぱりJavaが最高だね
C++キモイ
0022>>1さん、センセーショナルな見出しはまずかったかモナーNGNG
>>11 boost::array ...
0023デフォルトの名無しさんNGNG
やはりJava厨だったか..
0024デフォルトの名無しさんNGNG
手元の資料の到着予定時刻と違う。ややフライング気味。
0025デフォルトの名無しさんNGNG
Java厨は排他的だな(ワラ
002611NGNG
>>21
だれ?
わたしはすでにC++&STL&Boostにどっぷり漬かってるから
いまさらC++から抜け出せない

>>22
あれは面白いね。あの初期化リストがふるくさい構文だと気づくまで
ちょっととまどったけど
0027デフォルトの名無しさんNGNG
古くさい構文って?
002811NGNG
構造体要素の初期化のこと
コンストラクタ呼び出しの初期化しかしなくなって久しいものだから

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

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

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

#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 );
}
0043デフォルトの名無しさんNGNG
>Cを選ぶ理由って何かありますか?

何も無い。
0044nanashinNGNG


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()が未解決の外部シンボル・・・
というエラーになってしまいます。

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

なのでclassか関数かをdllexportすれば良かろうと思ったので
MYDLL_API 小メソッド::submethod
や
MYDLL_API mySubclass{....}
みたいにやって見たのですが、どちらもdllexportが許可されませんでした・・・
0046nanashinNGNG
さらに自己レスです。とかなんとかやってたら
class MYDLL_API myClass{ ...}
でいいのですねMYDLL_APIの位置を間違えておりマシたので解決ヽ(´ー`)ノ
0047デフォルトの名無しさんNGNG
>Cを選ぶ理由って何かありますか?

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

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

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

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

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

どなたか判る方いらっしゃいませんか?
0050デフォルトの名無しさんNGNG
__declspec(dllexport)
0051すみませんNGNG
>>50
はい。
DLL側で自動作成されたヘッダファイルの中に、
#ifdef XXXXXX
__declspec(dllexport)
#else
__declspec(dllimport)
#endif
という感じのロジックが自動作成されています。

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

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

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

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

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

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

それから、DEFファイルで好みの名前でエキスポートできるよ
0057デフォルトの名無しさんNGNG
>>55
そうそう、それで、VC++とBC++間のリンクが、extern "C"付けてもうまく
いかないことがあるみたい。
0058デフォルトの名無しさんNGNG
>>57
そんなことはない。
VC++とBC++の間のリンクで問題があるのは、long doubleを使った場合や、他方の
ランタイムライブラリに依存した処理がある場合だけだと思うけど。
0059デフォルトの名無しさんNGNG
>>57-58
どっちが正しいの?
0060デフォルトの名無しさんNGNG
>>58
そうか・・・・実は他スレ
http://pc3.2ch.net/test/read.cgi/tech/1002377328/
で悩んでた奴がいるんだが、答えてやれなかった。
0061デフォルトの名無しさんNGNG
57が正しい。
VCはstdcall規約だと名前の後ろに@xって付くけど、
borlandだと付かない
0062デフォルトの名無しさんNGNG
58が正しい。
DEFファイルを使えば任意の名前でexportできる。
0063デフォルトの名無しさんNGNG
>>62
非常に原始的だがね。
C++をあそこまで拡張したあげくにこのていたらく。
0064デフォルトの名無しさんNGNG
>>62
extern "C"だけじゃうまくいかないって話じゃん。
DEFファイルを持ちだせば、__cdeclの関数もVBで使える名前に変えられちゃうし、
望むままにできちゃうじゃないか。
0065デフォルトの名無しさんNGNG
ほ、ほ、保守!
0066すみませんNGNG
お礼が遅れてしまって申し訳ない。
昨日の夜、出来ました。
具体的には(自動作成されたマクロは展開して書いておきます)、
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
0067デフォルトの名無しさんNGNG
おめでとう。
0068デフォルトの名無しさんNGNG
質問があります。

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

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

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

007271_mainNGNG
#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
0073デフォルトの名無しさんNGNG
おいお前ら!ウインドウズプログラミングしてたら以下のようなエラーがでますた。
Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)
どうすればいいんですか?教えてください(゚Д゚)ゴルァ!!
0074デフォルトの名無しさんNGNG
>>73
-Wオプションをつけなかったから、WinMain()がメイン関数だと見なされて
ないだけだろう(゚Д゚)ゴルァ!!
0075デフォルトの名無しさんNGNG
ちゃんとつけてるぞ(゚Д゚)ゴルァ!!
007671NGNG
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

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

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

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

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

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

std::ostringstream os;
Print(os); ともできる
printfとかじゃこんな事するのはめんどくない?
まぁ適材適所だと思いますけど
0091デフォルトの名無しさんNGNG
v(^・^)v
009288NGNG
レスありがとうございます。
まだ勉強中の身で生意気を言ってみたのですが…

適材適所。そうですね。
両方を選んで使えるようになる為、しっかり勉強します。
ただただ、楽な方に逃げるところでした。
0093デフォルトの名無しさんNGNG
>>90
fprintf()

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

Foo& operator =(const Foo &bar);
const Foo& operator =(const Foo &bar);
0096デフォルトの名無しさんNGNG
>>95
(a=3)=4;
0097デフォルトの名無しさんNGNG
>>96
そう、俺もそれが根拠。
迷った時は組み込み型の真似。

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

#ひょっとして、文法的に間違ってるのかな?gccでは通るんだけど。
0113デフォルトの名無しさんNGNG
>>112
a[0][0]:

のアドレス。だから一緒かと。
まぁ、偶然の一致な訳だけど。
011411NGNG
>>112
T a[4][4]なら式で評価されると
aはT(*)[4]で&aはT(*)[4][4]だから別物だよ。
11でも書いたけど配列の仕様は気持ち悪いよね
0115デフォルトの名無しさんNGNG
>>112
俺はそのへん、全然分からん。怖いから、そんなコード書くような状況になったら、
すぐにvectorに逃げるよ。
011611NGNG
aはぜひともT[4][4]として評価されてコピー演算をサポートして
ほしいね。typeidやsizeofではT[4][4]なんだから。
それでT[4][4]からT(*)[4]のキャストをサポートすれば
いいんだから。気持ち悪いったらありゃしない。
そろそろ嫌われるな、おれ
0117デフォルトの名無しさんNGNG
C++とC#はどう違うん?
0118デフォルトの名無しさんNGNG
>>117
根本的に・・・。
0119デフォルトの名無しさんNGNG
>>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
0120119NGNG
ごめんわすれてた
sizeof(int)は4ね。
0121デフォルトの名無しさんNGNG
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]
0122デフォルトの名無しさんNGNG
a[i] --> &a[0][0] --> int * は間違いで
a[i] --> &a[i][0] --> int * でした。
0123デフォルトの名無しさんNGNG
>>121
わかりやすい
0124デフォルトの名無しさんNGNG
>>111さん
>>=はC++ではLvalueを返して、CではLvalueを返さないからね。
>>前置++とかもそうだね。

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

by 124
0127デフォルトの名無しさんNGNG
互換性のある型だよね・・・。
0128デフォルトの名無しさんNGNG
>>121
3次元配列の場合はどうなるの?
といってみるテスト
0129121NGNG
何次元でも考え方は同じ。配列を要素に持つ配列とか
配列の配列を要素に持つ配列とかいうふうに考えていけば
良いと思う。結局は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] となる。

頭がおかしくなりそうだけど。
0130112NGNG
房なわたしの質問におつきあいいただきありがとうございます。
なんとなく分かったような気がしました。

うちの大学の教授に聞いても分からなかったし、どのポインタ関連の本を
読んでも書いてなかったので質問したんですが、
まさかこんなに丁寧に答えてくれるとは思いませんでした。
ありがとうございました。
0131デフォルトの名無しさんNGNG
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()++);

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

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

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

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

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

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

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

>>148
うん??なんででしょう?いや、実際よく
わかんないっす・・汗
0150デフォルトの名無しさんNGNG
構造体のアドレスの渡し方なんですが
関数側渡して値を入れさせてますが、どうも反映されません。
構造体の定義を変数の前でやると「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 を参考にしました。
0151デフォルトの名無しさんNGNG
>>150
殺人級に読みにくい
0152    NGNG
>>148
あ!そうそう!それです!
2分木の各ノードにPersonというクラス
を収納したいんですよ。
Personは NameとNumber(共にString)を
持ってるだけの単純なクラスです。
0153デフォルトの名無しさんNGNG
>>149
Personの定義部と、ツリーに格納する周辺のコードを貼ってよ
0154デフォルトの名無しさんNGNG
>>144
テンプレート使え。
但し 
template <class T> writer& oeprator<<(writer& w, T &t)
と汎用なのは禁句。特別バージョンとあいまいさが解決できないから。

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

0155デフォルトの名無しさんNGNG
まぁ宿題スレへ行け。
スレ違い。
0156デフォルトの名無しさんNGNG
宿題スレは潰れた
0157デフォルトの名無しさんNGNG
http://pc3.2ch.net/test/read.cgi/tech/1027756023/l50
0158     NGNG
>>155

逝ってきます
0159デフォルトの名無しさんNGNG
五年ぐらい前に組んだC++のチャット用プログラムが
急にエラー起こすようになりました。
ブラウザのバージョンアップについていけないっていうことありますか?
あるとすれば、どんな理由が多いでしょうか
0160デフォルトの名無しさんNGNG
は?
・環境
・使用ライブラリ(WinInet/Winsock)
とか記載しろよ
0161デフォルトの名無しさんNGNG
Y2k
0162デフォルトの名無しさんNGNG
2001/9/9問題
0163デフォルトの名無しさんNGNG
非決定性有限状態オートマトソってなんですか?
0164デフォルトの名無しさんNGNG
あとDFA?も教えてください
0165デフォルトの名無しさんNGNG
>>163-164
C++関係なくない?
DFAはdeterministic finite automatonだっけか?
0166163NGNG
ゴーグレで調べたらC++のコードが出てきたもんでC++でやるのが普通なのかと思ってました
そうでもないんですね(^∀^;)
0167デフォルトの名無しさんNGNG
基底クラスの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はそれぞれの派生クラスで定義しないといけないんでしょうか?
0168デフォルトの名無しさんNGNG
>>167
B::numもC::numも実体はA::numだからエラーが出て当然じゃないの?
0169デフォルトの名無しさんNGNG
>>167
static int num; の実体は一つしか存在しません。いくら派生しても
同じです。

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

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


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

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

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

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

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

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

ま、自分の理解力が足らんのだろうと、自戒する。
0217デフォルトの名無しさんNGNG
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
{
・
・
・
}

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

何が問題?

素人でスマソ。
0218デフォルトの名無しさんNGNG
俺も早く働きてぇ。
どれほどバカなコードがまかに通ってるのか見てみたい。
0219デフォルトの名無しさんNGNG
>>218
>がまかに通ってるのか見てみたい。

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

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

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

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

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

つか、みんなどうしてんの??
初心者本はfwirte止まりだし、アホかと。
0239デフォルトの名無しさんNGNG
ToStringメソッドとか
0240 ◆JAPH9PWA NGNG
>>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;
}
0241デフォルトの名無しさんNGNG
<<オーバーロードいいんだけど、

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

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

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

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

そりゃ曖昧ですよ。
でもoperatorの右オペランドを一般化するなんてそんな無茶な、ってな気がしますが。
0244デフォルトの名無しさんNGNG
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){...}
0245デフォルトの名無しさんNGNG
質問です。以下のプログラムで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と表示??なんで?
}
0246デフォルトの名無しさんNGNG
>>245
親切設計
0247デフォルトの名無しさんNGNG
aなんて物は本来存在せず、単なるシンタックスシュガーだから。
&a[0]と汁
0248デフォルトの名無しさんNGNG
>>247
aは存在するでしょ?a[0]とかがシンタックスシュガーでしょ?
0249デフォルトの名無しさんNGNG
シンタクスシュガー って何? 検索しても、 肝心の解説がみつからん
0250デフォルトの名無しさんNGNG
bcc: 8 4 4 24 12 24
vc++: 8 4 4 24 12 24
g++: 8 4 4 24 12 4
0251デフォルトの名無しさんNGNG
>>248 は?
ポインタと配列勉強しようね。
0252デフォルトの名無しさんNGNG
・シンタックスシュガー
    文法を簡便化するために、作られた記法。
0253デフォルトの名無しさんNGNG
でも、なんで 24になるわけ? 普通a[0]と解釈されるわけでしょ?
エラーとかならわかるけど
0254デフォルトの名無しさんNGNG
>>245
それについての合理的な説明は今まで聴いたこと無い。
ただ文法としてそう決められているというだけ。
K&Rにもそんな記述は載っていないから
素直にsizeof(a)を使うほうが無難。
0255デフォルトの名無しさんNGNG
書いてある本発見
様は、2次元配列か、ポインタの1次元配列か区別が出来ないということらしい

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

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

gccが正しいとみた
0259デフォルトの名無しさんNGNG
↑の4パターン(添字を変えたところで)のどれも 24にはならないような…?
0260デフォルトの名無しさんNGNG
>>247
sizeofの被演算子で配列名指定すると配列全体のサイズ
が返ってくるのは常識だが。その他の文脈ではaは&a[0]
の意味になるはず。
0261デフォルトの名無しさんNGNG
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 の「ポインタ」を初期化する場合の文字列リテラルとの 違いに注意すること。
0262245NGNG
>>254
aは配列オブジェクトですよね。
型でいうとint [2][3]です。つまりサイズは24バイト。
&aは配列全体へのポインタで(ANSI規格より)、型は
int (*)[2][3]ですよね。ポインタなんだから、double d
に対するsizeof(&d)と同じく4バイトが正しいと思うんです。

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

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

よしよし、同志だな。ただdouble*とint(*)[2][3]の
サイズが同じだとはどこにも決まっていないな。
問題はtypeid(a)==typeid(&a)なことだ!!
0265デフォルトの名無しさんNGNG
動的に二次元配列もどきをつくるとき、いったんポインタの1次元配列を
つくるよね。
静的な配列にも概念的にはこれが存在するが、その実装はコンパイラ依存だし
直接アクセスすることもできないから、Cでは今回の件に関して
このような仕様になっているんじゃないの?
026611NGNG
>>263
具体的にアドレスが何なのかは処理系依存だったと思う
0267245NGNG
>>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です。
0268254NGNG
>>262=245
>...と同じく4バイトが正しいと思うんです。
思うんですとか言われても現実にはsizeof(&a)=24という
腐った仕様が厳然と存在してしまっている。
君の取るべき道は三つだ。
・そういうものかと納得する。
・あきらめてC/C++をやめる。
・憶測や妄想を捨て作者に歴史的経緯を聞いてここで報告する。
0269デフォルトの名無しさんNGNG
気持ちはわからんでもないが、正直どうでもいい話だ。
0270245NGNG
>>264
>ただdouble*とint(*)[2][3]の
>サイズが同じだとはどこにも決まっていないな。
>問題はtypeid(a)==typeid(&a)なことだ!!

そうなんです。
027111NGNG
>>268
設計者のミスに違いない!!!
次のバージョンに期待
0272245NGNG
>>268、>>269
その仕様が言語仕様なのか処理系依存なのか
分かればスッキリするんですが。

・見なかったことにします。
皆さん忘れてください。
0273デフォルトの名無しさんNGNG
仮想関数のアドレスを表示しようとすると "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;
}
0274デフォルトの名無しさんNGNG
>>272
言語仕様。
0275デフォルトの名無しさんNGNG
>>273
A::printってなによ?非staticでしょ?
027611NGNG
>>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から外れているのはまず間違いない。
0277デフォルトの名無しさんNGNG
>>275
うーんメンバ関数のアドレスを表示したいんです。
例えば

A aa;

としておいて、

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

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

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

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

面白い本だけど、今回の問題はコラム扱いで >>255以上の事はあまりのってない
立ち読みするなら P261 だ
0300デフォルトの名無しさんNGNG
>>255 の本に以下のような記述あり

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

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

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

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

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

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

あと、アドレフは適当ね。俺が勝手に作った言葉。
0338デフォルトの名無しさんNGNG
>>337
だから、解説は便宜上の仮定の下になされたものであるから、現実と違って
当然だ。それはここにおける便宜上の仮定が常には真でないことによる
0339308NGNG
てか、「便宜上の仮定を置いたため」だとは思わないけどね。
それに、処理系依存でもなんでも数値で位置を表してたらなんでも「アドレス」だ
よ。OSの割り当てた物理アドレスと同じ数値じゃなかったとしてもね。
まあ、この二つの論点は今までの議論とは全く関係ないと思うけど。
0340デフォルトの名無しさんNGNG
>>339
>思わないけどね。
って根拠は無いのですか?(その後ろにそれに、と続いているから)
コンパイラを実装して多分見方が変わる。
そろそろ出かけねばならんので、早めに切り上げたい。
0341308NGNG
>>338
ということは、「便宜上の仮定」なるもので話してるため、仮定と
現実とが食い違ってるってこと?
でも、その違いは関係ないように見えるんだけど。今回の違い
には影響ないと思うんだけど。sizeofの値の違いね。
どこがどのように影響してるんだ?これが判らないので詳しく解説してほしい。
それに、仮に影響があるとしても、そうなると、仮定のもとで説明するのは
間違いというか、問題があることになる。でも、仮定で説明しちゃってる。
どっちにしろまずい。
0342308NGNG
>>340
便宜上の仮定を置いたためじゃなくて、それとは関係ない例外規則じゃない?
配列の先頭要素へのポインタに変換されない例を解説してるわけでしょ?
0343308NGNG
>>340
というか、ここは2chなので切り上げてもらっても結構ですよ。
後でまた話すこともできるし、このまま放置するのも自由だし。
0344デフォルトの名無しさんNGNG
便宜上の仮定を正円とすれば、Cの仕様はそこからわずかに飛び出ている。
だが、その正円を超えた部分は極少しであるから通常は問題ない。
今回の件はたまたまはみ出した部分。すなわち自分が動的に配列を割り当てた
時に生じる先頭へのポインタに相当する静的な配列におけるそれがコード内
つまりプログラマが制御できる範囲内にないことに起因する
0345デフォルトの名無しさんNGNG
>>343
お言葉に甘えて失礼する
0346308NGNG
>>344
なんか意味わからんけど、ポインタの値=アドレスという仮定には
関係ないように見えるね。
仮定が間違いだと言うなら、ポインタの値=何かの数値で良いんだろ?
これで文句ないだろ。
で「何かの値」と「配列」は別物なわけだ。
ところが、sizeof (&a)すなわちsizeof(何かの値)が配列全体のサイズを返してる。
これは一体どういうことなんだ?
記述では sizeof(配列)が配列全体のサイズなはずだったのでは?
0347デフォルトの名無しさんNGNG
質問
「配列への参照は、最初の要素へのポインタになる」
っていうのは、規格書のどこに書かれてるんですか?
0348デフォルトの名無しさんNGNG
sizeof(配列)が配列全体のサイズであることと、sizeof(&a)も
そうであることとは矛盾無いのに
0349308NGNG
>>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(ポインタ)じゃあないの?
0350308NGNG
cygwinのg++使ったらちゃんとsizeof(&a)は4返した…
と思ったら過去ログにもそう書いてたったね。
g++と>>300、>>261と規格書が正しくて、VCとBCCが間違ってると
すれば全てのつじつまが合う。。。
ていうか、もう俺はそうに違いないと確信しました。
0351デフォルトの名無しさんNGNG
規格書にあってないとすると・・・・
完全準拠は名乗れない!?
0352308NGNG
あと、ISO99みると、&は「アドレスを返す」と明記されてるので、少なくとも
ISO99ではポインタはアドレスだな。
あと、「処理系にまかされてるから違う」って言うが、処理系がどんなめちゃくちゃな割り当てをし
ても、最低限、違うポインタを区別できるような値が割り当てられるわけだから、
「アドレス」と呼べるだろう。
ここでの「アドレス」はOSの割り当てた物理アドレスとは違って、もっと一般的な意味。
言葉の定義の問題。
0353デフォルトの名無しさんNGNG
>>352
ついでに教えてくれ、どこに書いてあった?
教えてクンですまそ
0354デフォルトの名無しさんNGNG
&a = ポインタ という大前提はどこに記述されてるのか教えちくり
0355353NGNG
自分で調べる前に掻きこんじまった
すまそ

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’’.

長いので後は略
0356デフォルトの名無しさんNGNG
保守保守ほほ
0357デフォルトの名無しさんNGNG
aが配列なら。aと&aはまったく同じだろ。

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

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

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

[例]

/*
" */ "


0365デフォルトの名無しさんNGNG
>>364 そうなんよ なんや困りはりますえ?
0366364NGNG
" // "
" /* "
は無効化されてるのに
" */ "
だけ有効になってるのってどう考えてもおかしいと思うんだが。

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

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

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

さらしあげ
0370364NGNG
ようわからんが、
複数行に渡るコメント/**/
は""の中にあるかも判断すると
コンパイラ作るのが面倒になるから
単純に最初の*/で判定してるってことで納得しました。
0371デフォルトの名無しさんNGNG
//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 の宣言がないと警告がでます。
一応実行は出来るようですが、どうすれば出なくなるでしょうか?
0372デフォルトの名無しさんNGNG
>>370
ちげーよ
/*が来るとその後に*/が来るまでは何がこようとすべてコメントとみなして"があっても文字列としてみないだけ。もちろんint i;とあってもそれは単なるコメントと見なす。
0373デフォルトの名無しさんNGNG
>>369 あんたはんはいけずや かなんわ

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

どうもありがとうございました。
0380364NGNG
>>372
ああ、なるほど!!
/* " */ "
先に/*があるから後の"が無視されて*/が文字列になってないのか。
0381デフォルトの名無しさんNGNG
>>379
まじ!?
結構細かいんだね。BCCって。
プロトタイプの場合、voidをつけないと関数呼び出し時に引数リストをどんなものにしてもコンパイラがエラーを出さないからつけたほうがいいよ。
0382デフォルトの名無しさんNGNG
後の
~~~~?
0383デフォルトの名無しさんNGNG
>>371
C++ なら void 書いても書かなくても同じだと思うけど。
a.c/main.c か。
あと、__A__ とか、インクルードガードに _ 使う人多いんだけど、
いちおうダメだよね。
038411NGNG
>>381
それはCの場合でC++では空の引数リストはvoidと同じ
0385デフォルトの名無しさんNGNG
>>383
何がだめなの?
0386デフォルトの名無しさんNGNG
>>384
.cだからCだとオモタ
038711NGNG
とおもったら>>371はCじゃん!!!1
0388デフォルトの名無しさんNGNG
>>384
いいかげんに名無しに戻ったほうがいいと思うよ。
0389364NGNG
>>382
>後ろの"
/*の後ろの"
0390デフォルトの名無しさんNGNG
__で始まるのは処理系依存の識別子だっけ?
0391383NGNG
>>385
予約されてる識別子。
0392デフォルトの名無しさんNGNG
>>391
__FILE__とかか?
0393デフォルトの名無しさんNGNG
float型の変数の値を標準出力に出力したいのです。
wsprintf でまず変換しようとしましたが、これは整数のみできないようなのです。
方法がありましたらお願いします。
0394デフォルトの名無しさんNGNG
>>393
printf("%f\n",f);
これじゃだめなのか!?
0395デフォルトの名無しさんNGNG
>>393
std::cout << f << std::endl;
じゃないの?
0396デフォルトの名無しさんNGNG
>>394
あ!できました。すごい!!
ありがとうございました。
0397デフォルトの名無しさんNGNG
>>396
あんたがすごいよ
039811NGNG
>>393
>>396
何がなんだか分からん!
0399C厨NGNG
そういえばここってC++スレだったのね(^_^;)
ごめん。スレ立てるまでもない・・・スレかと思っていた。
0400デフォルトの名無しさんNGNG
C厨はこのスレに来ないで。。(;;)
お願い
0401デフォルトの名無しさんNGNG
>>400
ごめん。本当にごめん。
0402400NGNG
いや間違えただけならいいんだ。言い過ぎた。
0403デフォルトの名無しさんNGNG
C++でprintf使ったら駄目ってこと?
0404デフォルトの名無しさんNGNG
>>403
だめじゃない。でもC++らしくない。
0405デフォルトの名無しさんNGNG
>>404
でも
cout << "(" << number << ")" << endl;
っていうようなのはなんとなくダセエ
0406デフォルトの名無しさんNGNG
>>405
そゆときどうしてる?
0407デフォルトの名無しさんNGNG
>>406
fprintfを使っていマス
0408デフォルトの名無しさんNGNG
>>407
わしも。
0409デフォルトの名無しさんNGNG
あるnamespace内にオーバーロードされた複数の同名の関数があって、
そのうちの片方だけをusingすることは可能ですか?
0410デフォルトの名無しさんNGNG
>>405 boost使います。
0411デフォルトの名無しさんNGNG
>>409
usingする方法は分からないのだけれども
インラインのラッパを用意してやれば片方だけ使えるようになるよ
0412デフォルトの名無しさんNGNG
>>411
ありがとう。
0413デフォルトの名無しさんNGNG
>>383
> あと、__A__ とか、インクルードガードに _ 使う人多いんだけど、
> いちおうダメだよね。
処理系が予約してるから、ね。俺は一度だけ、標準ヘッダのインクルードガードと
衝突して泣いた経験がある。

ただ VC++ みたく「処理系が勝手に _ 付きのインクルードガードをつける」場合に
は問題ないんじゃない? あれは重複しない文字列 (GUID) 使ってるし。
0414デフォルトの名無しさんNGNG
float,doubleを最高の精度で
文字列にするにはどうすればいいのでしょうか?
0415デフォルトの名無しさんNGNG
ポータビリティ無視なら、BASE64とか使えばいいじゃん。
0416デフォルトの名無しさんNGNG
>>414
もとのデータはそんなに正確なのかい?
0417414NGNG
精度指定はあとから考えようと思うのですが、
まず初めは
float -> string -> float
みたいな処理をしても
一致させたいのです。
0418デフォルトの名無しさんNGNG
>>417
なんでそんなことを?
0419デフォルトの名無しさんNGNG
>>417 それは原理的に>>415のいうようなバイナリのまま保存しなければ無理だと思うよ
0420414NGNG
>>415〜419
ありがとう。がんばってみます。
0421デフォルトの名無しさんNGNG
>>417
float の全ビットパターンについて
sprintf(buf, "%.15g", f1);
sscanf(buf, "%g", &f2);
assert(f1 == f2);
を試してみたことがあるが、NaN,Infを除いて一致したよ。
0422デフォルトの名無しさんNGNG
>float の全ビットパターンについて
スゲー、floatが32bitってことは43億通りになるんかいな?
0423デフォルトの名無しさんNGNG
なにがスゲーんだ???
たいして時間かからないでそ。
0424デフォルトの名無しさんNGNG
>>421
ビットパターンのセットってintとかからキャストしてぶっこむの?
0425421NGNG
>>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日で終わったよ。
0426デフォルトの名無しさんNGNG
>>425
そんなにかかるのかー。一瞬自分もやってみようとしたけど
それを聞いておいて良かったw
0427デフォルトの名無しさんNGNG
c++に標準で用意されているらしい
複素数ライブラリってどうやって使うんですか?
0428デフォルトの名無しさんNGNG
complexをincludeするんじゃないの?
0429421NGNG
>>426
実際に試したのは sscanf ではなく istringstream 経由の
istream >> float なので、sscanf なら3日もかからず早く終わるかも。
試してみるなら、途中経過を入れておくと良いっす。
if (u % 0x10000 == 0) printf("%08lx,%g", u, f1);

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


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

 こ こ は C + + に つ い て

 相 談 す る ス レ で す 。
0437デフォルトの名無しさんNGNG
なぜ下の条件がないと
f1≠f2
になってしまうのでしょうか?

int e = (u >> 23) & 0xff;
if (e == 0 || e == 0xff) continue; // 0 or Denormal or  NaN or Inf
0438デフォルトの名無しさんNGNG
348も355もC++じゃなくってc99じゃねえか。
どっかにC++の規格書落ちてねえのかよ。
0439デフォルトの名無しさんNGNG
>>438
>>5
0440デフォルトの名無しさんNGNG
>>439
それはまずかないですか?
0441デフォルトの名無しさんNGNG
>>427
http://blackphase.hoops.ne.jp/BPProgram/complex.htm
0442デフォルトの名無しさんNGNG
>>440
何故?
0443デフォルトの名無しさんNGNG
>>442
売り物じゃないの?
0444デフォルトの名無しさんNGNG
>>437
NaNもしくはInfの場合は、
f1==f2がfalseになるからではなくて?

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

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

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

しかし、それ以外のいろんな記述を見るに、アドレスがポインタらしいと
いうのが俺の意見。
0462460NGNG
アドレスとポインタを混同してたわ。
046311NGNG
>constやvolatile(のT型)に関してはアドレスがポインタ
なだけでその他はそうであるとは限らない。ということだと思いまっせ。
0464デフォルトの名無しさんNGNG
>>463
文脈から見るに、その部分は「〜へのポインタ」という言い方をconstなど
に適用するとどうなるかを説明した文であって、そこだけアドレスがポインタ
だということを説明した文じゃないと思うわけよ。
それに、何度も言ってるように、他でアドレスとポインタを混同したような文がいくつもある。
比較的証拠っぽいのは14.3.2のプログラムのコメントとか、thisポインタが
アドレスだとかな。
046511NGNG
>>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,
0466デフォルトの名無しさんNGNG
なんとなく、ニュアンス的には、&aがアドレスなのは当たり前の前提事項だから、
適当にアドレスと書いたり書かなかったりしてしまってるように見える。
まあ断定は出来ないけど。
0467デフォルトの名無しさんNGNG
コピペできるpdfがほしい
0468デフォルトの名無しさんNGNG
>>467
% cp foo.pdf bar.pdf
できますが、何か? もしかしてパーミッションの問題か?
0469デフォルトの名無しさんNGNG
pdfコピペできるっしょ?
0470 NGNG
>>468
コピーしているようにしか見えないが、どこでペーストしてる?
0471デフォルトの名無しさんNGNG
>>470
foo.pdf で取り込み(コピー)、bar.pdf で貼り付け(ペースト)では?

# cp コマンドで名前変えて連続コピーってできたっけか?
# シェルスクリプト書く方が早そうだけど
0472デフォルトの名無しさんNGNG
int *i;
と
int* i;
の違いって何ですか?
0473デフォルトの名無しさんNGNG
*の位置
0474472NGNG
・・・・・。
0475 NGNG
>>472
違いはない。書き手のセンスの問題。
0476デフォルトの名無しさんNGNG
int * i;
0477デフォルトの名無しさんNGNG
int/*
Accept: */*
i
;
0478デフォルトの名無しさんNGNG
if (hoge) {

};

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

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

上記2点、よければ教えてよ。
0485デフォルトの名無しさんNGNG
俺のは2.72Mだが何か?
0486デフォルトの名無しさんNGNG
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を使いたいのです。
よろしくお願いします。
0487デフォルトの名無しさんNGNG
>>478
struct{
...
};
でセミコロンをつけ忘れないように普段から慣れさせておくため。
0488デフォルトの名無しさんNGNG
>>486
void func(A a[]) ;
とか
void func(A *a) ;
0489486NGNG
自分で解決できました。この場合
void func(A a[10])でいいのですね。
0490489NGNG
>>488さん、ありがとうございます。
そちらのほうが良さそうですね。
a[10]としてしまうのとどう違うんでしょうか。
0491デフォルトの名無しさんNGNG
何故あなたはC++を使うのですか?
0492デフォルトの名無しさんNGNG
>>490
結果に違いはないです。 ないからわざわざ10と書くこたな(略
0493初心者NGNG
ないなら別に10と書いても(略
0494デフォルトの名無しさんNGNG
2文字余計にタイプするだけで指が疲れる。。
0495デフォルトの名無しさんNGNG
>>494
そんなこと言ったら、2chに書き込む方がよっぽど指が疲れるYO!
0496デフォルトの名無しさんNGNG
つか、10個の配列だよ、と断りを入れておけば、9個しか用意しないで呼び出したやつに文句(略
0497デフォルトの名無しさんNGNG
っていうか、C++なんだからvector使えYO!
0498デフォルトの名無しさんNGNG
>>493
C, C++ だと仮引数の配列はポインタに縮退するから、わざわざ a[10] と
書くのは

 誤解を助長してる

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

俺なら

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

どれかにするけどな。
0499デフォルトの名無しさんNGNG
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);
として座標を取得するしかないのでしょうか?
また,任意の領域を白紙に戻す方法でもっと良い方法があるんでしょうか?
よろしくお願いします.
0500かかしNGNG
あの相談したいことがあるのですか、
ここの掲示板に書くことではないと思うのですがどこに書けばいいか
分からないのでアドバイスをお願いします。

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

@かかし
0501デフォルトの名無しさんNGNG
Developper Studioは探しても見つかりません。
Developer Studioを探して下さい。
0502499NGNG
解決しました.

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

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

class Base {
void Function();
void Main();
void (Base::*funcPtr)();
};
void Base::Main() {
funcPtr = &Base::Function;
(this->*funcPtr)();
}
051411NGNG
>>512
わざわざ指定するなら当然
(this->*Base::funcPtr)()
0515506NGNG
>513
>514
Oh!イケたよ!(コンパイルだけしか試してないが)
せんきゅう!
しかしなんでthis->が要るのかな?
0516デフォルトの名無しさんNGNG
「->*」「.*」が演算子なんだよな?

>>514 意味わかんない。
0517デフォルトの名無しさんNGNG
「->*」「.*」が演算子なんだよな?

ちゃう
0518513NGNG
Function宣言しかしてないやん…。。。
なんでリンク時にエラー吐くのかと思ったYO!

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

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

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

そこまで詳しくC++の内側まで書いてある本は
どのような物があるのでしょうか?
0527デフォルトの名無しさんNGNG
>>526
>>5
052811NGNG
virtualな関数へのポインタはどういう実装が考えられる?
0529デフォルトの名無しさんNGNG
>>528 意味わかんない。
0530506NGNG
>528
フツーにインスタンスごとに関数ポインタ保持、じゃダメですかね?
ところでメンバ関数ってインスタンスごとに生成されたりしないよね?それともこの時点で間違ってる?
053111NGNG
うっひゃ〜〜〜〜〜
メンバ関数ポインタは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 ;
}
0532 NGNG
>>531
> メンバ関数ポインタは12byteもあるのか。

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

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

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

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

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

>>533
仮想関数テーブルのこと?
0536デフォルトの名無しさんNGNG
>>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();
}
0537デフォルトの名無しさんNGNG
>>535
ははあ、これが仮想関数テーブルなのでしょうか。Aのインスタンスには
一つ、Bのインスタンスには二つのアドレスを代入しています。
0538 NGNG
>>534
static_cast<const cls&>(c).f();
0539534NGNG
>>536
ねた?非constオブジェクトから呼ぶには?
0540デフォルトの名無しさんNGNG
>>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();
}

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

>>534
じゃあ、私もねたを一つ
(c.*(int(cls::*)()const)&cls::f)();
0544デフォルトの名無しさんNGNG
初めてconst_castの使い方がわかったよ。

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

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

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

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

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

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

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


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

try {
 while (hoge) {
  while (fuga) {
   if (monyu) {
    throw false;
   }
  }
 }
}
catch (bool) {}
0576デフォルトの名無しさんNGNG
>>575
いやぁぁぁ!
0577デフォルトの名無しさんNGNG
>>575
多分速度が遅い。gotoの方がいいと思う。
0578デフォルトの名無しさんNGNG
>>575
文脈で決める
0579デフォルトの名無しさんNGNG
>>564
漏れは、とりあえずコンストラクトは完了させる。コンストラクタの中で
エラーが発生したときはエラーフラグを立てて以降の処理を中断する。
インスタンスを生成したあとにエラーフラグをチェックして、エラーなら
即 delete。デストラクタでは、コンストラクタで構築が完了したものに
ついてのみ破棄。
0580デフォルトの名無しさんNGNG
bcc5.6で浮動小数演算オーバーフローすると
プログラムが止まるんだけど普通?
(処理は戻ってこないし何のエラーも表示されない)
0581デフォルトの名無しさんNGNG
>>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;
}
}
0582デフォルトの名無しさんNGNG
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を用いたやり方?も御指導頂ければありがたいです。
0583582NGNG
ああう。下のソース、間違えてるはタブも省略されちゃう罠で・・すいません。

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

flash_play   play ;
long      punkIE[256];

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

(・ω・`)
0584デフォルトの名無しさんNGNG
このスレでいいのかわかりませんが、

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

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

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

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

ということ。

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














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

このへん読んどけみたいなHPとかありますか?
たびたびすいません
0598デフォルトの名無しさんNGNG
テンプレートに関して質問があります。
以下の文が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; };
};
0599デフォルトの名無しさんNGNG
VC++6で通ったYO!
0600598NGNG
>>599
いや…そこをg++でなんとか…。
0601デフォルトの名無しさんNGNG
何がしたいのかイマイチ分からん
0602デフォルトの名無しさんNGNG
traits<typename T>
0603598NGNG
>>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>にせよということでしょうか?
文法エラーが出ました…。
0604582NGNG
>>588
>>599
様、どうもです。(__)

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

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

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

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

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

構造体のポインタを受け取って、その構造体に
処理を施すvoid型関数なんですけど・・・。
0624デフォルトの名無しさんNGNG
void型関数って何?
戻り値の型がvoidって事?

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

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

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

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

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

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

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

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

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

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

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

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

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

なんつー処理ができない。もう少し面倒だよ。
0653デフォルトの名無しさんNGNG
>>651
Yes

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

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

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

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

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

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

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

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を付けるとエラーが出ませんでした。
0670デフォルトの名無しさんNGNG
>>669
そのままinlineつけておけばいい
0671669NGNG
あ、普通に考えると定義だけヘッダに書いて、中身はcppでかくのかな?
でもinlineではエラーにならないのが解りません。
0672デフォルトの名無しさんNGNG
>>671
ヘッダに実装を書いた場合、そのヘッダを複数回includeすると、
実体も複数できるからリンク時エラーになる。
inlineにすれば実際には関数を作らないのでエラーにならん
0673デフォルトの名無しさんNGNG
>>670>>672
ああなるほど。言われてみればそうですね。
ありがとうございます。
0674デフォルトの名無しさんNGNG
訂正:>>669
 ○ return a < v.x;
 × return v.x < a;
0675デフォルトの名無しさんNGNG
画面を更新させるにはどうすればよいのでしょうか?
Sleepを使ったら文がいっきに表示されて困っています。
0676デフォルトの名無しさんNGNG
画面を更新する命令を呼べよ
0677デフォルトの名無しさんNGNG
画面を更新する命令ってなんですか?
0678質問小僧ANGNG
>>662
買うお金が・・・

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

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

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

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

#include <windows.h>

}
は?
0708デフォルトの名無しさんNGNG
>>707
そもそも KERNEL32.DLL とか USER32.DLL にある API の本体が、namespace
なし、extern "C" でコンパイルされておろうが。
0709つまづきさんNGNG
これの意味を理解できるように教えてくだされ
for (sum=0, i=0; i<v.size(); i++)
vectorクラスでデータの総和をとる計算の一部なんだけどわからない(欝
0710デフォルトの名無しさんNGNG
>>709
size()は要素数を返す。ってゆーかイテレータを使うだろ普通
0711710NGNG
ついでにaccumulateも
0712デフォルトの名無しさんNGNG
>>710
むしろ std::accumulate を使うと思われ。
0713デフォルトの名無しさんNGNG
やはりC++はCをやってからの方がいいな。
forを知らずにvectorとはこれいかに。
0714つまづきさんNGNG
えっとまだ本を読んでる状態なんで・・・・
iがv.sizeより小さかったらi++と判断したらいいのかなぁ
この後にsum += v[i] が続いてるんだけど
0715デフォルトの名無しさんNGNG
>>714
その部分も予め書きなよ。
0716つまづきさんNGNG
すんません
0717デフォルトの名無しさんNGNG
自分は
709のスタイルなんだが、
iterator使ったコーディングにするとどう違ってくるの?
0718デフォルトの名無しさんNGNG
>>715
いってることは正しいが書かなくてもわかるな普通。
それよりforを知らないのが信じられない。
0719つまづきさんNGNG
v[i]っていうのは何をさしてるんですか?
0720デフォルトの名無しさんNGNG
for(std::vector<int>::const_iterator i = v.begin(); i != v.end(); ++i)
{
  sum += *i;
}
かな?
0721デフォルトの名無しさんNGNG
>>719
キーワードは STL と vector だ。あとは「プログラミング言語 C++」を読め。
0722デフォルトの名無しさんNGNG
>>717
sum=0;
for(vector<int>::iterator vi=v.begin();vi!=v.end();vi++)
sum+=*vi;
みたいな
0723つまづきさんNGNG
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からの文を日本語で説明して欲しい
0724デフォルトの名無しさんNGNG
>>723
さすがに C++ の「いろは」から解説を頼むのは、スレ違いだと思われ。とりあえず
本を読んで、最低限の知識を身につけてクレ。
0725デフォルトの名無しさんNGNG
723は多分、STLのvectorを知らないんだと思われ。
STLの解説がある本をお勧めする。
0726つまづきさんNGNG
>>724
そりゃそだね、とりあえずこれはとばして読み続けてみるよ
>>725
まだ本の最初のほうだからでてきてないのかも
0727717NGNG
コンテナのある部分の合計を取るような関数を作ったときに
iteratorで記述してれば、記述は大変だが、使うときに便利になる。

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

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

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

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

0731デフォルトの名無しさんNGNG
可変引数リストで質問なのですが、
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*,...);
0732デフォルトの名無しさんNGNG
>>730
newできないと残念だから、継承させないでstd::stringのインスタンスを
メンバに持たせたらどう?
ちょっとめんどくさくなるけど。
0733デフォルトの名無しさんNGNG
>>731
ちなみにそれで何をするの?
0734731NGNG
>>733
スイマセン。よく調べてみたら、
sscanfはdoubleの変換ができないようなので
atoi,atof系を使わないとだめですね。

C++的には

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

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

でもやっぱり、sscanf使えないと面倒だなぁ。(鬱
0738デフォルトの名無しさんNGNG
>>737
MSDNをよく読んでみましょう。
0739731NGNG
>>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);
}
0740デフォルトの名無しさんNGNG
>>739
>sscanf("123.456","%f",&d);

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

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

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

こんな感じです。
0751デフォルトの名無しさんNGNG
>>750
メンバにする必要ある?
0752744NGNG
>>751
もし新規に文字列クラスを設計するという話なら、メンバ関数にする内容だろう。
ただ std::string を拡張しようって話なら、

「やめとけ」

と思うけど。あと CString っつー名前も MFC, WTL と重複するから、避けた方が
良いかもしれん。
0753731NGNG
訂正:やはり、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);//これぐらいの精度は欲しい。
}
0754デフォルトの名無しさんNGNG
>>753
そのsscanf()の使い方、間違ってるって。
MSDN読めよ。
0755デフォルトの名無しさんNGNG
>>753
こんなに時間かけて、その結論かよ…
早く寝ろ。
0756デフォルトの名無しさんNGNG
>>753
ネタ?
0757デフォルトの名無しさんNGNG
"%lf"?
0758デフォルトの名無しさんNGNG
sscanf(buf,"%lf",&dResult);
sscanf(buf,"%l.15g",&dResult);

0759730NGNG
>>751>>752
というと、ネームスペースレベルの関数にしたほうがいいってことですか?

それはそれとして、最初の質問に戻りますけど『仮想デストラクタのない
クラスからpublic継承したい』場合って、>>730>>742以外に、クラス設計で
注意すべき点ってありますかね?
0760デフォルトの名無しさんNGNG
>>759
すまん、俺あんま分かってないんだと思うけど、仮想デストラクタの無い
クラスを継承することに関する問題と、それがpublic継承/private継承である
ということと、なんか関係あるの?
単に、delete時に導出クラスのデストラクタが呼ばれないだけじゃないの?
0761デフォルトの名無しさんNGNG
永レスごめん
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()で木構造を表示するんですが
親→子へ引っぱる"|"を入れるのがむずくて困ってます
"-"は出来たんですが・・・
誰か助けてくり


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

2重カキコとか出るし・・・
0766730NGNG
>>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をいろいろ使う。省略。
}
0767デフォルトの名無しさんNGNG
>>766
> じゃあ、これをpublic継承以外でエレガントに解決する方法を教えてください。
要求仕様を明記してくれ。コードだけ見ても、意図するところが分からん。
0768デフォルトの名無しさんNGNG
730 は何でこんなに態度がでかいの?(w

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

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

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

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

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

……これって名前空間やらテンプレートやらへの対応を考えると、フルスペックの
C++ パーサ書く必要があるな。
0794792NGNG
UMLみたいにちょこっとのスケルトンなら簡単なんじゃない?
こんなの誰でも作れるか・・・
0795730NGNG
>>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継承してはいけない』
んではないでしょうか。
0796デフォルトの名無しさんNGNG
>>795
分岐フラグに文字列そのものを使っている時点であまりエレガントだとはおもわんが。
0797デフォルトの名無しさんNGNG
>>795
「基底クラスのポインタを介して派生クラスのオブジェクトを削除」しようとしなければ、問題ない。
よって766のコードは問題ない。
stringから派生した新たな文字列クラスを作ってみたところで、mapに入るのは派生クラスではなくstringであるから、何ら問題ない。
・・・という回答で良いの?
0798730NGNG
>>796>>797
あ、ごめんなさい。例が悪かったせいで、えらく勘違いさせちゃってたみたいです。
やりたいのは『switch分岐の動的な変更』です。
文字列で分岐しているのは深い意味はありません。

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

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

0800デフォルトの名無しさんNGNG
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 に隠すべきでしょう。
0801デフォルトの名無しさんNGNG
767じゃねぇ>>798だ。鬱氏。
0802デフォルトの名無しさんNGNG
>>798
間違って削除出来ないようにする。では逆にどういう状況では削除出来る可能性があるか?
766の例だと、foo内で delete &table; とかやらない限り、そんなことは無いと思う。
もうちょっと起こりそうな例を・・・
それとも delete &table; さえも間違って起きないようにしたい?
0803802NGNG
あぁ。わけのわからんことを書いた気がする。
delete &table; だったら、基底クラスのポインタを介して派生クラスのオブジェクトを削除したことにならんよな。
むー?意図がいまいち読めん。混乱してきた。
0804デフォルトの名無しさんNGNG
最高の道具あげ。
0805730NGNG
>>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で隠蔽しといた方が安全ですかね……?
0806デフォルトの名無しさんNGNG
>>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])();
  }
};


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

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

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

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

>>811
いや、どうでもよくはないんです。>>759以降、レスがもらえないから
話が出来ないだけでして。
0813デフォルトの名無しさんNGNG
>>812
違うネタをふったのはあんただよ
0814デフォルトの名無しさんNGNG
>>812
ちなみに、今何をつくってるんすか?
0815デフォルトの名無しさんNGNG
データ用のクラスを作って
STLコンテナとの
多重継承にして、
データ用のクラスでデータ管理すればいいんでない?
0816デフォルトの名無しさんNGNG
>>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;
}
0817デフォルトの名無しさんNGNG
>> 定義と初期化をまとめたいんです。

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

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;
}
0818817NGNG
まちがえちったぞごるぁ
s/table_type/dispatcher
0819デフォルトの名無しさんNGNG
>>812
日本語を上手く扱える文字列としてstd::wstringを使わない理由は?
0820730NGNG
>>814
ゲームです。

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

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

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

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

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

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


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

女性の子もたくさん来てね
                 
全国デ−トスポット情報も有ります。
全国エステ&ネイル情報あります。
0825デフォルトの名無しさんNGNG
>>823
strtok
0826デフォルトの名無しさんNGNG
>>823
boost::regexかboost::tokenizerを使うのが簡単だけども
標準ライブラリではないな
0827デフォルトの名無しさんNGNG
>>825
ありがとうございます。
stringのままよりこちらの方が良いですか。
0828デフォルトの名無しさんNGNG
>>826
そちらが簡単ですか。
標準ライブラリ以外でも大丈夫なので
そちらも調べてみたいと思います。
ありがとうございました。
0829デフォルトの名無しさんNGNG
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のデストラクタを
呼び出して欲しいのですが、うまくいきません。

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

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

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

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


0837デフォルトの名無しさんNGNG
>>836
禿童
0838デフォルトの名無しさんNGNG
>836
std::string& を返す関数を書いてしまい慌ててEffectiveあたり買いにいく罠、だな。

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

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

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

と書いてみたんですが、もっといい方法はありますか?
0872871NGNG
間違えました
int allnum = 0;
for(const char* i = str.c_str(); i != NULL; i++) {
   if(*i == 0x0d && *(++i) == 0x0a)
      allnum++;
}
0873デフォルトの名無しさんNGNG
c_str使ってる時点でやる気を感じない。
とりあえずfindつかって書いてごらんよ。
0874デフォルトの名無しさんNGNG
>>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;
0875デフォルトの名無しさんNGNG
少しきれいでないのが微妙ですがこんな感じでいかがでしょうか?
int allnum = 0;
int pos = 0;
while(true) {
   if((pos = s.find("\n", pos)) == std::string::npos)
      break;
   allnum++;
}
0876871,872,875NGNG
>>874
countで最初やろうとしていたんですがcount_ifですか。
これから調べてみたいと思います
0877874NGNG
>>876
この場合 count の方が良いな。
0878デフォルトの名無しさんNGNG
cout << count(s.begin(), s.end(), '\n') << endl;
0879878NGNG
二足遅かった…。。。
0880デフォルトの名無しさんNGNG
>>877-878
countでOKでしたか。最初やったらエラーが出でて・・・
ありがとうございます。
0881デフォルトの名無しさんNGNG
count_ifはもっと複雑な検索条件を指定する時に使うといいね。
0882デフォルトの名無しさんNGNG
0883デフォルトの名無しさんNGNG
通常の方法およびクラス方法の差は何ですか。C++はルビーより非常に劣っている言語ですが、さらにC++にいくらかのクラス方法がありますか。それが悪い頭と紳士に尋ねているので、初期に答えてください。
0884デフォルトの名無しさんNGNG
こうして基本的なアルゴリズムを知らない人が増えるのであった。
0885デフォルトの名無しさんNGNG
>>883
英語で書いてください。
0886デフォルトの名無しさんNGNG
>>864
クラス方法およびアルゴリズムとのどの関係がそこにありますか。知らせてください。
>>865
それはここで日本の掲示板ではありませんか。
私は、日本語を流暢に話すことができるので、満足であると思います。
0887デフォルトの名無しさんNGNG
>>886
なんて書いてあるか理解できません。
0888デフォルトの名無しさんNGNG
>>883>>886
日本人で地でやっているとしたら天才。
多分一度英語に機械翻訳してからまた日本語に戻しているのだろうが。
0889デフォルトの名無しさんNGNG
私の日本の能力は非常に素晴らしい。あなたの頭が悪いので、病院へ行くために推薦します。また、もはや現われないでください。あなたの考察に感謝します。愚か、氏、887
0890デフォルトの名無しさんNGNG
C++ is superior to Ruby.
0891デフォルトの名無しさんNGNG
ッヒヤッヒャッ。
0892デフォルトの名無しさんNGNG
この試みは私が開発した翻訳エンジンをテストするために遂行されました。それはしませんが、それら[説明で]あなたへの―ま、それは少しの程度および希望に関連させます。
0893デフォルトの名無しさんNGNG
>>889
どうする>>888でばれたぞ。
0894デフォルトの名無しさんNGNG
>>892
あなたの作成したかもしれない翻訳エンジンは、どちらかと言うと改良するための
必要が存在すると思うかもしれません。
0895デフォルトの名無しさんNGNG
下らん外人もどきは無視。
0896デフォルトの名無しさんNGNG
おまえら人口無能相手に何を必死になって居るんだ
0897デフォルトの名無しさんNGNG
>>896
いや盆休みで暇なんでちょうどいい暇潰しにと思って。
0898デフォルトの名無しさんNGNG
hikikomori is very superior to 2channeler.

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

}
};
0901デフォルトの名無しさんNGNG
読めないので英語に戻す。

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.
0902デフォルトの名無しさんNGNG
あなたは恐らく理解しませんが、ルビーは素晴らしい言語です。
それは、オブジェクト指向のスクリプト言語として他のスクリプト言語を圧倒する実行および美しい言語明細を行っています。
例えば、スキーム、SmallTalkなどが比較的美しい言語であると言われていますが、ルビーは遅れる優位によって一層の美および一層の現実性を装備しています。
もちろん、Perl、ピュートーンなどは問題外です。
日本語との類似性では、選択が単にルビーを持つでしょう。
ルビーのLinuxの分配の採用の例は増加していました。
分配はすべて、1年後に、ルビーの標準の採用を行なうでしょう。
ルビーは将来のスクリプト言語です。

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

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

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

すぐに止まるね。
0917デフォルトの名無しさんNGNG
方法によって、それは、陰茎によってトンボ釣りに再び挿入されました。
更に、その中の薄い光の町の尿は、水曜日までにまき散らされました。
0918デフォルトの名無しさんNGNG
>>911 そこはExciteと翻訳エンジンが同じだ。どちらもAMIKAI
0919デフォルトの名無しさんNGNG
>>897
せっかくの良スレが駄レスで埋まるのは、とても悲しいものです。
0920デフォルトの名無しさんNGNG
恐らく、分かりやすい説明が、構造オブジェクトの違いに関するクラスで
与えられる場合、それは保存されます。彼はさらに単にC++を理解しません。
0921デフォルトの名無しさんNGNG
>>920
その文自体が理解できましぇん
0922デフォルトの名無しさんNGNG
>>920
日本語変。
0923デフォルトの名無しさんNGNG
>>921,922
それは、それが素晴らしく熟練した場合、悪いですか、それ、
日本ですが、よろしく、私?ここに来るあなたは、それがC++に
健康でそれに非常に来る、と思います。更に、私がこの日本語
のようにC++を滑らかに書くことができれば、それは嬉しい。
0924デフォルトの名無しさんNGNG
>>923
どこの翻訳エンジンだ?昨日からいるようだが。
0925デフォルトの名無しさんNGNG
>>924
これは自動的に翻訳エンジンです。結果はどうですか。それはそれぞれを
装備一完全に良いタッチです。それ,また私がそれでいると思います。確実に、
それは爆発的に糞です。
0926デフォルトの名無しさんNGNG
>>925
どこの外国人か知らんが商用に使おうとか思うなよ。
0927 NGNG
日本人だと思われ
0928デフォルトの名無しさんNGNG
御前等、放置スキルマックスでお願いします
0929デフォルトの名無しさんNGNG
英語書けないようだしな。
0930デフォルトの名無しさんNGNG
Exciteの和英の翻訳精度悪くなったような気がするのは俺だけ?
0931デフォルトの名無しさんNGNG
和英じゃなくて英和だ、、
0932デフォルトの名無しさんNGNG
C++等をフリーでダウンロードできる所誰か知らないでしょうか。
知っていたらぜひ教えていただきたいのですが。
0933デフォルトの名無しさんNGNG
C言語スレの2に書いてる
0934デフォルトの名無しさんNGNG
>>932
C++なら既にあるじゃないか。
君の心の中に(略)
0935デフォルトの名無しさんNGNG
http://dempa.2ch.net/prj/page/ger/index.html

レベル1
0936デフォルトの名無しさんNGNG
borland のや cygwinのgccや win用のgccとかあるよ
borland の奴だとBCC Developerと一緒に使うといいよ
gccはGCC Developerだっけかな?(こっちは使った事無い)
0937デフォルトの名無しさんNGNG
すみませんもうちょいと詳しく教えてもらえますか?
具体的にどのようにすればいいのですか?
何もしらないもので・・^^;
0938名無しさん@EmacsNGNG
>何もしらないもので・・^^;
じゃあ自分で調べたら?
調べて分からなかったら, そこで初めて人に聞くといい.
じゃないとプログラミングの勉強始めても身に付かないよ.
0939デフォルトの名無しさんNGNG
それは素晴らしい翻訳、borland、それはそれぞれを
装備一完全に良いタッチです。それ,また私がそれでいると思います。確実に、
それは爆発的に糞です。COBOL。

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

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

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

class A{
public:
TCA<A> tca;
A(){tsa.func();}
};
なんでエラー??
0948デフォルトの名無しさんNGNG
間違えた
tca.func();
0949名無しさん@EmacsNGNG
template<class T>class TCA{
friend T;
private:
void func(void){cout<<"TCA"<<endl;}
};

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

 friend class T;
じゃなくて
 friend T;
とするところが変更点…って見れば分かるか.
0951デフォルトの名無しさんNGNG
サンクスです。久々にfriend使ったらぼけてました。逝ってきます
0952デフォルトの名無しさんNGNG
ヘボい事言ってみますけど、
friendは使わないほうがいいんでしょ?
goto並みっすか?
0953デフォルトの名無しさんNGNG
directxをはじめようと思うのですがC++の基礎知識とかなくてもできますか?
C言語しかできないんですが。
0954デフォルトの名無しさんNGNG
>>953
いちおうC++でなくCからでも使えるようになっとるよ・・・・
0955デフォルトの名無しさんNGNG
>>952
iteratorを作るような時は、逆にfriendを積極的に使った方が、
publicメンバを減らせてカプセル化を強められるということもある。
要は使い方次第。
0956デフォルトの名無しさんNGNG
演算子のオーバライド辺りで、メンバ関数よりfriend関数にした方が良いパターンが
あったような気がするが……
ん―、思い出せん。
0957デフォルトの名無しさんNGNG
>>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にしてないと、通らないやつが出てくる、というお話。
0958デフォルトの名無しさんNGNG
>>957
うむ。3.operator+(b) という構文は許されないからねえ。
0959デフォルトの名無しさんNGNG
そろそろ新スレ立ててみるよ。ちょっと汚れてしまったから心機一転。
0960デフォルトの名無しさんNGNG
立てました。新スレ
「C++相談室 part10」
http://pc3.2ch.net/test/read.cgi/tech/1029315669/
0961デフォルトの名無しさんNGNG
次スレも立ったし埋めsage
0962デフォルトの名無しさんNGNG
埋めsage
0963デフォルトの名無しさんNGNG
std::cout << "埋めsage" << endl;
0964デフォルトの名無しさんNGNG
なかなか埋まらないsage
0965デフォルトの名無しさんNGNG
sage
0966デフォルトの名無しさんNGNG
sageろやゴルァ!!
0967デフォルトの名無しさんNGNG
悩みに悩んでたんですが、
思い切って聞きますね。
UNLZA32.DLLの扱いについて
質問したいのですが、
どこのスレへいったらいいのでしょうか?
どこへいってもすれ違いと言われてしまいそうで
困りはてています。
ここでお聞きしてもいいのでしょうか?
0968デフォルトの名無しさんNGNG
>>967
そんなDLL初めて聞いた。何する奴?
0969967NGNG
すみません、タイプミスしました。

UNLZA32.DLL
↓
UNLHA32.DLL
でした。
0970デフォルトの名無しさんNGNG
http://www.ntus.net/nubak/manual/japanese/UNLHA32.TXT

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

とりあえず解説サイトはないとして、
心置きなく質問させてもらいますね。
でもちょっとタイミング悪いみたいなんで、
次スレ待ってます。
0977デフォルトの名無しさんNGNG
>>976
解説サイトはあるが、それが967の求めているかどうかがわからない、というだけ。
>>974をちゃんと読んで、自分が何を求めているのか、正しく提示せよ、ということ。
0978デフォルトの名無しさんNGNG
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 を使用しています。
よろしくおねがいします。

0979デフォルトの名無しさんNGNG
それではfunc.ccをコンパイルするときには func<char> が必要かどうか
分らない。
0980デフォルトの名無しさんNGNG
>>978
export付けてないからでしょ。それと、exportキーワードをサポートしている
処理系はほとんどないから、分割コンパイルは難しいかも。
0981デフォルトの名無しさんNGNG
See C++ 3rd, C.13.10
0982デフォルトの名無しさんNGNG
c++でウインドウを作るのってどうやるの?
どっかいいサイトあったら教えて
0983またかよ、、NGNG
http://www.kumei.ne.jp/c_lang/index.html
0984デフォルトの名無しさんNGNG
回答をありがとうございます。

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++ の文法について書かれたページですね。しかしここには、この問題の解決法は記述されていないようです。

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

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

ファイル func.cc 内に、

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

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

どうもありがとうございました。
0990デフォルトの名無しさんNGNG
990
0991デフォルトの名無しさんNGNG
よーし、パパ1000取っちゃうぞー
0992デフォルトの名無しさんNGNG
もうちょっと!
0993デフォルトの名無しさんNGNG
993ゲット
0994デフォルトの名無しさんNGNG
994
0995デフォルトの名無しさんNGNG
やっと995か
0996デフォルトの名無しさんNGNG
996!
0997デフォルトの名無しさんNGNG
997だ!あとちょっと!念願の1000ゲットなるか!
0998デフォルトの名無しさんNGNG
998…すごい!
0999SITNAMNGNG
 ∧⊂ヽ   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 (゚Д゚)ノ <  1000ゲット!
 (|  |   \__________
〜|  |
 ∪∪
1000SITNAMNGNG
やったー!1000打!
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。