Size: a a a

2020 October 12

G

GoodBye in pro.cxx
Ilia Zviagin
Нет, твоя функция не может ничего кроме строк принимать
Вопрос собственно в этом, могу ли я как-то принимать несколько типов
источник

G

GoodBye in pro.cxx
Мне предложили чередовать <TYPE> <VALUE>
источник

IZ

Ilia Zviagin in pro.cxx
GoodBye
Фунция принимает шаблон строки, N параметров для строки
считает сколько требуется памяти выделить, чтобы заменить в шаблоне теги на значения, выделяю, заменяю и после форматирую ее по своим условиям
Вот из-за этой строки

   inStringTemplateLen += strlen((char *)arg) - 2;
источник

G

GoodBye in pro.cxx
Ilia Zviagin
Вот из-за этой строки

   inStringTemplateLen += strlen((char *)arg) - 2;
я понимаю, поэтому ниже в своем вопросе попытался переделать
источник

IZ

Ilia Zviagin in pro.cxx
GoodBye
Вопрос собственно в этом, могу ли я как-то принимать несколько типов
Ты можешь принимать, если твой код будет к этому готов.
Твой - не готов
источник

IZ

Ilia Zviagin in pro.cxx
GoodBye
я понимаю, поэтому ниже в своем вопросе попытался переделать
Сейчас посмотрю...
источник

G

GoodBye in pro.cxx
GoodBye
[С]
Всем привет, такой вопрос. Есть функция.
void __attribute__((fastcall)) func(const char * restrict inStringTemplate, ...);


Внутри я делаю нечто такое

va_list argptr;
va_start(argptr, inStringTemplate);
uint16_t inStringTemplateLen = strlen(inStringTemplate);
int64_t argCopyIfDigin = 0;
uint8_t argIfDiginLen = 0;
for (void * arg = va_arg(argptr, void *); arg != NULL; arg = va_arg(argptr, void *))
{
   inStringTemplateLen += strlen((char *)arg) - 2;
}
va_start(argptr, inStringTemplate);
char * inString = malloc(inStringTemplateLen + 1);
vsnprintf(inString, inStringTemplateLen + 1, inStringTemplate, argptr);
va_end(argptr);


Но теперь у меня появилась проблема, когда я передаю в фунцию как динамический аргумент не char *, строка
inStringTemplateLen += strlen((char *)arg) - 2;

выкидывает SF.
Я предположил, что могу решить проблему так
if ( !isdigit(arg) )
{
   inStringTemplateLen += strlen((char *)arg) - 2;
}
else
{
   argCopyIfDigin = *((int64_t *)arg);
   argIfDiginLen = 0;
   while ( argCopyIfDigin > 0 )
   {
       argCopyIfDigin /= 10;
       argIfDiginLen++;
   }
   inStringTemplateLen += argIfDiginLen - 2;
}

Но теперь я понял, что не могу просто так взять и понять какой тип находится в
void * arg

Вопрос, как мне такое решить
Напутал в вопросе. Там, где for(...), там у меня исходно стоит char *, а вот уже для второго примера я изменил на void *. Хотя это всё равно тупо и не должно работать
источник

IZ

Ilia Zviagin in pro.cxx
GoodBye
[С]
Всем привет, такой вопрос. Есть функция.
void __attribute__((fastcall)) func(const char * restrict inStringTemplate, ...);


Внутри я делаю нечто такое

va_list argptr;
va_start(argptr, inStringTemplate);
uint16_t inStringTemplateLen = strlen(inStringTemplate);
int64_t argCopyIfDigin = 0;
uint8_t argIfDiginLen = 0;
for (void * arg = va_arg(argptr, void *); arg != NULL; arg = va_arg(argptr, void *))
{
   inStringTemplateLen += strlen((char *)arg) - 2;
}
va_start(argptr, inStringTemplate);
char * inString = malloc(inStringTemplateLen + 1);
vsnprintf(inString, inStringTemplateLen + 1, inStringTemplate, argptr);
va_end(argptr);


Но теперь у меня появилась проблема, когда я передаю в фунцию как динамический аргумент не char *, строка
inStringTemplateLen += strlen((char *)arg) - 2;

выкидывает SF.
Я предположил, что могу решить проблему так
if ( !isdigit(arg) )
{
   inStringTemplateLen += strlen((char *)arg) - 2;
}
else
{
   argCopyIfDigin = *((int64_t *)arg);
   argIfDiginLen = 0;
   while ( argCopyIfDigin > 0 )
   {
       argCopyIfDigin /= 10;
       argIfDiginLen++;
   }
   inStringTemplateLen += argIfDiginLen - 2;
}

Но теперь я понял, что не могу просто так взять и понять какой тип находится в
void * arg

Вопрос, как мне такое решить
Нет, так решить эту проблему невозможно
источник

G

GoodBye in pro.cxx
Ilia Zviagin
Нет, так решить эту проблему невозможно
Ты можешь предложить решение?

Часть функции выглядит так
void __attribute__((fastcall)) func(FILE * restrict __stream, uint8_t lineIndent, const char * restrict inStringTemplate, ...)
{
   va_list argptr;
   va_start(argptr, inStringTemplate);
   uint16_t inStringTemplateLen = strlen(inStringTemplate);
   for (void * arg = va_arg(argptr, void *); arg != NULL; arg = va_arg(argptr, void *))
   {
       inStringTemplateLen += strlen((char *)arg) - 2;
   }
   va_start(argptr, inStringTemplate);
   char * inString = malloc(inStringTemplateLen + 1);
   vsnprintf(inString, inStringTemplateLen + 1, inStringTemplate, argptr);
   va_end(argptr);
}
источник

IZ

Ilia Zviagin in pro.cxx
GoodBye
[С]
Всем привет, такой вопрос. Есть функция.
void __attribute__((fastcall)) func(const char * restrict inStringTemplate, ...);


Внутри я делаю нечто такое

va_list argptr;
va_start(argptr, inStringTemplate);
uint16_t inStringTemplateLen = strlen(inStringTemplate);
int64_t argCopyIfDigin = 0;
uint8_t argIfDiginLen = 0;
for (void * arg = va_arg(argptr, void *); arg != NULL; arg = va_arg(argptr, void *))
{
   inStringTemplateLen += strlen((char *)arg) - 2;
}
va_start(argptr, inStringTemplate);
char * inString = malloc(inStringTemplateLen + 1);
vsnprintf(inString, inStringTemplateLen + 1, inStringTemplate, argptr);
va_end(argptr);


Но теперь у меня появилась проблема, когда я передаю в фунцию как динамический аргумент не char *, строка
inStringTemplateLen += strlen((char *)arg) - 2;

выкидывает SF.
Я предположил, что могу решить проблему так
if ( !isdigit(arg) )
{
   inStringTemplateLen += strlen((char *)arg) - 2;
}
else
{
   argCopyIfDigin = *((int64_t *)arg);
   argIfDiginLen = 0;
   while ( argCopyIfDigin > 0 )
   {
       argCopyIfDigin /= 10;
       argIfDiginLen++;
   }
   inStringTemplateLen += argIfDiginLen - 2;
}

Но теперь я понял, что не могу просто так взять и понять какой тип находится в
void * arg

Вопрос, как мне такое решить
Ты вообще понимаешь, на основе какой информации такие функции, с ellipsis, могут определить тип очередного аргумента?
источник

G

GoodBye in pro.cxx
Ilia Zviagin
Ты вообще понимаешь, на основе какой информации такие функции, с ellipsis, могут определить тип очередного аргумента?
Да, на основе размера
источник

IZ

Ilia Zviagin in pro.cxx
GoodBye
Ты можешь предложить решение?

Часть функции выглядит так
void __attribute__((fastcall)) func(FILE * restrict __stream, uint8_t lineIndent, const char * restrict inStringTemplate, ...)
{
   va_list argptr;
   va_start(argptr, inStringTemplate);
   uint16_t inStringTemplateLen = strlen(inStringTemplate);
   for (void * arg = va_arg(argptr, void *); arg != NULL; arg = va_arg(argptr, void *))
   {
       inStringTemplateLen += strlen((char *)arg) - 2;
   }
   va_start(argptr, inStringTemplate);
   char * inString = malloc(inStringTemplateLen + 1);
   vsnprintf(inString, inStringTemplateLen + 1, inStringTemplate, argptr);
   va_end(argptr);
}
Я не могу предложить решение так как я не знаю задачу.
источник

АК

Александр Караев... in pro.cxx
GoodBye
Ты можешь предложить решение?

Часть функции выглядит так
void __attribute__((fastcall)) func(FILE * restrict __stream, uint8_t lineIndent, const char * restrict inStringTemplate, ...)
{
   va_list argptr;
   va_start(argptr, inStringTemplate);
   uint16_t inStringTemplateLen = strlen(inStringTemplate);
   for (void * arg = va_arg(argptr, void *); arg != NULL; arg = va_arg(argptr, void *))
   {
       inStringTemplateLen += strlen((char *)arg) - 2;
   }
   va_start(argptr, inStringTemplate);
   char * inString = malloc(inStringTemplateLen + 1);
   vsnprintf(inString, inStringTemplateLen + 1, inStringTemplate, argptr);
   va_end(argptr);
}
вызови vsprintf с null, он вернет кол-во необходимой памяти для строки
источник

IZ

Ilia Zviagin in pro.cxx
GoodBye
Да, на основе размера
Размера чего?
источник

G

GoodBye in pro.cxx
Ilia Zviagin
Размера чего?
На основе размера типа данных, конечный тип данных перед ... указывает на последующие аргументы
источник

G

GoodBye in pro.cxx
Последующий аргумент читается с шагом в N от размера типа
источник

G

GoodBye in pro.cxx
насколько я это понял
источник

IZ

Ilia Zviagin in pro.cxx
GoodBye
На основе размера типа данных, конечный тип данных перед ... указывает на последующие аргументы
Нет, это не верно. Так нельзя
источник

АК

Александр Караев... in pro.cxx
GoodBye
Ты можешь предложить решение?

Часть функции выглядит так
void __attribute__((fastcall)) func(FILE * restrict __stream, uint8_t lineIndent, const char * restrict inStringTemplate, ...)
{
   va_list argptr;
   va_start(argptr, inStringTemplate);
   uint16_t inStringTemplateLen = strlen(inStringTemplate);
   for (void * arg = va_arg(argptr, void *); arg != NULL; arg = va_arg(argptr, void *))
   {
       inStringTemplateLen += strlen((char *)arg) - 2;
   }
   va_start(argptr, inStringTemplate);
   char * inString = malloc(inStringTemplateLen + 1);
   vsnprintf(inString, inStringTemplateLen + 1, inStringTemplate, argptr);
   va_end(argptr);
}
а этот код удали и забудь, какое-то перепридумывание sprintf с горой ошибок
источник

G

GoodBye in pro.cxx
Александр Караев
вызови vsprintf с null, он вернет кол-во необходимой памяти для строки
???
источник