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

C++相談室 part20

■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v NGNG
C++に関する質問はこちらへどうぞ。
ただし質問の前にFAQに一通り目を通してください。
また、テンプレートライブラリ(STL含む)に関する質問は
専用の別スレへどうぞ。

過去スレ、関連スレ、関連リンクなどはこちら>>2-10
0153デフォルトの名無しさんNGNG
sprintf
0154デフォルトの名無しさんNGNG
>>152
atoiの反対ならitoa使えばいいんでないの?
0155デフォルトの名無しさんNGNG
boost::formatって便利だけど、boostなしでそれっぽいことをしようとすると
やっぱり、sprintf / printfしかないですかねぇ…
0156デフォルトの名無しさんNGNG
>>151
スタックの扱いは仕様外だけど、
デストラクタはちゃんと呼ばれる(6.6.2)。
まぁ、この場合は int なんで何もしないわけだけど。

>>154
itoa はコンパイラ独自の拡張関数。
0157デフォルトの名無しさんNGNG
ガイシュツかもしれんが、
VC++6ではnewに失敗するとデフォでNULL。
だけども、MFCを使用の設定になってると
直接クラスライブラリ使っていなくても
newの失敗はNULLじゃなくてCMemoryException例外だよ。
AFXなんとかのプリプロセッサで決まるはず。
スレ違いといわれればそれまでだが。
0158デフォルトの名無しさんNGNG
shared_ptr が標準に組み込まれないのはなんでだろ〜
0159デフォルトの名無しさんNGNG
>>158
名前が長いから
0160デフォルトの名無しさんNGNG
>>158
循環参照に対応してないから
0161デフォルトの名無しさんNGNG
weak_ptrごと取り込めば
0162犬すきNGNG
標準委員会で作れんかったから
0163デフォルトの名無しさんNGNG
C++では裸の配列は使わないの?
0164デフォルトの名無しさんNGNG
動的にとる時はdelete[]が嫌ー!
vectorで頑張る。
固定長なら普通に配列
0165デフォルトの名無しさんNGNG
>>163
きちっと処理できんならいっぱい使ってくれ。
0166デフォルトの名無しさんNGNG
>>161
weak_ptrは仕様がイマイチ
0167デフォルトの名無しさんNGNG
(1)全てのエラーを拾いたいんですけれどcatch部分にはどのようなメッセージを
   かけばよいですか?主に、メモリーの不正使用によるコアダンプとかの
   エラーを拾いたいです。
   
  VBにおいては、On Error goto trap
Javaにおいては、
try{
〜
}catch(ErrException){ // <-こんな感じのメッセージ
  〜
   }

  
0168デフォルトの名無しさんNGNG
>>167
catch(...)
0169_NGNG
http://homepage.mac.com/hiroyuki44/jaz03.html
0170167NGNG
>>168
ありがとうございます。さっそく以下のように試して見ましたが
エラーは拾えなかったのですが、何が悪いのでしょう?
//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デフォルトの名無しさんNGNG
>>170

C++が送出する例外を全てキャッチするわけであって
ランタイムのエラーなんか捕まえられるわけありませんがな。

VMで動いているJavaとは違う。
0172デフォルトの名無しさんNGNG
>>170
Windows なら http://hata.cc/docs/Win32Map/2-1.html
しかしVC++ならcatch( ... )でも行けるはずだが、Borlandはそうでもないのか。
0173167NGNG
>>171
なるほど。
本当に全てのエラーを拾えるわけではないんですね?

数字を0で割ったエラーはC++(BCB)では拾えない見たいですが
C++が拾えるエラーと拾えないエラーの見極めはどうしたらよいのでしょうか?
0174167NGNG
>>172
VC++で試した見たら、確かにエラーは拾えました。
どうも、コンパイラ依存のようですね。ありがとうございました。

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デフォルトの名無しさんNGNG
>>170
BCB6up4ではちゃんとerr!って出たヨ
0176デフォルトの名無しさんNGNG
>>173
BCB(6)では拾えるってことでバージョンアップ汁
0177デフォルトの名無しさんNGNG
>>176
フリーコンパイラですもん。
バージョンアップもなにも(w
0178デフォルトの名無しさんNGNG
>>177
BCBって書いてるから誤解してたよ。
BC++5.5のことか。それはBCB(Borland C++ Builder)とは違うコンパイラだよ。
0179デフォルトの名無しさんNGNG
>>173
C++のコード内で throw std::exception("err"); とかやって投げてる
例外は catch で捕まえることができる。他のゼロ除算とか
ページ違反とかの OS が投げてくる例外は、拾い方は環境依存。

別の言い方をすると、「この関数はこの例外を投げるかもしれない」と
C++のドキュメントに書いてあればcatchで捕まえられる。それ以外は×。
0180デフォルトの名無しさんNGNG
>>178
コンパイラ(エンジン)は同じだろ
0181デフォルトの名無しさんNGNG
>>180
昔のバージョンのものみたいだから、概ね同じか。
0182デフォルトの名無しさんNGNG
BC++5.5はBCB5に付属
0183デフォルトの名無しさんNGNG
みなさんコンパイラのツールはなにつかってるの?
VC++が多いのだろうけど。
0184デフォルトの名無しさんNGNG
コンパイラのツールってなんだ?
0185デフォルトの名無しさんNGNG
細かいこと言ってやるなって
0186デフォルトの名無しさんNGNG
そこツッコまない
0187デフォルトの名無しさんNGNG
はもねぷ〜〜〜〜〜
0188デフォルトの名無しさんNGNG
>>183
cpp32
0189デフォルトの名無しさんNGNG
Visual C++ 7.1(.NET 2003)ってオリジナルの Loki そのまま使えるの?
0190デフォルトの名無しさんNGNG
MaxOSX の gcc。つか、宿題スレでしか使わないけどな。
0191デフォルトの名無しさんNGNG
>>190
同志がいた。
0192デフォルトの名無しさんNGNG
#include <iostream>
#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デフォルトの名無しさんNGNG
char と unsigned char は違う型なので
char にキャストするか、元から char に汁。
0194193NGNG
いえ、数値表示したいのです。
10行目と13行目は思惑通り数値で表記されるのですが、
12行目(左辺値に直接ostreamを持っていったとき)のみ、数値表示できません。
言葉足らず申し訳ありません。
0195192NGNG
すみません、名前欄は193ではなく192の間違いです
0196デフォルトの名無しさんNGNG
BC++5.5.1では3度ともグローバルのが呼ばれた。
VC++6.0のバグぽ。
0197デフォルトの名無しさんNGNG
それぞれが発売された時期を考えろ
0198デフォルトの名無しさんNGNG
gcc-2.95だとambiguous overloadと言われてコンパイルできなかった。
gcc-3.3だと全てちゃんと数値表示された。
0199197NGNG
Borlandの方は発売とはいわないけど
0200デフォルトの名無しさんNGNG
>>194
じゃぁ、int でキャスト汁。

規格でどちらが使われるのか決まってるかどうかは分からんが、
unsigned char でオーバーロードされてない時に char, int のどちらが使われるか
一意に決められないコンパイラがあるということだけは事実のようだし。
0201デフォルトの名無しさんNGNG
もしくは元から int にするか。
0202デフォルトの名無しさんNGNG
>>193=>>200-201
さっきから君は何を言っとるんだ?
0203デフォルトの名無しさんNGNG
なんだ。よく見たら自分でオーバーロードしてたのね...。
スマソ。
何でだろね。
0204192NGNG
バグですか…どうもありがとうございました。
BC++の導入を検討します。
現在CからC++への移行のために勉強中なので
もしまたお世話になるときは宜しくお願いします。
0205デフォルトの名無しさんNGNG
>>192
ostreamからの派生クラスofstreamへのオーバーロードができていない可能性がありますね
ofstream &operator<<(ofstream &stream, unsigned char ret){
(ostream)stream << (unsigned short)ret;
return stream;
}
を追加してはどうですか
0206デフォルトの名無しさんNGNG
>>197
vc7でも表示のしかたvc6と変わりませんけど。
>>192
わざわざコンパイラ変える必要なんてない。
>>200の言っているようにキャストすりゃオーバーロードも必要性がない
>>205
それはオーバーロード関数があいまいと表示されるかと
0207デフォルトの名無しさんNGNG
>>206
205です。
当方VC6ですが、(ostream)キャストを使うため
あいまいさはなくなります。
0208206NGNG
俺のvc7じゃキャストできん。
0209206NGNG
ちなみにg++でも無効やって、怒られちゃいます。
0210デフォルトの名無しさんNGNG
(ostream&)
0211デフォルトの名無しさんNGNG
MSVC++6.0で以下のように、hoge.hでCHogeのなかにFOOという定数を宣言し、hoge.cppでその定義を行います。すると、hoge.cppのなかでは問題なく定数として扱われてcase文にも使えるのですが、宣言をincludeしているだけのbar.cppでは
"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デフォルトの名無しさんNGNG
hoge.h
class CHoge {
enum { FOO = 1 }; // 定数の定義
...
};
0213デフォルトの名無しさんNGNG
>>211
値が hoge.cpp で指定されているので、
bar.cpp のコンパイル時にその値を参照できないのだ。
C++ の仕様上は
 class CHoge {
  static const int FOO = 1;
  ...
 };
とすればいいんだが、
VC++6.0 ではこの仕様に準拠してないので
>>212 のようにする。
0214デフォルトの名無しさんNGNG
enumファックですな
0215211NGNG
>> 212-214
case文に使うような整数定数はenum使えばいいんですね。
解決できました。ありがとうございます!
0216デフォルトの名無しさんNGNG
C++の標準クラスに数値→文字列変換できるメソッドってありますか?
sprintfをつかわにゃならないのですか?
0217デフォルトの名無しさんNGNG
>>216
ostream::operator<<
0218217NGNG
>>216
いやどちらかといえばostringstreamかostrstream
0219デフォルトの名無しさんNGNG
C++の例外処理が説明とかを読んでも意味が分かりません
もしよろしければ、わかりやすく教えてください
0220デフォルトの名無しさんNGNG
>>219
説明とか読んでも分からないと言う人にどうやって説明すればいいのかわかりません。
0221デフォルトの名無しさんNGNG
#include<iostream>
#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デフォルトの名無しさんNGNG
みてね〜♪
http://www1.free-city.net/home/s-rf9/page004.html
http://www1.free-city.net/home/s-rf9/page005.html
0223デフォルトの名無しさんNGNG
□□□□□□□□□□□■■■■■□□□□□□□□□□□□□
□□□□□□□□□□■■■■■■■□□□□□□□□□□□□
□□□□□□□□□■■■■■■■■■□□□□□□□□□□□
□□□□□□□□■■□□■■■□□■■□□□□□□□□□□
□□□□□□□■■■□□■■■□□■■■□□□□□□□□□
□□□□□□□■■■□□■■■□□■■■□□□□□□□□□
□□□□□□□■■■■■■□■■■■■■□□□□□□□□□
□□□□□□□■■■■■■□■■■■■■□□□□□□□□□
□□□■■■□□■■■■□■□■■■■■□■■■□□□□□
□□□■■■□□■■■■■■■■■■■□□■■■□□□□□
□□□■■■■□□□■■■■■■■□□□■■■■□□□□□
□□□□□■■■□□□■■■■■□□□■■■□□□□□□□
□□□□□□■■■□□□□□□□□□■■■□□□□□□□□
□□□□□□□■■■□■■■■■□■■■□□□□□□□□□
□□□□□□□□■■■□■■■□■■■□□□□□□□□□□
□□■■■■■■□■■■□□□■■■□■■■■■■□□□□
□□□■□■□□□□■■■□■■■□□□□■□■□□□□□
□□■□■■□■□□□■■■■■□□□■□■■□■□□□□
□□□■■■■□□□□□■■■□□□□□■■■■□□□□□
□□□□■■□□□□□■■■■■□□□□□■■□□□□□□
□□□■□■□□■□■■■□■■■□■□□■□■□□□□□
□□■□□■■■■■■■□□□■■■■■■■□□■□□□□
□□□□□□□□■■■□□□□□■■■□□□□□□□□□□
□□□□□□□■■■□□□□□□□■■■□□□□□□□□□
□□□□□■■■■□□□□□□□□□■■■■□□□□□□□
□□□■■■■■□□□□□□□□□□□■■■■■□□□□□
□□□■■■■□□□□□□□□□□□□□■■■■□□□□□
□□□■■■□□□□□□□□□□□□□□□■■■□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
0224デフォルトの名無しさんNGNG
>>221
ださいJavaを見習え
0225デフォルトの名無しさんNGNG
ぷ、Javaとかいってんのみ手ラン内
0226デフォルトの名無しさんNGNG
>>224
ぬるぽ
0227デフォルトの名無しさんNGNG
javaのなにをどう見習えというの
所詮C++の派生のくせして。
0228デフォルトの名無しさんNGNG
#include <iostream>
using 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
>>227
所詮Cの(ry
所詮アセンブラの(ry
0230デフォルトの名無しさんNGNG
>>229
所詮Simulaの(ry
が抜けてるぞ
0231デフォルトの名無しさんNGNG
所詮チューリングマシンの(略
0232デフォルトの名無しさんNGNG
環境はBCB6なのですが、double型の4次元配列 (サイズは 130×20×20×20 程度で
配列の大きさは固定) のデータを簡単にファイルに書き込み・読み出して
変数に代入できるメソッドはC++にあるのでしょうか?
0233デフォルトの名無しさんNGNG
四次元配列 Σ( ̄□ ̄;)!!
0234デフォルトの名無しさんNGNG
なぜ4次元も使うことになったのか興味が
0235デフォルトの名無しさんNGNG
>>232
fwriteとfread
0236デフォルトの名無しさんNGNG
130*20*20*20*8=8,320,000
そんなに巨大なわけでもないな。
0237デフォルトの名無しさんNGNG
4次元配列にするならクラスか
構造体にしたほうがよくないか・・・?
0238デフォルトの名無しさんNGNG
>>236
10年ちょっとくらい昔ならパンクしてるけどね。
0239デフォルトの名無しさんNGNG
質問お願いします。
いろんなサンプルコードを見て勉強しているのですが、
構造体変数をコピーするのに、単に代入で済ましている
ものと、memcpy()で行っているものとがあります。
これはどんな違いがあるのでしょうか?
0240_NGNG
http://homepage.mac.com/hiroyuki44/
0241デフォルトの名無しさんNGNG
>>239
構造体の代入演算子がオーバーロードされている場合がある
0242239NGNG
>>241
あっ、なるほど!!
ありがとう。。。
0243デフォルトの名無しさんNGNG
>>239
VCなんかの場合は出力コードを見ると、メンバを一つ一つ代入処理するように展開される
よってmemcpyより遅くなる
0244239NGNG
>>243
そうなんですか!
グリッドのサンプルを見ていたら、各セルのLOGFONTを
設定するのにmemcpyを使っていたのですが、スピード
が要求されるからなんですネ。
どうもです。。。
0245デフォルトの名無しさんNGNG
いや、その程度の処理ならどっち使っても、人間には認識できないレベルの速度差にしかならない
0246デフォルトの名無しさんNGNG
プログラムを始めて間もない初心者なんですが
分割コンパイルとか言うのをやろうと思って
ソースファイルを2つ用意して片方に関数プログラムを書いて
もう片方にその関数を実行した結果を表示するプログラムを
書いてコンパイルしてみたんですが。ソース自体にはエラーは
でなかったんですが、
bunkatu error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 _WinMainCRTStartup で参照されました。
とかいうよくわからないエラーが出ちゃって困ってます
分割コンパイルってC++.netでやるとき何か設定とかひつようなんですか?
0247デフォルトの名無しさんNGNG
ウィンドーズアプリケーションはmainではなくWinMainからはじまる。OK?
0248246NGNG
>>247
ありがとうございます。
でも、mainをWinMain()に変えてもエラーは消えませんでした・・・
なぜでしょう?
0249デフォルトの名無しさんNGNG
というか、
Windows アプリケーションから
コンソールアプリケーションに変えた方がいいんでは?
0250デフォルトの名無しさんNGNG
WinMainはint WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)で
mainとは違うが、>>246の問題はそこに留まらないだろうから>>249のとおり
0251246NGNG
>>249
.netってコンソールアプリケーションつくれるんですか?
0252デフォルトの名無しさんNGNG
作れるよ
■ このスレッドは過去ログ倉庫に格納されています