1 Haziran 2017 Perşembe

vsnprintf metodu - Loglama İçin Kullanılır

Giriş
Şu satırı dahil ederiz.
#include <cstdio>
Örnek - Real Time Sistemde Kullanılır
Dışarıdan bellek alanı alan ve vsnprintf metodunu sarmalayan bir metod için şöyle yaparız.
void MyPrintFunc(char *buffer, size_t sizeOfBuffer, const char* format, ...)
{
  va_list arg;
  va_start(arg, format);

  vsnprintf(buffer, sizeOfBuffer, format, arg);

  va_end(arg);
}
Çağırmak için şöyle yaparız.
char buffer[1000] = { 0 };
const char* abc = "abc";

MyPrintFunc(buffer, 1000, "%s", abc);
Örnek - Real Time Sistemde Kullanılır
vsnprintf metodunu sarmalayan ve sabit büyüklükte bellek alanını tanımlayan bir metod için şöyle yaparız.
void write_log(const char *message, ...)
{
  char buffer[512];
  va_list args;

  // Parse ellipsis and add arguments to message
  va_start (args, message);
  vsnprintf (buffer, sizeof(buffer), message, args);
  va_end (args);
  ...
}
Şöyle macrolar tanımlarız.
#define DEBUG(msg, ...)         Logger::write_log(msg, ##__VA_ARGS__);
Çağırmak için şöyle yaparız.
DEBUG("Test string %s", "additional string");
Örnek
Bellek alanını hesaplayan bir metod için şöyle yaparız
void dolog(const char *format_string, va_list *arg) {
  int len = vsnprintf(NULL, 0, format_string, *arg);
  if (len < 0) {
    return;
  }
  char buf[len + 1];
  len = vsnprintf(buf, sizeof buf, format_string, *arg);
  ...
}

void log(const char *format_string, ...) {
  va_list args;
  va_start(args, format_string);
  dolog(format_string, &args);
  va_end(args1);
  
}



Hiç yorum yok:

Yorum Gönder