11.02.2009, 15:52. Просмотров 2876. Ответов 2
Программирование хобби. В основном программирую на Autolispe.
Хотелось бы иметь функцию аналогичную swprintf или _vsntprintf
Написал функцию для одного аргумента через вызов swprintf(szBuffer,format,var);
Хотелось бы иметь На autoLispe ->(format "%s %d %f" "Test=" 120 63.4)
функцию с переменным количеством аргументов.
На Си ->_vsntprintf(szBuffer, sizeof(szBuffer)/izeof(szBuffer[0]), lpszFormat, args)
где va_list это args .
Как создать тип va_list ?
Какова структура списка va_list ?
Во всех примерах показано как обработать функцию с переменным кол-вом аргументов.
Но как создать самому тип va_list?
Подскажите кто знает?
Заранее благодарен.
Пример функции format для AutoLisp с 1им аргументом (format "T=%d" 10)-> "T=10"
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
| static int ads_format(void)
{
struct resbuf *rb=acedGetArgs () ;
struct resbuf *p;
p=rb;
TCHAR format[512];
TCHAR buff[512];
TCHAR *ret;
TCHAR vs[512];
int i1;
double d1;
if(rb == NULL) return RTNORM;
if (rb->restype == RTSTR) wcscpy(format,rb->resval.rstring);//strcpy
else { acdbFail(_T("\n1 Argument should be an string."));
return (RTERROR);
}
rb=rb->rbnext;
if(rb == NULL) { //acutPrintf(temp);
ret=strsave(buff);
acedRetStr(ret);
return (RSRSLT) ;
}
if (rb->restype == RTSTR) {
wcscpy(vs,rb->resval.rstring); // строка
swprintf(buff,format,vs);
}
else if (rb->restype == RTSHORT) // целое
{
i1=rb->resval.rint;
swprintf(buff,format,i1);
}
else if(rb->restype == RTREAL) // вещественное
{
d1=rb->resval.rreal;
swprintf(buff,format,d1);
}
else
{
acdbFail(_T("\n2 Argument should be an integer double string."));
return (RSRSLT) ;
}
ret=strsave(buff);
acedRetStr(ret);
ads_relrb(p);
return (RSRSLT);
} |
|