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

时间:2015-04-28 20:01:00

标签: c++ codeblocks

我不知道我的问题在哪里。我尝试编译一次代码并且它有效。但是,我将它复制到一个新项目中以便修改它,只是颜色或等待的时间,它只适用于第一个程序。 怎么了?我感到非常沮丧。 使用此代码,我想绘制正弦函数。 这是我的代码:

#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;

}   

1 个答案:

答案 0 :(得分:1)

在搞乱你的源代码之后我对它进行了一些修改,这就是我想出来的,我得到它来编译并运行返回没有错误退出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或null状态。我如果你没有选择使用nullptr指针,你仍然可以使用0或NULL,但首选nullptr!这样,所有指针都没有设置或指向内存中的任何内容。

我做的第二个改变是你有几个演员的电话!而不是这样做:

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

我这样做:

someInt += static_cast<int>( someFloat ); 

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

至于你在代码中的错误,直到我在调用相应的函数之前设置你声明为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 );

发生的事情是您将Bit Depth设置为0,然后将R颜色掩码设置为32,因为BitMasks使用十六进制值而不是整数或无符号值,因此未正确定义int。

以下是此功能文档的链接:SDL::CreateRGBSurface

至于能否成功编译,链接和构建取决于您的操作系统,IDE以及如何为此库配置项目/解决方案设置!

我希望这会对你有所帮助! :)