Потеря данных при пересылке многоточия - PullRequest
0 голосов
/ 01 апреля 2012

Мне нужен портативный отладочный класс, так как я планирую работать над проектом на разных платформах.Этот класс предоставляет методы для написания сообщений через XDebug.WriteLine («Мне нравится число% d», 7);Который внутренне перенаправляет аргументы в специфичный для системы метод.

Это требует, чтобы я передавал данные эллипса в качестве параметра.И здесь проблема.Он работает с целыми числами, но теряет числа с плавающей точкой при проходе.

XDebug::WriteLine("Print numbers %f, %f",1.234, 3.210f);
XDebug::odprintf(L"Print numbers %f, %f",1.234, 3.210f);

output

Print numbers 0.000000, 0.000000
Print numbers 1.234000, 3.210000

Я пытаюсь выяснить, где искажаются аргументы.Буду признателен за вашу помощь.Весь класс отладки приведен ниже.

#pragma once
#ifndef _XDEBUG_H_
#define _XDEBUG_H_

#include <stdio.h>
#include <stdarg.h>
#include <ctype.h>
#include <Windows.h>;

class XDebug
{
public:

    static void __cdecl WriteLine(const char* txt, ...){
        #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)

        int stringSize = MultiByteToWideChar (CP_ACP, 0, txt, -1, NULL, 0);
        wchar_t* buffer = new wchar_t[stringSize];
        MultiByteToWideChar(CP_UTF8 , 0 , txt, -1, buffer, stringSize);

        va_list args;
        va_start(args, txt);
        XDebug::odprintf(buffer,args);

        delete buffer;

        #endif
    }

//private:
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
    static void __cdecl odprintf(const wchar_t *format, ...){
    wchar_t    buf[4096], *p = buf;
    va_list args;
    int     n;

            va_start(args, format);
            n = _vsnwprintf(p, sizeof buf - 3, format, args); // buf-3 is room for CR/LF/NUL
            va_end(args);

            p += (n < 0) ? sizeof buf - 3 : n;

            while ( p > buf  &&  isspace(p[-1]) )
                    *--p = '\0';

            *p++ = '\r';
            *p++ = '\n';
            *p   = '\0';

            OutputDebugString(buf);
    }
#endif
};

#endif

1 Ответ

2 голосов
/ 01 апреля 2012

Вы не можете пересылать переменные между такими функциями, по той же причине, по которой вы не можете напрямую передать args в sprintf (вы должны использовать специальный vsprintf).

Я предлагаю написать перегрузку odprintf, которая принимает объект va_list в качестве параметра. (И чтобы избежать дублирования , вы могли бы реализовать исходный odprintf в терминах новой перегрузки.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...