C 调用更改结构VAL的函数时出现问题

C 调用更改结构VAL的函数时出现问题,c,function,struct,sdl,C,Function,Struct,Sdl,如果我调用移动球/查找碰撞的函数,它将不起作用。但是,如果我输入函数的内容,将“b”替换为“ball1”,它确实可以工作。为了修复它,我尝试了很多很多很多方法,但都没有成功。很抱歉,代码太长了,但如果只包含一个片段,恐怕无法修复 代码: #包括“SDL/SDL.h” #包括“SDL/SDL_image.h” #包括 #包括 #定义屏幕宽度500 #定义屏幕高度500 #定义屏幕_BPP 32 #定义重力1 SDL_表面*图像=空; SDL_表面*屏幕=空; SDL_事件; SDL_曲面*加载图像

如果我调用移动球/查找碰撞的函数,它将不起作用。但是,如果我输入函数的内容,将“b”替换为“ball1”,它确实可以工作。为了修复它,我尝试了很多很多很多方法,但都没有成功。很抱歉,代码太长了,但如果只包含一个片段,恐怕无法修复

代码:

#包括“SDL/SDL.h”
#包括“SDL/SDL_image.h”
#包括
#包括
#定义屏幕宽度500
#定义屏幕高度500
#定义屏幕_BPP 32
#定义重力1
SDL_表面*图像=空;
SDL_表面*屏幕=空;
SDL_事件;
SDL_曲面*加载图像(字符*文件名){
SDL_曲面*optimizedImage=NULL;
SDL_表面*LoadeImage=IMG_加载(文件名);
如果(LoadeImage!=NULL){
optimizedImage=SDL_DisplayFormat(LoadeImage);/*优化图像*/
SDL_自由曲面(加载图像);
}
返回优化年龄;
}
无效应用曲面(int x,int y,SDL_曲面*源,SDL_曲面*目标){
垂直偏移量;
偏移量x=x;
偏移量y=y;
SDL_BlitSurface(源、空、目标和偏移);
}
bool initSDL(无效){
if(SDL_Init(SDL_Init_EVERYTHING)=-1){
返回NULL;
}
屏幕=SDL_设置视频模式(屏幕宽度、屏幕高度、屏幕BPP、SDL_表面);
如果(屏幕==NULL){
返回NULL;
}
SDL_WM_SetCaption(“反弹”,空);
返回true;
}
/*清洁所有需要的东西*/
空洞清理(SDL_曲面*图像){
SDL_自由曲面(图像);
SDL_退出();
}
/*面向对象的Ball结构*/
结构球{
int x;
int-y;
int-vy;
intvx;
SDL_表面*图像;
};
/*初始化球结构*/
结构球\u initBall(int x,int y,int vy,int vx,char*文件名){
结构球b;
b、 x=x;
b、 y=y;
b、 vy=vy;
b、 vx=vx;
b、 image=loadImage(文件名);
返回b;
}
无效球移动(结构球b){
b、 x+=b.vx;
b、 y+=b.vy;
b、 vy+=重力;
}
空心球与墙碰撞(结构球b){
如果(b.x=500-48){
b、 vx*=-1;
}
如果(b.y=500-49){
b、 vy*=-0.95;
}
}
int main(int argc,char*argv[]){
bool running=true;
initSDL();
struct Ball ball1=Ball_initBall(屏幕高度/2,屏幕宽度/2,1,3,“resources/Ball.jpg”);
(跑步时){
applySurface(ball1.x、ball1.y、ball1.image、screen);
球移动(球1);
ball_Wall碰撞(ball1);
while(SDL_事件和事件)){
if(event.type==SDL\u QUIT){
运行=错误;
}
}
SDL_翻转(屏幕);
SDL_FillRect(屏幕,&屏幕->剪辑,SDL_映射RGB(屏幕->格式,0,0,0));
SDL_延迟(50);
}
清理(1.图像);
返回0;
}

ball\u move
ball\u wallclide
按值获取其
ball
参数。这意味着他们将获得调用方实例的副本。如果要更新调用方的实例,则需要传递指向该实例的指针

void ball_move(struct Ball* b) {
    b->x += b->vx;
    b->y += b->vy;
    b->vy += GRAVITY; 
}
并更改调用以传递要更新的
球的地址

ball_move(&ball1);

定义“不起作用”。到目前为止你尝试了什么调试?是的,我可能应该尝试。球不动了。
ball_move(&ball1);