Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
136 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,882
1

Передача в функцию переменное кол-во аргументов

15.03.2019, 11:10. Показов 2144. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,

Пытаюсь понять, как передать в функцию переменное кол-во аргументов и грубо говоря считать их в функции. Делаю вот так:

Однако, что то я не так делаю, я так понял, что из вызова функции в функцию передаются параметры непрерывным массивом, то есть ячейки в памяти идут одна за другой, но то ли я что то не так сделал, то ли я не правильно понял, потому что первый вывод в консоль указателя и значения получается нормальным, выводится "A1"...

После сдвигания адреса на 1string, по идее указателю должен присвоится адрес в котором расположено значение "A2", но после попытки вывода выводится туева хуча символов и вообще все завершается с ошибкой...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Proverka(string parametro, ...)
{
    string *Ukazatel = &parametro;
 
    cout << Ukazatel << endl;
    cout << *Ukazatel << endl;
 
    Ukazatel++;
 
    cout << Ukazatel << endl;
    cout << *Ukazatel << endl;
}
 
int main()
{
    Proverka("A1", "A2", "A3");
}
Не могу понять, что не так ...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.03.2019, 11:10
Ответы с готовыми решениями:

Передача переменного кол-ва аргументов
Доброго времени суток. Интересует вопрос, возможно ли передать множественные аргументы функции в...

Передать динамическое кол-во аргументов в функцию в рантайме
Имеется класс функций(cdecl), принимающих разное кол-во аргументов разных типов (но только базовых...

Передача аргументов в функцию
как передать аргумент в функцию по указателю? нашел только по значению: int sqr(int x); int...

Передача аргументов в функцию
Хочу размерность массива задать в отдельной функции, но не получается разобраться с передачей...

13
330 / 145 / 56
Регистрация: 17.10.2015
Сообщений: 580
15.03.2019, 11:37 2
Ну дык конечно будет мусор писать, если Вы указатель ставите на адресс одиночной строки.
Для добычи параметров Вам с троеточия Вам понадобятся макросы, для работы с ...
Учтите, что использовать на высоком уровне абстакции ... - считается плохим стилем
0
136 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,882
15.03.2019, 11:45  [ТС] 3
Я тогда вообще не понял, как в функцию передать неизвесное кол-во аргументов.
Я находил пример и в ютубе и на какой то из сайтов, там вот юыл дан примерно такой способ.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
15.03.2019, 12:17 4
Цитата Сообщение от Optimus11 Посмотреть сообщение
как в функцию передать неизвесное кол-во аргументов
Если рассматривать только сишный эллипсис, то здесь есть корректный пример: https://en.cppreference.com/w/cpp/utility/variadic
0
145 / 89 / 23
Регистрация: 31.08.2016
Сообщений: 780
Записей в блоге: 2
15.03.2019, 15:59 5
Цитата Сообщение от Optimus11 Посмотреть сообщение
что из вызова функции в функцию передаются параметры непрерывным массивом, то есть ячейки в памяти идут одна за другой
передаются в стэк, а считываются в обратном порядке

Добавлено через 3 часа 39 минут
сдается мне что со стрингами это не работает, т к размер стринга не фиксированный, ниже ф-ция суммирует int-ы, про стэк забудь

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int Sum(unsigned int n, int parametro, ...)
{
 int S = 0;
 int i = 0;
 while(i < n)
 {
    int *Ukazatel = &parametro;
    *Ukazatel+=i;
     S +=*Ukazatel ; 
    i++;
  }
return S;
}
0
136 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,882
15.03.2019, 16:02  [ТС] 6
Решил не заморачиваться, и сделал квази-передачку неопределенного кол-ва string аргeментов в функцию

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
string Proverka(string &parametro)
{
    
    vector<string>my_parametr;
    my_parametr.resize(1);
    int resize=0;
 
    int num_element = 0;
    int n = 0;
 
    for (int i = 0; i < parametro.length(); i++)
    {
        if (parametro[i] == '+')
        {
            num_element = num_element + 1;
            n = 0;
            resize++;
            my_parametr.resize(resize + 1);
        }
        else
        {
            if (n == 0)
            {
                my_parametr[num_element] = parametro[i];
                n = n + 1;
            }
            else
            {
                my_parametr[num_element] = my_parametr[num_element]+parametro[i];
            }
        }
    }
 
 
    cout << "Kol-vo argumentov:" << my_parametr.size() << endl; // Соотвесвенно число квази-аргументов
 
    for (int y = 0; y < my_parametr.size(); y++)
    {
        cout << "Arg_" + to_string(y + 1) << ":" << my_parametr[y] << endl; // Соовтесвенно сами квази-аргументы :)))
 
    }
}
 
int main()
{
    string parm = "A1+A2+A3";
    Proverka(parm);
}
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
15.03.2019, 22:25 7
Цитата Сообщение от Optimus11 Посмотреть сообщение
Решил не заморачиваться, и сделал квази-передачку неопределенного кол-ва string аргeментов в функцию
Нет, так не интересно, сначала заинтриговали а теперь концы в воду? Давайте детальнее поговорим о том какая ставиться задача и что нужно сделать.
0
136 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,882
16.03.2019, 11:29  [ТС] 8
Только что понял, что, то что я делаю ооочень малоэффективно.
Есть autowrap`овская COM функция, которая берет значение ячейки ексель по ее адресу, к примеру A1.
Так как я не знаю, как с помощью этой функции получить диапазон значений, к примеру для A1:A10000, то решил просто сформировать обычный массив состоящий из последовательности адресов ячеек нужного диапазона, ну то есть A1, A2, A3...A100000 и поочередно подставлять в autowrap`вскую функцию и получая значения екселевской ячейки, записывать ее в свой массив, НО таким образом считывание всего 10тыщ ячеек занимает ~45 секунд. 45 секунд! Да в VBA всего три секунды потребуется, а 45 сек.
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
16.03.2019, 17:29 9
Цитата Сообщение от Optimus11 Посмотреть сообщение
которая берет значение ячейки ексель по ее адресу, к примеру A1
libxl
0
136 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,882
16.03.2019, 18:09  [ТС] 10
Libxl, xlnt, да
Проблема в том, что запись и чтение должны происходить в активный открытый ексель.
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
16.03.2019, 20:59 11
Optimus11, должно не искал, но в топе только JS API
0
136 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,882
16.03.2019, 21:40  [ТС] 12
Спасибо!
Но, как я понимаю, для этого все равно придется ставить виртуальную машину jvs, и если так, то варианты с установкой машин не подходят.
0
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
17.03.2019, 04:16 13
Цитата Сообщение от qppq Посмотреть сообщение
сдается мне что со стрингами это не работает, т к размер стринга не фиксированный
фиксированный
0
136 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,882
08.04.2019, 19:53  [ТС] 14
Подскажите пожалуйста, что то я запутался, создал функцию и соответсвенно Functiin.h и Function.cpp.
Но в function.h сама функция подчеркнкта и наеисано, что "Не найдено определение функции для Get_function".
Но, при запуске это сообщение ни на что не влияет и вызываемая функция из main.cpp выдает результат.

Не понимаю, почему тогда вылазит такое сообщение, если все работает ?
0
08.04.2019, 19:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.04.2019, 19:53
Помогаю со студенческими работами здесь

Передача аргументов в функцию
Что сработает быстрее? void Func(const A &amp;a = A(0, 0, 0)) { } или void Func(A a =...

Передача аргументов в функцию
Привет! Пишу одну программку , и , собственно , уже написал , но код у меня в ней повторяется...

Передача аргументов в функцию
Доброго всем дня! Я немного не понял листинг программы из учебника Р.Лафоре: ...

Передача аргументов в функцию
При сборке кода выдает ошибку (её я написал в комментарий). Что значит ошибка? #include...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru