Массив данных, возвращающих вопрос, Перезапись - PullRequest
0 голосов
/ 19 апреля 2010

Пожалуйста, помогите мне в этом Здесь я хочу сохранить преобразованные данные в новые указатели. Но каждый раз данные перезаписываются самыми последними данными. Пожалуйста, проверьте мой код

 TCHAR nameBuffer[256]; //Globally Declared

 void Caller()
 {
 TCHAR* ptszSecondInFile= QStringToTCharBuffer(userName);
 TCHAR* ptszOutFile=QStringToTCharBuffer(Destinationfilename);
 }

TCHAR *dllmerge::QStringToTCharBuffer( QString buffer )
{
    memset(nameBuffer, 0, sizeof(nameBuffer));
#if UNICODE
_tcscpy_s(nameBuffer, _countof(nameBuffer), buffer.toUtf8());
#else
_tcscpy_s(nameBuffer, _countof(nameBuffer), buffer.toLocal8Bit());
#endif
_tprintf( _T( "nameBuffer %s\n" ), nameBuffer );
return nameBuffer;
 }

Я получаю ptszSecondInFile и ptszOutFile с одинаковым ответом. Можно ли сделать с TCHAR * nameBuffer [256];

Ответы [ 2 ]

1 голос
/ 19 апреля 2010

Кажется, вы используете глобальную переменную nameBuffer в QStringToTCharBuffer. Сделать его локальным ... Или просто скопировать значение nameBuffer в Caller между двумя вызовами ... в противном случае второй вызов перезапишет значение глобальной переменной ...

В качестве совета по программированию на будущее: НЕ ИСПОЛЬЗУЙТЕ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ, ЕСЛИ ВЫ НЕ ДЕЙСТВИТЕЛЬНО ДОЛЖНЫ !!! В этом случае вам не нужно его использовать.

0 голосов
/ 19 апреля 2010

Вам нужна память для хранения каждой нужной вам строки, поэтому глобальный буфер здесь не будет работать. Либо ваша функция QStringToTCharBuffer выделяет новый буфер символов для каждой строки, либо передает буфер символов в функцию. Я бы посоветовал второй, поскольку вы, скорее всего, забудете, что функция выделяет память.

т.е:

TCHAR *dllmerge::QStringToTCharBuffer( QString buffer )
{
    TCHAR* nameBuffer = new TCHAR[256];

    memset(nameBuffer, 0, sizeof(nameBuffer));
#if UNICODE
    _tcscpy_s(nameBuffer, _countof(nameBuffer), buffer.toUtf8());
#else
    _tcscpy_s(nameBuffer, _countof(nameBuffer), buffer.toLocal8Bit());
#endif
    _tprintf( _T( "nameBuffer %s\n" ), nameBuffer );
    return nameBuffer;
}

против

void Caller()
{
    const int maxSize = 256;
    TCHAR szSecondInFile[maxSize];
    TCHAR szOutFile[maxSize];
    QStringToTCharBuffer( userName, szSecondInFile, maxSize );
    QStringToTCharBuffer( Destinationfilename, szOutFile, maxSize );
}

dllmerge::QStringToTCharBuffer( QString buffer, TCHAR* pOutString, const int size )

и т.д.

...