|
3 / 3 / 0
Регистрация: 08.05.2010
Сообщений: 135
|
|
Как перенести параметры из ф-ции printf() в самодельную04.06.2011, 09:22. Показов 24610. Ответов 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 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|