Форум программистов, компьютерный форум CyberForum.ru

Из некоторого непостоянного числа переменных одного типа выбрать случайную переменную - C++

Восстановить пароль Регистрация
 
re-marka
 Аватар для re-marka
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 12
19.10.2012, 14:41     Из некоторого непостоянного числа переменных одного типа выбрать случайную переменную #1
Такой вопрос.

Мне в программе нужно часто выбирать из некоторого непостоянного числа переменных одного типа (например, векторов, но не обязательно) случайную переменную. Вот, хотелось бы поэтому иметь функцию, которая по переданным указателям выбирала бы из них случайный.

Вот что написала, поискав в сети..

в заголовочном файле класса:

C++
1
2
template< class T > 
static T* selectRandomArgument(int num, T* first,...);
в cpp файле класса:

C++
1
2
3
4
5
6
7
template< class T > 
T* Util::selectRandomArgument(int num, T* first,...)
{
    T** poiner = &first;
    int rand = generateRandomIntegerValue(0, num);
    return *(poiner+rand);
}
не работает..
такая ошибка при вызове этой функции

C++
1
>AgentInfo.obj : error LNK2019: unresolved external symbol "public: static class std::vector<class std::vector<double,class std::allocator<double> >.....
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.10.2012, 14:41     Из некоторого непостоянного числа переменных одного типа выбрать случайную переменную
Посмотрите здесь:

C++ Как поменять значения двух переменных не используя дополнительную переменную?
C++ Вычислить сумму делителей некоторого числа СН
С++ из одного созданного массива выбрать числа и записать их в новый массив C++
Можно ли из числа типа double получить 2 числа типа int? C++
Даны целые положительные числа аь а2,., а„. Найти среди них те, которые являются квадратами некоторого числа т C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
19.10.2012, 14:47     Из некоторого непостоянного числа переменных одного типа выбрать случайную переменную #2
Для работы с переменным число аргументов нужен заголовочный файл <cstdarg>.
Ошибка которая у вас не понятно о чем, так как выведен не полный текст.
re-marka
 Аватар для re-marka
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 12
19.10.2012, 14:54  [ТС]     Из некоторого непостоянного числа переменных одного типа выбрать случайную переменную #3
Цитата Сообщение от Герц Посмотреть сообщение
Для работы с переменным число аргументов нужен заголовочный файл <cstdarg>.
Ошибка которая у вас не понятно о чем, так как выведен не полный текст.
попробовала подключить, не помогло.
вот полный текст ошибки
если закомментить вызов функции этой, то все работает

а вообще по смыслу решение нормальное?

C++
1
>AgentInfo.obj : error LNK2019: unresolved external symbol "public: static class std::vector<class std::vector<double,class std::allocator<double> >,class std::allocator<class std::vector<double,class std::allocator<double> > > > * __cdecl Util::selectRandomArgument<class std::vector<class std::vector<double,class std::allocator<double> >,class std::allocator<class std::vector<double,class std::allocator<double> > > > >(int,class std::vector<class std::vector<double,class std::allocator<double> >,class std::allocator<class std::vector<double,class std::allocator<double> > > > *,...)" (??$selectRandomArgument@V?$vector@V?$vector@NV?$allocator@N@std@@@std@@V?$allocator@V?$vector@NV?$allocator@N@std@@@std@@@2@@std@@@Util@@SAPAV?$vector@V?$vector@NV?$allocator@N@std@@@std@@V?$allocator@V?$vector@NV?$allocator@N@std@@@std@@@2@@std@@HPAV12@ZZ) referenced in function "public: void __thiscall AgentInfo::addAndDeleteConections(class std::vector<int,class std::allocator<int> >,class std::vector<int,class std::allocator<int> >,double,double)" (?addAndDeleteConections@AgentInfo@@QAEXV?$vector@HV?$allocator@H@std@@@std@@0NN@Z)
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
19.10.2012, 15:09     Из некоторого непостоянного числа переменных одного типа выбрать случайную переменную #4
Так его не просто подключать, а использовать надо.
Функции с переменным числом параметров - зло.

Зачем в твоем методе второй параметр, каково его назначение?

Добавлено через 9 минут
Вот тебе пример:
http://liveworkspace.org/code/0a4cdc...a9a31c2250b2cf
re-marka
 Аватар для re-marka
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 12
19.10.2012, 15:10  [ТС]     Из некоторого непостоянного числа переменных одного типа выбрать случайную переменную #5
Цитата Сообщение от Герц Посмотреть сообщение
Так его не просто подключать, а использовать надо.
Функции с переменным числом параметров - зло.

Зачем в твоем методе второй параметр, каково его назначение?
я не спец, но сейчас поясню, как я поняла из того что прочитала

передаваемые в функцию аргументы помещаются в стек, и к ним можно обратиться по указателю, если знать адрес первой переменной и ее тип (это для того, чтобы объявить сам указатель).
Для этого и передается второй параметр. Т.е. знаем адрес первого аргумента, прибавляем к указателю номер аргумента, получаем адрес n-того - к любому доступ имеем

а первый параметр нужен для того, чтобы знать сколько всего их, иначе непонятно, как их пересчитать

как-то так.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
19.10.2012, 15:10     Из некоторого непостоянного числа переменных одного типа выбрать случайную переменную #6
re-marka, если тип одинаков для всех - засовывайте в контейнер. Если нет, то можно попробовать написать compile-time генератор рандомных чисел и использовать tuple. Либо так
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
#include <iostream>
#include <utility>
#include <random>
 
template <class T>
void show(T&& t)
{
    std::cout << std::forward<T>(t) << std::endl;
}
 
template <class T>
void show_random(T&& t)
{
    show(std::forward<T>(t));
}
 
template <class T, class... Args>
void show_random(T&& t, Args&&... args)
{
    if(std::random_device()() & 1)
        show(std::forward<T>(t));
    else
        show_random(std::forward<Args>(args)...);
}
 
int main()
{
    show_random(3.14, 42, 36, "Hi");
    return 0;
}
re-marka
 Аватар для re-marka
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 12
19.10.2012, 15:13  [ТС]     Из некоторого непостоянного числа переменных одного типа выбрать случайную переменную #7
Цитата Сообщение от Герц Посмотреть сообщение
Функции с переменным числом параметров - зло.
мне просто нужно часто выбирать из 1-5 разных векторов или переменных других типов один случайный
как это лучше сделать?
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
19.10.2012, 15:13     Из некоторого непостоянного числа переменных одного типа выбрать случайную переменную #8
передаваемые в функцию аргументы помещаются в стек, и к ним можно обратиться по указателю, если знать адрес первой переменной и ее тип (это для того, чтобы объявить сам указатель).
Для этого и передается второй параметр. Т.е. знаем адрес первого аргумента, прибавляем к указателю номер аргумента, получаем адрес n-того - к любому доступ имеем
Это неверно, так как существуют разные соглашения о передаче параметров в процедуры.
мне просто нужно часто выбирать из 1-5 разных векторов или переменных других типов один случайный
как это лучше сделать?
http://liveworkspace.org/code/0a4cdc...a9a31c2250b2cf
Но лучше всего использовать контейнеры. Вы же все равно не сможете генерировать список параметров переменной длины прямо во время исполнения программы, это можно сделать лишь во время компиляции.
re-marka
 Аватар для re-marka
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 12
19.10.2012, 15:28  [ТС]     Из некоторого непостоянного числа переменных одного типа выбрать случайную переменную #9
Цитата Сообщение от Герц Посмотреть сообщение
Это неверно, так как существуют разные соглашения о передаче параметров в процедуры.

http://liveworkspace.org/code/0a4cdc...a9a31c2250b2cf
спасибо за ссылку
попробую

Цитата Сообщение от Герц Посмотреть сообщение
Но лучше всего использовать контейнеры. Вы же все равно не сможете генерировать список параметров переменной длины прямо во время исполнения программы, это можно сделать лишь во время компиляции.
мне и не надо во время исполнения
просто у меня часто встречается такая ситуация, например v1, v2, v3 - разные векторы, хранятся в разных классах, нужно из них выбрать случайный
использовать контейнеры - это засовывать каждый раз все в вектор, генерить случайный индекс и по нему выбирать?
просто мне как раз в самом коде хотелось иметь простую функцию, в которую передаешь несколько адресов, а она выбирает один случайный, а не писать по сто раз одно и то же..

Добавлено через 45 секунд
Цитата Сообщение от soon Посмотреть сообщение
re-marka, если тип одинаков для всех - засовывайте в контейнер. Если нет, то можно попробовать написать compile-time генератор рандомных чисел и использовать tuple. Либо так
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
#include <iostream>
#include <utility>
#include <random>
 
template <class T>
void show(T&& t)
{
    std::cout << std::forward<T>(t) << std::endl;
}
 
template <class T>
void show_random(T&& t)
{
    show(std::forward<T>(t));
}
 
template <class T, class... Args>
void show_random(T&& t, Args&&... args)
{
    if(std::random_device()() & 1)
        show(std::forward<T>(t));
    else
        show_random(std::forward<Args>(args)...);
}
 
int main()
{
    show_random(3.14, 42, 36, "Hi");
    return 0;
}
Вам тоже спасибо )) попробую разобраться, так сходу сложно для меня.

Добавлено через 1 минуту
Цитата Сообщение от Герц Посмотреть сообщение
Это неверно, так как существуют разные соглашения о передаче параметров в процедуры.
а что именно неверно? т.е. для переменных одного типа, я по описанной мной схеме не смогу обратиться к произвольной?
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
19.10.2012, 15:33     Из некоторого непостоянного числа переменных одного типа выбрать случайную переменную #10
Т.е. знаем адрес первого аргумента, прибавляем к указателю номер аргумента, получаем адрес n-того - к любому доступ имеем
Откуда у вас уверенность, что нужно именно прибавлять?
Они вовсе не обязательно лежат там в таком же порядке, в котором вы их передаете в функцию.
re-marka
 Аватар для re-marka
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 12
19.10.2012, 19:56  [ТС]     Из некоторого непостоянного числа переменных одного типа выбрать случайную переменную #11
Цитата Сообщение от Герц Посмотреть сообщение
Откуда у вас уверенность, что нужно именно прибавлять?
Они вовсе не обязательно лежат там в таком же порядке, в котором вы их передаете в функцию.
ну про такие тонкости я не знаю, прочитала, что лежат так
кстати, я проверила, действительно так и лежат.
а чего зависит, как они туда складываться будут? от компилятора? (может глупый вопрос..)

*
с проблемой разобралась, ошибка вообще не в этом была
мой вариант тоже работает.
всем спасибо.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
19.10.2012, 20:01     Из некоторого непостоянного числа переменных одного типа выбрать случайную переменную #12
От компилятора, от системы, к примеру ms c++ compiler позволяет указывать всякие fastcall'ы и т.п., такие функции тоже будут передавать аргументы не так, как ты ожидаешь.

Лучше использовать тот вариант, который я выложил на LiveWorkspace, он хотя бы по стандарту. А твой нет )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2012, 20:04     Из некоторого непостоянного числа переменных одного типа выбрать случайную переменную
Еще ссылки по теме:

Найти числа, которые являются квадратами некоторого другого числа C++
Как записать в переменную значения других переменных? C++
C++ Битовые сдвиги. Запись 1-2 байтных переменных в 8 байтную переменную

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

Или воспользуйтесь поиском по форуму:
re-marka
 Аватар для re-marka
0 / 0 / 0
Регистрация: 17.10.2011
Сообщений: 12
19.10.2012, 20:04  [ТС]     Из некоторого непостоянного числа переменных одного типа выбрать случайную переменную #13
Цитата Сообщение от Герц Посмотреть сообщение
От компилятора, от системы, к примеру ms c++ compiler позволяет указывать всякие fastcall'ы и т.п., такие функции тоже будут передавать аргументы не так, как ты ожидаешь.
понятно примерно.

Цитата Сообщение от Герц Посмотреть сообщение
Лучше использовать тот вариант, который я выложил на LiveWorkspace, он хотя бы по стандарту. А твой нет )
я его и использовала в итоге )
Yandex
Объявления
19.10.2012, 20:04     Из некоторого непостоянного числа переменных одного типа выбрать случайную переменную
Ответ Создать тему
Опции темы

Текущее время: 21:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru