Добавление переменной 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";