Author

Topic: Нулевые массивы на MSVC?? (Read 2162 times)

legendary
Activity: 1400
Merit: 1000
November 11, 2014, 10:00:52 AM
#5
Код, конечно, может выполнять правильно, то, что написано. Не ясно только зачем вообще объявлять массив, если передача в функцию сравнения нулевого указателя производится со знанием деталей реализации этой функции.

Кошерно было бы так:
Code:
const unsigned char vchZero[1] = {};
А без объявления массива так:
Code:
return CompareBigEndian(vch, len, ((unsigned char *)0), 0) > 0 &&
        CompareBigEndian(vch, len, half ? vchMaxModHalfOrder : vchMaxModOrder, 32) <= 0;

И кошерно и без объявления так:
Code:
return CompareBigEndian(vch, len, vch, 0) > 0 &&
        CompareBigEndian(vch, len, half ? vchMaxModHalfOrder : vchMaxModOrder, 32) <= 0;

Работает, тесты проходит и ладно  Smiley
Наверное для единообразия, массивы там и нулевой массив, и там ещё в другом месте есть
Code:
static const std::vector vchZero(0);
тоже vchZero -нулевой вектор...
А изменение первоначального варианта до
Code:
const unsigned char *vchZero = NULL;
потому что это минимальное число изменений в коде для достижения результата(возможность компиляции под MSVC, с сохранением совместимости с gcc) и первая идея, которая пришла в голову...
Кстати, первоначально
Code:
const unsigned char vchZero[0] = {};
появился 24 июля 2014, не так уж и давно https://github.com/novacoin-project/novacoin/pull/21
hero member
Activity: 574
Merit: 523
November 11, 2014, 09:28:52 AM
#4
const unsigned char vchZero[] = {};

при явном объявлении массива не надо писать его размер.
впрочем при описанном вами случае использования вы можете и не пустой массив создавать.

Quote
То код будет выполнять ту же самую работу или нет?
в принципе да.
const unsigned char vchZero[] = {}; тоже не компилит Sad
http://i61.tinypic.com/14xmko0.jpg

На другом форуме посоветовали такой вариант. Пока остановлюсь на нём.
Code:
const unsigned char *vchZero = nullptr;

Тем не менее, cпасибо за отклик amaclin

Код, конечно, может выполнять правильно, то, что написано. Не ясно только зачем вообще объявлять массив, если передача в функцию сравнения нулевого указателя производится со знанием деталей реализации этой функции.

Кошерно было бы так:
Code:
const unsigned char vchZero[1] = {};
А без объявления массива так:
Code:
return CompareBigEndian(vch, len, ((unsigned char *)0), 0) > 0 &&
        CompareBigEndian(vch, len, half ? vchMaxModHalfOrder : vchMaxModOrder, 32) <= 0;

И кошерно и без объявления так:
Code:
return CompareBigEndian(vch, len, vch, 0) > 0 &&
        CompareBigEndian(vch, len, half ? vchMaxModHalfOrder : vchMaxModOrder, 32) <= 0;
legendary
Activity: 1400
Merit: 1000
October 24, 2014, 06:49:29 AM
#3
const unsigned char vchZero[] = {};

при явном объявлении массива не надо писать его размер.
впрочем при описанном вами случае использования вы можете и не пустой массив создавать.

Quote
То код будет выполнять ту же самую работу или нет?
в принципе да.
const unsigned char vchZero[] = {}; тоже не компилит Sad
http://i61.tinypic.com/14xmko0.jpg

На другом форуме посоветовали такой вариант. Пока остановлюсь на нём.
Code:
const unsigned char *vchZero = nullptr;

Тем не менее, cпасибо за отклик amaclin
legendary
Activity: 1260
Merit: 1019
October 24, 2014, 04:59:51 AM
#2
const unsigned char vchZero[] = {};

при явном объявлении массива не надо писать его размер.
впрочем при описанном вами случае использования вы можете и не пустой массив создавать.

Quote
То код будет выполнять ту же самую работу или нет?
в принципе да.
legendary
Activity: 1400
Merit: 1000
October 24, 2014, 12:11:44 AM
#1
В коде есть
Объявление:
Code:
const unsigned char vchZero[0] = {};

Единственное использование:
Code:
bool CKey::CheckSignatureElement(const unsigned char *vch, int len, bool half) {
    return CompareBigEndian(vch, len, vchZero, 0) > 0 &&
        CompareBigEndian(vch, len, half ? vchMaxModHalfOrder : vchMaxModOrder, 32) <= 0;
}

Code:
int CompareBigEndian(const unsigned char *c1, size_t c1len, const unsigned char *c2, size_t c2len) {
    while (c1len > c2len) {
        if (*c1)
            return 1;
        c1++;
        c1len--;
    }
    while (c2len > c1len) {
        if (*c2)
            return -1;
        c2++;
        c2len--;
    }
    while (c1len > 0) {
        if (*c1 > *c2)
            return 1;
        if (*c2 > *c1)
            return -1;
        c1++;
        c2++;
        c1len--;
    }
    return 0;
}

MSVC говорит массивы должны иметь размер больше 0, и выкидывает с ошибкой.
Если сделать объявление для MSVC
Code:
const unsigned char *vchZero
То код будет выполнять ту же самую работу или нет?
Jump to: