Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517

GCC и функции с переменным числом аргументов

29.09.2013, 01:43. Показов 1625. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Писал мини приложение в студии для работы с векторами, один из методов просто получает сколько угодно аргументов и заполняет координаты вектора по разным измерениям этими данными (и так либо пока данные не закончаться либо пока кол-во измерений указанное при создании вектора не закончиться). Привожу код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#define newGVector ((GVector*) malloc(sizeof(GVector)))
 
struct GVector{
    int dimSize;
    double* data;
};
 
GVector* createVector(int dimSize){
    GVector* vec = newGVector;
    vec->data = (double*) malloc((vec->dimSize = dimSize) * sizeof(double) );
    return vec;
}
 
GVector* initVector(GVector* vec, double item, ...){
    int i, dimSize = vec->dimSize;
    double* items = &item;
    for (i = 0; i < dimSize && items; i++)
        vec->data[i] = *items, items++;
    return vec;
}
 
void printVec(GVector* vec){
    int i;
    printf("[");
    for(i=0; i<vec->dimSize-1; i++)
        printf("%-6.1f",vec->data[i]);
    printf("%.1f]\n",vec->data[i]);
}
При компиляции компилятором microsoft вот этого кода всё хорошо:
C
1
2
3
4
    printf("First vector:\n");
    GVector* vec1 = createVector(3);
    initVector(vec1, 1.0, 2.0, 3.0);
    printVec(vec1);//выведет [1.0 2.0 3.0]
Но если компилирую через gcc то мой метод вместо значений подтягивает мусор:
C
1
2
3
4
    printf("First vector:\n");
    GVector* vec1 = createVector(3);
    initVector(vec1, 1.0, 2.0, 3.0);
    printVec(vec1);//выведет [1.0 1.$ 0.0]
Тоесть первое значение оно подхватывает, вместо следующего всегда 1.$, а дальше идут нули. Я так понимаю что gcc решили выпендриться и по своему сделали передачу аргументов функциям, я так догадываюсь что второе это указатель на область памяти где именно те аргументы или ещё что-то хитрое, подскажите пожалуйста можно ли заставить gcc поступать с аргументами функций так же как и остальные компиляторы? Просто вариант с va_list мне не нравиться - там ведь получаеться нельзя двигаться по списку аргументов не зная заранее сколько их, а я хотел бы чтобы не надо было передавать никаких int count, а просто только значения и всё, ну как у меня в текущем варианте, с va_list выходит это не получиться ... или получиться ?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.09.2013, 01:43
Ответы с готовыми решениями:

Функции с переменным числом аргументов
на пример sum(2,56,515,-23.65,548)?

Функции с переменным числом аргументов
Ребята, подскажите пожалуйста, где можно обстоятельно и подробно прочитать про использовании в C++ функций с несколькими аргументами. ...

Шаблон с переменным числом аргументов, и возвращаемое значение функции
Здравствуйте! Использую С++11. Хочу возвращать элементы кортежа пытаюсь так, auto Deserialize(unsigned long long i) -&gt;...

7
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.09.2013, 02:42
В release правильно выводит.
1
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
29.09.2013, 03:00
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Gepar Посмотреть сообщение
Просто вариант с va_list мне не нравиться - там ведь получаеться нельзя двигаться по списку аргументов не зная заранее сколько их, а я хотел бы чтобы не надо было передавать никаких int count, а просто только значения и всё, ну как у меня в текущем варианте, с va_list выходит это не получиться ... или получиться ?
Undefined behavior типа больше нравится.

Если initVector() обязана быть безопасной (то есть нельзя взять с пользователя честное пионерское, что он всегда будет передавать столько аргументов, сколько в vec->dimSize), то придётся извращаться. Идиома работы с va_list: в списке аргументов всегда есть что-то, позволяющее определить, сколько и чего там функции передали. (Ну, или честное слово, да.) Обычно это явное количество одинаковых аргументов (этот самый count), строка формата а-ля print(), или специальное значение "конец списка аргументов" (для double можно NaN взять). Первый и последний варианты в принципе можно макросами спрятать, если дописывание этих штук вызывает невыносимые физические страдания.

Не по теме:

И вообще, accept the challenge: генератор векторов на макросах!

0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
29.09.2013, 13:57  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
В release правильно выводит.
Неа, в release дочитывает нулями почему-то

Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Идиома работы с va_list: в списке аргументов всегда есть что-то, позволяющее определить, сколько и чего там функции передали. (Ну, или честное слово, да.)
Видимо придёться рассчитывать на честное слово, хоть мне и не нравиться это решение.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.09.2013, 18:16
Цитата Сообщение от Gepar Посмотреть сообщение
Неа, в release дочитывает нулями почему-то
Я там небольшое изменение в коде сделал. Подумал, что это никак не может влиять на правильный вывод, поэтому и написал, что в release правильно выводит. Оказалось, что влияет. Если сделать дополнительный вывод в initVector, то, почему-то, правильно начинает выводить в release:
C++
1
2
3
4
5
6
7
8
9
10
11
12
GVector* initVector(GVector* vec, double item, ...)
{
    int i, dimSize = vec ->dimSize;
    double* items = &item;
    for (i = 0; i < dimSize && items; i++)
    {
        vec->data[i] = *items;
        cout << vec->data[i] << endl;
        ++items;
    }
    return vec;
}
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
29.09.2013, 19:32
А почему вы решили что items в конце списка станет == 0 ?
dimSize в цикле вообще нигде не изменяется. По какому условию цикл должен прекратиться?
0
127 / 131 / 11
Регистрация: 25.12.2011
Сообщений: 443
30.09.2013, 08:33
Цитата Сообщение от Gepar Посмотреть сообщение
один из методов просто получает сколько угодно аргументов и заполняет координаты вектора по разным измерениям этими данными (и так либо пока данные не закончаться либо пока кол-во измерений указанное при создании вектора не закончиться)
Может быть автор форумом ошибся и ему нужно в форум по C. А то непонятно зачем городить такой GVector самому вместо использования std::vector<double>, для которого и так все работает:
C++
1
2
3
4
5
6
typedef std::vector<double> GVector;
 
void test() {
    GVector v = { 1.0, 2.0, 3.0 };
    v = { 3.0, 2.0, 1.0 };
}
И функцию, если такая действительно нужна, можно реализовать примерно так:
C++
1
2
3
4
5
6
7
8
template <typename... Ts>
void initVector(GVector& v, const Ts&... ts) {
    double ds [] = { ts... };
    size_t n = std::min(sizeof...(ts), v.size());
    for (size_t i = 0; i < n; ++i) {
        v[i] = ds[i];
    }
}
1
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
30.09.2013, 23:36  [ТС]
Цитата Сообщение от kamre Посмотреть сообщение
Может быть автор форумом ошибся и ему нужно в форум по C.
В этом плане таки да, забыл что с определённого времени тут отдельно си и с++, ну да уже поздно.

Цитата Сообщение от kamre Посмотреть сообщение
А то непонятно зачем городить такой GVector самому вместо использования std::vector<double>
Ну как зачем, студенческие задания естественно, так бы я сам велосипеды для реального использования не писал бы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.09.2013, 23:36
Помогаю со студенческими работами здесь

Шаблоны с переменным числом аргументов
Написал шаблон функции с переменным числом аргументов которая считает сумму своих аргументов. Практики по этому вопросу не имею, поэтому...

Шаблонная функция с переменным числом аргументов
Сабж. Каким образом можно запретить использование шаблонной функции, если тип одного из аргументов не соответствует требуемому? Есть...

Написать функцию с переменным числом аргументов
Помогите понять, что от меня хотят-то вообще. Мне нужно: объявить функции в соответствии с вариантом. Определить их. мой вариант:написать...

Функция с переменным числом аргументов (через шаблоны)
Доброго времени суток! Встал вопрос с реализацией такой функции. template&lt;typename... Args&gt; returntype functionname(const...

Инициализация std::tuple переменным числом аргументов
Добрый вечер. Мне нужно инициализировать объект std::tuple, который является членом некоторого другого шаблонного класса с переменным...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru