2015-04-28 2 views
0

Я не знаю, где моя проблема. Я попытался скомпилировать код один раз, и он сработал. Однако я скопировал его в новом проекте, чтобы изменить его, просто цвет или время ожидания, и он просто работает в первой программе. Что не так? Я чувствую себя очень расстроенным. С помощью этого кода я хочу графически отобразить функцию синуса. Вот мой код:процесс возвратил 255 (0xff) блоков кода

#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

Итак, что именно не работает? – deviantfan

+1

Какая IDE и версия вы используете, а какая платформа и архитектор - ваша машина? –

+0

Код :: блоки 13.12 –

ответ

1

После баловаться с исходным кодом я изменил его немного, и это то, что я придумал, и я получил его для компиляции и запуска не возвращается никаких ошибок от выхода основных(). Просто убедитесь, что ваш текущий проект или решение указывает на соответствующие файлы 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, и как у вас есть настройки проекта/решения сконфигурировано для этого библиотека!

Надеюсь, это поможет вам! :)

+0

вы потрясающие! Я очень благодарен за вашу помощь !!!!! Теперь я понимаю, что вы имеете в виду, и я буду применять его на практике в следующих моих кодах: D –

+0

Добро пожаловать! Лучшая часть - у меня нет формального обучения или каких-либо кредитов в колледже по программированию, информатике или разработке программного обеспечения. Все, чему я научился, изучается самостоятельно, путем исследования, проб и ошибок. Поскольку моя страсть или желание в 3D-рендеринге, анимации и разработке Game Engine, мой выбор предпочтительного языка - это C++, который является одним из самых сложных языков для овладения другими, а затем самой сборкой. Я бы сказал, что я на промежуточном уровне. Мне еще многое предстоит узнать. Вот почему я люблю помогать другим, укрепляя мои собственные навыки. –

+0

действительно? вы все узнали сами? awesome ¡ –

Смежные вопросы