9 / 9 / 0
Регистрация: 22.01.2012
Сообщений: 59
|
|
1 | |
Возможно ли реализовать аналог функции Read из Паскаля?12.08.2014, 09:10. Показов 3245. Ответов 20
Метки нет (Все метки)
Здравствуйте. Возможно ли в C++ реализовать аналог функции read() из паскаля. Хотя бы с условием, что все входные данные одного типа. Без передачи указателя
0
|
12.08.2014, 09:10 | |
Ответы с готовыми решениями:
20
Существует ли аналог функции Trunc из Паскаля Реализовать аналог функции Sign Реализовать аналог функции Magic (Matlab) на С++ Аналог проводника. Реализовать фильтрацию файлов и другие функции |
317 / 179 / 73
Регистрация: 18.01.2014
Сообщений: 387
|
||||||
12.08.2014, 09:19 | 2 | |||||
Чем работа с потоками не устраивает?
0
|
9 / 9 / 0
Регистрация: 22.01.2012
Сообщений: 59
|
|
12.08.2014, 09:34 [ТС] | 3 |
BlackIce, так получилось, что сейчас мне нужно передать аргументы именно через запятую и без "&"
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
12.08.2014, 09:39 | 4 |
0
|
9 / 9 / 0
Регистрация: 22.01.2012
Сообщений: 59
|
||||||
12.08.2014, 09:42 [ТС] | 5 | |||||
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
||||||
12.08.2014, 09:48 | 6 | |||||
Сообщение было отмечено Андрей Xomach как решение
Решение
Да написать-то можно, я только в упор не понимаю зачем.
2
|
9 / 9 / 0
Регистрация: 22.01.2012
Сообщений: 59
|
||||||
12.08.2014, 09:52 [ТС] | 7 | |||||
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
12.08.2014, 09:56 | 8 |
Магия называется Variadic Templates, требует компилятор с поддержкой С++11 и, я почти уверен, для Вашей задачи необходимости в таких извращениях нет. Поэтому и спрашивал: зачем?
1
|
9 / 9 / 0
Регистрация: 22.01.2012
Сообщений: 59
|
|||||||||||
12.08.2014, 10:04 [ТС] | 9 | ||||||||||
0x10, наверное, просто из любопытства
Еще год-два назад в рамках олимпиадного программирования захотелось избавиться от
0
|
Вежливость-главное оружие
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
|
||||||
12.08.2014, 10:52 | 10 | |||||
Попробуйте вот так:
0x10, я вот только понять не могу, как вы по стеку двигаетесь?
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
12.08.2014, 11:04 | 11 |
Работа с указателями сводит на нет всю безопасность относительно типов.
"Движения по стеку" нет. В строке 12 происходит разворачивание пакета аргументов args и поиск наиболее подходящей функции. Пока в пакете > 1 аргумента вызывается эта же функция Read и первый элемент пакета связывается с ее первым аргументом. Когда в пакете остается один элемент, вызывается версия Read, принимающая единственный аргумент.
0
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|
12.08.2014, 11:09 | 12 |
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
12.08.2014, 11:13 | 13 |
На этапе компиляции никак не контролируется, что все аргументы, переданные в функцию, будут одного типа, а она это предполагает, пытаясь перемещаться по стеку аргументов путем смещения указателя.
0
|
9 / 9 / 0
Регистрация: 22.01.2012
Сообщений: 59
|
|
12.08.2014, 13:44 [ТС] | 14 |
0x10, стоп, можно глупый вопрос?
Ведь template создает новую версию функции для различных аргументов шаблона, так? Но тогда данная реализация приведет к тому, что будет создано по 1 функции read для каждого числа аргументов. То есть, если я вызову read от 5 аргументов, это создаст 4 версии функции read, не считая стандартной. + к тому, рекурсивная передача аргументов будет занимать квадратное время относительно числа входных данных, нет? Конечно, даже если я тут и прав, все это несущественно в данном конкретном примере (время на считывание уйдет много больше), но все-таки, разве рекурсивный вызов шаблонной функции не есть зло?
0
|
Вежливость-главное оружие
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
|
|
12.08.2014, 14:19 | 15 |
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
||||||
12.08.2014, 14:23 | 16 | |||||
Да, но все это происходит на этапе компиляции, поэтому рекурсивные вызовы могут быть поинлайнены.
Что касается передачи аргументов, я уже второй раз забываю про std::forward, в связи с чем исправляюсь:
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|||||||||||||||||||||
15.08.2014, 19:33 | 17 | ||||||||||||||||||||
Все-таки показать надо, чтобы не быть голословным. Из кода выше уберем все лишнее, чтобы было проще читать ассемблерный выхлоп. Итого останется:
g++ -std=c++11 -O0 -S main.cpp
Разбирать весь код достаточно нудно, нам хватит заметить, что сгенерено несколько вариантов функции Read: Код
$ cat main.s | grep Read | grep function .type _Z4ReadIiIRiS0_S0_EEvRT_DpOT0_, @function .type _Z4ReadIiEvRT_, @function .type _Z4ReadIiIRiS0_EEvRT_DpOT0_, @function .type _Z4ReadIiIRiEEvRT_DpOT0_, @function Первый уровень оптимизации: g++ -std=c++11 -O1 -S main.cpp
У нас осталась одна функция Read, которая вызывается по одному разу для каждого аргумента. Уже тут нет рекурсивных вызовов. Если же использовать флаг -O2, то и эта функция будет заинлайнена: g++ -std=c++11 -O2 -S main.cpp
Получено на компиляторе: Код
$ g++ --version g++ (Ubuntu 4.9-20140406-1ubuntu1) 4.9.0 20140405 (experimental) [trunk revision 209157]
2
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
15.08.2014, 19:47 | 18 |
Нет, это не зло Гораздо более серьезные вещи, чем продемонстрировал 0x10 корректно встраиваются как правило без какого-либо оверхеда (естественно если оптимизация включена).
0
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|
15.08.2014, 19:50 | 19 |
Я бы даже сказал, что рекурсивный вызов любой функции это не зло, если конечно выполняется tail call оптимизация
0
|
9 / 9 / 0
Регистрация: 22.01.2012
Сообщений: 59
|
|
23.08.2014, 17:01 [ТС] | 20 |
DrOffset, Voivoid, с -Os или -O0 все-таки зло наверное
0
|
23.08.2014, 17:01 | |
23.08.2014, 17:01 | |
Помогаю со студенческими работами здесь
20
Аналог READ и DATA в VB 2008 Аналог type паскаля в c# Аналог графики Паскаля? Есть ли в Си аналог GraphABC из Паскаля? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |