[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 06/21 15:50 / Filesize : 177 KB / Number-of Response : 685
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.59【環境依存OK】



1 名前:デフォルトの名無しさん [2008/09/06(土) 22:45:12 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.58【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1218023777/

【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。

577 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 09:40:57 ]
自己解決しました。 関数の戻り値を監視するには、定期的に関数を呼び出すしかないようですね。

578 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 12:26:27 ]
>>577
戻りが変わった可能性があることをイベントを使って検出してから見にいくといい。
OSのAPIにはそういうイベント関係の関数が多数ある。

579 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 12:36:18 ]
>>570
PODをクリアするテンプレートクラスを作って、それをクラスに所有させる。するとデフォルトコンストラクタで初期化できるようになる。

template<class T)
class tclear
{
T a;
public:
tclear()
 :a(0)
 {
 }
};

class X
{
tclear<int> a;
};


580 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 15:54:03 ]
ICL10.1(win)でXP32bit用アプリ?をゴニョゴニョしてるんだけど、
SSEのインラインアセンブラとか組み込み関数を使うと、/archとか/Qxとかに関わり無くなぜか勝手に拡張命令を使うみたいなんで困ってます><
インラインアセンブラはともかく組み込み関数は汎用命令で何とかしてくれると思ってたのに・・・

汎用命令以外吐かないようにする方法を教えてください、よろしくお願いします。

581 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 17:28:52 ]
もうSSEの無い環境なんて切り捨ててもいい時期に来てるってことだろ。

582 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:14:32 ]
そうだな C3 だとハングアップするソフトも結構あるしな ><

583 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 20:23:58 ]
いや、SSE2未満なら切捨てでいいと思うけど
オレが使いたいのはSSSE3(_mm_hadd_epi16)までなんでチョットまずいかなと・・
俺自身SSSE3が動かないPCも使ってるし困るんです><


てかQaxがマトモに機能してれば困らない事に気付いたよ!!
ICLがコピーと論理演算位しかベクトル化してくれないのが全部悪いんだ!!!
型が複数あると出来ないとか、無理矢理全部intでやったら複雑すぎとかふざけてるとしか思えない
てことで普通の自動ベクトル化があるコンパイラ教えてください、お願いします。

584 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 21:35:54 ]
空の書き込み可能なテンポラリディレクトリを確保する命令ありますか?
WindowsXPです。


585 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 21:38:29 ]
GetTempFileName()のフォルダ版ないですか?  存在していない空のフォルダを作りたいのですが



586 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 21:51:20 ]
同じ名前のファイルとフォルダは同時に存在できない。

587 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:01:53 ]
GetTempFileNameで取った名前使ってディレクトリ作れば?

588 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:16:51 ]
>>587
それは無理。
GetTempFileNameの作ったファイルを消してディレクトリを作らないといけないから、
その間に他のプロセスに割り込まれる可能性がある。

589 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:15:32 ]
これで出来ました。

GetTempdir(){

wchar_t w[1000], z[1000];
GetTempPathW(1000, w);

if(!GetTempFileNameW(w, L"aa", 0, z) ) {
wcscpy(w,L".\\temp\\"); CreateDirectoryW(w,NULL);
if(!GetTempFileNameW(w, L"aa", 0, z) )
wcscpy(w,L"c:\\temp\\"); CreateDirectoryW(w,NULL);
}

wchar_t ch[9];
for(int n=0;n<100000;n++){
swprintf(ch,L"aa%06d",n);
wcscat(w,ch); CreateDirectoryW(w,NULL);
if( (GetFileAttributesW(w)&FILE_ATTRIBUTE_DIRECTORY) )break;
w[wcslen(w)-8]=0;}
}

590 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:26:38 ]
まちがえました

wchar_t ch[9];
for(int n=0;n<100000;n++){
swprintf(ch,L"aa%06d\\",n);
wcscat(w,ch);
int flg=GetFileAttributesW(w);
if( flg==-1 || !(flg&FILE_ATTRIBUTE_DIRECTORY) )
{CreateDirectoryW(w,NULL); break;}
w[wcslen(w)-9]=0;

591 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:30:25 ]
GetTempdir が使われてないのと>>588の意見を全つっぱした理由が気になるな

592 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 04:40:03 ]
GetTempFileNameはファイル作らないよ?

593 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 21:41:36 ]
>>592
作ったり作らなかったりする。
MSDN嫁あほ

594 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 23:21:58 ]
C++なんですけど、(Cも同じでしょうか)
グローバル変数でstatic付けるのと付けないのと、どんな違いがあるのでしょうか。

595 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 23:28:51 ]
>>594
その名前がコンパイル単位の外から見えるかどうかが変わる。
C++ では無名の namespace に入れるのが推奨されてる。



596 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 23:34:01 ]
>>594
つけると静的になり、ファイルスコープになる。
つまり、外部に公開しないで済む。

597 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 04:58:54 ]
template< class T > class Base を継承したクラス Derived を作りたいのですが
クラス定義はどのように記述すればいいんでしょうか?

598 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 05:15:16 ]
template<class T>
class Deriv : public Base<T>

こうだろうか?

599 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 05:19:28 ]
#include <iostream>

template <class T>
class Base {
T a;
public:
Base(T b) : a(b) {}
void print() const {
std::cout << a << std::endl;
}
};

template <class T>
class Derived : public Base<T> {
T c;
public:
Derived(T a, T b) : Base<T>(a), c(b) {}
void print() const {
Base<T>::print();
std::cout << c << std::endl;
}
};

int main()
{
Derived<int> d(1, 2);

d.print();
}

600 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 06:48:15 ]
おふっ。
できました。ありがとうございます。

601 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 09:35:56 ]
例外を扱うとき場合
実行中どういう例外を吐いたかログを取るような仕組みを組みこんだりするのでしょうか?

その場合、どういう方法でログ取りの仕組みを実装するのがよいでしょうか?

602 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 10:29:09 ]
SYSLOGでも利用すれば

603 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 16:47:32 ]
イベントログも使えば

604 名前:594 mailto:sage [2008/10/02(木) 18:21:18 ]
>>595-596
ありがとうございます。
staticはローカル変数でしか使ったことがなく、ちゃんと理解してませんでした

605 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 18:31:59 ]
まあ、まず使わん仕様だがな。



606 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 19:44:00 ]
質問があります。私は今WindowsGUIプログラムで、WinMainのスレッドでGUIの処理、別に作ったスレッドで
ファイルへの書き込みを行っています。一定時間間隔で複数のデータをサンプリングしてファイルへ書き込んで
いるのですが、メインスレッド終了時に、同時刻上のデータがすべて書き込み終わっている様にしたいのです。
ファイル書き込みスレッドを終了させた場合、どこまで処理を終えているのか確定できませんが、どのようにコントロール
するのが一般的なのでしょうか。よろしくお願いします。

607 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 19:46:01 ]
>>606
fflush 相当のことをすればいいんじゃないかと

608 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 19:57:36 ]
>>606
書き込みスレッドにイベントを送って、書き込みスレッドがファイルをクローズしその後スレッド終了するようにすればいい。それを待ってwinmainのスレッドを終了させる。


609 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:00:18 ]
イベントについて調べたところ、これで大丈夫そうです。ありがとうございました。

610 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:52:18 ]
クラスをリスト化してるのですが
クラスの一番最初のメンバ変数をsortを使って
昇順や降順に変更したいと思っています
何かいいやり方はないでしょうか?

611 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:55:20 ]
reverseのが早いんじゃない?
使えるリストなのかは知らないけど

612 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:55:44 ]
>>610
STLを使おう

613 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 22:57:42 ]
>>609
豆知識

スレッドの実行が終わると、スレッドのハンドルがシグナル状態になる。結構便利


614 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 23:27:10 ]
豆知識ていうか必須知識だろ

615 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 23:37:04 ]
>>606
文章の酷さが気になった
もう少し読み書きしようぜ



616 名前:デフォルトの名無しさん [2008/10/03(金) 02:04:13 ]
int hoge(int a) {
return a++ * ++a;
}
という関数があるときに
hoge(5)
とすると、Return値は5×6で30になると思ったんだけど、g++とVC++の両方で
答えが36になりました。これってどうしてでしょうか?
どうかお願いします。


617 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 02:20:56 ]
>>616
それは未定義動作なのでそういうコードは書いちゃいけないけど、
あえてコンパイラの気持ちを大便するなら、
1. a++を発見。「評価後にaの値を+1する」と覚えておく
2. ++aを発見。「評価前にaの値を+1する」と覚えておく
3. コード生成開始
4. 評価前なのでaの値を+1するコードを生成
5. a*a のコードを生成して、その結果が返り値となるようにする
6. aの値を+1するコードを生成する。意味がないから最適化で削除されるかも。


618 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 02:23:42 ]
水に流せってことですか

619 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 03:35:14 ]
変な物を放り込むと詰まるという意味も

620 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 04:08:33 ]
template < class T > class Hoge;
で const の T を受け取った時に、
クラス内部で非 const な T 型を使いたい場合には
どうすればいいんでしょう?

例えば Hoge< const string > というように呼ばれたとき、
内部で(非 const な) string 型を扱いたいのです。

621 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 07:54:20 ]
>>620
boostのtype_traitsにconstを外した型を返せる
remove_cってのがある。
ttp://www.kmonos.net/alang/boost/classes/type_traits.html

手法としてはtemplateの特殊化で行ってるらしい。

622 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 07:55:16 ]
すまん、remove_constだね

623 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 08:36:56 ]
サンクスです。boostが必要ということは
もともと const 修飾された型から 非 const の型を特定するのは
難しいプログラム技術が必要だってことなわけですね・・・。

自作のiteratorを作ってたんですが、こりゃー自分には無理かな。・_・

624 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 08:59:29 ]
>>623
いや、試してないけど実装はたったこれだけで良いっぽいよ。

// remove_const : const修飾の除去

//非constが渡されたらこれが実体化
template <typename Type>
struct remove_const {
typedef Type type;
};

//constの場合はこちらが実体化
template <typename Type>
struct remove_const<Type const> {
typedef Type type;
};

//用例
remove_const<const int>::type i; //constが外れる

625 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:00:15 ]
>>617
未定義動作じゃなくて不定動作だろ。
a++と++aの評価順が決まってない。



626 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:08:18 ]
>>617
副作用完了点について理解しとかないと泣きを見るよ。

627 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:48:35 ]
またそうやって「何かをわかってるフリ」したデタラメを書くw

628 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:51:43 ]
>>625
↓にはそういったコードは未定義だと書いてあるが・・・
www.kouno.jp/home/c_faq/c3.html#2

629 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:59:34 ]
ANSI-C89より前では「不定動作」だったがANSI-C89からは「未定義動作」
に改められたね。

630 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 13:17:57 ]
>>624
おぉ!すごい!できました!革命的!

が、これは安全なんでしょうか。^^;
VC++2008では
allocator::allocate, allocator::construct は const オブジェクトを引数に取れますが
allocator::deallocate. allocator::destroy は const オブジェクトを引数に取れません。

つまり、例えば const string 型のオブジェクトのためのメモリ領域は確保できますが、
その領域を開放する術はありません。そこで、

// T は const string 型とする。
// T* p;
// allocator< T > alloc;
typedef typename remove_const< T >::type * not_constT; // T 型からコンストはずし
alloc.destroy( const_cast< not_constT >( p ) ); // p からコンストはずし

のようなコードを書いたわけですが、これが正常なのかどうか…。
コンパイルは通っており、テストもパスしていますが、メモリの中身を覗く術がわからないので
もしかしたらメモリリークでもしてるのでは、と。

631 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:29:18 ]
スレッド、セマフォ、ミューテックス辺りを次の業務でするんだけど
プロセスとスレッドの違いが良くわかりませぬ。
スレッドってなんだ?

632 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:42:34 ]
ここのこと
それはスレッド

633 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:44:55 ]
>>632
それだけは言って欲しくなかった…

634 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:54:21 ]
プロセス・・・プロセスごとにメモリ空間(=グローバル変数とかヒープとか)が別々
スレッド・・・全部のスレッドでひとつのメモリ空間を共有

メモリ空間を共有するので複数のスレッドからひとつの変数を
同時に書き換えたりとかわけわからんことにならぬよう注意せよ

セマフォとかは普通にプロセス間でも使えるんじゃ?

635 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:15:19 ]
>>634
ありがとう
確かに共有メモリがどうの聞いた!



636 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:17:08 ]
「業務」で未知状態でマルチスレッドか……

ご愁傷様って奴だな

637 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:25:13 ]
共有メモリとメモリ空間共有とは違うw

638 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:36:17 ]
えらんツッコミのせいでせっかくの感動が台無しだ

639 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:40:48 ]
地獄への第一歩で感動とかされても

640 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:50:50 ]
Windows3.xやWin32sのプロセスはスレッドだったのか

641 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:06:45 ]
地獄とかやめて
確かに既に炎上してるらしいが

642 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:16:21 ]
既に炎上してるところに知識のない奴が投入されるのか・・・
ご愁傷様という他ないな

643 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:16:35 ]
passive hell and death

644 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:19:33 ]
デスマーチのプロジェクトは働かなくても給料もらえるからいいじゃない。
だって、どうせ出来上がらないんだから!

645 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:22:18 ]
const char *hoge[5]={"test","test2","test3","test4","test5"};

というのを宣言します。

char *hoge2;


hoge2 = hoge[3]; という代入をしたいんですが、コンパイルが通りません。hogeのほうにconstをつけなければいけるんですが・・・
教えてください



646 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:26:08 ]
>>645
そういうのを通さないためのconstです。
明示なcastをしてください。

647 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:28:11 ]
>コンパイルが通りません
エラーになった原因とかコードとかでてるだろ?
それを調べてみればここで聞くまでもなく答えはすぐわかるよ。

648 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:28:42 ]
代入される変数がconstついてなければできるのだと思ってました

hoge2 =(char)hoge[3];ですか?

649 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:29:53 ]
hoge2にconst

650 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:31:25 ]
char * だろ。
constのポインタをconstでないポインタに代入しようとしてるから。

651 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:32:21 ]
程よいレベルだとやっぱ群がるなぁ

652 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:35:24 ]
>>649
hoge2はconstだと困るんです

653 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:38:02 ]
char hoge2[5]
でstrcpy

654 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:42:35 ]
>>652
なんで困るのか言ってみようか

655 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:42:48 ]
C++ならSTLのstd::string使うとか



656 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:43:37 ]
>>650
それだといけました

>>653
それもありなんですね

>>654
いろいろ書き換えたいんです

657 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:50:41 ]
文字列定数を書き換えてはいけない
必ずstrcpyでコピーしる

658 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:53:18 ]
そもそもなんとなく この宣言を使ってるんですが

char *hoge[5]={"test","test2","test3","test4","test5"};

イメージ的にはどんな感じですか

hoge[0] 文字列testへのポインタ
hoge[1] 文字列test2へのポインタって感じですか?

659 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 18:24:19 ]
そんな感じ

660 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:13:21 ]
a.hにクラスAを宣言、別ファイルのb.hでクラスAを継承したクラスBを宣言したいんですが、
B宣言部の「class B:public A」の部分に「型名が必要」とエラーが出ます。(当方Borland C++)
a.hをインクルードしても「Aの宣言が複数見つかった」と言われたりで、どうしたらいいんでしょうか。

661 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:15:04 ]
>>660
class B の定義より前に class A の宣言だけしてみるとか
class A;

662 名前:661 mailto:sage [2008/10/03(金) 19:16:28 ]
ごめん >>661 は無しで

663 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:26:27 ]
質問です。
他クラスのメンバ変数にアクセスするにあたって
privateなメンバにgetterを使ってアクセスするのと
publicなメンバを直接参照するのではどちらが速いですか?

CHoge hoge;
int a = hoge.m_publicHoge;
int b = hoge.getHoge();

// CHogeの実装
// const int& getHoge(){ return m_hoge; };
// public: :
// int m_publicHoge;
// private :
// int m_hoge;

664 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:30:51 ]
一応
速度は直接アクセス
安全性はゲッター
だろう一般的に
最適化で速度差無い事もあるけど
普通はゲッター使いなさいと教わるはず

665 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:30:52 ]
>>660
それだけだとうまくいくはずなのでもうエスパーさんしか
アドバイスできないんじゃないかと
エラーの出る最小のコードをどうぞ



666 名前:デフォルトの名無しさん [2008/10/03(金) 19:32:06 ]
VC++2008のデフォルト状態Releaseでコンパイルしたものを実行し、CPUメーターで見ました。するとコアが満遍なく使われています。
私はマルチスレッドプログラムも何もしていないのに、コンパイラが自動でマルチコアに最適化してくれたということでしょうか?

667 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:35:11 ]
ほかのプログラムが満遍なくCPUを使っていただけだろ。

668 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:42:44 ]
>>660
インクルードガードでぐぐれ

669 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:52:56 ]
>>665
こんな感じです。

ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7751.zip

670 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:54:33 ]
>>669
#include "ca.cpp"
#include "cb.cpp"

これは。。
ヘッダをインクルードするようにして、多重インクルードガードすればいいと思うよ。

671 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:55:40 ]
ボーランドのリンカ使い方知らないけど、
それぞれのcppからobj作って、それらをリンクして、exeを作るのが普通。

672 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:57:11 ]
>>671
makefileみたらそうなってるから >>670 だけでいいんじゃないかな

673 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 20:22:08 ]
>>670
つまり、main.cppでa.hとb.hをインクルードして、
a.cppとb.cppではインクルードガードをかけるだけて、単にメンバ関数を書くだけでいいという事ですか?

674 名前:663 mailto:sage [2008/10/03(金) 20:37:11 ]
>>664
サンクスです。
やはり直接アクセスの方が速いですか。。。
参照返ししてるからほぼ同等だと思ったのですが甘かったようですね。

getter使うにしてもローカルで複数回使う場合

func1( hoge.getHoge(; );
func2( hoge.getHoge() );
func3( hoge.getHoge() );

とするより

int& b = hoge.getHoge();
func1(b);
func2(b);
func3(b);

のようにした方がオーバーヘッドは減りますよね?

675 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 20:42:29 ]
メンバ関数はインライン関数にできてだな



676 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 20:43:35 ]
最適化を前提にするなら余計なことはしないほうがよいだろう。
get/setは*.hにインラインで記述するのが基本。
気になるならアセンブリリストを出力したり、実際に測定するといいよ。

677 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 21:05:57 ]
>>674
intなら参照使わない方が早いんじゃね?
どういう用途か知らないけど


なんにせよ実測するのが一番だな

678 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 21:23:04 ]
>>674
値をレジスタに置けるなら、メンバの内容をローカル変数にコピーして、
一通り操作が終わったら、メンバに書き戻す方が良いかも。
メンバへの変更 ( 副作用 ) が発生するポイントが、書き戻し部分に限定
される点もメリット。

679 名前:673 mailto:sage [2008/10/03(金) 21:50:44 ]
解決しました。
どれから読み込んでもいい様、使う関数のあるヘッダはインクルードガード付けた上で
形式上でもインクルードしておけ、って事ですね(多分)。
アドバイスくれた方々、ありがとうございました。

680 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 22:33:10 ]
>>679
> a.cppとb.cppではインクルードガードをかける
ヘッダ内でガードする。
多重インクルードされた結果、重複定義が発生する。

> ヘッダはインクルードガード付け
となっているから理解したのかもしれないけれど。

すっきりさせるために動かない状態が続くよりは、ぐちゃぐちゃでもなんとか動く状態の
ほうがいいので、動く状態をキープしたまますっきりさせられるように努力するといいですよ。
リファクタリングって言葉も調べてみてください。

681 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 23:09:43 ]
よくwindowsプログラムのサンプルコードでInitAppとInitInstanceってあるけど、どういう分け方してるんですか?

682 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 23:31:17 ]
エスパーに失敗した。もうちょっと情報頼む。

683 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 01:04:14 ]
>>681
気分

684 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 01:22:24 ]
>>681
そういう作りはWin16時代の遺物なので今となっては意味がない

Win16ではアプリケーションの最初のインスタンスだけが実行すべき処理を
InitApplication()に記述して、
WinMain()の引数hPrevInstanceがNULLの場合にのみInitApplication()を実行していた。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<177KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef