Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 按键时出现SDL2 SEG故障_C_Graphics_3d_Keyboard_Segmentation Fault - Fatal编程技术网

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