ncurses でボールを左右にバウンドさせようとしています。通常の構造体を印刷し、その構造体のポインターを関数に渡すと、これを正常に機能させることができます。
次のコードを実行すると、構造体要素のメモリ アドレスと思われるものが出力され、それらのアドレスに含まれる実際の値は出力されません。私が理解していないのは、最初のコードが機能しないのに、2 番目のコードが機能する理由です。私はポインターを台無しにしていると確信していますが、どこにあるのかわかりません。
悪いコード、
typedef struct Ball ball;
int width=80, height=20; //screen height/width in characters
struct Ball{
char shape;
int x;
int y;
int velX;
int velY;
};
ball* initBall(int X, int Y, int velx, int vely, char shape){
ball b;
ball *p = &b;
p->x = X;
p->y = Y;
p->velY = vely;
p->velX = velx;
p->shape = shape;
return p;
}
void moveBall(ball *b){
if(b->x +b->velX > width || b->x + b->velX < 0){
b->velX *= -1;
}
if(b->y +b->velY > height || b->y +b->velY< 0){
b->velY *= -1;
}
b->x += b->velX;
b->y += b->velY;
}
int main(){
ball *p = initBall(40,10,1,0, 'O');
int counter=0;
while(counter < 10){
printf("%d, %d\n", p->x, p->y);
moveBall(p);
counter++;
}
return 0;
}
良いコード、
typedef struct Ball ball;
int width=80, height=20; //screen height/width in characters
struct Ball{
char shape;
int x;
int y;
int velX;
int velY;
};
ball initBall(int X, int Y, int velx, int vely, char shape){
ball b;
ball *p = &b;
b.x = X;
b.y = Y;
b.velY = vely;
b.velX = velx;
b.shape = shape;
return b;
}
void moveBall(ball *b){
if(b->x +b->velX > width || b->x + b->velX < 0){
b->velX *= -1;
}
if(b->y +b->velY > height || b->y +b->velY< 0){
b->velY *= -1;
}
b->x += b->velX;
b->y += b->velY;
}
int main(){
ball b = initBall(40,10,1,0, 'O');
ball *p = &b;
int counter=0;
while(counter < 10){
printf("%d, %d\n", p->x, p->y);
moveBall(p);
counter++;
}
return 0;
}