C: Переменное количество аргументов функции (при аргументах типа void* // ещё про фун.прог. в си хотел узнать )))

Модератор: Модераторы разделов

MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

C: Переменное количество аргументов функции

Сообщение MakkyWelly »

Извините, что задаю такой вопрос - просто по C. Хотелось бы узнать - оптимально ли я делаю?

Допустим есть функция:

Код: Выделить всё

void* a (void* argv[]) {
    // здесь добывается указатель на функцию
    // потом она вызывается с аргументами:
    return (*f)(argv[0], argv[1])
}


Но потом возникает надобность в переменном количестве аргументов для (*f) и я не нахожу ничего лучше, чем указать их количество:

Код: Выделить всё

void* a (void* argv[], int n) {
    // здесь добывается указатель на функцию
    switch (n) {
        case 0: return (*f)();
        case 1: return (*f)(argv[1]);
        case 2: return (*f)(argv[0], argv[1]);
        // и так далее
    }
}


Нет более мудрого решения?
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: C: Переменное количество аргументов функции

Сообщение Portnov »

См. man va_arg, там в конце пример есть.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: C: Переменное количество аргументов функции

Сообщение MakkyWelly »

Спасибо. Интересно, но в том примере предполагается, что тип аргументов известен! У меня void* и функция не каррируется :)), т.е. нельзя вызвать её f(f(f(...))) в цикле. Напишу подробнее:

Код: Выделить всё

void* fun_var_args (void* argv[], int n) {
    // здесь добывается указатель на функцию _f_
    switch (n) {
        case 0: return (*_f_)();
        case 1: return (*_f_)(argv[1]);
        case 2: return (*_f_)(argv[0], argv[1]);
        case 3: return (*_f_)(argv[0], argv[1], argv[2]);
        case 4: return (*_f_)(argv[0], argv[1], argv[2], argv[3]);
        case 5: return (*_f_)(argv[0], argv[1], argv[2], argv[3], argv[4]);
    }
}


Потом я могу её вызывать так:

Код: Выделить всё

// ...
void* my_args = {"str", 1, 2, 'c', "str2"};
answ = (* int) fun_var_args(my_args, 5);
// ...

Но это функция не от переменного кол-ва аргументов, а 0 .. 5, и их кол-ва нужно явно указывать.

И ещё: почему в C можно писать

Код: Выделить всё

void* args = {"str", 1, 2, 'c', "str2"};
fun(args);

И нельзя:

Код: Выделить всё

fun({"str", 1, 2, 'c', "str2"}); //или
fun((void*)({"str", 1, 2, 'c', "str2"}));

Хотя вопрос, наверно, риторический.
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: C: Переменное количество аргументов функции

Сообщение Crazy »

при передаче массива нужно передавать фактическое число элементов в нем.
Как дальше будешь разруливать не представляю.
void* fun_var_args (void* argv[], int n) {
// здесь добывается указатель на функцию _f_
switch (n) {
case 0: return (*_f_)();
case 1: return (*_f_)(argv[1]);
case 2: return (*_f_)(argv[0], argv[1]);
case 3: return (*_f_)(argv[0], argv[1], argv[2]);
case 4: return (*_f_)(argv[0], argv[1], argv[2], argv[3]);
case 5: return (*_f_)(argv[0], argv[1], argv[2], argv[3], argv[4]);
}
}


Объявление спосков параметров переменной длины не подходит?
Настолько нужны все эти void*?

Desipere in loco
Спасибо сказали:
Аватара пользователя
begin2009
Сообщения: 349
Статус: Ламер со стажем
ОС: без глюков

Re: C: Переменное количество аргументов функции

Сообщение begin2009 »

Я чего то не понимаю. А если объявить класс и работать с экземплярами? Там можно наобъявлять функций-членов сколько угодно, а работать с теми какие надо. Или работать с одной переменной в которую упаковать все данные, а потом анализировать?
Пессимист видит темный туннель, оптимист видит свет в конце туннеля, реалист видит свет, туннель и поезд.
И только машинист видит этих трех идиотов, сидящих на рельсах.
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: C: Переменное количество аргументов функции

Сообщение MakkyWelly »

А если объявить класс и работать с экземплярами?

Дело в том, что я решил писать на Си, без классов.
Объявление спосков параметров переменной длины не подходит?
Настолько нужны все эти void*?

Без них никак. Я тут подумал, что простая strlen - тоже функция переменного количества аргументов, в том смысле, что она берет массив неизвестной длинны и следует по нему до нулевого символа. Если определить какой-нибуди завершающий символ, можно было бы не указывать кол-во аргументов, а посчитать их. Но тут есть "но" - при преобразовании void* к ч.л. (ну разве кроме int или char) рано или поздно произойдёт ошибка...
Итак - switch - единственный выход.
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: C: Переменное количество аргументов функции

Сообщение Portnov »

Мнээ... А так?

Код: Выделить всё

int func(void** p) {
  int n=0;
  while (p[n++]) {};
  switch (n-1) {...};
}

Тогда только обязательно нужно последним указателем в передаваемом массиве ставить NULL.

А вообще, такое сложное решение обычно указывает на то, что вышестоящая задача решается неправильно. Т.е., в данном случае, скорее всего, решается не та задача.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: C: Переменное количество аргументов функции

Сообщение Crazy »

Portnov писал(а):
27.08.2009 12:31
А вообще, такое сложное решение обычно указывает на то, что вышестоящая задача решается неправильно. Т.е., в данном случае, скорее всего, решается не та задача.

Вся информация о типах полностью теряется. Потом придется делать приведение типов, а к чему приводить к int или char?

Desipere in loco
Спасибо сказали:
Аватара пользователя
begin2009
Сообщения: 349
Статус: Ламер со стажем
ОС: без глюков

Re: C: Переменное количество аргументов функции

Сообщение begin2009 »

MakkyWelly писал(а):
27.08.2009 09:21
Дело в том, что я решил писать на Си, без классов.

Это потому что TRYЪ или действительно есть необходимость в чистом си-коде? Не обижайтесь, но как-то вспомнился анекдот про суровый сибирский секс - обязательно в противогазе, гамаке и стоя.

А может проще список парами (информация о типе, значение). Или вообще одна строковая переменная, в качестве разделителей любой не используемый символ. На выходе анализируете в switch, а брек по условию конца переменной?

PS А вообще-то я согласен с Portnov. Если Вы скажете, зачем такой экзотизм, то возможно решение будет тривиально простым.
Пессимист видит темный туннель, оптимист видит свет в конце туннеля, реалист видит свет, туннель и поезд.
И только машинист видит этих трех идиотов, сидящих на рельсах.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C: Переменное количество аргументов функции

Сообщение NickLion »

Странные мучения.
1. Что есть f/_f_? Почему не вызывать напрямую?
2. Чем не подходит va_arg? В Вашем случае тип известен - (void*).
3. А как f/_f_ отличит число от символа или указателя?
4. Переменное число в С/С++ реализуется либо через эллипсис (...) + va_arg, либо через передачу массивов. Второй способ, обычно, при одном типе всех параметров, либо потомки одного класса в С++ по указателю.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: C: Переменное количество аргументов функции

Сообщение drBatty »

NickLion писал(а):
27.08.2009 21:22
4. Переменное число в С/С++ реализуется либо через эллипсис (...) + va_arg, либо через передачу массивов.

ага.
но возможно подойдёт список:

Код: Выделить всё

struct LIST
{
 void *data;
 int type;
 LIST *next;
};

отдаёте функции голову списка, а она его просматривает последовательно.
список можно кольцевой, а можно простой, с NULL на конце. подробнее Д.Э. Кнут... том 2 Искусство Программирования.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: C: Переменное количество аргументов функции

Сообщение drBatty »

begin2009 писал(а):
27.08.2009 20:24
Это потому что TRYЪ или действительно есть необходимость в чистом си-коде? Не обижайтесь, но как-то вспомнился анекдот про суровый сибирский секс - обязательно в противогазе, гамаке и стоя.

ну откуда вам знать? может у него микроконтроллер, к которому во первых нет компилятора, а во вторых, накладные расходы ++ для вас - копейки, а для него - бешеные тыщи.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: C: Переменное количество аргументов функции

Сообщение Crazy »

drBatty писал(а):
27.08.2009 21:57
begin2009 писал(а):
27.08.2009 20:24
Это потому что TRYЪ или действительно есть необходимость в чистом си-коде? Не обижайтесь, но как-то вспомнился анекдот про суровый сибирский секс - обязательно в противогазе, гамаке и стоя.

ну откуда вам знать? может у него микроконтроллер, к которому во первых нет компилятора, а во вторых, накладные расходы ++ для вас - копейки, а для него - бешеные тыщи.

Тогда лучше на ассемблере писать. Надежней будет.

Desipere in loco
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: C: Переменное количество аргументов функции

Сообщение drBatty »

Crazy писал(а):
27.08.2009 21:59
Тогда лучше на ассемблере писать. Надежней будет.

не факт. зависит от того, насколько хорошо кодер знает архитектуру контроллера.
контроллеров много, потому мало кто разбирается в них лучше чем создатели компиляторов.
даже с x86 непонятки, до сих пор я так и не понял, использовать команду loop, или нет. (она то быстрее чем переход, то медленнее, то опять быстрее, в зависимости от типа CPU)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: C: Переменное количество аргументов функции

Сообщение Crazy »

drBatty писал(а):
27.08.2009 22:20
Crazy писал(а):
27.08.2009 21:59
Тогда лучше на ассемблере писать. Надежней будет.

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

Есть документация, в которой все написано.
loop и переход? может loop и cmp+Jcc?

Desipere in loco
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: C: Переменное количество аргументов функции

Сообщение drBatty »

Crazy писал(а):
27.08.2009 22:43
1)Есть документация, в которой все написано.
2)loop и переход? может loop и cmp+Jcc?

1)ага. только больно много этой документации. как мне писать, для какого CPU?
у меня 3 компьютера, и все разные. на Си я соберу для каждого компа свою версию, а на асме?
читать три доки, и писать 3 варианта? и это только мои личные компы... :(
2)ну да, ведь j и есть jamp, прыжок, переход...

ЗЫЖ короче - ну его, этот асм. фтопку.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
begin2009
Сообщения: 349
Статус: Ламер со стажем
ОС: без глюков

Re: C: Переменное количество аргументов функции

Сообщение begin2009 »

drBatty писал(а):
27.08.2009 21:57
ну откуда вам знать? может у него микроконтроллер, к которому во первых нет компилятора, а во вторых, накладные расходы ++ для вас - копейки, а для него - бешеные тыщи.


Вряд ли. Скорее всего, человек сам себя накрутил, что ему надо именно так и не иначе. А решение возможно на поверхности и не столько экзотичное. Причем даже если и микроконтроллер. Я уже предлагал написать, что именно он хочет реализовать, что для чего его функция? Может нужно попробовать зайти вообще с другого бока?
Пессимист видит темный туннель, оптимист видит свет в конце туннеля, реалист видит свет, туннель и поезд.
И только машинист видит этих трех идиотов, сидящих на рельсах.
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: C: Переменное количество аргументов функции

Сообщение Crazy »

drBatty писал(а):
27.08.2009 22:53
Crazy писал(а):
27.08.2009 22:43
1)Есть документация, в которой все написано.
2)loop и переход? может loop и cmp+Jcc?

1)ага. только больно много этой документации. как мне писать, для какого CPU?
у меня 3 компьютера, и все разные. на Си я соберу для каждого компа свою версию, а на асме?
читать три доки, и писать 3 варианта? и это только мои личные компы... :(
2)ну да, ведь j и есть jamp, прыжок, переход...

ЗЫЖ короче - ну его, этот асм. фтопку.

А причем тут программирование конкретного контроллера, со своим набором команд. И ваши процессоры?
Другое дело что спецификации платные.

Desipere in loco
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: C: Переменное количество аргументов функции

Сообщение drBatty »

begin2009 писал(а):
27.08.2009 23:55
Вряд ли. Скорее всего, человек сам себя накрутил, что ему надо именно так и не иначе. А решение возможно на поверхности и не столько экзотичное. Причем даже если и микроконтроллер. Я уже предлагал написать, что именно он хочет реализовать, что для чего его функция? Может нужно попробовать зайти вообще с другого бока?

это конечно верно...
Crazy писал(а):
28.08.2009 00:21
А причем тут программирование конкретного контроллера, со своим набором команд. И ваши процессоры?
Другое дело что спецификации платные.

а я смогу поменять этот контроллер без всякого переписывания программы. просто пересоберу.
опять-таки - спецификации... хотя компиляторы тоже обычно не GNU :(
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: C: Переменное количество аргументов функции

Сообщение Portnov »

iУведомление от модератора

Ждём всё-таки топикстартера. Давайте не будем за него придумывать, чего ему надо.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: C: Переменное количество аргументов функции

Сообщение MakkyWelly »

Portnov... Sorry...

Как много написали, попробую обдумать... Так, подумал. Обижаться в любом случае не буду :-)

(Portnov) писал(а):Тогда только обязательно нужно последним указателем в передаваемом массиве ставить NULL.


Об этом я уже написал, вы не заметили, но:

Код: Выделить всё

int void_mas_length(void ** p) {
    int n = 0;
    while (p[n++] != NULL)
    ;
    return n;
}


Эта функция не будет правильно отдавать длинну массива, она споткнётся на первом же нуле в массиве, кроме того - некоторые функции принимают аргументы, значением которых может быть NULL. Особенно под Win, а мне нужен кроссплатформенный код. Это, кстати, и довод в пользу С. Ну а что касается С++, то мне классы не нужны просто, достаточно структур и модульности.

(Portnov) писал(а):А вообще, такое сложное решение обычно указывает на то, что вышестоящая задача решается неправильно. Т.е., в данном случае, скорее всего, решается не та задача.


Решение-то уже есть, я просто решил узнать - нельзя ли лучше. Да и задачу вроде выбрал адекватную ))

(NickLion) писал(а):Что есть f/_f_? Почему не вызывать напрямую?

??? Как бы бывают функции, определенные только по указателю, для таких функций вызов (*f)(...) и есть вызов на прямую. Или я не прав?

drBarty, если сделать аргументы связным списком, то и их придётся мыслить как сишный объект.

Код: Выделить всё

typedef struct arg_list {
    void * arg;
    int type;
    struct arg_list * next;
} object_argu;

object_argu * initialize_argu (void ** arg, int * type, int n) {
    object_argu * argu;
    if (n > 0) {
        argu = (object_argu *) malloc (sizeof (object_argu));
        argu -> arg = arg;
        argu -> type = type;
        argu -> next = initialize_argu(*arg++, *type++, n - 1);
        return argu;
    } else {
       argu = (object_argu *) malloc (sizeof (object_argu));
       argu -> arg = arg;
       argu -> type = type;
       argu -> next = NULL;
       return argu;
    }
}

int length_argu (object_argu * argu) {
    if (argu -> next == NULL)
        return 1;
    else
        return length_argu(argu -> next) + 1;
}

void * get_arg (object_argu * argu, int i) {
    if (i == 0)
        return argu -> arg;
    else
        return get_arg(argu -> next, i - 1);
}

// ...
// тут, опять таки, достаем указатель на __g__
//
    n = length_argu (argu);
    switch (n) {
        case 0: rusult = (* __g__)();    break;
        case 1: rusult = (* __g__)(get_arg(argu, 0));    break;
        case 2: rusult = (* __g__)(get_arg(argu, 0), get_arg(argu, 1));    break;
        case 3: rusult = (* __g__)(get_arg(argu, 0), get_arg(argu, 1), get_arg(argu, 2));    break;
        case 4: rusult = (* __g__)(get_arg(argu, 0), get_arg(argu, 1), get_arg(argu, 2), get_arg(argu, 3));    break;
        case 5: rusult = (* __g__)(get_arg(argu, 0), get_arg(argu, 1), get_arg(argu, 2), get_arg(argu, 3), get_arg(argu, 4));    break;
        // ...
// ...

Вроде от необходимости указывать кол-во аргументов избавились, но их количество всё равно ограничено сверху (в switch).
Вот если бы в Си можно было написать (* f)(void ** args) а сколько там аргументов решал бы компилятор. Правдо не ясно, как определить последний эллемент - NULL то не подходит. Представьте себе, что в стандарте Си написано: "Использовать число 566345486344 в языке нельзя, потому что оно используется для указания конца списка аргументов функции". :-)))
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: C: Переменное количество аргументов функции

Сообщение Portnov »

MakkyWelly писал(а):
28.08.2009 11:25
Эта функция не будет правильно отдавать длинну массива, она споткнётся на первом же нуле в массиве,

Если вы не заметили, я предлагаю передавать список из указателей на аргументы. Нулевой указатель - это заведомо отсутствие аргумента.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: C: Переменное количество аргументов функции

Сообщение MakkyWelly »

список из указателей на аргументы

Связный список, или массив?
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: C: Переменное количество аргументов функции

Сообщение drBatty »

MakkyWelly писал(а):
28.08.2009 11:25
Вроде от необходимости указывать кол-во аргументов избавились, но их количество всё равно ограничено сверху (в switch).

в смысле "количество типов"? нет, их тоже можно организовать списком (если вам это надо).
MakkyWelly писал(а):
28.08.2009 11:25
Вот если бы в Си можно было написать (* f)(void ** args) а сколько там аргументов решал бы компилятор.

такое можно делать в С++. что вам и советуют. вы пытаетесь писать и думать как на ++, но кодить простым Си.
MakkyWelly писал(а):
28.08.2009 11:25
1)Правдо не ясно, как определить последний эллемент - NULL то не подходит.
2)Представьте себе, что в стандарте Си написано: "Использовать число 566345486344 в языке нельзя, потому что оно используется для указания конца списка аргументов функции". :-)))

1)потому передавайте не элементы, а указатели на них, как предлагает Portnov, или структуры включающие элементы (как предлагаю я).
основная идея проста - если передаётся что угодно, то надо обернуть это в обёртку, и передавать обёртки
(коллекции обёрток, неважно какие, хоть красно-чёрные деревья).
2)а вы подумайте, сколько это будет стоить? это-ж в каждой функции, даже самой примитивной надо вставлять проверку... Не, спасибо, не надо. К тому-же у нас уже есть NULL, который вовсе не обязан быть нулём.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: C: Переменное количество аргументов функции

Сообщение MakkyWelly »

Вот массив из указателей на аргументы неизвестного типа:

Код: Выделить всё

 void * argu[] = {0, "1", "1", 0};
как написать функцию, возвращающую его длинну:

Код: Выделить всё

void_mas_length(argu);
.

Кстати,

Код: Выделить всё

(NULL == 0) ? 1 : 0
вернёт 1.

(drBatty) писал(а):в смысле "количество типов"? нет, их тоже можно организовать списком (если вам это надо).

Количестов аргументов - я сделаю switch на 10 вариантов, а кто-то передаст в функцию 15 аргументов...
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: C: Переменное количество аргументов функции

Сообщение Crazy »

MakkyWelly писал(а):
28.08.2009 12:38
Количестов аргументов - я сделаю switch на 10 вариантов, а кто-то передаст в функцию 15 аргументов...

Да что это за функция такая? Что она делает?

Desipere in loco
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: C: Переменное количество аргументов функции

Сообщение drBatty »

MakkyWelly писал(а):
28.08.2009 12:38
Вот массив из указателей на аргументы неизвестного типа:
Код
void * argu[] = {0, "1", "1", 0};
как написать функцию, возвращающую его длинну:

никак. в Си это принципиально невозможно.
Это свойство языка - размер массива(от которого у нас есть только указатель) нигде не хранится. и в функцию передаётся только-лишь адрес начала.
MakkyWelly писал(а):
28.08.2009 12:38
Кстати,
Код
(NULL == 0) ? 1 : 0
вернёт 1.

и что? а сколько-же должно по вашему?
NULL == 0 - это истинно в БОЛЬШИНСТВЕ систем, но кто сказал, что
а) во ВСЕХ
б) я его не могу поменять?
Кстати, выражение с ошибкой - нельзя приводить NULL (тип void *) к целому.
И ПРАВИЛЬНЫЙ Сишный (без плюсов) компилятор ДОЛЖЕН написать Warning.
MakkyWelly писал(а):
28.08.2009 12:38
Количестов аргументов - я сделаю switch на 10 вариантов, а кто-то передаст в функцию 15 аргументов...

сделайте цикл просмотра другого списка например с указателями на функции, и пусть хоть 115 типов будет.
или 2152 аргументов.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C: Переменное количество аргументов функции

Сообщение NickLion »

MakkyWelly писал(а):
28.08.2009 11:25
(NickLion) писал(а):Что есть f/_f_? Почему не вызывать напрямую?

??? Как бы бывают функции, определенные только по указателю, для таких функций вызов (*f)(...) и есть вызов на прямую. Или я не прав?

Вообще-то я хотел услышать каков тип этой функции. Я прекрасно понял, что речь идет об указателе на функцию. А про "напрямую" - имелось в виду без использования промежуточной функции. Извиняюсь, если неполно выразил свою мысль.

MakkyWelly писал(а):
28.08.2009 12:38
Вот массив из указателей на аргументы неизвестного типа:

Код: Выделить всё

 void * argu[] = {0, "1", "1", 0};
как написать функцию, возвращающую его длинну:

Это возможно только там, где известна информация о самом массиве, в зоне видимости. Т.е. уже заведомо не отдельной функцией. Можно макрос сделать:

Код: Выделить всё

#define ARRAY_LENGTH( arr ) ( sizeof( arr ) / sizeof( arr[ 0 ] ) )
...
void * argu[] = {0, "1", "1", 0};
int n = ARRAY_LENGTH( argu );
Спасибо сказали:
MakkyWelly
Сообщения: 97
ОС: по обстоятельствам :)

Re: C: Переменное количество аргументов функции

Сообщение MakkyWelly »

(NickLion) писал(а):Вообще-то я хотел услышать каков тип этой функции. Я прекрасно понял, что речь идет об указателе на функцию. А про "напрямую" - имелось в виду без использования промежуточной функции. Извиняюсь, если неполно выразил свою мысль.


Эта промежуточная функция - что-то вроде попытки обобщить другие функции, в основном из дин. библиотек. Природа _f_ в том, что она возвращает указатели на разные функции (точки входа в код), а те принимают разные аргументы, разных типов, то есть что-то вроде обвёртки.
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: C: Переменное количество аргументов функции

Сообщение NickLion »

У _f_ есть конкретный тип? Описание? Приведите здесь его точно, пожалуйста.
Спасибо сказали: