C++相談室 part71
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/07/18(土) 02:54:58ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part70
http://pc12.2ch.net/test/read.cgi/tech/1244942050/l50
0153デフォルトの名無しさん
2009/07/29(水) 09:10:29(1)はダメ
Hoge()を抜けた途端にpointのインスタンスが消滅してしまう
0154デフォルトの名無しさん
2009/07/29(水) 09:12:080155デフォルトの名無しさん
2009/07/29(水) 09:29:33(1) はコピー返しなので問題ない
(2) は生存期間以前にポインタでないものをポインタにキャストしてるから滅茶苦茶なことが起きるだろう
0156デフォルトの名無しさん
2009/07/29(水) 13:00:03いやいや、一時オブジェクトを束縛して寿命を延ばす効果があるのはconst参照だけだろ。
0157デフォルトの名無しさん
2009/07/29(水) 13:44:200158デフォルトの名無しさん
2009/07/29(水) 16:19:06つまり自動変数のデストラクタ呼び出しが保障されてるんでしょうか?
0159デフォルトの名無しさん
2009/07/29(水) 16:58:37可能な限りスタックを巻き戻すことになってます。
なので、(一般に)デバッグ用途には使えません。
…メモリダンプを見ても変数の中身が消えちゃってるので。
0160デフォルトの名無しさん
2009/07/30(木) 00:15:28他にも使いたい人はいると思うんで一応載せときます。
struct yes_type{char t[100];};
struct no_type{char u[10];};
template<typename T,typename U>
struct test_helper{
template<typename S>
static no_type test(void const volatile * ,S );
static yes_type test(T const volatile * const,int );
};
template<typename T,typename U>
class is_base_of{
struct pointer_type{
operator U const volatile *();
};
enum{
delived = sizeof( test_helper<T,U>::test(pointer_type(),0) )
};
public:
enum{
value = delived == sizeof(yes_type),
};
};
使い方は
is_base_of< Hoge,Piyo >::value
とし、後のクラスが前のクラスの派生クラスの場合は1をそうでない場合は0を返します。
長文失礼しました。
0161デフォルトの名無しさん
2009/07/30(木) 00:29:38型の比較なんてないですよね?どうしよう…
0162デフォルトの名無しさん
2009/07/30(木) 00:42:040163デフォルトの名無しさん
2009/07/30(木) 00:48:000164デフォルトの名無しさん
2009/07/30(木) 00:49:51VCが特に複雑と言うほどBCCと何か違うことってあるか?
0165デフォルトの名無しさん
2009/07/30(木) 01:03:49!is_void<T>::value && is_class<U>::value && type_equal == sizeof(no_type) &&
is_voidやis_classや自分で作るかなんかしてください。
次にtest_helperに以下の関数を追加
static yes_type type_equal(T*);
template<typename S>
static no_type type_equal(S*);
最後にis_base_ofの一個目のenumに以下を追加
type_equal = sizeof( test_helper<T,U>::type_equal((U*)NULL) ),
これで、抜けはありそうですが、とりあえず判定はできると思います。
0166デフォルトの名無しさん
2009/07/30(木) 05:36:55例外がmainでcatchされずに飛び出るとterminateが呼ばれて
破棄処理が実行されない可能性がある
0167デフォルトの名無しさん
2009/07/31(金) 15:28:350168デフォルトの名無しさん
2009/07/31(金) 23:23:190169デフォルトの名無しさん
2009/08/01(土) 00:05:34下記のように、vectorっぽくやりたいのですが。
void func( set<int> s = set<int>(0) )
{
if( s.size() == 0 ){ ... }
else{ ... }
}
int main()
{
set<int> s; s.insert(100);
func( s );
func( );
}
0170デフォルトの名無しさん
2009/08/01(土) 00:09:03setやmapには、vectorのような要素数を指定するコンストラクタがないから、
単にデフォルトコンストラクタで初期化すればいい。
void func( set<int> s = set<int>() )
0171デフォルトの名無しさん
2009/08/01(土) 00:19:28#include<stdio.h>
main()
{int suuji[10],i,x,s,n;
float r;
i=0;
s=0;
while(x!=0){
if(i==50);
printf("数字=");
scanf("%d",&x);
suuji[i]=x;
n=i;
i=i+1;
s=s+y;
}
r=s/n;
printf("平均=%d\n",&r);
}
の形を使って数字を幾つか入れてその平均点をfloatを使った状態でだしたいのですが数字が何も出てきません。
上のプログラムの修正をよろしくお願いします。
0172デフォルトの名無しさん
2009/08/01(土) 00:38:18printf("平均=%f\n",&r);
あたりでうごく?
0174デフォルトの名無しさん
2009/08/01(土) 01:26:36を習ってないので使ってはいけないんですよ…
なんででないのかわからない…
%d→%fは直します。ありがとうございます!
0175デフォルトの名無しさん
2009/08/01(土) 01:41:41#include<stdio.h>
main()
{
float suuji[10];
float x, s, r;
int i, n;
i = 0;
s = 0;
while(x != 0) {
if (i == 10) break;
printf("数字=");
scanf("%f", &x);
suuji[i] = x;
n = i;
i = i + 1;
s = s + y;
}
r = s / n;
printf("平均=%f\n", r);
}
0176デフォルトの名無しさん
2009/08/01(土) 01:50:14そもそもC++のプログラムじゃないし
レスした自分が恥ずかしい
s+=x;な
0177デフォルトの名無しさん
2009/08/01(土) 01:55:470178デフォルトの名無しさん
2009/08/01(土) 01:56:320179デフォルトの名無しさん
2009/08/01(土) 01:57:53そこはお客に丸投げしていただいたありがたい課題を解いて楽しむという反教育な場ですから。
0180デフォルトの名無しさん
2009/08/01(土) 04:01:34>>178 C++じゃなかったんですか!自分はずっとC++と思い込んでました。
ありがとうございます。
0181デフォルトの名無しさん
2009/08/01(土) 04:46:33なんていうか、先が思いやられるな。未来のこの人の先輩がんばってください。
0182デフォルトの名無しさん
2009/08/01(土) 11:53:51いや、間違いなくC++だよ
Cコンパイラでも通るかもしれないというだけで
0183デフォルトの名無しさん
2009/08/02(日) 01:21:460184デフォルトの名無しさん
2009/08/02(日) 01:22:500185デフォルトの名無しさん
2009/08/02(日) 01:22:540186デフォルトの名無しさん
2009/08/02(日) 16:24:400187デフォルトの名無しさん
2009/08/02(日) 16:27:230188デフォルトの名無しさん
2009/08/02(日) 16:28:370189デフォルトの名無しさん
2009/08/02(日) 16:33:52| / /
__|__ .__/__
| | | . | | |
| | | ー―――― ..| | |
 ̄ ̄| ̄ ̄ | ̄ ̄ ̄ ̄ ∧ ∧
| \____ノ / V ヽ
/┏╋┓ \
/ ┗╋┛ \ < 2chでせいぜいほざいてろ。フフン
(.`ヽ(`> 、 /_______ \
`'<`ゝr'フ\ +. 彡 ⌒ ⌒ ミ;;;!
⊂コ二Lフ^´ ノ, /⌒) , +ゞi" ̄ フ‐! ̄~~|-ゞ+
⊂l二L7_ / -ゝ-')´ .+ ヾi `ー‐'、 ,ゝ--、' 〉;r'
\_ 、__,.イ\ + `,| / "ii" ヽ |ノ
(T__ノ Tヽ , -r'⌒! ̄ `":::7't ト‐=‐ァ ./
ヽ¬. / ノ`ー-、ヘ<ー1´| ヽ | :::::::::::::ト、ヽ `ー‐'",/ 、
\l__,./ i l.ヽ! | .| ::::::::::::::l ヽ `7ー.、‐'´ |\-、
___________________________ ___
| | | | | | | | | | | | | || |
|中|中|中|中|中|中|中|中|中|中|中|中|中||中|
0190デフォルトの名無しさん
2009/08/02(日) 19:14:40デストラクタ内でキャッチするならいいよ
0191デフォルトの名無しさん
2009/08/03(月) 07:57:09ブラウザのチャットのログの取得はわかるのですが、メッセンジャーなどのアプリからどのようにしてログを取得できるものなのでしょうか?
サイトを探しましたが、どのサイトもHTMLソースの取得方法しか書いてありませんでした。
どうか教えてください。
0192191
2009/08/03(月) 08:19:38ご迷惑おかけしました。
0193デフォルトの名無しさん
2009/08/03(月) 18:24:02変数sに振幅値を入れておいて,
サンプリング周波数fでsを再生したいのですが
以下のプログラムで再生することができません….
よろしくお願いします.
#include <iostream>
#include<windows.h>
#include <math.h>
#pragma comment(lib,"winmm")
#define FILENAME "white-3dB.WAV"
using namespace std;
int test(){
int i;
int f=1000;
double s[48000];
for(i=1;i<48000;i++){
s[i] = sin(2*3.14*f*(i/48000));
}
bool PlaySound (s,f,SND_MEMORY | SND_LOOP | SND_ASYNC);
return 0;
}
0194デフォルトの名無しさん
2009/08/03(月) 18:38:07PlaySoundの前のboolは何?
それと、PlaySoundにはちゃんと.wavファイルの形をしたデータを与えてやらないとだめだ
波形だけ与えても鳴らない
あと、fって何さ、そこはHMODULEを渡すところでは?
最後に、スレ違い
Win32APIの質問はWin32APIスレへどうぞ
0195デフォルトの名無しさん
2009/08/04(火) 08:52:09class A
{
int[ MAP_X ];
}
以上が定数式エラー出る
defineではエラーでない。
C++風にconst使ってみたんだが配列確保には使えない認識でおk?
0196デフォルトの名無しさん
2009/08/04(火) 08:55:010197デフォルトの名無しさん
2009/08/04(火) 10:23:25ちゃんと書けば、ちゃんと使える。
そうそう、古いコンパイラでは使えないかも知れない。
0198デフォルトの名無しさん
2009/08/04(火) 11:12:34無料だから制限つけてるのか
0199デフォルトの名無しさん
2009/08/04(火) 11:15:31実際のコードとコンパイルエラーを「そのまま」貼り付けてみて。
0200デフォルトの名無しさん
2009/08/04(火) 11:26:31×static const float MAP_X = 64;
○static const int MAP_X = 64;
floatにしてたのが原因でした
intに変更したら成功。
0201デフォルトの名無しさん
2009/08/04(火) 11:38:220202デフォルトの名無しさん
2009/08/04(火) 11:39:20規格票に書いてある
規格票はintではなく整数と書いてあるが
0203デフォルトの名無しさん
2009/08/04(火) 12:19:41なら「static const 整数しか〜と規格票に書いてある」って最初っから言えよ。
どうせそんな書き方もしてないんだろうけどな。
0204デフォルトの名無しさん
2009/08/04(火) 14:52:11>>195
みたいな不完全で実際のものと違うコード提示されたところで
的確な指摘なんて出来るわけないよな
0205デフォルトの名無しさん
2009/08/04(火) 17:16:360206デフォルトの名無しさん
2009/08/04(火) 17:21:210207デフォルトの名無しさん
2009/08/04(火) 20:39:31一般的な速度の分岐点は何バイトくらい?
0208デフォルトの名無しさん
2009/08/04(火) 21:44:170209デフォルトの名無しさん
2009/08/04(火) 22:06:47エラーの出る最低限のサイズのコードを上げろ
0210デフォルトの名無しさん
2009/08/04(火) 22:13:00エスパーして代表的な環境について述べます。
Linux + gccはどちらの場合も最高速を叩き出します。
Windows + vcはどちらも低速でした。
つまり、プログラムでチマチマ最適化を図るよりLinuxを導入するほうが
良いと思われます。
0211デフォルトの名無しさん
2009/08/04(火) 23:03:58使うのだからそんな速度の違いが出るわけない。
0212デフォルトの名無しさん
2009/08/04(火) 23:20:540213デフォルトの名無しさん
2009/08/04(火) 23:31:35サンプルになるようなサイトてありますか?
CとかVC++はみかけるんですがC++は見つからなくて…
環境はlinux+gccです
0214デフォルトの名無しさん
2009/08/04(火) 23:38:47お前がほしいのはサンプルじゃなくてコピペ元だろ
たぶんCのやつそのまま使えるから問題なし
0215デフォルトの名無しさん
2009/08/04(火) 23:42:54何言い出してんのかと思った
0217デフォルトの名無しさん
2009/08/04(火) 23:56:38これを無くしたい場合はどうすればいいとですか…?
0218デフォルトの名無しさん
2009/08/05(水) 00:01:250219デフォルトの名無しさん
2009/08/05(水) 00:14:23これでも大丈夫そうです。ありがとうございました。
0220デフォルトの名無しさん
2009/08/05(水) 02:39:21boost::call_traits あたりを見ると参考になるかもしれない。
0221デフォルトの名無しさん
2009/08/05(水) 08:11:38コンパイルオプションの /GR を取ればいいってことかな?
VS2005 だと、プロジェクトのプロパティの 「ランタイム型情報を有効にする」 → 「いいえ」
typeid の他に dynamic_cast がつかえなくなるっぽい。
そのあたりはややこしい話になるので割愛。
0222デフォルトの名無しさん
2009/08/05(水) 11:49:00なんの疑問もなく読んでしまった。
だめだ今日は。。。
0223デフォルトの名無しさん
2009/08/05(水) 15:17:493桁ごとにコンマがついてしまうのですが、これを防止するにはどうしたら
よいのでしょうか?
0224デフォルトの名無しさん
2009/08/05(水) 15:21:44方法がわかりません。
ググってみるとVC++ではできるようなのですが、
Linux + gcc環境ですので参考になりません。
最悪 system() + wgetコマンド という手がありますが、
もっとスマートな方法(ライブラリとか)があったら教えて下さい。
0225デフォルトの名無しさん
2009/08/05(水) 15:24:05localeを"C"に戻す
いちいち面倒ならLC_NUMERICだけjapaneseに変えないでおく
0226デフォルトの名無しさん
2009/08/05(水) 20:41:08>最悪 system() + wgetコマンド という手がありますが、
の方がスマートだよ.
0227デフォルトの名無しさん
2009/08/06(木) 01:36:460228デフォルトの名無しさん
2009/08/06(木) 02:59:42#include <boost/enable_shared_from_this.hpp>
class A :public boost::enable_shared_from_this< A >
{
public:
A(){ /*shared_from_this();*/ }
void F(){shared_from_this(); }
};
int main()
{
boost::shared_ptr< A > a( new A() );
a->F();
return 0;
}
c-torで、shared_from_this()すると例外が飛ぶんだけど、何で?
0229デフォルトの名無しさん
2009/08/06(木) 07:20:09まだ生成が済んでないオブジェクトへの shared_ptr は存在しない、と考えれば
わりと自然な気がする。
仮にそこで shared_ptr が得られたとして、その後に例外が発生してコンストラクタが
中断したらどうなるの?とか。
0230デフォルトの名無しさん
2009/08/06(木) 07:31:35コンストラクタの中では
A a;
した状態と同じ、ってのもあるな。
http://www.boost.org/libs/smart_ptr/enable_shared_from_this.html
仕様を確認すると、事前条件 "Requires" に以下の記述がある。
> There must exist at least one shared_ptr instance p that owns t
0231デフォルトの名無しさん
2009/08/06(木) 13:08:19自分は「このクラスを継承しちゃダメ」という意思表示の意味でvirtual付けてないんだけど、
そういうやり方って一般的なのかな?
一応どっかでそういう意見を見て、ふーんって思ってやってたことなんだけど、正しいことなのか今になって不安になってきた。
0232デフォルトの名無しさん
2009/08/06(木) 14:09:290233デフォルトの名無しさん
2009/08/06(木) 14:11:42付けない。
継承される予定のクラスでも、アップキャストして使う予定のない物は、非virtualのprotectedデストラクタにする。
ここから先は個人的な好みなので参考程度に聞いて欲しいが、
「データメンバを持たない仮想関数のみで構成されたクラス」しか継承する事は考えない。
データメンバを持つクラスを継承したいと思った時は、コンポジションにする。
0234デフォルトの名無しさん
2009/08/06(木) 14:11:55つーか継承をコンパイルエラーにする記述とか無いもんかな
インターフェイスとファクトリだけ提供して実装は隠す、位しか実装の継承を禁止する方法が思い浮かばない
0235デフォルトの名無しさん
2009/08/06(木) 14:32:230236デフォルトの名無しさん
2009/08/06(木) 14:34:410237デフォルトの名無しさん
2009/08/06(木) 14:46:36付けない。例えばstring(basic_string<char>)なんかも継承を前提としていので
仮想デストラクタではなかったと思う。
0239デフォルトの名無しさん
2009/08/06(木) 15:13:510240デフォルトの名無しさん
2009/08/06(木) 18:01:010241デフォルトの名無しさん
2009/08/06(木) 21:35:360242デフォルトの名無しさん
2009/08/06(木) 21:51:58ってするだけだろ。
0243デフォルトの名無しさん
2009/08/07(金) 03:46:33それはもっと悪い。
0244デフォルトの名無しさん
2009/08/07(金) 09:12:02開発環境がC++のため、質問させていただきます。
例えばIE7のようなWebブラウザがあるとします。
そのWebブラウザと連携させるようなツールを使うにはどうすればいいのでしょうか?
具体的には毎回同じ文字でログイン名などを入力するのが面倒なときに、自動で入力して
そのあとにログインボタンをクリックし、勝手にログインしてくれるようなツールを作成したいと思ってます。
一部ではAmazonの激安祭りなどでスクリプトとか呼ばれているものです。
使用用途はそういったものではなく、単純にプログラムの勉強としてそういったものを作る方法が
勉強したいだけです。(これは本当です。)
わかる方がもしいらっしゃれば回答よろしくお願いいたします。
0245デフォルトの名無しさん
2009/08/07(金) 09:38:500246デフォルトの名無しさん
2009/08/07(金) 09:39:360247デフォルトの名無しさん
2009/08/07(金) 09:44:38鼬害。WebProg板へ。
>>245
鼬害。ゲ製板へ。
>>246
鼬害。Pinkのどっかへ。
0248デフォルトの名無しさん
2009/08/07(金) 09:51:380249272
2009/08/07(金) 11:29:26int a = 1;
int b = 2;
int& r;
のときに動的にrをaかbを指すように付け替えたいです。
無理は承知でお願いします。
0250デフォルトの名無しさん
2009/08/07(金) 11:35:05int& r = boolean ? a : b;
ではだめかいな?
0251250
2009/08/07(金) 11:36:36int * p;
if(xxx)
{p = &a;}
else
{p = &b;}
int& r = *p;
0252272
2009/08/07(金) 11:42:15その方法でいけました! まさかこんな方法があろうとは。
本当に有難うございました。
一回途中にポインターをかませば良かったんですね。
■ このスレッドは過去ログ倉庫に格納されています