C 按键时出现SDL2 SEG故障
我的程序在我按下一个键的时候就出现了故障,但我无法找到一个最小的代码。如果我注释掉C 按键时出现SDL2 SEG故障,c,graphics,3d,keyboard,segmentation-fault,C,Graphics,3d,Keyboard,Segmentation Fault,我的程序在我按下一个键的时候就出现了故障,但我无法找到一个最小的代码。如果我注释掉像素[y][pdpix]=col[sampleX][sampleY](第110行),按键操作正常。否则,它就会出现故障 完整代码和“bmp”文件: main.c中的代码: #include <SDL2/SDL.h> #include <stdbool.h> #include "read.h" #define RESX 960 #define RESY 540 #define HRESX 48
像素[y][pdpix]=col[sampleX][sampleY]代码>(第110行),按键操作正常。否则,它就会出现故障
完整代码和“bmp”文件:
main.c中的代码:
#include <SDL2/SDL.h>
#include <stdbool.h>
#include "read.h"
#define RESX 960
#define RESY 540
#define HRESX 480
#define DRAWDISTANCE 360
#define ROTSPEED 0.005
#define BGCOL 0
#define ARESY 539
void main() {
readCW();
bool running = true;
SDL_Window* window = NULL;
SDL_Renderer* renderer = NULL;
if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) {
printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
running = false;
}
window = SDL_CreateWindow("SDL Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, RESX, RESY, SDL_WINDOW_SHOWN );
if( window==NULL) {
printf( "SDL_Error: %s\n", SDL_GetError() );
running = false;
}
renderer = SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED);
if(renderer==NULL) {
printf("Renderer error: %s\n", SDL_GetError() );
running = false;
}
SDL_Texture * texture = SDL_CreateTexture(renderer,
SDL_PIXELFORMAT_RGB888, SDL_TEXTUREACCESS_STREAMING, RESX,RESY);
readBW();
float playerX = 512;
float playerY = 512;
float dirX = 0.0;
float dirY = 1.0;
void rotatez(float rotspeed) {
float oldDirX = dirX;
dirX = dirX * cos(rotspeed) - dirY * sin(rotspeed);
dirY = oldDirX * sin(rotspeed) + dirY * cos(rotspeed);
}
const Uint8* keystate = SDL_GetKeyboardState( NULL );
while( running ) {
clock_t t1, t2;
t1 = SDL_GetTicks();
Uint32 pixels[RESY][RESX] = {[0 ... RESY-1][0 ...RESX-1] = 0x5555FF};
SDL_Event e;
running = !(SDL_PollEvent( &e ) && e.type == SDL_QUIT);
if(keystate[SDL_SCANCODE_ESCAPE]) running = false;
if(keystate[SDL_SCANCODE_LEFT]) rotatez(-ROTSPEED);
if(keystate[SDL_SCANCODE_RIGHT]) rotatez(ROTSPEED);
if(keystate[SDL_SCANCODE_W]) {
playerY += dirY;
playerX += dirX;
}
if(keystate[SDL_SCANCODE_S]) {
playerY -= dirY;
playerX -= dirX;
}
if(keystate[SDL_SCANCODE_A]) {
playerY -= dirX;
playerX += dirY;
}
if(keystate[SDL_SCANCODE_D]) {
playerY += dirX;
playerX -= dirY;
}
//rotatez(-ROTSPEED);
playerY -= dirY;//for testing
playerX -= dirX;//for testing
int heightBuffer[RESX] = {[0 ... 959] = RESY};
int playerHeight = 80;//disp[(int)playerX][(int)playerY] + 50;
int dpix = 0;
for( int dDist = 1; dDist < DRAWDISTANCE; dDist+=1) {
for( int pix = -dDist; pix < dDist; pix++) {
int pdpix = dpix;
dpix = (pix/(float)dDist+1) *HRESX;
int sampleX = (int)playerX + dDist*dirX + pix*-dirY;
int sampleY = (int)playerY + dDist*dirY + pix*dirX;
int height = disp[sampleX][sampleY];
int heightOnScreen = ( ((float)playerHeight - height) / dDist * 240 + 240); //alg for persp proj
if(heightOnScreen > 0 && heightOnScreen < RESY) {
for( pdpix; pdpix < dpix; pdpix++) {
if(heightOnScreen < heightBuffer[pdpix]) {
for(int y = heightBuffer[pdpix]; y > heightOnScreen; y-=1) {
pixels[y][pdpix] = col[sampleX][sampleY]; //if I comment out this line, segfault goes away.
}
heightBuffer[pdpix] = heightOnScreen;
}
}
}
}
}
SDL_UpdateTexture(texture, NULL, pixels, RESX * sizeof(Uint32));
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent( renderer );
t2 = SDL_GetTicks();
printf("%ld fps\n", 1000/(t2-t1));
}
SDL_DestroyWindow( window );
SDL_DestroyRenderer( renderer );
SDL_DestroyTexture( texture );
SDL_Quit();
}
#包括
#包括
#包括“read.h”
#定义RESX 960
#定义RESY 540
#定义HRESX 480
#定义绘图距离360
#定义旋转速度0.005
#定义bgcol0
#定义ARESY 539
void main(){
readCW();
bool running=true;
SDL_Window*Window=NULL;
SDL_渲染器*渲染器=NULL;
if(SDL_Init(SDL_Init_视频)<0){
printf(“SDL无法初始化!SDL_错误:%s\n”,SDL_GetError());
运行=错误;
}
window=SDL_CreateWindow(显示SDL窗口、SDL_WINDOWPOS_未定义、SDL_WINDOWPOS_未定义、RESX、RESY、SDL_窗口);
如果(窗口==NULL){
printf(“SDL_错误:%s\n”,SDL_GetError());
运行=错误;
}
渲染器=SDL\u CreateRenderer(窗口,-1,SDL\u渲染器\u加速);
if(渲染器==NULL){
printf(“渲染器错误:%s\n”,SDL_GetError());
运行=错误;
}
SDL_纹理*纹理=SDL_CreateTexture(渲染器,
SDL_像素格式_RGB888,SDL_纹理访问_流媒体,RESX,RESY);
readBW();
float playerX=512;
float playerY=512;
float dirX=0.0;
浮动dirY=1.0;
无效旋转(浮动旋转速度){
float-oldDirX=dirX;
dirX=dirX*cos(旋转速度)-dirY*sin(旋转速度);
dirY=oldDirX*sin(旋转速度)+dirY*cos(旋转速度);
}
const Uint8*keystate=SDL_GetKeyboardState(NULL);
(跑步时){
时钟t1,t2;
t1=SDL_GetTicks();
Uint32像素[RESY][RESX]={[0…RESY-1][0…RESX-1]=0x5555FF};
SDL_事件e;
running=!(SDL_PollEvent&e)和&e.type==SDL_QUIT);
if(keystate[SDL\u SCANCODE\u ESCAPE])running=false;
if(键状态[SDL\U扫描代码\U左])rotatez(-ROTSPEED);
if(键状态[SDL\U扫描代码\U右])rotatez(旋转速度);
if(键状态[SDL\U扫描代码\U W]){
playerY+=dirY;
playerX+=dirX;
}
if(键状态[SDL\U扫描代码\U S]){
嬉戏表演-=迪里;
playerX-=dirX;
}
if(键状态[SDL\U扫描代码\U A]){
playerY-=dirX;
playerX+=dirY;
}
if(键状态[SDL\U扫描代码\U D]){
playerY+=dirX;
playerX-=dirY;
}
//rotatez(-ROTSPEED);
playerY-=dirY;//用于测试
playerX-=dirX;//用于测试
int heightBuffer[RESX]={[0…959]=RESY};
int playerHeight=80;//disp[(int)playerX][(int)playerY]+50;
int-dpix=0;
对于(int-dDist=1;dDist0&&屏幕高度屏幕上的高度;y-=1){
像素[y][pdpix]=col[sampleX][sampleY];//如果我注释掉这一行,segfault就会消失。
}
heightBuffer[pdpix]=屏幕上的高度;
}
}
}
}
}
SDL_UpdateTexture(纹理,NULL,像素,RESX*sizeof(Uint32));
SDL_渲染复制(渲染器、纹理、空、空);
SDL_渲染器呈现(渲染器);
t2=SDL_GetTicks();
printf(“%ld fps\n”,1000/(t2-t1));
}
SDL_窗口(窗口);
SDL_渲染器(渲染器);
SDL_破坏纹理(纹理);
SDL_退出();
}
在尝试访问一个阵列(pixels
或col
)时,似乎出现了故障。检查y
,pdpix
,sampleX
,sampleY
的精确值。它们不应该超出数组边界的范围。关于:void main(){
对于main()
函数只有两个有效的签名。它们是:int main(void)
和int main(int argc,char*argv[])
注意,它们的返回类型都是int
,而不是void