Цитата(Непомнящий Евгений @ Nov 9 2007, 09:21)

Когда вы вызываете функцию, компилятору надо знать типы передаваемых параметров и тип возвращаемого значения, чтобы расположить все это на стеке и в регистрах нужным образом.
Если вызвать функцию void func(char t), используя указатель void (*P)(void*), то что из этого получится будет целиком зависеть от реализации компилятора. Например, если аргументы передаются в стеке и функция должна их выбрать сама, то будет плохо.
Тут второй вопрос - а зачем вам это надо? Что значит - передать аргумент неизвестного типа? Максимум - это указатель void*... Но смешивать указатель и char, как в вашем примере - ИМХО, прямой путь поиметь кучу траблов.
И не только от реализации компилятора будет зависеть результат... Но так же еще и от специфики архитектуры процессора тоже будет зависеть. Мне не хотелось тут просто этого касаться...
Но я согласен с тем, что поставленная в топе задача - достаточно надуманная или выковырянная из левой ноздри. Таких гарантированных общих решений обычно не бывает. Нужно знать конкретику ибо решение таких вещей "в общем" - это будет практически попытка переноса идеи "виртуальной функции" в термины С, которая для С как бы не совсем естественна. Можно же еще захотеть решить задучу вызова любой функции с любым списком параметров тоже... И заставить потом объектный код во всем этом разбираться, но вот зачем такие навороты и чего ради - совершенно неясно.
Неясна цель и неопределена расплата за такую универсальность. Гонка за чрезмерной универсальностью - это либо недопонимание задачи, либо некий фанатизм. А вот реальная задача - всегда гораздо понятнее...
Цитата(Jurdens @ Nov 9 2007, 11:26)

А задача такая запускать произвольную функцию по таймеру через время
Time. У запускаемой функции неизвестен тип параметра (так надо ) в общем случае и возвращаемый параметр
для этого мы должны передать ее адрес в функцию.
DelayStart(unsigned Time, *Func(?));
Подумал в С++ есть механизм передачи по ссылке F(&data1,&Func1) может тут как то поэксперементировать?
Первый вопрос - а зачем надо неизвестный тип параметра? Я почти уверен, что практически всегда можно свести параметры всех вызываемых функций к одному типу... Ниже скажу как...
Механизм передачи по ссылке - есть вообще практически в любом языке - это просто: в стек кладется не значение параметра, а его адрес. В С - естественно он тоже есть...
В Вашем случае у всех вызываеммых функций вполне можно свести параметры просто к указателю на структуры, которые будут иметь разную струтуру, но передавать можно просто Pointer на них, а любая ваша функция знает с какой именно структурой она работает. Вот вам уже и тип параметра - всегда один и тот же - просто указатель void и никаких разнотипных параметров... Ну и получится, что если у funct1 - cтруктура эта массив char symb[10] - то пусть его функция funct1 и знает а для вызываеющей функции это просто указатель &symb, для функции funct2 - параметр некая струтура Struct - общего вида, но вызывающей функции передается опять же только адрес этой структуры &Struct и ничего более... Может и коряво изложил - но суть примерно такая... И нету уже никаких передач параметров разных типов для вызывающей функции...
Другой вопрос - насколько это будет универсально, мобильно и т.д. и т.п.
Сообщение отредактировал Николай Z - Nov 9 2007, 09:44