Re[2]: Коды ошибок и отрицательные числа
От: B0FEE664  
Дата: 31.01.22 14:41
Оценка:
Здравствуйте, cppguard, Вы писали:

C>Вы проверяете чужой код, видите следующий кусок:

C>
C>nread = my_read(...)
C>if (nread == -1)
C>    throw;
C>my_copy(src, dst, nread);
C>


C>Ваши действия?

Без знания контекста разработки ответить невозможно. Например, переписывание на:
nread = my_read(...)
if (nread <= -1)
    throw;
my_copy(src, dst, nread);

может требовать (согласно утверждённым методикам) написания дополнительного теста в котором my_read возвращает значение меньше -1. А если my_read никогда не возвращает такого, то тест никогда не будет признан пройденным => код не валиден, так как не протестирован.
И каждый день — без права на ошибку...
Re[3]: Коды ошибок и отрицательные числа
От: cppguard  
Дата: 31.01.22 14:49
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>может требовать (согласно утверждённым методикам) написания дополнительного теста в котором my_read возвращает значение меньше -1. А если my_read никогда не возвращает такого, то тест никогда не будет признан пройденным => код не валиден, так как не протестирован.


А что мешает использовать в тесте заглушку, которая вернёт нужное значение?
Re[4]: Коды ошибок и отрицательные числа
От: B0FEE664  
Дата: 31.01.22 15:07
Оценка:
Здравствуйте, cppguard, Вы писали:

BFE>>может требовать (согласно утверждённым методикам) написания дополнительного теста в котором my_read возвращает значение меньше -1. А если my_read никогда не возвращает такого, то тест никогда не будет признан пройденным => код не валиден, так как не протестирован.


C>А что мешает использовать в тесте заглушку, которая вернёт нужное значение?

Ничего: нужно написать ещё один специальный тест, описать что он тестирует, добавить в список исполняемых тестов... Затягивание сроков может быть выгодно, но приветствуется не всегда.
И каждый день — без права на ошибку...
Re[2]: Коды ошибок и отрицательные числа
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 31.01.22 15:38
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Всё очень просто 0-нет ошибки, не 0 — есть ошибка и всё.

Ну как так? А количество прочитанных байт? А результат нетривиальной успешной операции?
Sic luceat lux!
Re[4]: Коды ошибок и отрицательные числа
От: T4r4sB Россия  
Дата: 31.01.22 17:59
Оценка:
Здравствуйте, cppguard, Вы писали:


Да, так и делается сейчас, но я этого не понимаю. Ведь куда как легче проверять код типа
unsgined nread = my_read(...)
if (nread >= 0)
    my_copy(src, dst, nread)
throw io_error(nread);
Re[3]: Коды ошибок и отрицательные числа
От: T4r4sB Россия  
Дата: 31.01.22 18:06
Оценка:
Здравствуйте, cppguard, Вы писали:

C>Ну эт классика — дед, который не пишет production ready код, учит нас жизни.


Я пишу продакшон. Беззнаковые индексы — это грабли.

C>Если бы всё так было очевидно, то unsigned давно бы стал deprecated.


Легаси...
Re[3]: Коды ошибок и отрицательные числа
От: kov_serg Россия  
Дата: 31.01.22 21:27
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Здравствуйте, kov_serg, Вы писали:


_>>Всё очень просто 0-нет ошибки, не 0 — есть ошибка и всё.

K>Ну как так? А количество прочитанных байт? А результат нетривиальной успешной операции?

Вас что именно интересует?
int fn(fn_output_t *output,fn_input_t *input); // 0-нет ошибок, не 0 код ошибки

В частности
int my_read2(void *ctx,void *buffer,int size,int *readed) {
  int rd=my_read(ctx,buffer,size);
  if (readed) *readed=rd;
  return rd<0 ? rd : 0;
}

{
  int rc=0;
  ...
  int buf_size;
  if (my_read2(stream,buf,buf_lim,&buf_size)) { rc=my_error_read_problem; goto leave; }
  ...
leave:
  if (stream) my_close(stream);
  ...
  return rc;
}

  Скрытый текст
Или помещать результат вместе с кодами ошибок в структуру результата либо использовать std::tuple
struct my_read_result_t {
    my_read_result_t(int count) : value(count) {}
    int count() const { 
        if (invalid()) throw this;
        return value;
    }
    bool invalid() const { return value<0; }
private:
    int value;
};
my_read_result_t my_read(...) { ... }

std::tuple<bool,int> my_:read(...);


Или вам хочется странного можно хранить состояние в классе вместе с кодом ошибки.
struct Stream {
  ...
  int read(void* data,int size);
  bool error();
  int get_error_code();
};
...
  int rd=stream->read(count);
  if (stream->error()) {
    code=stream->get_error_code();
...


Можно просто завести функцию для проверки
int my_read(void *ctx,int count);
bool my_read_result_invalid(int res);

...
int rd=my_read(stream,count);
if (my_read_result_invalid(rd)) { panic(); }
...

Вариантов дофигища, но первый работает как в c так во всех c++ и его можно экспоритровать из динамической библиотеки не прибегая к костылям.
Re[6]: Коды ошибок и отрицательные числа
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 31.01.22 22:48
Оценка:
Здравствуйте, netch80, Вы писали:

M>>Поэтому надо просто писать

M>>
M>>for(auto i=0u; i!=v.size(); ++i)
M>>


N>А теперь повторите это для прохождения по элементам в порядке убывания индексов.


for (auto i = v.size(); i --> 0;)
Ce n'est que pour vous dire ce que je vous dis.
Re[3]: Коды ошибок и отрицательные числа
От: 5.März  
Дата: 01.02.22 01:21
Оценка:
Здравствуйте, cppguard, Вы писали:

C>Ну эт классика — дед, который не пишет production ready код, учит нас жизни


Для меня классикой уже стало наблюдать, как русские программисты выходят из тайги, отрицают все источники и авторитеты, и делают по-своему просто чтобы почувствовать себя чуть умнее, чем на самом деле. Откуда у нас столько одаренных людей берется, которые лучше знают что нужно дизайну языка, чем дизайнеры языка, ума не приложу

Он не учит вас жизни, а приводит аргументы, что знаковые были бы для языка лучше. Есть контраргументы — высказывайте... Или в универе больше не учат, что обсуждение личности человека не является опровержением его аргументов? Почему я в англоязычных дискуссиях подобного невежества не наблюдаю?

C>Я, кстати, больше пишу на Java, чем на Си и С++, и там, как бы, не из чего выбирать.


Автор Java отказался включать в язык беззнаковые типы по той же самой причине:

> Quiz any C developer about unsigned, and pretty soon you discover that almost no C developers actually understand what goes on with unsigned, what unsigned arithmetic is. Things like that made C complex. The language part of Java is, I think, pretty simple.


Источник: http://www.gotw.ca/publications/c_family_interview.htm

В дотнете и тысяче других более-менее новых языков тоже все размеры и индексы знаковые, угадайте почему, вы бы лучше учились чем умничать.
Re[4]: Коды ошибок и отрицательные числа
От: cppguard  
Дата: 01.02.22 02:12
Оценка: 1 (1)
Здравствуйте, 5.März, Вы писали:

5M>Для меня классикой уже стало наблюдать, как русские программисты выходят из тайги, отрицают все источники и авторитеты, и делают по-своему просто чтобы почувствовать себя чуть умнее, чем на самом деле. Откуда у нас столько одаренных людей берется, которые лучше знают что нужно дизайну языка, чем дизайнеры языка, ума не приложу


Страуструп создатель, а не дизайнер, дизайнер это коммитет. Точно так же, как Java сейчас разрабатывает Оракл, а не Гослинг. Авторитеты в инженерном деле это идолопоклонничество. А людям из тайги своё мнение не положено, да?

5M>Он не учит вас жизни, а приводит аргументы, что знаковые были бы для языка лучше. Есть контраргументы — высказывайте... Или в универе больше не учат, что обсуждение личности человека не является опровержением его аргументов? Почему я в англоязычных дискуссиях подобного невежества не наблюдаю?


Потому что все нетоксичные, предельно вежливые и прочее, так заведено. Я видел обсуждения внутренних групп FAANG касательно всяких священных войн, и С++ в то числе, так там яд разве что через монитор не брызгал, но внешне, особенно для ex-USSR населения, всё выглядело чинно-благородно. А самое непрятное в таких обсуждениях то, что очень быстро от фактов и логических умозаключений переходят к "the results of most computations are signed" (слова Страуструпа), то есть полностью субъективному мнению, а мнение это имеет очень большой вес. Вот и приходят в выводу "почему-бы не прислушаться к словам мэтра, он же велик". А код при этом сопровождают простые инженеры.

5M>В дотнете и тысяче других более-менее новых языков тоже все размеры и индексы знаковые, угадайте почему, вы бы лучше учились чем умничать.


Я где-то писал, что индексы должны быть беззнаковые?
Re[7]: Коды ошибок и отрицательные числа
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 01.02.22 08:04
Оценка: +1
Здравствуйте, Don Reba, Вы писали:

M>>>Поэтому надо просто писать

M>>>
M>>>for(auto i=0u; i!=v.size(); ++i)
M>>>


N>>А теперь повторите это для прохождения по элементам в порядке убывания индексов.


DR>
DR>for (auto i = v.size(); i --> 0;)
DR>


Да, знаменитый приём (и я его рядом упоминал). Но уже с хаком в виде постинкремента, и конструкция цикла тут совсем другая, и безусловный переход из 0 в (size_t)-1 это некрасиво и в общем случае непереносимо. Автоматически до него ~99% пишущих не додумаются, это надо видеть. Вместо него, скорее всего, будет сделан цикл с постпроверкой.
Итого — совсем не эквивалент.
Re[5]: Коды ошибок и отрицательные числа
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 01.02.22 08:17
Оценка:
Здравствуйте, cppguard, Вы писали:

5M>>Для меня классикой уже стало наблюдать, как русские программисты выходят из тайги, отрицают все источники и авторитеты, и делают по-своему просто чтобы почувствовать себя чуть умнее, чем на самом деле. Откуда у нас столько одаренных людей берется, которые лучше знают что нужно дизайну языка, чем дизайнеры языка, ума не приложу


C>Страуструп создатель, а не дизайнер, дизайнер это коммитет.


Создатель, главный разработчик в течение многих лет (пока не пришлось действительно всё переложить на комитет), и один из дизайнеров (дизайнеры — было во множественном числе).
Разумеется, это само по себе не признак безусловной правоты, но, в отличие от любого из нас, кто видит от силы 10% языка, люди в комитете видят все варианты применения (вплоть до самых извращённых), получают массу сведений о проблемах, до которых крайне сложно самому додуматься, и так далее.

А ещё авторы языковых средств при реализации, просто от того, что они пишут компилятор, натыкаются на массу вопросов, как решить конкретный момент, и за счёт этого понимают язык сильно лучше того, кто на нём пишет.

C> Точно так же, как Java сейчас разрабатывает Оракл, а не Гослинг. Авторитеты в инженерном деле это идолопоклонничество. А людям из тайги своё мнение не положено, да?


Люди из тайги, повторю мысль, видят только тайгу. Человек из тайги может думать, что все едят оленей и кедровые орехи.

5M>>Он не учит вас жизни, а приводит аргументы, что знаковые были бы для языка лучше. Есть контраргументы — высказывайте... Или в универе больше не учат, что обсуждение личности человека не является опровержением его аргументов? Почему я в англоязычных дискуссиях подобного невежества не наблюдаю?


C>Потому что все нетоксичные, предельно вежливые и прочее, так заведено. Я видел обсуждения внутренних групп FAANG касательно всяких священных войн, и С++ в то числе, так там яд разве что через монитор не брызгал, но внешне, особенно для ex-USSR населения, всё выглядело чинно-благородно.


Психологический факт, что если (пусть даже насильно заставленные) люди высказываются в пределах корректности, это позволяет лучше обдумать позицию, и в итоге смягчить её, избавив от бессмысленного радикализма. Это не на 100% полезно, но конструктивная часть "нетоксичности" именно в этом.

C> А самое непрятное в таких обсуждениях то, что очень быстро от фактов и логических умозаключений переходят к "the results of most computations are signed" (слова Страуструпа), то есть полностью субъективному мнению,


Может, оно таки объективно? (см. выше)

C> а мнение это имеет очень большой вес. Вот и приходят в выводу "почему-бы не прислушаться к словам мэтра, он же велик". А код при этом сопровождают простые инженеры.


5M>>В дотнете и тысяче других более-менее новых языков тоже все размеры и индексы знаковые, угадайте почему, вы бы лучше учились чем умничать.


C>Я где-то писал, что индексы должны быть беззнаковые?


Тогда против чего вы возражаете данным сообщением? Страуструп высказывался в первую очередь про индексы и размеры.
Re[12]: Коды ошибок и отрицательные числа
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 01.02.22 08:25
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

N>>В любом случае, повторюсь, я поддерживаю, что в общем и целом со знаковыми удобнее хотя бы тем, что не надо следить за возможными проблемами перехода 0 -> 0-1. Вопрос был в конкретном примере.


АТ>Тема умения грамотно работать возле левого края интервалов вида [a, b) в условиях, когда выход за левый край интервала приводит к неожиданному, нежелательному или неопределенному поведению (ваши "проблемы перехода 0 -> 0-1"), является фундаментальным нативным свойством языков С и С++, да и вообще программирования в целом. Она распространяется не только на беззнаковые типы, но и на указательную арифметику, на итераторы, на потоки и на массу других концепций боле высокого уровня.


АТ>Поэтому попытки устранить эту "проблему" в области индексирования массивов — это локальное решение, которое ничего не поменяет в общем. Следить за "возможными проблемами перехода 0 -> 0-1" в более обобщенно понимании вам все равно придется ничуть не меньше чем ранее. Ценность "неудобной" беззнаковой арифметики в индексации заключается в том числе в том, что она с ранних пелёнок оповещает подрастающее поколение о существовании этой темы, с которой им в дальнейшем придется сталкиваться постоянно (независимо от того, какие типы они будут фактически использовать для индексации). Переход на знаковые типы лишь замедлит процесс формирования ценных идиом.


Интересные доводы, я сохранил. Но по отношению к ним есть принципиальные проблемы: в первую очередь этот как раз состоявшийся по факту "алиасинг" modulo-типа не вполне корректным словом unsigned (о чём тут вспоминал коллега σ). "Формирование ценных идиом" должно начинаться с этого (и объяснения, в чём авторы стандарта тут подложили каку). А тут уже вопрос обучения: я пока что ни в одном популярном учебнике по C или C++ не видел, чтобы в это явно ткнули носом (а для большинства таки надо ткнуть, я не был исключением).

Ну и в итоге это имеет ценность только до тех пор, пока сохраняется совместимость с данной... мнэээ... особенностью эхотага. Учить тому, что не надо идти, например, от begin() на шаг назад, это универсально.
Re[4]: Коды ошибок и отрицательные числа
От: sergii.p  
Дата: 01.02.22 09:55
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Здравствуйте, netch80, Вы писали:


TB>Я пишу на Расте и проблема никуда не делась.

TB>Обычный заголовок

TB>
TB>for i in 0 .. v.len()-1
TB>


уж что-что, но это не обычный заголовок. В данном случае .. в терминах математики означает [0; v.len()-1). Последний элемент не включается. То есть вы ещё один элемент откусили от вектора.

так ошибки нет вовсе:
for i in 0 .. v.len()


конечно можно постараться и таки выстрелить в ногу:
for i in 0 ..= v.len() - 1


А такой код уже работает:
for i in 0 ..= v.len() as i8 - 1


Вообще циклы добавили в раст для выявления профнепригодности. Итераторы же есть.
Re[6]: Коды ошибок и отрицательные числа
От: cppguard  
Дата: 01.02.22 10:06
Оценка:
Здравствуйте, netch80, Вы писали:

N>Разумеется, это само по себе не признак безусловной правоты, но, в отличие от любого из нас, кто видит от силы 10% языка, люди в комитете видят все варианты применения (вплоть до самых извращённых), получают массу сведений о проблемах, до которых крайне сложно самому додуматься, и так далее.


Есть разница в том, чтобы видеть различные примеры использования языка и понимать на практике сильные и слабые стороны.

N>Люди из тайги, повторю мысль, видят только тайгу. Человек из тайги может думать, что все едят оленей и кедровые орехи.


А люди из Сан-Франциско — только бомжей и ссанину, и что? Я тут вашу мысль не понял. Мысль предыдущего оратора понятна — "куда в со своим свиным рылом в калашный ряд, ещё иметь своё мнение посмели". И в предложении "дед учит жизни" нет ничего токсичного. Я даже на личности не переходил. Страуструп действительно дед, а тон его статьи вкупе с тем, что никаких примеров из реальной жизни (рабочий код, открытые проекты) он не привёл, позволяет использоваться оборот "учить жизни", который оскорбительным в целом и не является.

N>Может, оно таки объективно? (см. выше)


Как могут быть объективными слова "the most of computations" без приведения статистики? Или Страуструп у нас уже Чак Норрис и видел весь код на свете, два раза? Аналогично можно сказать "the most of integer additions overflow, so let's make it long long by default".

N>Тогда против чего вы возражаете данным сообщением? Страуструп высказывался в первую очередь про индексы и размеры.


Против его аргументов. И не возражаю, а просто высказал своё мнение насчёт ценности статьи. Но знал бы, что комментарий породит столько флуда, не стал бы писать, чтобы не увеличивать мировую энтропию =) Предлагаю на этом закончить обсуждение в этой ветке. Я получил комментарии, было очень интересно узнать новое, есть над чем подумать.
Re[4]: Коды ошибок и отрицательные числа
От: B0FEE664  
Дата: 01.02.22 10:18
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>
TB>for i in 0 .. v.len()-1
TB>

TB>Является валидным полностью рабочим кодом для знакового индекса. Но в Расте этот заголовок падает на пустом векторе. В С++ я бы получил ассерт при обращении по инвалидному индексу.

Я, не зная языка rust, а просто исходя из записи ожидаю, что при пустом v индекс i будет принимать значения [0, -1). Если предположить, что для диапазона [0, -2) i будет принимать значения {0, -1}, то для диапазона [0, -1) индекс i будет принимать значение {0}.

TB>Внимание вопрос: а какая мне нахрен разница, что программа упала не с дурацким старомодным отсталым ассертом, а с красивой модной прогрессивной молодёжной паникой?

TB>Так что нет, индексы и размеры должны быть знаковыми и только знаковыми.
Мне не понятно, причём тут знаковость. В rust нельзя писать так: for i in 0 .. -8 ?
И каждый день — без права на ошибку...
Re[5]: Коды ошибок и отрицательные числа
От: sergii.p  
Дата: 01.02.22 11:49
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Мне не понятно, причём тут знаковость. В rust нельзя писать так: for i in 0 .. -8 ?


можно, но в примере выше v.len() — 1 преобразуется не к -1, а к maxint (это в релизе, в дебаге паника будет раньше)
Посмотрим на такой (безумный) код:
let v: Vec<u8> = Vec::new();
let sum: usize = (0..v.len() - 1).sum();


если бы len было ssize получили бы
(0..-1).sum() // 0


а так получим суммирование всех элементов до maxint с переполнением и прочими прелестями.
Re[5]: Коды ошибок и отрицательные числа
От: kov_serg Россия  
Дата: 01.02.22 12:00
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Да, так и делается сейчас, но я этого не понимаю. Ведь куда как легче проверять код типа

TB>
TB>unsgined nread = my_read(...)
TB>if (nread >= 0)
TB>    my_copy(src, dst, nread)
TB>throw io_error(nread);
TB>

Тролите
Re[7]: Коды ошибок и отрицательные числа
От: Sinclair Россия http://corp.ingrammicro.com/Solutions/Cloud.aspx
Дата: 01.02.22 12:36
Оценка:
Здравствуйте, cppguard, Вы писали:
C>Как могут быть объективными слова "the most of computations" без приведения статистики? Или Страуструп у нас уже Чак Норрис и видел весь код на свете, два раза? Аналогично можно сказать "the most of integer additions overflow, so let's make it long long by default".
Страуструп имел в виду, что первое же вычитание делает вычисление знаковым. Ну, потому, что очень мало кто ожидает при вычислении (5 — 8) получить 18446744073709551613, а не -3.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
http://rsdn.org/File/5743/rsdnaddict.GIF
Re[6]: Коды ошибок и отрицательные числа
От: B0FEE664  
Дата: 01.02.22 14:09
Оценка:
Здравствуйте, netch80, Вы писали:

M>>Поэтому надо просто писать

M>>
M>>for(auto i=0u; i!=v.size(); ++i)
M>>


N>А теперь повторите это для прохождения по элементам в порядке убывания индексов.


for(auto i = v.size()-1; i != -1; --i)
...


Обоснование:

7.4 Usual arithmetic conversions
Many binary operators that expect operands of arithmetic or enumeration type cause conversions and yield
result types in a similar way.
...
— Otherwise, the integral promotions (7.3.6) shall be performed on both operands.56 Then the following rules shall be applied to the promoted operands:
...
(1.5.3) — Otherwise, if the operand that has unsigned integer type has rank greater than or equal to the
rank of the type of the other operand, the operand with signed integer type shall be converted to
the type of the operand with unsigned integer type.

Так что -1 конвертируется в unsigned integer type.

Согласно 6.8.1 Fundamental types

An unsigned integer type has the same width N as the corresponding signed integer type. The range of representable values for the unsigned type is 0 to 2N − 1 (inclusive); arithmetic for the unsigned type is performed modulo 2N.


Согласно правилам модульной арифметики

Given an integer n > 1, called a modulus, two integers a and b are said to be congruent modulo n, if n is a divisor of their difference (i.e., if there is an integer k such that a − b = kn).

Для нас n = 2N. Математически число -1 сравнимо по модулю с числом (2N − 1), так как 2N − 1 — (-1) = 2N, а 2N делится на 2N без остатка. Следовательно -1 будет конвертировано в 2N−1 и цикл отработает как надо.
И каждый день — без права на ошибку...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.