Перейти к содержанию
    

Применение буферов больше 256 байт глючит sprintf

Почему при использовании буферов (у меня их 4) в разных местах размером больше 256 (ставил 400) начинает рассыпаться sprintf - выводит глюки.

 

В чем может быть проблема?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть какая специфика использования таких буферов?

Изменено пользователем haker_fox
Флуд.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а буфер наверно объявлен как char с размером [0xff] и подаете вы туда utf8 :)

Вовсе нет.

 

Буфер char buf[400]; и подаю я туда байты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть какая специфика использования таких буферов?

Никакой. Накладываются, наверно, буферы на стек - и привет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чисто поржать - мне не до смеха. Есть какая специфика использования таких буферов?

Вероятных причин может быть целая туча. А реальная вряд-ли связана со sprintf. Скорее баг у вас в другом месте.

Например: каков размера стека задачи, вызывающей sprintf?

 

PS: Не использую sprintf ни в одном из последних проектов....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Например: каков размера стека задачи, вызывающей sprintf?

Как это узнать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как это узнать?

Традиционный способ такой:

1. Заполняем выделенную под стек память каким-нибудь паттерном (хоть бы и однобайтовым)

2. Вызываем интересующую процедуру

3. Смотрим, сколько памяти было "затерто"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как это узнать?

Это надо не узнавать. А задавать. У себя в исходниках. Если конечно писали их Вы....

 

3. Смотрим, сколько памяти было "затерто"

В некоторых случаях наблюдал как ..printf из IAR-овской библиотеки использовал до немного больше 256 байт стека.

Но это не при каждом вызове. Обычно - намного меньше. Так что "просто вызвать и посмотреть сколько потрёт" - тут не всегда сработает как надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Традиционный способ такой:

1. Заполняем выделенную под стек память каким-нибудь паттерном (хоть бы и однобайтовым)

2. Вызываем интересующую процедуру

3. Смотрим, сколько памяти было "затерто"

Слишком сложно.

 

Даже если смогу, как изменить размер?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В некоторых случаях наблюдал как ..printf из IAR-овской библиотеки использовал до немного больше 256 байт стека.

Но это не при каждом вызове. Обычно - намного меньше. Так что "просто вызвать и посмотреть сколько потрёт" - тут не всегда сработает как надо.

Да форматированный ввод-вывод очень прожорлив. Смотреть, естественно, наиболее навороченные вызовы.

 

Слишком сложно.

Несколько строк кода.

 

Даже если смогу, как изменить размер?

Этот момент лучше выяснять задолго до введения нескольких буферов по 400 байт.

 

Кстати,

Буфер char buf[400]; и подаю я туда байты.

buf - не локальный часом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Буфер char buf[400]; и подаю я туда байты.

buf - не локальный часом?

:biggrin:

 

Это надо уже заносить в faq для чайников.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Полагаю есть ограничение? Уж не 255 ли?

Локальный буфер выделяется на стеке, еще здоровый кусок от него может откусить sprintf.

Ограничение определяется размером стека и только.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...