मेरा प्रोग्राम सेगफॉल्ट क्यों करता है?


मैं एसडीएल 2.23.6 और जीसीसी 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

कम से कम, आपको यह पहचानना चाहिए कि आपका प्रोग्राम किस लाइन पर सेगफॉल्ट करता है।
एक डिबगर के साथ इसमें आगे बढ़ें और यदि आप यह समझ लें कि यह किस लाइन पर ऐसा करता है, तो आप संभवतः यह बताने में सक्षम होंगे कि ऐसा क्यों है।

इसके अलावा, आपको वास्तव में यह समझना चाहिए कि आपको ये चेतावनियाँ क्यों मिलती हैं, और यह सुनिश्चित करने के लिए उचित कार्रवाई करनी चाहिए कि कोई चेतावनी न हो।

コメント

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