C Variable Arguments Sorusu (XC8)

Başlatan baran123, 22 Aralık 2017, 22:44:46

baran123

XC8 de Basit görünen bir fonksiyonu yazmaya çalıştığımda bayağı zorlandım.
Amacım ekran veri basarken sprintf ile buffer'a formatlayıp basmak yerine format ve x adet değişkeni bir fonksiyona parametre olarak vermek bu fonksiyon kendi içerisinde bu parametreleri sprintf'e basıp bana buffer verecek.
Bu yapıyı dizayn edemedim. Örnek ile şunu yapmaya çalışıyorum.
Bildiğimiz gibi sprintf fonksiyonunun 3. parametresi çoklu haldedir.
Ben kaçtane değişken girilmiş ve bunların tipi nedir demeden sprintf'e aktarmalıyım.

Bunu yapmak mümkün mü ?

void LCD_Puts(const uint8_t* data, ...) <---- Datadan sonra x adet parametre
{
    uint8_t buffer[64];
    va_list valist;

    va_start(valist, num);
   
    sprintf(buffer, data, değişkenler);
    
    for(uint8_t i = 0; buffer[i] != '\0'; i++)
	   LCD_WriteChar(0, 0 + i, buffer[i]);

   va_end(valist);
}


Örnek kullanım.
LCD_Puts("1.Data = %d, 2.Data = %2.1f, 3.Data = %u", 24, 13.8f, 65534);


Elektroemre

#1
Hocam ihtiyacını yanlış anlamadıysam senin ilacın vsnprintf
Kendi projemde örnek bir parça:

void setText(const char *format, ...)
{
	va_list args;
	va_start(args, format);
	int len = vsnprintf(stringBuffer, stringBufferSize, format, args);
	va_end(args);
}


Ekleme: stringBuffer, buffer char tipinde bir dizi. Global veya yerel olabilir. İhtiyaç zunluğunda olması lazım. len değişkenide bize oluşturulan string'in toplam uzunluğunu veriyor.

baran123

@Elektroemre şöyle bir yöntem önerdi
uint8_t buffer[64];
#define LCD_Putss(const char* data, ...) snprintf (buffer, sizeof(buffer), data, __VA_ARGS__)


Bunu XC8 de kullanamıyoruz derleyici Variadic Macro destekleniyor Bu yüzden syntax error veriyor.

Asıl güzel olan yöntem şu şekilde fakat yine hata alıyorum.
void LCD_Puts(uint8_t x, uint8_t y, const uint8_t* format, ...)
{
    uint8_t stringBuffer[64];
    uint8_t len;
    va_list args;

    va_start(args, format);
    len = vsnprintf(stringBuffer, sizeof(stringBuffer), format, args);
    va_end(args);

    LCD_WriteString(x, y, stringBuffer);
}
 // Error : :0: error: (499) undefined symbol:


XC8 vsnprintf desteklemiyor mu ?

baran123

XC8 vsnprintf ve vsprintf fonksiyonlarını desteklemiyormuş.

unsupported: vsprintf() is not supported by this compiler


sprintf + lcd_write ile devam :)

mufitsozen

@baran123  vsprint fonksiyonun internetde kaynak kodu mevcutdur. Niye o kodu ccs c'ye uyarlamiyorsunuz.?

Ornegin asagidaki kaynak prg isinize yarayabilir.

http://mirror.fsf.org/pmon2000/3.x/src/lib/libc/vsprintf.c
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

baran123

@mufitsozen hocam XC8 kullanıyorum CCS C değil. CCS C de benzer yapılar var sanırım ama XC8 desteklemiyor.
Bir kaç yöntem daha var sanırım son çare bunu eklerim projeye :)
Çok teşekkür ederim. Gelişme olursa tekrar yazarım.