トップページ⇒tech
1001コメント296KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/04/24(木) 07:23:05
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。
【前スレ】
【初心者歓迎】C/C++室 Ver.59【環境依存OK】(実質Ver.52)
http://pc11.2ch.net/test/read.cgi/tech/1206809426/
【アップローダー】(質問が長い時はココ使うと便利)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
0232デフォルトの名無しさん2008/04/27(日) 18:20:58
逆に低級言語で頭が止まってるんじゃないかと
02332232008/04/27(日) 18:25:15
>>228-230
ありがとうございます。納得です。
reinterpret_castの使いどころなんですね。
0234デフォルトの名無しさん2008/04/27(日) 18:42:37
>>231
アセンブラを教えてくれる幼稚園や小学校があるならぜひ紹介してくれ
0235デフォルトの名無しさん2008/04/27(日) 18:45:52
>>234
関係ないが、ロシアにはハッキング教室がある。
企業情報を盗んで生計を立ててる卒業生もいるらしい。
0236デフォルトの名無しさん2008/04/27(日) 18:53:07
俺も幼稚園からやってたな小学校でアナログ時計とか作ってた
本の英小文字とキーボードの大文字がリンクとれなくて大文字のフリガナを親に書いてもらってたのを思い出した
0237デフォルトの名無しさん2008/04/27(日) 18:55:59
なんかPC6001に会いたくなってきた
0238デフォルトの名無しさん2008/04/27(日) 19:53:59
***.exe 等の実行可能ファイルを実行したらどうなりますか?
いったんメモリに命令群が展開されてそこから(?)実行されると思うのですが、
プログラムがメモリのどの位置に配置されたか分る方法ってないのでしょうか?
メモリに配置されたプログラムをダンプするプログラムを作りたいです (´・ω・`)
ヒントだけでもいいので教えてください。よろしくお願いします。
0239デフォルトの名無しさん2008/04/27(日) 20:26:07
>>238
ヒントどぞ〜

ttp://codezine.jp/a/article.aspx?aid=403
ttp://www.interq.or.jp/chubu/r6/reasm/PE_FORMAT/intro.html
0240デフォルトの名無しさん2008/04/27(日) 20:35:26
>>239
ヒントどうもありがとうございます。色々調べてるんですが、なにぶん初心者なもので理解に苦しみます ^^;
OpenProcess に ReadProcessMemory , CloseHandle 色々あって難しいですね。。。
0241デフォルトの名無しさん2008/04/27(日) 20:45:43
あまり好き勝手に他のプロセスに干渉できる作りだとセキュリティ的に問題アリだろ。
それでもWindowsはヌルい方なんだけどな。
0242デフォルトの名無しさん2008/04/27(日) 21:22:54
ファイルを削除する処理のあるコード書くときはいつも緊張する
0243デフォルトの名無しさん2008/04/27(日) 21:50:59
わかるw
0244デフォルトの名無しさん2008/04/27(日) 21:54:35
削除するだけじゃなくて上書きがありうる場合もね。
必ずテスト気を付けてしてるよ。
0245デフォルトの名無しさん2008/04/27(日) 22:00:16
テンプレートクラスの親クラスを作って、それを継承した子クラスを作ったとき、子クラスから親クラスのメソッドを
参照できないのは、どうしてそういう仕様になっているのでしょうか?
this->付けたりとかusingしたりすれば良いのは知識としては知っているのですが、いまいちこの仕様に納得できません。
template <typename T>
class base {
public:
void func() {}
};

template <typename T>
class deri : public base<T> {
public:
void func2() {func();}
};
みたいにしたときです。
0246デフォルトの名無しさん2008/04/27(日) 23:00:06
func2 から見えるところにフリー関数の func があったりすると
T によって呼ばれる関数がフリー関数になったり、メンバ関数になったりするのが
わかりにくくて嫌な挙動だからだと思う
0247デフォルトの名無しさん2008/04/27(日) 23:15:46
#include <windows.h>
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
){
MessageBox(NULL,"Kitty on your lap","メッセージです", MB_OK);
return 0;
}

これってどこか間違ってますか?
0248デフォルトの名無しさん2008/04/27(日) 23:16:30
Linux環境なんだけど、gccとg++から両方リンクできるライブラリってどうやって作るの?

gcc -c func1.c func2.c
ar rcs libtest.a func1.o func2.o

だとオブジェクトファイルを生成したコンパイラでしかリンクできない
0249デフォルトの名無しさん2008/04/27(日) 23:33:32
>>247
bccならそれでコンパイル通るけど、VC++なら

#include <windows.h>
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
TCHAR *lpCmdLine,
int nCmdShow
){
MessageBox(NULL,_T("Kitty on your lap"),_T("メッセージです"), MB_OK);
return 0;
}

こうやってうにこーどにしなきゃ駄目
0250デフォルトの名無しさん2008/04/27(日) 23:34:04
>>248
つ[extern "C"]
02512492008/04/27(日) 23:35:05
あ、#include <tchar.h>を追加するの忘れてた
0252デフォルトの名無しさん2008/04/28(月) 00:15:18
>>246
返答ありがとうございます。
でも、先の例だとTに何が来ても、func()はbaseクラスに必ず存在すると思うんですが、、、
違いますか?
フリー関数というのは、baseクラスやderiクラスの外部にある関数ということですよね?
0253デフォルトの名無しさん2008/04/28(月) 00:15:39
>>250
おお、できた
サンクス!
0254デフォルトの名無しさん2008/04/28(月) 00:18:45
>>252
T内でtypedef 〜 func
とかやってる可能性もあるから。
0255デフォルトの名無しさん2008/04/28(月) 00:21:55
質問です。
テンプレートクラス内で、別のテンプレートクラスを使用する時にエラーが出ます。


例:
template< class TYPE > class List
{
// Listに使うメソッドなど
};

template< class TYPE > class AAA
{
public :
List< TYPE > m_List; // ←エラー
};


凄く初歩的な質問かもしれませんが、何が悪いんでしょうか?
0256デフォルトの名無しさん2008/04/28(月) 00:26:44
どんなエラーが出るんだよ
0257デフォルトの名無しさん2008/04/28(月) 00:27:13
>T内でtypedef 〜 func
ごめんよく読んでなかった。間違い
02582462008/04/28(月) 00:29:08
>>252
template<> class base<int> {};
02592232008/04/28(月) 00:29:30
typename List<TYPE> m_LIST;
でどうよ?
0260デフォルトの名無しさん2008/04/28(月) 00:35:43
>>256
すいませんちょっと違いました。

例:
template< class TYPE > class List
{
  // Listに使うメソッドなど
};

template< class TYPE > class AAA
{
public :
  function() { m_List.Add( new T ); }  // ←「m_List」は宣言されていません

  List< TYPE > m_List;
};

って感じにエラーが出ます。


>>258
やってみましたが、やっぱりエラーが出ます。。。
0261デフォルトの名無しさん2008/04/28(月) 00:39:16
だから、どんなエラーが出るんだよ
0262デフォルトの名無しさん2008/04/28(月) 00:41:49
説明が・・・orz

function() { m_List.Add( new TYPE ); }  の間違いです。


>>258
エラーは、「m_Listが宣言されてません」と出ます。
また、この例ではメソッドをクラス内で書いてありますが、
実際にはクラス定義のすぐ下で、

{
〜〜〜クラス定義
};

templeate< class TYPE > typename
class AAA::function()
{
  m_List.Add( new TYPE );
}

のような感じでヘッダーファイルに記述してあります。
0263デフォルトの名無しさん2008/04/28(月) 00:43:00
>>261
C2065 m_Listは定義されていない識別子です。

とでます。
0264デフォルトの名無しさん2008/04/28(月) 00:47:33
>>260
g++ ならそのまま普通に通る。VCの場合は知らんけど
g++ -ansi -pedantic
でも通るからC++標準からみて問題はなさそう。

問題が再現するソース作ってコピペし、VC++使いに見てもらうのが良し。
0265デフォルトの名無しさん2008/04/28(月) 00:53:11
VC9でも>>260の例の部分はコンパイル通る
0266デフォルトの名無しさん2008/04/28(月) 00:54:05
すいません、単純に「m_List」に当たる名前を間違えてましたorz

本当にすいません;
お騒がせしました。
0267デフォルトの名無しさん2008/04/28(月) 00:55:00
あと回答してくださってありがとうございました。
もう少し勉強してからまた来ます;
0268デフォルトの名無しさん2008/04/28(月) 00:57:34
もう来なくていいように勉強してください。
0269デフォルトの名無しさん2008/04/28(月) 00:57:53
>>257
>>258
ありがとうです。
テンプレートの特殊化があるために、baseクラスの定義が信用できないということですね?
0270デフォルトの名無しさん2008/04/28(月) 02:46:37
メモリダンプツール作りたいが手順がよく分らない。。。
プロセスIDの指定→メモリ上の位置の取得→指定されたサイズだけデータを読み込む→ファイルに保存
といった感じかな??メモリ上の位置の取得とデータの読み込みの方法が分らない。。。。
誰かサンプルコードを書いてくれ。いや、サンプルコードを提供して頂けないでしょうか?
よろしくお願いします。
0271デフォルトの名無しさん2008/04/28(月) 02:51:20
自分で作るよりソフトを探した方が早そうだけど
0272デフォルトの名無しさん2008/04/28(月) 03:01:29
>>271
ツール自体は持ってるんですけど、どんな風に動作してるのか、動作原理に興味があって質問しました。
邪魔になるようだったら以降控えます。すみませんでした。
0273デフォルトの名無しさん2008/04/28(月) 03:13:10
>>272
OSは?
0274デフォルトの名無しさん2008/04/28(月) 03:15:25
すみません。OSはXPです。
0275デフォルトの名無しさん2008/04/28(月) 03:21:52
274の脳内にはOSと言えばWindowsしか存在しないようだ。
それはともかくReadProcessMemory。
あとOpenProcessも必要になるかな。
0276デフォルトの名無しさん2008/04/28(月) 04:36:53
質問ばかりですいません。
テンプレート化されたクラスは、特殊化すれば中身は全然違うクラスになりうるということですよね?
どうしてこんな仕様になっているのでしょうか?特殊化する際は、インターフェイスは特殊化する前の
ものと同じにしないとだめ、という仕様の方がよっぽど自然な感じがするのですが、、
なんかいいことがあるんですか?
template <typename T>
class base {
public:
int a;
};
template <>
class base<int> {
public:
void a() {
std::cout << "aaaa" << std::endl;
}
};
0277デフォルトの名無しさん2008/04/28(月) 07:13:54
すいません、最近C言語を始めた初心者です。
Borland C++Compilerとbcpadがあればcとc++の開発はだいたいできますか?
0278デフォルトの名無しさん2008/04/28(月) 07:51:40
gccとVisual C++ Expressを勧める。
0279デフォルトの名無しさん2008/04/28(月) 07:57:21
C++(またはC++0x)の規格に完全に準拠したコンパイラはありますか。exportとかも使えたり。
その代わりpragmaが一切ないとか、実用性0でもいいです。
0280デフォルトの名無しさん2008/04/28(月) 10:55:20
内部にファンクタへのポインタを持っているクラスがあるとして、そのクラスからファンクタを呼び出すときは、
operator()(引数)と書かなくてはならないですか?
class aaa {
public:
functor* fp;
};
class functor {
public:
int operator()(int);
};

aaa A;
A.fp->operator()(10); // これはコンパイルできる
A.fp(10); // これはできない。
これはしょうがないですか?
0281デフォルトの名無しさん2008/04/28(月) 11:23:21
これでは駄目?


class A {
public:
int m;
A(){m=0;}
A(int n) {m=n;} };


class B {
public:
A *p;
B(int n){p=new A; p->m=n;}
};


main(){
B z(10);
}
0282デフォルトの名無しさん2008/04/28(月) 11:37:39
functor& rf = *A.fp;
rf(10);
0283デフォルトの名無しさん2008/04/28(月) 11:38:59
(*A.fp)(10)
0284デフォルトの名無しさん2008/04/28(月) 14:49:29
aaaのoperator()(int)からfp->()(int)呼べばいいんじゃね
0285デフォルトの名無しさん2008/04/28(月) 15:20:08
>>276
メタプロにおけるテンプレート特殊化というのは、通常プログラミングの
文脈で言う条件分岐(switch)にあたる。
実利的には、特殊化が無いとboostライブラリの大半が実現できなかったり
能力が落ちたりする。
boost/utility/enable_if.hppなんかは何やってるか解りやすいと思う。
0286デフォルトの名無しさん2008/04/28(月) 18:32:09
>>279
export が使える、準拠率の最も高いコンパイラとして知られているのは Comeau C++ だな。
0287デフォルトの名無しさん2008/04/28(月) 20:14:24
#include <stdio.h>

main()
{
printf("hello!");
return 0;
}
をコンパイルしてできたexeファイルをダブルクリックしてもコマンド
プロントっぽいのが一瞬でて消えてしまいます

コマンドプロントからhello.exeで使用するとちゃんとhello!と表示されます
前者のほうはOSが壊れていたりするからですか?
不安なのでアドバイスください;;
0288デフォルトの名無しさん2008/04/28(月) 20:16:41
コマンドプロンプト用のプログラムをダブルクリックで起動した場合は
プログラムが終了するとコマンドプロンプトも一緒に終了する。
そういうもん。
0289デフォルトの名無しさん2008/04/28(月) 20:20:18
>>288
ありがとうございます

自己解決しました
0290デフォルトの名無しさん2008/04/28(月) 20:23:24
氏ね
0291デフォルトの名無しさん2008/04/28(月) 20:28:20
おいおい、とんでもない発言してやがるな…。
0292デフォルトの名無しさん2008/04/28(月) 20:29:26
>>285
みてみましたが、使い方とかがよくわかりません。ソースも中身がカラで無意味そうに見える(けど本当は意味があるんだろう)テンプレートばっかりで
ピンと来ませんでした。とりあえず
boost.org/libs/utility/
でも見てみます。あと、メタプログラミングを知れば利点がわかるということですか?
ありがとうございました。
0293デフォルトの名無しさん2008/04/28(月) 22:07:28
実際に使えば納得できるよ
0294デフォルトの名無しさん2008/04/28(月) 22:25:51
>>290 >>291
ごめんなさい、コンパイルしないで書き込んじゃいました
コンパイルしたらまた書き込みます
0295デフォルトの名無しさん2008/04/29(火) 01:47:26
今まで学校でC++やってたんですが、家でやろうとVC++9.0インストールしたら単純なプログラムもコンパイル出来ません(Тωヽ)

error C4430ってのが出て、もう意味不明です。どういう事なんでしょう?
0296デフォルトの名無しさん2008/04/29(火) 01:48:54
顔文字貼る余裕があるならソースくらい貼ろうよ…
0297デフォルトの名無しさん2008/04/29(火) 01:50:01
>>295
オマイが今まで書いてきたプログラムはC++のような何かだったってこと
0298デフォルトの名無しさん2008/04/29(火) 01:56:00
>>296

#include<studio.h>
main()
{
}

これすらコンパイル出来ません…
0299デフォルトの名無しさん2008/04/29(火) 01:57:18
ミス

<stdio.h>
0300デフォルトの名無しさん2008/04/29(火) 01:59:34
int main()
{
}
0301デフォルトの名無しさん2008/04/29(火) 02:01:23
学校に騙されてたんだな
「C++はintを既定値としてサポートしていません」とか書かれてないか?
0302デフォルトの名無しさん2008/04/29(火) 02:01:36
#include <stdio.h>

int main(void)
{ return 0; }
0303デフォルトの名無しさん2008/04/29(火) 02:02:32
拡張子を.cppから.cに変更する
0304デフォルトの名無しさん2008/04/29(火) 02:04:36
出来ました。ありがとうございますm(__)m

>>301
書いてあります。
0305デフォルトの名無しさん2008/04/29(火) 02:06:18
>>304
次からはそういう大事な情報を隠さないでくださいね
0306デフォルトの名無しさん2008/04/29(火) 02:07:55
>>305

はい、すみません。
0307デフォルトの名無しさん2008/04/29(火) 03:49:16
>>292 これならわかるだろうか?

template<class X, class Xs>
struct List;

struct Nil;

template<class Xs, class X>
struct Cons
{
typedef List<X, Xs> type;
};


template<class Xs, class X>
struct Append;

template<class X, class Xs, class Y>
struct Append<List<X, Xs>, Y>
{
typedef Cons<X, typename Append<Xs, Y>::type> type;
};

template<class X>
struct Append<Nil, X>
{
typedef typename Cons<X, Nil>::type type;
};
0308デフォルトの名無しさん2008/04/29(火) 06:10:13
>>307
ありがとうございます。でもmain関数が書けません(泣)
簡単でいいですから、main関数も書いてもらえませんか?

0309デフォルトの名無しさん2008/04/29(火) 07:17:22
int main(){return 0;}
0310デフォルトの名無しさん2008/04/29(火) 07:39:34
>>309
それくらいなら書けます。
0311デフォルトの名無しさん2008/04/29(火) 14:06:38
はじめまして質問させていただきます。
class MyShip{
private:
float x;
float y;
public:
void GetMyShipLocation(float* X,float* Y);
void SetMyShipDefault();
void MoveMyShip(int keybordstate);
};
void GetMyShipLocation(float* X,float* Y){
*X = x;
*Y = y;
}
GetMyShipLocation関数を使って、描画関数に値を渡したいのですが、
値がぶっとんでしまい、-107374176.000000と表示されてしまいます
自分ではもう訳がわからなくなってしまいました。解決方法をご教示願います。
0312デフォルトの名無しさん2008/04/29(火) 14:10:31
メンバのx,y初期化した?
0313デフォルトの名無しさん2008/04/29(火) 14:11:46
はい。
SetMyShipDefault関数を初回に動かして、
x = -55.0f;
y = 100.0f;
という値を入れています。
0314デフォルトの名無しさん2008/04/29(火) 14:27:10
>>311
色々とダメすぎ。C++を真面目に勉強することをお勧めする。
それはさておき、「描画関数」と「値を渡す」ところと、「値がぶっ飛んでしまう」ところのソースを晒せ。
0315デフォルトの名無しさん2008/04/29(火) 14:30:20
[値を渡す場所]
VOID GameBody( HWND hWnd ){

FPS_NOW = timeGetTime();
if(FPS_FLAG < 0){ FPS_FPS = 1000/(FPS_NOW-FPS_LAST) ; FPS_FLAG = 20 ;}
else{FPS_FLAG--;}
int keystatus = getKeybordState( g_pKeyboard );
char bill[256];
sprintf( bill, "%f %f %.02f" , g_Billbord[9].objPos.x , g_Billbord[9].objPos.y , FPS_FPS);
if(g_FullScreenFlag == FALSE){SetWindowText( hWnd , bill );}
switch(GameFlag){
case GAME_STANDBY:
MyShip Player;
Player.SetMyShipDefault();
GameFlag = GAME_START ;
break;
case GAME_START:
//Player.MoveMyShip(keystatus);
Player.GetMyShipLocation(&g_Billbord[9].objPos.x , &g_Billbord[9].objPos.y );
break;
}


FPS_LAST = FPS_NOW;
return;
}
0316デフォルトの名無しさん2008/04/29(火) 14:36:05
謎の関数とか定数とか多すぎ
DxLibって奴か?
0317デフォルトの名無しさん2008/04/29(火) 14:39:04
ダメだこりゃ。
0318デフォルトの名無しさん2008/04/29(火) 14:39:53
-107374176は0xccccccccだから
vcのデバッグビルド時の未初期化変数の値と一致する
0319デフォルトの名無しさん2008/04/29(火) 14:40:52
とりあえず、メンバの初期化はコンストラクタでやろうね
0320デフォルトの名無しさん2008/04/29(火) 14:43:20
case GAME_STANDBY:
MyShip Player; どう見ても原因はここだろ
0321デフォルトの名無しさん2008/04/29(火) 14:45:08
そんなんでコンパイル通るんだ…
0322デフォルトの名無しさん2008/04/29(火) 14:46:00
スコープがまったく理解できてないの?
0323デフォルトの名無しさん2008/04/29(火) 14:50:34
>>320
その通りでしたorz
すみません、自分でもすっかり見落としてました。
回答してくださった皆様、お手数おかけしました。
0324デフォルトの名無しさん2008/04/29(火) 14:53:48
自分でもまさかそんな事は無いだろうと、GameBody側のソースを全く見直してませんでした。
久々に寝ることにします・・・。
0325デフォルトの名無しさん2008/04/29(火) 22:29:14
エラー出るんだけどなぜですか?
#include <stdio.h>


main()
{
int c;
scanf("%c", &c);
printf("%c", c);[
return 0;
}
エラー E2188 001.cpp 8: 式の構文エラー(関数 main() )
0326デフォルトの名無しさん2008/04/29(火) 22:29:46
その[なにw
0327デフォルトの名無しさん2008/04/29(火) 22:31:28
>>325
どんまいw
03283252008/04/29(火) 22:37:25
あ・・・
すいません;; ありがとうございました
0329デフォルトの名無しさん2008/04/30(水) 02:41:59
すいません、質問したいのですが・・・。

VisualStudio2005でライブラリを作りたくて色々試行錯誤してみたのですが・・・。
いまいちよくわからない状態でして。

用途についてですが、自分は学生でゲームを作っています。
言語では
DirectX
OpenGL
を使っています。
それに自分で使いやすいようにライブラリを作るつもりで調べてみました。

どうかやさしくおねがいします・・・・。
0330デフォルトの名無しさん2008/04/30(水) 02:43:21
>>329
さっさと質問すれば?
0331デフォルトの名無しさん2008/04/30(水) 02:45:47
>>329
これが簡単

DarkGDK
http://pc11.2ch.net/test/read.cgi/tech/1208941132/
■ このスレッドは過去ログ倉庫に格納されています