2013-11-27 2 views
3

Давайте посмотрим эту строку кода C:sscanf, буквальное или указатель формата

if(sscanf(s, "%04d%02d%02d%02d%02d%02d", &year, &month, &day, &hour, &min, &sec) != EOF) { 
    // ... other stuff 
} 

Я использую Microchip C30 компилятор. 's' и другие переменные определены ранее. Размер всего моего кода: 237396 байтов.

Давайте попробуем изменить формат строки из буквального указателю:

const char *format = "%04d%02d%02d%02d%02d%02d"; 
if(sscanf(s, format, &year, &month, &day, &hour, &min, &sec) != EOF) { 
    // ... other stuff 
} 

Размер теперь: 243798 байт! Более 6 кБ!

Ожидаемое поведение?

+2

Вы не можете просто посмотреть размер сгенерированного двоичного файла, по крайней мере, если он находится в сегментированном формате (вы знаете, отдельный код, данные и сегменты bss). Затем вам нужно посмотреть размер отдельных сегментов. –

+1

Похоже, вам нужно отправить это поставщику компилятора. BTW, эта конфигурация Debug или Release? –

+0

Я использую IDE, предоставленную продавцом пользовательской платы, которая завершает вызовы компилятору. Поэтому я могу видеть только размер используемого двоичного и RAM. Конфигурация - это релиз (нет отладочной). Для других изменений это кажется разумным, за исключением этого. – Mark

ответ

1

В первом случае компилятор знает, какой должен быть набор из sscanf() конверсий: string to int.

sscanf(s, "%04d%02d%02d%02d%02d%02d", ... 

Во втором случае, не хватает этой детали, компилятор считает, что вы могли бы пройти любой спецификатор формата, так что весь scanf() набор преобразований должен быть в коде.

const char *format 
sscanf(s, format, ... 
Смежные вопросы