07/12/17 11:47:57
長文失礼、ちょっとC++プログラムのコーディングでいい方法があれば誰か教えて下さい。
今、簡単なライブラリ的なクラスを作りました。それは継承されることを前提として
います。仮にそれをKihonとしておきます。
今、Kihonの派生クラスHaseiを作りました。HaseiからKihonを使う方法ですがまず、Kihonの
メンバ関数を通じて必要なパラメータ(privateな変数)を設定します。次にHaseiに
double func(double x)なメンバ関数を定義します。これはKihonクラスでvirtual関数として
宣言されているものです。その後、Kihonのrunを実行するとHaseiのfuncが利用されて
処理が行われるというものです。一回のrunでfuncは何度も呼ばれます。
問題なのはHaseiで異なる二つの処理をKihonのrunにさせるにはどうしたらいいものかということ
です。つまり、異なる相異なる2関数に対してKihonのrunを実行するにはどうすればいいのかと
いうことです。しかも後に実行されるrunが前に実行されたrunの結果を使う必要があります。
初心者なりに考えた方法ですと・・・
0, Haseiのオブジェクトh0を作る。
1, Haseiのfunc関数を作る。この関数内で別のクラス、__Haseiのオブジェクトh1を作る。__Haseiは
Kihonを継承している。
2, 最初のrunで必要なメンバ関数funcを__Haseiで定義する。
3, Haseiのfunc関数からh1.runとして最初のrunを行う。
4, h0.runとして二度目のrunを行う。
(メンバ変数の設定に関しては説明略)。
実際、この方法だととりあえずは動作するのですが次のような問題点があります。
・__HaseiからHaseiのプライベートメンバにアクセスできない。(friendでは次項が解決不能…)
・実はHasei自体もライブラリ的に実装を隠蔽してしまいたいため、__Haseiのfuncを変更
出来るようにしたい。(ちなみにHaseiのfuncは固定。)
多重継承をうまく使うと解決できそうにも思えるのですが賢い、実装方法はないでしょうか。
お力をいただけると幸いです。根本的にKihonの設計に対する指摘でもお願いします。
410:デフォルトの名無しさん
07/12/17 11:59:51
>>409
いろいろわからん。コード書け。あと __ は使うな。
411:デフォルトの名無しさん
07/12/17 12:25:04
>>409
適当に思い浮かんだ単語
スレッド
static メンバー
boost
412:デフォルトの名無しさん
07/12/17 12:54:23
「初心者なりに考えた方法ですと・・・」の部分、ただしコードを全部書くとさらに長大になってしまうので
掻い摘んで。(409のHasei→Hasei0、__Hasei→Hasei1とした)
class Kihon{
virtual double func(double x){return 0.0;} /* =0としてしまってもよい */
public:
double run()
{
... /* runの実装部分 */
for (j = 1; j <= n; j++)
func (x); /* funcは何度も呼ばれる */
return ret; /* 計算結果を返す */
}
};
class Hasei1: public Kihon
{
double y;
double func(double x){return x*sin(x+y);} /* 計算対象 */
public:
void set_y(double y){this->y = y;}
};
413:デフォルトの名無しさん
07/12/17 12:54:54
class Hasei0: public Kihon
{
double func(double x){
Hasei1 h1;
h1.set_y(x);
... /* h1のprivate変数を設定など */
return 1.0 - h1.run();
}
};
int main()
{
Hasei0 h0;
.....
cout << h0.run();
.....
}
例えばx*sin(x+y)の多重積分を想定している感じです。実際にはこれ以外にもたくさんありますが。
本来ですと計算対象は(例えば別のクラスを宣言することや、関数へのポインタでもいいですが)自由に変更出来ること、
そもそもHasei0も1も実装は隠蔽してしまいたい、計算対象はパラメータを含んでいるので本当はクラスとして実装
したいというのがありますが恐らく、これでは無理でしょうからいいアイディアはあるでしょうかという意味です。
よろしくお願いします。
414:デフォルトの名無しさん
07/12/17 13:01:11
boostって知りませんでした。ちょっと調べてみます。
415:デフォルトの名無しさん
07/12/17 13:01:37
>>409
多重継承だけは使うな。
あとでワケわかんなくなる。
416:デフォルトの名無しさん
07/12/17 15:15:36
>>413
ようわからんがtemplateとかboost::bind(std::bind1st, std::bind2nd)使えばよさそうな気がする。ファンクタも調べた方がいいかも。
試しに同じような事するの書いてみた。
template<typename Func> double kihon(Func func)
{
for (j = 1; j <= n; j++)
func(x);
return ret;
}
double hasei1(double x, double y) { return return x*sin(x+y); }
double hasei0(double x) { return 1.0 - kihon(boost::bind(&hasei1, _1, x)); }
int main()
{
kihon(&hasei0);
}
417:デフォルトの名無しさん
07/12/17 16:17:11
>>416
本当にどうもありがとうございます。まだ、自分のプログラムでは解決していませんが言わんとしていることが
よくわかります。たしかにテンプレートを関数のポインターに使えば解決しそうです。C++は初めてなので
参考になります。重ね重ね、ありがとうございます。
418:デフォルトの名無しさん
07/12/17 18:05:37
あるライブラリ(A)をラップした、全く同一のインターフェイスが使えるDLL(B)を作りたいのです。
つまり、DLL(B)はライブラリ(A)のすべての関数をエクスポートします。
これを実現するために(とりあえずwin32環境限定の話)
ライブラリ(A)をDLL(B)にスタティックリンクさせ、ライブラリ(A)の各関数宣言に
__declspec(dllexport)をつけたファイルをDLL(B)からインクルードさせたのですが、
どうもこれでは上手くいかないようで、DLL(B)からライブラリ(A)の関数がエクスポートされていませんでした。
そこで質問なのですが、DLLからライブラリを直接エクスポートすることは可能なのでしょうか?
もし可能ならやり方を教えていただけるとありがたいです。
(ライブラリ(A)をDLLにするという方法はとりあえず却下でお願いします。
今は別の方法としてライブラリ(A)のソースファイルを直接DLL(B)に追加しています)
419:デフォルトの名無しさん
07/12/17 18:48:06
VC++2005StandardでMFC使おうとしてるんですが
ウェブで調べてもVC6.0系の使い方ばかりで全然分かりません
2005のMFCの入門的なサイトってないですか?
できればopengl を絡めたところがいいんですが
420:デフォルトの名無しさん
07/12/17 18:55:07
MFCはマイクロソフトファンダメンタルクラスだろ? バージョンによって言語(クラス)の使い方が変わるかよ
6用でも関係ないだろ
421:デフォルトの名無しさん
07/12/17 19:05:27
クラスウィザードとかを使うのに、IDEのどこのボタン押して、どの選択肢を選べばいいのか?
・・・ってのを知りたいのじゃね?
422:デフォルトの名無しさん
07/12/17 19:53:19
そういやVC2008EEが来るな
423:デフォルトの名無しさん
07/12/17 20:02:56
VC2005でもういいです
424:デフォルトの名無しさん
07/12/17 21:09:24
Hoge hoge1;
Hoge *hoge2 = new Hoge();
の違いがよくわからないのですが
newした場合、普通に宣言するより良いことがあったりしますか?
425:デフォルトの名無しさん
07/12/17 21:15:06
>>424
絵に描いたような初心者か、釣りか、のどっちかだな
426:デフォルトの名無しさん
07/12/17 21:17:47
ヒープ領域は量が多い (ハードディスクもメモリ代わりになる)
自分で変数の領域を開放できる
ヒープに確保すれば、高速な動作が必要な変数をスタック領域、レジスタ領域に割り当てられやすくなる
427:デフォルトの名無しさん
07/12/17 21:19:40
大量にメモリ食うやつは全部newとかにしておけばよい
実メモリを多く空けておくことが大事
428:デフォルトの名無しさん
07/12/17 21:21:41
STL 頼ってるから最近 new 使ってないな…
429:デフォルトの名無しさん
07/12/17 21:27:03
メモリどうこうより、初心者には寿命の違いを説明した方がいいのではなかろうか
430:デフォルトの名無しさん
07/12/17 21:27:30
調べてきたけど、スタック領域はコンパイル時に決定されるらしい
メモリ食うやつは、動的に確保しないとプログラム終了までスタック領域として確保されっぱなしってことだ
他のプログラムや自分のプログラム内でもメモリ確保が難しくなるということだ
431:デフォルトの名無しさん
07/12/17 21:31:08
30バイト以上の確保は動的確保にしようぜ newやvectorやstringを使おう
432:デフォルトの名無しさん
07/12/17 21:31:23
>>424
Hoge hoge1;
の場合、hoge1の寿命がその関数(あるいはブロック)に縛られる。
関数を抜けた後もhoge1を維持することは出来ないし、関数を抜ける前にhoge1を消すことも出来ない。
Hoge *hoge2 = new Hoge();
の場合、hoge2の寿命は自分でコントロールできる。
関数を抜けようが抜けなかろうが、deleteするまでは消えないし、deleteすればいつでも消せる。
433:デフォルトの名無しさん
07/12/17 21:35:35
配列は動的確保、自動開放するvectorがあるけど 変数は動的確保、自動開放する命令ってないよね?
Hogeクラスが5Mとか使うとは想像していないのだろうか?
434:デフォルトの名無しさん
07/12/17 21:36:37
auto_ptrのことか?ちょっと違うか?
435:デフォルトの名無しさん
07/12/17 21:57:06
class Hoge{ char x[10000]; };
auto_ptr< Hoge > hog(new Hoge);
こうやって使うのか 勉強になった でもアクセスが*付けないと駄目で不便だよね
436:デフォルトの名無しさん
07/12/17 22:02:26
そんなあなたに
boost::scoped_array
boost::shared_array
437:424
07/12/17 22:06:21
しょうもない質問に答えてくれてありがとうございます
とりあえず普通に宣言しておけば大丈夫だ
なんて思ってた自分が馬鹿でした・・・
しっかりdeleteする必要がありますが、
なるべく動的確保にしておいた方が良いんですね
もうすこし自分でも調べてみようと思います
ありがとうございました
438:デフォルトの名無しさん
07/12/17 22:10:48
int型やchar型やdouble型の変数を動的確保するのは止めよう
あとループの変数も動的確保するのは止めよう
判断基準は、メモリを消費するかどうかだろう
439:!=438
07/12/17 22:27:09
>>438
判断基準に「(ループ内など)速度が必要か否か」も加えるといいかも。
10万回、100万回のループになると毎回newするのも…
まぁ、その場合は最初にnewして使いまわせ、って話になるわけだが。
440:デフォルトの名無しさん
07/12/17 22:30:32
ループ内で毎回な別領域の確保が必要な場合はあるけどね・・・
流用できるなら内部でしたらだめだな
441:デフォルトの名無しさん
07/12/17 22:38:19
基本的にループの変数は直前に確保した方が良いのかなあ
以前から使っている変数だと、レジスタにのっている可能性は低いし、ループで使うからと言って移動はしないよね?
for( int )だと最適化されそう
442:デフォルトの名無しさん
07/12/17 23:12:40
>>441
変数の用途が明確な方が最適化対象になりやすい。
443:デフォルトの名無しさん
07/12/17 23:42:33
別のスレッドで返答がもらえなかったのでこちらで。
なぜcallocは2引数関数なのでしょうか。ゼロクリアするだけならmallocのように1引数でも可能だとおもいます。
2引数のほうが最適化しやすいからだときいたことがありますが、具体的にはどのような最適化が考えられるでしょうか?
444:デフォルトの名無しさん
07/12/17 23:51:31
callocのcて何て意味?
445:デフォルトの名無しさん
07/12/17 23:52:34
>>443
例えば80486以降のインテル系CPUはSTOSB STOSW STOSDという三つの命令があり、
それぞれバイト、ワード、ダブルバイト単位でレジスタから転送を行う。
他のCPUでもサイズに応じた専用のインストラクションを持っていることはよくある。
そのどれを使うかとかいったヒントになる可能性があると思う。
446:デフォルトの名無しさん
07/12/17 23:53:00
clear?
447:445
07/12/17 23:53:15
ダブルバイトってなんだよ。ダブルワードの間違いな。
448:デフォルトの名無しさん
07/12/17 23:56:16
>>445
なるほど。ありがとうございます。
しかしその程度なら、要求されたサイズの下位数ビットを見れば判断できる気もするが・・・。
449:デフォルトの名無しさん
07/12/18 00:05:43
>>443
callocは一応「配列を確保する関数」だからじゃない?
最適化に関しては↓がヒントになるかも。
URLリンク(www.bohyoh.com)
450:デフォルトの名無しさん
07/12/18 00:09:54
>>449
最適化については何も解説していないような・・・
451:デフォルトの名無しさん
07/12/18 01:03:49
>>420
ファンダメンタルかよ
452:デフォルトの名無しさん
07/12/18 02:16:52
signed型へ<<や>>演算したときの結果の符号ビットや符号拡張有無って
規格で決まっていますか?
453:デフォルトの名無しさん
07/12/18 02:32:06
>>452 いいえ。
454:デフォルトの名無しさん
07/12/18 09:57:37
C++ 初心者です。C++ でこんなコードを見かけたのですが、 struct S { S( int x ) : x_( x ) {} int x() { return x_; } int x_; }; 2 行目の意味がわかりません。とくに x_( x ) {} の部分が頭の中でパーズできないんですが、これは何を定義しているの?
455:デフォルトの名無しさん
07/12/18 09:59:38
: x_( x ) だな
x_をxで初期化している
コンストラクタ初期化子とかでぐぐると幸せになるかも
456:デフォルトの名無しさん
07/12/18 10:37:10
この書き方で「2行目の意味が」ってのも凄いな
ナチュラルな喧嘩の売り方するなぁと感心したw
457:デフォルトの名無しさん
07/12/18 10:42:22
コンストラクタの初期化子で配列の初期化ってできる?
458:デフォルトの名無しさん
07/12/18 11:07:46
>>457
組み込み配列についてはできません。 std::vector ならできます。
459:デフォルトの名無しさん
07/12/18 11:26:54
>>458
ありがとう
じゃあコンストラクタ内で普通に代入するか
もう一つ質問
固定長配列にvectorを使う意味ってある?
あるとしたら何?
460:デフォルトの名無しさん
07/12/18 11:34:14
>>459
サイズの管理も一緒にしてくれる。
未来永劫何があってもサイズが変わらない場合を除けば、この利点は小さくない。
461:デフォルトの名無しさん
07/12/18 11:35:23
>>459
多くの実装では assert() などでデバッグ用の範囲チェックが入っている。
begin(), end() があるので標準アルゴリズムが使いやすい。
要素の比較に基づく比較演算子が定義されている。
安全で軽い swap() が使える。
462:デフォルトの名無しさん
07/12/18 12:02:09
C言語でvoid型の関数を任意の場所で終了させるにはどうすればいいのでしょうか?
何か値を返せる関数ならreturnすればいいと思うのですが
voidなのでreturnをすると怒られてしまいました
463:デフォルトの名無しさん
07/12/18 12:04:39
return;
464:デフォルトの名無しさん
07/12/18 12:05:52
>>462
void func(){
return;
}
465:デフォルトの名無しさん
07/12/18 12:09:42
>>462
void func()
{
...;
goto end;
...;
end:
}
or
void func()
{
...;
if (0) {
...;
}
}
466:デフォルトの名無しさん
07/12/18 12:15:41
>>460-461
サンクス
467:デフォルトの名無しさん
07/12/18 12:16:11
ああ、なるほど
値さえ返さなきゃ怒られないんですね
0を返しておりました
468:デフォルトの名無しさん
07/12/18 12:20:25
>>460
static const int foo[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
みたいな固定長配列なら、sizeof(foo) / sizeof(* foo)でsize()相当だと思うが、それでもメリットだと?
469:デフォルトの名無しさん
07/12/18 12:23:26
STLのコンテナとして使える
470:デフォルトの名無しさん
07/12/18 12:26:16
boost::array
471:デフォルトの名無しさん
07/12/18 12:50:19
じゃあそれポートして使いまする
472:デフォルトの名無しさん
07/12/18 12:51:25
固定長配列テンプレートはいいよね
余分な領域取らないし
473:デフォルトの名無しさん
07/12/18 12:59:15
boost::checked_deleteってそんなに役に立つか?
474:デフォルトの名無しさん
07/12/18 13:03:58
初心者でも何か作れる物はないだろうか?
475:デフォルトの名無しさん
07/12/18 13:05:18
>>474
アドレス帳
ノベルゲーム
etc
476:デフォルトの名無しさん
07/12/18 13:07:47
>>475
ノベルゲームを作れるお勧めのwindows上で動く
アプリとかありませんかね。
477:デフォルトの名無しさん
07/12/18 13:20:59
C言語でいいじゃん
printfとscanfで作れるぞ
478:デフォルトの名無しさん
07/12/18 13:25:14
おまえらって何が目的でC言語使ってんの?
479:デフォルトの名無しさん
07/12/18 13:29:21
>>473
なんで役に立たないと思うの?
あと、 boost スレに行ったほうがいいかもね。
480:デフォルトの名無しさん
07/12/18 13:45:48
>>478
プログラミングするのが楽しいから
481:デフォルトの名無しさん
07/12/18 15:18:50
まともに仕事で使おうとすると、
boostなんてフリーのライブラリは、
使用許可がおりない件について
誰が責任もてるの、って怒られるぜよ
482:デフォルトの名無しさん
07/12/18 15:34:04
boostからポートした自作ライブラリを使うんだよ
483:デフォルトの名無しさん
07/12/18 15:36:43
それを言い出すと、gccや下手すればLinuxそのものも使えなくなる罠。
484:デフォルトの名無しさん
07/12/18 15:41:40
>>483
プロジェクトの種類や客の流儀とかなんとかで、
そのとおりな制約がつく仕事も実際、けっこうある。
・・・いや、あった。もう地獄から永久に開放されて
こんな時間に2chしてる俺にはどうでもいい話
485:デフォルトの名無しさん
07/12/18 15:46:46
参照のつかいかたがよくわからないので教えてください。POCO::Loggerというライブラリをつかっています。
hasがLoggerのポインタを返して、getが参照を返します。createで作ります。
POCO::Logger* buff = POCO::Logger::has("hoge");
if (buff == NULL) {
// 無いから作る
POCO::Logger& logger = POCO::Logger::create("hoge");
logger.information("@@@@@");
} else {
// あるから使う
POCO:Logger& logger = POCO::Logger:get("hoge");
logger.information("@@@@@");
}
// @ほんとはここでlogger.information("@@@@@")にして、↑の@@@@@出力部分は消して共通化したい
というコードは動くんですが、最終行で出力する処理を入れて
共通化したいんですけど、参照ってポインタみたいにいれないでおくとかができないと思っています。
このような実装はみなさんどのようにされていますか?
486:デフォルトの名無しさん
07/12/18 15:51:11
>>481
フリーとは言っても誰が作ってると思う?
使用許可を出さない奴本人に
『おまえが判断できる程のレベルかよ?』
って言い返す。
487:デフォルトの名無しさん
07/12/18 15:52:29
>>479
不完全型のチェックにしか使えないよね。
全く役に立たないとは思わないけど、あえて使う意味はあるのかと。
488:デフォルトの名無しさん
07/12/18 16:13:45
>>485
POCO::Logger & logger = buff == NULL ? POCO::Logger::create() : POCO::Logger::get();
logger.information();
489:デフォルトの名無しさん
07/12/18 16:22:40
>>488
ぉぉすばらしい。ありがとうございます。そのような発想はありませんでした。
ちょっとトリッキーな気がするのですが、C++で参照を使うときは常識ですか?
490:デフォルトの名無しさん
07/12/18 16:45:28
C++と言わず参照と言わず、割と使うけど。
Cでもこんなのとか。
FILE * fp = fileName == NULL ? stdin : fopen(fileName, "r");
491:デフォルトの名無しさん
07/12/18 17:52:49
>>490 の
FILE * fp = fileName == NULL ? stdin : fopen(fileName, "r");
って どのように分解(解釈)されるの?
492:デフォルトの名無しさん
07/12/18 17:57:10
>>491
fileNameがNULLだったらstdin、そうでなければfileNameをfopen()した結果をfpに代入。
493:デフォルトの名無しさん
07/12/18 18:05:23
>>492
有難うございます。日本語ではそうなるのですか。
すみません、この1行をC言語に1行ごと(ステップ)に分解して書いたらどうなるのですか?
494:デフォルトの名無しさん
07/12/18 18:11:18
FILE *fp ;
if( fileName == NULL )
{
fp = stdin ;
}
else
{
fp = fopen(fileName,"r");
}
495:デフォルトの名無しさん
07/12/18 18:12:19
まあ、参照は初期化必須だから、>>488を分割して書く事は出来ないがな。
496:デフォルトの名無しさん
07/12/18 18:12:26
FILE * fp =
fileName == NULL
? stdin
: fopen(fileName, "r");
497:デフォルトの名無しさん
07/12/18 18:13:39
boost::optionalをパクればいい
498:デフォルトの名無しさん
07/12/18 18:23:44
>>494
有難うございました
そうなるのですか、なんか>>490だと読みにくいですね
>>495
となると、参照のときは読みにくい構文使うしかないということですね
499:デフォルトの名無しさん
07/12/18 18:56:32
>>498
俺が三項演算子を使うときは、条件部を必ず(単項式であっても)括弧で括ってる。
>>490の例の場合は、
FILE * fp = (fileName == NULL) ? stdin : fopen(fileName, "r");
まぁ、この辺は各々のスタイルの問題。
読みにくさについては内容の複雑さによりけりで、たとえば
int n = (hoge) ? 10 : 20;
程度の内容をif-else文で書くと、俺の感覚だと「無駄に物々しい」感じがして、逆にわかりにくいかな。
500:デフォルトの名無しさん
07/12/18 19:12:34
三項演算子は禁止、
って、けっこうコーディングルールにされることが多い
501:デフォルトの名無しさん
07/12/18 19:18:45
生粋の三項演算子erな漏れには辛い職場だ
502:デフォルトの名無しさん
07/12/18 19:29:24
>>498
こんなんでもいんじゃね?
POCO::Logger* buff = POCO::Logger::has("hoge"), *logger;
if (buff == NULL) {
// 無いから作る
logger = &POCO::Logger::create("hoge");
} else {
// あるから使う
logger = &POCO::Logger:get("hoge");
}
logger->information("@@@@@");
というかhas()が返すアドレスの実体はgetで得られるインスタンスとは別物なん?
同一ならそのまま使えるだろうけど
503:デフォルトの名無しさん
07/12/18 19:29:27
ff
504:デフォルトの名無しさん
07/12/18 19:36:13
例外処理のthrowのメリットは?
普通に関数にとばすのはだめなのかい
505:デフォルトの名無しさん
07/12/18 20:21:22
普通に関数に飛ばすとは、どういうやり方?
throwは関数の呼び出し元の呼び出し元の呼び出し元の・・・にずーっと遡っていけるところに意味がある
506:デフォルトの名無しさん
07/12/18 20:23:41
昔のCのように、abort()を呼ぶとかそういう話?
507:デフォルトの名無しさん
07/12/18 20:53:58
>>504の考える例外的な事態というのは、その場でプログラムを終了するタイプ「のみ」なんじゃないかな。
確かに、すぐ終了するのであれば、例外処理の存在意義である「簡潔かつ強力に特定の段取りまで戻る」
能力は要らないからね。
>>504
でも、例外発生後もまだプログラムを続行させる場合、「関数に飛ばして」例外処理を実現しようとすると、
結構面倒というか、入り組んでしまうことがある。
f1()から呼んだf2()から呼んだf3()から呼んだf4()の中で何か「例外的な状態」になった場合、f4()内に
if (失敗したという証拠) {
例外処理();
return 失敗したという合図;
}
を書くだけでなく、場合によってはf2()やf3()も、その「合図」がちゃんとf1()のもとへ帰っていけるよう、
バケツリレーのような構造の実現に協力しなくちゃならなくなったりするわけだ。
その例外は、自分とは直接関係ないことなのにね。
508:デフォルトの名無しさん
07/12/18 21:01:10
ただやっぱり、Joelもいってるように、例外はきちんと
ハンドリング出来ているかが、コード面を眺めたくらいでは
すぐには判らないという弱点があるね。
戻り値ベース:
fp = fopen(filename, "w");
fwrite( var, 1,len,fp ); //ププ。エラー処理忘れやがんの。
例外ベース:
fs = new FileStream( filename, WRITE );
fs.Write( var ); //ファイル無かったら例外投げるから、
//呼ぶ側で対処しろと言うことかな~?
509:デフォルトの名無しさん
07/12/18 21:07:30
>>420
インターフェースが結構違うのでわからないんです
参考に見た6.0の解説を上げてみると
~~~
左フレームのFileメタブをクリックして、Source FileのGlSampleView.cppファイルを開く
右のフレームに現れるソースファイル上で、右クリック。表示メニューのClassWizardを選択する←この時点で分からない
ここでViewクラスのメッセージ処理をカスタマイズする。
メッセージ欄から「WM_CREATE」を選択して関数追加ボタンをクリックする。
するとOnCreate()関数がGlSampleView.cppファイルに自動的に追加される。
~~~
クラスウィザードのようなものは別の方法で見つけたんですがすると4行目のWM_CREATEが無い
といったように前に進みません
510:339
07/12/18 22:32:05
1>index.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall std::ios_base::Init::Init(void)" (??0Init@ios_base@std@@QAE@XZ) が
関数 "void __cdecl std::`dynamic initializer for '_Ios_init''(void)" (??__E_Ios_init@std@@YAXXZ) で参照されました。
1>index.obj : error LNK2019: 未解決の外部シンボル "public: __thiscall std::ios_base::Init::~Init(void)" (??1Init@ios_base@std@@QAE@XZ) が
関数 "void __cdecl std::`dynamic atexit destructor for '_Ios_init''(void)" (??__F_Ios_init@std@@YAXXZ) で参照されました。
1>D:\ta\c\works\online\Debug\dos.exe : fatal error LNK1120: 外部参照 2 が未解決です。
===index.cpp====
#include <iostream>
int main() {
std::cout << "Kitty on your lap";
return 0;
}
===============
/O2 /D "_MBCS" /FD /EHsc /MT /Fo"Debug\\" /Fd"Debug\vc80.pdb" /nologo /c /TP /errorReport:prompt
/OUT:"D:\ta\c\works\online\Debug\dos.exe" /NOLOGO /MANIFEST /MANIFESTFILE:"Debug\dos.exe.intermediate.manifest"
/SUBSYSTEM:CONSOLE /ERRORREPORT:PROMPT kernel32.lib
リンクがうまくいってないってことかな?
ちゃんとライブラリフォルダをC:\Program Files\Microsoft Platform SDK\Libに設定しているのだが・・。
511:デフォルトの名無しさん
07/12/18 23:00:25
たまに見かけるけとKitty on your lapて何なん?
調べてみたらゲームみたいだけどあれが元ネタ?
512:デフォルトの名無しさん
07/12/18 23:35:44
>>510
iostreamってSDKじゃないだろ。
513:デフォルトの名無しさん
07/12/18 23:36:20
猫でも分かるの人がサンプル文字列に使ってたな。
さらなる元ネタはよくわからないが。
514:デフォルトの名無しさん
07/12/19 00:07:13
古いギャルゲーのタイトル
515:デフォルトの名無しさん
07/12/19 01:29:06
問題分が
以下の手順を従い、経路選択アルゴリズムを評価せよ。
通信の発生:ランダムに送受信ノードを決定する。
通信の確定:与えられた送受信ノードの経路を決定し、その経路上のリンクの空き容量を1Mbpsだけ減少させる。
ただし、空き容量のないリンクが存在する場合、この通信は確立しなかったものとして、何も行わない。
通信の終了:n回前に発生した通信の経路上の空き容量を1Mbpsだけ増加させる。ただし、その通信が確立していなかった場合には何も行わない。
評価:10000回の通信を発生させ、そのうちで確立できなかった通信の割合を求める。
試行の繰り返し:nの値を変えながら、上記の試行を繰り返す
プログラム自体(URLリンク(kansai2channeler.hp.infoseek.co.jp))は拾ってこれたのですが
どこにグラフを入力していいのか分からなく困っています。
ちなみにグラフは以下に書きます
URLリンク(kansai2channeler.hp.infoseek.co.jp)
左と中央がノードで右がそれをつなぐリンクの容量です。
516:デフォルトの名無しさん
07/12/19 01:38:58
宿題スレへ
517:デフォルトの名無しさん
07/12/19 02:08:39
>>508
戻り値だってコード面見てエラー処理の抜けは気づきにくい。
Joel とかが言ってるのは、エラー処理に問題のあるコードと
適切なコードとの違いが微妙すぎるって言う問題。まぁこっちの問題も
一緒といえば一緒なんだけどな。処理の順番とか。
518:デフォルトの名無しさん
07/12/19 09:00:37
VC++ 2005での関数インライン化について教えてください。
通常、インライン関数は定義をヘッダに書かないとコンパイル
できませんが、/LTCGオプションでリンク時のモジュール間
インラインを指定すると以下のようなコードがビルド可能
だと思ったのですが、実際はリンクエラーとなります。
もちろんinlineキーワードを外すとビルドできます。
/LTCGを指定してもinlineキーワードを付けるとインライン
対象関数の定義は呼び出しソースファイルから可視でなくて
はいけないのでしょうか?/LTCGのリンク時モジュール間
インラインの正しい使用法を教えてください。
//aaa.hヘッダーファイル
double MySquare(double);
//aaa.cppソースファイル
inline double MySquare(double d)
{
return d * d;
}
//bbb.cppソースファイル
#include "aaa.h"
int main()
{
double d = MySqiare(3.14);
}
519:デフォルトの名無しさん
07/12/19 09:15:43
よく空間的局所性の高いコードは速いとかいいますけど、最近のx86で
あるアドレスの値を読み込むと、その先何バイト位がキャッシュに載るんですか?
520:デフォルトの名無しさん
07/12/19 09:46:40
VC8(VC2005)で
template<class T>
std::list<T>::iterator MoveListItr(std::list<T> *pLst)
~略~
というSTLのイテレータを返すテンプレートが、イテレータの記述部分
(std::list<T>::iterator)で「型ではない」とエラーが出ます。
VC7まではこれで通ったのですが、文法に問題があるのでしょうか?
それともVCの問題なのでしょうか?
521:デフォルトの名無しさん
07/12/19 09:53:01
template<class T>
typename std::list<T>::iterator MoveListItr(std::list<T> *pLst)
522:デフォルトの名無しさん
07/12/19 10:00:51
>>520
typename std::list<T>::iterator MoveListItr(std::list<T> *pLst)
って書けばいいんじゃないかな。
いわゆる特殊化ってやつがあるせいで、classname<T>::hogeという記述だけでは、
hogeが値なのか型名なのか断定できない。
そういう場合、「これは型名ですよ」というのをコンパイラに教えるために、typenameを書く。
今回のVC7と8の違いは、「ここは関数の戻り値の型を書く場所だから、型名に決まってるよな」
とコンパイラが判断したか否か、の違いだと思うんだけど、
VC7の気が利いているのか、VC8が「VC7が無視した何らかの可能性」を見て断定を避けたのか、
どっちなのかは俺にはわからないや。
523:デフォルトの名無しさん
07/12/19 10:03:56
単に規格に準拠するようにしただけじゃねえの?
524:デフォルトの名無しさん
07/12/19 10:12:15
>いわゆる特殊化ってやつがあるせいで
特殊化は無関係
525:デフォルトの名無しさん
07/12/19 10:13:50
>>521-523
なるほど、そうだったんですか。
おかげで解決しました、ありがとうございます。
526:りょう ◆RyOrlro88Q
07/12/19 10:46:02
ループが止まりません><
#include<stdio.h>
#define N 20
main(){
char ch[N],a,word='^';
int num,i,j;
j=0;
printf("Input your name.(When the input is finished,type ^.)\n");
for(num=0;ch[num]!=word;num++){
printf("ch[%d]=",num);
scanf(" %s",&ch[num]);
}
printf("target:");
scanf(" %c",&a);
for(i=0;i<num;i++){
if(ch[i]==a){
j++;
}
printf("%c=%d\n",a,j);
}
}
527:デフォルトの名無しさん
07/12/19 11:04:06
>>526
最初のループの終了条件がおかしい。
528:りょう ◆RyOrlro88Q
07/12/19 11:09:43
ループは自己解決><
次は判定に問題が…><
529:りょう ◆RyOrlro88Q
07/12/19 11:30:49
jが増えない><
#include<stdio.h>
#define N 20
main(){
char ch[N],a,word='^';
int num,i,j;
j=0;
printf("Input your name.(When the input is finished,type ^.)\n");
for(num=0;ch[num]!=word;num++){
printf("ch[%d]=",num);
scanf(" %s",&ch[num]);
if(ch[num]==word){
break;
}
}
printf("target:");
scanf(" %c",&a);
for(i=0;i<num;i++){
if(ch[i]==a){
j++;
}
}
printf("%c=%d\n",a,j);
}
530:デフォルトの名無しさん
07/12/19 11:34:56
ちったあ自分で考えないと成長しないぜ
531:りょう ◆RyOrlro88Q
07/12/19 11:40:58
考えてるけどわからないんです><
532:デフォルトの名無しさん
07/12/19 11:43:39
>>528
他にも色色問題が。scanf()で一文字ずつ入力なんて阿呆なことしないで、
fgets()で1行分まるっと入力してしまえばいいじゃん。
あと、'^'による終了判定も無意味。
533:デフォルトの名無しさん
07/12/19 11:45:26
つーか、>529ではループの判定条件がバグったままじゃんw
534:デフォルトの名無しさん
07/12/19 11:46:26
何故増えないんだと思う?
具体的な場所はともかく、どの辺が間違ってそうな気がする?
本当はデバッガを使うのが良いんだろうが、printfデバッグっていう手法だってある。
それっぽい箇所にprintfを挿入するだけで見えてくるかもよ。
535:デフォルトの名無しさん
07/12/19 11:47:57
ブロックの前後や中で満たすべき条件を式のかたちで書き出してみてはどうか
536:デフォルトの名無しさん
07/12/19 11:51:01
紙と鉛筆使って机上でプログラムを実行してみるのもいい。
どこで意図しない動作になっているかすぐ分かる。
537:デフォルトの名無しさん
07/12/19 11:53:22
>>518について詳しい人いませんか?
538:りょう ◆RyOrlro88Q
07/12/19 11:57:29
解決できました><
ありがとうございましたm(__)m
>>532
それが指定なんですよ><
>>534
そんな方法なんて知りませんでした><
539:デフォルトの名無しさん
07/12/19 12:01:09
ほほぉ。それじゃ、スレよごしの罰として完成したソースを貼ってもらおうか。
540:デフォルトの名無しさん
07/12/19 12:06:58
>>118
URLリンク(ml.tietew.jp)
541:デフォルトの名無しさん
07/12/19 12:07:22
>>537
inline指定無しでも最適化でインライン展開してくれるんじゃないの?
明示的にinline指定したい積極的な理由でもあるなら兎も角、そうでないならコンパイラに任せたら?
つーか、iccだとinline指定をつけると却ってコンパイラが混乱するみたいだ。
542:デフォルトの名無しさん
07/12/19 12:11:03
>>540
番号間違ってる。
しかし、そのリンク先のエピたんの弁によれば、
inline指定してある関数を別の翻訳単位から見つけてくるiccはおかしなことになるね。
543:デフォルトの名無しさん
07/12/19 12:22:09
7.1.2.4を見てextern inlineにしたら通った
544:デフォルトの名無しさん
07/12/19 13:00:43
// aaa.h
extern inline double MySquare(double);
// aaa.cpp
double MySquare(double d){...}
// main.cpp
#include "aaa.h"
int main() {
double d = MySquare(3.14);
}
一応gcc3.4とvc8でいけた
external linkageなinline指定つきの関数宣言がどうたらこうたら書いてあるけど理屈はよくわかんね
545:デフォルトの名無しさん
07/12/19 13:28:11
>>540
>>541
>>542
>>543
ストラップ本にはinline定義とあるので、おそらく
無理なんでしょうね。
extern inline定義にしたらVC 2005では実行できましたが、
g++ v4では無理でした。移植性考えたらやはり素直にヘッダーに
定義を書いたほうが無難ですね。
546:デフォルトの名無しさん
07/12/19 13:30:36
>>544
extern inlineを宣言につけるんですか。
試して見ます。
547:デフォルトの名無しさん
07/12/19 13:37:55
>>544
g++ v4でもリンクできましたが、
定義にinlineつけないとインライン展開されて
ないかもしれないですね。
548:デフォルトの名無しさん
07/12/19 13:55:07
VC++ 2008でもテンプレートのexport定義はサポート
されてないんだな
549:デフォルトの名無しさん
07/12/19 13:58:09
>>548
別に規格に違反してないからね
550:デフォルトの名無しさん
07/12/19 14:35:53
kernel: pid xxxx (a.out), uid yyyy: exited on signal 11 (core dumped)
というメッセージがログに残っている場合は何を調べればいいのでしょうか?
551:デフォルトの名無しさん
07/12/19 14:38:34
VCEEにMFCついてないかー/(^o^)\
552:デフォルトの名無しさん
07/12/19 14:52:40
>>50
coreファイルを調べるのが王道
553:デフォルトの名無しさん
07/12/19 14:58:45
>>550
signal 11はSEGVだから、要はセグメンテーションフォルトを起こしたってこった。
まぁ、メモリアクセス周りでバグってるんだろ。
554:デフォルトの名無しさん
07/12/19 15:02:26
>>551
TurboC++ExpressだったらMFC付いてたかもしれん。
555:デフォルトの名無しさん
07/12/19 15:32:15
>>554
把握した、WinAPI直接とか死にそうだからVB.NETかC#いじってくる
556:デフォルトの名無しさん
07/12/19 15:36:26
どっちもとか正規表現あるから戻ってこれなくなりそう
557:デフォルトの名無しさん
07/12/19 16:20:06
bitsetよりvector<bool>のほうが性能が上のことが判明した
#include <iostream>
#include <vector>
#include <bitset>
#include <time.h>
using namespace std;
main(){
#define N 8200000
int n,m,cl;
cl=clock();
bitset<N> a;
for(m=0;m<10;m++)for(n=0;n<N;n++)a[n]=1;
cl=clock()-cl;cout<<cl<<endl;
cl=clock();
vector<bool> b(N);
for(m=0;m<10;m++)for(n=0;n<N;n++)b[n]=1;
cl=clock()-cl;cout<<cl<<endl;
}
558:デフォルトの名無しさん
07/12/19 16:30:20
自前の関数のほうが断トツで早かった
#include <iostream>
#include <vector>
#include "crc.h"
#include <bitset>
#include <time.h>
using namespace std;
main(){
#define N 8200000
int n,m,cl;
char *rnd =new char[N];
for(n=0;n<N;n++)rnd[n]=rand()&1;
cl=clock();
bitset<N> a;
for(m=0;m<10;m++)for(n=0;n<N;n++)a[n]=rnd[n];
cl=clock()-cl;cout<<cl<<endl;
cl=clock();
vector<bool> b(N);
for(m=0;m<10;m++)for(n=0;n<N;n++)b[n]=rnd[n];
cl=clock()-cl;cout<<cl<<endl;
cl=clock();
unsigned int k,l, *c=new unsigned int [1+(N>>5)];
for(n=0;n<(N>>5);n++)c[0]=0;
for(m=0;m<10;m++)for(n=0;n<N;n++){
k=n>>5; l=n&31; c[k] |= (rnd[n]<<l);}
cl=clock()-cl;cout<<cl<<endl;
}
559:デフォルトの名無しさん
07/12/19 16:30:52
>>557
うちの環境ではbitsetの方が5倍速いんだが
bitset -> 143
vector -> 890
VC2005, C2D E6850
560:デフォルトの名無しさん
07/12/19 16:37:09
>>559
MinGWやVCCで計ってみたけど、環境によって変わるらしいね でも自前のビット演算が最速だった
558のcrc.hはいりません
561:デフォルトの名無しさん
07/12/19 16:41:06
>>560
gcc 3.4.4(cygming special)でもbitsetのほうが早かった
bitset -> 171
vector -> 687
自作は知らん
562:デフォルトの名無しさん
07/12/19 16:42:41
>>558のほうでやってくれ 最適化されてループしていない可能性がある 初めのやつでは
563:デフォルトの名無しさん
07/12/19 16:45:57
VC2005
bitset -> 460
vector -> 1876
自前 -> 137
やはりbitsetaのが早い
564:デフォルトの名無しさん
07/12/19 16:49:50
でも、どの環境でも自前でビット演算するのが一番みたいだね
565:デフォルトの名無しさん
07/12/19 16:58:54
まあ問題領域によるだろう
早さだけを求めるならbitsetに限らず自分で書いた方がことが多いだろうね
566:デフォルトの名無しさん
07/12/19 16:59:00
>>557
./a.gcc.O3
220000
400000
./a.gcc.O3.msse2
150000
390000
./a.gcc.O3.msse2.funroll-loops
150000
420000
./a.icc.xT.O3.ipo
140000
260000
./a.icc.fast
140000
250000
567:566
07/12/19 17:03:18
おっと、書き忘れた。Xeon5160@3.00GHzね。
で、>558のほう。
--
./a.gcc.O3
440000
1010000
120000
./a.gcc.O3.msse2
410000
1010000
120000
./a.gcc.O3.msse2.funroll-loops
400000
1010000
130000
./a.icc.fast
420000
570000
130000
./a.icc.xT.O3.ipo
420000
570000
130000
568:デフォルトの名無しさん
07/12/19 20:17:10
ポインタのアドレス計算について質問です。
#include <stdio.h>
int main(int argc, char *argv[]){
int *ptr;
int ary[] = {1, 2, 3, 4, 5, 0};
ptr = ary;
while(*ptr != 0){
printf("%d address = %u\n", *ptr, ptr);
++ptr;
}
return 0;
}
上記のプログラムを実行すると、アドレスは4番地ずつ進みます。
使っている参考書ではint型データは2番地ずつ進んでいますが、これは環境によって確保される記憶領域が違うということで宜しいでしょうか?
またfloat型の場合、使っている参考書ではint型の2倍、4バイト長ですが当方の環境だとint型と同じ4バイト長でした。
これも環境によって違うのでしょうか?
569:デフォルトの名無しさん
07/12/19 20:21:58
ふつうはintは32bit 64bitパソコンは64鴨しれない
570:デフォルトの名無しさん
07/12/19 20:23:26
その昔の参考書を投げ捨てろ。
16ビット環境主流の時代に書かれた本じゃないかい?
intのサイズは基本的に環境依存。16bitコンパイラは16bit、32bitコンパイラは32bit。
571:568
07/12/19 20:32:30
>>569-570
有り難うございます。
環境によって違うのですね。
今、使っている本は
URLリンク(www.amazon.co.jp)
です。
難関と言われているポインタの説明がとてもわかりやすかったし、中盤まできたのでこのまま使っていきたいです。
さすがに捨てるのは勿体無いと思うので。
572:デフォルトの名無しさん
07/12/19 20:36:13
intはサイズが環境依存だから、longを使え、
・・・って、その昔、仕様をカン違いしてるヤツが偉そうに
コーディングルールを決めることがよくあった。
573:デフォルトの名無しさん
07/12/19 20:37:32
参考までにDOSコンパイラ(Turbo C++ 1.01)でのsizeof(int)とsizeof(long)実行結果
URLリンク(up.mugitya.com)
32bitコンパイラだと両方とも4になる。
574:デフォルトの名無しさん
07/12/19 20:42:47
>>568
URLリンク(www.oklab.org)
575:デフォルトの名無しさん
07/12/19 22:09:32
IntelのCPU(x86)で、doubleとlong doubleはどうちがいますか?
576:デフォルトの名無しさん
07/12/19 22:47:06
doubleは64ビット(IEEE 754倍精度)、
long doubleは80ビット(IEEE 754拡張倍精度)のことが多い。
Visual C++ 32ビット(どっちも64ビット)のように例外もある。
577:デフォルトの名無しさん
07/12/19 22:51:46
失礼します。
どこで質問していいか判らず、何でも知ってそうなここに来ました。
ブーンスタジオをインストールしようとすると
DllRegisterServerへの呼び出しはエラーコード0x80070005により失敗しました。
と出るんですがどういう意味ですか?
当方PC歴1ヶ月で、全く解りません。
エラーコードググっても???です。
どうか、教えてください。
578:デフォルトの名無しさん
07/12/19 22:58:12
>>576
ありがとうございます。拡張倍精度というのがあるんですね。
579:デフォルトの名無しさん
07/12/19 23:07:38
以下のファイルを構造体の配列に取り込みたいです。
-------------
a_yumi, 9, f
m_mana, 4, f
h_ryohko, 10, f
m_konomi, 12, f
m_kana, 4, f
。。。
-------------
struct data{
char name[10];
char age[10];
char sex[10];
} g_data[NUM];
int main( void ){
。。。
}
ファイルは開いてみないと大きさが分からないものとします。
"NUM"を可変に(ファイルのデータ数ピッタリに)取り込むことはできないでしょうか?
できればC++は使わずに、Cのみでやりたいです。お願いします。
580:デフォルトの名無しさん
07/12/19 23:10:37
>>577
PC初心者板かソフトウェア板へいけ
581:デフォルトの名無しさん
07/12/19 23:14:12
>>580
すみませんでした。
行ってきます
582:デフォルトの名無しさん
07/12/19 23:14:33
>>577 半年ROMれバカ野郎
583:デフォルトの名無しさん
07/12/19 23:14:41
>>577
この辺で聞いてみるとか?
↓
【ニコニコ】BOON SUTAZIO Part4【ブラウザ】
スレリンク(software板)
584:デフォルトの名無しさん
07/12/19 23:15:13
>>579
realloc()を使うとか、
リンクリストにするとか
で可能。
585:デフォルトの名無しさん
07/12/19 23:16:45
>584
どもありがとうございます。
ググってきます。
586:デフォルトの名無しさん
07/12/20 00:05:26
言語 C++
質問内容
1.struct SHoge { char a; short b; int c; };と定義する。
2.SHoge obj; と実体を作成する。
上記の場合、objのアライメント(?)はいつも同じでしょうか?
質問の背景
1.struct SHogeBase { char a; short b; int c; };と定義する。
2.struct SHoge :public SHogeBase { void Save(FILE *f){fwrite(this, sizeof(SHogeBase),1,f); void Load(FILE* f){略}; }
見たいに、メンバ変数のセーブ、ロードを行っており、タマタマ動作しているのですが、これがタマタマなのか、
それともあらゆるC++環境で正常動作が保障されているのか、が知りたい。
足りない情報等あれば指摘お願いします。
587:デフォルトの名無しさん
07/12/20 00:08:39
>>586
OSが変わったりCPUが変わったらレイアウトも変わる罠。
588:デフォルトの名無しさん
07/12/20 00:10:37
詰め物が幾ら入るかは処理系定義のお話なのです。
589:586
07/12/20 00:14:48
>>587
OS・CPU(コンパチ品除く)が変わる場合、再コンパイルリンクコンパイルが入り、実行ファイルが新たに作成されますよね。
その実行ファイルは同じOS・CPUでは確実に正常動作するのでしょうか?
正常動作するならば、>>586 見たいなソースはありなんですかね?
590:デフォルトの名無しさん
07/12/20 00:14:50
>>586
同じコンパイラの同じバージョンを使って同じオプションを指定してる限りは、いつも同じでいいかと思うけど
コンパイラが変わったりコンパイルオプションを変えたりすると変わることがある
591:デフォルトの名無しさん
07/12/20 00:17:20
>>589
OSやCPUまでも変わる可能性があるなら、かなり厳しい
intのサイズも変わるしエンディアンも変わるし
592:デフォルトの名無しさん
07/12/20 00:38:27
んやー・・・同じ実行バイナリで実行出来る環境なら概ね正しく動くだろ。
593:デフォルトの名無しさん
07/12/20 01:24:56
>>586
メンバーアクセスしてればアラインメントの影響は
考えなくていいだろ。基本的にメモリレイアウトに
依存するようなコードは回避すべきじゃないのかね。
594:デフォルトの名無しさん
07/12/20 01:28:16
unionとかは回避すべきなのか
595:デフォルトの名無しさん
07/12/20 01:30:24
それはまた話が別でしょう。
596:デフォルトの名無しさん
07/12/20 02:13:15
int型の変数aに50のいう数字が入っています。
これをchar型の配列b[]に5, 0と格納するのはどうすればいいですか?
597:デフォルトの名無しさん
07/12/20 02:17:19
b[1] = a/10;
b[0] = a%10;
598:デフォルトの名無しさん
07/12/20 02:18:41
b[0] = '0'+a/10;
b[1] = '0'+a%10;
599:デフォルトの名無しさん
07/12/20 02:27:43
sprintf(b,"%d",a);
600:デフォルトの名無しさん
07/12/20 02:37:30
>>599
KY
601:デフォルトの名無しさん
07/12/20 02:38:51
すまん、そういう場面だったのか……
602:デフォルトの名無しさん
07/12/20 02:39:15
黙れカス
603:596
07/12/20 03:18:09
ありがとうございました。
604:デフォルトの名無しさん
07/12/20 14:28:02
すみません、printf関数のフォーマットに関する質問があります。
今、
printf("%20s%20s%20s", "hoge", "huga", "piyo");
という風に出力幅を20に指定したいんですが、
一箇所一箇所に20と書くのが不恰好のような気がしています。
もう少しスマートな書き方はありませんか?
605:デフォルトの名無しさん
07/12/20 14:36:35
>>604
20を変数にして、動的に与えてやることはできる。
606:デフォルトの名無しさん
07/12/20 14:42:09
>>604
静的にやるとしてもこんなもん↓
#define COLUMN_WIDTH "20"
printf("%" COLUMN_WIDTH "s%" COLUMN_WIDTH "s%" COLUMN_WIDTH "s",
"hoge", "huga", "piyo");
607:デフォルトの名無しさん
07/12/20 14:45:25
#define prints(s) printf("%20s",s)
prints("hoge");
prints("huga");
608:デフォルトの名無しさん
07/12/20 14:47:21
むしろこうだな
int i;
char *str[] = {"hoge", "huga", "piyo"};
for(i=0; i<sizeof(str); ++i)
printf("%20s", str[i]);
609:デフォルトの名無しさん
07/12/20 16:04:02
int width = 20;
printf("%*s%*s%*s", width,"hoge", width, "huga", width,"piyo");
610:デフォルトの名無しさん
07/12/20 16:10:51
C++でtrim関数の使い方わかる人います?
#include <boost/algorithm/string.hpp>
をincludeすると、エラーがでて
c:\program files\microsoft visual studio\vc98\include\boost\algorithm\string\yes_no_type.hpp(22) : error C2265: '<Unknown>' : reference to a zero-sized array is illegal
c:\program files\microsoft visual studio\vc98\include\boost\algorithm\string\yes_no_type.hpp(23) : see reference to class template instantiation 'boost::algorithm::size_descriptor<I>' being compiled
c:\program files\microsoft visual studio\vc98\include\boost\range\detail\common.hpp(114) : fatal error C1506: unrecoverable block scoping error
っておっしゃるのですが?別にboost使わない方法があればいいのですが・・・。
611:デフォルトの名無しさん
07/12/20 16:21:27
とりあえずVC6をなんとかしろと
612:610
07/12/20 16:37:22
>>611
どういう事でしょうか?
613:デフォルトの名無しさん
07/12/20 16:39:32
>>612
VC6は古すぎて実用に耐えないので、捨てろ
ということ。
614:デフォルトの名無しさん
07/12/20 16:49:22
VC6は2004はアップデートで出ている
VC2003toolkitより新しい
615:デフォルトの名無しさん
07/12/20 17:04:48
for ( std::vector<unsigned char>::iterator it = array.begin(); it != array.end(); it++ )
{
*it = (*it >= threshold ) ? 1 : 0;
}
この処理をstd::for_each()を使って書くにはどうすればいいでしょうか?
616:デフォルトの名無しさん
07/12/20 17:08:49
できれば別関数に書かず、for_each()に収めたいです。
617:デフォルトの名無しさん
07/12/20 17:14:04
void f(unsigned char& r)
{
r = (r >= threshold) ? : 1 : 0;
}
foreach(array.begin(), array.end(), f);
ダメかもしれんが。
618:デフォルトの名無しさん
07/12/20 17:15:06
foreach ×
for_each ○
619:デフォルトの名無しさん
07/12/20 17:16:26
自分の力だけで解け。
英語を自分の力だけで解けと言われれば、辞書等の使用は厳禁であるが
プログラミングでは全く正反対である、むしろ人に聞くのさえ認められる
620:デフォルトの名無しさん
07/12/20 17:16:57
ぎゃあああああ、スレってか板違い失礼orz
621:デフォルトの名無しさん
07/12/20 17:31:49
aが0ではない または bが0ではない または c==d
という文は
if ( (a|b) or (c==d) )
if( a|b| (c xor d) )
と書けると思いますがどっちのほうがはやいでしょうか?
622:デフォルトの名無しさん
07/12/20 17:38:50
>>621
なんで xor になるのか理解不能だが、コンパイラが適切に最適化してく
れるので、細かい表記の差は気にしないで理解し易く書くべし。
if (a || b || c == d)
623:デフォルトの名無しさん
07/12/20 17:41:34
計算してみたところa==b と、!(a^b)の計算速度は同じみたいです
624:デフォルトの名無しさん
07/12/20 17:44:33
>>622
c=dならば、c xor dは0になります
正しくはその否定でした
625:デフォルトの名無しさん
07/12/20 17:57:44
フラグのgirlfriendがずっと0のままで1になりません。
また、sexというポインタを参照するとセグメンテーションフェイルドになります。
どうすればいいですか?
626:デフォルトの名無しさん
07/12/20 17:58:50
>>625
マ板へ逝け
627:デフォルトの名無しさん
07/12/20 18:05:18
FILE **fp;
fp[i] = fopen(filename,"w");
みたいな使い方はでき・・・ませんよね
628:デフォルトの名無しさん
07/12/20 18:11:16
FILE* fp[NUM]
629:デフォルトの名無しさん
07/12/20 18:11:32
URLリンク(www.stage6.com)トロステ第343回
630:615
07/12/20 18:14:16
すみません。for_each()でなくてもいいです。
>>615のfor文の処理を、標準C++のファンクタやboostを使って書くにはどうすればいいですか?
難しければ>>617さんのように書こうと思います。
631:615
07/12/20 18:33:26
自己解決しました。以下で期待した動作が得られました。
std::transform(array.begin(), array.end(), array.begin(), std::bind2nd(std::greater_equal<unsigned char>(), threshold));
スレ汚し失礼しました。>>617さんありがとうございました。
632:デフォルトの名無しさん
07/12/20 18:49:12
>>627
領域確保すればできる
633:デフォルトの名無しさん
07/12/20 19:02:50
fopenはやめたほうがいい
winAPIなら1500個同時に開ける fopenはエラー起こす
634:デフォルトの名無しさん
07/12/20 23:01:05
>>631
using namespace boost::lambda;
std::for_each(array.begin(),array.end(),if_then_else(_1>threshold,_1=xxx,_1=yyy));
でもいいのかしらん。xxx, yyy は何か入れ替えるとして。
635:デフォルトの名無しさん
07/12/21 00:09:36
class B
{
protected:
class BI {};
};
class D : public B
{
class DI : public BI {}; // (1)
};
VC++6では、(1)のところでBIが定義されていないと言われます。
class DI : public B::BI {};
とすればBIは見つかりますが、今度はprotectedにはアクセスできないと言われます。
BIをpublicにすると、コンパイルできます。
これって合法だと思うのですが、標準規格ではどうなのでしょうか。VCがおバカなだけ?
636:デフォルトの名無しさん
07/12/21 00:09:40
>>633
Windows環境だと判断した理由は?
637:デフォルトの名無しさん
07/12/21 00:28:06
`void' expected `pointer to unsigned char'
すいません、このような質問で申し訳ないのですがお答えください。
上のようなエラーが出たのですが、
これはどのように解釈すればいいのでしょうか?
voidが符号なしchar型へのポインターを予期した???
ちょっと意味がわからないです・・・・
638:デフォルトの名無しさん
07/12/21 00:28:15
>>635
俺もいいと思うけどどうなんだろう。少なくとも g++ は warning 無しで通るね。
639:デフォルトの名無しさん
07/12/21 00:31:22
VC++6の時点で
あらゆることが起こりうるのでバカバカしい
640:デフォルトの名無しさん
07/12/21 00:35:26
VC++2005が最強
641:デフォルトの名無しさん
07/12/21 00:36:15
>>637
unsigned char* を期待したのに void が渡された
関数コールで引数指定し忘れたとかそういうオチ?
642:デフォルトの名無しさん
07/12/21 00:46:13
>>641
UART_1_PutString(itoa(line,iData,10));
ここでエラーが出ています。引数指定し忘れというのは??
すいません、勉強不足で・・・・
643:デフォルトの名無しさん
07/12/21 00:57:45
>>635
VC++ 2008 でも問題ない。
644:635
07/12/21 00:59:50
>>638-639
自分もバカバカしいと思いながらも、完全には自信がなくて・・・。
でもg++でOKなら、それが正しそうですね。
どうやらVC++6は、内部クラスは外側のクラスにとっての
暗黙のfriendにはならないようです。
ありがとうございました。
645:デフォルトの名無しさん
07/12/21 08:12:04
>>642
>UART_1_PutString(itoa(line,iData,10));
UART_1_PutString()の宣言はどうなってる?
>引数指定し忘れというのは??
関数の引数が足りないんじゃないか、と言うこと。
646:デフォルトの名無しさん
07/12/21 11:17:26
>>645
UART_1_PutString()の宣言は・・・・されていません。
関数の引数が足りないっていうのはitoa関数のって事ですか??
647:デフォルトの名無しさん
07/12/21 11:27:04
>>645
連投すいません。
UART_1_PutString()の宣言はvoidです。
648:デフォルトの名無しさん
07/12/21 11:29:28
>>647
ちゃんと書こうよ。その書き方じゃ
void UART_1_PutString(?)
? UART_1_PutString(void)
void UART_1_PutString(void)
のどれかわからない。
649:デフォルトの名無しさん
07/12/21 11:32:44
すいません・・・
void UART_1_PutString()です。
650:デフォルトの名無しさん
07/12/21 11:40:49
>>649
#include <PSoCAPI.h> しないで自分で宣言を書いたりしてないよね?
651:デフォルトの名無しさん
07/12/21 11:47:39
>>650
#include <PSoCAPI.h>はしています。
UART_1_PutString(itoa(line,iData,10)); で
`UART_1_PutString'; found `void' expected `pointer to unsigned char'
というエラーが出てくるという事は、itoa関数に問題があるのでしょうか?
652:デフォルトの名無しさん
07/12/21 12:56:12
itoaの戻り値は文字列なの?
653:デフォルトの名無しさん
07/12/21 12:58:56
>>651
UART_1_PutString() と itoa() の宣言をコピーして見せるべし。
654:デフォルトの名無しさん
07/12/21 13:07:31
>>651
UART_1_PutStringが引数を取らない関数なのに
unsigned char * 型の引数(itoa(line,iData,10))を渡すからエラーなんだろ。
UART_1_PutStringの使い方が間違ってるから確認しろ。
655:651
07/12/21 14:06:00
>>652-654
void main()
{
int iData;
char line[10];
M8C_EnableGInt;
ADCINCVR_2_Start(ADCINCVR_2_HIGHPOWER);
ADCINCVR_2_SetResolution(8);
ADCINCVR_2_GetSamples(0);
UART_1_CmdReset();
UART_1_Start(UART_1_PARITY_NONE);
for(;;)
{
while(ADCINCVR_2_fIsDataAvailable() == 0);
iData = ADCINCVR_2_iGetData();
ADCINCVR_2_ClearFlag();
char line[10];
UART_1_CmdReset();
UART_1_PutString(itoa(line,iData,10));
UART_1_PutChar('\n');
}
}
このようなプログラムです。。。
656:デフォルトの名無しさん
07/12/21 14:35:59
>>655
>653
657:651
07/12/21 14:43:06
あとはvoid main()の上に
#include <m8c.h>
#include "PSoCAPI.h"
#include <stdlib.h>
が記述してあるだけで、全てなのですが・・・
658:デフォルトの名無しさん
07/12/21 14:50:52
もしかして、C用のインクルードファイルをC++から直にインクルードしているって落ち?
659:651
07/12/21 15:01:44
ちょっとわかんないです・・・・
660:デフォルトの名無しさん
07/12/21 15:14:42
えい面倒だ。コマンドライン若しくはコンパイラの出力を全部晒せ。
661:デフォルトの名無しさん
07/12/21 15:35:56
>>657
stdlib.h や PSoCAPI.h の中に atoi() や UART_1_PutString() の宣言
があるはずだから、それをここに示して欲しい。
それらがないと、ここで見ている人は正しい仕様がわからないのでアド
バイスしにくい。コンパイラの種類なども示してくれるとベター。
662:651
07/12/21 15:38:00
>>660
改行多すぎエラーが出るため分割します。
#include <m8c.h>
#include "PSoCAPI.h"
#include <stdlib.h>
void main()
{
int iData;
char line[10];
M8C_EnableGInt;
ADCINCVR_2_Start(ADCINCVR_2_HIGHPOWER);
ADCINCVR_2_SetResolution(8);
ADCINCVR_2_GetSamples(0);
UART_1_CmdReset();
UART_1_Start(UART_1_PARITY_NONE);
663:651
07/12/21 15:41:05
>>660
for(;;)
{
while(ADCINCVR_2_fIsDataAvailable() == 0);
iData = ADCINCVR_2_iGetData();
ADCINCVR_2_ClearFlag();
UART_1_CmdReset();
UART_1_PutString(itoa(line,iData,10));
UART_1_PutChar('\n');
}
}
664:651
07/12/21 15:41:28
出力
Starting MAKE...
creating project.mk
lib/adcincvr_2.asm
lib/adcincvr_2int.asm
lib/dac8_2.asm
lib/psocconfig.asm
lib/psocconfigtbl.asm
lib/uart_1.asm
lib/uart_1int.asm
lib/uart_1plus.asm
./boot.asm
./main.c
!E ./main.c(32): type error in argument 1 to `UART_1_PutString'; found `void' expected `pointer to unsigned char'
!E ./main.c(32): can't recover from syntax error.
adconv1_vup_usart - 2 error(s) 0 warning(s) 15:39:51
665:651
07/12/21 15:45:27
>>661
stdlib.hの中身①。。これも分割します。
#ifndef __STDLIB_H
#define __STDLIB_H
#include <_const.h>
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
#ifndef NULL
#define NULL 0
#endif
#include <limits.h>
#define RAND_MAX INT_MAX
#ifndef __SIZE_T
#define __SIZE_T
typedef unsigned int size_t;
#endif
#if defined(_HC12)
#pragma nonpaged_function atof exit
#endif
666:デフォルトの名無しさん
07/12/21 15:46:00
情報が欠けているので確信はないけど、
たぶん itoa() が値を返さない仕様で、UART_1_PutString(char*)
に渡せない。
itoa(line, iData, 10);
UART_1_PutString(line);
にすればokかもしれない。
667:651
07/12/21 15:46:06
>>661
stdlib.hの中身②。。
char *ftoa(float f, int *status);
int abs(int);
double atof(CONST char *);
int atoi(CONST char *);
long atol(CONST char *);
void itoa(char *string, unsigned int value, int base);
void ltoa(char *string, unsigned long value, int base);
int rand(void);
void srand(unsigned);
long strtol(CONST char *, char **, int);
unsigned long strtoul(CONST char *, char **, int);
#if !defined(_M8C)
void abort(void);
void *calloc(size_t, size_t);
void exit(int);
void free(void *);
void *malloc(size_t);
void _NewHeap(void *start, void *end);
void *realloc(void *, size_t);
#endif
#endif
668:デフォルトの名無しさん
07/12/21 16:01:38
VC++2008を使っているのですが、ソースファイル変更を施していない上に、ソースファイルが存在しているのに、逆アセンブリ表示でしかデバッグができません。
これは何か知らないうちに変な設定をしてしまったからなんでしょうか?
どなたかご存知の方いらっしゃいましたらご教授ください。
669:デフォルトの名無しさん
07/12/21 16:02:08
はい、ダミアンが正解だったようです。
670:668
07/12/21 16:03:13
ちなみにビルドの際にも、ソースファイルはプロジェクト中に存在しています。
671:デフォルトの名無しさん
07/12/21 16:03:24
>>668
VisualStudio専用スレがあるからそちらでどうぞ。
672:668
07/12/21 16:05:07
はい。
673:デフォルトの名無しさん
07/12/21 17:39:14
>>666
ありがとうございました。解決できました。
674:デフォルトの名無しさん
07/12/21 18:30:39
WinXP,VC++2005について質問です.
DOSコマンドのassoとftypeのように,特定の拡張子に関連付けされた
アプリケーションをできればフルパスで取得したいのですが,
VC++で可能でしょうか?
675:デフォルトの名無しさん
07/12/21 21:04:40
関連付けならレジストリのHKEY_CLASSES_ROOT以下を見ればいい。
676:デフォルトの名無しさん
07/12/21 22:22:15
HDD片方だけぶっ壊れたせいで復旧作業泣ける、嫌になってレジストリ削除とエントリ削除結構適当だから不安
あー、もうしにたい
677:デフォルトの名無しさん
07/12/21 22:37:01
ごばくだうわあああorz
678:デフォルトの名無しさん
07/12/22 01:32:45
初めて見たんだけど、’あっそ’ってどんなコマンドなん?
679:デフォルトの名無しさん
07/12/22 07:10:49
>>678
assocの間違いだと思う。
680:デフォルトの名無しさん
07/12/22 10:03:06
>>485です
回答くださったみなさん、ありがとうございます。
三項演算子は勉強になりました。
>>502の参照からポインタとって操作するのがわかりやすかったので、
この方法でいこうと思います。
has()が返すアドレスの実態はgetで得られるインスタンスと一緒です。
681:674
07/12/22 10:24:21
>>678,679
すみません.assocの間違えです.
c++でできるコマンドがありましたらお願いします.
682:デフォルトの名無しさん
07/12/22 10:34:14
>>674 >>681
それは OS 無しで知りえない情報だから system (みたいなもの)
使うしかないんじゃないの?
683:デフォルトの名無しさん
07/12/22 14:02:30
クラス配列の要素数の求め方を教えてください。
class_array = new Class[10]();
sizeof( class_array ) / sizeof( class_array[0]);
てやっても0になってしまいます。
sizeof( class_array ) ってすると4になるんですが、
この4が何かが分かりません。
例えば普通の10個の要素を持つ配列をsizeofすると、配列のサイズが返りますよね。
クラス配列にsizeofすると、また別の意味の値を返すのでしょうか。
684:デフォルトの名無しさん
07/12/22 14:04:52
>>683
sizeof(class_array)/sizeof(class)じゃ無理?
685:デフォルトの名無しさん
07/12/22 14:13:35
>>684
レスありがとうございます。
できないです…。結果は0になりました。
sizeof( class_array ) が 4
sizeof( CLASS ) が 16
になっていました。
普通の配列にsizeofすると配列のサイズが返ってくるのに、
クラス配列にsizeofした時、配列は16*10=160のサイズを持っている
はずなのに、4しか返ってこないということは、、、
どういう事なんですか??
686:デフォルトの名無しさん
07/12/22 14:13:56
>>683
class_array はただのポインタだろ。そうじゃなきゃ new [] の結果は受け取れないはず。
687:デフォルトの名無しさん
07/12/22 14:16:27
ああ、new
688:デフォルトの名無しさん
07/12/22 14:20:27
>>686
なるほど、sizeof( class_array ) では、ただのポインタのサイズを返しているわけですね。
sizeof(またはそれ以外)を使用してクラス配列全体のサイズを調べるにはどのようにすればよいでしょうか。
689:デフォルトの名無しさん
07/12/22 14:23:34
>>688
sizeof にこだわらなければ 10 に決まってんだろ。
即値を繰り返すのが嫌なら定数なり変数なりに入れとけ。
配列と別の変数でサイズを持ってるのが嫌なら std::vector にしとけ。
690:デフォルトの名無しさん
07/12/22 14:23:59
new[]したもので、要素数を後から知る方法はない。
std::vectorでも使っておけ。
691:デフォルトの名無しさん
07/12/22 14:29:13
恐らくだけど、newに拘る必要はないんじゃないか?
newを知らずに使っているように見受けられる
692:デフォルトの名無しさん
07/12/22 14:30:42
vectorを調べてきました。
こんな便利なものがあったなんて、、
std::vectorを使います!
答えてくださった方々ありがとうございました!
693:デフォルトの名無しさん
07/12/22 14:34:17
>>691
クラス配列の要素を動的に増やしたり、減らしたりしたかったのです。
mallocはコンストラクタが動かないと聞いたんで、newを使っていました。
その結果sizeofで要素数を求めようと頑張っていたのですが、
vectorでなんとかなりそうな気がします。
ありがとうございました。
694:デフォルトの名無しさん
07/12/22 14:37:49
CやC++でGUIなユーティリティを作る場合何を使うのがベターなんでしょうか?
先日本職さんの知り合いに聞いたところMFCだと言っていました
それと同時にCやC++で作るならゲームかなぁみたいなことも言っていました
やはりCやC++でGUIというのはあんまりベターじゃないんでしょうか?
API直接だとかデザイナついたやつだとか、もしくははなからCは使わないだとか
695:デフォルトの名無しさん
07/12/22 14:41:20
趣味でやるのか、仕事でやるのか
自分だけで使うのか、人に売るのか
これからも続けていきたいのか、今回作ったら終わりなのか
もろもろの事情による
696:デフォルトの名無しさん
07/12/22 14:43:00
>>695
一応趣味で、これからも使っていく予定です
人に売る気はないですが、良さそうなものが出来たら公開してみたりしたいなぁくらいには考えています
697:デフォルトの名無しさん
07/12/22 14:45:58
C++Builderかね。
698:デフォルトの名無しさん
07/12/22 14:46:29
MFC WTL ATL ボーランドC++
699:デフォルトの名無しさん
07/12/22 14:50:00
趣味ならCやC++だけと言わずC#にも手を伸ばしてみるのはどうだろうか
700:デフォルトの名無しさん
07/12/22 14:52:30
売るつもりが無いならC#は楽でいいな
701:デフォルトの名無しさん
07/12/22 15:02:48
C#は一応手を出したことがあるんですが、デザイナがあるだけでどうもそれに頼り切ってしまって
そのせいかどうも感覚を掴めない
まだWinAPIで試行錯誤していた時の方が気が楽でしたorz
とりあえず今Turbo++Explorerとやらをダウンロード中です。
最終的にはVC++を買うことになりそうだなぁ
702:デフォルトの名無しさん
07/12/22 15:09:11
プログラミング勉強中なのですが質問させて下さい。
あるファイルから内容を読み取ってデータを抽出して別のファイルに書き出すプログラムを作りたいのですが
#include "fstream"
using namespace std;
void main(int argc, char *argv[]){
ifstream f1;
f1.open(argv[1],ios::in);
中略
f1.close();
ofstream f2;
f2.open("data.txt",ios::out);
中略
f2.close();
}
このようなプログラムを実行するとD&Dしてプログラムを実行した時ofstream f2;以降の書き込み動作が出来ていないようなのです。
何がいけないかいろいろ試してみたのですが、ファイルを読み込む部分をソースから消して書き込む場所だけにしてみても
D&Dして実行すると駄目で、D&Dしないで実行すると普通に書き込めるみたいなのですが
これはどういう理由からなんでしょうか。
703:デフォルトの名無しさん
07/12/22 15:35:07
>>702
>D&Dして実行する
って、何をどうやって実行してるの?
その場合って、argvに対象のファイル名がちゃんと渡ってくるものなの?
704:デフォルトの名無しさん
07/12/22 15:39:35
>>703
上記のプログラムをコンパイルしてできたexeに読み込ませたいtxtをD&Dで実行ということです。
途中にcout << argv[1]を入れてみたところD&Dしたtxtはフルパスで格納されていました。
ですが ofstream f2("data.txt",ios::out);のdata.txtへの書き込みが出来ない状態です。
追記ですがコンパイルはVC++2005です。
705:デフォルトの名無しさん
07/12/22 15:47:27
いや、きっとdata.txtは出力されている。
PCの中を検索すればどこかにあるはずだ。
argv[1]が絶対パスだったら、f2で書き込むファイルも
argv[1]のファイルと同じフォルダになるよう絶対パスで指定するという風にすればいい。
706:デフォルトの名無しさん
07/12/22 16:10:01
printfで\の半角は表示できませんか?
707:デフォルトの名無しさん
07/12/22 16:10:51
>>705
argv[1]で絶対パス渡すと後のファイルオープンのパスに影響与えてしまうってことですかね?
確かに絶対パスを渡したら指定のフォルダにきちんと出力されました。
ありがとうございます。
708:デフォルトの名無しさん
07/12/22 16:19:16
>>706
printf("\\");で出力されるのが、半角円記号だというのなら、
それはそういう風にフォントが出来ているから。
日本では、歴史的経緯で半角バックスラッシュが用いられるべきところに半角円記号が使われる。
今更、円記号とバックスラッシュに分離しようとしてもおそらく極めて困難。
709:デフォルトの名無しさん
07/12/22 16:39:52
>>706
フォントに依存するんじゃないかと
710:デフォルトの名無しさん
07/12/22 17:03:42
turboC++Explorer落としに行ったけどあれでよかったのだろうか
711:デフォルトの名無しさん
07/12/22 18:31:41
>>707
もう解決したようだけど、
D&Dでは作業フォルダに注意ね
712:デフォルトの名無しさん
07/12/22 20:18:03
std::vector<unsigned char> buffer( 100, 0 )
buffer[100][0]という意味ですか?
713:デフォルトの名無しさん
07/12/22 20:19:14
100個確保して0が入っているという意味
buffer[100]=0
714:デフォルトの名無しさん
07/12/22 20:25:09
std::vectorでは二次配列は確保できないのですか?
715:デフォルトの名無しさん
07/12/22 20:25:43
あ、、こうやればいいいのか
std::vector<unsigned char> buffer[a][b];
716:デフォルトの名無しさん
07/12/22 20:28:45
>>715
vectorをa×b個作るの?
vector<vector<unsigned char> >では?
717:デフォルトの名無しさん
07/12/22 20:29:55
>>714
std::vector<std::vector<unsigned char> > vec(100, std::vector<unsigned char>(10));
718:デフォルトの名無しさん
07/12/22 20:31:39
thx!
719:デフォルトの名無しさん
07/12/22 20:36:02
>>713
1行目と2行目が違うのだが・・・
720:デフォルトの名無しさん
07/12/22 21:11:53
Cのdouble型で表せる最大の数と最小の数はなんですか?
721:デフォルトの名無しさん
07/12/22 21:12:57
環境による
64ビットが普通だけど
722:デフォルトの名無しさん
07/12/22 21:14:05
>>721
計算した値がdouble型の精度を超えてたらエラーとするにはどうしたらいいですか?
723:デフォルトの名無しさん
07/12/22 21:16:00
代入前に比較
724:デフォルトの名無しさん
07/12/22 21:16:30
具体的にどうやるんですか?
725:デフォルトの名無しさん
07/12/22 21:16:48
代入前に比較
726:デフォルトの名無しさん
07/12/22 21:20:26
演算できる上限はどうなってるんだろうな、代入時に分割して代入するとか意味はあるんだろうか
727:デフォルトの名無しさん
07/12/22 21:22:16
BCBだとlong doubleは10バイトなのに、なんでVC++だとdoubleと変わらない8バイトなんですか
728:デフォルトの名無しさん
07/12/22 21:24:18
>>727
俺の自作コンパイラでは9バイトだぜ
729:デフォルトの名無しさん
07/12/22 21:26:01
unsigned long long int=unsigned long long int*unsigned long long int
これで溢れる時
unsigned long long int=(unsigned long long int*unsigned long long int)/2
実際の何割とか決めてって話か
730:デフォルトの名無しさん
07/12/22 21:32:25
double型の演算が大きすぎてコンパイラが停止するのを制御できますか?
731:デフォルトの名無しさん
07/12/22 21:44:53
>>727
MSのも16bit用のコンパイラは10バイトだった。最終はVC++1.5だったか。
10 byte realがIntel x87の内部形式で他と互換が無いこと、
Intel自身も将来的に実数のSMIDを予定してたので10 byte realを
データ型として扱うのは非推奨だったことから廃止した。
732:デフォルトの名無しさん
07/12/22 21:47:21
これはどこが駄目ですか? 実行中にエラーになります
for(n=0;n<1000;n++){
try {x=x*x;}
catch (...) {break;}
}
733:デフォルトの名無しさん
07/12/22 21:47:50
int n; double x=3;が入ります
734:デフォルトの名無しさん
07/12/22 21:53:59
>>732
まずエラーメッセージ嫁。意味が分からなければコピペして見せろ。
ソース貼るならコンパイルできるようにしてくれ。
n や x の宣言が無いのでなんともいえない。
735:デフォルトの名無しさん
07/12/22 21:55:52
xが凄まじい勢いで増えるから
736:デフォルトの名無しさん
07/12/22 21:55:54
>>732
double でも確実にオーバーフローするだろ。何がしたいんだ?
737:デフォルトの名無しさん
07/12/22 22:01:26
オーバーフローを起こしたらbreakするにはどうしたらいいんですか
738:デフォルトの名無しさん
07/12/22 22:09:38
>>737
演算前に比較。
739:デフォルトの名無しさん
07/12/22 22:10:34
それはどうやるんですか
740:デフォルトの名無しさん
07/12/22 22:12:48
演算する前に、演算後にオーバフローするかを比較する。
741:デフォルトの名無しさん
07/12/22 22:13:19
それはどうやるんですか
742:デフォルトの名無しさん
07/12/22 22:16:45
オーバーフローしないように式変形する。
743:デフォルトの名無しさん
07/12/22 22:17:22
オーバーフローの例外は察知できませんか
744:デフォルトの名無しさん
07/12/22 22:19:36
例外なんて起こらない。
745:デフォルトの名無しさん
07/12/22 22:37:39
POD型(intとかcharとか)の演算で例外は投げられない。
このようなプリミティブな型の演算が例外を投げるようにすると
実行速度及びCとの互換性に影響がある、と、びよよーん先生はお考えになった。
いや、知らんけど。
746:デフォルトの名無しさん
07/12/22 22:49:51
では最大値をしるにはどうしたらいいんですか?
#define とかは使わない方法ありますか
747:デフォルトの名無しさん
07/12/22 22:50:52
float.h に定義されている
748:デフォルトの名無しさん
07/12/22 22:52:36
#define で定義されている値を使わずに求める方法はありますか
749:デフォルトの名無しさん
07/12/22 22:52:58
C++ なら std::numeric_limits<double> でどうぞ。
750:デフォルトの名無しさん
07/12/22 22:53:54
std::numeric_limit<double>::max()
751:デフォルトの名無しさん
07/12/22 22:54:26
ごめん。numeric_limits が正しい。
752:デフォルトの名無しさん
07/12/22 23:05:55
たとえばunsigned int型なら足す続けると0に戻って最大値が判明するけど
そういうのはできないですか
753:デフォルトの名無しさん
07/12/22 23:07:25
>>752
>足す続けると
日本語を母国語としない方ですか?
それはさておき、double値はそういうわけにはいきません。
754:デフォルトの名無しさん
07/12/22 23:08:00
>>752
符号無し整数型以外は、演算で値が範囲外になると未定義動作。
755:デフォルトの名無しさん
07/12/22 23:08:57
なんでそんな事をやりたいのかが分からんが、
double でそういう事をやる場合は、かなり難しい。
小数のフォーマット(環境依存)に依存するし、
非正規化数というのがまた状況をややこしく・・・。
756:754
07/12/22 23:09:01
ん?符号付き整数は未定義動作だけど、不動小数点数型は実装依存で
可能かもしれないな。
757:754
07/12/22 23:09:48
ごめん。 s/不動/浮動/
758:デフォルトの名無しさん
07/12/22 23:09:49
でも限度を超えたら増え続けないから
n < n+1が成り立たなくなるよね
759:デフォルトの名無しさん
07/12/22 23:11:11
>>756
環境依存でいいのなら方法はそりゃあるけども。
760:デフォルトの名無しさん
07/12/22 23:12:23
>>758 だから何?
761:デフォルトの名無しさん
07/12/22 23:13:16
何に対して「でも」なんだろう?
762:デフォルトの名無しさん
07/12/22 23:22:03
ここは一問一答スレですか?
763:デフォルトの名無しさん
07/12/22 23:35:54
>>727
BCBの場合はDelphiのExtended型との互換性のほうが大きいかも
764:デフォルトの名無しさん
07/12/23 00:55:55
void MsgBox( int a )
{
char s[20];
sprintf(s, "%d", a);
MessageBox(NULL, s , NULL , MB_OK );
};
直接数字を表示したいのだが、一回文字列に変換しないといけないのかな?
765:デフォルトの名無しさん
07/12/23 01:03:39
直接数字を表示できるMessageBoxを作ったらいいじゃないか
766:デフォルトの名無しさん
07/12/23 01:12:22
標準ライブラリとかで見かける名前空間の名前がついてない
「::operator new」 とか「::operator delete」ってなぜ
「std::operator new」とか「std::operator delete」じゃないんですか?
767:デフォルトの名無しさん
07/12/23 01:20:26
クラスのデータメンバに配列があって、この配列にコンストラクタ時に初期値入れたいのですがどうすればいいんですかね・・・?
class DATA
{
private:
int t;
public:
DATA(int x=5)
{
t=x;
}
};
であればコンパイルは通るのですが、
class DATA
{
private:
int t[2];
public:
DATA(int x[]=5)←???
{
for(int i=0;i<2;i++)t[i]=x[i];
}
};
だとできないんです・・・
768:デフォルトの名無しさん
07/12/23 01:29:27
DATA()
{
t[0]=t[1]=5;
}
でいいだろ なぜ()内にいれるのか不明
769:デフォルトの名無しさん
07/12/23 01:35:00
まず、配列のそものは引数にとれない
ポインタで渡す。
参照は。。どうだっけ?
770:デフォルトの名無しさん
07/12/23 01:41:33
>>764
WindowsのMessageBoxのことだと思うけど、文字列に直さないとダメ。
MessageBox(NULL, (boost::lexical_cast<std::string>(a)).c_str(),NULL , MB_OK);
とか
>>766
::newはstd::のnewじゃないから。
実体はどうだか知らんけど。
771:デフォルトの名無しさん
07/12/23 01:55:39
>>767
配列はポインタ渡しがいいと思う。
やりたいことは、コンストラクタのオーバーロードで出来ると思う。
DATA(int* x) {
for (int i = 0; i < 2; i++) {
t[i] = x[i]; // xの要素数が2以上ないと未定義
}
}
DATA( ) {
for (int i = 0; i < 2; i++) {
t[i] = 5;
}
}
要素数をマジックナンバにするのはよくないので、
適当にコンスタント宣言しときましょう。
const int T_ARRAY_MAX = 2; とか、センスないな。
772:デフォルトの名無しさん
07/12/23 02:07:22
>>768
>>769
>>771
お蔭様で問題解決できました!
どうもありがとうございました。。
773:デフォルトの名無しさん
07/12/23 02:17:27
>>766
Koenig自動照合ができないからジャマイカ?
operator new(size_t)では引数の型からstdを見に行くと
いう判断ができない気がする。
774:デフォルトの名無しさん
07/12/23 03:33:13
あるブログで見かけた記事。
C++では共用体の代わりにreinterpret_castを用いるらしい。
1: int main( void )
2: {
3: int x = 0x01234567;
4: char *c = new char[4];
5:
6: c = reinterpret_cast<char*>( &x );
7:
8: return 0;
9: }
だからC++は安全で便利なんだね!!
775:デフォルトの名無しさん
07/12/23 04:20:54
・・・どこからつっこめばいいんだ
776:デフォルトの名無しさん
07/12/23 04:24:47
アナル
777:デフォルトの名無しさん
07/12/23 08:57:29
anonymous 共用体が導入されたりと、
C++ では共用体はより強化されてるんだがな。
#include <iostream>
int main()
{
union {
int x;
char c[sizeof(int)];
};
x = 0x01234567;
for(int i = 0; i < sizeof(int); ++i) {
std::cout << static_cast<int>(c[i]) << std::endl;
}
}
778:デフォルトの名無しさん
07/12/23 09:42:24
>>766
名前探索の都合上。
クラス型をnewするとき、クラス自身、基底クラス、大域名前空間という
自然な順にoperator newを探せるようになっている
779:デフォルトの名無しさん
07/12/23 11:37:22
名前検索の順序だけど、Koenig照合は考えないとして、
Effective C++第三版の166ページのとおりだと以下になるけど
クラス自身と基底クラスが異なる名前空間にある場合は
4.は間違いですよね?
1.ローカルスコープ
2.クラス自身
3.基底クラス
4.基底クラスを含む名前空間(間違いと思う)
5.大域名前空間
VC++ 2008で試したところ、
1.クラス自身
2.基底クラス
3.クラス自身を含む名前空間
4.クラス自身を含む名前空間を含む名前空間
(外側の名前空間へ向かって繰り返し)
5.大域名前空間
でした。
780:デフォルトの名無しさん
07/12/23 11:38:14
ローカルスコープが抜けていました。訂正します。
VC++ 2008で試したところ、
1.ローカルスコープ
2.クラス自身
3.基底クラス
4.クラス自身を含む名前空間
5.クラス自身を含む名前空間を含む名前空間
(外側の名前空間へ向かって繰り返し)
6.大域名前空間
でした。
781:デフォルトの名無しさん
07/12/23 11:45:06
すいません。
非常に悩んだのですが、多分ここが一番知っている方がいらっしゃると思って質問させて頂きます。
cc `Wand-config --cflags --cppflags` wand.c `Wand-config --ldflags --libs`
というコンパイルオプションをmakefileにしたいんですが、
どうやればこれ、makeの文法に直せるんでしょうか?
Wand-configというのはアプリケーションの名前で、/opt/local/binにインストールしてあります。
782:デフォルトの名無しさん
07/12/23 14:03:27
>>781
Wand-config … の出力を CFLAGS に入れときゃいいんじゃないの?
ImageMagick か。
783:デフォルトの名無しさん
07/12/23 14:44:43
質問です。
C++からCの関数を呼び出すためにヘッダをincludeしたのですが
ヘッダにC++の予約語(new)が構造体のメンバ変数として定義されていて
コンパイルが通りません。
ヘッダファイルを変更せずに対応する方法はありますか?
環境はRedHatでGCC(G++)でコンパイルしようとしています。
最悪、個別にextern "C"で再定義すればよいのかなと思いますが
それはやりたくないので。。。
784:デフォルトの名無しさん
07/12/23 14:46:27
>>783
> 最悪、個別にextern "C"で再定義すればよいのかなと思いますが
それは多分通らないと思う。extern "C" はそういうのじゃないから。
多分ヘッダファイルを変更するしかないと思うんだよなぁ
785:デフォルトの名無しさん
07/12/23 14:56:07
>>783
#define new new_hoge
#include "header.h"
#undef new
とか駄目かね
786:デフォルトの名無しさん
07/12/23 14:58:58
>>782
なるほど!
助かりました。
しかしなんでこんなややっこしい方法をImageMagickはとってるんだ。
おまけに全然日本語の情報ないし。
そこそこ歴史あるアプリなのに。
787:デフォルトの名無しさん
07/12/23 15:07:52
>>784
そうなんですか。
こまりましたね
>>785
newだけだったらよいのですが、なんかあるたびにそれをやるのは
ちょっと辛いです
普通に問題になりそうだしなんか回避策ないんですかね
ググってもそれっぽいのは出てこないし
788:デフォルトの名無しさん
07/12/23 15:10:03
C++固有のキーワードで、変数名に使いそうなものってそれほどなさそうだけどなあ
789:デフォルトの名無しさん
07/12/23 15:15:24
>>786
むしろ合理的とも言えると思うけど。つまり、option は変わる可能性
がある(時代、OS, architecture 等によって)わけだから、自身に
compile/load option を聞いてやるというだけ。特に大量に画像処理する
可能性を考えると細かいオプションも重要になってくることもありうるし。
俺は Magick++ 使ってるけど、多機能過ぎる程多機能で大変便利。
あと、使い易い。
790:デフォルトの名無しさん
07/12/23 15:18:04
>>787
素直にヘッダ書き換えるのが一番じゃないのかな。特によく使うなら。
単にコピーして直したバージョン作ればいいだけでしょ。
791:デフォルトの名無しさん
07/12/23 15:23:56
または>>785の内容のヘッダファイルを作成して、
それをincludeすればいい。
792:デフォルトの名無しさん
07/12/23 15:25:05
>>790
いや、触れないヘッダなんですよね
ほかのパッケージだから
なんでC++からCを呼び出したいってのもあるんだけど
なんで知ってる人いたら教えてくださいな
793:デフォルトの名無しさん
07/12/23 15:28:47
>>792
そのヘッダで宣言されている関数を呼ぶ、Cのソースを一つはさめばいいだろ。
794:デフォルトの名無しさん
07/12/23 16:42:52
型と順番があってれば問題ないはずだから
ライブラリ利用側だけヘッダを書き換えて使うとか。
795:デフォルトの名無しさん
07/12/23 20:08:08
CP932なマルチバイト文字列をCP932なワイド文字列に変換する簡単な方法ってないですか?
Windows上でgcc 3.4.5(Mingw)を使ってます。
796:デフォルトの名無しさん
07/12/23 20:48:04
ああ、筋トレ気持ちいい
797:デフォルトの名無しさん
07/12/23 20:48:36
ごめん
798:デフォルトの名無しさん
07/12/23 20:49:35
>>796
スジトレ?どこのスジだよ。裏スジか?
799:デフォルトの名無しさん
07/12/23 21:00:47
柔道部出身がマになっちゃう時代なんだよ・・・
800:デフォルトの名無しさん
07/12/23 22:09:56
うちにも短髪でえらくがたい良いのいるな
801:デフォルトの名無しさん
07/12/23 23:18:13
うちには男子校上がりのいい男がいる
のんけでも平気で食っちゃうらしくておそれられてる
802:デフォルトの名無しさん
07/12/23 23:23:47
なんだ?クリスマスに備えて職場のイイ男自慢大会か?悪くないな
803:デフォルトの名無しさん
07/12/24 01:13:34
>CP932なワイド文字列
って何?
804:デフォルトの名無しさん
07/12/24 01:19:10
>>803
間違えました。正しくは「ワイルドな文字」です。申し訳ありません。
805:デフォルトの名無しさん
07/12/24 02:52:11
liboctaveを使って行列演算しようと思っているのですが、構造体内で行列の宣言をすることはできるのですか?
806:デフォルトの名無しさん
07/12/24 05:44:10
URLリンク(kansai2channeler.hp.infoseek.co.jp)
以上のzipファイル内Cプログラムを組んでいるのですが、どうにもうまくいかず立ち往生してしまいました。
同梱のテキストファイルに大よその概要を入れておいたので、何とか力になってもらえないでしょうか。
807:デフォルトの名無しさん
07/12/24 08:15:06
>>806
*p = next(p);
だと、pが指し示す先の中身を書き換えるからおかしくなってんじゃないか?
next() は構造体へのポインタを返すようにしたほうが良くないか。
808:デフォルトの名無しさん
07/12/24 09:52:36
ワイルドな文字って何だよw
文字コードを変換したいならとりあえず iconv 使えばいい。
809:806
07/12/24 10:11:12
正直なところ言わんとしていることは理解できましたが、
結局どこをどう手直しすればいいのかわかりませんでした。
申し訳ないですがプログラム自体の手直しをしていただけると幸いです(;´д⊂)
810:デフォルトの名無しさん
07/12/24 10:35:19
VC2008EEのなんですけど。
ヘッダの一部分を特定の.CPPからインクルードされたときだけ
有効にするにはどうすればいいんでしょうか?
811:デフォルトの名無しさん
07/12/24 10:38:55
>>810
#if
とか
#ifdef
812:デフォルトの名無しさん
07/12/24 10:42:12
>>808
WindowsのAPIだとワイド文字=UNICODEな扱いで、
それ以外のワイド文字に出来ないので…
iconvも素でワイド文字を扱おうとすると難しいようなカンジです。
結局自前で書いても20行くらいに収まったのでそれでなんとかしました。
813:デフォルトの名無しさん
07/12/24 11:59:01
VC2005でSSE使ってLONGLONGを足したり引いたりするにはどうしますか?
814:デフォルトの名無しさん
07/12/24 14:36:00
__FUNCTION__ マクロって標準なんでしょうか?
それとも Visual C++ でしか使えないのでしょうか?
デバッグ用のコードの中で多用しているのですが,
いいのかなぁ,と思って.
815:デフォルトの名無しさん
07/12/24 14:46:36
BOOST_CURRENT_FUNCTIONの定義見てみるといいよ。
816:デフォルトの名無しさん
07/12/24 17:19:37
クリスマスに彼女が居ないんですがどうすればいいですか?
817:デフォルトの名無しさん
07/12/24 17:26:49
クリスマスに彼女が居ないんですがで2ちゃれ
腐るほど同じような書き込みがあるから
818:デフォルトの名無しさん
07/12/24 18:51:08
さっきからC/C++と3Pしようとしてるんですが、
C++が「Cとはもうそりが合わなくなった」とか言って3Pに応じてくれません。
どうしたらいいですか?
819:デフォルトの名無しさん
07/12/24 18:52:53
吉利支丹の祝いらしいが幕府がおそろしゅうてかなわんわ
820:デフォルトの名無しさん
07/12/24 18:58:27
>>818
extern "C" かな?
821:デフォルトの名無しさん
07/12/24 19:02:32
>>818
そりゃ論理的に無理だな。
822:デフォルトの名無しさん
07/12/24 19:09:10
99年から仲が悪くなったんだろうな
823:デフォルトの名無しさん
07/12/24 19:44:03
>>818
delete from C where standard = 1999;