Добавление переменной CHAR16 в строку

Я новичок в C и пытаюсь исправить и скомпилировать программу EDK2 EFI.

Часть программы, которую я хочу изменить, имеет функцию MsgLog что требует Char16 * переменная и использует ее для записи в файл журнала.

Текущий код имеет это

MsgLog("SomeText ...%r\n", Status);

Статус - EFI_STATUS, который может иметь значение "Успешно" или "Не найдено". IE, вы можете получить в файле журнала следующее:

SomeText ...Success

или

SomeText ...Not Found

Я хочу изменить это на:

SomeText ...Success : ABC

или

SomeText ...Not Found : XYZ

Я загрузил : ABC или : XYZ в Char16 * переменная (должна быть Char16 *, чтобы соответствовать другим ограничениям функцией, используемой для ее установки)

Затем я попробовал различные варианты, чтобы добавить его в строку, например

MsgLog("SomeText ...%r%s\n", Status, myVariable);

а также

MsgLog("SomeText ...%r%r\n", Status, myVariable);

но я получаю

SomeText ...Success<null string>

а также

SomeText ...Not Found<null string>

Я не уверен, какой заполнитель форматирования я должен использовать, и нужно ли преобразовывать myVariable в какой-либо другой подходящий формат, и я был бы признателен за некоторые указатели.

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

РЕДАКТИРОВАТЬ: добавлен контекст

ОРИГИНАЛЬНЫЙ РАБОЧИЙ КОД

EFI_STATUS Funct_A()
{
    EFI_STATUS Status;

    //Funct_B returns EFI_SUCCESS or EFI_NOT_FOUND
    Status = Funct_B();

    MsgLog("SomeText ...%r\n", Status);

КОД ПРОБЛЕМЫ

EFI_STATUS Funct_A()
{
    EFI_STATUS Status;
    CHAR16     *myVariable = NULL;

    //Funct_B returns EFI_SUCCESS or EFI_NOT_FOUND
    Status = Funct_B();


    // From some header file, I see "#define SPrint UnicodeSPrint". Not 100% sure it is the relevant one
    // From other code implementations, I know SPrint takes "CHAR16" as first variable. 
    if (!EFI_ERROR (Status)) {
        SPrint (myVariable,  255, L" : ABC");
    } else {
        SPrint (myVariable,  255, L" : XYZ");
    }

    MsgLog("SomeText ...%r%r\n", Status, myVariable);
    // MsgLog is a bit of a rabbit's warren and I can't provide all the background but it expects "CHAR16".

0 ответов

SPrint (myVariable, 255, L" : ABC"); неправильно. myVariable является NULL - нельзя писать NULLуказатель. Вам нужно выделить память для строки, если вы хотите использовать SPrint. Для получения дополнительной информации просмотрите свои знания об указателях и о snprintfстандартная функция C. Второй аргумент SPrint на самом деле размер выделенной памяти - вы не выделили память, поэтому 255 просто недействителен.

CHAR16 myVariable[255];
SPrint(myVariable, sizeof(myVariable), L" : ABC");

Но в вашем случае в этом нет никакого смысла. Во-первых, нет необходимости использовать SPrint- вы не используете строку форматирования. Просто StrCpy (т.е. альтернатива стандартному wcscpy/strcpy) будет достаточно. Но при этом вам вообще не нужна память, просто используйте указатель, чтобы указать на строковый литерал.

const CHAR16 *myVariable = NULL;
if (!EFI_ERROR (Status)) {
    myVariable = L" : ABC";
} else {
    myVariable = L" : XYZ";
}
// or simpler
myVariable = !EFI_ERROR (Status) ? L" : ABC" : L" : XYZ";
Другие вопросы по тегам