C++相談室 part82
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/06/02(水) 20:20:13ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part81
http://pc12.2ch.net/test/read.cgi/tech/1273407971/
0175デフォルトの名無しさん
2010/06/12(土) 23:30:53普通 b[2]って言ったら2に対応付けられた値だけ返ってくることを期待するでしょうが。
0176デフォルトの名無しさん
2010/06/13(日) 06:27:24string B::path(int n)みたいな関数にしたほうがいいと思う。
0177デフォルトの名無しさん
2010/06/13(日) 11:39:03[]が先の方が良かったけど複雑だしな
0178デフォルトの名無しさん
2010/06/13(日) 11:46:31こんなもの全くいらないし
fortran的に考えて
0179デフォルトの名無しさん
2010/06/13(日) 12:19:12その役目はイテレータだけどな。
0180デフォルトの名無しさん
2010/06/13(日) 12:19:56オペレーターオーバーロードは、それで記述が簡潔になる場合にしか使わないし。
0181デフォルトの名無しさん
2010/06/13(日) 12:22:350182デフォルトの名無しさん
2010/06/13(日) 12:26:48一次元のコンテナがあれば[]で何次元でも作れるのに?
0183デフォルトの名無しさん
2010/06/13(日) 12:28:20それじゃあ生成・破棄の効率がクソ悪いだろ
0184129
2010/06/14(月) 16:23:42いまいち伝わってないというか、上手く説明ができてなかったようなので言い方変えると、
class Test {
int value;
public:
void Set(int v) {
this->value = v;
}
};
void func(Test* t) {
t->Set(1); //これでfunc()の呼び出し元のtest.valueを変更したいけど、
//*t = Test(); //これができると呼び出し元のtest自体が書き変わってしまうので禁止できないか?
}
void main() {
Test test;
func(&test);
}
イベントでいうと以下のようなことをやりたいのですが、Senderの実体を書き換えられるのは困りますよね。
ttp://www.ne.jp/asahi/nagoya/ahomaro/builder/cpb-018.html
イベントなのでどんなクラスにも対応しなければならず、ラップして代入禁止というのは無理です。
ポインタで渡して実体を書き換えないように気を付けるのが普通なんでしょうか。
0185デフォルトの名無しさん
2010/06/14(月) 16:45:050187デフォルトの名無しさん
2010/06/14(月) 17:19:510188129
2010/06/14(月) 18:11:57そう考えると、やらないように気を付けるでいいのかな。
言い間違いのつもりだったけど、いまいち理解できてなかったのかも。
ありがとうございました。
0189デフォルトの名無しさん
2010/06/15(火) 01:18:550190デフォルトの名無しさん
2010/06/15(火) 09:50:050191デフォルトの名無しさん
2010/06/15(火) 10:27:040192デフォルトの名無しさん
2010/06/15(火) 10:32:41じゃあ代入禁止でおk。boost::noncopyableでもおk
しかし>>190が意味不明だ
0193デフォルトの名無しさん
2010/06/15(火) 10:37:44void __fastcall TForm::ButtonClick(TObject * const Sender)
0194190
2010/06/15(火) 12:08:46ちょっときびしいか?
0195デフォルトの名無しさん
2010/06/15(火) 13:07:280196デフォルトの名無しさん
2010/06/15(火) 13:10:09x86アセンブラのほうが覚えること少なくてらくでしょ。
基本はmovとcmpとjmpだけでよいし。
0197デフォルトの名無しさん
2010/06/15(火) 13:37:450198デフォルトの名無しさん
2010/06/15(火) 17:24:460199デフォルトの名無しさん
2010/06/15(火) 17:38:270200デフォルトの名無しさん
2010/06/15(火) 17:57:390201デフォルトの名無しさん
2010/06/15(火) 18:04:520202デフォルトの名無しさん
2010/06/15(火) 18:37:000203デフォルトの名無しさん
2010/06/16(水) 00:02:08もっとも、いい選択肢だよ
0204デフォルトの名無しさん
2010/06/16(水) 00:15:530205デフォルトの名無しさん
2010/06/16(水) 00:25:28吐き気がする位遅い
0206デフォルトの名無しさん
2010/06/16(水) 00:35:240207デフォルトの名無しさん
2010/06/16(水) 00:47:380208デフォルトの名無しさん
2010/06/16(水) 01:36:11フレームワークより使いにくいのは仕方ないだろ
それ以前の負の遺産を引きずってるんだから
0209デフォルトの名無しさん
2010/06/16(水) 11:33:010210デフォルトの名無しさん
2010/06/16(水) 12:21:55元質問は自己解決したんですが、良く分からなかった事があるので教えてください。
多重継承しているクラスがあります。
class Derive : public Base, public Listener{
で、他の関数にthisポインタを渡そうとしてます。
Derive::func(void){
thread->SendRequest(this, data);
}
SendRequestはこんな感じです。
void SendRequest(Listener *listener, int data);
SendRequestを呼び出す前のthisのアドレスが、
呼ばれたSendRequest内の引数listenerでは+4されていたのは何故でしょうか。
VC++2008です。
すみませんがよろしくお願いいたします。
0211デフォルトの名無しさん
2010/06/16(水) 12:30:33Derive の中には Base部分と Listener部分が含まれている。
おそらく、先頭4バイトがBase部分で、その後にListener部分が続いていたんだろう。
0212デフォルトの名無しさん
2010/06/16(水) 12:37:32確かに
class Derive : public Listener, public Base
としたら+4されなくなりました。
0213デフォルトの名無しさん
2010/06/16(水) 16:24:540214デフォルトの名無しさん
2010/06/16(水) 19:24:22void foo(const A* const a) { }
void bar() { foo(&A()); }
これはまずい?
const参照使えば大丈夫なのは知ってるんだが
ポインタだとダメ?
0217デフォルトの名無しさん
2010/06/16(水) 21:10:090218デフォルトの名無しさん
2010/06/16(水) 21:19:22こんぱいるできたか?
0219デフォルトの名無しさん
2010/06/16(水) 22:23:400220210
2010/06/16(水) 23:48:01一応コンパイルは通るし、fooの引数aもスタック上のオブジェクトを指してるっぽい。
…でも出来る出来ない以前にちとダサいと思うw
0221デフォルトの名無しさん
2010/06/16(水) 23:51:100222210
2010/06/16(水) 23:52:290223デフォルトの名無しさん
2010/06/17(木) 07:39:57PC性能が上がってきて、速度とかあんまり気にする必要がなくなってきてる気がして・・・。
あ、趣味グラマです。
0224デフォルトの名無しさん
2010/06/17(木) 07:51:350225デフォルトの名無しさん
2010/06/17(木) 17:30:410226デフォルトの名無しさん
2010/06/17(木) 17:49:340227デフォルトの名無しさん
2010/06/17(木) 17:58:14当時より大きく遅くなっているが今のハードだと問題にならない
0228デフォルトの名無しさん
2010/06/17(木) 22:58:500229デフォルトの名無しさん
2010/06/17(木) 23:00:030230デフォルトの名無しさん
2010/06/17(木) 23:02:53いいえペンです
0231デフォルトの名無しさん
2010/06/17(木) 23:06:04reallocしないならば静的確保だというのですか?
0232デフォルトの名無しさん
2010/06/17(木) 23:06:220233デフォルトの名無しさん
2010/06/18(金) 11:07:40/)
///)
/,.=゙ ''"/
/ i f ,.r='"-‐' つ____ こまけぇこたぁいいんだよ!!
/ / _,.-‐'~/⌒ ⌒\
/ ,i ,二ニ⊃( ●). (●)\
/ ノ il゙フ::::::⌒(__人__)⌒::::: \
,イ「ト、 ,!,!| |r┬-| |
/ iトヾヽ_/ィ"\ `ー'´ /
0234デフォルトの名無しさん
2010/06/18(金) 16:50:25すると、全く同じプログラムなのに結果が違う。ちなみにMATLABの結果は
VC++の結果と一致している。
2日ほど悩んでいたが...
原因は、何と自作のライブラリファイルで使っていたabs関数に「std::」をつけて
いないことだったorz。
xをdouble型の変数としてabs(x)を呼べば関数のオーバーロードによって
double abs(double x) が呼び出されると思っていたのにgccではint abs(int i)
が呼び出されていて結果が違っていた。xがdoubleであってもintに型キャスト
されるため整数部(の絶対値)のみが返ってきていた。
これはC++の数学関数が標準名前空間std内にあることによるのだろうが
(ちなみに #include <cmath>としている)、VC++では「std::」をつけなく
ても問題なく、double abs(double x) が呼ばれている。
C++の仕様としては、gccとVC++どちらが正しいでしょうか?
「std::」をつけなくてもコンパイルエラーや警告がでず、意図しない
別のabsが呼ばれるgccの方が怖いですけど。
0235デフォルトの名無しさん
2010/06/18(金) 17:05:49BasicHoge * CreateHoge(uint8_t n)
{
switch(n)
{
case 0: return new Hoge<0>;
case 1: return new Hoge<1>;
・・・
}
}
int main() { BasicHoge *p = CreateHoge(Rand8()); ・・・; }
上のようなことをしたいんだけど
1〜uint8_tの最大まで書くのがめんどいんだけど
うまいこと実行時の整数をコンパイル時の整数にマッピングする方法ってない?
0238デフォルトの名無しさん
2010/06/18(金) 19:51:40gcc 4.3以降なら-Wconversionで警告出せるよ。
警告出ないと確かに怖いね。
0239デフォルトの名無しさん
2010/06/19(土) 01:43:51インクルードせずにプログラムを作るには、一体どうしたらいいんでしょう?
色々と調べ回ったのですが、大体がLinuxでのことしか書いてないし、Windowsでのもの
も、実際にコードにしたら、Windowsから不正だのなんだのと言われて、プログラムが止まってしま
うんですが…
例えば、int 21hとか
0240デフォルトの名無しさん
2010/06/19(土) 01:45:35常識
0241デフォルトの名無しさん
2010/06/19(土) 03:28:08ヘッダーインクルードを忌避する理由は何?
Windows API (Linux のシステムコールに相当) を呼び出すには call 命令を使うが、その
飛び先 (API を提供している DLL のエントリポイント) をリンクするのはアセンブラでは
煩雑と言うか面倒と言うか忘れたと言うか、使用するアセンブラによる。
API を呼び出すのにかかるコストは、C/C++ の関数形式でもアセンブラの call 命令でも
全く変わらない。
せっかく C++ なのだから、素直に windows.h をインクルードするのが吉。
int 21h で有名なのは MS-DOS ファンクションコールだが、Windows アプリでは (デバイス
ドライバを書いて特権を取得しない限り) そもそも int 命令が禁止されていて、MS-DOS
ファンクションコールは一切使えない (プログラムが不正終了するのはおそらくそのせい)。
MS-DOS アプリが動作するのは、MS-DOS ファンクションコールがエミュレートされている
から (64bit OS では 16bit アプリをサポートしないため MS-DOS アプリは動作しない)。
0242デフォルトの名無しさん
2010/06/19(土) 04:55:33それを直にやりたいんだろ。
アセンブラ。
0243デフォルトの名無しさん
2010/06/19(土) 05:41:160244デフォルトの名無しさん
2010/06/19(土) 07:05:44その方法を自分で調べられん奴が一体何をするつもりなんだろうね
0245デフォルトの名無しさん
2010/06/19(土) 08:44:240246デフォルトの名無しさん
2010/06/19(土) 08:50:18STL以外での使い道に心当たりがある方お願いします。
0247デフォルトの名無しさん
2010/06/19(土) 08:55:18今はintとかin/outとかhaltとか好きに呼べない
ま、安全のためだから仕方がないが
0248デフォルトの名無しさん
2010/06/19(土) 15:59:100249デフォルトの名無しさん
2010/06/19(土) 20:30:21STLで足りない理由を明確にすることかな
0250デフォルトの名無しさん
2010/06/20(日) 02:09:03作り方: http://msdn.microsoft.com/en-us/magazine/cc301955.aspx
規格(の草案): http://www.kuzbass.ru/docs/isocpp/lib-iterators.html#lib.iterator.requirements
0251デフォルトの名無しさん
2010/06/20(日) 06:28:27#define YAMA 0
#define KAWA 1
#define HAIRETUNOKAZU 20
とかを使いまくってるのですが、これは話にならないくらいの糞コードなんでしょうか?
static const HAIRETUNOKAZU = 20
みたいにするのが業界標準なんでしょうか?
0252デフォルトの名無しさん
2010/06/20(日) 06:35:44void kansuu(int number);
みたいに書きまくってるけど
void kansuu(const int number);
for文も
for( a=0 ; a<10 ; a++ )
みたいに書きまくってるけど
for( a=0 ; a<10 ; ++a )
if文も
if( n=10 )
と書きまくってるけど
if( 10=n )
と書かないと業界では鼻で笑い飛ばされて帰っていいよと言われる糞コードなんでしょうか?
0253デフォルトの名無しさん
2010/06/20(日) 06:38:42他については決してそんなことはないというか、
void kansuu(const int number) ってのは void kansuu(int number) と同じシグネチャだから
逆に混乱を招きかねないって意見も多くあるし、
if ( 10 == n ) についても同じ
0254デフォルトの名無しさん
2010/06/20(日) 06:49:13for文は++aのがデータのメモリ間のコピーだかなんだかの処理がa++より一回少なくて高速だと聞いたのですが、
それほどその程度の速度を意識したことなかったし、大抵の初心者サイトで最初に教えられるのはa++だから惰性で続けてました。
ほかにも構造体を関数へ渡すときは
kansu(KOUZOUTAI)
void kansu(KOUZOUTAI)
kansu(&KOUZOUTAI)
void kansu(*KOUZOUTAI)
kansu(KOUZOUTAI)
void kansu(&KOUZOUTAI)
みたいないろんなやり方があって自分は2番目を常用してますが、これは好みでしょうか?
DirectxのSDKなどでは2番目で使用する前提の関数が多く用意されてるのでこれがプログラマ達の標準だと思ってました。
他の方でも知っておられたら教えてください。
0255デフォルトの名無しさん
2010/06/20(日) 07:29:4210=nというその例のようなミスを防ぐためにはいいのかもしれないけど、それは強制しないし
n=10と書いても警告が出るからn=10を推奨。10=nは逆に禁止したいぐらい。
値を変更するなら3番目、kansu(*KOUZOUTAI)のtypoだよね?
変更しないならconst参照で受けるのがいい。
鼻で笑い飛ばして帰っていいよとは言わないけど、上記のようなことを説明をしつつ伝える。
0256デフォルトの名無しさん
2010/06/20(日) 07:38:26Googleのコーディング規約では入力パラメータがconst参照渡し、出力パラメータがポインタ渡しになってるな。
どっちにしろ値を渡す目的ではconst参照渡しを使うのがいいと思う。
0257デフォルトの名無しさん
2010/06/20(日) 08:00:54自分で組んでる分にはわざわざconstなんて付けないし、
人との共同でも値変更があるかはプログラム設計書に明記してりゃいいやと思ってたけど、
安全で安心ではありますね。
0258デフォルトの名無しさん
2010/06/20(日) 08:05:260259デフォルトの名無しさん
2010/06/20(日) 08:26:341番目は値渡し(コピー)。
2番目はポインタ渡し。
3番目は参照渡し。
のつもりじゃないだろうか。
0260デフォルトの名無しさん
2010/06/20(日) 08:34:40ポインタ派参照派どちらの派閥をとわずご満足いただけます
0261デフォルトの名無しさん
2010/06/20(日) 08:36:160262デフォルトの名無しさん
2010/06/20(日) 09:00:110263デフォルトの名無しさん
2010/06/20(日) 11:58:090264デフォルトの名無しさん
2010/06/20(日) 12:15:56そもそもメソッドのパラメータとして記述できるのはparamsとrefとoutだけじゃね
0265デフォルトの名無しさん
2010/06/20(日) 12:25:400266デフォルトの名無しさん
2010/06/20(日) 12:31:13ref使うのは特殊なケースだろう
間接参照でImmutable保証出来ないのはJavaにしろPythonにしろ同じだし
0267デフォルトの名無しさん
2010/06/20(日) 13:48:190268デフォルトの名無しさん
2010/06/20(日) 14:33:30const参照渡しが推奨される理由が分からないorz
constポインタ(?)とかじゃダメなの?
0269デフォルトの名無しさん
2010/06/20(日) 14:38:25const参照ならテンポラリオブジェクトも取れる
そしてクライアントの手間が省ける
0270デフォルトの名無しさん
2010/06/20(日) 16:44:04あわわ。寝ぼけてたみたいでorz
指摘ありがとうです。
>>257でちゃんと伝わってたようで安心した。
0271デフォルトの名無しさん
2010/06/20(日) 18:36:12templateよりdefine関数の方が一般的?
0272デフォルトの名無しさん
2010/06/20(日) 18:50:47# defineは関数ではない
0273デフォルトの名無しさん
2010/06/20(日) 18:54:58マクロ展開
0274デフォルトの名無しさん
2010/06/20(日) 19:49:27うむ。orz
■ このスレッドは過去ログ倉庫に格納されています