【初心者歓迎】C/C++室 Ver.44【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/11/03(土) 00:20:13ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.43【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1190860744/l50
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0175デフォルトの名無しさん
2007/11/08(木) 19:34:54救世主が登場
0176デフォルトの名無しさん
2007/11/08(木) 19:45:20がメンツをつぶされた挙句暴れている模様。
0177140
2007/11/08(木) 20:33:360178デフォルトの名無しさん
2007/11/08(木) 23:26:502つ以上の引数をスレッドに渡すにはどうすればいいですか?
0179デフォルトの名無しさん
2007/11/08(木) 23:44:35void func(void *arg)
{
((hogeclass *)arg)->func();
}
0180デフォルトの名無しさん
2007/11/08(木) 23:49:050181デフォルトの名無しさん
2007/11/08(木) 23:50:40HogeClass hoge = (HogeClass) threadArg;
なんて記述をしてるんじゃ…。
0182デフォルトの名無しさん
2007/11/08(木) 23:59:34が適切な物なら良いけど、もしそうじゃないなら怖いな
0183デフォルトの名無しさん
2007/11/09(金) 00:12:570184デフォルトの名無しさん
2007/11/09(金) 04:19:15リアルでは出会えない珍獣を見た
0185デフォルトの名無しさん
2007/11/09(金) 05:51:13とっくにスレの流れ変わってるんだから、空気読めよ。
0186デフォルトの名無しさん
2007/11/09(金) 06:34:460187デフォルトの名無しさん
2007/11/09(金) 10:24:19#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
#define N 1000
#define K 320000
unsigned int su[256];
unsigned WINAPI open(void *p){
unsigned long size; char *buf=new char [K+100];
HANDLE fp=CreateFile((char*)p,GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
ReadFile(fp,buf,K,&size,NULL);
for(int i=0;i<size;i++)su[ (unsigned char)buf[i] ]++;}
main(){
WIN32_FIND_DATA fd;
char path[200]="d:\\aaa\\",serchpath[200];
strcpy(serchpath, path); strcat(serchpath, "*");
SetCurrentDirectory(path);
HANDLE hd = FindFirstFile(serchpath, &fd);
int n; HANDLE hf[N];
for(n=0;n<256;n++)su[n]=0;
for(n=0;;n++){
for(;;){if(!FindNextFile(hd, &fd))goto end;
if(!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))break;}
hf[n]=(HANDLE)_beginthreadex(NULL, 0, open,(void*)fd.cFileName, 0 ,NULL);}
WaitForMultipleObjects(N, hf, TRUE, INFINITE);
end:
for(n=0;n<256;n++)cout<<n<<" no kosu "<<su[n]<<endl;}
0188デフォルトの名無しさん
2007/11/09(金) 10:27:390189デフォルトの名無しさん
2007/11/09(金) 10:39:10・同一メモリに複数スレッドから同時にアクセスしているから
・serchpathなんてへんな変数名だから
・thread内でnewしているのに解放していないから
・高々Kバイトしか読み込まないのに100バイトも余計に確保しているから
・変数nを違う目的に使い回しているから
・コーディングスタイルが変態だから
・ハンドル変数にfpなんて名前を使っているから
・どっかWinAPIと思しき辺りの使い方が間違っているから
・毎回ディレクトリの状態が違うから
・毎回ファイルの内容が違うから
どれだろね。
0190デフォルトの名無しさん
2007/11/09(金) 10:47:500191デフォルトの名無しさん
2007/11/09(金) 10:56:481つずつ問題がないかどうか確認するんだ
0192デフォルトの名無しさん
2007/11/09(金) 10:58:06#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
#define N 200
#define K 16
unsigned int su[K];
unsigned WINAPI f(void *p){
int n=(int)p;
for(int i=0;i<n*n;i++)su[i%K]++;}
main(){
int n;
for(n=0;n<K;n++)su[n]=0;
HANDLE hf[N];
for(n=0;n<N;n++){
hf[n]=(HANDLE)_beginthreadex(NULL, 0, f,(void*)n, 0 ,NULL);}
end:
WaitForMultipleObjects(N, hf, TRUE, INFINITE);
for(n=0;n<K;n++)cout<<n<<" no kosu "<<su[n]<<endl;}
0193デフォルトの名無しさん
2007/11/09(金) 11:01:05馬鹿だから。
0194デフォルトの名無しさん
2007/11/09(金) 11:03:41#include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
#define N 200
#define K 12
unsigned int su[K];
unsigned WINAPI f(void *p){for(int i=0;i<(int)p;i++)su[i%K]++;}
main(){
int n; for(n=0;n<K;n++)su[n]=0;
HANDLE hf[N];
for(n=0;n<N;n++){hf[n]=(HANDLE)_beginthreadex(NULL, 0, f,(void*)n, 0 ,NULL);}
WaitForMultipleObjects(N, hf, TRUE, INFINITE);
for(n=0;n<K;n++)cout<<n<<" no kosu "<<su[n]<<endl;}
0195デフォルトの名無しさん
2007/11/09(金) 11:09:000196デフォルトの名無しさん
2007/11/09(金) 11:12:06メモリがFDくらい動作がのろいとするとsu[・]の値を呼び出して
1を足して書き戻すときに、同時に呼び出して計算していた値で置き換えられると言うことです
0197189
2007/11/09(金) 11:16:260198デフォルトの名無しさん
2007/11/09(金) 11:18:140199デフォルトの名無しさん
2007/11/09(金) 11:20:38クリティカルセクション
例
ウェブページの来訪者数を表すカウンタのプログラムを例にとって説明する。カウンターのプログラムはおおまかに次の処理からなる。
ディスク等の記憶装置から現在のカウンタの値を読み出す
カウンタの値を1増やす
カウンタの値を記憶装置に書き戻す
ttp://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AB%E3%83%AB%E3%82%BB%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3
0200デフォルトの名無しさん
2007/11/09(金) 11:24:240201187
2007/11/09(金) 11:33:53これなら時間のかかる部分はスレッドでやってあるから高速のはず
0202デフォルトの名無しさん
2007/11/09(金) 12:39:04ある市販のDLL(libも付いてたので「追加の依存ファイルに指定済み」)の外部関数をコールするたびに、以下のようなメッセージが出力ウィンドウにでます。
HOGE.EXEの0x7c812a5bで初回の例外が発生しました:Microsoft C++の例外: std::runtime_error (メモリの場所 0x0012f16c)
0x7c812a5bでググるといくつかヒットしましたが、原因特定できず。
仕方ないので関数コールをtry catchでくくってもcatchできず。
_try _exceptでも受けれず。
このエラーはどうやったら出なくなるでしょうか?
0203デフォルトの名無しさん
2007/11/09(金) 12:40:31よく知らねぇんだが、デュアルコアとは言え
プロセスでもない単なるスレッドでOSがマルチな処理してくれるんか?
シングルコアな動きするなら、ディスパッチするだけでむしろ遅くなりそうなんだが。
0204デフォルトの名無しさん
2007/11/09(金) 12:42:39変態と言われてもそのままってことは真性のMなんだろうか
0205デフォルトの名無しさん
2007/11/09(金) 12:45:39しかも、実態はディスクアクセスで律速されるから(同じディスク上のファイルを調べる限り)殆ど速くなる余地がない罠。
0206202
2007/11/09(金) 12:47:30動作には影響は今のところありません。
あと、その市販のDLLに付いてきたMFCのサンプルプロジェクトで試しても同じエラーが出力ウィンドウに出ます。
0207デフォルトの名無しさん
2007/11/09(金) 14:46:340208デフォルトの名無しさん
2007/11/09(金) 15:54:581 #include <iostream>
2
3 void extfunc(const int &val)
4 { std::cout << val << std::endl; }
5
6 class A
7 {
8 static const int CONSTDATA = 0x100;
9 public:
10 void func()
11 { extfunc(CONSTDATA); }
12 };
13
14 int
15 main()
16 {
17 A a;
18 a.func();
19 return 0;
20 }
$ g++ --version
g++ (GCC) 4.2.3 20071014 (prerelease) (Debian 4.2.2-3)
$ g++ const.cpp
/tmp/ccN8OXMd.o: In function `A::func()':
const.cpp:(.text._ZN1A4funcEv[A::func()]+0x9): undefined reference to `A::CONSTDATA'
うーん・・・コンストメンバ変数って、参照で受ける事が出来ないんでしょうか?
extfunc(int(CONSTDATA)); とすれば通りますがなんか・・・
0209デフォルトの名無しさん
2007/11/09(金) 15:59:370210デフォルトの名無しさん
2007/11/09(金) 16:19:18定義が無いから賢いコンパイラなら定数データの領域は確保しないらしいね
(なので当然シンボルもない)
by メイヤーズ
定義してみなよ
const int A::CONSTDATA;
0211デフォルトの名無しさん
2007/11/09(金) 16:41:20187の場合で効果があるかどうかは別として、少なくともWindowsでは、
マルチスレッドでも複数の論理CPUを使ってくれる。
0212デフォルトの名無しさん
2007/11/09(金) 16:46:47従って、特定のスレッドがどのコアで実行されるかは
原則的にカーネルにゆだねられる。
0213デフォルトの名無しさん
2007/11/09(金) 17:07:17なんと・・・
6 class A
7 {
8 static const int CONSTDATA;
9 public:
10 void func()
11 { extfunc(CONSTDATA); }
12 };
13
14 const int A:CONSTDATA = 0x100;
でOKでした,#defineしちゃいそうだけどここは我慢・・・
サンクスです
0214デフォルトの名無しさん
2007/11/09(金) 22:00:56初期値の指定はクラス定義内でいいんだぜ。そうしないと配列要素数とかの
定数式につかえない。
>>210
クラスのメンバ変数は定義しない限り実体がなくて、参照やポインタを取ろうとすると
エラーになることは決まっている。整数型に限って初期値をクラス定義内に書けて、
書けば定数式に使えるという特別ルール。
0215デフォルトの名無しさん
2007/11/09(金) 22:03:41DLL 内で throw されて DLL 内で catch されてるんでしょ。何も問題ない。
0216デフォルトの名無しさん
2007/11/10(土) 00:33:03DES や AES など、一般的な暗号方式のライブラリはありませんか?
C でも C++ でもいいです。
ご存知のかた、もしくは自作モノを持っているかた、情報をお願いします。
;; できれば SHA-1 や base64 まで対応していると嬉しいですが、
;; 無くても構いません。
0217デフォルトの名無しさん
2007/11/10(土) 00:39:48あとSHA-1やbase64は暗号じゃない
0218デフォルトの名無しさん
2007/11/10(土) 00:58:37opensslとかか?
まぁでも>>217に1票
0219デフォルトの名無しさん
2007/11/10(土) 01:07:12だからEffectiveC++に載っていると。。
0221187 スレッド出来ました
2007/11/10(土) 03:02:08#include <windows.h>
#include <process.h>
using namespace std;
#define N 100
#define K 320000
unsigned int su[N][256]; char fname[N][256],chk[N];
unsigned WINAPI open(void *p){
unsigned long size,n=(int)p; char *buf=new char [K+100];
HANDLE fp=CreateFile(fname[n],GENERIC_READ,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
while(1){ ReadFile(fp,buf,K,&size,NULL); if(size==0){chk[n]=0;return 0;}
for(int i=0;i<size;i++)su[n][ (unsigned char)buf[i] ]++;}}
main(){ WIN32_FIND_DATA fd;
char path[200]="d:\\aaa\\",serchpath[200];
strcpy(serchpath, path); strcat(serchpath, "*");
SetCurrentDirectory(path);
HANDLE hd = FindFirstFile(serchpath, &fd);
int n,i; HANDLE hf[N];
for(n=0;n<N;n++)for(i=0;i<256;i++)su[n][i]=0;for(n=0;n<N;n++)chk[n]=0;
for(;;){ if(chk[n]==0){
for(;;){if(!FindNextFile(hd, &fd))goto end;
if(!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))break;}
strcpy(fname[n],fd.cFileName); chk[n]=1;
hf[n]=(HANDLE)_beginthreadex(NULL, 0, open,(void*)n, 0 ,NULL);}
n++;if(n>=N)n=0;}
end: WaitForMultipleObjects(N, hf, TRUE, INFINITE);
for(n=1;n<N;n++)for(i=0;i<256;i++)su[0][i]+=su[n][i];
for(i=0;i<256;i++)cout<<i<<" no kosu "<<su[0][i]<<endl;}
0222デフォルトの名無しさん
2007/11/10(土) 08:40:14>for(;;){ if(chk[n]==0){
最初にこの行に到達するとき n=N だぞ。
0223デフォルトの名無しさん
2007/11/10(土) 10:27:45本は持ってないので知らないけど、クラス定義内の static const な整数型について
>210 みたいに「賢いコンパイラなら〜」って書いてあるなら、ちょっと不正確だと思う。
0224デフォルトの名無しさん
2007/11/10(土) 11:24:44これは必ずしも正しくないということが書かれてるよ。
これを実現するコンパイラがいわゆる賢いコンパイラ。
標準で、絶対に領域確保がされないことが保障されている
わけではなく、実装依存となる。static constなデータは、
確保されるならば、大抵静的領域になる。アドレスを必要とする
処理がある場合に限って(この場合は必ず領域確保が必要)領域
を確保してもいいし、無条件に確保しておいてもいい。
それは実装依存ということ。
領域確保を絶対に避けたければenumを使えばいい。
0225224
2007/11/10(土) 11:27:22というのは、もちろん非staticなメンバーについては正しい。
上で書いたのはstaticなメンバーについて。
0226デフォルトの名無しさん
2007/11/10(土) 11:34:49BCCで>>208で引っかかって調べたときに
「>>208は新しい規格で>>213は古い規格」
みたいな記述を見たんだが。
コレがホントなら、「賢い」とかあんまり関係ないんじゃね?
正確なところ知ってる人、フォローplz
0227デフォルトの名無しさん
2007/11/10(土) 11:50:28ポインタや参照とかのアドレスを必要としない場合でも常にメモリ確保
を強制されるというのを新しい規格で認るのは信じがたいけど。
正確なところ知ってる人、フォローplz
0228デフォルトの名無しさん
2007/11/10(土) 12:43:08さっきから実装依存だと言ってるのって、名前空間スコープに定義した const 変数の
話じゃないの?
クラスの static const なメンバ変数はクラス定義内では宣言しかされないので、
別途定義が必要。整数型に限って、宣言につけた初期値を持つ定数式として使える
という特別ルールがあるだけ。
C++ 2003 規格の 9.4.2 p2 より
> The declaration of a static data member in its class definition is not a definition and may be of an
> incomplete type other than cv-qualified void. The definition for a static data member shall appear in a
> namespace scope enclosing the member’s class definition.
同じく 9.4.2 p4
> If a static data member is of const integral or const enumeration type, its declaration in the class
> definition can specify a constant-initializer which shall be an integral constant expression (5.19). In that
> case, the member can appear in integral constant expressions. The member shall still be defined in a namespace
> scope if it is used in the program and the namespace scope definition shall not contain an initializer.
0229228
2007/11/10(土) 12:53:51定数式の一部として使うぶんには定義は必要無いね。参照やポインタを取られる
可能性があるなら関係ないけど。
>208 の例もあるし、ライブラリとして提供するような時には気をつけて定義しとかないと
まずいね。
0230デフォルトの名無しさん
2007/11/10(土) 14:09:21thx
0231デフォルトの名無しさん
2007/11/10(土) 14:23:44どういう性質のものなのか?あと型名とか。
0232デフォルトの名無しさん
2007/11/10(土) 15:20:540233デフォルトの名無しさん
2007/11/10(土) 17:13:27それは引数を一つとるoperator( )が定義されている関数オブジェクトの
クラス型ということですよね?
0234デフォルトの名無しさん
2007/11/10(土) 17:36:10直接binder1stやbinder2ndを使っても問題は無いんだけど、
その場合はbinder1st<ここを書かなきゃいけないのがめんどいよね>。
0235デフォルトの名無しさん
2007/11/10(土) 17:42:20どうも。
ストラップ本で理解できました。
0236デフォルトの名無しさん
2007/11/10(土) 18:11:210237デフォルトの名無しさん
2007/11/10(土) 18:14:490238デフォルトの名無しさん
2007/11/11(日) 15:11:11あるプロセスでstrtok()で、トークン分解中に静的リンクしたDLLの関数を呼んでいます。
その関数内でもstrtok()してるらしく、関数終えて呼び出し元で続きのstrtok()をしようとすると、意図しない値(具体的にはNULL)が入ってしまいます。
MSDNにはCランタイムライブラリの頁に静的リンクなら問題ないようなことを書いてますが、
なぜstrtok()が静的リンクした関数にひきづられるのでしょうか。
あとVC6.0の頃は引きずられなかったのでしょうか。
環境:XP MFC
0239デフォルトの名無しさん
2007/11/11(日) 15:26:26strtok() はヌルを渡されたときのために前回の分割位置を静的な変数に覚えている
ことがある。だから、基本的にそういう使い方はできない。
http://msdn2.microsoft.com/ja-jp/library/abx4dbyh(VS.80).aspx
静的リンクで DLL との競合が起こらない理由もちゃんと書いてある。
VC8(VS2005) でも静的リンクは使えるから、明示的に指定すれば同じ動作に
なるんじゃないの?
0240238
2007/11/11(日) 17:30:02ありがとう。
自分もその頁見てたけど、静的リンクするのはCRTであって、
こちらが作ったDLLじゃないわけですね。
そこを勘違いしてました。
結局どのコンパイラオプションを選べばいいか調べきれなかったので
VC6.0の時は適切なコンパイラオプションだったんだろうけど、今回はstrtok_s()使うことにしました。
0241デフォルトの名無しさん
2007/11/11(日) 17:38:52というような話をときどき伺うのですが、
どういうことなのか理解できません……
教えて頂けませんか?
0242デフォルトの名無しさん
2007/11/11(日) 17:56:280243デフォルトの名無しさん
2007/11/11(日) 18:00:02符号なし整数の計算では、最大値の次が 0 で 0 の前が最大値というふうにラップしている
ものとして結果が必ずその型の範囲内に収まる、と規格で定められている。
ラップする場合を指してオーバーフローと言うかどうかは微妙なところ。
0244デフォルトの名無しさん
2007/11/11(日) 18:28:41なるほど、納得できました
ありがとうございます
0245デフォルトの名無しさん
2007/11/11(日) 18:50:42初心者です。
C++について質問があります。
ArrayとVecotorの全ての値をファンクションに渡して、Arrayの全ての値をReturnしたいのですが、
うまくいきません。
コールの仕方と、プロトタイプの書き方、それからReturnの書き方を教えてください。
もしくは、何か別の方法をしないといけないのでしょうか…?
よろしくお願いします。
0246デフォルトの名無しさん
2007/11/11(日) 18:58:21Array とか Vecotor とか聞いたことないけど
int なり何なりと変わらんと思うよ
Array func(Array a)
{
/* a についていろいろ処理 */
return a;
}
void func(Array *a)
{
/* a についていろいろ処理 */
}
0247245
2007/11/11(日) 19:14:29IntやDouble、Char等のScalar変数(ひとつの値しか含まない変数)なら
うまくいくのですが、ArrayやVectorのようなCollection変数(二つ以上の値を含む変数)は
なぜかうまくいかないのです。
Int型Arrayについて、
Int myFunction(myArray[])
{
Arrayについて処理
return myArray[];
}
や、
String型Vectorについて
String myFunction(myVector[])
{
myVector処理
return myVector[];
{
のようにやろうとしているのですが、間違えているのでしょうか…?
0248デフォルトの名無しさん
2007/11/11(日) 19:36:53コンパイルもできないコードを貼って「間違えているのでしょうか…?」って、何考えてんだ?
エスパーでも募集してんのか?
とりあえず C/C++ では大文字小文字が区別されるから、区別しろ。いまのままじゃ
めちゃくちゃすぎる。
実際にコードを書いてコンパイルしろ。そしたらエラーメッセージが出るから、それを嫁。
0249デフォルトの名無しさん
2007/11/11(日) 19:36:590250デフォルトの名無しさん
2007/11/11(日) 19:38:02myArray/myVectorがテンプレートなのかも怪しいけど
STL前提ならこう書くんじゃないか
// int型のベクタを定義
typedef std::vector<int> myIntArray;
myIntArray myIntFunction(myIntArray array)
{
myArray::iterator i = array.begin();
myArray::iterator e = array.end();
while(i != e) {
// arrayに対する処理(要素に1を足す)
*i += 1;
i++;
}
return array; // 処理結果を返す
}
0251デフォルトの名無しさん
2007/11/11(日) 19:42:54myIntArray::iterator i = array.begin();
myIntArray::iterator e = array.end();
だわ
0252デフォルトの名無しさん
2007/11/11(日) 20:08:260254デフォルトの名無しさん
2007/11/11(日) 20:41:47Int って何だ。Array って何だ。String って何だ。C/C++ にそんなものはない。
しかも、せっかく
>Array func(Array a)
ってアドバイスもらってるのに、
>Int myFunction(myArray[])
って思いっきり無視してるし。
0255デフォルトの名無しさん
2007/11/11(日) 21:58:30Windows VistaとVisual C++ 2005 ExpでOpenGLを使い簡単なゲームアプリを製作しました。
友人AのVista機ではなんら問題なく動作したのですが、友人BのXPでは動作しませんでした。
友人A、BともにOpenGLのDLLは入っています。
どなたか解決のヒントでもいいのでご存じであればよろしくおねがいします。
0256デフォルトの名無しさん
2007/11/11(日) 22:02:47VC++ 2005のランタイムを入れろ。
0257デフォルトの名無しさん
2007/11/11(日) 22:02:510258デフォルトの名無しさん
2007/11/11(日) 22:08:27『このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。
アプリケーションを再度インストールすることにより問題が解決する場合があります。 』
らしいです。Vista環境では正常に動作するのですが……
0259デフォルトの名無しさん
2007/11/11(日) 22:22:560260デフォルトの名無しさん
2007/11/11(日) 22:45:16それともMFCは今後使用されなくなっていくことが濃厚で
.NETとCLR?(この違いはわかりませんが)を勉強
したほうが良いでしょうか?
0261デフォルトの名無しさん
2007/11/11(日) 22:46:08エラーメッセージでググったら、こんなの出てきたがどうよ?
ttp://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200606/06060025.txt
0262デフォルトの名無しさん
2007/11/11(日) 22:57:08個人的な意見
.NETで良いと思う。
でもどっちみち、ちょっと突っ込んだことしようとすると
Win32APIをガシガシ叩くことになるんで、
まずはウィンドウに子ウィンドウ貼り付けて絵と文字を表示するぐらいは
Win32APIを触っとくのが良いと思う。
1週間も掛からんと思うし。
0263デフォルトの名無しさん
2007/11/11(日) 23:05:56何か一冊.NETの本読んでみます。
ちなみにCLRは.NETとは関係無いものですか?
.NETはVBやVC#でも共通に使えるものでCLRはVC++
固有のものですか?
0264デフォルトの名無しさん
2007/11/11(日) 23:07:11現在シューティングゲームを作ってるのですが、以下のようなタスクシステムで行なっています
class ITask
{
virtual void task()=0;
virtual void draw()=0;
};
class CEnemyZakoA : public ITask
class CEnemyZakoB : public ITask
class CEnemyFactory : public ITask
class CBg : public ITask
class CItem : public ITask
こんな感じで、全てのオブジェクトはITaskを継承し、一つのITaskリストに登録しています。
そこで疑問なのですが、Task同士が連携するにはどうすればよいでしょうか?
例えば「CBgの持つ『どのくらいスクロールしたか』の情報によって、CEnemyFactoryは生み出すZakoの種類を変える」
といった場合です。
一応素人考えながらこういう手を考えましたが、一般的にはどうするべきなのでしょうか?
1・FacotryのようなほかのTaskの情報に依存するものは、リストに登録せず特別扱いする(CEnemyFactryとして保持しておく)べき
2・他のTaskに依存するTaskは、その生成時にそのTaskへのポインタをもらっておくべき
3・他のTaskに影響を与える情報をまとめた構造体を持ち、それへのポインタをtask()の引数で渡してあげるべき
1はいまいちだと思います。特別が増えるたびに管理が増えますし、何のためのITaskリストなのかわかりません
2はなかなかいい手ですが、CBgが削除された時などに困ります(share_ptrを使うべき?)
3は構造体に新しい情報が加わるたびに、全てのCXXX.cppが再コンパイルになるのが不満です
0265デフォルトの名無しさん
2007/11/11(日) 23:15:15こちらへ↓どうぞ。
タスクシステム総合スレ
http://pc11.2ch.net/test/read.cgi/gamedev/1173708588/
0266263
2007/11/11(日) 23:17:22入門書にも書いてありました。
0267デフォルトの名無しさん
2007/11/11(日) 23:42:05ありがとうございます!上手く行きました!
他にも助言頂いた方々本当にありがとうございました。
0268デフォルトの名無しさん
2007/11/12(月) 15:09:38MFCだかCLIだか知らんけど、それを上なぞりするだけの言語仕様がつかめる
C++の本ないですか?一から細かいことまで調べる必要ないので。
C++も一応はわかっています。MFCとかCLIがソース見て理解できる程度の
上辺の知識を理解できるまでの文法力がつく本ってないですか?細かい言語使用は
適宜分厚い本でしらべるので。。よろしくお願いします。
0269デフォルトの名無しさん
2007/11/12(月) 16:15:11動的なメモリの割当をしたいとき、どのようにしますか?
i=0;
while(fgets(...) != NULL ){
++i;
}
とやってからnewとかmallocとかで配列を確保するのかなあ
とか考えましたけど、どう考えても余計な事をしているようで…
0270デフォルトの名無しさん
2007/11/12(月) 16:29:18つ[std::vector]
つ[realloc()]
0271デフォルトの名無しさん
2007/11/12(月) 17:00:39filelengthとか何らかの手段を使って、ファイルサイズを先に調べて、一気に割り当てる。
標準入力やパイプのようにサイズがわからない場合は、ある程度の大きさのブロックごとに
読み込み、ブロックのlinked listを作成する。大きさがあまり大きくないことがわかっているなら
reallocもあり。
0272デフォルトの名無しさん
2007/11/12(月) 17:21:57バイナリモードでファイルオープンしてシーク操作でファイルサイズ取得
ifstream
seekg
tellg
0273デフォルトの名無しさん
2007/11/12(月) 18:49:16class sample {
int power;
public setPower(int power) {
this.power=power;
}
};
ってしたいんだけど、文法的に間違いだよね?
0274デフォルトの名無しさん
2007/11/12(月) 18:52:55Javaとは違って、
this->power
■ このスレッドは過去ログ倉庫に格納されています