Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функция с переменным числом параметров 
:(
    Опции темы
ИванМ
Дата 3.6.2011, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Как в функцию вида func(size_t n, ...) передать неизвестное на момент компиляции число аргументов? Я кроме ассемблерных вставок ни до чего не додумался.
PM MAIL   Вверх
azesmcar
Дата 3.6.2011, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(ИванМ @  3.6.2011,  20:50 Найти цитируемый пост)
Как в функцию вида func(size_t n, ...) передать неизвестное на момент компиляции число аргументов?

Давай подробнее о задаче.
PM   Вверх
ИванМ
Дата 3.6.2011, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Нужно интерпретированное выражение вида
кол-во
тип1
значение1
тип2
значение2
...
типn
значениеn

передать в функцию.
Т.е. на момент компилирования программы, мы не знаем каким будет это интерпретированное выражение поэтому не можем написать
func(size_t n, тип1, значение1, тип2, значени2, ... типn, значениеn), т.к. n неизветсно.
Если передавать вторым параметром структуру, то тоже непонятно как, т.к. размер структуры должен быть тоже заранее известен. 
PM MAIL   Вверх
azesmcar
Дата 3.6.2011, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(ИванМ @  3.6.2011,  21:10 Найти цитируемый пост)
Если передавать вторым параметром структуру, то тоже непонятно как, т.к. размер структуры должен быть тоже заранее известен.  

а что мешает запихнуть это все в контейнер и передать в функцию?
PM   Вверх
ИванМ
Дата 3.6.2011, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Думаю еще вариант через vector, но он вроде содержит доп. поля.

Добавлено через 49 секунд
azesmcar, ты меня опередил. Вроде контейнеры содержат доп. информацию.
PM MAIL   Вверх
azesmcar
Дата 3.6.2011, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(ИванМ @  3.6.2011,  21:11 Найти цитируемый пост)
Думаю еще вариант через vector, но он вроде содержит доп. поля. 

в каком смысле?
PM   Вверх
ИванМ
Дата 3.6.2011, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Мне нужно именно через такую функцию func(size_t n, ...).
PM MAIL   Вверх
azesmcar
Дата 3.6.2011, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(ИванМ @  3.6.2011,  21:13 Найти цитируемый пост)
Мне нужно именно через такую функцию func(size_t n, ...). 

Вот я и спрашиваю почему?
PM   Вверх
ИванМ
Дата 3.6.2011, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Имею ввиду, что если передать
func(size_t n, vector<T>), то в функцию передастся мусор, кот. содержится в векторе помимо самих данных.

PM MAIL   Вверх
azesmcar
Дата 3.6.2011, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(ИванМ @  3.6.2011,  21:14 Найти цитируемый пост)
func(size_t n, vector<T>), то в функцию передастся мусор, кот. содержится в векторе помимо самих данных.

1. какой еще мусор? откуда он там появился?
2. пусть даже так, почему тебя это волнует?
3. кто мешает написать свой контейнер, или в крайнем случае запихнуть все в обыкновенный массив (заметь, я сказал не вектор а контейнер)?
PM   Вверх
ИванМ
Дата 3.6.2011, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Почему.
На самом деле контейнеры вообще никак нельзя передавать иначе я вернусь к тому, откуда пришел.
Дело в том, что когда я передавал контейнеры, это занимало много времени в момент интерпретации при копировании их из одного места в другое. Поэтому я решил передавать напрямую через стек.
PM MAIL   Вверх
azesmcar
Дата 3.6.2011, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(ИванМ @  3.6.2011,  21:17 Найти цитируемый пост)
Дело в том, что когда я передавал контейнеры, это занимало много времени в момент интерпретации при копировании их из одного места в другое. Поэтому я решил передавать напрямую через стек. 

А зачем копировал? Передавай по ссылке. И потом какая разница что копировать? Я не понимаю твоей проблемы, описывай подробнее.

Это сообщение отредактировал(а) azesmcar - 3.6.2011, 21:18
PM   Вверх
ИванМ
Дата 3.6.2011, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Я передавал по ссылке.
Например есть набор разнородных данных, которые надо вытащить и передать в функцию.
Я делал как. Создавал вектор, складывая туда все эти нужные мне данные, и потом его передавал по ссылке. Но это жрет много вычислительных ресурсов при больших вычислениях.
PM MAIL   Вверх
azesmcar
Дата 3.6.2011, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(ИванМ @  3.6.2011,  21:21 Найти цитируемый пост)
надо вытащить и передать в функцию

Откуда вытащить?
PM   Вверх
ИванМ
Дата 3.6.2011, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



azesmcar, из другого контейнера.
PM MAIL   Вверх
azesmcar
Дата 3.6.2011, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(ИванМ @  3.6.2011,  21:23 Найти цитируемый пост)
azesmcar, из другого контейнера. 

Ну так не вытаскивай, его же и передавай smile 
PM   Вверх
ИванМ
Дата 3.6.2011, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Тогда надо еще передать порядок чтения этих элементов, и кроме того эти две части не должны друг про друга много знать.
PM MAIL   Вверх
azesmcar
Дата 3.6.2011, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(ИванМ @  3.6.2011,  21:30 Найти цитируемый пост)
Тогда надо еще передать порядок чтения этих элементов, и кроме того эти две части не должны друг про друга много знать. 

Отсортируй как надо перед тем, как передавать в функцию или храни контейнер уже отсортированным.
PM   Вверх
ИванМ
Дата 3.6.2011, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Добавлено @ 21:38
Сортировка тут не причем, так как порядок может быть не поддающийся алгоритму сортировки. Если бы даже можно было нарушать порядок, сортировка заняла бы тоже много времени.

Добавлено @ 21:44
Задача такая.
Есть несколько предикатов, имеющих свою структуру (последовательность лексем или действий) и внутренние переменные. Нужно вызвать из одного предиката другой, передав ему в качестве параметров некоторые свои внутренние переменные.

Это сообщение отредактировал(а) ИванМ - 3.6.2011, 21:48
PM MAIL   Вверх
asmdzen
Дата 3.6.2011, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



ИванМ, но если функция не знает какие именно параметры она принимает, как она с ними будет работать? я понимаю какой-нибудь sprintf(), а как эта будет работать?
PM MAIL   Вверх
ИванМ
Дата 3.6.2011, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



asmdzen, функция знает: у нее первый параметр - число параметров. Не знает компилятор.
PM MAIL   Вверх
asmdzen
Дата 3.6.2011, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(ИванМ @  3.6.2011,  21:10 Найти цитируемый пост)
func(size_t n, тип1, значение1, тип2, значени2, ... типn, значениеn), т.к. n неизветсно.


так это получается что-то подобное:
Код

func(size_t n, int x, double y, float z);


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

чем va_list не устраивает?


Это сообщение отредактировал(а) asmdzen - 3.6.2011, 22:59
PM MAIL   Вверх
ИванМ
Дата 3.6.2011, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



asmdzen, 
читайте внимательно:
Цитата(ИванМ @  3.6.2011,  21:10 Найти цитируемый пост)
Нужно интерпретированное выражение вида
кол-во
тип1
значение1
тип2
значение2
...
типn
значениеn


Цитата

чем va_list не устраивает?

Вполне устраивает для чтения аргументов, но мне нужно для передачи.
PM MAIL   Вверх
asmdzen
Дата 3.6.2011, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



теперь понял )
не будет ли удобней написать enum со всеми возможными типами и потом уже делать cast?
PM MAIL   Вверх
ИванМ
Дата 3.6.2011, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Цитата(asmdzen @  3.6.2011,  23:27 Найти цитируемый пост)
не будет ли удобней написать enum со всеми возможными типами и потом уже делать cast? 

так в принципе и сделано
PM MAIL   Вверх
asmdzen
Дата 3.6.2011, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(asmdzen @  3.6.2011,  22:46 Найти цитируемый пост)
если функция не знает какие именно параметры она принимает, как она с ними будет работать?

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

Это сообщение отредактировал(а) asmdzen - 3.6.2011, 23:35
PM MAIL   Вверх
ИванМ
Дата 4.6.2011, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



asmdzen, нет, смысл в том, что я не знаю сколько параметров нужно передать. Знает только интерпретатор. Он и будет передавать.
Когда интерпретатор будет передавать параметры, он уже будет знать сколько их и поэтому первым параметром передаст число этих параметров. Т.е. функция, когда ее вызовут, будет знать, сколько их пришло. Но кроме функции и интерпретатора больше никто не знает.
PM MAIL   Вверх
asmdzen
Дата 4.6.2011, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



ИванМ, это я понял, я не догоняю что функция с ними делать будет, не встречал еще такое. Ну есть у меня функция с переменным числом параметров, но нет никакого формата как в printf, есть только типы переменных и их значения, что мне с этими параметрами делать? если бы это была очередь и заранее неизвестно есть там все параметры или нет, то я понимаю, но если неизвестно ни количество параметров ни их порядок?
PM MAIL   Вверх
500mhz
Дата 4.6.2011, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



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


--------------------

PM MAIL ICQ   Вверх
ИванМ
Дата 4.6.2011, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Цитата(asmdzen @  4.6.2011,  09:20 Найти цитируемый пост)
 если бы это была очередь и заранее неизвестно есть там все параметры или нет, то я понимаю, но если неизвестно ни количество параметров ни их порядок? 

Почему неизвестно все параметры или нет. Как раз известно. Число параметров передается первым параметром. Сколько сказано, столько и будет. Порядок тоже известен: от первого к последнему.

Цитата(500mhz @  4.6.2011,  09:48 Найти цитируемый пост)
передавай указатель на структуру заполненую параметрами, где первым к примеру идет кол-во параметров. 

Мне нужна именно запись вида:
funt(count, тип, значение, ...)
Это во первых, а вторых любая структура имеет определенный размер, задаваемый при компиляции. А у меня переменный размер.
PM MAIL   Вверх
ИванМ
Дата 4.6.2011, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Цитата(asmdzen @  4.6.2011,  09:20 Найти цитируемый пост)
что функция с ними делать будет,

Предположим, нужна такая функция, которая бы выводила на экран все параметры. Функция printf не подойдет, т.к. она имеет фиксированный формат.
Т.е. например printf("%s%s", s1, s2). А мне нужно printf("%s...%s, s1, ... sn).
PM MAIL   Вверх
asmdzen
Дата 4.6.2011, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



можно сгенерировать формат для printf, потом передать "... параметры" как va_list функции vsnprintf.
PM MAIL   Вверх
ИванМ
Дата 4.6.2011, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



asmdzen, про формат понимаю, можно сгенерить, а вот как остальную часть. Чтобы передавать неизвестное на этапе компиляции число параметров.
PM MAIL   Вверх
500mhz
Дата 4.6.2011, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



Цитата

Это во первых, а вторых любая структура имеет определенный размер, задаваемый при компиляции. А у меня переменный размер. 

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


--------------------

PM MAIL ICQ   Вверх
asmdzen
Дата 4.6.2011, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



Цитата(ИванМ @  4.6.2011,  13:11 Найти цитируемый пост)
как остальную часть
 так передавайте как vsnprintf'у,
Код

void myFunc(const char* format, ...);


вызываем так:
Код

int myInt;
float myFloat;
char* myStr = "Hello";
myFunc("%d %f %s", myInt, myFloat, myStr);


PM MAIL   Вверх
ИванМ
Дата 5.6.2011, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



500mhz, при чем тут структура и динамический размер. Размер структуры имеет фиксированный размер.

Цитата(asmdzen @  4.6.2011,  14:03 Найти цитируемый пост)
вызываем так:

А если в одном случае нужно передать 
Код

myFunc("%d %f %s", myInt, myFloat, myStr);

а в другом 
Код

myFunc("%d %d %f %s", myInt, myInt2, myFloat, myStr);

Причем не я это должен писать каждый раз по разному, а интерпретатор.
Такой пример.
T* - Дин. массив
fuct1 (T* arr, size_t cnt);
fuct2 (size_t, el1, el2, el3...)
фунция fuct1 должна передавать в fuct2 все свои элементы массива поочереди.
Если arr = [1, 2, 3] то передать должна
func(3, 1, 2, 3).
Если arr = [1, 2, 3, 4] то передать должна
func(4, 1, 2, 3, 4).
и т.д.
PM MAIL   Вверх
mes
Дата 5.6.2011, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



ИванМ,  C++  или plain C ?


--------------------
PM MAIL WWW   Вверх
ИванМ
Дата 5.6.2011, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



mes, вообще я пишу на си++, но эти функции будут extern "C".

Добавлено через 3 минуты и 36 секунд
Точнее скорее всего эту будет чистый ассемблер, т.к. скорее всего на си/си++ это нереализуемо.
PM MAIL   Вверх
borisbn
Дата 5.6.2011, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



ИванМ, небольшой оффтоп - а что за задача, которую можно решить только на ассемблере, а на Си нельзя?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
ИванМ
Дата 5.6.2011, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



borisbn, вообще то о задаче я писал. Передать неизвестное на момент компиляции число параметров через стек, не используя ассемблер.

Это сообщение отредактировал(а) ИванМ - 5.6.2011, 22:20
PM MAIL   Вверх
volatile
Дата 6.6.2011, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(ИванМ @  5.6.2011,  11:32 Найти цитируемый пост)
Такой пример.
T* - Дин. массив
fuct1 (T* arr, size_t cnt);
fuct2 (size_t, el1, el2, el3...)
фунция fuct1 должна передавать в fuct2 все свои элементы массива поочереди.
Если arr = [1, 2, 3] то передать должна
func(3, 1, 2, 3).
Если arr = [1, 2, 3, 4] то передать должна
func(4, 1, 2, 3, 4).
и т.д. 

В этом примере типы одинаковые. Прежде вы говорили что типы, у каждого параметра разные.
Почему-бы вообще не убрать fuct1, а все сделать в fuct2?
Или приведите пример, отвечающий первоначальному условию.

Цитата(ИванМ @  5.6.2011,  15:15 Найти цитируемый пост)
Точнее скорее всего эту будет чистый ассемблер, т.к. скорее всего на си/си++ это нереализуемо. 

В таком случае вам на асме нужно будет писать обе функции. И вызывающую и вызываемую.

Цитата(ИванМ @  5.6.2011,  22:19 Найти цитируемый пост)
о задаче я писал. Передать неизвестное на момент компиляции число параметров через стек, не используя ассемблер.

У вас чисто спортивный интерес, передать именно таким образом? smile 


PM MAIL   Вверх
ИванМ
Дата 6.6.2011, 02:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Цитата(volatile @  6.6.2011,  02:02 Найти цитируемый пост)
В этом примере типы одинаковые. Прежде вы говорили что типы, у каждого параметра разные.

Это просто был грубый пример.
Код

fuct2 (size_t,  type1, el1, type2, el2, type3, el3...)


Цитата(volatile @  6.6.2011,  02:02 Найти цитируемый пост)
В таком случае вам на асме нужно будет писать обе функции. И вызывающую и вызываемую.

Вызываемую можно на си. Например, через va_list. Или указатели. Она же будет знать, сколько параметров в нее передано.

Цитата

У вас чисто спортивный интерес, передать именно таким образом? 

Нет. Для увеличения производительности.
PM MAIL   Вверх
volatile
Дата 6.6.2011, 03:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(ИванМ @  6.6.2011,  02:13 Найти цитируемый пост)
Вызываемую можно на си. Например, через va_list. Или указатели. Она же будет знать, сколько параметров в нее передано.

Нет, на си не получится. На Си ( __cdecl) вызываемая функция не восстанавливает стек, это возложено на вызывающую.
Так что обе на асме.  smile 

Цитата(ИванМ @  6.6.2011,  02:13 Найти цитируемый пост)

fuct2 (size_t,  type1, el1, type2, el2, type3, el3...)

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

PM MAIL   Вверх
mes
Дата 6.6.2011, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(ИванМ @  6.6.2011,  01:13 Найти цитируемый пост)
Нет. Для увеличения производительности. 

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


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 6.6.2011, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



...в четвертых...
а то, что размер стека далеко не безграничен тебя не беспокоит?
раз уж тебя так волнует скорость копирования элементов, значит этих элементов немало, как ты предполагаешь запихнуть это все в стек?
PM   Вверх
mes
Дата 6.6.2011, 09:20 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



ИванМ, примерчик для размышеления: 
Код



int main ()
{
   typedef std::function<void()> fn_t;
   std::vector<fn_t> v;

// цикл, как имитация работы интерпретатора :   
   for (int i=0; i<10;++i)
   {
      static const char * strs[] = { "hallo", "world", "!"};
      double d = i*1.3;

      if (i == 0)    v.push_back([=](){ std::cout << "ints: "; } ); 
      if (i/3 == 0)  v.push_back([=](){ std::cout << i<< " "; } );
      if (i == 3)    v.push_back([=](){ std::cout << std::endl << "doubles: "; } );       
      if (i/3 == 1)  v.push_back([=](){ std::cout << d<< " "; } );
      if (i == 6)    v.push_back([=](){ std::cout << std::endl << "strings: "; } );           
      if (i/3 == 2)  v.push_back([=](){ std::cout << strs[i%3]<< " "; } );
      if (i == 9)    v.push_back([=](){ std::cout << std::endl; } );           
      
   }
   
// выполнение полученного сценария :
   for(fn_t fn : v) fn();
     
}

http://liveworkspace.org/code/8edb2836fcf7...cc0b5a3c976e008



--------------------
PM MAIL WWW   Вверх
ИванМ
Дата 6.6.2011, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



mes, пример интересный, но как он вяжется с моей задачей?
PM MAIL   Вверх
bsa
Дата 6.6.2011, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



ИванМ, значительного (более нескольких процентов) выигрыша в производительности ты не получишь по сравнению с использованием функции вида:
Код
struct TypeValuePair {
   Type type;
   void *ptr;
};

void print(const std::vector<TypeValuePair> &tvp);
Лучше ищи, другие места затыков в программе.
PM   Вверх
ИванМ
Дата 6.6.2011, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Цитата

Нет, на си не получится. На Си ( __cdecl) вызываемая функция не восстанавливает стек, это возложено на вызывающую.
Так что обе на асме.  smile 

Так я и собираюсь вызывающую писать на ассемблере. Ассемблер и очистит стек.

Цитата

Вы подходите к поиску решению с другого конца, пытаясь расчитать сколько нужно бензина велосипеду, чтоб пролететь метров 10..  

Как это понять?

Цитата(azesmcar @  6.6.2011,  08:52 Найти цитируемый пост)
раз уж тебя так волнует скорость копирования элементов, значит этих элементов немало, как ты предполагаешь запихнуть это все в стек? 

Не очень много, не больше десяти.

Цитата

во вторых производетельность Вы в любом случае вряд ли увеличите изменив способ вызова, так как сопуствующие расходы, о которых Вы упомянули в теме, гораздо выше.. 

Какие имеются ввиду сопутстствующие расходы?

Добавлено через 1 минуту и 36 секунд
Видимо действительно дело не в передаче параметров. Надо смотреть весь алгоритм.
PM MAIL   Вверх
bsa
Дата 6.6.2011, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(ИванМ @  6.6.2011,  10:24 Найти цитируемый пост)
Какие имеются ввиду сопутстствующие расходы?

надо все затолкать в стек. По сути, разницы между заталкиванием в стек и в контейнер разницы практически нет. Причем, стек имеет более серьезные ограничения на размер, чем контейнер в куче.
PM   Вверх
mes
Дата 6.6.2011, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(ИванМ @  6.6.2011,  09:13 Найти цитируемый пост)
но как он вяжется с моей задачей? 

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

Добавлено через 5 минут и 10 секунд
Цитата(ИванМ @  6.6.2011,  09:24 Найти цитируемый пост)
Как это понять?

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

Добавлено через 6 минут и 35 секунд
Цитата(ИванМ @  6.6.2011,  09:24 Найти цитируемый пост)
Видимо действительно дело не в передаче параметров. Надо смотреть весь алгоритм. 
 smile 



--------------------
PM MAIL WWW   Вверх
ИванМ
Дата 6.6.2011, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Думаю, что скорее всего теряется производительность из-за постоянного выделения памяти.
Вот, пример моей программы:
Код

    void USER_PREDICATE::SetParams(const vector< ptr<DATA> > & params_)
    {
        out_params.resize(params_.size());    
        params.resize(params_.size());    
        std::copy(params_.begin(), params_.end(), out_params.begin());
        for(size_t i=0;i<params.size();i++)
        {
            if(dynamic_cast<REFERENCE*>(params_[i].get()))
                params[i]=params_[i];    
            else if(dynamic_cast<VARIABLE*>(params_[i].get()))
                params[i]=ptr<DATA>(new VARIABLE(*((VARIABLE*)params_[i].get())));                    
            else
                params[i]=params_[i];
        }
    }

    bool USER_PREDICATE::Run()
    { 
        vector<ptr<DATA>> start_pars(params.size());

        for(size_t i=0;i<params.size();i++)
        {
            if(dynamic_cast<REFERENCE*>(params[i].get()))
                start_pars[i]=params[i];    
            else if(dynamic_cast<VARIABLE*>(params[i].get()))
                start_pars[i]=ptr<DATA>(new VARIABLE(*((VARIABLE*)params[i].get())));
            else
                start_pars[i]=params[i];
        }

        while(next_line<pred_code->Size())
        {
            ptr<LINE> line;
            if(!last_line)
                line=ptr<LINE>(new LINE((*pred_code.get())[next_line]));
            else
                line=last_line;
            if(!last_line)
            {
                size_t size=(*pred_code.get())[next_line]->GetNeedVars();
                if(params.size()>size) size=params.size();
                for(size_t i=0;i<size;i++)
                {
                    if(i<params.size())
                    {
                        if(dynamic_cast<VARIABLE*>(params[i].get()))
                        {
                            line->AddVar(params[i]);
                        }
                        else
                        {
                            ptr<VARIABLE> var(new VARIABLE);
                            *var.get()=*params[i].get();
                            line->AddVar(var);
                        }
                    }
                    else
                        line->AddVar(ptr<VARIABLE>(new VARIABLE));                

                }
            }
            bool isSucc;
            try
            {
                isSucc=!last_line && line->Run() || last_line && line->Back();
            }
            catch(const vector< ptr<DATA> >& params)
            {
                SetParams(params);
                last_line=ptr<LINE>();
                next_line=0;
                continue;
            }
            if(isSucc)
            {
                if(line->IsNotEnd())
                    last_line=line;
                else
                {
                    last_line=ptr<LINE>();
                    next_line++;
                }
                for(size_t i=0;i<params.size();i++)
                {
                    if(dynamic_cast<VARIABLE*>(params[i].get()))
                    {
                        *((VARIABLE*)out_params[i].get())=*((VARIABLE*)params[i].get());
                        *((VARIABLE*)params[i].get())=*((VARIABLE*)start_pars[i].get());
                    }
                }
                return true;
            }            
            else
            {
                next_line++;
                for(size_t i=0;i<params.size();i++)
                {
                    if(dynamic_cast<VARIABLE*>(params[i].get()))
                    {
                        *((VARIABLE*)params[i].get())=*((VARIABLE*)start_pars[i].get());
                    }
                }
            }
        }
        return false;
    }

PM MAIL   Вверх
boostcoder
Дата 6.6.2011, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



жестокий код.
огромное кол-во dinamic_cast`ов настораживает.
лучше бы Вы озвучили задачу, и задавали вопросы постепенно..
PM WWW   Вверх
pilotnet
Дата 16.6.2011, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 22.4.2008

Репутация: нет
Всего: нет



Вот здесь почитай
rsnd 
PM MAIL   Вверх
boostcoder
Дата 16.6.2011, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(pilotnet @  16.6.2011,  07:40 Найти цитируемый пост)
rsnd

новое название? smile

PM WWW   Вверх
borisbn
Дата 16.6.2011, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(boostcoder @ 16.6.2011,  07:45)
Цитата(pilotnet @  16.6.2011,  07:40 Найти цитируемый пост)
rsnd

новое название? smile

RoStovNaDonu smile



<----------------

Это сообщение отредактировал(а) borisbn - 16.6.2011, 08:10


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 16.6.2011, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



)      
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1436 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.