|
3 / 3 / 0
Регистрация: 08.05.2010
Сообщений: 135
|
|
Как перенести параметры из ф-ции printf() в самодельную04.06.2011, 09:22. Показов 25284. Ответов 104
Метки нет (Все метки)
Ребят, подскажите как решить задачу.
Нужно перенести параметры функции printf() в самодельную ф-цию myfunk(). При условии если булева переменная Х==1. Если не равна 1, то не переносить. Задача осложняется тем, что число параметров ф-ции может быть переменным. Подскажите пожалуйста, буду очень признателен.
0
|
|
| 04.06.2011, 09:22 | |
|
Ответы с готовыми решениями:
104
Как перенести параметры с XP на 7
Параметры printf |
|
3 / 3 / 0
Регистрация: 08.05.2010
Сообщений: 135
|
|
| 05.06.2011, 17:17 [ТС] | |
|
Он по ссылке, в посте номер 42
0
|
|
|
|
||
| 05.06.2011, 17:31 | ||
|
Добавлено через 2 минуты При этом надо понимать, что там описана весьма корявая непереносимая реализация, которая страдает тем же дефектом, что и примеры без va_arg из статьи ValeryLaptev
0
|
||
|
3 / 3 / 0
Регистрация: 08.05.2010
Сообщений: 135
|
|
| 05.06.2011, 17:39 [ТС] | |
|
А есть открытая библиотечная?
И что значит не переносимая?
0
|
|
|
|
|||
| 05.06.2011, 17:50 | |||
|
Добавлено через 1 минуту Хотя наверно я не туда залез. Надо смотреть версию "WITH stdarg.h" http://www.menie.org/georges/e... tdarg.html Это по крайней мере переносимым образом написана, но всё равно с ошибками
0
|
|||
|
3 / 3 / 0
Регистрация: 08.05.2010
Сообщений: 135
|
|||||||
| 06.06.2011, 12:01 [ТС] | |||||||
|
Ребят, не подскажите тут в строке замечание:
Описание из справки: Warning Description: parameter mismatch in redeclaration A mismatch occurred between the parameters in a function's declaration or prototype and the parameters passed to a function in a call. May also occur when a mismatch in the count of the parameters occurs in a redeclaration. Как убрать такое?
0
|
|||||||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 06.06.2011, 12:05 | |
|
Uklunok, out - указатель на указатель?
*string - имеет тип char, а не int?
0
|
|
|
3 / 3 / 0
Регистрация: 08.05.2010
Сообщений: 135
|
||||||
| 06.06.2011, 12:25 [ТС] | ||||||
И как быть? Никак?
0
|
||||||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 06.06.2011, 15:28 | |
|
Uklunok, Можно в int преобразовать *string)
0
|
|
|
3 / 3 / 0
Регистрация: 08.05.2010
Сообщений: 135
|
|||||||||||
| 08.06.2011, 11:04 [ТС] | |||||||||||
|
Ребята, кто знает? Скажите, почему следующий код не выводит строковый параметр:
Там где @ - абракадабра), хочу "String here and here!" Как быть? подскажите пожалуйста ![]() ![]() ![]() Добавлено через 17 минут Я лучше перефразирую свой вопрос: Можно сделать так чтобы приведённый ниже код работал без макросов???:
0
|
|||||||||||
|
|
||||||||
| 08.06.2011, 14:30 | ||||||||
|
Добавлено через 24 минуты В своё время тоже пришлось писать велосипеды для работы с dsp. Вот кастрированный ограниченный вариант printf'а. Внутри используется буфер фиксированного размера, так что ещё есть и такое ограничение. Код писался под 64-битную архитектуру, так что %ld и %lx, работающие с long'ами, печатали 64-битные значения. Это следует учесть тем, кто хочет модифицировать код под печать 64-битных значений в 32-битном режиме (вместо long надо использовать long long)
0
|
||||||||
|
|
||
| 28.05.2013, 21:03 | ||
|
Вот упрощённый и немного переделанный (замена double -> int) твой пример: C #include <stdio.h> void func (int x1, ...) { int x2, x3, x4; int *p = &x1; x2 = *(p + 1); x3 = *(p + 2); x4 = *(p + 3); printf ("x1 = %x\n", x1); printf ("x2 = %x\n", x2); printf ("x3 = %x\n", x3); printf ("x4 = %x\n", x4); } int main (void) { func (0x11111111, 0x22222222, 0x33333333, 0x44444444); return 0; } Code Intel Linux, 32-битный режим x1 = 11111111 x2 = 22222222 x3 = 33333333 x4 = 44444444 Code Intel Linux, 64-битный режим x1 = 11111111 x2 = 0 x3 = 0 x4 = c068a9c Code SPARC Linux, 32-битный режим x1 = 11111111 x2 = ffee59d4 x3 = ffee59dc x4 = f7f18000 Code SPARC Linux, 64-битный режим x1 = 11111111 x2 = 0 x3 = 0 x4 = 0
0
|
||
|
|
|
| 28.05.2013, 21:34 | |
|
В IE-32e (тот, что все называют х86_64) другая конвенция вызовов. Там первые несколько аргументов (вроде 4, могу ошибаться) передаются на регистрах, НО при этом место в стеке под них как бы выделяется, но содержит мусор. Это сделано для какой-то будущей необходимости.
Вообще для меня это немного странно - как передавать аргументы это ж дело компилятора, а не режима работы процессора, но про то, что агрументы теперь передаются на регистрах, я прочитал как раз в описании IE-32e. При чем Windows и *nix используют разные регистры. Может разработчики компиляторов и процессоров как-то договорились, что такие-то регистры отводятся под аргументы. Добавлено через 7 минут А, разобрался. Просто появились новые конвенции, именуемые Microsoft x64 calling convention и System V AMD64 ABI, которые и используют компиляторы под х86_64. Вот. upd. я вообще в тему пишу? а то мне 10 страниц темы перечитывать влом)
0
|
|
|
|
||
| 28.05.2013, 21:42 | ||
|
В статье ValeryLaptev'а (Как перенести параметры из ф-ции printf() в самодельную) делается ошибочное предположение, что правила передачи параметров - это свойство языка Си. Скорее всего, это было почерпано из неправильных книжек, авторы которых не знают о том, что помимо i386 в миро много всяких разных процессоров. Статья описана в предположении, что все параметры передаются на стеке друг за другом. Но даже и в этом случае можно найти изъян - как только мы будем использовать короткие типы (char или short), мы увидим, что даже на i386 программа перестанет работать Добавлено через 2 минуты
0
|
||
|
|
||
| 28.05.2013, 21:43 | ||
|
0
|
||
|
|
||
| 28.05.2013, 21:46 | ||
|
1
|
||
|
|
|||
| 28.05.2013, 21:52 | |||
|
Ну т.е. я знаю, что бывает такое - разработчики процессора говорят: "мы отдаем вам (программистам) 4 регистра, вы можете использовать их для передачи параметров в функции, мы задокументируем это".
Это понятно, но вот в случае с передачей аргументов на стеке непонятно, при чем тут режим процессора, если стек одинаково работает в любых режимах (ну допустим) ? upd. Добавлено через 4 минуты
0
|
|||
|
|
||||
| 29.05.2013, 15:49 | ||||
|
Если копнуть дальше, то есть ещё тонкости. На SPARC в режиме 64 размер слота равен 8 байт. Если мы передаём параметр типа int, то он кладётся в младшую часть слота (left justify), а если передаём структуру, состоящую из одного int'а - то в старшую часть слота (right justify). Может быть, я перепутал лево и право (на память не помню), но не суть. Смысл в том, что параметр одного и того же размера на одной и той же позиции (типа 7-й по счёту параметр) может оказаться в разных местах стека Добавлено через 2 минуты Добавлено через 17 часов 49 минут C #include <stdio.h> void func (int fake0, int fake1, int fake2, int fake3, int fake4, int fake5, int fake6, int fake7, int x1, ...) { int x2, x3, x4; int *p = &x1; x2 = *(p + 1); x3 = *(p + 2); x4 = *(p + 3); printf ("x1 = %x\n", x1); printf ("x2 = %x\n", x2); printf ("x3 = %x\n", x3); printf ("x4 = %x\n", x4); } int main (void) { func (0, 0, 0, 0, 0, 0, 0, 0, 0x11111111, 0x22222222, 0x33333333, 0x44444444); return 0; } Code Intel Linux, 32-битный режим x1 = 11111111 x2 = 22222222 x3 = 33333333 x4 = 44444444 Code Intel Linux, 64-битный режим x1 = 11111111 x2 = 0 x3 = 22222222 x4 = 0 Code SPARC Linux, 32-битный режим x1 = 11111111 x2 = 22222222 x3 = 33333333 x4 = 44444444 Code SPARC Linux, 64-битный режим x1 = 11111111 x2 = 0 x3 = 22222222 x4 = 0
3
|
||||
|
|
|||||||||||||
| 29.05.2013, 17:17 | |||||||||||||
Думаю вот так мы увидим то, что хотели
0
|
|||||||||||||
|
|
||
| 29.05.2013, 22:02 | ||
|
Когда есть передача параметров через регистры, стратегия получается примерно такой, что слот N1 лежит на регистре, слот N2 лежит на следующем регистре, ...., слот NX лежит в стеке и т.п. Именно такую ситуацию мы видим в тесте из поста #92 (где у i386 все слоты стековые, а на остальных машинах используются регистры). На 64-битных архитектурах размер слота, как правило, равен 8 байтам, а не 4. И это связано в первую очередь с размером регистра, а вовсе не с тем, что на x86-64 какие-то кривые операции записи в память Я попытаюсь в инете найти документ, который у меня в бумажном виде есть. Там по картинке более-менее понятно станет Добавлено через 4 часа 15 минут Нашёл https://www.google.ru/url?sa=t... GE&cad=rja Раздел 3.2.2. Одна строка таблицы соответствует одному "слоту"
0
|
||
| 29.05.2013, 22:02 | |
|
Помогаю со студенческими работами здесь
100
Как припаять PLS на самодельную плату Не могу понять как исправить ошибку Warning: printf() [function.printf]: Too few arguments in Z:\home\ksards.ru\www\id\1.php on line 76 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
|
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
|
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика
Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
|
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации:
В классе Работник добавить:
накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни
коэффициентПрезентеизма — снижает продуктивность. . .
|
|
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день.
Для работы необходим браузер,. . .
|
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности
Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано.
. . .
|
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
|
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива
Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
|