Форум программистов, компьютерный форум CyberForum.ru

Как перенести параметры из ф-ции printf() в самодельную - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 81, средняя оценка - 4.83
Uklunok
3 / 3 / 0
Регистрация: 08.05.2010
Сообщений: 135
04.06.2011, 09:22     Как перенести параметры из ф-ции printf() в самодельную #1
Ребят, подскажите как решить задачу.
Нужно перенести параметры функции printf() в самодельную ф-цию myfunk(). При условии если булева переменная Х==1. Если не равна 1, то не переносить.
Задача осложняется тем, что число параметров ф-ции может быть переменным.
Подскажите пожалуйста, буду очень признателен.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2011, 09:22     Как перенести параметры из ф-ции printf() в самодельную
Посмотрите здесь:

как переделать с cout на printf ? C++
Как вывести printf для струкутры C++
Как реализована функция printf C++
C++ Как выделить слово в printf?
Передача ф-ции как параметра другой ф-ции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
04.06.2011, 09:53     Как перенести параметры из ф-ции printf() в самодельную #2
Цитата Сообщение от Uklunok Посмотреть сообщение
Нужно перенести параметры функции printf() в самодельную ф-цию myfunk()
Не совсем понятно, что нужно сделать. Давай хотя бы небольшой пример.
Uklunok
3 / 3 / 0
Регистрация: 08.05.2010
Сообщений: 135
04.06.2011, 10:27  [ТС]     Как перенести параметры из ф-ции printf() в самодельную #3
функция определена в библиотеке stdio.h и имеет следующий синтаксис:
int printf( const char *format [, argument]... );
Здесь первый аргумент *format определяет строку, которая выводится на экран и может содержать специальные управляющие символы для вывода переменных.

К примеру вот:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool x=1;
//ОПРЕДЕЛЯЕМ Ф-ЦИЮ myfunk()
 
int main()
{int num_i; 
float num_f; 
num_i = 5; 
num_f = 10.5; 
printf(“num_i = %d, num_f = %f”, num_i, num_f);
 
if (x==1)
{ // передаём параметры из ф-ции printf() в ф-цию myfunk()
  // и вывести на экран
}
else // т.е. , если х ==0 // параметры не передавать в нашу функцию
 
}
Сложность в том, что параметров же у ф-ции printf() может быть переменное количество, короче не знаю как сделать.
Думаю Вы меня поняли.
Спасибо.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
04.06.2011, 11:21     Как перенести параметры из ф-ции printf() в самодельную #4
Сложность в том, что параметров же у ф-ции printf() может быть переменное количество, короче не знаю как сделать
Это не проблема, я не понял, что значит
передаём параметры из ф-ции printf() в ф-цию myfunk()
Каким образом - вламываясь в код printf()? Или просто вызывается своя ф-ция с аргументами, которые передавали printf()?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.06.2011, 12:16     Как перенести параметры из ф-ции printf() в самодельную #5
Uklunok, va_arg в помощь.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.06.2011, 13:52     Как перенести параметры из ф-ции printf() в самодельную #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <stdarg.h>
 
void my_printf(const char *format, ...) {
    va_list args;
    
    printf ("MYPRINTF: ");
    
    va_start(args, format);
    /* обработка формата:
     * if (*format == '%') {
     *  switch(*format) {
     *     case 'd': число
     *  case 's': строка 
     *  и так далее
     * }
     */
 
    /* чтобы не мучится, то для примера поставим 
     * здесь обычный printf
    */
    vprintf(format, args);
    va_end(args);
}
 
/* если убрать эту строку, то будет использоваться
 * библиотечный стандартный printf
*/
#define USE_MY_PRINTF
 
 
#if defined USE_MY_PRINTF
#define projectname_print my_printf
#else
#define projectname_print printf
#endif
 
int main() {
    projectname_print("%d.%d %s", 10, 15, "TEST");
}
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
04.06.2011, 14:01     Как перенести параметры из ф-ции printf() в самодельную #7
А я вот по старинке привык, своими руками):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <cstring>
void myprintf(const char*,...);
int main()
{
    myprintf("%s\n%d\n%s\n","Hello",123,"World");
    return 0;
}
void myprintf(const char *format,...)
{
    unsigned char **arguments=(unsigned char**)((long)&format+sizeof(void*));
    const char *formats=format;
    while(formats<(format+strlen(format))) {
        while(*formats!='%' && *formats!='\0')
            std::cout<<*(formats++);
        ++formats;
        switch (*formats) {
        case 's':
            std::cout<<(char*)(*arguments);
            arguments=(unsigned char**)((long)arguments+sizeof(void*));
            formats++;
            break;
        case 'd':
            std::cout<<std::dec<<(int*)(*arguments);
            arguments=(unsigned char**)((long)arguments+sizeof(void*));
            formats++;
 
        }
    }
}
только число почему-то в шестнадцатиричном виде выводится, не пойму почему.
grizlik78
Эксперт С++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,960
04.06.2011, 14:24     Как перенести параметры из ф-ции printf() в самодельную #8
Цитата Сообщение от Kastaneda Посмотреть сообщение
только число почему-то в шестнадцатиричном виде выводится, не пойму почему.
Думаю потому, что выводится не число, а указатель.
Впрочем, у меня этот код вообще не работает. GCC 4.5, Linux/x86_64
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
04.06.2011, 14:31     Как перенести параметры из ф-ции printf() в самодельную #9
Цитата Сообщение от grizlik78 Посмотреть сообщение
Впрочем, у меня этот код вообще не работает. GCC 4.5, Linux/x86_64
Хз, у меня MinGW (gcc) и студия, все нормально.

Цитата Сообщение от grizlik78 Посмотреть сообщение
Думаю потому, что выводится не число, а указатель.
Выводится число из стека. Выводится оно правильно (т.е. 123), только в hex.
grizlik78
Эксперт С++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,960
04.06.2011, 14:33     Как перенести параметры из ф-ции printf() в самодельную #10
Но тип у него тогда зачем (int*)? Может приводить просто к int?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
04.06.2011, 14:39     Как перенести параметры из ф-ции printf() в самодельную #11
grizlik78, да, теперь нормально выводит. Это я тупанул что-то ))

P.S. кстати ребутнулся под Linux, код нормально компилируется и работает (gcc 4.4.5).
grizlik78
Эксперт С++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,960
04.06.2011, 14:42     Как перенести параметры из ф-ции printf() в самодельную #12
А ещё более правильно тогда
C++
1
std::cout<<std::dec<<*reinterpret_cast<int*>(arguments);
Да, под виндой работает. Ну тем хуже, значит код непереносим из-за привязки к конкретному ABI

Добавлено через 36 секунд
Наверное дело в 64-битности.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
04.06.2011, 14:43     Как перенести параметры из ф-ции printf() в самодельную #13
Скорее всего дело в твоей 64-битной системе.

Добавлено через 58 секунд
опоздал)
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.06.2011, 14:46     Как перенести параметры из ф-ции printf() в самодельную #14
Цитата Сообщение от Kastaneda Посмотреть сообщение
А я вот по старинке привык, своими руками
а чем va_list не угодил?
Uklunok
3 / 3 / 0
Регистрация: 08.05.2010
Сообщений: 135
04.06.2011, 14:47  [ТС]     Как перенести параметры из ф-ции printf() в самодельную #15
C
1
void myprintf(const char*,...);
- а это значит, что функция может принимать неограниченное количество параметров???
Самое интересное, что программа выводит сообщение, хотя нет ни одной ф-ции printf().

Вы все меня не очень хорошо поняли.
Во первых выводить сообщение никакого ни надо, и моя самодельная функция тоже не должна выводить сообщение.
Тут получается: надо вытащить из библиотеки ф-цию printf() и скопировать её параметры в самодельную ф-цию. И соответственно, если непосредственно в программе есть такая строка:
C
1
printf("%d.%d %s", 10, 15, "TEST");
то нужно скопировать их в самодельную ф-цию.
Вот
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
04.06.2011, 14:55     Как перенести параметры из ф-ции printf() в самодельную #16
Цитата Сообщение от fasked Посмотреть сообщение
а чем va_list не угодил?
Поскольку в функциями с переменным числом аргументов работать приходится не часто, то я, честно говоря, и не знал про va_list. А когда нужно было, то делал так, как показал выше.

Uklunok, т.е. ты хочешь влезть в код printf() ?

Добавлено через 1 минуту
Цитата Сообщение от Uklunok Посмотреть сообщение
Во первых выводить сообщение никакого ни надо, и моя самодельная функция тоже не должна выводить сообщение.
Это просто пример, как реализовать функцию с переменным числом аргументов, она не обязательно должна что-то выводить.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
04.06.2011, 15:10     Как перенести параметры из ф-ции printf() в самодельную #17
Цитата Сообщение от Uklunok Посмотреть сообщение
то нужно скопировать их в самодельную ф-цию.
Так тоже самое все, только более опасное
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdarg.h>
 
void myprintf(const char *format, ...) {
    /* DO SOMETHING */
}
 
/* если убрать эту строку, то будет использоваться
 * библиотечный стандартный printf
*/
#define USE_MY_PRINTF
 
#if defined USE_MY_PRINTF
#define printf myprintf
#endif
 
int main() {
    printf("%d.%d %s", 10, 15, "TEST");
}
На самом деле так делать неправильно.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
04.06.2011, 15:23     Как перенести параметры из ф-ции printf() в самодельную #18
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ну тем хуже, значит код непереносим из-за привязки к конкретному ABI
Чтобы доставать аргументы для "..." нужно использовать va_arg. На каждой платформе этот интерфейс реализован по своему (в соответствии со своим ABI). Ибо на каждой платформе имеются свои правила передачи параметров

Добавлено через 3 минуты
Цитата Сообщение от Uklunok Посмотреть сообщение
C
1
void myprintf(const char*,...);
- а это значит, что функция может принимать неограниченное количество параметров???
Самое интересное, что программа выводит сообщение, хотя нет ни одной ф-ции printf().

Вы все меня не очень хорошо поняли.
Во первых выводить сообщение никакого ни надо, и моя самодельная функция тоже не должна выводить сообщение.
Тут получается: надо вытащить из библиотеки ф-цию printf() и скопировать её параметры в самодельную ф-цию. И соответственно, если непосредственно в программе есть такая строка:
C
1
printf("%d.%d %s", 10, 15, "TEST");
то нужно скопировать их в самодельную ф-цию.
Вот
Такая постановка задачи честными способами практически не решается. Единственный с виду способ - это реализовать свою функцию под названием printf, которая будет вызывать "настоящий" printf и дополнительно делать свои пляски с бубном. Для вызова "настощего" printf'а можно воспользоваться vprintf'ом из поста #6

Ты лучше поясни, нафига тебе это нужно. Потому что есть подозрение, что у тебя есть постановка задачи, но ты пошёл её решать неверным путём
Kastaneda
04.06.2011, 15:27
  #19

Не по теме:

Чтобы доставать аргументы для "..." нужно использовать va_arg. На каждой платформе этот интерфейс реализован по своему (в соответствии с о своим ABI). Ибо на каждой платформе имеются свои правила передачи параметров
Значит va_arg - это не просто удобство. Ясно, спасибо)

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.06.2011, 15:28     Как перенести параметры из ф-ции printf() в самодельную
Еще ссылки по теме:

Калькулятор на Си. Как реализовать триногометрические ф-ции и функцию логарифм? C++
Чем ::printf предпочтительнее printf? C++
C++ Параметры printf

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
04.06.2011, 15:28     Как перенести параметры из ф-ции printf() в самодельную
  #20

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
Значит va_arg - это не просто удобство
Просто удобства обычно в Си++ или C#

Yandex
Объявления
04.06.2011, 15:28     Как перенести параметры из ф-ции printf() в самодельную
Ответ Создать тему
Опции темы

Текущее время: 06:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru