別関数に渡す変数のポインタが難しい
構造体初心者で、ポインタもよく分かっていません。
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;
}
お礼
回答頂きありがとうございます。 >i = 8; >QueueState = dequeue(UartSendBuf[i]); 大変申し訳ありません。QueueState = dequeue(&UartSendBuf[i]); &をつけ忘れていました。 訂正して頂きありがとうございました。 >改造とかかれてますが >>x[0]=QBuf[Head]; >のことでしょうか? そのコードであれば >*x=QBuf[Head]; >と書いているのと同じですので結果は変わりません これはやはり同じ意味になるのですね。 この質問内で2重に質問してしまったのですが、一応自分の理解が正しいか判断したくてしてしまいました。 QueueState = dequeue(&UartSendBuf[8]); この関数の引数で渡しているデータはアドレスの番号なのですね。 &UartSendBuf[8]これのアドレスが0xFFFF08だったならば、関数内の”*x”も”x[0]”も 0xFFFF08というアドレスだということになるんですね。x[1]=0xFFFF09,x[2]=0xFFFF0A ということになって行くんですね。 なんとなくですが、メモリ番地というのを意識するようになってよりマイコンの内部の仕組みが漠然とわかるようになりました。C言語とかわからなくても(それじゃダメじゃん)マイコンなどのIOレジスタ設定などはまさに住所に行って手紙を出しに行くみたいな感覚ですね。 それぞれの作業にkoi1234さんがおっしゃっているような専門用語がすでについているようなので、追って勉強していきたいと思います。