После баловаться с исходным кодом я изменил его немного, и это то, что я придумал, и я получил его для компиляции и запуска не возвращается никаких ошибок от выхода основных(). Просто убедитесь, что ваш текущий проект или решение указывает на соответствующие файлы include как для каталогов include, так и для файлов статической библиотеки для этой библиотеки 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;
}
Существовал лишь несколько изменений, которые я сделал, во-первых, я предпочитаю использовать константные значения для глобалов в отличие от #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, который для междунар не определен правильно, так как битмаски использовать шестнадцатеричные значения и не interger или без знака.
Вот ссылка на документацию по этой функции: SDL::CreateRGBSurface
Что касается возможности для успешной компиляции, компоновки и построить это зависит от вашей ОС, IDE, и как у вас есть настройки проекта/решения сконфигурировано для этого библиотека!
Надеюсь, это поможет вам! :)
Итак, что именно не работает? – deviantfan
Какая IDE и версия вы используете, а какая платформа и архитектор - ваша машина? –
Код :: блоки 13.12 –