Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344

Как вставить массив в функцию, не объявляя его?

17.11.2022, 01:49. Показов 1773. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всех приветствую. Есть функция:
C++
1
    bool UpdateGamesFromUrl(CString url, CString res_path, int beta = 0, int* filters = NULL,int size=0);
Я хочу вставить туда одноэлементный массив,не объявляя его.
C++
1
2
UpdateGamesFromUrl(L"some_url",
        L"some_file_name", {2}, 1);
Но у меня выдаётся ошибка: аргумент типа "int" несовместим с параметром типа "int *". Можно ли как-то вставить массив в функцию напрямую,не объявляя его отдельно,или переделать функцию так,чтобы это можно было сделать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.11.2022, 01:49
Ответы с готовыми решениями:

Можно ли переопределить функцию-член в унаследованном классе, не объявляя её виртуальной в родительском?
Предположим, есть абстрактный класс Worker. class Worker { protected: char *myName; int value; private: ...

Как взять полученный результат из одного массива и вставить его в другой массив?
Доброго времени суток. Хотел спросить как можно взять полученный результат из одного метода и вставить его в другой для продолжения...

Массив: Вставить некоторое заданное число b в массив, сохраняя его упорядоченность.
Дан некоторый упорядоченный массив чисел (отсортированный в порядке возрастания). Написать программу, позволяющую вставить некоторое...

30
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
18.11.2022, 00:15
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от КАВ Посмотреть сообщение
Как вставить массив в функцию, не объявляя его?
Цитата Сообщение от КАВ Посмотреть сообщение
bool UpdateGamesFromUrl(CString url, CString res_path, int beta = 0, int* filters = NULL,int size=0);
С такой сигнатурой функции - никак.

Цитата Сообщение от КАВ Посмотреть сообщение
Это не дало ответа на мои вопросы.
Потому что не ясен вопрос.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
18.11.2022, 00:16
Цитата Сообщение от КАВ Посмотреть сообщение
просто я читал,что int* filters и int filters[],это одно и то же.
Только при объявлении параметров функций. В остальных случаях - ничего общего.

Цитата Сообщение от КАВ Посмотреть сообщение
А под объявить я имею ввиду:
C++
1
2
int numbers[2] = {1,2};
fu(2,numbers);
А я хочу просто:
C++
1
foo(2,{1,2});
Приблизительно это можно сделать так

C++
1
2
using A = int[];
foo(2, A{1,2});
Без дополнительного объявления типа - не получится.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
18.11.2022, 00:17
Цитата Сообщение от КАВ Посмотреть сообщение
или переделать функцию так,чтобы это можно было сделать?
Переделали функцию что бы это можно было делать.
Что еще нужно ?
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
18.11.2022, 00:20  [ТС]
В общем,как я понял,для моей задачи подойдёт вектор. см Как вставить в строку все элементы массива через запятую в поле ввода mfc
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
18.11.2022, 00:26
Цитата Сообщение от КАВ Посмотреть сообщение
В общем,как я понял,для моей задачи подойдёт вектор
В смысле?

1. Если у вас есть возможность исправить объявление UpdateGamesFromUrl не вектор, то зачем тогда было вообще весь огород городить?

2. Притягивать за уши вектор с его динамическим распределением памяти туда, где нужен лишь мимолетный временный массив - странная идея.
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
18.11.2022, 05:06  [ТС]
Первый раз вижу,чтобы через using можно было объявлять дополнительный тип. Интересно,как это называется в c++? Вот этот код,с объявлением дополнительного типа достаточно поместить в cpp файле,или он должен быть в заголовочном файле тоже?

Добавлено через 4 минуты
2. Притягивать за уши вектор с его динамическим распределением памяти туда, где нужен лишь мимолетный временный массив - странная идея.
Я точно не могу знать длинну массива,которую захочет использовать пользователь. Максимум она будет равна 5,но это максимум.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
18.11.2022, 08:16
Цитата Сообщение от КАВ Посмотреть сообщение
Первый раз вижу,чтобы через using можно было объявлять дополнительный тип. Интересно,как это называется в c++?
С появления С++11 прошло уже 11 лет...

Цитата Сообщение от КАВ Посмотреть сообщение
Вот этот код,с объявлением дополнительного типа достаточно поместить в cpp файле,или он должен быть в заголовочном файле тоже?
Не понимаю вопроса. Он должен быть там, где он нужен. При чем здесь заголовочные файлы?

Цитата Сообщение от КАВ Посмотреть сообщение
Я точно не могу знать длинну массива,которую захочет использовать пользователь. Максимум она будет равна 5,но это максимум.
Тем более странно притягивать сюда за уши вектор.

Еще раз: вы можете менять объявление функции?
0
 Аватар для Tanya2007
593 / 230 / 72
Регистрация: 13.05.2020
Сообщений: 412
18.11.2022, 09:58
Цитата Сообщение от КАВ Посмотреть сообщение
Я хочу вставить туда одноэлементный массив,не объявляя его.
Как вариант без объявления массива можно сделать так, но это только для одноэлементного массива отработает:

C++
1
  UpdateGamesFromUrl(L"some_url",L"some_file_name", 0, &(*new int[1] = 2), 1);
Но тогда в самой функции UpdateGamesFromUrl, после работы с переменной filters, когда этот массив уже не будет нужен, необходимо очищать память, выделенную через new:

C++
1
delete [] filters;
0
17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344
18.11.2022, 16:57  [ТС]
Тем более странно притягивать сюда за уши вектор.
Поскольку:
1. Я хочу,чтобы я мог сразу вставлять значения в функцию,не объявляя дополнительных переменных.
2. у вектора проще находить длину,и мне не надо вводить параметр size.
вы можете менять объявление функции?
Конечно. Вообще мне нужно сформировать url,по которому будет делаться запрос. В параметре запроса будет filters,т.е список значений,через запятую. Этот список я хочу брать из массива. Вообще по хорошему мне нужна функция с неограниченным количеством аргументов,но поскольку я прочитал,что с получением аргументов много мороки,я решил остановиться на массиве. Сейчас я использую вектор,но там есть некоторые проблемы. Вот что примерно я хочу получить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
bool LauncherDialog::UpdateGamesFromUrl(CString url,CString res_path,int beta, std::vector<int> filters) {
    if (beta != 0 || filters.size()>0) url += L"?";
    if (beta != 0) url += L"beta=" + beta;
    if (filters.size()>0) {
        filters.shrink_to_fit();
        CString values=beta!=0?L"&acc=":L"acc=";
        for (int a = 0; a < filters.size(); a++) values += a < filters.size() - 1 ? (filters[a] + L",") : L"" + filters[a];
        url += values;
        filters.clear();
    }
...
}
Т.е мне нужно собрать строку из массива. По сути максимальное число элементов,которое мне нужно - 4-5,но количество может быть и меньше и даже 0 и массив может быть NULL,что и есть по умолчанию. Конечно,в некоторых случаях я буду объявлять массив,но для тестирования и быстроты хотелось бы,чтобы эти значения можно было вставлять напрямую через {}.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
18.11.2022, 19:48

Не по теме:

Цитата Сообщение от КАВ Посмотреть сообщение
filters.shrink_to_fit();
Зачем это делается?



Добавлено через 18 минут
Цитата Сообщение от КАВ Посмотреть сообщение
Т.е мне нужно собрать строку из массива.
Для того, чтобы собралось в онлайн компиляторе, заменил CString на std::wstring:
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
#include <iostream>
#include <string>
 
bool UpdateGamesFromUrl(std::wstring url, std::wstring res_path, int beta, std::initializer_list<int> filters) {
    if (beta != 0 || filters.size() > 0) url += L"?";
    if (beta != 0) url += L"beta=" + std::to_wstring(beta);
    if (filters.size() > 0) {
        auto beg = filters.begin();
        std::wstring values(beta != 0 ? L"&acc=" : L"acc=");
        values += std::to_wstring(*beg);
        for(++beg; beg != filters.end(); ++beg) {
            values += L"," + std::to_wstring(*beg);
        }
        url += values;
    }
    std::wcout << url; // это только для демонстрации
    //..........
    return true;
}
 
int main()
{
    UpdateGamesFromUrl(L"http://test/", L"path", 1, {1,2,3,4});
}
Доказательство работоспособности: https://rextester.com/WSKVL42678

Т.к. вы ждете готовых рабочих решений сразу оговариваюсь, что вам необходимо самостоятельно заменить std::wstring на CString и самостоятельно найти аналог\замену функции std::to_wstring, которая конвертирует число в строку. В остальном этот концепт полностью отвечает на вопрос из стартового сообщения, с учетом тех вводных, которые уже были даны (если есть какие-то новые вводные, или старые, но не озвученные прежде, то претензии к их отсутствию в коде не принимаются по очевидным причинам).
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,308
18.11.2022, 20:51
Цитата Сообщение от Tanya2007 Посмотреть сообщение
Как вариант без объявления массива можно сделать так, но это только для одноэлементного массива отработает:

C++
1
  UpdateGamesFromUrl(L"some_url",L"some_file_name", 0, &(*new int[1] = 2), 1);
Это - странный способ, но не ясно, зачем вы делали все эти извращения с * и &, и почему только "для одноэлементного массива". Кто вам мешает сделать

C++
1
  UpdateGamesFromUrl(L"some_url",L"some_file_name", 0, new int[]{ 1, 2, 3, 4, 5 }, 5);
?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.11.2022, 20:51

Найти минимальный элемент массива и вставить его в массив по индексу, сдвигая изначальный массив
Помогите пожалуйста, задан массив целых чисел, нужно найти минимальный элемент этого массива и вставить его в массив по индексу, сдвигая...

Как задать цикл внутри кусочно заданной функции или взять массив значений из цикла и вставить в кусочную функцию
Как задать цикл внутри кусочно заданной функции или взять массив значений из цикла и вставить в кусочную функцию?? Ибо у меня при...

Зачем нужен массив указателей на функцию и как его использовать?
народ подскажите пожалуйста, зачем нужен массив указателей на функцию и как его использовать.

Как одномерный массив превратить в двумерный и вызвать потом его в новую функцию?
Pазработать функцию, которая на входе принимает одномерный массив. Одномерный массив размером M * N элементов превратить в двумерный...

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


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru