преобразовать массив wchar_t в массив int в C

Я пытаюсь преобразовать массив wchar_t в массив int, который содержит кодировку каждого элемента wchar_t в C. Я знаю, что могу сделать это с помощью цикла, подобного приведенному ниже коду, есть ли другой способ без использования цикла, который может значительно улучшить производительность?

 for(int i=0; i< filesize; i++){
    t[i] = (int)p[i];   //t is an int array, p is a wchar_t array
}

person wevrqwevrq2    schedule 09.05.2021    source источник
comment
вы могли бы использовать memcpy я думаю   -  person lulle    schedule 09.05.2021
comment
Если int и wchar_t совместимы, вам может сойти с рук memcpy, но, вероятно, в этом случае код все равно скомпилируется в memcpy. Так что, вероятно, ничего нельзя сделать, хотя я бы подумал об использовании массива wchar_t напрямую, если это возможно.   -  person Paul Hankin    schedule 09.05.2021
comment
@лулле как? можете привести пример кода?   -  person wevrqwevrq2    schedule 09.05.2021
comment
@PaulHankin, можете ли вы предоставить пример кода с использованием memcpy? да, я хотел бы использовать массив wchar_t непосредственно в cuda, который не поддерживает, поэтому я пытаюсь сначала превратить его в массив int на устройстве, а затем преобразовать его обратно в хост   -  person wevrqwevrq2    schedule 09.05.2021


Ответы (2)


Предполагая, что wchar_t и int имеют одинаковый размер, memcpy, вероятно, то, что вам нужно.

#include <string.h>
#include <wchar.h>

int main(void)
{
    _Static_assert(sizeof (int) == sizeof (wchar_t), "This won't work");
    wchar_t warr[3] = {L'a', L'b', L'c'};
    int iarr[3] = {0};
    memcpy(iarr, warr, sizeof warr);
    // iarr now holds the same contents as warr
}
person mediocrevegetable1    schedule 09.05.2021
comment
спасибо за ответ, но я получаю эту ошибку при тестировании вашего кода, что мне делать?: test.cu(7): ошибка: идентификатор _Static_assert не определен - person wevrqwevrq2; 09.05.2021
comment
@ wevrqwevrq2 кажется, что вы компилируете свой код как до C11. Либо добавьте параметр компилятора, чтобы выбрать C11 или выше (например, в GCC это -std=c11), либо включите <assert.h> и замените эту строку на assert(sizeof (int) == sizeof (wchar_t));. Пример. - person mediocrevegetable1; 09.05.2021

Нет. В этом случае реальной альтернативы нет (по крайней мере, если вы имеете в виду переносимость). В противном случае mediocrevegetable1 является возможным решением.

person wired    schedule 09.05.2021