История изменений
Исправление Gyros, (текущая версия) :
Спасибо за разбор полета!
Переделал под switch:
const char *_get_type_msg(enum msg_type type)
{
switch (type)
{
case DEBUG_MSG: return "DEBUG";
case INFO_MSG: return "INFO";
case WARNING_MSG: return "WARNING";
case ERROR_MSG: return "ERROR";
case FATAL_MSG: return "FATAL";
default: return "UNKNOWN";
}
}
Мне нравится свой мультилайн. Я могу для любого объекта something сделать ф-цию something_to_str, а дальше просто использовать для вывода в лог. (Как в C# у любого объекта есть ф-ция ToString()) Единственный недостаток - нужно освобождать строку. Мне кажется это лучше, чем писать для каждого something функцию log_something. Запись матрицы в лог - это не относится к матрице как структуре/классу. И имя матрицы тоже не относится; имя матрицы появляется только когда нужна печать на экран или в файл.
Мне не надо отфильтровывать записи и контролировать уровень вывода. У меня простенький вариант.
Исправил свой жуткий косяк c форматированием (из-за того что недокопипастил):
char* mat4_to_str(const char* name, const MAT4 *m)
{
const char fmt[]="%s = \n\t[%9.3f, %9.3f, %9.3f, %9.3f]\n\t|%9.3f, %9.3f, %9.3f, %9.3f|\n\t|%9.3f, %9.3f, %9.3f, %9.3f|\n\t[%9.3f, %9.3f, %9.3f, %9.3f]\n";
int sz = snprintf(NULL, 0, fmt, name, m->M[0], m->M[4], m->M[ 8], m->M[12],
m->M[1], m->M[5], m->M[ 9], m->M[13],
m->M[2], m->M[6], m->M[10], m->M[14],
m->M[3], m->M[7], m->M[11], m->M[15]);
char *str=NULL;
str = malloc(sz+1);
if (!str)
{
fprintf(stderr, "malloc: Memory allocation error.\n");
exit(EXIT_FAILURE);
}
snprintf(str, sz+1, fmt, name, m->M[0], m->M[4], m->M[ 8], m->M[12],
m->M[1], m->M[5], m->M[ 9], m->M[13],
m->M[2], m->M[6], m->M[10], m->M[14],
m->M[3], m->M[7], m->M[11], m->M[15]);
return str;
}
«Разница между abort и exit в том, что abort создает core-файл, который позволяет найти конкретное место падения»
А можете привести пример? Я просто не представляю, что за core-файл и как он может помочь.
Насчет многопоточного использования:
#include <pthread.h>
#include <time.h>
...
pthread_mutext_t mutx;
...
status = pthread_mutex_init(&mutx, NULL);
...
pthread_mutex_lock(&mutx);
log_write(DEBUG_MSG, "%s=%d %s=%d", "numb1", 128, "numb2", 512);
pthread_mutex_unlock(&mutx);
Вы имели в виду так lock/unlock-ами обкладывать запись в лог?
Исправление Gyros, :
Спасибо за разбор полета!
Переделал под switch:
const char *_get_type_msg(enum msg_type type)
{
switch (type)
{
case DEBUG_MSG: return "DEBUG";
case INFO_MSG: return "INFO";
case WARNING_MSG: return "WARNING";
case ERROR_MSG: return "ERROR";
case FATAL_MSG: return "FATAL";
default: return "UNKNOWN";
}
}
Мне нравится свой мультилайн. Я могу для любого объекта something сделать ф-цию something_to_str, а дальше просто использовать для вывода в лог. (Как в C# у любого объекта есть ф-ция ToString()) Единственный недостаток - нужно освобождать строку. Мне кажется это лучше, чем писать для каждого something функцию log_something. Запись матрицы в лог - это не относится к матрице как структуре/классу. И имя матрицы тоже не относится; имя матрицы появляется только для вывода на экран или файл.
Мне не надо отфильтровывать записи и контролировать уровень вывода. У меня простенький вариант.
Исправил свой жуткий косяк c форматированием (из-за того что недокопипастил):
char* mat4_to_str(const char* name, const MAT4 *m)
{
const char fmt[]="%s = \n\t[%9.3f, %9.3f, %9.3f, %9.3f]\n\t|%9.3f, %9.3f, %9.3f, %9.3f|\n\t|%9.3f, %9.3f, %9.3f, %9.3f|\n\t[%9.3f, %9.3f, %9.3f, %9.3f]\n";
int sz = snprintf(NULL, 0, fmt, name, m->M[0], m->M[4], m->M[ 8], m->M[12],
m->M[1], m->M[5], m->M[ 9], m->M[13],
m->M[2], m->M[6], m->M[10], m->M[14],
m->M[3], m->M[7], m->M[11], m->M[15]);
char *str=NULL;
str = malloc(sz+1);
if (!str)
{
fprintf(stderr, "malloc: Memory allocation error.\n");
exit(EXIT_FAILURE);
}
snprintf(str, sz+1, fmt, name, m->M[0], m->M[4], m->M[ 8], m->M[12],
m->M[1], m->M[5], m->M[ 9], m->M[13],
m->M[2], m->M[6], m->M[10], m->M[14],
m->M[3], m->M[7], m->M[11], m->M[15]);
return str;
}
«Разница между abort и exit в том, что abort создает core-файл, который позволяет найти конкретное место падения»
А можете привести пример? Я просто не представляю, что за core-файл и как он может помочь.
Насчет многопоточного использования:
#include <pthread.h>
#include <time.h>
...
pthread_mutext_t mutx;
...
status = pthread_mutex_init(&mutx, NULL);
...
pthread_mutex_lock(&mutx);
log_write(DEBUG_MSG, "%s=%d %s=%d", "numb1", 128, "numb2", 512);
pthread_mutex_unlock(&mutx);
Вы имели в виду так lock/unlock-ами обкладывать запись в лог?
Исходная версия Gyros, :
Спасибо за разбор полета!
Переделал под switch:
const char *_get_type_msg(enum msg_type type)
{
switch (type)
{
case DEBUG_MSG: return "DEBUG";
case INFO_MSG: return "INFO";
case WARNING_MSG: return "WARNING";
case ERROR_MSG: return "ERROR";
case FATAL_MSG: return "FATAL";
default: return "UNKNOWN";
}
}
Мне нравится свой мультилайн. Я могу для любого объекта something сделать ф-цию something_to_str, а дальше просто использовать для вывода в лог. (Как в C# у любого объекта есть ф-ция ToString()) Единственный недостаток - нужно освобождать строку. Мне кажется это лучше, чем писать для каждого something функцию log_something. Запись матрицы в лог - это не относится к матрице как структуре/классу.
Мне не надо отфильтровывать записи и контролировать уровень вывода. У меня простенький вариант.
Исправил свой жуткий косяк c форматированием (из-за того что недокопипастил):
char* mat4_to_str(const char* name, const MAT4 *m)
{
const char fmt[]="%s = \n\t[%9.3f, %9.3f, %9.3f, %9.3f]\n\t|%9.3f, %9.3f, %9.3f, %9.3f|\n\t|%9.3f, %9.3f, %9.3f, %9.3f|\n\t[%9.3f, %9.3f, %9.3f, %9.3f]\n";
int sz = snprintf(NULL, 0, fmt, name, m->M[0], m->M[4], m->M[ 8], m->M[12],
m->M[1], m->M[5], m->M[ 9], m->M[13],
m->M[2], m->M[6], m->M[10], m->M[14],
m->M[3], m->M[7], m->M[11], m->M[15]);
char *str=NULL;
str = malloc(sz+1);
if (!str)
{
fprintf(stderr, "malloc: Memory allocation error.\n");
exit(EXIT_FAILURE);
}
snprintf(str, sz+1, fmt, name, m->M[0], m->M[4], m->M[ 8], m->M[12],
m->M[1], m->M[5], m->M[ 9], m->M[13],
m->M[2], m->M[6], m->M[10], m->M[14],
m->M[3], m->M[7], m->M[11], m->M[15]);
return str;
}
«Разница между abort и exit в том, что abort создает core-файл, который позволяет найти конкретное место падения»
А можете привести пример? Я просто не представляю, что за core-файл и как он может помочь.
Насчет многопоточного использования:
#include <pthread.h>
#include <time.h>
...
pthread_mutext_t mutx;
...
status = pthread_mutex_init(&mutx, NULL);
...
pthread_mutex_lock(&mutx);
log_write(DEBUG_MSG, "%s=%d %s=%d", "numb1", 128, "numb2", 512);
pthread_mutex_unlock(&mutx);
Вы имели в виду так lock/unlock-ами обкладывать запись в лог?