Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/105: Рейтинг темы: голосов - 105, средняя оценка - 4.64
3 / 3 / 0
Регистрация: 08.05.2010
Сообщений: 135
1

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

04.06.2011, 09:22. Показов 21786. Ответов 104
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ребят, подскажите как решить задачу.
Нужно перенести параметры функции printf() в самодельную ф-цию myfunk(). При условии если булева переменная Х==1. Если не равна 1, то не переносить.
Задача осложняется тем, что число параметров ф-ции может быть переменным.
Подскажите пожалуйста, буду очень признателен.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.06.2011, 09:22
Ответы с готовыми решениями:

Как перенести параметры с XP на 7
Не знаю в какой ветке разместить тему, то ли в XP, то ли в 7... Всё началось с того, что установив...

Передача ф-ции как параметра другой ф-ции
struct pupil{ char surname; int school; int answer; int num; } tmp, a; ...

Параметры printf
Здравствуйте дорогие форумчане ;) У меня есть вопрос по следующему куску кода. Решив по...

Динамические параметры printf()
Есть код printf("%5s <-- %14s\n", buffer0.c_str(), "n/a"); Что делать если я не знаю на этапе...

104
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
04.06.2011, 09:53 2
Цитата Сообщение от Uklunok Посмотреть сообщение
Нужно перенести параметры функции printf() в самодельную ф-цию myfunk()
Не совсем понятно, что нужно сделать. Давай хотя бы небольшой пример.
0
3 / 3 / 0
Регистрация: 08.05.2010
Сообщений: 135
04.06.2011, 10:27  [ТС] 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() может быть переменное количество, короче не знаю как сделать.
Думаю Вы меня поняли.
Спасибо.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
04.06.2011, 11:21 4
Сложность в том, что параметров же у ф-ции printf() может быть переменное количество, короче не знаю как сделать
Это не проблема, я не понял, что значит
передаём параметры из ф-ции printf() в ф-цию myfunk()
Каким образом - вламываясь в код printf()? Или просто вызывается своя ф-ция с аргументами, которые передавали printf()?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.06.2011, 12:16 5
Uklunok, va_arg в помощь.
1
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
04.06.2011, 13:52 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");
}
3
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
04.06.2011, 14:01 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++;
 
        }
    }
}
только число почему-то в шестнадцатиричном виде выводится, не пойму почему.
2
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
04.06.2011, 14:24 8
Цитата Сообщение от Kastaneda Посмотреть сообщение
только число почему-то в шестнадцатиричном виде выводится, не пойму почему.
Думаю потому, что выводится не число, а указатель.
Впрочем, у меня этот код вообще не работает. GCC 4.5, Linux/x86_64
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
04.06.2011, 14:31 9
Цитата Сообщение от grizlik78 Посмотреть сообщение
Впрочем, у меня этот код вообще не работает. GCC 4.5, Linux/x86_64
Хз, у меня MinGW (gcc) и студия, все нормально.

Цитата Сообщение от grizlik78 Посмотреть сообщение
Думаю потому, что выводится не число, а указатель.
Выводится число из стека. Выводится оно правильно (т.е. 123), только в hex.
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
04.06.2011, 14:33 10
Но тип у него тогда зачем (int*)? Может приводить просто к int?
1
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
04.06.2011, 14:39 11
grizlik78, да, теперь нормально выводит. Это я тупанул что-то ))

P.S. кстати ребутнулся под Linux, код нормально компилируется и работает (gcc 4.4.5).
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
04.06.2011, 14:42 12
А ещё более правильно тогда
C++
1
std::cout<<std::dec<<*reinterpret_cast<int*>(arguments);
Да, под виндой работает. Ну тем хуже, значит код непереносим из-за привязки к конкретному ABI

Добавлено через 36 секунд
Наверное дело в 64-битности.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
04.06.2011, 14:43 13
Скорее всего дело в твоей 64-битной системе.

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

Вы все меня не очень хорошо поняли.
Во первых выводить сообщение никакого ни надо, и моя самодельная функция тоже не должна выводить сообщение.
Тут получается: надо вытащить из библиотеки ф-цию printf() и скопировать её параметры в самодельную ф-цию. И соответственно, если непосредственно в программе есть такая строка:
C
1
printf("%d.%d %s", 10, 15, "TEST");
то нужно скопировать их в самодельную ф-цию.
Вот
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
04.06.2011, 14:55 16
Цитата Сообщение от fasked Посмотреть сообщение
а чем va_list не угодил?
Поскольку в функциями с переменным числом аргументов работать приходится не часто, то я, честно говоря, и не знал про va_list. А когда нужно было, то делал так, как показал выше.

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

Добавлено через 1 минуту
Цитата Сообщение от Uklunok Посмотреть сообщение
Во первых выводить сообщение никакого ни надо, и моя самодельная функция тоже не должна выводить сообщение.
Это просто пример, как реализовать функцию с переменным числом аргументов, она не обязательно должна что-то выводить.
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
04.06.2011, 15:10 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");
}
На самом деле так делать неправильно.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
04.06.2011, 15:23 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

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

Не по теме:

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

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

Не по теме:

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

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.06.2011, 15:28

Форматы и параметры printf/scanf
Задали вопрос что если в выводе : 1) форматов&gt;переменных 2)переменных&gt;форматов Я делал...

Как припаять PLS на самодельную плату
Возник вопрос: как припаять PLS разъём на самодельную плату? Примерно как здесь ...

Не могу понять как исправить ошибку Warning: printf() [function.printf]: Too few arguments in Z:\home\ksards.ru\www\id\1.php on line 76
Помогите связать бд с сайтом я новичок в этом вот код php &lt;?php do { printf(&quot;&lt;div...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru