进程返回 255 (0xff) 个代码块

process returned 255 (0xff) code blocks

我不知道我的问题出在哪里。我试着编译一次代码,它成功了。但是,我将它复制到一个新项目中以修改它,只是颜色或等待时间,它只适用于第一个程序。 怎么了?我真的很沮丧。 使用此代码,我想绘制正弦函数的图形。 这是我的代码:

#include <stdio.h>
# include <SDL.h>
# include <math.h>
# define PI 3.141592
# define SCREEN_WIDTH 640
# define SCREEN_HEIGHT 480

int main(int argc, char **argv){

   int x,y;

   double fx,angulo;

//   Uint8* posicion;

   Uint32 color;

   SDL_Window*win = SDL_CreateWindow("y=sin(x)", 100,100, 640, 480, 0);


//   SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION,"info", "Window      creada",win);

   SDL_Renderer*ren = SDL_CreateRenderer(win, -1,   SDL_RENDERER_ACCELERATED    |     SDL_RENDERER_PRESENTVSYNC);

  /* Create surface */

  SDL_Surface*surface =   SDL_CreateRGBSurface(0,SCREEN_WIDTH,SCREEN_HEIGHT,0,32,0,0,0);


  //get the pixels

  Uint32*pixels = (Uint32*)surface-> pixels;


  /* Lock the surface */

  SDL_LockSurface(surface);


   color = SDL_MapRGB(surface-> format, 255, 0, 0);

   for(x=0;x<360;x++){

      angulo=x*PI/180;

      fx=240+50*sin(angulo);

      y=round(fx);

       pixels[ ( y* surface-> w ) + x ] = color;

     }

    /* Unlock the surface */

    SDL_UnlockSurface(surface);


    //imprescindible

   SDL_Texture *tex = SDL_CreateTextureFromSurface(ren, surface);

   SDL_RenderCopy(ren,tex,NULL,NULL);

   SDL_RenderPresent(ren);

   SDL_Delay(1000);

  return 0;

}   

在弄乱了你的源代码后,我对它做了一些修改,这就是我想出的,我让它编译并且 运行 退出 main() 时没有返回任何错误。只需确保您当前的项目或解决方案指向此 SDL 库的包含目录和静态库文件的适当包含文件,并确保您的 dll 与此项目的可执行文件位于同一目录中.还要确保您使用的是适用于 x86 或 64 位的适当构建。

#include <stdio.h>
#include <SDL.h>
#include <math.h>

const float PI 3.141592;
const int SCREEN_WIDTH 640
const int SCREEN_HEIGHT 480

int main( int argc, char **argv ) {
    int x = 0;
    int y = 0;
    double fx = 0;
    double angulo = 0;
    Uint32 color = 0;

    SDL_Window* win = nullptr;
    win = SDL_CreateWindow( "y=sin(x)", 100, 100, 640, 480, 0);

    SDL_Renderer* ren = nullptr;
    ren = SDL_CreateRenderer( win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC );

    SDL_Surface* surface = nullptr;
    surface = SDL_CreateRGBSurface( 0, SCREEN_WIDTH, SCREEN_HEIGHT, 32, 0, 0, 0, 0 );

    Uint32* pixels = nullptr;
    pixels = static_cast<Uint32*>( surface->pixels );

    SDL_LockSurface(surface);
    color = SDL_MapRGB( surface-> format, 255, 0, 0 );
    for( x=0; x<360; x++ ){
        angulo = x * PI / 180;
        fx = 240 + 50 * sin( angulo );
        y = static_cast<int>( round( fx ) );
        pixels[ ( y* surface-> w ) + x ] = color;
    }
        SDL_UnlockSurface( surface );

        SDL_Texture *tex = nullptr;
        tex = SDL_CreateTextureFromSurface( ren, surface );

        SDL_RenderCopy( ren, tex, NULL, NULL );
        SDL_RenderPresent( ren );
        SDL_Delay( 1000 );

        return 0;
}

我只做了一些更改,首先是我更喜欢对全局变量使用 const 值,而不是 #DEFINES。第二个是声明的任何变量,我将它们全部初始化为有效的 0 或空状态。如果您没有为指针使用 nullptr 的选项,您仍然可以使用 0 或 NULL,但首选 nullptr!这样你所有的指针都没有设置或指向内存中的任何东西。

我做的第二个改变是你接到的几个选角电话!而不是这样做:

int someInt = 10;
float someFloat = 0.0f;
someInt += (int)someFloat;

我改为这样做:

someInt += static_cast<int>( someFloat ); 

如果您没有使用 static_cast<>()、dynamic_cast<>()、reinterprest_cast<>() 的选项,那么您可以继续从以您的方式将一种数据类型转换为另一种数据类型。我喜欢我选择使用的转换方法有两个原因,一个是它更安全、更清晰的代码阅读,另一个是当你返回它时用户甚至你自己都可以很容易地看到你正在使用哪种类型转换!

至于你在代码中的错误,直到我在调用适当的函数之前首先将你声明的所有指针设置为 nullptr 并在你的 SDL_CreateRGBSurface() 你有:

 ... = SDL_CreateRGBSurface( 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 32, 0, 0, 0 );

这应该是:

... = SDL_CreateRGBSurface( 0, SCREEN_WIDTH, SCREEN_HEIGHT, 32, 0, 0, 0, 0 );

发生的事情是您将位深度设置为 0,然后将 R 颜色掩码设置为 32,这对于 int 没有正确定义,因为 BitMasks 使用十六进制值而不是整数或无符号值。

这是关于此函数的文档的 link:SDL::CreateRGBSurface

至于能否成功编译、link 和构建,这取决于您的 OS、IDE 以及您如何为该库配置项目/解决方案设置!

希望对您有所帮助! :)