1. ホーム
  2. c++

[解決済み] プロセスは255 (0xff) コードブロックを返しました [閉鎖]。

2022-02-17 20:58:22

質問内容

私の問題がどこにあるのかわかりません。一度コンパイルしてみたのですが、うまくいきました。しかし、私はそれを新しいプロジェクトにコピーして、色や待ち時間を変更しようとしたのですが、最初のプログラムではうまくいきました。 どうしたのでしょうか?本当に悔しいです。 このコードで正弦関数をグラフィックしたいのです。 以下は私のコードです。

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

}   

解決方法は?

ソースコードをいじった後、少し修正して、以下のようなものになりました。現在のプロジェクトやソリューションが、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;
}

1つ目は、グローバルには#DEFINESではなくconst値を使用するようにしたことです。もうひとつは、宣言されたすべての変数を有効な0またはNULLの状態に初期化することです。ポインターにnullptrを使用するオプションがない場合、0またはNULLを使用することもできますが、nullptrを使用することをお勧めします。こうすることで、すべてのポインタがメモリ上の何かに設定されたり、指し示されたりすることはありません。

2つ目の変更点は、キャストの呼び出しが少なかったことです。 代わりにこうしました。

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

代わりにこうしています。

someInt += static_cast<int>( someFloat ); 

static_cast<>(), dynamic_cast<>(), reinterprest_cast<>() を使う選択肢がない場合は、今の方法で、あるデータ型から別のデータ型にキャストし続けることができます。1つは、より安全できれいなコードを読むことができること、もう1つは、ユーザーや自分自身でさえ、どの型のキャストを使用しているかを簡単に確認することができるためです。

コードのバグについては、あなたが宣言しているポインターをすべて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に設定したのですが、ビットマスクは16進数値を使用し、整数値や符号なし値ではないので、int型では正しく定義されていません。

この関数のドキュメントへのリンクはこちらです。 SDL::RGBSurfaceの作成

コンパイル、リンク、ビルドに成功するかどうかは、OS、IDE、プロジェクト/ソリューションの設定に依存します。

お役に立てれば幸いです。:)