Bir hata ayıklama oturumu sırasında, avr-gcc ile kod yazılırken snprintf beklendiği gibi çalışmıyor. Örnek kod, kayan nokta değerini 3999.9f'yi karakter gösterimlerine dönüştürmelidir. Burada snprintf avr-gcc ile beklendiği gibi çalışma değil
bir minimum test durumdur:int TestSnprintf(void)
{
const float inputValue = 3999.9f;
/* Print with a fixed width of 6 characters (5 numbers and 1 dot).
The buffer must have a length of 7, because snprintf appends a '\0' at the end. */
char buf[7U] = {0, 0, 0, 0, 0, 0, 0};
const uint8_t bufferSize = 7U;
if(6 != snprintf(buf, bufferSize, "%06.1f", inputValue))
{
return -1;
}
if(buf[0] != '3'
|| buf[1] != '9'
|| buf[2] != '9'
|| buf[3] != '9'
|| buf[4] != '.'
|| buf[5] != '9'
|| buf[6] != '\0')
{
return -2;
}
return 0;
}
int main(void)
{
int retVal = TestSnprintf();
return 0;
}
avr-gcc bu kod örneği compling ve Atmel Studio 7 ile çalışan -2 bir dönüş değeri verir. Bu snprintf çalışmıyor demektir.
Şimdiye kadar denenmiş ne varsa?
- Ben 32 ve 64 Linux üzerinde kod test edilmiş ve bunun beklendiği gibi (0 değerini döndürür TestSnprintf) çalışır.
- Kodu Visual Studio 2015 ile test ettim ve beklendiği gibi çalıştım (TestSnprintf 0 değerini döndür).
tampon tamponundan içeriği test JTAG arayüzü kullanılarak cihazda gerçekleştirilir
buf[0] = 32; buf[1] = 32; buf[2] = 32; buf[3] = 32; buf[4] = 32; buf[5] = 63; buf[6] = 0;
olup. Aynı sonucu ile simülatörü de denedim.
- Hiçbir derleyici optimizasyonu etkin değil. Kod -O0 ile derlenmiş ve hata ayıklanmıştır. Burada
dönüş değeri -2 olduğunu göstermektedir bir hata giderme oturumunun bir ekran görüntüsü vardır.
Bu hata ayıklama sırasında dar olduğundan tampon göstermektedir:
Soru ben yanlış yapıyorum
? Her şeyden
İlk yardımın için çok teşekkür ediyorum
ÇÖZÜM! olarak aşağıdaki bağlayıcı seçenekleri eksik @manilo tarafından işaret: printf()
(ve arkadaşları) üç değişik uygulamalar vardır
-Wl,-u,vfprintf -lprintf_flt -lm
Ve C standart kitaplığı gcc! Hangi kütüphaneyi kullanıyorsunuz? – Olaf
Gerçekte ne 'buf' içerdiğini öğrenmelisiniz. –
'libm' ile bağlantılı mı oldunuz? ('-lm') – fukanchik