LINUX.ORG.RU

Функция с переменными параметрами - без va_list лезет не туда


0

1

Попробовал сделать как здесь, но на первом же примере, в который добавил вывод значений, вылезла куча левого шлака из оперативки при вызове с параметрами «1.0,2.0,3.0»:

1
6.95318e-310
4.94066e-324
6.95318e-310
6.95318e-310
4.74303e-322
1.33789e-312
1.33797e-312
6.95318e-310
2.07432e-317
2
0
Значит, только макросом или у них что-то не так?

Стал искать вариант без него, потому что Qt Creator 2.2(как с последним не знаю, ставится пока) отображает выражение вида

int p=va_arg(perf,int);
как ошибку(т.ч. это всё-таки среда для Qt, где всё на своих итераторах, а не для С++:)

★★★★

Не используя va_list, ты завязываешься на abi компилятора, такой код непереносим. Не стоит так делать, если ты не знаешь abi.

это всё-таки среда для Qt, где всё на своих итераторах, а не для С++:)

Специалист по qtceator'у и C++ блин.

Begemoth ★★★★★
()

Надо вызывать с параметрами 1.0, 2.0, 3.0, 0.0

anonymous
()

то всё-таки среда для Qt, где всё на своих итераторах, а не для С++

дело не в этом, инфа 100%

shty ★★★★★
()

Ааааа ссылка на RSDN КРОВЬ КИШКИ РАС*****!!!111

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

Да там почти как в первом примере(извините за rsdn)

void f(int n, ...)
{
	double *p = &n;
        while (*p)
        {
         p++;
         cout<<*p<<endl;
        }
}
/...
f(1.0,2.0,3.0,0);

С первым комментарием ясно всё.

wingear ★★★★
() автор топика
Ответ на: комментарий от Begemoth

Нет, я пытаюсь перестать писать хелловорды на чем-либо, кроме веба.

Просто прикольно смотреть, как код подчеркивается, но компилятор хавает

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

ну или пока не в свою область памяти не залезет

Вообще стандарт языка не определяет что сделает эта функция, это зависит от компилятора, точнее от того как он передаёт параметры функции.

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

Можете посмотреть, у Вас такая строка в сабжевой среде тоже как ошибка подчеркивается?

Вы так это говорите будт они компилятором те сорцы парсят

//мало ли что там и как подчёркивается, компилируется нормально

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

Я же объясняю - Qt creator его выделил, как ошибку, стало интересно, чем недоволен(оказывается, именем типа в качестве аргумента), стал искать обходной путь-)

Не знаю, поправили ли это в 2.3, пока не докомпилилось

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

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

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

да, я ловлю себя на страхе - мог бы уже полгода как начать делать что-то полезное, но сначала SuperBible последнюю(автор почему-то самые нужные функции оставил на последнюю главу, хреново и непонятно получилось), потом спецификацию, потом спеки GLSL, теперь поводом топтаться на месте стало «незнание С++»(правда, в основном того, что в нём почти не используется). Если так дальше пойдет, придется какого-нибудь психолога искать, чтобы разучил заменять действие подготовкой к нему

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

Если так дальше пойдет, придется какого-нибудь психолога искать, чтобы разучил заменять действие подготовкой к нему

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

shty ★★★★★
()
       #include <stdio.h>
       #include <stdarg.h>

       void
       foo(char *fmt, ...)
       {
           va_list ap;
           int d;
           char c, *s;

           va_start(ap, fmt);
           while (*fmt)
               switch (*fmt++) {
               case 's':              /* string */
                   s = va_arg(ap, char *);
                   printf("string %s\n", s);
                   break;
               case 'd':              /* int */
                   d = va_arg(ap, int);
                   printf("int %d\n", d);
                   break;
               case 'c':              /* char */
                   /* need a cast here since va_arg only
                      takes fully promoted types */
                   c = (char) va_arg(ap, int);
                   printf("char %c\n", c);
                   break;
               }
           va_end(ap);
       }

а знаешь откуда это? Из man 3 va_arg.

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

Где в оригинале было про разные типы? А для разных типоп есть union.

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

ну и в чём трабла? в оригинальном сообщении было массив int-ов

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

это охуенная идея, чувак. Особенно если аргументы разных типов.

Ты так говоришь, как будто ТС использует паскаль. Как обычно void* спасёт моложого кулхацкера от системы типов.

Вообще самый правильный путь - variadic templates, а не хаки с памятью в обход системы типов.

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

плюсую variadic templates,

хотя и без них возможны всякие полезные вещи типа класса Any (возможно еще и AnySequence) и его наследников Some<T>

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

>Qt creator его выделил, как ошибку, стало интересно, чем недоволен

Тащемта это баг QtCreator, вот и все дела.

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