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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Распечатать список учеников музыкальной школы, которые учатся играть на скрипке http://www.cyberforum.ru/cpp-beginners/thread312657.html
Распечатать список учеников музыкальной школы, которые учатся играть на скрипке. Указать также, сколько лет они занимаются музыкой и принимали ли участие в каких-либо конкурсах.
C++ Две задачи СТЕК в динамической памяти Здраствуйте уважаемые программисты помогите пожалуйста решить две задачи: 1.Дан файл содержащий текст на русском языке. Файл считывается в СТЕК в динамической памяти. Найти и вывести в другой файл все слова, в которых гласные буквы образуют неубывающую последовательность символов. Один символ не считается неубывающей последовательностью. 2.Например: заметить (а – е - и), добро (о-о) …... http://www.cyberforum.ru/cpp-beginners/thread312651.html
C++ 0xчисло
0x - это десятичная система исчисления? И как это называется, когда пишут int a = 0x5? Как правильно это(0x) называется? Какие выглядят другие системы исчисления?
как из вектора удалить отрицательные числа C++
Создать вектор, заполнить его случайными целыми числами в интервале от -10 до 10. Вывести в ListBox. Затем удалить из него все отрицательные элементы и вывести еще раз вектор в ListBox. moja programma vector<int>vec; srand(time(NULL)); for(int i=0,i!=10,i++){ int a=rand()%20-10; vec_push_back(a); listBox1->item->Add(vec);}
C++ строки. что-то тут не так http://www.cyberforum.ru/cpp-beginners/thread312607.html
вот код //Программа удаления из строки символов '0..9' #include<iostream> // заголовыочный файл с описаниями функций ввод\вывод #include<conio.h> // заголовочный файл для создания текстового интерфейса в режиме MS-DOS #include <string> // заголовочный файл для класса string int main() {
C++ Builder БД ADOQuery и Edit Доброго времени суток, форумчане! Прошу вашей помощи ибо гугл и яндекс уже прячутся от меня в попытках отыскать решение вопроса... Нужно через запрос(ADOQuery) вывести значение из бд(SQL) в поле Edit. Что делаю я: кидаю адоконекшн, настраиваю, кидаю адоквери, настраиваю конект через адоконекшн, в стрингах пишу Select MAX(Z_ID) as MaxZid from zayavki собственно в обработчике этого поля(к... подробнее

Показать сообщение отдельно
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 320
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
08.06.2011, 14:30     Как перенести параметры из ф-ции printf() в самодельную
Цитата Сообщение от Uklunok Посмотреть сообщение
Скажите, почему следующий код не выводит строковый параметр
Потому что после va_start'а надо ещё и va_arg вызывать. Чтобы достать сам аргумент. А va_start настраивает только место в стеке, откуда будут аргументы доставаться

Цитата Сообщение от Uklunok Посмотреть сообщение
Можно сделать так чтобы приведённый ниже код работал без макросов???
В общем случае - нет. Потому что в общем случае у тебя неизвестно какие параметры, а потому ты не сможешь использовать va_arg. Точнее сможешь, но это уже получится самодельная релизация printf'а

Добавлено через 24 минуты
В своё время тоже пришлось писать велосипеды для работы с dsp. Вот кастрированный ограниченный вариант printf'а. Внутри используется буфер фиксированного размера, так что ещё есть и такое ограничение. Код писался под 64-битную архитектуру, так что %ld и %lx, работающие с long'ами, печатали 64-битные значения. Это следует учесть тем, кто хочет модифицировать код под печать 64-битных значений в 32-битном режиме (вместо long надо использовать long long)

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <stdarg.h>
#include <stdlib.h>
 
#define write_string(fd,s) write (fd, s, sizeof (s))
 
static char*
ull2str (unsigned long long val, int radix)
{
  static char digits[] = { '0', '1', '2', '3', '4', '5', '6', '7',
                           '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
  static char buff[128];
  char *pdst = buff + sizeof(buff) - 1;
 
  if (radix < 2 || radix > 16)
    {
      write_string (2, "*** ull2str: Incorrect radix\n");
      abort ();
    }
 
  *pdst-- = 0;
  do
    {
      *pdst-- = digits[val % radix];
      val /= radix;
    }
  while (val != 0);
 
  return pdst + 1;
}
 
static char*
sll2str (long long val, int radix)
{
  static char buff[128];
  char *psrc, *pdst = buff;
 
  if (val >= 0)
    return ull2str (val, radix);
 
  if (val == 0x8000000000000000LL)
    {
      write_string (2, "*** sll2str: Min int64 not suppotred yet\n");
      abort ();
    }
 
  psrc = ull2str (-val, radix);
  *pdst++ = '-';
  do
    *pdst++ = *psrc;
  while (*psrc++ != 0);
 
  return buff;
}
 
void
printf (const char *fmt, ...)
{
  const char *psrc = fmt;
  char buff[1024], c, *pdst = buff;
  va_list va;
 
  va_start (va, fmt);
 
  while ((c = *psrc++) != 0)
    {
      if (c == '%')
        {
          int is_long = 0;
 
        Lbeg:
          switch ((c = *psrc++))
            {
              const char *str;
              unsigned long long ull;
              char cc, lbuff[64];
 
              case 's':
                str = va_arg (va, char*);
              L:
                while ((cc = *str++) != 0)
                  *pdst++ = cc;
                break;
 
              case 'x':
                if (is_long)
                  ull = va_arg (va, unsigned long);
                else
                  ull = va_arg (va, unsigned);
                str = ull2str (ull, 16);
                goto L;
 
              case 'u':
                if (is_long)
                  ull = va_arg (va, unsigned long);
                else
                  ull = va_arg (va, unsigned);
                str = ull2str (ull, 10);
                goto L;
 
              case 'd':
                if (is_long)
                  ull = va_arg (va, long);
                else
                  ull = va_arg (va, int);
                str = sll2str (ull, 10);
                goto L;
 
              case 'l':
                if (is_long)
                  {
                    write_string (2, "Incorrect printf format\n");
                    abort ();
                  }
                else
                  is_long = 1;
                goto Lbeg;
 
              default:
                write_string (2, "Incorrect printf format\n");
                abort ();
                break;
            }
        }
      else
        *pdst++ = c;
    }
 
  write (1, buff, pdst - buff);
}
 
Текущее время: 20:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru