Ошибки, баги, вопросы - страница 2761

 
Igor Makanu:

так же работает без предупреждений?

потому что есть соответствующая сигнатура ArrayInitialize

а для беззнакового uchar по неизвестной причине не сделали ArrayInitialize()

Дело не в сигнатуре или её отсутствии. Дело в том что 4 байта преобразовывается в 1, информация может теоретически потеряться, об этом компилятор и предупреждает.

Попробуйте  ArrayInitialize(c, (char)10000);

тоже будет предупреждение

 
Aleksey Mavrin:

Дело не в сигнатуре или её отсутствии. Дело в том что 4 байта преобразовывается в 1, информация может теоретически потеряться, об этом компилятор и предупреждает.

Попробуйте  ArrayInitialize(c, (char)10000);

тоже будет предупреждение

да понятно это все и было изначально

тут вопрос в другом, вот где так уж нужен char?

а uchar я использую в StringToCharArray() и а CryptEncode() и если пройтись по справке еще найдутся

так вот почему проинициализировать массив char я могу используя ArrayInitialize ,а а вот uchar не могу


ладно холивар знатный получился, сомневаюсь что что то изменится ;)


PS: 0xFF = 255 (1 байт )

 
Igor Makanu:

yes it’s clear that was all from the beginning

here the question is different, this is where char is really needed?

I use uchar in StringToCharArray () and CryptEncode (), and if you go through the help there are still

so that's why i can initialize a char array using ArrayInitialize , but uchar can't


ok, the noble holivar turned out, I doubt that something will change;)


PS: 0xFF = 255 (1 byte)

ArrayInitialize (uc,(char) 0xFF ); // truncation of constant value        
 
Igor Makanu:

да понятно это все и было изначально

тут вопрос в другом, вот где так уж нужен char?

а uchar я использую в StringToCharArray() и а CryptEncode() и если пройтись по справке еще найдутся

так вот почему проинициализировать массив char я могу используя ArrayInitialize ,а а вот uchar не могу

ладно холивар знатный получился, сомневаюсь что что то изменится ;)

PS: 0xFF = 255 (1 байт )

Не понял почему вы не можете. с uchar всё также как с char работает.

Вы изначально же спрашивали почему предупреждение, потому что 4 байта в 1. А значение 255 не важно совсем. и 0 и единица могут быть и 1 и 2 и 4 и 8 байт же)

 

Alain Verleyen:

ArrayInitialize (uc,(char) 0xFF );

проверил:

uchar uc[16];
ArrayInitialize (uc, (char) 0xFF );
ArrayPrint(uc); 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255

OK, работает без предупреждений компилятора

Спасибо

 
Igor Makanu:

проверил:

OK, работает без предупреждений компилятора

Спасибо

Вы будете смеяться, но даже так работает без предупреждений

uchar c[16];
int ini2=0xFFFF;
ArrayInitialize(c, (uchar)ini2);
 
Aleksey Mavrin:

Вы будете смеяться, но даже так работает без предупреждений

вы тоже будете смеятся но это путь в UB и способ обрести сложноловимый баг на следующих билдах :-)

int foo=-1;

uchar bar=(uchar)foo; // чему должен быть равен bar ?

 
Igor Makanu:

проверил:

OK, работает без предупреждений компилятора

Спасибо

Зачем нужен вызов ArrayInitialize в этой случае? Почему не написать просто uchar uc[16] = {0xFF}; ?

ArrayInitialize имеет смысл для динамически распределенных массивов, а тут размер якобы известен в момент описания.

 
Aleksey Mavrin:

Вы будете смеяться, но даже так работает без предупреждений

не смешно, это не правильная инициализация, которую потом можно самому не понять почему так делал

понятное дело, что старший байт будет обрезан при кастинге к uchar


Stanislav Korotky:

Зачем нужен вызов ArrayInitialize в этой случае? Почему не написать просто uchar uc[16] = {0xFF}; ?

ArrayInitialize имеет смысл для динамически распределенных массивов, а тут размер якобы известен в момент описания.

не прокатит

распринтуйте, будет первый элемент 255, а остальные 0, 0, 0, ...

 
Igor Makanu:

OK, работает без предупреждений компилятора

без приведения по-хорошему так

ArrayInitialize(uc, '\xFF');
UPD нет, тоже предупреждение, такой литерал имеет тип ushort