Re: Stavový automat, goto
Miroslav Mraz
mrazik na volny.cz
Pátek Leden 27 18:34:44 CET 2023
Já ano - a nestydím se za to, byl k tomu důvod. V bare metal si některé
věci musíte napsat sami, příp. opsat to odjinud. Pokud chcete aby vám
překladač kontroloval formátovací řetězec, lze deklarovat např. printf
takto (gcc i clang, C/C++):
extern int printf (const char *__restrict fmt,
...)__attribute__((__format__(__printf__, 1, 2)));
Pak ovšem nastane problém, pokud máte naivní implementaci tt. funkce,
pokud je parametr typu size_t nebo long, kontrole chybí modifikátor z
nebo l ve formátovacím řetězci. Na 32 bitové architektuře to zpravidla
nevadí, protože sizeof(int) == sizeof(long) == sizeof(size_t).
Takže stačí doplnit naivní implementaci vsnprintf asi takto:
// Parse type
type_spec:
switch (*pFormat) {
case 'z': // modifikatory z,l jsou zbytečné - sizeof
long a int jsou stejne
case 'l':
pFormat++;
goto type_spec;
// tohle je už původní text - specifikace formátů
case 'd':
case 'i':
num = PutSignedInt (pStr, fill, width, va_arg (ap, signed int));
break;
case 'u':
num = PutUnsignedInt (pStr, fill, width, va_arg (ap, unsigned
int));
break;
... atd ...
Dávám to sem, někomu to může pomoci - na ARM to funguje. Goto je zde
použito, protože je to nejjednodušší.
Mrazík
On 27. 01. 23 15:55, Jirka Mww wrote:
> ...
> Goto jsem v tomhle stoleti
> snad jeste nepouzil.
Další informace o konferenci Hw-list