Re: Использование переменных цикла после цикла
От: Khimik  
Дата: 23.09.23 09:50
Оценка:
Вот ещё вопрос по близкому коду, чтобы не создавать тему. Мне надо перевести эту функцию на Delphi:

static int receivebits(int buf[], int num_of_bits) {

    int cnt, num; 
    unsigned int lastbits, lastbyte;
    unsigned char * cbuf;
    int mask = (1 << num_of_bits) -1;

    cbuf = ((unsigned char *)buf) + 3 * sizeof(*buf);
    cnt = buf[0];
    lastbits = (unsigned int) buf[1];
    lastbyte = (unsigned int) buf[2];
    
    num = 0;
    while (num_of_bits >= 8) {
    lastbyte = ( lastbyte << 8 ) | cbuf[cnt++];
    num |=  (lastbyte >> lastbits) << (num_of_bits - 8);
    num_of_bits -=8;
    }
    if (num_of_bits > 0) {
    if (lastbits < num_of_bits) {
        lastbits += 8;
        lastbyte = (lastbyte << 8) | cbuf[cnt++];
    }
    lastbits -= num_of_bits;
    num |= (lastbyte >> lastbits) & ((1 << num_of_bits) -1);
    }
    num &= mask;
    buf[0] = cnt;
    buf[1] = lastbits;
    buf[2] = lastbyte;
    return num; 
}


ChatGPT перевёл, и компилятор выдаёт предупреждение из-за того, что сравниваются два разных интегера — беззнаковый и со знаком. В данном случае есть int num_of_bits, есть unsigned int lastbits, и они напрямую сравниваются: if (lastbits < num_of_bits) { . Тут нет если не ошибки, то по крайней мере лёгкой оплошности в этом С коде?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[3]: Использование переменных цикла после цикла
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 23.09.23 11:38
Оценка:
Здравствуйте, Alekzander, Вы писали:

PD>>Да. Она описана не в for, а выше, поэтому может использоваться до выхода на свою }


A>До Студии 7.1 скоуп был от начала цикла до конца блока. Соответственно, два одинаковых цикла подрял с i написать было нельзя (второй должен был быть без объявления). Переносить проекты было незабываемое удовольствие.


Это был косяк студии, в стандарте такое если и было, то максимум во времена CFront
Маньяк Робокряк колесит по городу
Re[2]: Использование переменных цикла после цикла
От: T4r4sB Россия  
Дата: 23.09.23 11:45
Оценка:
Здравствуйте, Khimik, Вы писали:


K>ChatGPT перевёл, и компилятор выдаёт предупреждение из-за того, что сравниваются два разных интегера — беззнаковый и со знаком. В данном случае есть int num_of_bits, есть unsigned int lastbits, и они напрямую сравниваются: if (lastbits < num_of_bits) { . Тут нет если не ошибки, то по крайней мере лёгкой оплошности в этом С коде?


Всё верно, это говнокод, и современные крестокомпиляторы тоже выдают предупреждение. Скасти одну из частей к типу другой, в данном случае неважно какую к чему
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[2]: Использование переменных цикла после цикла
От: kov_serg Россия  
Дата: 23.09.23 12:02
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Вот ещё вопрос по близкому коду, чтобы не создавать тему. Мне надо перевести эту функцию на Delphi:


K>
K>static int receivebits(int buf[], int num_of_bits) {

K>    int cnt, num; 
K>    unsigned int lastbits, lastbyte;
K>    unsigned char * cbuf;
K>    int mask = (1 << num_of_bits) -1;

K>    cbuf = ((unsigned char *)buf) + 3 * sizeof(*buf);
K>    cnt = buf[0];
K>    lastbits = (unsigned int) buf[1];
K>    lastbyte = (unsigned int) buf[2];
    
K>    num = 0;
K>    while (num_of_bits >= 8) {
K>    lastbyte = ( lastbyte << 8 ) | cbuf[cnt++];
K>    num |=  (lastbyte >> lastbits) << (num_of_bits - 8);
K>    num_of_bits -=8;
K>    }
K>    if (num_of_bits > 0) {
K>    if (lastbits < num_of_bits) {
K>        lastbits += 8;
K>        lastbyte = (lastbyte << 8) | cbuf[cnt++];
K>    }
K>    lastbits -= num_of_bits;
K>    num |= (lastbyte >> lastbits) & ((1 << num_of_bits) -1);
K>    }
K>    num &= mask;
K>    buf[0] = cnt;
K>    buf[1] = lastbits;
K>    buf[2] = lastbyte;
K>    return num; 
K>}
K>

Тут же очевидный код написан. Оно просто вместо нормально структуры использует массив. Ну не было тогда в фортране структур.
struct {
  int cnt; // текущая позиция в buf
  int lastbits; // кол-во бит в аккумуляторе
  int lastbyte; // аккумулятор
  char buf[]; // поток данных
};

оно просто выколупывет заданное количество бит из потока.
Re: Использование переменных цикла после цикла
От: Khimik  
Дата: 24.10.23 12:43
Оценка:
https://rsdn.org/forum/job.offers/8624193.all
Автор: Khimik
Дата: 24.10.23
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re: Использование переменных цикла после цикла
От: rg45 СССР  
Дата: 27.10.23 14:34
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Тут какое-то вычисление, сколько бит понадобится на хранение нескольких чисел указанного максимального размера. И меня смутило, что переменная bytecnt, которая вначале служит счётчиком цикла, используется также после цикла. Это нормально в C++?


Нет, это несовершенство старых компиляторов (VC 6.0 или старше). На современных компиляторах (начиная с VS 2002, она же msvc 7.0) такие гуси не взлетают.
--
Отредактировано 27.10.2023 14:35 rg45 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.