Bitcoin Forum
May 29, 2024, 09:02:25 PM *
News: Latest Bitcoin Core release: 27.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1]
  Print  
Author Topic: Нулевые массивы на MSVC??  (Read 2136 times)
fsb4000 (OP)
Legendary
*
Offline Offline

Activity: 1400
Merit: 1000



View Profile
October 24, 2014, 05:11:44 AM
Last edit: October 24, 2014, 08:27:03 AM by fsb4000
 #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
То код будет выполнять ту же самую работу или нет?
amaclin
Legendary
*
Offline Offline

Activity: 1260
Merit: 1019


View Profile
October 24, 2014, 09:59:51 AM
 #2

const unsigned char vchZero[] = {};

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

Quote
То код будет выполнять ту же самую работу или нет?
в принципе да.
fsb4000 (OP)
Legendary
*
Offline Offline

Activity: 1400
Merit: 1000



View Profile
October 24, 2014, 11: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
bee7
Hero Member
*****
Offline Offline

Activity: 574
Merit: 523


View Profile
November 11, 2014, 02:28:52 PM
 #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;
fsb4000 (OP)
Legendary
*
Offline Offline

Activity: 1400
Merit: 1000



View Profile
November 11, 2014, 03:00:52 PM
 #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<unsigned char> 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
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!