【初心者歓迎】C/C++室 Ver.48【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/02/05(火) 01:18:41ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.47【環境依存OK】
http://pc11.2ch.net/test/read.cgi/tech/1200464091/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0516デフォルトの名無しさん
2008/02/12(火) 18:32:17namespaceの終わりにセミコロンは不要。
仮想関数には定義が必要。定義が無いと仮想関数テーブル
(そのメッセージでいうvtable)のエントリーを作れない。
仮想でなければ呼ばれなければ必ずしも定義は必要ない。
0517デフォルトの名無しさん
2008/02/12(火) 18:40:03セミコロンは付け忘れました、
まだ継承は知らないのでなんとも。。
>>515
値渡しでうまく動いてたので特に意味なく使ってました、
ためしにfunc(string *str) に変えてみたら見事に動きました。。。
なぜこういう結果になるのかよくわかりません。。。
すばやい解答ありがとうございました。
0518デフォルトの名無しさん
2008/02/12(火) 18:42:07どうでもいいが、>514は>512宛てだ。
ついでに言えば、ポインタ渡しじゃなくて参照渡しにするだろ。常考
0519デフォルトの名無しさん
2008/02/12(火) 18:49:20勘違いしました、、
なぜデバッグだと動いていたのか、と
値渡しだとだめなのかを知りたいのですが。。
0520デフォルトの名無しさん
2008/02/12(火) 18:54:58>515
0521デフォルトの名無しさん
2008/02/12(火) 19:06:43というか良く見たらDebugモードになってまして、
Releaseだとやっぱりオーバーランしてましたorz
だめだめだ。。。
class A{
string m_str;
public:
func(string str){
m_str=str; ←
};
};
class X{
public:
func(string str){
A hoge;
hoge.func(str)
};
};
DWORD WINAPI doloop(LPVOID lpParam){
x.func("test"); ←xはグローバル変数になってます
};
最初はこんな感じです。。
0522デフォルトの名無しさん
2008/02/12(火) 19:11:48mainもないのが、問題なく動くのか……最近のC++は凄いな
0524デフォルトの名無しさん
2008/02/12(火) 19:14:50問題が再現する最小のテストコードを作って
検証してから質問してくれ
0525513
2008/02/12(火) 19:15:45mainからdoloopをスレッドで動かしてます。。
簡略化しすぎました。。
DWORD WINAPI doloop(LPVOID lpParam){
while(!bMainLoopExit)
{
EnterCriticalSection(&cs);
x.func("test");
LeaveCriticalSection(&cs);
}
ExitThread(NULL);
}
0526デフォルトの名無しさん
2008/02/12(火) 19:16:01std::string m_name;
public:
void func(std::string str){
m_name = str;
}
}
int main(int, char**)
{
A test;
std::string str = "abc";
test.func(str);
}
//
これでも落ちるか?
0527デフォルトの名無しさん
2008/02/12(火) 19:16:44まて、複数のスレッドからグローバル変数にアクセスしてるのか?
0528デフォルトの名無しさん
2008/02/12(火) 19:18:510529デフォルトの名無しさん
2008/02/12(火) 19:21:42ZeroMemory(&d3dpp, sizeof(d3dpp));
D3DPRESENT_PARAMETERS d3dpp = {0};
結果に違いはありますか?
0530デフォルトの名無しさん
2008/02/12(火) 19:23:240531デフォルトの名無しさん
2008/02/12(火) 19:27:490532デフォルトの名無しさん
2008/02/12(火) 19:27:50ってか、なんで値渡し……?
0533デフォルトの名無しさん
2008/02/12(火) 19:36:24typedef struct particle{
double data[3][3];
typedef data[][0] position[];
typedef data[][1] verosity[];
typedef data[][2] angle[];
/* ようするに、data[][]に、position[]……という名前でもアクセスしたい */
/* data[][]のままで、loopを回して全部に値を流し込む、ということもしたいので、二重配列も残したい*/
}PARTICLE;
当然のようにエラーなのですが、こういうばあいどのように記述すればいいのでしょうか。
0534513
2008/02/12(火) 19:38:00mainの中身を >>521のX::funcにあたる場所に入れて実行してみましたがだめみたいです。
>>527
そうです。。
>>530
書かなくてもいいけど明示的に書いても良いって書いてあったので書いてあります。
クリティカルセクションで排他処理した気分になって
親が実体持ってるクラスを使ってます。。
0535デフォルトの名無しさん
2008/02/12(火) 19:44:25環境優先的に修復を。たぶんこの項目が一番減る。
NEJITUのように少し公園を先行させてもいいかもしれん。
ランク 国名 .... 街名 人口 (増減) 前日
--- 1 US1 .LUELand 314897 (. +528) 314369
--- 2 US2 .GoonTown ......187254 (. +490) 186764
--- 3 US3 .CreateMyCity Forum 105044 (. +804) 104240
--- 4 Slovenia1 Staregate 100076 (+1393) .98683
--- 5 Poland1 #debian.pl .... .90733 (. +618) .90115
--- 6 Germany1 isnichwahr.de .89782 (. +224) .89558
--- 7 Japan1 ...2ch_city .... .69147 (+1870) .67277
--- 8 Germany2 deluxebits .59250 (. +279) .58971
--- 9 France1 .FanaZ . .56613 (+1377) .55236
--- 10 . Germany3 upOTia . .54802 (. +130) .54672
20位までのランクは下記URLご参照ください
http://mmc.from.tv/world.html
0536デフォルトの名無しさん
2008/02/12(火) 19:49:090537デフォルトの名無しさん
2008/02/12(火) 19:53:41typedef union particle{
double data[3][3];
struct {
double position[3];
double verosity[3];
double angle[3];
} named;
}PARTICLE;
0538デフォルトの名無しさん
2008/02/12(火) 19:59:41エラーメッセージ?
エラーコード?
それともクラスで投げて型判別?
どういう形がスマートでしょうか
0539デフォルトの名無しさん
2008/02/12(火) 20:03:050540デフォルトの名無しさん
2008/02/12(火) 20:20:13ありがとうございます
// strtest.c
#include <stdio.h>
typedef union particle{
double data[3][3];
struct {
double position[3];
double verosity[3];
double angle[3];
} named;
}PARTICLE;
int main(void){
PARTICLE pt;
pt.data[0][0] = 10;
printf("%lf\n",pt.named.position[0]);
return 0;
}
>gcc strtest.c
>./a.out
10.00000
所望の動作が得られました。
0541513
2008/02/12(火) 20:42:480542460
2008/02/12(火) 21:10:50!
なるほど。そこの部分と、>>460では省略した速度のvをintからfloatにしたらなんとなくうまくいきそうな感じになってきました。
ありがとうございます。
0543デフォルトの名無しさん
2008/02/12(火) 21:18:080544デフォルトの名無しさん
2008/02/12(火) 21:35:53std::stack<CAutoPtr<Hoge>> hoges;
hoges.push(CAutoPtr(new Hoge()));
hoges.top()->func();
とすると、Hogeの実体がすでに破棄されているみたいでエラーが出ます。
std::stack<CAutoPtr<Hoge>> hoges;
hoges.push(CAutoPtr(new Hoge()));
hoge.top().Attach(new Hoge());
hoges.top()->func();
とすれば動きます。
どうして上のだと捨てられているですか?
0545デフォルトの名無しさん
2008/02/12(火) 21:52:390546デフォルトの名無しさん
2008/02/12(火) 21:54:000547デフォルトの名無しさん
2008/02/12(火) 22:03:06hoge.top().Attach(new Hoge());
で新たなアドレス突っ込んでるから動くだけで。
0548デフォルトの名無しさん
2008/02/12(火) 22:13:30D3DPRESENT_PARAMETERSがPOD型なら無い
0549デフォルトの名無しさん
2008/02/12(火) 22:13:520550デフォルトの名無しさん
2008/02/12(火) 22:14:390551デフォルトの名無しさん
2008/02/12(火) 22:16:31そいつたぶん釣りか荒らしかただのバカだよ…。
0552デフォルトの名無しさん
2008/02/12(火) 22:16:540553デフォルトの名無しさん
2008/02/12(火) 22:24:25スレッド中でWindowsAPIのみ使うならCreateThread, ExitThreadでいいよ。
でもCランタイム使うなら_beginthread, _endthread使わないとダメだぜ。
あと、ExitThread等でスレッド終わらせると、スコープ抜けずにスレッドが終わる。
C++使うなら、ローカル変数のデストラクタ呼ばれなくなるからやめた方がいい。
0554460
2008/02/12(火) 22:48:42( after - before )の部分をtimeに置き換える。 ・・・・ 正常に動作。
(ただし、事前に float time = 0.1; を宣言しておく。)
( after - before )の部分を数字の0.1に置き換える。 ・・・・ 正常に動作。
( after - before )の部分をtimeに置き換える。 ・・・・ おかしい
(ただし、事前に DWORD time = 0.1; を宣言しておく。)
ここから考えるにDWORD型が悪さをしていると思うんですが、
( after - before )の部分を( float )( after - before )に置き換える。 ・・・・ おかしい
何か特殊な変換をしなければいけないんでしょうか?
0555デフォルトの名無しさん
2008/02/12(火) 22:52:40DWORDが何のtypedefか分かってる?
0556デフォルトの名無しさん
2008/02/12(火) 23:19:54下記のようなコードでBar::fugaを初期化する方法が
よくわからないのですが、教えていただけませんでしょうか?
この場合はやはり引数空っぽのコンストラクタを作るほかに手はないのでしょうか?
class Foo{
public:
Foo( int hoge ){ ... }
};
class Bar{
public:
Foo fuga[ 3 ];
Bar( void ) : ???? { ... }
};
0557デフォルトの名無しさん
2008/02/12(火) 23:22:46おかしいというときは、after - beforeやtimeの値が0になっているときじゃないか?
0558デフォルトの名無しさん
2008/02/12(火) 23:34:520559デフォルトの名無しさん
2008/02/12(火) 23:42:03return *(hoge + (sizeof(piyo) + 2);
みたいに書くのって非推奨なんでしょうか?*は無くてもいいんだけれども
0560デフォルトの名無しさん
2008/02/12(火) 23:52:53つか、それだけじゃ分からん。
0561デフォルトの名無しさん
2008/02/12(火) 23:55:35まあ、非推奨だろうね。
コンパイルできないし。
0562デフォルトの名無しさん
2008/02/12(火) 23:57:36*があるとないじゃ内容が変わるが?括弧の数が合わないのはtypoでいいよね?
個人的には、あんま複雑になるようならローカルに落として欲しいけど、これくらいなら許容範囲。
ってか、ポインタを+2するだけならreturn hoge + 2;でもいいんでねぇの?
0563デフォルトの名無しさん
2008/02/12(火) 23:58:57何がいいたいのかさっぱり分からない。
0564460
2008/02/13(水) 00:45:52>>555
整数型って分かってたつもりなのに小数いれてました!
あと、>>557で言われたとおりにtimeの値調べてたら、
ウィンドウ生成時に
before = timeGetTime();
そして計算時にも
before = timeGetTime();
ってやって、afterに何も入ってないような状態になってたような感じでした!
今度こそ解決しました!ありがとうございます!
0565デフォルトの名無しさん
2008/02/13(水) 00:53:150566460
2008/02/13(水) 01:11:10とりあえず物体のy座標しかいじってないのにカメラの位置が変わってました。
0567デフォルトの名無しさん
2008/02/13(水) 01:53:03例えばchar型で宣言したのを一々(int)とかしなくてもずっとint型として扱う
みたいな感じで
0568デフォルトの名無しさん
2008/02/13(水) 02:02:10言いたいことがわからない。キャストを毎回するのが面倒ってことか?
ずっとintならはじめからintにしとけばいいんでねぇの?
0569デフォルトの名無しさん
2008/02/13(水) 02:08:09union{
char a;
int b;
};
ちょっと違うかもしれんが
0570デフォルトの名無しさん
2008/02/13(水) 02:08:59#define char int
なにが起きても責任とらないよ。
0571デフォルトの名無しさん
2008/02/13(水) 02:26:22ごめん_beginthreadが引数としてvoid*しか渡せないからそれをchar*として扱える
ようにしたかったんです
関数内でchar *xxx=(char *)xxxとすることで解決しました。ご迷惑おかけしました
0572デフォルトの名無しさん
2008/02/13(水) 02:27:27ごめん_beginthreadが引数としてvoid*しか渡せないからそれをchar*として扱える
ようにしたかったんです
関数内でchar *xxx=(char *)xxxとすることで解決しました。ご迷惑おかけしました
0573デフォルトの名無しさん
2008/02/13(水) 02:28:440574デフォルトの名無しさん
2008/02/13(水) 06:39:24>>516
ありがとうございます。なるほど、仮想関数は定義が必須なのですね。
あと、純粋仮想関数は定義が必要ないけど、デストラクタの純粋仮想関数の場合は
やはり定義が必要になる、というのは正しいですか?
0575デフォルトの名無しさん
2008/02/13(水) 08:56:43マルチスレッドプログラムを作った事がないためわからないです。
スレッドAで作ったデータをスレッドBに渡すには普通どうやって渡すのでしょうか?以前お遊びで作った時、グローバル変数を使って渡したのですがデータが化けちゃったんですね。。
【作りたいもの】
ダイアログベースのターミナルソフト。
・シリアルデータ受信スレッドでデータを受けて表示用(windowsのメッセージループ待ちをしてる)に送りたい
【開発環境】
VC。MFCはつかいません。猫でもわかるレベル
0576デフォルトの名無しさん
2008/02/13(水) 09:45:29グローバルデータが化けた理由がわかれば解決すると思うよ。
0577デフォルトの名無しさん
2008/02/13(水) 09:49:28もしくは書き込んでない(初期化してない)のに取得したか
0578デフォルトの名無しさん
2008/02/13(水) 09:58:220579デフォルトの名無しさん
2008/02/13(水) 10:00:48多分GUIスレッドにはPostMessage()でブン投げてるんだろうが、
GUIスレッドがPostされたメッセージをメッセージキューから読み取るまでの間に
受信スレッド側からの再Postが発生し得るから、その場合グローバル変数では
当然上書きされてしまうだろ。
Post側は毎回malloc()等でメッセージ用の領域を確保して、受け側で
メッセージを処理したらfree()するように汁。
0580デフォルトの名無しさん
2008/02/13(水) 10:57:14下記のようなコードで"taking address of temporary"のWARNINGが出ますが、
この場合は無視しちゃってもいいですか?いいですよね?
#include <stdio.h>
class CTmp
{
public:
int x,y;
CTmp(int a,int b):x(a),y(b){};
};
int Foo(CTmp* pTmp)
{
if(pTmp) return pTmp->x + pTmp->y;
return 0;
}
int main(int argc,char** argv)
{
int result=Foo(&CTmp(1,2));
printf("%d\n",result);
return 0;
}
0581580
2008/02/13(水) 11:16:23スマートさ以外で>>580のまずい点あったら教えてください。
#include <stdio.h>
class CTmp
{
public:
int x,y;
CTmp(int a,int b):x(a),y(b){};
};
int Foo(const CTmp &Tmp)
{
return Tmp.x + Tmp.y;
}
int main(int argc,char** argv)
{
int result=Foo(CTmp(1,2));
printf("%d\n",result);
return 0;
}
0582デフォルトの名無しさん
2008/02/13(水) 11:58:150583デフォルトの名無しさん
2008/02/13(水) 12:01:25標準 C++ ではエラーになるはず。 gcc のバグっぽいな。
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21386
(だいぶ古いけど CONFIRM されてない。)
0584デフォルトの名無しさん
2008/02/13(水) 12:02:19・ポインタである必要が内のにポインタを使うな
・どうしても使いたいならconst修飾しろ
・そもそもデータメンバは公開するな
・クラスに依存する関数ならメンバにしろ
0585デフォルトの名無しさん
2008/02/13(水) 12:15:31そこで、fstream *fsというようにポインタにしてやってるのですが、参照で
やる方法はないでしょうか
void func(fstream &fs)
{
return;
}
int main()
{
ifstream ifs;
ifs.open("ttt");
func(ifs);
0586デフォルトの名無しさん
2008/02/13(水) 12:19:490587デフォルトの名無しさん
2008/02/13(水) 12:20:57fstream は読み書き両用。読み取り専用の ifstream を渡せないのはあたりまえ。
なんで ifstream& にしないの?
0588580
2008/02/13(水) 12:26:17レスありがとうございます。
まあ動くけど将来にわたって安全とは言い難い、
ってかやはり>>581推奨ってとこですかね。
>>584
あくまでサンプルなんで御容赦ください。
でもお気遣い感謝します。
0589デフォルトの名無しさん
2008/02/13(水) 12:46:25まずい点を指摘したら言い訳ってどーなんだ
0590デフォルトの名無しさん
2008/02/13(水) 12:46:29ファイルストリームのクラス階層を確認してみるべき。
fstreamとifstreamは継承階層の中で関係が全く無い。
0591デフォルトの名無しさん
2008/02/13(水) 12:53:03いや、質問の主眼が"taking address of temporary"のWARNINGでしたので。
その他は瑣末なことと手を抜いてしまいました。
とりあえずお詫びまで。
0592デフォルトの名無しさん
2008/02/13(水) 12:56:480593デフォルトの名無しさん
2008/02/13(水) 13:03:19ちょっとややこしいけど、そのコードには、一般によくある勘違いにかすっている
君独自の勘違いがある。
まず、ifstreamはistreamを継承してる。fstreamは、iostreamを継承してる。
そのiostreamが、istreamとostreamを継承してるから、つまり両者に共通する近い祖先はistream。
iostreamはistreamの子だけど、fstreamはifstreamの子ではない。これが一般に良くある勘違い。
で、君はこれを踏まえて、fstreamにifstreamを渡すという、更なる勘違いをしてる。
読み書き両用クラス「が」読み取り専用クラス「の」子であるのは明白なわけで、つまり君は、
このセンスがまだ身についていないか、あるいは、普通に渡すだけでダウンキャストが可能になるという、
C++の仕様に対する勘違いをしていることになる。
0594デフォルトの名無しさん
2008/02/13(水) 13:19:140595デフォルトの名無しさん
2008/02/13(水) 13:36:470596デフォルトの名無しさん
2008/02/13(水) 13:47:04そんなくどい説明必要ない。
クラス階層見れば一発で分かる。
他人の勘違いまでも決め付けるなんて教えたがりも甚だしい。
0597デフォルトの名無しさん
2008/02/13(水) 14:10:16現実に「クラス階層見てない」人なんだし、
他に可能性が無い状況は決めつけとは言わないよ。
変な理屈で変なスイッチ入っちゃった人に絡まれるのってやだなぁ。
0598デフォルトの名無しさん
2008/02/13(水) 15:23:56は何かヘッダをincludeした後じゃないとだめなの?
0599デフォルトの名無しさん
2008/02/13(水) 15:28:190600デフォルトの名無しさん
2008/02/13(水) 15:39:470601デフォルトの名無しさん
2008/02/13(水) 15:41:550602デフォルトの名無しさん
2008/02/13(水) 15:46:10これを機会にusing namespace std;をグローバルに置くのを
やめちまいなよ
0603デフォルトの名無しさん
2008/02/13(水) 15:50:50mainの中?
0604デフォルトの名無しさん
2008/02/13(水) 15:58:420605602
2008/02/13(水) 16:00:48いや、mainの中の先頭に置いても良いけど
スコープはmain内だけであってまぁ・・なんていうか・・・
using namespace std;の宣言自体を俺は勧めない
0606デフォルトの名無しさん
2008/02/13(水) 16:11:52原則 using を使わず全部書くのが推奨だな
0607デフォルトの名無しさん
2008/02/13(水) 16:18:05面倒でもこういう記法に慣れるが吉。
0608デフォルトの名無しさん
2008/02/13(水) 16:25:190609デフォルトの名無しさん
2008/02/13(水) 16:39:53using std::swap;
using boost::swap;
using 俺ライブラリ::swap;
(definition内で)
using namespace boost::spirit;
これしか使ってないな
0610デフォルトの名無しさん
2008/02/13(水) 16:44:03おれもそう思う。stdにいろいろ詰め込み過ぎだ。
0611デフォルトの名無しさん
2008/02/13(水) 16:55:48専用の名前空間に放り込んでusing namespace ::boost::mpl;してから
共通名前空間にエイリアスとなるメタ関数を書くようにする
ぐらいは許してください
0612デフォルトの名無しさん
2008/02/13(水) 18:52:47名前空間のエイリアスnamespace hoge = boost::mpl;で十分では?
それに限らず、cppファイル内ではよくやるんだが。
namespace bll = boost::lambda;
namespace algo = boost::algorithm;
namespace dr = System::Drawing;
0613デフォルトの名無しさん
2008/02/13(水) 22:36:33専用の名前空間でも使わない方がいいよ
0614デフォルトの名無しさん
2008/02/13(水) 22:52:15出来立てのValueが返ってきますか?
0615デフォルトの名無しさん
2008/02/13(水) 22:55:30■ このスレッドは過去ログ倉庫に格納されています