|
3 / 3 / 0
Регистрация: 08.05.2010
Сообщений: 135
|
|
Как перенести параметры из ф-ции printf() в самодельную04.06.2011, 09:22. Показов 25635. Ответов 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 | |
|
Как припаять PLS на самодельную плату Не могу понять как исправить ошибку Warning: printf() [function.printf]: Too few arguments in Z:\home\ksards.ru\www\id\1.php on line 76 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|