トップページ⇒tech
568コメント175KB

C++相談室 part22

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

過去スレ、関連スレ、関連リンクなどはこちら>>2-7
0153デフォルトの名無しさんNGNG
>>152
私はVC++でコンパイルするソースもgccでコンパイルするソースも
同じエディタを使ってますが。
0154デフォルトの名無しさんNGNG
>>152
つくれるぷろ�cの種類が違います
0155デフォルトの名無しさんNGNG
ボーランドしぃプラプラのインスコと環境変数の設定は終わった。
簡単なソースも書いた。拡張子も.cppにした。
cd使って.cppが置いてあるフォルダまで行く事も出来た。

で、コンパイルするには後なにをすれば良いんだ?
HSPはボタン一発で全部やってくれたんだが
CとかC++ってなんか小難しいのな。
0156デフォルトの名無しさんNGNG
>>155
makefile で ググれ。
俺はVCしか使ったこと無いんで、これ以上説明できん。
0157デフォルトの名無しさんNGNG
bbc failname
0158デフォルトの名無しさんNGNG
>>157
名前をしくじるのか?
0159デフォルトの名無しさんNGNG
>>157
> bbc failname
なんか失敗しそうだなw
0160デフォルトの名無しさんNGNG
>>155
http://www.hi-ho.ne.jp/jun_miura/bccdev.htm
あたり使え
0161デフォルトの名無しさんNGNG
>>157
徹夜明けだけど激しくwラタ
0162デフォルトの名無しさんNGNG
bcc32 filename でやったぞ
0163デフォルトの名無しさんNGNG
いまさらながらだが、bbcじゃなくてbccだよな。
0164デフォルトの名無しさんNGNG
いまさらながらだが、bbcじゃなくてbccだよな。
0165デフォルトの名無しさんNGNG
いまさらながらだが、bbcじゃなくてbccだよな。
0166デフォルトの名無しさんNGNG
bcc32 filenameでやったらコンパイルできたぞ!
最初bbcとbcc試してダメだったんだが32を付けないといかんのだな。
objファイルとかtdsファイルとかわけわからん物まで出てきたがな!
お前等thx

exeファイルクリックしても一瞬で画面が消えてしまうのは、
ソースにHSPで言うwaitとかstopを入れてないからだろうか。
0167デフォルトの名無しさんNGNG
クリックして実行すんじゃなくて、コマンドプロンプトからfilename[Enter]で
0168デフォルトの名無しさんNGNG
Auto〜って予約語ですか?
0169デフォルトの名無しさんNGNG
>>168
no
0170デフォルトの名無しさんNGNG
auto のみ予約語
0171168NGNG
>>169-170
ありがとうございます
0172デフォルトの名無しさんNGNG
>>167
thx

*
**
***
****
*****

と表示する事に成功したよ。
0173デフォルトの名無しさんNGNG
tdsとかobjファイルって消したらまずい?
激しく邪魔なんだけど。
0174デフォルトの名無しさんNGNG
>173
いいよ。
0175デフォルトの名無しさんNGNG
>>173
全部開発が終了したら消す。
0176デフォルトの名無しさんNGNG
>>173
かまわんが。ソースコードの管理だけはちゃんとしとけよ。
0177デフォルトの名無しさんNGNG
このページの後半に書かれていることは間違いですよね?
http://www.kurumi.sakura.ne.jp/~kumicyou/cplusplus/1305.html
0178デフォルトの名無しさんNGNG
中盤にかかれている、
>実は、explicitを使用しない場合、コンストラクタは何回でも呼べる。
> A a = 1; //a = A( 1 );
> a = 2; //a = A( 2 );
このあたりから、間違いなわけだが。
0179デフォルトの名無しさんNGNG
>>177
うへえ、コンストラクタでメモリ確保すると異常終了するだって?
むちゃくちゃですな。
'Resource Acquisition is Initialization'の前提が崩れる(笑)

それより代入演算子定義してないからメモリリーク起こしてそうだけどな。
0180デフォルトの名無しさんNGNG
まさに、「代入演算子定義してない」から、二重解放がおこっているのでせう。
0181デフォルトの名無しさんNGNG
> A a = 1; //a = A( 1 );
これは×
> a = 2; //a = A( 2 );
これは○

>(異なるインスタンスを作れば)コンストラクタは何回でも呼べる。
○
0182デフォルトの名無しさんNGNG
>>177
A a = 1; // A::A(1)で初期化, a.p確保
a = 2; //a = A( 2 ); これは分解すると:
// 1. 一時オブジェクト tempがA::A(2)で初期化, temp.p確保
// 2. a.operator=(temp)を実行, デフォルトなのでまるまるコピーされ
// a.pが刺していたメモリはリーク、a.pはtemp.pが指す内容になる
// 3. 一時オブジェクトtempが解体, temp.pはfree
// a.pが指している領域は開放済みになってしまう
a = 3;
a = 4;
a = 5;
この時点で、a.pには A(5)の一時オブジェクトのために確保されて
既に開放されたアドレスが入っている。
結果、returnの時点で、aの初期化のときに確保されたpのメモリがリークし、
A(5)の一時オブジェクトで確保されたpが二重解放されてるわけだな。
0183デフォルトの名無しさんNGNG
>>35,79
VCなら
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vcmex/html/vcconmanagedtypesmfc.asp
みたいな手は使えない?
試してみたけど、MFCアプリの中でMC++できた。
0184デフォルトの名無しさんNGNG
visual c++ とフツーのC++はどう違うんですか?
どっち先に覚えればいいですか?
0185デフォルトの名無しさんNGNG
>>184
フツーのC++って何よ
0186デフォルトの名無しさんNGNG
>>184
少なくとも小文字と大文字の違い以上のものはあると思うぞ。
0187デフォルトの名無しさんNGNG
>>184
どちらか片方でも全て覚えることは無理。
覚えるのではなく、使えるようになればよい。
0188デフォルトの名無しさんNGNG
文法とかは同じだよね?VC++も。
俺borlandのつかってるけどVCとどう違うのか良くワカラソ
しかもC++はじめたばかりの初心者ときたもんだ
0189デフォルトの名無しさんNGNG
いろいろと処理系特有の言語拡張がある
0190デフォルトの名無しさんNGNG
Visual C++, Borland C++ Builder = 製品名
C++ = 言語名

「VC++, BCB は、C++で開発するための環境を提供するアプリ」ってことやん。
まぁ、環境固有の言語拡張とかもあるけどさ…
0191デフォルトの名無しさんNGNG
処理系と言語
0192デフォルトの名無しさんNGNG
誰か俺に宿題を出しておくれ。
ちなみに30分前にC言語ライフをスタートしたペーペー。
知識としてはHSPでシューティングからRPGまで一通り作った程度。
Cの知識はウンコみたいなもんです。
0193デフォルトの名無しさんNGNG
宿題スレの過去問でもやっとけ。
0194デフォルトの名無しさんNGNG
何を入れても ぬるぽ と出力される iostream を実装せよ。
0195デフォルトの名無しさんNGNG
>>194
ぬるぽ と入れたら ガッ と出して欲しいね。
0196デフォルトの名無しさんNGNG
例えばtest()とmain()があって、test()の後にmain()がある。
両方関数だけどtest()の中にcoutとか書かれててもそこでは実行されなくて、
main()以下でtest()が呼び出された場合に初めてtest()の中に書かれてるcoutが実行される。
プログラムはmain()以下で始まってそれ以前にある物はただの宣言(設定)みたいな物。

こういう認識で合ってますか?
0197デフォルトの名無しさんNGNG
>>194
iostreamを実装せよの部分が良くわからんけど、
何か値を入力出来る様にチャット窓みたいなの作って、
そこに何を入れられても「ぬるぽ」って出力すれば良いって事?

つまり入力する所でエンター押された時に入力された値を無視して、
関数nurupo()に飛ばしてcout << "ぬるぽ" << endl;を実行させる様にすれば良いだけか。

まぁそのチャット窓の作り方から調べないといけないわけだけれども。
0198デフォルトの名無しさんNGNG
>>197
basic_iostreamを派生したクラスを実装しろってことでは
0199デフォルトの名無しさんNGNG
>>198
やっぱり俺の理解を超えた難しい意味だったのか。
まぁとりあえず197に書いた「何入力してもぬるぽと表示するプログラム」は出来たよ。

勝手に理解して勘違いしたが勝手に宿題もしたからこれでおk!
0200デフォルトの名無しさんNGNG
>>197 >>199
ガッ
0201デフォルトの名無しさんNGNG
「何入力してもぬるぽ」ってのは「何出力してもぬるぽ」の間違いちゃうんかと。
0202デフォルトの名無しさんNGNG
情けない質問なのですがおながいします。
int と float の計算で
100 * 2.33000 が 232 になってしまいます。
コンパイラもwarning(floatからintへの変換でデータが失われている
かもしれない)といっているのですが、
こんなときどうコーディングすればいいのでしょうか?
0203デフォルトの名無しさんNGNG
有理数(boost::rationalとか)
0204デフォルトの名無しさんNGNG
>>202
intの100をfloatに型キャストすればいいんじゃないの?

(float)100*2.33000

俺は試してないからね。自分で試してみてね。
0205デフォルトの名無しさんNGNG
実は232.9999...というオチ
0206202NGNG
>>203
サンクスコです。
でもboost入ってないんです。TT

>>204
それもやってみたのですがダメです。
10000をかけると23299になりますた。
ウォッチだと2.33000ってなってるのに
なんなんでしょう。TT
どうもです。。。
0207202NGNG
>>205
>実は232.9999...というオチ

実際そのようです。TT
どうすればいいでしょうか?


0208デフォルトの名無しさんNGNG
四捨五入じゃダメ?
0209202NGNG
作業的には、intは用紙幅でfloatはプレビュー倍率です。

>>208

四捨五入、あるいは切り上げはできたらしたいのですが
nWidth * fZoom のどこでしたらいいのでしょう。
初心者質問でしみません。。。

0210デフォルトの名無しさんNGNG
floatがはじめからdoubleならうまくいくんだけどねぇ。
floatをdoubleにキャストしても駄目みたい。
内部表現の問題だろうな。
0211202NGNG
>>210
ですよね。doubleにキャストしてもダメでした。
デバッグウィンドウにも2.33000って出てるのに
タチ悪いです。VC++6.0なんですがこんななんですね。。。
0212デフォルトの名無しさんNGNG
>>209
#include <cmath>
四捨五入:
 static_cast< int >( std::floor( nWidth * fZoom + 0.5f ) );
切り上げ:
 static_cast< int >( std::ceil( nWidth * fZoom ) );

四捨五入のfloorはいらんかも。
0213212NGNG
VC6か。std外さないと通らないかも。
0214デフォルトの名無しさんNGNG
>>211
俺が確認したのはBCCだったよ。結果は同じだった。
0215202NGNG
みなさんレスありがとう。
212さんの切り上げでみごと解決しますた。(端数の
原因はわからないので保留しますた。stdははずしたら
通りますた。)
遅くにほんとにどうもありがとう!!...(TT)...
0216デフォルトの名無しさんNGNG
floatの2.33自体が実は内部表現では2.299...となっているから、
根本的に無理かもしれない。もとデータがすでに2.33ではないのだから。
この場合は四捨五入で逃げられるかもしれないが、
今度は.5境界近辺で同じ問題に遭遇するので根本的解決にはならないかも。
0217デフォルトの名無しさんNGNG
浮動小数点数の計算は数学のようにはゆかない。
0218202NGNG
>>216
だからBCCでもVCでも同じ現象なんでしょうか。

>今度は.5境界近辺で同じ問題に遭遇するので根本的解決にはならないかも。

印刷のズレ程度なのでとりあえず保留しておくことにします。
端数ってムズいですね。。。
0219デフォルトの名無しさんNGNG
こういうのって(最終的にintが必要なら)100倍とか10000倍とかで倍率を整数値で保持しておいて
最終結果を1/100なり(必要なら50足してから)するのが、一番まともな気がするけど。
利息や消費税計算とかはそうじゃないのかな?知らないけど。
0220202NGNG
>>217
>浮動小数点数の計算は数学のようにはゆかない。

つねにそれを頭に入れておかないといけないんですね。
お金がらみじゃなくてよかたー。

>>219
>こういうのって(最終的にintが必要なら)100倍とか10000倍とかで倍率を整数値で保持しておいて

なるほど...
ちらっと思ったのですが印刷部分でスピードが必要と思い、そのまま
ピクセルで持っちゃったのが悪かったかも。。。
(別のtwipとかの座標系を使うとか...)
0221デフォルトの名無しさんNGNG
お金がらみは怖いよね。
昔、COBOL使ってたけど固定小数点だったな。
科学技術計算をさせるときは難儀だったけど。
0222デフォルトの名無しさんNGNG
Currencyとかの通貨型をサポートする環境も増えてきてるよね。
COBOLは給与計算とか販売管理、生産管理とかで
実績は十分証明されているもんね。
昔VBでお金からみのシステムの置き換えをやったけど
稼動後以前のシステムと1円合わないとか言われた。
例えばa * b * cでa*bですぐ端数処理するか、全部終わって
やるかの誤差らしかった。んなもん知るかとw
0223デフォルトの名無しさんNGNG
そんなこと言わずに、丁寧につくってあげてなー。
0224デフォルトの名無しさんNGNG
というか、どう端数処理するかが仕様に含まれていないのは如何なものかと。
0225デフォルトの名無しさんNGNG
>>224
仕様出す方は、切り捨てと四捨五入とJIS丸めの違いを知らないから。

>>202
速度を重視するなら尚更floatなんて使うな。
恐らくはdoubleで充分だし、必要なら整数で実装するべき。
0226デフォルトの名無しさんNGNG
っていうか、boost 入ってないなら今からインストールして rational 使えば?

>>225
印刷関係ってことは多分実行環境は PC だし、
多分 double の方が早いだろ。
0227デフォルトの名無しさんNGNG
JIS丸めとIEEE754って何が違うの?
0228デフォルトの名無しさんNGNG
JIS丸めって、JIS Z 8401だよね。
ってことはISO 31/0かな。
IEEEの番号はしらね。
0229デフォルトの名無しさんNGNG
>>225-226
floatは32ビット、doubleは64ビットで
なんでdoubleのほうが早いの?
0230デフォルトの名無しさんNGNG
>>229
80x86 では内部では 80 ビットで計算してるから
どっちでもデータ変換が生じることに変わりはないので、
基本的にはどっちでも速度は一緒。
でも、標準関数では double 型が使われているので、
その関数との受け渡しにおいては
float だとデータ変換が生じて遅くなってしまう。
0231デフォルトの名無しさんNGNG
>>229
ハードウェアが最初から double を想定して作られてるから。
0232229NGNG
>>230-231
なるへそ。単純にCPUのビットだけの問題じゃないんですね。
0233デフォルトの名無しさんNGNG
>232
同じような理由で、charの方がshortやlongより早く処理できると思ったら大間違い。
0234デフォルトの名無しさんNGNG
202です。昨晩はどうもでした。

>>226
boost入れたいのですがHDDがあと200Mぐらいしか...

>>225-231
doubleのほうが早いんですね。知らなかた...

ところで昨日212さんに教えてもらった標準ライブラリ関数
std::ceilですが、なぜVCだとstdがついてるとコンパイル
できないのでしょうか?
VCは初心者なのですがVCにはそんなクセみたいなのが
いっぱいあるのでつか?
0235デフォルトの名無しさんNGNG
if(1926 <= a && a <= 1989)
if (1990>a&&a>1925)

この二つは同じ意味だと思いますが、処理の早さに差が出たりしますか?
a+=1よりa++と書いた方が速いというのは聞いた事あるのですが、
そういう細かいところで速度をアップするテクニックって他にどんなものがありますか?
0236デフォルトの名無しさんNGNG
盲目的にdoubleの方が速いと思わない方が良いよ。
CPUやコンパイラに左右されるということを忘れずに。

ちなみに単精度用の関数( sinf とか sqrtf とか )が
用意されているコンパイラもある。
0237デフォルトの名無しさんNGNG
>>235
速度に差は出ない。

>a+=1よりa++と書いた方が速いというのは聞いた事あるのですが、
どこの馬鹿にそんなこと吹き込まれたか知らないけど、それは大嘘。


まぁ、演算子のオーバーロードの実装の仕方によれば変わるかもしれないけど。
0238デフォルトの名無しさんNGNG
最近のx86ならlong doubleが80bitフルでない?
0239デフォルトの名無しさんNGNG
>235
その例なら、
if( (unsigned)( a - 1926 ) <= 1989 - 1926 )
の方がたぶんはやい。
0240デフォルトの名無しさんNGNG
>>235
やー、悪いことは言わない。今は可読性を重視した方がいいと思うよ。
マシン性能があがり、お馬鹿なコンパイラも減ってる昨今だし。
ボトルネック解消なら、別で稼ぐべきかと。

>>237
大嘘ってことは無いと思うけど
0241デフォルトの名無しさんNGNG
>a+=1とa++
今時のコンパイラ(つーかC++コンパイラ)なら同じようなコードを出力するはず。
但し、古い貧弱な環境用のCコンパイラが前者は定数値との足し算、
後者をインクリメントで実装しているのも事実。

>1926云々
単純に年だけで元号を判定することは危険。
なぜならば、1989年はたったの数日しか昭和ではなかったから。
0242デフォルトの名無しさんNGNG
最近の CPU だと
むしろ INC x より ADD x, 1 の方が速いって聞くけどね。
0243デフォルトの名無しさんNGNG
昭和元年も、数日しかないけれど。
0244デフォルトの名無しさんNGNG
一例を挙げると、その他の例を挙げないと気がすまない香具師がいるのはこのスレですか?
0245デフォルトの名無しさんNGNG
まー要するに気にするなってこった。
でもhoge++は++hogeと書こうな。operator++のことも考えて統一した方がいい。

とか書くと「hage[hoge++]とhage{++hoge]は違うだろ」とか言い出すだろうけど
そういう時は
++hoge
hage[hoge]
か
hage[hoge]
++hoge
と書くもんだ。
0246デフォルトの名無しさんNGNG
>>234
VC6 はそうなるね。
古いから標準仕様に追いついてないだけ。

VC .NET なら大丈夫だった気が。
古いのは使うなってこった。
0247デフォルトの名無しさんNGNG
class benki {
 const int unko;
public:
 benkio(void) : unko(100) {} 
};
うんこは定数?それともconstオブジェクト?
0248デフォルトの名無しさんNGNG
>>247
排泄物
0249デフォルトの名無しさんNGNG
便器はオブジェクトなのにウンコはオブジェクトじゃないのか
0250デフォルトの名無しさんNGNG
>>247
class benki {
 static const int unko=0xBAD;
};

定数になりますた
0251202NGNG
>>246
ありがとう。。。
0252デフォルトの名無しさんNGNG
>>247
class benki {
 static const int unko=0xF00D;
};

定食になりますた
■ このスレッドは過去ログ倉庫に格納されています