Существует несколько проблем:
- Ваша функция преобразования не производит ничего видимого для вызывающей стороны: вы сохраняете значения кодовых точек в локальном массиве и возвращаете вызывающей стороне.Компилятор предупреждает вас, что по крайней мере
pt3
установлено и не используется, но более продвинутый компилятор оптимизирует весь код для этой функции без побочных эффектов. - Какое описание API для
Convert
?Похоже, вы получаете указатель на строку ASCII, замаскированный под указатель на unsigned short
, и кажется, что преобразование должно быть выполнено на месте.Если это фактическое требование, это очень плохая идея.Функция должна получить указатель на массив назначения с типом unsigned short *
, size_t
, указывающий количество элементов этого массива, и указатель на исходную строку с типом const char *
. - Как следуетбайты вне диапазона ASCII будут обработаны?Кодируется ли исходная строка в заданную кодовую страницу?это кодировка UTF-8?Должна ли функция сообщать об ошибке?
Из EDIT вы, кажется, подтверждаете безумное требование API.Предполагая, что в массиве аргументов достаточно места, вы должны выполнить преобразование из последнего байта в первый, чтобы избежать наступления на собственные пальцы:
void Convert(unsigned short *pt1) {
// pt1 is a pointer to a null-terminated variable length ASCII string
// with enough space to receive the converted value including a null terminator
unsigned char *pt2 = (unsigned char *)pt1;
size_t i;
// Compute the number of bytes
for (i = 0; pt2[i] != '\0'; i++)
continue;
// Convert the contents from right to left
// Assuming ISO8859-1 encoding for bytes outside the ASCII range
for (;;) {
pt1[i] = (unsigned short)pt2[i];
if (i-- == 0)
break;
}
}