【初心者歓迎】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
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
0275デフォルトの名無しさん
2007/11/12(月) 21:17:31C++のthisはポインタ
0276デフォルトの名無しさん
2007/11/13(火) 11:42:55可変長自動配列はC99からサポートされたらしいですがVC++ 2005は未対応?
固定長/ヒープにすればそれで終わりなのですけど、折角の便利仕様なので使いたい・・・
static cosnt int ARRAY_MAX 256
bool variable_array_test(int variable_len)
{
if (variable_len <= 0 || variable_len > ARRAY_MAX)
return false; // bad length
char temporary[variable_len]; // << C2054 でエラー
return true; // ok
}
c:\ cl
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
CXXFLAGS = -nologo -Zm200 -GS -Od -Zi -Gm -MDd -GR -EHsc -W
0277273
2007/11/13(火) 11:52:33とおもったら、来てた。おかげでよくわかりました。使い方と理屈が。
PHPのも参照だから矢印記号なんだ。なるほど、なるほど。お礼が遅くなり申し訳ないです。
0278デフォルトの名無しさん
2007/11/13(火) 11:53:21以上
0279デフォルトの名無しさん
2007/11/13(火) 12:05:27('д`;)・・・把握,mingw入れて吊ってきます
0280デフォルトの名無しさん
2007/11/13(火) 12:06:320281デフォルトの名無しさん
2007/11/13(火) 16:06:150282デフォルトの名無しさん
2007/11/13(火) 23:14:060283デフォルトの名無しさん
2007/11/13(火) 23:57:520284デフォルトの名無しさん
2007/11/14(水) 01:48:090285デフォルトの名無しさん
2007/11/14(水) 01:50:520286デフォルトの名無しさん
2007/11/14(水) 02:44:38両方 C++0x に入るみたい。ただし __FUNC__ じゃなくて __func__ ね。
0287デフォルトの名無しさん
2007/11/14(水) 07:41:100288デフォルトの名無しさん
2007/11/14(水) 10:34:460289デフォルトの名無しさん
2007/11/14(水) 11:41:060290デフォルトの名無しさん
2007/11/14(水) 12:53:51これも止めた方がいい?
0291デフォルトの名無しさん
2007/11/14(水) 12:54:470292デフォルトの名無しさん
2007/11/14(水) 13:49:55using namespace std;
class Palindrome{
private:
char *inputValue;
public:
Palindrome();
void setInputValue(char*);
bool isPalindrome();
~Palindrome();
};
Palindrome::Palindrome(){
this->inputValue = new char[100];
}
void Palindrome::setInputValue(char *str){
strcpy(this->inputValue,str);
}
Palindrome::~Palindrome(){
delete [] this->inputValue;
}
0293デフォルトの名無しさん
2007/11/14(水) 13:50:32bool Palindrome::isPalindrome(){
char *aux = new char[100];
int k=0;
for(size_t i=0;i<strlen(this->inputValue);i++){
if((this->inputValue[i] >= 'A' && this->inputValue[i] <= 'Z') || (this->inputValue[i] >= 'a' && this->inputValue[i] <= 'z')){
aux[k] = tolower(this->inputValue[i]);
k++;
}}
aux[k] = '\0';
for(size_t i=0;i<strlen(aux)/2;i++){
if(aux[i] != aux[strlen(aux) - 1 - i]){
delete [] aux;
return false;
}}
delete [] aux;
return true;
}
0294デフォルトの名無しさん
2007/11/14(水) 13:52:03#include "Palindrome.cpp"
#include <iostream>
using namespace std;
int main(){
Palindrome p;
char string[100];
while(true){
cout<<"文字を入力してください: ";
cin.getline(string,100);
if(strcmp(string,"") == 0){
break;
}
p.setInputValue(string);
cout<<"その文字は "<<(p.isPalindrome() == true ? "はパリンドロームです " : "違います ")<<endl;
}
return 0;
}
0295デフォルトの名無しさん
2007/11/14(水) 13:54:09コンパイルできません。
だれか、直してもらえますか?
0296デフォルトの名無しさん
2007/11/14(水) 13:57:240297デフォルトの名無しさん
2007/11/14(水) 14:09:02(Ubuntu 7.10 / g++ 4.1)
まさかgccでコンパイルしようとはしてないだろうな
0298デフォルトの名無しさん
2007/11/14(水) 14:16:52どうやってこんぱいるするんですか?
教えてください。
0299デフォルトの名無しさん
2007/11/14(水) 15:07:130300デフォルトの名無しさん
2007/11/14(水) 15:07:540301デフォルトの名無しさん
2007/11/14(水) 15:18:14g++ でコンパイルできました。
どうもすみませんでした。
g++というのを知りませんでした。
0302デフォルトの名無しさん
2007/11/14(水) 16:12:07質問です。
コンパイルは出来たんですが、実行が出来ません。
g++ aMain.cpp -o aMain
では何も起こらないんですがどうやって実行したんですか?
0303デフォルトの名無しさん
2007/11/14(水) 16:14:59g++はC++コンパイラだからC++特化のライブラリも探してくれる。
0304デフォルトの名無しさん
2007/11/14(水) 16:16:51実行するには、./a.outでいい。
つーか、その程度の基礎知識もなしにコンパイルなんてするなよw
0305デフォルトの名無しさん
2007/11/14(水) 16:18:11何したいの?それで aMain というファイルができてるの?
できていえれば、 ./aMain とすれば走るはずだけど。
0306デフォルトの名無しさん
2007/11/14(水) 16:26:340307デフォルトの名無しさん
2007/11/14(水) 16:40:07./aMainだとpermission denied となってしまいます。
0308デフォルトの名無しさん
2007/11/14(水) 16:45:08g++ aMain.cpp -o aMain && ./aMain
で実行できました。
お騒がせしてすみませんでした。
0309デフォルトの名無しさん
2007/11/14(水) 17:40:55ただのタイプミスな気がする
0310デフォルトの名無しさん
2007/11/14(水) 18:06:04そんなにあせらずに、Unix 系の CUI 使いかたの本薄いので
良いから一冊読むと大分時間の節約になると思うよぉ。
0311デフォルトの名無しさん
2007/11/14(水) 20:33:43mallocなどで確保されてない領域を知る方法はありませんか?
char *str;
str=(char *)malloc(sizeof(char)*2);
for(int i=0; i<5; i++){
if( (str+i) == NULL)
//未確保
}
みたいな形でわかればいいんですが、必ずしもNULLが入ってるとは限らないので…。
よろしくお願いします。
0312デフォルトの名無しさん
2007/11/14(水) 20:40:370313311
2007/11/14(水) 20:41:58なるほど・・・。
やっぱり、そういう方法しかないんですか・・・
せめてtry catchがあれば、強引に出来そうなんですけどね。
どうもありがとうございました。
0314デフォルトの名無しさん
2007/11/14(水) 20:46:310315デフォルトの名無しさん
2007/11/14(水) 20:47:440317デフォルトの名無しさん
2007/11/14(水) 21:18:32そこでお聞きしたいのですが、例えば以下のような場合
・アプリケーションAがDLL_BとDLL_Cを参照
・DLL_B自身もDLL_Cを参照
DLL_BがDLL_Cで確保したメモリを
アプリケーションAからリンクされたDLL_Cで解放するのは大丈夫なのでしょうか?
よろしくお願いします。
0318デフォルトの名無しさん
2007/11/14(水) 21:33:27OKだけど、LocalAllocにすればそんなこと気にしなくてもいいんじゃね?
0319デフォルトの名無しさん
2007/11/14(水) 21:42:200320デフォルトの名無しさん
2007/11/14(水) 21:55:12>if ( ( str + i ) == NULL )
この行で、iに2以上の値が入った時点でアウト。
確保されていない領域を参照することになる。
NULLとの比較も無意味。
初期化されていない領域はゴミが入っているのでNULLかどうかなんてわからない。
0321デフォルトの名無しさん
2007/11/14(水) 22:06:290322デフォルトの名無しさん
2007/11/14(水) 22:07:09LocalAlloc, HeapAlloc, GlobalAlloc
って名前が違うだけでは無いんですね。
知りませんでした。
>>319
Heap系はよけいなオブジェクトが必要になるのであまり使いたくないです・・・
そこが肝という気もしますが
0323デフォルトの名無しさん
2007/11/14(水) 22:09:06それが出来ないから質問きたんだろ
出来るなら、既に解決してるじゃんw
そもそも
>この行で、iに2以上の値が入った時点でアウト。
これを判定したいって言う質問なのに、そのレスはナンセンス過ぎる
0324デフォルトの名無しさん
2007/11/14(水) 23:06:43>この行で、iに2以上の値が入った時点でアウト。
単なるポインタに数字を足した値を見ただけで何でアウトなんだ?
*つけて参照してるならともかく・・・
0325デフォルトの名無しさん
2007/11/14(水) 23:14:37ヒープハンドルは常にGetProcessHeap()で得たものを使うことにすれば、
Local/Globalと比べ、新たな面倒さが生まれることはないと思うぞ。
0326デフォルトの名無しさん
2007/11/14(水) 23:39:430327デフォルトの名無しさん
2007/11/15(木) 01:27:020328デフォルトの名無しさん
2007/11/15(木) 01:59:11配列要素数を超えたところを指すようにポインタに足し算すると未定義動作になる。
C99 6.5.6 p8 より( C++ では 5.7 p5 に同じ文面がある)
> If both the pointer operand and the result point to elements of the same array object, or one past the last element
> of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined.
この場合だと要素数 2 の char 配列とみなせるから、 2 までは大丈夫で 3 以上でアウトね。
0329デフォルトの名無しさん
2007/11/15(木) 02:05:54しかも、ポインタ変数に代入したわけでもなく、単に+3をやってifで比較しただけでしょ?
その文面は
*(str+i)のように参照した場合や、str+=iのように加算を行った場合であって
str+iでは、何の意味もないかと。
試してみれば分かると思うけど
char *str;
に
if( (str+5000)!=NULL)
ってやろうと
if( (str+50000000)!=NULL)
ってやろうと、エラーは出るはず無いよ。
0330デフォルトの名無しさん
2007/11/15(木) 02:23:13> *(str+i)のように参照した場合や、str+=iのように加算を行った場合であって
そんなことどこにも書いてない。 p + n という式自体について述べた部分だよ。
* で参照したり = で代入したりする前の話。
0331デフォルトの名無しさん
2007/11/15(木) 02:43:49一瞬、「じゃあふたつ後ろならいいのかよ」とか思ってしまったよ
0332デフォルトの名無しさん
2007/11/15(木) 10:42:18仕様の読み方わかってないだろ。
プログラムの勉強からはじめたほうがいいね。
0333デフォルトの名無しさん
2007/11/15(木) 10:57:22どこをどう読んだら >329 みたいな解釈になるのか教えてください。
0334デフォルトの名無しさん
2007/11/15(木) 11:24:57加減演算子
ポインタオペランド及びその結果の両方が同じ配列オブジェクトの要素、又は
配列オブジェクトの最後の要素を一つ越えたところを指している場合、演算に
よって、オーバーフローを生じてはならない。それ以外の場合、動作は未定義
とする。
あくまで未定義といっているのだから、規格上は何でもあり得る、つまり
実装依存ということになるね。>>329の言っている、エラーが出ない
とか参照しなければ単なる数字になるということは、多くの実装がそう
なっているだけであって、str+5000の加算演算で仮にクラッシュする実装が
あっても、それは規格には従っていることになる。結局、この場合、
動作は未定義だから実装まかせ。
なので、厳密には>>328の意見が正しいと思われる。
0335デフォルトの名無しさん
2007/11/15(木) 13:04:40例えばint array[2]に対してarrayが0xfff0にアサインされているかもしれない。
ポインタもintも16bitなら、array + 4が0になってしまい、NULLと区別できなくなってしまう。
# 流石に即クラッシュはしないだろうけどね。
0336デフォルトの名無しさん
2007/11/15(木) 14:02:360337デフォルトの名無しさん
2007/11/15(木) 17:44:010338デフォルトの名無しさん
2007/11/15(木) 17:57:270339デフォルトの名無しさん
2007/11/15(木) 18:16:43そもそも誰か、境界の話なんてしているんですか?
0340デフォルトの名無しさん
2007/11/15(木) 18:31:330341wolf ◆8VH3XAqjlU
2007/11/15(木) 22:09:24*** For your reference ***
Windows. _heapwalk (CRT)
http://msdn2.microsoft.com/en-us/library/h0c183dk(VS.80).aspx
Linux 2.4x
src\drivers\char\drm\sis_ds.c "void mmDumpMemInfo( memHeap_t *mmInit )"
0342デフォルトの名無しさん
2007/11/16(金) 13:49:41単純な文章をファイル出力させようとfoutを使っているのですが
”(ダブルクォーテーション)
って奴はどうやったら出力できますか?
囲みを’に変えてみたりしたがうまくいかねえ…
0343デフォルトの名無しさん
2007/11/16(金) 13:58:430344デフォルトの名無しさん
2007/11/16(金) 15:06:55MFCDLLにはMFCのクラスのポインタを引数としたエクスポート関数があります。
MFCDLLでそのクラスをnewし、アプリケーション側でdeleteしています。
この両者が、プロジェクトの設定の"MFCの使用"を"共有DLLでMFCを使用する"
の設定だったらうまく動いてるけれど、
"スタティックライブラリでMFCを使用する"の設定にすると、アプリケーション側で
DLLでnewしたクラスをdeleteしたタイミングでハングします。
なぜスタティックリンクすると、だめなんでしょうか。
0345344
2007/11/16(金) 15:07:370346デフォルトの名無しさん
2007/11/16(金) 15:19:42サンクスです。それをやってもできないから質問したのに、
そこ以外の場所でミスってるとは思わなかった…
0347デフォルトの名無しさん
2007/11/16(金) 15:20:26EXEにスタティックリンクされたMFCとDLLにスタティックリンクされたMFCの2つのMFCが存在することになるから管理が混乱するんじゃないの
0348デフォルトの名無しさん
2007/11/16(金) 22:43:06ってのは嘘だけど、newもdeleteもアプリ側で行うようにできないのかね?
0349デフォルトの名無しさん
2007/11/16(金) 23:02:27関数のオーバーロードをした際、引数がぴたりとあってない場合に
「引数の型があいまいです」とでますよね。
暗黙の型変換をがんばろうとして駄目だった。ということはわかるのですが
どういう優先度でがんばろうとしてるのか、色々実験してみても法則がわかりませんでした
C++における「関数オーバーロード時の呼び出し優先順位の決め方」みたいなものを教えていただけませんでしょうか
0350OPENCV
2007/11/16(金) 23:36:35ttp://www.seman.cs.uec.ac.jp/~takahashi/OpenCV/functions/index.htm
などを参考にすれば導入できるはずなのですが、
デバッグなしで開始をしたときに、
「プログラム 'C:\Users\koizumi\Documents\Visual Studio 2005\Projects\cv
\debug\cv.exe'を開始できません。
指定されたパスが見つかりません」
と言われてしまいます。
リンカの設定で
追加のライブラリディレクトリ--C:\Program Files\OpenCV\lib
追加の依存ファイル--cv.lib cxcore.lib cvaux.lib highgui.lib
と設定しましたし、
インクルードファイル、ライブラリファイルのパス設定もしました。
どこが悪いかわかる方がいらっしゃいましたら、教えてください。
よろしくお願いします。
0351デフォルトの名無しさん
2007/11/16(金) 23:44:58cv.exeが見つからないって感じに見えるんだけどコイズミくん。
0352OPENCV
2007/11/17(土) 00:00:45お返事ありがとうございます。
ビルドしたとき、エラーになっている感じはありません。
========== ビルド: 0 正常終了、0 失敗、1 更新、0 スキップ ==========
いつものようにデバッグなしで開始が通るときは、
Documentsフォルダの中にexeファイルができるのですが、
今回はexeファイル自体が作成されていないようです。
何かわかることがあれば、コメントお願いします。
0353デフォルトの名無しさん
2007/11/17(土) 00:16:55プログラミング言語C++を見てみろ
0354デフォルトの名無しさん
2007/11/17(土) 00:50:48JIS の規格買うか、 JIS の糞思い pdf を見るか、 ISO のドラフトダウンロードするか。
0355OPENCV
2007/11/17(土) 08:08:15>>354
コメントありがとうございます。
プログラミング言語C++は規格についても書かれた本のようですね。ただ、高い。。。
JISの規格は、私ではなおさら分からなくなりそう。。。
もう少し格闘してみます。
それで分からなければまた質問させてください。それでは。
0356デフォルトの名無しさん
2007/11/17(土) 08:27:27ルールを見る前に格闘したって時間の無駄。
先に確認すればいだろ。
0357デフォルトの名無しさん
2007/11/17(土) 09:02:21ScreenFlip関数ってのは、「表示する画面を入れ替える」なんでしょうか、それとも「書き込む画面を入れ替える」なんでしょうか?
0358357
2007/11/17(土) 09:07:00すんません
0359デフォルトの名無しさん
2007/11/17(土) 15:31:07>>355
プログラミング言語C++(第3版)の7.4(p193)にあります。立ち読みでどうぞ。
0360デフォルトの名無しさん
2007/11/17(土) 15:39:450361デフォルトの名無しさん
2007/11/17(土) 15:56:49MFCでメンバ変数のCFontをOnInitDialog内でダイアログのコントロールに設定してますが、
なぜかフォントの種類がMS ゴシックになってしまいます。
デフォルトはダイアログエディタでMS 明朝にしてます。
が、SetFontを呼ぶとサイズはCreatePointFontで指定したサイズになりますが、
なぜかフォントの種類が勝手にMS ゴシックになってしまうのです。
フォントには何を指定してもだめでした。(意味はなくてもMS 明朝で試しましたがMS ゴシックになりました)
サイズは変わってるのに何故でしょうか?
0362361
2007/11/17(土) 16:22:41フォント作成時に指定したフォント名に1バイト余計な空白がありました。
なのにCreatePointFontが成功を返してたので気づきませんでした。
■ このスレッドは過去ログ倉庫に格納されています