【解決方法】私のプログラムでセグメンテーション違反が発生するのはなぜですか?

[ad_1]

SDL 2.23.6 と gcc 12.3 を使用しています。 コンパイルしてリンクすると、いくつかの警告が表示されるだけです。

引用:

警告: 「SDL_OpenAudioDevice」の引数 3 を渡すと、キャストなしで整数からポインタが作成されます

例えば。

私が試したこと:

#include <stdio.h>
#include <stdlib.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_audio.h>

#define SAMPLE_RATE 44100
#define CHANNELS 1
#define BUFFER_SIZE 512

int main(int argc, char *argv[]) {
  // Initialize SDL.
  if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0) {
    printf("SDL could not be initialized: %s\n", SDL_GetError());
    return 1;
  }

  // Create a window and renderer.
  SDL_Window *window = SDL_CreateWindow("Audio Spectrum", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN);
  SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);

  // Create an audio device.
  SDL_AudioDeviceID device = SDL_OpenAudioDevice(NULL, 0, AUDIO_S16SYS, SAMPLE_RATE, BUFFER_SIZE);
  if (device == 0) {
    printf("Failed to open audio device: %s\n", SDL_GetError());
    return 1;
  }

  // Allocate memory for the audio buffer.
  short *buffer = malloc(BUFFER_SIZE * sizeof(short));

  // Create a texture to render the audio spectrum.
  SDL_Texture *texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGB24, SDL_TEXTUREACCESS_TARGET, 640, 480);

  // Main loop.
  while (1) {
    // Get the audio samples from the device.
    SDL_AudioStreamGet(device, buffer, BUFFER_SIZE);

    // Calculate the audio spectrum.
    int i, j;
    for (i = 0; i < BUFFER_SIZE; i++) {
      int sample = buffer[i];
      for (j = 0; j < SAMPLE_RATE/256; j++) {
        if (sample >= j * 256 / SAMPLE_RATE) {
          // Set the pixel at (i, j) to red.
          SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
          SDL_RenderDrawPoint(renderer, i, j);
        }
      }
    }

    // Render the audio spectrum.
    SDL_RenderClear(renderer);
    SDL_RenderCopy(renderer, texture, NULL, NULL);
    SDL_RenderPresent(renderer);

    // Sleep for a millisecond.
    SDL_Delay(10);
  }

  // Free resources.
  SDL_DestroyTexture(texture);
  SDL_Free(buffer);
  SDL_CloseAudioDevice(device);
  SDL_DestroyRenderer(renderer);
  SDL_DestroyWindow(window);
  SDL_Quit();

  return 0;
}

解決策 1

少なくとも、プログラムのどの行でセグメンテーション違反が発生しているかを特定する必要があります。
デバッガーを使用してステップ実行し、どの行でそのような処理が行われているかを確認できれば、おそらくその理由がわかるでしょう。

また、これらの警告が表示される理由をよく理解し、警告が表示されないように適切な措置を講じる必要があります。

[ad_2]

コメント

タイトルとURLをコピーしました