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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функция с переменным числом параметров 
:(
    Опции темы
ИванМ
Дата 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   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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