LINUX.ORG.RU

Можно ли так?

 


0

1

Написать программу чтобы она читала текстовый файл и при его изменении меняла свою поведение, то есть править не исходный код и компилировать - а рассчитать так чтобы правя этот текстовый файл программа делала что-то(желательно всё что требуется) от запуска к запуску



Последнее исправление: bad_master (всего исправлений: 1)

Ответ на: комментарий от bigbit

ну вот скажем я пишу игру - чтобы добавить новый объект в игру - надо создать переменную а может и не одну и с ней работать, а у меня компилируется час игра - это утомительно, а если написать какой-то обработчик файлика с переменными и методами - типа парсера то игра грузится 5 минут. Экономия времени

bad_master
() автор топика
Последнее исправление: bad_master (всего исправлений: 1)
Ответ на: комментарий от bad_master

а у меня компилируется час игра - это утомительно, а если написать какой-то обработчик файлика с переменными - типа парсера то игра грузится 5 минут.

блин, у него игра компилируется час…это сколько там миллионов строк? и при этом он ничего не знает про скриптовые языки. типа lua и все такое. можешь даже лисп туда приделать, по имени guile.

alysnix ★★★
()
Ответ на: комментарий от bad_master

ну вот скажем я пишу игру - чтобы добавить новый объект в игру - надо создать переменную а может и не одну и с ней работать

Конкретно в играх для этого подключают скрипты на языке lua. В сталкере так сделано, например.

ox55ff ★★★★★
()
Ответ на: комментарий от DumLemming

странно что такую кнопку еще не сделали

bad_master
() автор топика

Этот файл называется файлом конфигурации. Пиши, разрешаю. Можешь даже готовый парсер взять.

hateyoufeel ★★★★★
()

Если я правильно понял то вот

  • нажми R - перезагрузить конфигурацию и применить её к программе
  • нажми T - автоматически следить за конфигурацией и при изменении файла конфигурации перезагрузить файл конфигурации и применить к программе
  • нажми Q - выход

Код говно, но суть думаю понятна.

my_config.txt лежит в том же каталоге что и программа

window_x = 550
window_y = 550
window_name = lalala

программа

#include <SDL2/SDL.h>
#include <stdio.h>
#include <sys/stat.h>

typedef struct
{
    SDL_Window *window;
    int window_x;
    int window_y;
    char * window_name;
}my_config;

my_config default_config = {NULL,500,500,"Default window name"};

void load_config(const char * filename, my_config * conf)
{
    FILE * config = fopen(filename,"r");

    fseek(config,0,SEEK_END);
    size_t filesize = ftell(config);
    fseek(config,0,SEEK_SET);

    while(ftell(config) != filesize)
    {
      char name[512];
      char vale[512];

      fscanf(config, "%64s = %64s", name, vale);

      if(strcmp(name,"window_x") == 0)
      {
         conf->window_x = atoi(vale);
      }

      if(strcmp(name,"window_y") == 0)
      {
         conf->window_y = atoi(vale);
      }

      if(strcmp(name,"window_name") == 0)
      {
         if(conf->window_name != NULL)
         {
             free(conf->window_name);
         }
         char *str = malloc(strlen(vale)+1);
         sprintf(str,"%s",vale);
         conf->window_name = str;
      }

    }


    fclose(config);

};

int check_config(const char * filename)
{
    static long long old_time = 0;
    struct stat   current_state;
    FILE * file = fopen(filename,"rb");
    if(!file)
    {
        printf("LOL\n");
    }
    int err = fstat(fileno(file), &current_state);
    
    printf("%lld %zu\n",old_time,current_state.st_mtime);
    fclose(file);
    if(current_state.st_mtime > old_time)
    {
        old_time = current_state.st_mtime;
        return 1;
    }

       return 0;
}


void update_my_game(my_config * config)
{
   SDL_SetWindowTitle(config->window,config->window_name);
   SDL_SetWindowSize(config->window,config->window_x,config->window_y);
}

int main(int argc, char* argv[])
{

    my_config config ;
    int running = 1;
    int auto_update = 0;
    int t1 = 0;
    SDL_Init(SDL_INIT_EVERYTHING);

    config.window = SDL_CreateWindow(
        default_config.window_name,
        SDL_WINDOWPOS_UNDEFINED,
        SDL_WINDOWPOS_UNDEFINED,
        default_config.window_x,
        default_config.window_y,
        SDL_WINDOW_OPENGL);


        SDL_Event event;

    while(running)
    {
        
        while(SDL_PollEvent(&event))
        {
            if(event.type == SDL_KEYDOWN)
            {
                const Uint8 *state = SDL_GetKeyboardState(NULL);

                if (state[SDL_SCANCODE_R])
                {
                    printf("Reload config & Update configuration KEK \n");
                    load_config("my_config.txt",&config);
                    update_my_game(&config);

                }

                if (state[SDL_SCANCODE_T])
                {
                    printf("ENABLED AUTO Reload config & ENABLED AUTO Update configuration LUL \n");
                    auto_update = 1;
                }

                if (state[SDL_SCANCODE_Q])
                {
                    running = 0;
                }
             }
        }

        int t2 = SDL_GetTicks();

        if(auto_update && t2 > t1)
        {

            t1 = t2 + 1000;
            int updated = check_config("my_config.txt");
            if(updated)
            {
                printf("Auto Update\n");
                load_config("my_config.txt",&config);
                update_my_game(&config);
            }
        }

    }

    if (config.window == NULL) {

        printf("Could not create window: %s\n", SDL_GetError());
        return 1;
    }
    SDL_DestroyWindow(config.window);
    SDL_Quit();
    return 0;
}
gcc main.c `pkg-config --libs sdl2` && ./a.out 

Вместо простейшего конфига что я привёл можно взять libconfig или ещё что получше или ini какой.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)
Ответ на: комментарий от bad_master

у меня компилируется час игра - это утомительно, а если написать какой-то обработчик файлика с переменными и методами - типа парсера то игра грузится 5 минут. Экономия времени

https://en.wikipedia.org/wiki/Incremental_compiler

antares0 ★★★★
()

Чёт вспомнился старый анекдот про «я тут написал программу, а она не запускается. Не подскажете где у меня ошибка?»

pr849
()
Ответ на: комментарий от bad_master

сдл не удобный - в нем нет UI

Плохому мастеру всегда что-то мешает!
В твоем исходном вопросе не содержится требование UI, так что жри что дают, если у самого котелок не варит!

sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 1)
Ответ на: комментарий от bad_master

А причём тут UI? Я сделяль что-бы наглядно было, есть программа у неё есть состояние в виде конфигурации, есть конфиг файл где это состояние описано. Есть два режиме работы ты изменил конфиг надал R конфиг перезагрузился программа обновилась или ты нажал T и программа сама будет обновляться если после редактирования ты просто сохранишь конфиг. Изменения программы заключаются в том что ты можешь менять размер окна и заголовок окна из конфига. Я думал тебе так понятнее будет, нагляднее можно было просто консольное приложение сделать с той же сутью.

Брать код наверное смысла нет, но есть смысл взять концепцию. Тебе сначала надо спроектировать программу свою так что-бы она имела состояние в виде набора переменных, и загружала это состояние из конфигурационного файла сама отслеживая его или путём выбора файла конфигурации или/и перезагрузке текущего файла.

Если например ты из конфига хочешь создавать кнопки из размер и положение то в программе нужен массив кнопок который может меняться в зависимости от конфига и то что рисует кнопки должно уметь отрисовывать из из массива (массива структур) произвольного размера, сам массив формируется по данным из конфига.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от bad_master

ну вот скажем я пишу игру

В играх как правило используюся какие-нибудь скриптовые языки типа lua и js.

Tanger ★★★★★
()

Пиши на QML. Тут тебе и гуй (Qt Quick), и быстрый запуск, и куча плюшек для удобства.

unC0Rr ★★★★★
()
Ответ на: комментарий от alysnix

блин, у него игра компилируется час…это сколько там миллионов строк?

Думаю если сделать рефакторинг, то будет быстрее комплироваться

Djema
()
Ответ на: комментарий от Djema

видимо не компилируется, а собирается.

рефакторинг надо делать когда уже счет идет на 5-10 минут. растаскивать хотя бы по статическим библиотекам.

alysnix ★★★
()
Ответ на: комментарий от bad_master

php. У него есть функциональность, сперва сгенерировать код, потом его выполнить.

azsx
()
Ответ на: комментарий от bad_master

В некоторых играх так сделано, куча текстовых конфигов и скриптов, берёшь да правишь. Поведение игры может серьёзно меняться.

alex1101
()

То, что ты хочешь — скриптовый движок. Тебе нужен Lua.

InterVi ★★★★★
()
Ответ на: комментарий от bad_master

Осиль инкременталтную компиляцию. Даже всякие монстры типа Юнити при небольших изменениях компилируются секунды, а не часы. А кастомный движок без батареек на все случаи жизни будет ещё быстрее собираться.

А так, когда нужна сильная кастомизируемость поведения, то в приложение добавляют скриптовой движок. Например, lua, python или js. Иногда создают свой велосипед.

KivApple ★★★★★
()
Ответ на: комментарий от bad_master

А, ну так вставь язык Lua в свою прогу - это решит многое и жизнь облегчит

solom
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.