может требовать (согласно утверждённым методикам) написания дополнительного теста в котором my_read возвращает значение меньше -1. А если my_read никогда не возвращает такого, то тест никогда не будет признан пройденным => код не валиден, так как не протестирован.
Здравствуйте, B0FEE664, Вы писали:
BFE>может требовать (согласно утверждённым методикам) написания дополнительного теста в котором my_read возвращает значение меньше -1. А если my_read никогда не возвращает такого, то тест никогда не будет признан пройденным => код не валиден, так как не протестирован.
А что мешает использовать в тесте заглушку, которая вернёт нужное значение?
Здравствуйте, cppguard, Вы писали:
BFE>>может требовать (согласно утверждённым методикам) написания дополнительного теста в котором my_read возвращает значение меньше -1. А если my_read никогда не возвращает такого, то тест никогда не будет признан пройденным => код не валиден, так как не протестирован.
C>А что мешает использовать в тесте заглушку, которая вернёт нужное значение?
Ничего: нужно написать ещё один специальный тест, описать что он тестирует, добавить в список исполняемых тестов... Затягивание сроков может быть выгодно, но приветствуется не всегда.
Здравствуйте, kov_serg, Вы писали:
_>Всё очень просто 0-нет ошибки, не 0 — есть ошибка и всё.
Ну как так? А количество прочитанных байт? А результат нетривиальной успешной операции?
Здравствуйте, 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
Здравствуйте, 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.
Здравствуйте, 5.März, Вы писали:
5M>Для меня классикой уже стало наблюдать, как русские программисты выходят из тайги, отрицают все источники и авторитеты, и делают по-своему просто чтобы почувствовать себя чуть умнее, чем на самом деле. Откуда у нас столько одаренных людей берется, которые лучше знают что нужно дизайну языка, чем дизайнеры языка, ума не приложу
Страуструп создатель, а не дизайнер, дизайнер это коммитет. Точно так же, как Java сейчас разрабатывает Оракл, а не Гослинг. Авторитеты в инженерном деле это идолопоклонничество. А людям из тайги своё мнение не положено, да?
5M>Он не учит вас жизни, а приводит аргументы, что знаковые были бы для языка лучше. Есть контраргументы — высказывайте... Или в универе больше не учат, что обсуждение личности человека не является опровержением его аргументов? Почему я в англоязычных дискуссиях подобного невежества не наблюдаю?
Потому что все нетоксичные, предельно вежливые и прочее, так заведено. Я видел обсуждения внутренних групп FAANG касательно всяких священных войн, и С++ в то числе, так там яд разве что через монитор не брызгал, но внешне, особенно для ex-USSR населения, всё выглядело чинно-благородно. А самое непрятное в таких обсуждениях то, что очень быстро от фактов и логических умозаключений переходят к "the results of most computations are signed" (слова Страуструпа), то есть полностью субъективному мнению, а мнение это имеет очень большой вес. Вот и приходят в выводу "почему-бы не прислушаться к словам мэтра, он же велик". А код при этом сопровождают простые инженеры.
5M>В дотнете и тысяче других более-менее новых языков тоже все размеры и индексы знаковые, угадайте почему, вы бы лучше учились чем умничать.
Я где-то писал, что индексы должны быть беззнаковые?
Здравствуйте, 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% пишущих не додумаются, это надо видеть. Вместо него, скорее всего, будет сделан цикл с постпроверкой.
Итого — совсем не эквивалент.
Здравствуйте, cppguard, Вы писали:
5M>>Для меня классикой уже стало наблюдать, как русские программисты выходят из тайги, отрицают все источники и авторитеты, и делают по-своему просто чтобы почувствовать себя чуть умнее, чем на самом деле. Откуда у нас столько одаренных людей берется, которые лучше знают что нужно дизайну языка, чем дизайнеры языка, ума не приложу
C>Страуструп создатель, а не дизайнер, дизайнер это коммитет.
Создатель, главный разработчик в течение многих лет (пока не пришлось действительно всё переложить на комитет), и один из дизайнеров (дизайнеры — было во множественном числе).
Разумеется, это само по себе не признак безусловной правоты, но, в отличие от любого из нас, кто видит от силы 10% языка, люди в комитете видят все варианты применения (вплоть до самых извращённых), получают массу сведений о проблемах, до которых крайне сложно самому додуматься, и так далее.
А ещё авторы языковых средств при реализации, просто от того, что они пишут компилятор, натыкаются на массу вопросов, как решить конкретный момент, и за счёт этого понимают язык сильно лучше того, кто на нём пишет.
C> Точно так же, как Java сейчас разрабатывает Оракл, а не Гослинг. Авторитеты в инженерном деле это идолопоклонничество. А людям из тайги своё мнение не положено, да?
Люди из тайги, повторю мысль, видят только тайгу. Человек из тайги может думать, что все едят оленей и кедровые орехи.
5M>>Он не учит вас жизни, а приводит аргументы, что знаковые были бы для языка лучше. Есть контраргументы — высказывайте... Или в универе больше не учат, что обсуждение личности человека не является опровержением его аргументов? Почему я в англоязычных дискуссиях подобного невежества не наблюдаю?
C>Потому что все нетоксичные, предельно вежливые и прочее, так заведено. Я видел обсуждения внутренних групп FAANG касательно всяких священных войн, и С++ в то числе, так там яд разве что через монитор не брызгал, но внешне, особенно для ex-USSR населения, всё выглядело чинно-благородно.
Психологический факт, что если (пусть даже насильно заставленные) люди высказываются в пределах корректности, это позволяет лучше обдумать позицию, и в итоге смягчить её, избавив от бессмысленного радикализма. Это не на 100% полезно, но конструктивная часть "нетоксичности" именно в этом.
C> А самое непрятное в таких обсуждениях то, что очень быстро от фактов и логических умозаключений переходят к "the results of most computations are signed" (слова Страуструпа), то есть полностью субъективному мнению,
Может, оно таки объективно? (см. выше)
C> а мнение это имеет очень большой вес. Вот и приходят в выводу "почему-бы не прислушаться к словам мэтра, он же велик". А код при этом сопровождают простые инженеры.
5M>>В дотнете и тысяче других более-менее новых языков тоже все размеры и индексы знаковые, угадайте почему, вы бы лучше учились чем умничать.
C>Я где-то писал, что индексы должны быть беззнаковые?
Тогда против чего вы возражаете данным сообщением? Страуструп высказывался в первую очередь про индексы и размеры.
Здравствуйте, Андрей Тарасевич, Вы писали:
N>>В любом случае, повторюсь, я поддерживаю, что в общем и целом со знаковыми удобнее хотя бы тем, что не надо следить за возможными проблемами перехода 0 -> 0-1. Вопрос был в конкретном примере.
АТ>Тема умения грамотно работать возле левого края интервалов вида [a, b) в условиях, когда выход за левый край интервала приводит к неожиданному, нежелательному или неопределенному поведению (ваши "проблемы перехода 0 -> 0-1"), является фундаментальным нативным свойством языков С и С++, да и вообще программирования в целом. Она распространяется не только на беззнаковые типы, но и на указательную арифметику, на итераторы, на потоки и на массу других концепций боле высокого уровня.
АТ>Поэтому попытки устранить эту "проблему" в области индексирования массивов — это локальное решение, которое ничего не поменяет в общем. Следить за "возможными проблемами перехода 0 -> 0-1" в более обобщенно понимании вам все равно придется ничуть не меньше чем ранее. Ценность "неудобной" беззнаковой арифметики в индексации заключается в том числе в том, что она с ранних пелёнок оповещает подрастающее поколение о существовании этой темы, с которой им в дальнейшем придется сталкиваться постоянно (независимо от того, какие типы они будут фактически использовать для индексации). Переход на знаковые типы лишь замедлит процесс формирования ценных идиом.
Интересные доводы, я сохранил. Но по отношению к ним есть принципиальные проблемы: в первую очередь этот как раз состоявшийся по факту "алиасинг" modulo-типа не вполне корректным словом unsigned (о чём тут вспоминал коллега σ). "Формирование ценных идиом" должно начинаться с этого (и объяснения, в чём авторы стандарта тут подложили каку). А тут уже вопрос обучения: я пока что ни в одном популярном учебнике по C или C++ не видел, чтобы в это явно ткнули носом (а для большинства таки надо ткнуть, я не был исключением).
Ну и в итоге это имеет ценность только до тех пор, пока сохраняется совместимость с данной... мнэээ... особенностью эхотага. Учить тому, что не надо идти, например, от begin() на шаг назад, это универсально.
Здравствуйте, 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
Вообще циклы добавили в раст для выявления профнепригодности. Итераторы же есть.
Здравствуйте, 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>Тогда против чего вы возражаете данным сообщением? Страуструп высказывался в первую очередь про индексы и размеры.
Против его аргументов. И не возражаю, а просто высказал своё мнение насчёт ценности статьи. Но знал бы, что комментарий породит столько флуда, не стал бы писать, чтобы не увеличивать мировую энтропию =) Предлагаю на этом закончить обсуждение в этой ветке. Я получил комментарии, было очень интересно узнать новое, есть над чем подумать.
TB>Является валидным полностью рабочим кодом для знакового индекса. Но в Расте этот заголовок падает на пустом векторе. В С++ я бы получил ассерт при обращении по инвалидному индексу.
Я, не зная языка rust, а просто исходя из записи ожидаю, что при пустом v индекс i будет принимать значения [0, -1). Если предположить, что для диапазона [0, -2) i будет принимать значения {0, -1}, то для диапазона [0, -1) индекс i будет принимать значение {0}.
TB>Внимание вопрос: а какая мне нахрен разница, что программа упала не с дурацким старомодным отсталым ассертом, а с красивой модной прогрессивной молодёжной паникой? TB>Так что нет, индексы и размеры должны быть знаковыми и только знаковыми.
Мне не понятно, причём тут знаковость. В rust нельзя писать так: for i in 0 .. -8 ?
Здравствуйте, 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.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, 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 и цикл отработает как надо.