LINUX.ORG.RU

История изменений

Исправление 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-ами обкладывать запись в лог?