C++相談室 part20
■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v
NGNGただし質問の前にFAQに一通り目を通してください。
また、テンプレートライブラリ(STL含む)に関する質問は
専用の別スレへどうぞ。
過去スレ、関連スレ、関連リンクなどはこちら>>2-10
0153デフォルトの名無しさん
NGNG0154デフォルトの名無しさん
NGNGatoiの反対ならitoa使えばいいんでないの?
0155デフォルトの名無しさん
NGNGやっぱり、sprintf / printfしかないですかねぇ…
0156デフォルトの名無しさん
NGNGスタックの扱いは仕様外だけど、
デストラクタはちゃんと呼ばれる(6.6.2)。
まぁ、この場合は int なんで何もしないわけだけど。
>>154
itoa はコンパイラ独自の拡張関数。
0157デフォルトの名無しさん
NGNGVC++6ではnewに失敗するとデフォでNULL。
だけども、MFCを使用の設定になってると
直接クラスライブラリ使っていなくても
newの失敗はNULLじゃなくてCMemoryException例外だよ。
AFXなんとかのプリプロセッサで決まるはず。
スレ違いといわれればそれまでだが。
0158デフォルトの名無しさん
NGNG0159デフォルトの名無しさん
NGNG名前が長いから
0160デフォルトの名無しさん
NGNG循環参照に対応してないから
0161デフォルトの名無しさん
NGNG0162犬すき
NGNG0163デフォルトの名無しさん
NGNG0164デフォルトの名無しさん
NGNGvectorで頑張る。
固定長なら普通に配列
0165デフォルトの名無しさん
NGNGきちっと処理できんならいっぱい使ってくれ。
0166デフォルトの名無しさん
NGNGweak_ptrは仕様がイマイチ
0167デフォルトの名無しさん
NGNGかけばよいですか?主に、メモリーの不正使用によるコアダンプとかの
エラーを拾いたいです。
VBにおいては、On Error goto trap
Javaにおいては、
try{
〜
}catch(ErrException){ // <-こんな感じのメッセージ
〜
}
0168デフォルトの名無しさん
NGNGcatch(...)
0170167
NGNGありがとうございます。さっそく以下のように試して見ましたが
エラーは拾えなかったのですが、何が悪いのでしょう?
//Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
int main(int argc, char* argv[]){
int i=0,j=0;
try{
j=100/i;
printf("j=%d",j);
return 0;
}catch(...){
printf("err!");
}
}
0171デフォルトの名無しさん
NGNGC++が送出する例外を全てキャッチするわけであって
ランタイムのエラーなんか捕まえられるわけありませんがな。
VMで動いているJavaとは違う。
0172デフォルトの名無しさん
NGNGWindows なら http://hata.cc/docs/Win32Map/2-1.html
しかしVC++ならcatch( ... )でも行けるはずだが、Borlandはそうでもないのか。
0173167
NGNGなるほど。
本当に全てのエラーを拾えるわけではないんですね?
数字を0で割ったエラーはC++(BCB)では拾えない見たいですが
C++が拾えるエラーと拾えないエラーの見極めはどうしたらよいのでしょうか?
0174167
NGNGVC++で試した見たら、確かにエラーは拾えました。
どうも、コンパイラ依存のようですね。ありがとうございました。
int func(int i);
int main(int argc, char* argv[]){
int i=0;
try{
if(func(0) !=0 );
}catch(...){
printf("err!");
}
printf("exit\n");
scanf("%d",&i);
return 0;
}
int func(int i){
int j=0;
j=100/i;
printf("j=%d",j);
return 0;
}
0175デフォルトの名無しさん
NGNGBCB6up4ではちゃんとerr!って出たヨ
0176デフォルトの名無しさん
NGNGBCB(6)では拾えるってことでバージョンアップ汁
0177デフォルトの名無しさん
NGNGフリーコンパイラですもん。
バージョンアップもなにも(w
0178デフォルトの名無しさん
NGNGBCBって書いてるから誤解してたよ。
BC++5.5のことか。それはBCB(Borland C++ Builder)とは違うコンパイラだよ。
0179デフォルトの名無しさん
NGNGC++のコード内で throw std::exception("err"); とかやって投げてる
例外は catch で捕まえることができる。他のゼロ除算とか
ページ違反とかの OS が投げてくる例外は、拾い方は環境依存。
別の言い方をすると、「この関数はこの例外を投げるかもしれない」と
C++のドキュメントに書いてあればcatchで捕まえられる。それ以外は×。
0180デフォルトの名無しさん
NGNGコンパイラ(エンジン)は同じだろ
0181デフォルトの名無しさん
NGNG昔のバージョンのものみたいだから、概ね同じか。
0182デフォルトの名無しさん
NGNG0183デフォルトの名無しさん
NGNGVC++が多いのだろうけど。
0184デフォルトの名無しさん
NGNG0185デフォルトの名無しさん
NGNG0186デフォルトの名無しさん
NGNG0187デフォルトの名無しさん
NGNG0188デフォルトの名無しさん
NGNGcpp32
0189デフォルトの名無しさん
NGNG0190デフォルトの名無しさん
NGNG0191デフォルトの名無しさん
NGNG同志がいた。
0192デフォルトの名無しさん
NGNG#include <fstream>
using namespace std;
ostream &operator<<( ostream &stream, unsigned char ret ){
stream << (unsigned short)ret;
return stream;
}
int main(){
unsigned char x=62;
cout << x;
ofstream out("Result.txt");
out << x;
out << " " << x;
out.close();
return 1;
}
12行目のxのみがunsigned charで表示されてしまいます。
恐らくは12行目の<<のみがオーバーロードできていないのでしょうが、
原因と対策を教えていただけないでしょうか?
コンパイラはVC++6.0を使用しています。
宜しくお願いします。
0193デフォルトの名無しさん
NGNGchar にキャストするか、元から char に汁。
0194193
NGNG10行目と13行目は思惑通り数値で表記されるのですが、
12行目(左辺値に直接ostreamを持っていったとき)のみ、数値表示できません。
言葉足らず申し訳ありません。
0195192
NGNG0196デフォルトの名無しさん
NGNGVC++6.0のバグぽ。
0197デフォルトの名無しさん
NGNG0198デフォルトの名無しさん
NGNGgcc-3.3だと全てちゃんと数値表示された。
0199197
NGNG0200デフォルトの名無しさん
NGNGじゃぁ、int でキャスト汁。
規格でどちらが使われるのか決まってるかどうかは分からんが、
unsigned char でオーバーロードされてない時に char, int のどちらが使われるか
一意に決められないコンパイラがあるということだけは事実のようだし。
0201デフォルトの名無しさん
NGNG0202デフォルトの名無しさん
NGNGさっきから君は何を言っとるんだ?
0203デフォルトの名無しさん
NGNGスマソ。
何でだろね。
0204192
NGNGBC++の導入を検討します。
現在CからC++への移行のために勉強中なので
もしまたお世話になるときは宜しくお願いします。
0205デフォルトの名無しさん
NGNGostreamからの派生クラスofstreamへのオーバーロードができていない可能性がありますね
ofstream &operator<<(ofstream &stream, unsigned char ret){
(ostream)stream << (unsigned short)ret;
return stream;
}
を追加してはどうですか
0206デフォルトの名無しさん
NGNGvc7でも表示のしかたvc6と変わりませんけど。
>>192
わざわざコンパイラ変える必要なんてない。
>>200の言っているようにキャストすりゃオーバーロードも必要性がない
>>205
それはオーバーロード関数があいまいと表示されるかと
0207デフォルトの名無しさん
NGNG205です。
当方VC6ですが、(ostream)キャストを使うため
あいまいさはなくなります。
0208206
NGNG0209206
NGNG0210デフォルトの名無しさん
NGNG0211デフォルトの名無しさん
NGNG"error C2051: case 式は、整数型定数でなければなりません。"
というエラーが出ます。
定数の定義文をbar.cppに書くとbar.cppは正常にコンパイルされ、hoge.cppのcase文で上記エラーが出ます。両方に定義を書くと、多重定義でエラーが出ます。
どうすればいいのでしょうか?
hoge.h
class CHoge {
static const int FOO; // 定数の宣言
...
}
hoge.cpp
#include "hoge.h"
const int CHoge::FOO = 1; // 定数の定義
...
switch (i) {
case CHoge::FOO: // ここではエラーにならない
...
}
bar.cpp
#include "hoge.h"
...
switch (i) {
case CHoge::FOO: // ここではエラーになる
...
}
0212デフォルトの名無しさん
NGNGclass CHoge {
enum { FOO = 1 }; // 定数の定義
...
};
0213デフォルトの名無しさん
NGNG値が hoge.cpp で指定されているので、
bar.cpp のコンパイル時にその値を参照できないのだ。
C++ の仕様上は
class CHoge {
static const int FOO = 1;
...
};
とすればいいんだが、
VC++6.0 ではこの仕様に準拠してないので
>>212 のようにする。
0214デフォルトの名無しさん
NGNG0215211
NGNGcase文に使うような整数定数はenum使えばいいんですね。
解決できました。ありがとうございます!
0216デフォルトの名無しさん
NGNGsprintfをつかわにゃならないのですか?
0217デフォルトの名無しさん
NGNGostream::operator<<
0219デフォルトの名無しさん
NGNGもしよろしければ、わかりやすく教えてください
0220デフォルトの名無しさん
NGNG説明とか読んでも分からないと言う人にどうやって説明すればいいのかわかりません。
0221デフォルトの名無しさん
NGNG#include<vector>
#include<stdexcept>
int main()
{
try
{
std::vector<int> v(10);
v.at(10);
}
catch(std::out_of_range& out)
{
std::cout<<out.what();
}
return 0;
}
0222デフォルトの名無しさん
NGNGhttp://www1.free-city.net/home/s-rf9/page004.html
http://www1.free-city.net/home/s-rf9/page005.html
0223デフォルトの名無しさん
NGNG□□□□□□□□□□■■■■■■■□□□□□□□□□□□□
□□□□□□□□□■■■■■■■■■□□□□□□□□□□□
□□□□□□□□■■□□■■■□□■■□□□□□□□□□□
□□□□□□□■■■□□■■■□□■■■□□□□□□□□□
□□□□□□□■■■□□■■■□□■■■□□□□□□□□□
□□□□□□□■■■■■■□■■■■■■□□□□□□□□□
□□□□□□□■■■■■■□■■■■■■□□□□□□□□□
□□□■■■□□■■■■□■□■■■■■□■■■□□□□□
□□□■■■□□■■■■■■■■■■■□□■■■□□□□□
□□□■■■■□□□■■■■■■■□□□■■■■□□□□□
□□□□□■■■□□□■■■■■□□□■■■□□□□□□□
□□□□□□■■■□□□□□□□□□■■■□□□□□□□□
□□□□□□□■■■□■■■■■□■■■□□□□□□□□□
□□□□□□□□■■■□■■■□■■■□□□□□□□□□□
□□■■■■■■□■■■□□□■■■□■■■■■■□□□□
□□□■□■□□□□■■■□■■■□□□□■□■□□□□□
□□■□■■□■□□□■■■■■□□□■□■■□■□□□□
□□□■■■■□□□□□■■■□□□□□■■■■□□□□□
□□□□■■□□□□□■■■■■□□□□□■■□□□□□□
□□□■□■□□■□■■■□■■■□■□□■□■□□□□□
□□■□□■■■■■■■□□□■■■■■■■□□■□□□□
□□□□□□□□■■■□□□□□■■■□□□□□□□□□□
□□□□□□□■■■□□□□□□□■■■□□□□□□□□□
□□□□□■■■■□□□□□□□□□■■■■□□□□□□□
□□□■■■■■□□□□□□□□□□□■■■■■□□□□□
□□□■■■■□□□□□□□□□□□□□■■■■□□□□□
□□□■■■□□□□□□□□□□□□□□□■■■□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
0224デフォルトの名無しさん
NGNGださいJavaを見習え
0225デフォルトの名無しさん
NGNG0226デフォルトの名無しさん
NGNGぬるぽ
0227デフォルトの名無しさん
NGNG所詮C++の派生のくせして。
0228デフォルトの名無しさん
NGNGusing namespace std;
int func(){
    throw "hello\n";
    return 0;
}
int hello(){
    return func();
}
class Test{public:
    ~Test(){cout << "Test::~Test()が呼ばれました"<<endl;}
};
int main(){
    try{
        Test o;
        hello();
        Test o2;
    }
    catch(const char * p){cout << p << endl;}
    return 0;
}
0229デフォルトの名無しさん
NGNG所詮Cの(ry
所詮アセンブラの(ry
0230デフォルトの名無しさん
NGNG所詮Simulaの(ry
が抜けてるぞ
0231デフォルトの名無しさん
NGNG0232デフォルトの名無しさん
NGNG配列の大きさは固定) のデータを簡単にファイルに書き込み・読み出して
変数に代入できるメソッドはC++にあるのでしょうか?
0233デフォルトの名無しさん
NGNG0234デフォルトの名無しさん
NGNG0235デフォルトの名無しさん
NGNGfwriteとfread
0236デフォルトの名無しさん
NGNGそんなに巨大なわけでもないな。
0237デフォルトの名無しさん
NGNG構造体にしたほうがよくないか・・・?
0238デフォルトの名無しさん
NGNG10年ちょっとくらい昔ならパンクしてるけどね。
0239デフォルトの名無しさん
NGNGいろんなサンプルコードを見て勉強しているのですが、
構造体変数をコピーするのに、単に代入で済ましている
ものと、memcpy()で行っているものとがあります。
これはどんな違いがあるのでしょうか?
0240_
NGNG0241デフォルトの名無しさん
NGNG構造体の代入演算子がオーバーロードされている場合がある
0242239
NGNGあっ、なるほど!!
ありがとう。。。
0243デフォルトの名無しさん
NGNGVCなんかの場合は出力コードを見ると、メンバを一つ一つ代入処理するように展開される
よってmemcpyより遅くなる
0244239
NGNGそうなんですか!
グリッドのサンプルを見ていたら、各セルのLOGFONTを
設定するのにmemcpyを使っていたのですが、スピード
が要求されるからなんですネ。
どうもです。。。
0245デフォルトの名無しさん
NGNG0246デフォルトの名無しさん
NGNG分割コンパイルとか言うのをやろうと思って
ソースファイルを2つ用意して片方に関数プログラムを書いて
もう片方にその関数を実行した結果を表示するプログラムを
書いてコンパイルしてみたんですが。ソース自体にはエラーは
でなかったんですが、
bunkatu error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 _WinMainCRTStartup で参照されました。
とかいうよくわからないエラーが出ちゃって困ってます
分割コンパイルってC++.netでやるとき何か設定とかひつようなんですか?
0247デフォルトの名無しさん
NGNG0248246
NGNGありがとうございます。
でも、mainをWinMain()に変えてもエラーは消えませんでした・・・
なぜでしょう?
0249デフォルトの名無しさん
NGNGWindows アプリケーションから
コンソールアプリケーションに変えた方がいいんでは?
0250デフォルトの名無しさん
NGNGmainとは違うが、>>246の問題はそこに留まらないだろうから>>249のとおり
0251246
NGNG.netってコンソールアプリケーションつくれるんですか?
0252デフォルトの名無しさん
NGNG■ このスレッドは過去ログ倉庫に格納されています