別関数に渡す変数のポインタが難しい
構造体初心者で、ポインタもよく分かっていません。
12, 8
と表示するつもりのソースだけど、実行結果は違っていました。
直してください。
ソースは長いけど、スケルトンに構造体とTextOutを付けたぐらいのものです。
#include <windows.h>
struct MYOBJ
{
int a;
int b;
};
LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
MSG msg;
WNDCLASS wc;
投稿できなかったからここを消しました。
wc.lpszClassName = "x";
if(RegisterClass(&wc) == 0)return 0;
HWND hWnd = CreateWindow("x","",WS_OVERLAPPEDWINDOW|WS_VISIBLE,0,0,320,240,NULL,NULL,hInst,NULL);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
void myfunc(struct MYOBJ *obj)//ここが違うかもしれません。
{
obj->a += 2;
obj->b -= 2;
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
char buf[30];
switch(uMsg)
{
case WM_CREATE:
struct MYOBJ myobj;
myobj.a = 10;
myobj.b = 10;
myfunc(&myobj);//ここが違うかもしれません。
return 0;
case WM_PAINT:
hDC = BeginPaint(hWnd, &ps);
wsprintf(buf, "%d, %d", myobj.a, myobj.b);
TextOut(hDC, 0, 0, buf, strlen(buf));
EndPaint(hWnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
お礼
なるほど! ありがとうございます。 少々ややこしい分量の作業で確認してみました。 ある関数を返り値dobleにしておいて中身を次のようにし struct a{ double b; double d; a(){ b=1; d=2;} a(double c) : b(c), d(c*10) {} a(double c,double f) : b(c), d(f*7) {} }; struct e{ int b; int d; e() : b(2), d(3) {} e(int c){ b=c; d=c*10;} e(int c,int f) { b=c; d=f*7;} }; a A,AA(7),AAA(3.1,-5.0); e B,BB(5),BBB(0,4); return (/*ここでインスタンスを作った全ての構造体のbとd全てを足します*/); 返った値は、確かに正しく『136.1』でした。 ということは、「:」はこの場合「コンストラクタ特有のもの」という解釈で正解ですか? …ということは、bleisさんの hogeのvala は、valにaがくっついているのかな…?そういう宣言が何か出来るのか…?と、自分の知識を不安に思いましたが 実際にはごくシンプルで、些細なタイプミスという事で大丈夫でしょうか? templateはクラス/関数に対して使用可… …ならば 「構造体に対して」は、templateは使えない、のでしょうか? あと一つ あるクラスのヘッダにtemplate<>つきの関数を宣言し ソースに内容を書きます。 それを、別クラスのメンバにそのクラスを持たせて そのインスタンスからその関数を呼び出そうとすると 「外部参照が未解決です」 絡みのエラーが出てきて、ビルドが出来ません。 これはどのような場合に発生して、またどうすれば解決できるのでしょうか?
補足
私もタイプミスです(笑) "double"ですね。