17 / 5 / 0
Регистрация: 16.04.2016
Сообщений: 344

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

17.11.2022, 01:49. Показов 1783. Ответов 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,309
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,309
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,309
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,309
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru