0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 38
1

Функция с неизвестным кол-вом строк

30.12.2021, 12:36. Показов 1458. Ответов 11

Author24 — интернет-сервис помощи студентам
Мне нужно передать в функцию неизвестное кол-во строк(string) и поместить их в массив, где 3 - количество строк, а потом идут сами строки:
C++
1
Func(3, "Hello", "World", "I'm Func");
После этой команды получить массив внутри функции:
C++
1
string List[3] = {"Hello", "World", "I'm Func"};
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.12.2021, 12:36
Ответы с готовыми решениями:

Функция с переменным кол-вом аргументов char vs int
#include <iostream> #include <cstdio> using namespace std; void func (int amount, ...)

Вызов функции другого потока и получение ответа с наименьшим кол-вом строк кода [QueuedConnection]
В общем, предположим есть два объекта классов GUIBackEnd и Processor, работающих в разных потоках....

Создание массива с изначально неизвестным кол-вом элементов, которое будет динамически меняться
Здравствуйте Как создать массив, число элементов в котором заранее не известно?

Надо написать 2 программы, суть которых в определении количества чисел (по заданным критериям) в последовательности с неизвестным кол-вом чисел.
Помогите, пожалуйста, написать две программки: 1. Программа, которая в последовательности целых...

Работа с большим кол-вом строк, словари, массивы, коллекции
Мне нужно из одного документа, содержащего для каждого типа документа приоритет расставить...

11
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
30.12.2021, 12:44 2
RomanZemin, а как это на практике применять? Если у меня есть несколько строковых переменных, я явно знаю их число и мне не надо в вызове функции его указывать, я на месте и создам массив с ними.

Что, создание массиа - это такой уродующий всё своим повторением блок кода, что ли?
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 38
30.12.2021, 12:56  [ТС] 3
очень часто использую меню, хотелось бы всунуть это всё в одну библиотеку, дабы не писать каждый раз 100+ строк кода
0
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
30.12.2021, 13:21 4
C++
1
menu(3, {"Hello", "World", "I'm Func"});
1
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 38
30.12.2021, 13:37  [ТС] 5
как вариант, но немножко не то
0
4764 / 2574 / 892
Регистрация: 29.11.2010
Сообщений: 5,562
30.12.2021, 14:18 6
Цитата Сообщение от RomanZemin Посмотреть сообщение
но немножко не то
Тогда в С++ для вас есть вариативные шаблонные параметры.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
template<typename T>
void func(int x, const T &value) {
    std::cout << x << " = " << value << std::endl;
}
 
 
template<typename T, typename ... Args>
void func(int x, const T &value, Args... args) {
    func(x, value);
    func(x - 1, args...);
}
 
int main() {
 
    func(3, "first", "second", "third");
 
    return 0;
}
1
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
30.12.2021, 14:22 7
Цитата Сообщение от RomanZemin Посмотреть сообщение
как вариант, но немножко не то
так а в каком контексте применять это-то? Аргументы функции не юзер заполняет, а программист. Он эту функцию для себя написал.
Зачем это нужно в какой-нибудь библиотеке, которую ты пишешь для других прогеров, я ещё могу понять, Но в своей функции меню ты и так прекрасно знаешь, какие аргументы передаёшь!
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 38
30.12.2021, 16:58  [ТС] 8
нужно занести в массив
0
4764 / 2574 / 892
Регистрация: 29.11.2010
Сообщений: 5,562
30.12.2021, 17:51 9
нужно занести в массив
Вы это кому?
Вы это к чему?
Что вы хотите, чтобы мы сделали с этой информацией?
0
0 / 0 / 0
Регистрация: 13.09.2018
Сообщений: 38
30.12.2021, 21:07  [ТС] 10
По итогу пришёл к данному коду, но ошибка, не может преобразовать все значения в стринг(std::to_string: ни одна из 9 перегрузок не может преобразовать все типы аргументов)
C++
1
2
3
4
template<typename ... Args>
    void CreateMenu(int n, Args... args) {
        string List[]{ "", to_string(args)... };
        }
Большое спасибо за вариативные шаблоны!
0
4764 / 2574 / 892
Регистрация: 29.11.2010
Сообщений: 5,562
31.12.2021, 01:25 11
Цитата Сообщение от RomanZemin Посмотреть сообщение
template<typename ... Args>
    void CreateMenu(int n, Args... args) {
        string List[]{ "", to_string(args)... };
        }
А что вы потом в этой функции с List делать будете, даже если соберёте его?

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
template<typename ... Args>
void CreateMenu(Args... args) {
    const std::size_t size = sizeof ... (args);
    std::string list[size] = {args...};
    // ???
}
 
int main() {
 
    CreateMenu("first", "second", "third");
 
    return 0;
}
1
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.12.2021, 02:40 12
Лучший ответ Сообщение было отмечено RomanZemin как решение

Решение

Цитата Сообщение от RomanZemin Посмотреть сообщение
где 3 - количество строк, а потом идут сами строки:
зачем тебе отдельным параметром передавать кол-во строк,
если их кол-во итак известно?
это же просто кол-во аргументов функции:
https://rextester.com/JTJD31514

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
 
template<class... Args>
void Func(Args&& ...args)
{
    const std::string list[ sizeof...(args)  ] = { std::forward<Args>(args)... };
    
    size_t i = 0;
    for(const auto& s: list)
        std::cout << i << ") " << s << '\n', 
        ++i;
}
 
 
int main()
{
    Func("first", "second", "third");
}

Цитата Сообщение от lemegeton Посмотреть сообщение
А что вы потом в этой функции с List делать будете, даже если соберёте его?
странный вопрос.
ты не знаешь что можно делать с массивами данных?



Кликните здесь для просмотра всего текста
есть такая штука: "сишный способ передачи массивов в функции"
это - передача двух параметров: указатель на первый элемент, и кол-во элементов.

например:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <cassert>
 
void createMenu(const std::string* items, const size_t count) {
    assert(items);
    for(size_t i = 0; i != count; ++i)
        std::cout << i << ") " << items[i] << '\n';
}
 
int main() {
 
    const std::string items[] = { "open", "close", "exit" };
    createMenu(items, 3);
}
у такого сишного варианта есть существенный недостаток:
невозможно организовать поддержку инваринта функции createMenu

инвариант это...
способность функции сохранять собственную работоспособность
вне зависимости от корректности вызывающей стороны.

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

суть в том, что инвариантная функция не пропустит кривые аргументы в работу.


например, невозможно проконтролировать корректность значения параметра count
и если вызывающая сторона пришлет не_корректное значение,
то изнутри функции нет возможности никак это проверить.
такое вот ограничение языка си.

однако в с++ есть возможность реализовать безопасную версию функции в случае,
когда в качестве аргумента используется массив:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cassert>
 
void createMenu(const std::string* items, const size_t count) {
    assert(items);
    for(size_t i = 0; i != count; ++i)
        std::cout << i << ") " << items[i] << '\n';
}
 
 
template<size_t n>
void createMenu(const std::string (&items)[n]) {
    createMenu(items, n);
}
 
int main() {
 
    const std::string items[] = { "open", "close", "exit" };
    createMenu(items, 3);   // <--- небезопасно
    createMenu(items);      // <--- безопасно
}
т.е. по сути, это просто трамплин с "безопасных массивов с++" на "небезопасный сишный указатель"
компилятор будет автоматом подставлять априори корректные значения аргументов для сишной передачи,


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

https://rextester.com/BWYRU30665

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
#include <iostream>
#include <cassert>
 
void createMenu(const std::string* items, const size_t count) {
    assert(items);
    for(size_t i = 0; i != count; ++i)
        std::cout << i << ") " << items[i] << '\n';
}
 
template<size_t n>
void createMenu(const std::string (&items)[n]) {
    createMenu(items, n);
}
 
template<class A> 
void createMenu(const A& a)
{
    const std::string items[1] = {a};
    createMenu(items);
}
 
template<class A, class B, class... Args>
std::enable_if_t< !std::is_convertible_v<B, size_t> >    
createMenu(const A& a, const B& b, const Args& ...args)
{
    const std::string items[ sizeof...(args) + 2  ] = { 
        a, b, args...
    };
    createMenu(items);
}
 
int main() 
{
    const std::string items[] = { "open", "close", "exit" };
    createMenu(items, 3);                  // <--- небезопасно
    createMenu(items);                     // <--- безопасно
    createMenu("open", "close", "exit");   // <--- безопасно
    createMenu("open", "close");           // <--- безопасно 
    createMenu("open");                    // <--- безопасно
}
и вот мы здесь: в этой теме.

полагаю у автора есть идеи,
как именно он хочет поступить с получаемым массивом.

он лишь хотел понять,
как это можно сделать с максимальным для него комфортом.



/ps
ты там в своем коде constexpr профакапил.
1
31.12.2021, 02:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.12.2021, 02:40
Помогаю со студенческими работами здесь

Взаимосвязь кол-ва ключевых с кол-вом посетителей
Подскажите, если Взаимосвязь кол-ва ключевых с кол-вом посетителей? Если да? Какие ключевые и на...

Цветок с заданным кол-вом лепестков
У меня такая проблема .Задание звучит так составить программу рисующую цветок(число лепестков...

Шаблон с ограниченным кол-вом типов
Всем хорошего настроения. Допустим у нас есть код #include &lt;iostream&gt; template&lt;typename...

Структуры с переменным кол-вом аргументов
Суть задачи - создать &quot;хранилище данных&quot;, которое может изменять как свои члены ( по типу, например...

запись с максимальным кол-вом повторений
допустим, есть следующая таблица из 1 колонки: КОЛОНКА1 1 1 2 3 2 3 1

Возникла проблема с кол-вом контролов на форме?
VB выдает ошибку что кол-во контролов на форме превышает допустимое значение. Можно ли это...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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