Picproje Elektronik Sitesi

SERBEST BÖLGE => Programlama ve Algoritma => Konuyu başlatan: baran123 - 22 Aralık 2017, 22:44:46

Başlık: C Variable Arguments Sorusu (XC8)
Gönderen: baran123 - 22 Aralık 2017, 22:44:46
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);
Başlık: Ynt: C Variable Arguments Sorusu (XC8)
Gönderen: Elektroemre - 22 Aralık 2017, 23:18:43
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.
Başlık: Ynt: C Variable Arguments Sorusu (XC8)
Gönderen: baran123 - 23 Aralık 2017, 00:03:03
@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 ?
Başlık: Ynt: C Variable Arguments Sorusu (XC8)
Gönderen: baran123 - 23 Aralık 2017, 01:07:56
XC8 vsnprintf ve vsprintf fonksiyonlarını desteklemiyormuş.


unsupported: vsprintf() is not supported by this compiler


sprintf + lcd_write ile devam :)
Başlık: Ynt: C Variable Arguments Sorusu (XC8)
Gönderen: mufitsozen - 23 Aralık 2017, 15:38:18
@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 (http://mirror.fsf.org/pmon2000/3.x/src/lib/libc/vsprintf.c)
Başlık: Ynt: C Variable Arguments Sorusu (XC8)
Gönderen: baran123 - 23 Aralık 2017, 20:52:21
@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.