Войти
ПрограммированиеФорумОбщее

Движок на Си (13 стр)

Advanced: Тема повышенной сложности или важная.

Страницы: 112 13 14 1518 Следующая »
#180
(Правка: 13:28) 13:27, 25 июня 2019

mr.DIMAS

Пора чистить тему. Своих защитников тоже не забудь.. среди них были адекватные но вот этот exchg обкуренный какой то. У него последняя стадия Си, на больных нельзя обижаться.


#181
(Правка: 13:38) 13:36, 25 июня 2019

slepov
> Пора чистить тему.
Тебе уже стыдно? ))) Я считаю написанное нужно оставить. Нового не добавлять.

> вот этот exchg обкуренный какой то.
Попросил меня аргументировать мои глупые высказывания. А завтра он еще потребует чтобы я читал название темы!

#182
14:38, 25 июня 2019

slepov
> Движки давно стало нелесообразно писать на С.
С веществ слезайте.

#183
15:41, 25 июня 2019

NyakNyakProduction
> С веществ слезайте.
трололо

#184
16:31, 25 июня 2019

slepov
> Пора чистить тему
Да это бессмысленно, пусть лучше все видят кто во что горазд.

#185
(Правка: 16:42) 16:42, 25 июня 2019
slepov
> Пора чистить тему
Без обид, но эта фраза показывает тебя с довольно плохой стороны.
Нагадить в чужой теме, а потом просто сказать автору, что ему следует убрать за тобой. А теперь вопрос. Для этого ли mr.DIMAS создавал тему? Я не думаю, что он мечтает убирать мусор за всякими несдержанными личностями.

Старался высказать свои мысли как можно культурнее.

mr.DIMAS
А проект Shooter у тебя на GitHub'е - это просто демка для движка или у тебя есть планы на разработку полноценной игры?

#186
16:45, 25 июня 2019

Vlad2001_MFS
> А проект Shooter у тебя на GitHub'е - это просто демка для движка или у тебя
> есть планы на разработку полноценной игры?
Пока что это демка со всеми фичами движка - огромный тест по сути. Я потихоньку развиваю его, но намного медленнее чем сам движок.

#187
20:06, 25 июня 2019

Почистите тему, невозможно этот бред читать

#188
22:14, 25 июня 2019

движок вноси !

#189
(Правка: 14:15) 14:15, 26 июня 2019

Чот меня эта наркомания тоже торкнула, переписькиваю свое двихло на пури Цэ.

#190
(Правка: 27 июня 2019, 0:37) 22:48, 26 июня 2019

Коллеги, а есть ли возможность вызвать функцию с произвольным количеством аргументов? Я не про stdarg.h сейчас, хотя этот механизм можно тоже как то использовать наверное.

Допустим есть разные функции:

int f1(int a)
int f2(int *a)
int f3(void)
int f4(int b, int c)
int f5(Mesh* m)
и так далее

хотелось бы их положить в список,массив - пройтись по нему и вызвать их.

typedef int(*PF)(void);

struct A {
   PF func;
}
A func_list[10];

func_list[0].func = f2; // не сработает, типы другие, но мысль обозначил
func_list[1].func = f4;

for (int i=0; i<10; i++) {
    func_list[i].func(); // и вот тут бы хотелось разных параметров
}

#191
0:01, 27 июня 2019

u960
Так сделай по принципу printf. Первым аргументом указывай формат, а вторым уже кастомные аргументы.

#192
(Правка: 1:41) 1:39, 27 июня 2019

u960
> Коллеги, а есть ли возможность вызвать функцию с произвольным количеством
> аргументов?

typedef void (*function_t)(); 

static                                             
void f1(int a)
{
    printf("%s:%d: '%s' : %ul\n", 
           __FILE__, __LINE__, __func__, a); 
}


static                                             
void f2(int a, int b)
{                                                  
    printf("%s:%d: '%s' : %ul, %ul\n",
           __FILE__, __LINE__, __func__, a, b); 
}                                                  


int main(int argc, char* argv[]) 
{                                                  
    function_t func = f1;           
    func(123);                                     
    
    func = f2;                                     
    func(321, 321);                                
}
#193
2:23, 27 июня 2019

exchg
ого, да это же основа для event-driven
в своё время по незнанию использовал boost::bind/boost::apply

#194
3:39, 27 июня 2019

#!
> в своё время по незнанию использовал boost::bind/boost::apply

Используя С++ ты лишаешься этой магии - он запретит вызывать func от непонятного числа аргументов. Там func(void) есть то же самое что и func(). Это называется строгая типизация.
В Си же от рождения были некоторые "проблемы" со строгой типизацией. Си тогда во многом был транслятором наподобие ассемблеров и вызов функции был лишь одним из способов использовать символ (именованную метку) и название этой метки на момент вызова не обязано было быть известным.
Т.е. компилятор мог вызвать в любом месте модуля трансляции функции вообще не зная что она такое и есть ли она вообще. Проблему того есть ли она вообще решал на втором этапе компиляции линкер - просто вставлял адреса меток в уже откомпилированный код.
И вот тут возникла проблема - как вызвать функцию вообще не имея на руках ни её имени ни параметров? И тут Си сделал очень просто - все параметры по сути приводились к int (точнее - слову) и важно было соблюсти только их число и чтобы они влезли в слово - первое должен был обеспечить программист (и как мы видим выше - мог и не обеспечивать), а второе - отсутствие возможности передачи в параметрах сложных структур данных - на структуры и массивы можно было передавать только указатели на них, которые тоже укладывались в слово. char же просто расширялся до int.
Ну и третье - подчищать стек от переданных параметров должна была не вызванная функция, а вызывающий код, тогда даже если он передаст больше параметров чем надо - это может не привести к падению программы в рантайме если в первых не передана чушь. Кроме того всегда считалось, что функция возвращает опять же слово, а если не возвращала по факту, то просто мусорное значение.

Остатки этого поведения мы видим в функции main которую можно объявлять даже в С++ как угодно - с параметрами или без и даже менять тип возвращаемого аргумента, это всё в некоторых рамках считается допустым компилятором C++. Ранние компиляторы Си же вообще не делали ничего специального для такого поведения - оно было основой их работы.

В общем когда повводили типов данных не укладывающихся в int и устали отлавливать блохи в падениях программы на ровном месте из-за неправильно переданных в функции параметров - тогда эти все фишки существенно изменили и подрезали, но остатки такого поведения в Си в режиме совместимости и в особых случаях (например есть разница между func(void) и func() - второе это "неспицифицированные параметры") остатки его сохранились.

Страницы: 112 13 14 1518 Следующая »
ПрограммированиеФорумОбщее