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

C++相談室 part63

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/09/11(木) 23:49:17
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part63
http://pc11.2ch.net/test/read.cgi/tech/1217008269/
0153デフォルトの名無しさん2008/10/04(土) 18:05:30
>>148
用途によって変わると思うのだが
開発効率あげたければBorland C++Builder
API直だたきしてGUIアプリ作りたければM$ Visual C++ 6.0, M$ Visual Studio 200x
C++の勉強程度ならBorland C++ Compiler とか GNU Compiler Collection
とか、プロトタイプ程度でわざわざVC++やVSのC++立ち上げるの嫌だしな
いま手に入るか知らないが、M$ Visual C++ 6.0は軽くていいよ
0154デフォルトの名無しさん2008/10/04(土) 18:06:14
再帰になってね?
0155デフォルトの名無しさん2008/10/04(土) 18:06:26
軽いけどバグってる
0156デフォルトの名無しさん2008/10/04(土) 18:16:02
>>152
自己代入に対応してないことと、
E::operator =が例外を投げない保障をしない場合に例外安全にならないこと
くらいじゃないかな…
0157デフォルトの名無しさん2008/10/04(土) 18:22:29
E::operator =じゃなかった。E::operator []だ
それとE::operator []の戻り値の型のoperator = かな
01581462008/10/04(土) 18:27:18
>>146 ですけど
オブジェクトが同じ集成体にない場合、< の結果は未規定なのでできないようです。

ポインタを十分な大きさの整数に reinterpret_cast した場合、その整数は元のポインタに戻せるので
ポインタと変換された整数は1対1の関係ということになり、その整数を < で比較できます。

ただし十分な大きさの整数が存在するかどうかは処理系によるので、オブジェクトごとに一意の
整数 ID を持たせるしかないかもしれません。
0159デフォルトの名無しさん2008/10/04(土) 21:23:08
>158
>オブジェクトが同じ集成体にない場合、< の結果は未規定なのでできないようです。
std::less にはその制限がないから大丈夫。
> 14882:2003 20.3.3/8
>For templates greater, less, greater_equal, and less_equal, the specializations for any
>pointer type yield a total order, even if the built-in operators <, >, <=, >= do not.
01601462008/10/04(土) 21:59:13
おお、std::less にそういう仕様があったんですか。
単に operator< を関数オブジェクトにするのが目的だと思っていました。
ありがとうございました。
0161932008/10/04(土) 23:25:28
>>128
const 付けちゃうと、a++ なんてのが出来なくなっちゃうんで。
0162デフォルトの名無しさん2008/10/04(土) 23:28:29
CNumericとconst CNumericで呼び分けられるように
operator T&()とoperator const T&() constは両方とも用意するのが普通
0163932008/10/05(日) 00:31:15
↓のコードだと operator + があいまいって怒られちゃうんだが、何か間違ってる?
環境は、VC++6.0。

template <typename T>
class CNumeric
{
T m_Value;
public:
CNumeric(T val=0) : m_Value(val) {}
T operator=(T val) { return m_Value=val; }
operator T() const { return m_Value; }
operator T&() { return m_Value; }
operator const T&() const { return m_Value; }
};
typedef CNumeric<int> CInt32;

CInt32 a=1, b=2, c;
c = a+b;
0164デフォルトの名無しさん2008/10/05(日) 00:36:50
VC2008だと怒られないな
0165デフォルトの名無しさん2008/10/05(日) 00:51:40
VC6はそろそろ消えて欲しいな
そういう自分もVC6物件のメンテナンスを2件抱えている。もうすぐ1件に減るけど
0166932008/10/05(日) 01:04:48
ほんとVC6は切り捨てたいんだが、
外注からバージョンアップ費用出せと脅されるわ、金無いわで、どうしようもないんだよな。
といっても、いつまでもVC6使ってる訳にもいかないし。
0167デフォルトの名無しさん2008/10/05(日) 01:56:49
VC6で止まってるところよりも、新しいとこ探したほうがいいんじゃないか?
0168932008/10/05(日) 02:02:28
そうなんだが、長年使ってきたというのもあって、
ノウハウ握られ過ぎてるんだわ。
0169デフォルトの名無しさん2008/10/05(日) 02:03:49
コンパイラのバージョンを上げるということはシステム全体のテストを全部やり直すことを意味する
問題領域にもよるけどね
システムの性質しだいでは莫大な費用が発生する
0170デフォルトの名無しさん2008/10/05(日) 06:04:47
     liboctave で逆フーリエ変換したいのだが、うまくいかない。
    どこがだめなんだろうか?

    int OCTAVE_iFFT( double *OCT_POW, int DATASIZE, double *OCT_BUF)
    {
    ComplexMatrix originalData( DATASIZE/2, 1, 0.0 ) ;
    for( int ii=0; ii<DATASIZE/2; ii++ ){
    originalData( ii, 0 ).real() = OCT_POW[ii] ;
    }
    ComplexMatrix ifourierData = originalData.ifourier() ;
    for( int ii=0; ii<DATASIZE; ii++ )
    OCT_BUF[ii] = ifourierData( ii, 0 ).real() ;
    return 0 ;
    }
0171デフォルトの名無しさん2008/10/05(日) 08:47:28
>>170
どこがうまくいかないのだろうか?
0172デフォルトの名無しさん2008/10/05(日) 10:54:05
コンパイル&実行はできますが、できるだけです。
あるデータをFFT->逆FFTにしても、まったく別のデータとなります。

>170
のソースで引数は、
double *OCT_POW:スペクトルデータ
int DATASIZE:データ長
double *OCT_BUF:音データ

で、意識的に意味合いを持たせているのは、
1つ目のfor:FFT後のデータの後半は対称なので、前半半分を逆フーリエ変換の対象としている。
1つ目のforの中身:実部にデータを代入。虚部=0。(originalData自体にデータを代入したが変化なし。)
です。
お願いします。
0173デフォルトの名無しさん2008/10/05(日) 12:35:37
>>172
まず、全域を計算対象にして、正弦波をぶち込んで、FFTが正しく行われているか確認し、次に逆FFTが正しく行われているか確認する。
その後いろいろ弄れ
0174デフォルトの名無しさん2008/10/05(日) 14:29:39
>173
FFTの動作は確認済です。
色々とやってみます。
0175デフォルトの名無しさん2008/10/05(日) 15:36:00
>173
フーリエ変換する最初からやってました。
"全域で"できました。
ありがとうございました。
0176デフォルトの名無しさん2008/10/05(日) 23:06:16
vc++ 2005,winXP Proを使っています。
下のように、char型の配列に1バイト文字、2バイト文字混合の文字列を入れたとして、
char test[] = "abcあいうえお";
test[x]が1バイト文字の一部なのか、2バイト文字の前半なのか、後半なのかを判別する方法はないでしょうか?

よろしくお願いします。
0177デフォルトの名無しさん2008/10/05(日) 23:07:24
文字コードによる。
0178デフォルトの名無しさん2008/10/05(日) 23:11:44
_ismbbleadもしくは_ismbslead
0179デフォルトの名無しさん2008/10/06(月) 00:03:15
g++なのですがenumを論理和しちゃうとコンパイルエラーになります
typedef enum {
 NONE = 0x00000000,
 A  = 0x00000001,
 B  = 0x00000010,
 C  = 0x00000100
} Unko;

int main(int ac, char** av) {
 // Unko unko = A; OK
 Unko unko = A | B;
 std::cout << std::hex << unko << std::endl;
 return 0;
}
0180デフォルトの名無しさん2008/10/06(月) 00:18:07
>>179
Unko
0181デフォルトの名無しさん2008/10/06(月) 00:24:47
少なくとも AとBの論理和を、そのままUnkoという型に代入するのはおかしい
キャストでもしない限り警告は出るだろ

エラーはぱっと見分からん
0182デフォルトの名無しさん2008/10/06(月) 00:26:15
>>179
Unko に D = 0x11 を定義すれば OK じゃね?
01831792008/10/06(月) 00:29:20
main.cpp: In function ‘int main(int, char**)’:
main.cpp:13: error: invalid conversion from ‘int’ to ‘Unko’
ってでてます。 昔をとくにErrorとかWarningなしで通ってた気がするのですが。。。
0184デフォルトの名無しさん2008/10/06(月) 00:32:07
int→enumは暗黙変換してくれない
enum→intはできる
0185デフォルトの名無しさん2008/10/06(月) 00:32:44
まず言えるのは
AはUnko型
BもUnko型
CもUnko型
しかし、A|Bはint型
そんな未知の値をUnko型にはコンバート出来んよ
そもそもint型でウケるべきでは?
列挙型の意味理解してる?ただの定数じゃないぞ
0186デフォルトの名無しさん2008/10/06(月) 00:46:23
>>183
Cでは暗黙変換で通る。C++では明示的なキャストがないと通らない。
0187デフォルトの名無しさん2008/10/06(月) 00:48:54
一応、こういう関数を定義してやることは可能。
Unko operaotr |(Unko lhs, Unko rhs)
{
return static_cast<Unko>(lhs | rhs);
}
0188デフォルトの名無しさん2008/10/06(月) 00:50:20
operaotr
0189デフォルトの名無しさん2008/10/06(月) 00:54:37
代入は出来ても、Unko型は「0x11なんて知りません」って感じだなw
0190デフォルトの名無しさん2008/10/06(月) 01:27:44
C++初心者にどうだ!って見せられる短めの超絶テク探してるんだけどどんなのがいいかな
0191デフォルトの名無しさん2008/10/06(月) 01:39:26
便利さを見せつけたいのか難解さを見せつけたいのか醜悪さを見せつけたいのか
目的による
0192デフォルトの名無しさん2008/10/06(月) 01:46:45
>>190
オレにとっては STL map スゲーだった
でも、C++から始める人には何がスゲーのか分からんだろうな
0193デフォルトの名無しさん2008/10/06(月) 11:53:40
>>191難解さ・・・かな?
0194デフォルトの名無しさん2008/10/06(月) 12:18:14
>>190
Cは使えるC++初心者なら、ifとswitchが全然ないプログラムを見せてやれ。

0195デフォルトの名無しさん2008/10/06(月) 12:35:10
>>194
こうですか?わかりません><
#include <cstdio>
using namespace std;
class Manko {
public:
void hoge1(){printf("1\n");}
void hoge2(){printf("2\n");}
};
void hoge(int i)
{
void (Manko::*p[])() = {&Manko::hoge1,&Manko::hoge2};
(*p[i])();
}
0196デフォルトの名無しさん2008/10/06(月) 13:04:29
メタプログラミング見せてやれってことじゃ?

boostのspiritなんかも面白いかもね
0197デフォルトの名無しさん2008/10/06(月) 13:13:29
// これはC++ならではのコメントです
0198デフォルトの名無しさん2008/10/06(月) 14:17:57
>>195
このほうが良くないですか?って言われて終了
void hoge(int i)
{
printf("%d\n", i+1);
}
0199デフォルトの名無しさん2008/10/06(月) 14:27:39
>>197
しかしMSCのかなり前のバージョンから使ってたなあ、それ。
0200デフォルトの名無しさん2008/10/06(月) 15:55:27
だいたいC99にもあるじゃねーか。
0201デフォルトの名無しさん2008/10/06(月) 20:39:57
gccも拡張で採用してたし
0202デフォルトの名無しさん2008/10/06(月) 21:55:57
もともとご先祖様のBCPLにあったと言う。
0203デフォルトの名無しさん2008/10/06(月) 21:58:26
なんかD言語のコンパイル時に出力されるFizzBuzz問題のやつみたいな「えー、そんなことできるの!?」ってやつがいいんだが
0204デフォルトの名無しさん2008/10/06(月) 22:15:09
MPLでコンパイル時にFizzBuzzのシーケンスを作ればいいじゃないか。
0205デフォルトの名無しさん2008/10/06(月) 23:15:27
>>195

> void (Manko::*p[])() = {&Manko::hoge1,&Manko::hoge2};

なんだこれwww
文法エラー
しかもstaticじゃないと関数ポインタ取得できない
0206デフォルトの名無しさん2008/10/06(月) 23:33:39
メンバ関数ポインタを知らないのですね
まぁ呼び出しの方はおかしいけど
0207デフォルトの名無しさん2008/10/06(月) 23:38:14
#include <cstdio>
using namespace std;

class Manko {
public:
void hoge1() {printf("1\n"); }
void hoge2() {printf("2\n"); }
};

int main()
{
void (Manko::*p[])() = {&Manko::hoge1, &Manko::hoge2};
Manko m;

(m.*p[0])();
(m.*p[1])();
}
0208デフォルトの名無しさん2008/10/06(月) 23:41:49
>>206

ほほぅ
インスタンスって知ってますか?www

関数ポインタ変数にメンバ関数ポインタとやらを代入して、
関数ポインタ変数越しに呼び出すコードを晒して下さい
コンパイルが通るコードね
02092082008/10/06(月) 23:43:14
>>207

これはひどいwww
何がしたいの?www
0210デフォルトの名無しさん2008/10/06(月) 23:43:48
>>209
お前は一体何を・・・
0211デフォルトの名無しさん2008/10/06(月) 23:44:47
>>208
初期化子について勉強しなおしたほうがいい
02122082008/10/06(月) 23:48:35
>>211

なんで突然初期化子が出てくんだよwww

あぁあれか、馬鹿の一つ覚えってやつかな?www
0213デフォルトの名無しさん2008/10/07(火) 00:03:22
C++初心者になら、どんなに凄いソースコードを見せるより、
テンプレート使ったときのエラーメッセージ見せる方が効果的。
「この数千文字のエラーはね、constがないってコンパイラが怒ってるんだよ」
0214デフォルトの名無しさん2008/10/07(火) 00:04:44
俺もメンバ関数ポインタの構文はひどいとは思うが・・・
そういうことを言いたいのではなさそうだな?
0215デフォルトの名無しさん2008/10/07(火) 00:22:33
207は逃げたかwwwwwwwwwwwwwwwwwwwwww
0216デフォルトの名無しさん2008/10/07(火) 00:25:17
>>207も>>208みたいなのに絡まれて大変だなw
0217デフォルトの名無しさん2008/10/07(火) 00:25:28
>>215
悪いことは言わん、お前が逃げろ
今すぐにだ
0218デフォルトの名無しさん2008/10/07(火) 00:27:29
メンバ関数のアドレスとかいう馬鹿げたものをちゃんと説明できたらすぐ逃げますよ
はいどうぞwwwww
0219デフォルトの名無しさん2008/10/07(火) 00:27:52
208はこんな深夜にスレ住民を笑い死にさせる気のようです
02202082008/10/07(火) 00:30:43
>>217

ん?
俺は>>212以降は書き込んでないが?
02212082008/10/07(火) 00:31:56
間違えた

>>217じゃなく>>219な
0222デフォルトの名無しさん2008/10/07(火) 00:33:11
左様ですか
02232082008/10/07(火) 00:33:19
というか、
>>218は頭悪そうだなwww
0224デフォルトの名無しさん2008/10/07(火) 00:35:18
207ほどではないwwwww
0225デフォルトの名無しさん2008/10/07(火) 00:36:11
thisについて理解してない馬鹿が約一名いるようですね
0226デフォルトの名無しさん2008/10/07(火) 00:41:35
なにがなんだかわからない・・・・・・・
02272082008/10/07(火) 00:42:01
>>225

理解していない馬鹿はお前
thisが関数ポインタとでも?www
0228デフォルトの名無しさん2008/10/07(火) 00:42:09
207は早く出てきて謝れよw
0229デフォルトの名無しさん2008/10/07(火) 00:43:05
208は.*が一つの演算子だということを知らないようだ。
02302082008/10/07(火) 00:44:03
>>229

お前も何言ってんだ?www
0231デフォルトの名無しさん2008/10/07(火) 00:44:06
泳がせるのもいいが、早く張ってやれよww
http://www.geocities.jp/ky_webid/cpp/language/034.html
0232デフォルトの名無しさん2008/10/07(火) 00:44:54
また面白いことを言い出す奴が現れたw

あれ?こいつ207じゃね?
0233デフォルトの名無しさん2008/10/07(火) 00:46:10
>>208
お前が207叩くから恥かいた
謝れよ
0234デフォルトの名無しさん2008/10/07(火) 00:47:44
よく考えたらこんなC++ヲタしか知らないカオス機能を説明なしに使う207も悪い
207も謝れ
02352082008/10/07(火) 00:48:42
>>231

こういう構文もあるのか、しらんかったorz
まったく実用性ないが

でも誤ろうとは思わない
0236デフォルトの名無しさん2008/10/07(火) 00:50:13
知らなくて当然だよな
新しい機能だろ?こんな変なの
02372082008/10/07(火) 00:51:52
でもこれってさ、
void (CSample::*pFunc)() = &CSample::func;
この時点でメンバ関数ポインタを取得っておかしくね?
0238デフォルトの名無しさん2008/10/07(火) 00:53:53
こんなわけのわからない構文におかしいも糞もないよ
そういうものだと思うしかないんだろ
0239デフォルトの名無しさん2008/10/07(火) 00:56:00
>>237
別におかしくないよ。
0240デフォルトの名無しさん2008/10/07(火) 00:57:41
CSampleのインスタンスが一つもない状態から
どうやってfuncなるメンバ関数を特定するのかとても不可解です
02412082008/10/07(火) 01:01:53
おそらくオフセット的なものがpFuncに入っているのだろう
そして、呼び出し時にインスタンスを指定したところで、
インスタンスのポインタ+オフセットをcallみたいなことなのかな?

ん〜、どう見ても使えんwww
0242デフォルトの名無しさん2008/10/07(火) 01:01:59
特定しません
インスタンス付けて実際に呼ぶまで実際に呼ぶ関数は決まりません(virtualの場合)
0243デフォルトの名無しさん2008/10/07(火) 01:02:01
メンバ関数の引数には、隠されたthisポインタがあることを知っていれば、別におかしくない。
class CSample { void func(); };
void (CSample::*pFunc)() = &CSample::func;
(obj.*pFunc)();
↓
void func(CSample *this);
void (*pFunc)(CSample*) = &func;
(*pFunc)(&obj);
0244デフォルトの名無しさん2008/10/07(火) 01:02:39
で、何の役に立つのこのクソ機能
0245デフォルトの名無しさん2008/10/07(火) 01:05:59
ジャンプテーブルを作るとき
0246デフォルトの名無しさん2008/10/07(火) 01:08:47
大して役に立たない機能は他にもあるからなぁ
全部の機能が何かの役に立つわけではないだろう
0247デフォルトの名無しさん2008/10/07(火) 01:09:41
C#でdelegateでも弄ればきっとそのとてつもない便利さに目覚めるさw
02482082008/10/07(火) 01:14:02
でもよく考えたら、
呼び出す時にインスタンス指定しなきゃいけないんだろ?

関数ポインタっつってるけど、
これ関数ポインタじゃねーじゃんwww
0249デフォルトの名無しさん2008/10/07(火) 01:15:53
>>248
納得いかないなら自分でthisとメンバ関数ポインタのペア作れよ、テンプレート使えば汎用的だし簡単にできるぞ
0250デフォルトの名無しさん2008/10/07(火) 01:21:08
クラスの仕組みをメモリイメージで解説してる入門書が少ないのが問題だな
0251デフォルトの名無しさん2008/10/07(火) 01:26:01
役に立たない、使い道が無いと思うのは経験不足。
無理に使う必要は無いが、使ったほうが楽になる場面というのはあるもんなんだぜ。
0252デフォルトの名無しさん2008/10/07(火) 01:30:26
くれぐれも覚えたてのテクだからって乱用すんなよw
■ このスレッドは過去ログ倉庫に格納されています