Условия не корректны или ошибка последовательности запроса ошибка программирования

  • Назад
  • 1
  • 2
  • 3
  • 4
  • 5
  • Вперёд
  • Страница 4 из 5  

Рекомендованные сообщения

У меня не бизнес для своей авто пользуюсь в год один раз

Тогда ищи альтернативу или обратись раз в год к мастеру.

Рой ( автор проги ) так же тратит на то время и занимается много с прогами . Так что за работу так же хотел бы получить денег. Ты то сам не будешь бесплатно всеми помогать))) Уважать надо чужой труд!

И заполнять профиль в соответствии с правилами форума.


Изменено 4 июля 2014 пользователем Klassikovod

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

шьет 7.9.7+ по диагностке без пайки, правильно ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А отломанная версия прошьет м 10.3?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это уже лень халяву открыть и посмотреть? Ребята! Зажрались уже….

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я задал простой вопрос. Эксперементировать при клиенте не хочется

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ПЫтаюсь прошить Me7.9.7 по диагностике, пишет следующее: «Условия не корректны или ошибка последовательности запроса. Ошибка программирования.» Что за нафиг? Уже за прошивку бабки отвалил. Идентификацию проходит, подключается без проблем, а заливать фиг там.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

По инструкции на этот блок залить можно и без перепайки, просто через диагностический кабель.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 Что за нафиг? Уже за прошивку бабки отвалил. Идентификацию проходит, подключается без проблем, а заливать фиг там.

Теперь придётся ещё бабок отвалить и за нормальный загрузчик :emot64: . Ну или дать тем, у кого он есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ПЫтаюсь прошить Me7.9.7 по диагностике, пишет следующее: «Условия не корректны или ошибка последовательности запроса. Ошибка программирования.» Что за нафиг? Уже за прошивку бабки отвалил. Идентификацию проходит, подключается без проблем, а заливать фиг там.

прочти хелп там все рассказано,прога работает без проблем 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да читал я хелп. Подключаю кабель к разъему и ноуту. Включаю прогу, выбираю блок и порт. Включаю зажигание, жду секунд 15-20 и подключаюсь. Идентификация идет, ошибки просматривает, выбираю прошивку — ошибка вышеупомянутая. Даже если сразу пытаюсь залить все равно ошибка, следом делаю идентификацию она проходит. Что не так делаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Читал про различие блоков м7.9.7 и ме7.9.7 ? Почитай хелп по чиплодырю .

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вчера Киа спектра Бош м7.9.7 по диагностике иденты отдал, флеш потер, а запись завершилось ошибкой, блин не помню какой))), разобрал в бсл записал без проблем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Причём тут отличия м и ме? Если заливаться тупо через кабель должно без всяких разрешений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

F

Ребят подскажите пожалуйста смогу ли я прошить этой программой м73 автел закрытый

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

F

Ребят подскажите пожалуйста смогу ли я прошить этой программой м73 автел закрытый

Да!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

За всех- пжалыста!

м797 взьмёт-да!

ме 797 возьмёт-да!

м797+                 -да!

ме797+                 -да!

м797-                    -да!

ме797-                   -да!

я7.2+                   -да!

я7.2-                     -да!

м73+                      -да! нет такого                -да!

и всем колллллллективное спасибо — да!

парни вы чё?????

рулетка        — да!!!!

Вы извените,но достало!!!!


Изменено 9 октября 2015 пользователем vladgl


  • Like


    1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • Назад
  • 1
  • 2
  • 3
  • 4
  • 5
  • Вперёд
  • Страница 4 из 5  

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Существует две фундаментальные стратегии: обработка исправимых ошибок (исключения, коды возврата по ошибке, функции-обработчики) и неисправимых (assert(), abort()). В каких случаях какую стратегию лучше использовать?

Виды ошибок

Ошибки возникают по разным причинам: пользователь ввёл странные данные, ОС не может дать вам обработчика файла или код разыменовывает (dereferences) nullptr. Каждая из описанных ошибок требует к себе отдельного подхода. По причинам ошибки делятся на три основные категории:

  • Пользовательские ошибки: здесь под пользователем подразумевается человек, сидящий перед компьютером и действительно «использующий» программу, а не какой-то программист, дёргающий ваш API. Такие ошибки возникают тогда, когда пользователь делает что-то неправильно.
  • Системные ошибки появляются, когда ОС не может выполнить ваш запрос. Иными словами, причина системных ошибок — сбой вызова системного API. Некоторые возникают потому, что программист передал системному вызову плохие параметры, так что это скорее программистская ошибка, а не системная.
  • Программистские ошибки случаются, когда программист не учитывает предварительные условия API или языка программирования. Если API требует, чтобы вы не вызывали foo() с 0 в качестве первого параметра, а вы это сделали, — виноват программист. Если пользователь ввёл 0, который был передан foo(), а программист не написал проверку вводимых данных, то это опять же его вина.

Каждая из описанных категорий ошибок требует особого подхода к их обработке.

Пользовательские ошибки

Сделаю очень громкое заявление: такие ошибки — на самом деле не ошибки.

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

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

Конечно, такое не всегда возможно. Иногда проверять вводимые данные слишком дорого, иногда это не позволяет сделать архитектура кода или разделение ответственности. Но в таких случаях ошибки должны обрабатываться однозначно как исправимые. Иначе, допустим, ваша офисная программа будет падать из-за того, что вы нажали backspace в пустом документе, или ваша игра станет вылетать при попытке выстрелить из разряженного оружия.

Если в качестве стратегии обработки исправимых ошибок вы предпочитаете исключения, то будьте осторожны: исключения предназначены только для исключительных ситуаций, к которым не относится большинство случаев ввода пользователями неверных данных. По сути, это даже норма, по мнению многих приложений. Используйте исключения только тогда, когда пользовательские ошибки обнаруживаются в глубине стека вызовов, вероятно, внешнего кода, когда они возникают редко или проявляются очень жёстко. В противном случае лучше сообщать об ошибках с помощью кодов возврата.

Системные ошибки

Обычно системные ошибки нельзя предсказать. Более того, они недетерминистские и могут возникать в программах, которые до этого работали без нареканий. В отличие от пользовательских ошибок, зависящих исключительно от вводимых данных, системные ошибки — настоящие ошибки.

Но как их обрабатывать, как исправимые или неисправимые?

Это зависит от обстоятельств.

Многие считают, что ошибка нехватки памяти — неисправимая. Зачастую не хватает памяти даже для обработки этой ошибки! И тогда приходится просто сразу же прерывать выполнение.

Но падение программы из-за того, что ОС не может выделить сокет, — это не слишком дружелюбное поведение. Так что лучше бросить исключение и позволить catch аккуратно закрыть программу.

Но бросание исключения — не всегда правильный выбор.

Кто-то даже скажет, что он всегда неправильный.

Если вы хотите повторить операцию после её сбоя, то обёртывание функции в try-catch в цикле — медленное решение. Правильный выбор — возврат кода ошибки и цикличное исполнение, пока не будет возвращено правильное значение.

Если вы создаёте вызов API только для себя, то просто выберите подходящий для своей ситуации путь и следуйте ему. Но если вы пишете библиотеку, то не знаете, чего хотят пользователи. Дальше мы разберём подходящую стратегию для этого случая. Для потенциально неисправимых ошибок подойдёт «обработчик ошибок», а при других ошибках необходимо предоставить два варианта развития событий.

Обратите внимание, что не следует использовать подтверждения (assertions), включающиеся только в режиме отладки. Ведь системные ошибки могут возникать и в релизной сборке!

Программистские ошибки

Это худший вид ошибок. Для их обработки я стараюсь сделать так, чтобы мои ошибки были связаны только с вызовами функций, то есть с плохими параметрами. Прочие типы программистских ошибок могут быть пойманы только в runtime, с помощью отладочных макросов (assertion macros), раскиданных по коду.

При работе с плохими параметрами есть две стратегии: дать им определённое или неопределённое поведение.

Если исходное требование для функции — запрет на передачу ей плохих параметров, то, если их передать, это считается неопределённым поведением и должно проверяться не самой функцией, а оператором вызова (caller). Функция должна делать только отладочное подтверждение (debug assertion).

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

В качестве примера рассмотрим получающие функции (accessor functions) std::vector<T>: в спецификации на operator[] говорится, что индекс должен быть в пределах валидного диапазона, при этом at() сообщает нам, что функция кинет исключение, если индекс не попадает в диапазон. Более того, большинство реализаций стандартных библиотек обеспечивают режим отладки, в котором проверяется индекс operator[], но технически это неопределённое поведение, оно не обязано проверяться.

Примечание: необязательно бросать исключение, чтобы получилось определённое поведение. Пока это не упомянуто в исходных условиях для функции, это считается определённым. Всё, что прописано в исходных условиях, не должно проверяться функцией, это неопределённое поведение.

Когда нужно проверять только с помощью отладочных подтверждений, а когда — постоянно?

К сожалению, однозначного рецепта нет, решение зависит от конкретной ситуации. У меня есть лишь одно проверенное правило, которому я следую при разработке API. Оно основано на наблюдении, что проверять исходные условия должен вызывающий, а не вызываемый. А значит, условие должно быть «проверяемым» для вызывающего. Также условие «проверяемое», если можно легко выполнить операцию, при которой значение параметра всегда будет правильным. Если для параметра это возможно, то это получается исходное условие, а значит, проверяется только посредством отладочного подтверждения (а если слишком дорого, то вообще не проверяется).

Но конечное решение зависит от многих других факторов, так что очень трудно дать какой-то общий совет. По умолчанию я стараюсь свести к неопределённому поведению и использованию только подтверждений. Иногда бывает целесообразно обеспечить оба варианта, как это делает стандартная библиотека с operator[] и at().

Хотя в ряде случаев это может быть ошибкой.

Об иерархии std::exception

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

Я предлагаю наследовать только от одного из этих четырёх классов:

  • std::bad_alloc: для сбоев выделения памяти.
  • std::runtime_error: для общих runtime-ошибок.
  • std::system_error (производное от std::runtime_error): для системных ошибок с кодами ошибок.
  • std::logic_error: для программистских ошибок с определённым поведением.

Обратите внимание, что в стандартной библиотеке разделяются логические (то есть программистские) и runtime-ошибки. Runtime-ошибки — более широкое определение, чем «системные». Оно описывает «ошибки, обнаруживаемые только при выполнении программы». Такая формулировка не слишком информативна. Лично я использую её для плохих параметров, которые не являются исключительно программистскими ошибками, а могут возникнуть и по вине пользователей. Но это можно определить лишь глубоко в стеке вызовов. Например, плохое форматирование комментариев в standardese приводит к исключению при парсинге, проистекающему из std::runtime_error. Позднее оно ловится на соответствующем уровне и фиксируется в логе. Но я не стал бы использовать этот класс иначе, как и std::logic_error.

Подведём итоги

Есть два пути обработки ошибок:

  • как исправимые: используются исключения или возвращаемые значения (в зависимости от ситуации/религии);
  • как неисправимые: ошибки журналируются, а программа прерывается.

Подтверждения — это особый вид стратегии обработки неисправимых ошибок, только в режиме отладки.

Есть три основных источника ошибок, каждый требует особого подхода:

  • Пользовательские ошибки не должны обрабатываться как ошибки на верхних уровнях программы. Всё, что вводит пользователь, должно проверяться соответствующим образом. Это может обрабатываться как ошибки только на нижних уровнях, которые не взаимодействуют с пользователями напрямую. Применяется стратегия обработки исправимых ошибок.
  • Системные ошибки могут обрабатываться в рамках любой из двух стратегий, в зависимости от типа и тяжести. Библиотеки должны работать как можно гибче.
  • Программистские ошибки, то есть плохие параметры, могут быть запрещены исходными условиями. В этом случае функция должна использовать только проверку с помощью отладочных подтверждений. Если же речь идёт о полностью определённом поведении, то функции следует предписанным образом сообщать об ошибке. Я стараюсь по умолчанию следовать сценарию с неопределённым поведением и определяю для функции проверку параметров лишь тогда, когда это слишком трудно сделать на стороне вызывающего.

Гибкие методики обработки ошибок в C++

Иногда что-то не работает. Пользователи вводят данные в недопустимом формате, файл не обнаруживается, сетевое соединение сбоит, в системе кончается память. Всё это ошибки, и их надо обрабатывать.

Это относительно легко сделать в высокоуровневых функциях. Вы точно знаете, почему что-то пошло не так, и можете обработать это соответствующим образом. Но в случае с низкоуровневыми функциями всё не так просто. Они не знают, что пошло не так, они знают лишь о самом факте сбоя и должны сообщить об этом тому, кто их вызвал.

В C++ есть два основных подхода: коды возврата ошибок и исключения. Сегодня широко распространено использование исключений. Но некоторые не могут / думают, что не могут / не хотят их использовать — по разным причинам.

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

Проблема

Я работаю над проектом foonathan/memory. Это решение предоставляет различные классы выделения памяти (allocator classes), так что в качестве примера рассмотрим структуру функции выделения.

Для простоты возьмём malloc(). Она возвращает указатель на выделяемую память. Если выделить память не получается, то возвращается nullptr, то есть NULL, то есть ошибочное значение.

У этого решения есть недостатки: вам нужно проверять каждый вызов malloc(). Если вы забудете это сделать, то выделите несуществующую память. Кроме того, по своей натуре коды ошибок транзитивны: если вызвать функцию, которая может вернуть код ошибки, и вы не можете его проигнорировать или обработать, то вы тоже должны вернуть код ошибки.

Это приводит нас к ситуации, когда чередуются нормальные и ошибочные ветви кода. Исключения в таком случае выглядят более подходящим решением. Благодаря им вы сможете обрабатывать ошибки только тогда, когда вам это нужно, а в противном случае — достаточно тихо передать их обратно вызывающему.

Это можно расценить как недостаток.

Но в подобных ситуациях исключения имеют также очень большое преимущество: функция выделения памяти либо возвращает валидную память, либо вообще ничего не возвращает. Это функция «всё или ничего», возвращаемое значение всегда будет валидным. Это полезное следствие согласно принципу Скотта Майера «Make interfaces hard to use incorrectly and easy to use correctly».

Учитывая вышесказанное, можно утверждать, что вам следует использовать исключения в качестве механизма обработки ошибок. Этого мнения придерживается большинство разработчиков на С++, включая и меня. Но проект, которым я занимаюсь, — это библиотека, предоставляющая средства выделения памяти, и предназначена она для приложений, работающих в реальном времени. Для большинства разработчиков подобных приложений (особенно для игроделов) само использование исключений — исключение.

Каламбур детектед.

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

Так что же делать?

Идеальное решение: возможность включать и отключать исключения по желанию. Но, учитывая природу исключений, нельзя просто менять их местами с кодами ошибок, поскольку у нас не будет внутреннего кода проверки на ошибки — весь внутренний код опирается на предположение о прозрачности исключений. И даже если бы внутри можно было использовать коды ошибок и преобразовывать их в исключения, это лишило бы нас большинства преимуществ последних.

К счастью, я могу определить, что вы делаете, когда обнаруживаете ошибку нехватки памяти: чаще всего вы журналируете это событие и прерываете программу, поскольку она не может корректно работать без памяти. В таких ситуациях исключения — просто способ передачи контроля другой части кода, которая журналирует и прерывает программу. Но есть старый и эффективный способ передачи контроля: указатель функции (function pointer), то есть функция-обработчик (handler function).

Если у вас включены исключения, то вы просто их бросаете. В противном случае вызываете функцию-обработчика и затем прерываете программу. Это предотвратит бесполезную работу функции-обработчика, та позволит программе продолжить выполняться в обычном режиме. Если не прервать, то произойдёт нарушение обязательного постусловия функции: всегда возвращать валидный указатель. Ведь на выполнении этого условия может быть построена работа другого кода, да и вообще это нормальное поведение.

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

Решение 1: обработчик исключений

Если вам нужно обработать ошибку в условиях, когда наиболее распространённым поведением будет «журналировать и прервать», то можно использовать обработчика исключений. Это такая функция-обработчик, которая вызывается вместо бросания объекта-исключения. Её довольно легко реализовать даже в уже существующем коде. Для этого нужно поместить управление обработкой в класс исключений и обернуть в макрос выражение throw.

Сначала дополним класс и добавим функции для настройки и, возможно, запрашивания функции-обработчика. Я предлагаю делать это так же, как стандартная библиотека обрабатывает std::new_handler:

class my_fatal_error
{
public:
    // тип обработчика, он должен брать те же параметры, что и конструктор,
    // чтобы у них была одинаковая информация
    using handler = void(*)( ... );

    // меняет функцию-обработчика
    handler set_handler(handler h);

    // возвращает текущего обработчика
    handler get_handler();

    ... // нормальное исключение
};

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

Если исключения включены, то для удаления обработчика можно использовать условное компилирование (conditional compilation). Если хотите, то также напишите обычный подмешанный класс (mixin class), дающий требуемую функциональность.

Конструктор исключений элегантен: он вызывает текущую функцию-обработчика, передавая ей требуемые аргументы из своих параметров. А затем комбинирует с последующим макросом throw:

If```cpp #if EXCEPTIONS #define THROW(Ex) throw (Ex) #else #define THROW(Ex) (Ex), std::abort() #endif
> Такой макрос throw также предоставляется [foonathan/compatiblity](https://github.com/foonathan/compatibility).

Можно использовать его и так:

```cpp
THROW(my_fatal_error(...))

Если у вас включена поддержка исключений, то будет создан и брошен объект-исключение, всё как обычно. Но если поддержка выключена, то объект-исключение всё равно будет создан, и — это важно — только после этого произойдёт вызов std::abort(). А поскольку конструктор вызывает функцию-обработчика, то он и работает, как требуется: вы получаете точку настройки для журналирования ошибки. Благодаря же вызову std::abort() после конструктора пользователь не может нарушить постусловие.

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

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

А если я хочу продолжить работу после бросания исключения?

Методика с обработчиком исключений не позволяет этого сделать в связи с постусловием кода. Как же тогда продолжить работу?

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

Извините, что говорю такие очевидные вещи, но ради полноты изложения я должен был об этом сказать.

Для примера снова возьмём функцию выделения памяти. В этом случае я использую такие функции:

void* try_malloc(..., int &error_code) noexcept;

void* malloc(...);

При сбое выделения памяти первая версия возвращает nullptr и устанавливает error_code в коде ошибки. Вторая версия не возвращает nullptr, зато бросает исключение. Обратите внимание, что в рамках первой версии очень легко реализовать вторую:

void* malloc(...)
{
    auto error_code = 0;
    auto res = try_malloc(..., error_code);
    if (!res)
        throw malloc_error(error_code);
    return res;
}

Не делайте этого в обратной последовательности, иначе вам придётся ловить исключение, а это дорого. Также это не даст нам скомпилировать код без включённой поддержки исключений. Если сделаете, как показано, то можете просто стереть другую перегрузку (overload) с помощью условного компилирования.

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

Решение 2: предоставить две перегрузки

Если недостаточно обработчика исключений, то нужно предоставить две перегрузки. Одна использует код возврата, а вторая бросает исключение.

Если рассматриваемая функция не имеет возвращаемого значения, то можете её использовать для кода ошибки. В противном случае вам придётся возвращать недопустимое значение для сигнализирования об ошибке — как nullptr в вышеприведённом примере, — а также установить выходной параметр для кода ошибки, если хотите предоставить вызывающему дополнительную информацию.

Пожалуйста, не используйте глобальную переменную errno или что-то типа GetLastError()!

Если возвращаемое значение не содержит недопустимое значение для обозначения сбоя, то по мере возможности используйте std::optional или что-то похожее.

Перегрузка исключения (exception overload) может — и должна — быть реализована в рамках версии с кодом ошибки, как это показано выше. Если компилируете без исключений, сотрите перегрузку с помощью условного компилирования.

std::system_error

Подобная система идеально подходит для работы с кодами ошибок в С++ 11.

Она возвращает непортируемый (non-portable) код ошибки std::error_code, то есть возвращаемый функцией операционной системы. С помощью сложной системы библиотечных средств и категорий ошибок вы можете добавить собственные коды ошибок, или портируемые std::error_condition. Для начала почитайте об этом здесь. Если нужно, то можете использовать в функции кода ошибки std::error_code. А для функции исключения есть подходящий класс исключения: std::system_error. Он берёт std::error_code и применяется для передачи этих ошибок в виде исключений.

Эту или подобную систему должны использовать все низкоуровневые функции, являющиеся закрытыми обёртками ОС-функций. Это хорошая — хотя и сложная — альтернатива службе кодов ошибок, предоставляемой операционной системой.

Да, и мне ещё нужно добавить подобное в функции виртуальной памяти. На сегодняшний день они не предоставляют коды ошибок.

std::expected

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

А глобальные переменные вообще не вариант!

В № 4109 предложено решение: std::expected. Это шаблон класса, который также хранит возвращаемое значение или код ошибки. В вышеприведённом примере он мог бы использоваться так:

std::expected<void*, std::error_code> try_malloc(...);

В случае успеха std::expected будет хранить не-null указатель памяти, а при сбое — std::error_code. Сейчас эта методика работает при любых возвращаемых значениях. Комбинация std::expected и функции исключения определённо допускает любые варианты использования.

Заключение

Если вы создаёте библиотеки, то иногда приходится обеспечивать максимальную гибкость использования. Под этим подразумевается и разнообразие средств обработки ошибок: иногда требуются коды возврата, иногда — исключения.

Одна из возможных стратегий — улаживание этих противоречий с помощью обработчика исключений. Просто удостоверьтесь, что когда нужно, то вызывается callback, а не бросается исключение. Это замена для критических ошибок, которая в любом случае будет журналироваться перед прерыванием работы программы. Как таковой этот способ не универсален, вы не можете переключаться в одной программе между двумя версиями. Это лишь обходное решение при отключённой поддержке исключений.

Более гибкий подход — просто предоставить две перегрузки, одну с исключениями, а вторую без. Это даст пользователям максимальную свободу, они смогут выбирать ту версию, что лучше подходит в их ситуации. Недостаток этого подхода: вам придётся больше потрудиться при создании библиотеки.

  • Ответы
    12.8k
  • Создано
    15 г
  • Последний ответ
    2 дн

Лучшие авторы в этой теме

  • Roy

    966

  • Rakso

    369

  • Olegas 19

    242

  • Савар

    226

Лучшие авторы в этой теме

  • Roy

    Roy
    966 публикаций

  • Rakso

    Rakso
    369 публикаций

  • Olegas 19

    Olegas 19
    242 публикации

  • Савар

    Савар
    226 публикаций

Опубликованные изображения

marabu

Частый гость

albertt

Старик

max210876

Мастер

Rakso

Крестный папа

hash

Мудрый Мастер

доктор

Мудрый Мастер

vazz

Старик

marabu

Частый гость

strem

Крестный папа

strem

Крестный папа

kseno1

Крестный папа

Roy

Крестный папа

Denis_III

Старик

Rakso

Крестный папа

Roy

Крестный папа

msa96

Крестный папа

Roy

Крестный папа

msa96

Крестный папа

Rakso

Крестный папа

Roy

Крестный папа

Roy

Крестный папа

max210876

Мастер

Rakso

Крестный папа

игорь к.

посетитель форума

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже.

Если у вас есть аккаунт, войдите в него для написания от своего имени.

auto-mat [ТопикСтартер]

Возраст: 46 лет

Перейти

Перейти к сообщениям

ТопикCтартер

|
Сообщения автора
Награда за ответ
|по убыванию
|Режим чтения


Для просмотра нужна авторизация!

Для просмотра Вам необходимо авторизироваться.
Если Вы еще не зарегистрированы, перейдите по ссылке: Регистрация.

x

Вчера не смог без доработки Опендиагфлешером прошить Бош 7.9.7+. Доходит то до половины, то в начале то в конце и обрывается связь и выходит «ОШИБКА ПРОГРАММИРОВАНИЯ». Поменял 3 к-лайн адаптера на железный ком-порт и такая же ерунда. Затем подумал а не в ком-порте ли дело? Взял USB ВАГ-КОМ ккл-адаптер и 7 раз подряд прошил уже им. Результат ни одного сбоя. Затем снова подключаю от ком-порта, доходит примерно до середины и вновь «ОШИБКА ПРОГРАММИРОВАНИЯ». А я считал ошибочно физический ком-порт более стабильным. Скорее всего причиной аналогичного сбоя в соседней теме по М74К  https://avtomastera.net/forum.php?mod=viewthread&tid=951 является то-же самое

Последние посетители

  • wrrwrt

    2023-06-09

ИзбранноеИзбранное
ТрансляцииТрансляции
ЗакладкиЗакладки
ЗакладкиКоллекции
++3
-


Ответ

Реквизит
Жалоба

Mat

Возраст: 41 лет

Второй


Опубликовано 20-8-2015 08:56:27
|
Сообщения автора

Все от проводов зависит: экранирование, длина.

Прокомментировать
Свернуть


Ответ
+

Реквизит
Жалоба

auto-mat [ТопикСтартер]

Возраст: 46 лет

Третий


Опубликовано 20-8-2015 10:11:05
|
Сообщения автора

Подключил вот такой адаптер на чипе FTDI работает стабильно…

USB-OBD2-LITE-409-II-VAG-KKL.jpg

Войдите/Зарегистрируйтесь, чтобы увеличить

Прокомментировать
Свернуть


Ответ
+ 1
0

Реквизит
Жалоба

TNT

Четвертый


Опубликовано 26-10-2015 08:12:42
|
Сообщения автора

Тоже столкнулся с проблемой прошивки Bosch 7.9.7+. OpenBox не видел вообще никак этот блок (подключал «разрешение программирования» на 23 ногу вместо 43, а потом и вместе, химичил по-разному). К стати, при выборе прошивки от Ледокола B104CR(LR)02_v7.4.bin программа ругалась: «Ошибка открытия файла»  Пришлось перепаивать резистор и шить ChipLoader 1.97.7. Блок сразу вышел на связь. Записал это B104CR(LR)02_v7.4.bin.  ChipLoader не ругался на файл. Поставил блок, авто запустилось. Только в OpenDiag почему-то пишет ту же прошивку B103CU03, но красными буквами- «Не родное программное обеспечение». Теперь есть сомнения, точно ли прошивка тюн записалась. K-line такой как выше Vag KKL. До этого прошил блок М73 и М74. А с этим Bosch 7.9.7+ помучался.

Больше фотографий
Миниатюра
Полный размер

Фотографии открывыются, пожалуйста, подождите…

Прокомментировать
Свернуть


Ответ
+

Реквизит
Жалоба

auto-mat [ТопикСтартер]

Возраст: 46 лет

5#


Опубликовано 26-10-2015 09:44:23
|
Сообщения автора

добавил TNT в 26-10-2015 11:12
Тоже столкнулся с проблемой прошивки Bosch 7.9.7+. OpenBox не видел вообще никак этот блок (подключа

Чтобы Опенбокс работал с этими блоками без доработки нужно сначала подать 23-й пин на массу, затем подать все питания на эбу, ВНИМАНИЕ И ТОЛЬКО ПОСЛЕ ЭТОГО открывать программу и выбирать номер ком-порта, прошивку и т.д. После такого порядка Опенбокс как и Опендиаг-флешер шьет 7.9.7+ без доработки.

Прокомментировать
Свернуть


Ответ
+

Реквизит
Жалоба

demon8225

Возраст: 41 лет

6#


Опубликовано 31-10-2015 10:25:28
|
Сообщения автора

добавил TNT в 26-10-2015 08:12
Тоже столкнулся с проблемой прошивки Bosch 7.9.7+. OpenBox не видел вообще никак этот блок (подключа

Пытался писать декрипт скорее всего. Опен бокс их не пишет, поэтому и ругался. Чип лодырь берет.

Прокомментировать
Свернуть


Ответ
+

Реквизит
Жалоба

sanich

Возраст: 38 лет

7#


Опубликовано 19-12-2015 14:47:47
|
Сообщения автора

сегодня бош 797+ не пошел через бсл с 43 ногой ни OpenDiagFlasher_ом ни OpenBox_ом Bosh 7.9.7+ Ошибка программирования.???

Прокомментировать
Свернуть


Ответ
+

Реквизит
Жалоба

Ruslan

Возраст: 39 лет

8#


Опубликовано 24-12-2015 20:04:59
С мобилы
|
Сообщения автора

Здравствуйте!!! А есть ли какой нибудь небольшой софт для бош 797+ чтобы тупо менять только температуру вкл.вентилятора?

Прокомментировать
Свернуть


Ответ
+

Реквизит
Жалоба

auto-mat [ТопикСтартер]

Возраст: 46 лет

9#


Опубликовано 25-12-2015 07:16:03
|
Сообщения автора

добавил Ruslan в 24-12-2015 23:04
Здравствуйте!!! А есть ли какой нибудь небольшой софт для бош 797+ чтобы тупо менять только температ

Вопрос не совсем в тему, но есть редактор калибровок от Мовyх который это делает. Проект пока обновляется, но старая версия программы это делала именно с Бош-7.9.7+

Прокомментировать
Свернуть


Ответ
+

Реквизит
Жалоба

Mat

Возраст: 41 лет

10#


Опубликовано 25-12-2015 09:01:42
|
Сообщения автора

добавил Ruslan в 24-12-2015 20:04
Здравствуйте!!! А есть ли какой нибудь небольшой софт для бош 797+ чтобы тупо менять только температ

Модуль М73 для редактора ECU.
https://avtomastera.net/forum.ph … =1368&fromuid=2
(Источник: АвтоМастера.нет)

Прокомментировать
Свернуть


Ответ
+

Реквизит
Жалоба

Тема посвящается желающим перепрошить блок управления двигателем (aka PCM, aka ЭБУ) на FF2. Теперь это возможно сделать с помощью ELM327 и совместимыми адаптерами. Однако эта операция имеет определённые трудности (особенности) и чревато большими проблемами, если что-то сделать не так.

Зачем это делать
Очевидно, что новые прошивки для данного конкретного двигателя, выпускались с целью устранения выявленных недочётов в работе сабжа. Однако, за время существования темы (и возможности прошиваться с помощью ELMConfig) была выявлена нестабильность справедливости данного утверждения. То есть у кого-то новые прошивки вели себя хуже (полностью или частично), чем старые. В этой теме вы можете делиться опытом и впечатлениями.

Как это сделать
Для этого вам нужна USB версия адаптера ELM327 или совместимого с ним. Плюс вам нужна программа ELMConfig. Если вы не знаете что это — советую почитать профильную тему.

Противопоказания к перепрошивке PCM
— Вы только что купили адаптер (шнурок) и не имеете опыта работы с ELMConfig
— У вас Bluetooth версия адаптера
— Вы не имеете представления как это делать, и решили познать процесс сразу на практике, не изучив матчасть
— Вы плохо разбираетесь в компе, не знаете как настроить драйвера и где это делать, и можете поклясца, что не устанавливали Яндекс.Бар, хотя он у вас есть
— Вы не читали этот текст (рекурсия только что разделила на ноль)

Какие бывают PCM у Focus II/Cmax I/Kuga I

Как это делать
Ниже в FAQ есть сообщения, описывающие данную процедуру в той степени, коей достаточно для понимания людьми, у которых всё получится. Если текста и картинок вам не достаточно — оставьте эту затею до лучших времён.

Для владельцев блоков ESU131

Если после прошивки авто не заводится, или заводится с трудом, при этом работает не стабильно, горит джеки чан и есть ошибки по дросселю, то с вероятностью 99,999% вы залили не тот файл Quizzer!

И самое главное
Помните! Всё что вы делаете с помощью ELMConfig — вы делаете на свой страх и риск. Ни автор программы, ни авторы данного топика и сообщений в FAQ, ни администрация ffclub, ни один из 2-х миллиардов китайцев, сделавших вам адаптер, не несут ответственность за ваши действия и ваш результат.

avatar

Digital-Cj

14 июня 2013

Перепрошивка PCM

avatar

1

Brazh
Для этого форум и существует, всегда можно спросить.
Но конкретно это есть в шапке, причем уже давно.

avatar

lemonch1k

31 октября 2015

Приветствую всех. Имеется ELM327 на чипе CP210x(2102 как я понял), авто фф2 рест 1.8 411/418 блок. Попробовал прошиться. На всех этапах вплоть до самой прошивки в болк все прошло нормально ( считывание общей инфы о транспорте, чтение сохранение VID, чтение сохранение родной прошивки в BIN файл на размене блока 2048 тоже прошло успешно). Однако после подгрузки китайской прошивки APP при попытке записи в блок РСМ выжается окно сл содержания:

Некорректный ответ от ELM на запрос
«10 85»:
7F 10 22
22-Необходимые условия не выполнены или ошибка последовательности запросов.

А еще в строке статуса внизу программы ELMconfig надпись

Ввод модуля в режим программирования … Ошибка!

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

Превышено время ожидания корректного ответа от адаптера.

Полученный ответ на запрос «AT WS»:
«a+»

Народ подскажите куда копать и как в такой ситуации быть? Заранее благодарен

avatar

alf1996

31 октября 2015

-2

avatar

4

lemonch1k
Перед записью новой прошивки нужно выключить и включить зажигание.

avatar

1

alf1996
Тупо кинуть 2 ссылки на заглавные темы обсуждения и сказать изучайте это круто. Спс. Продолжайте в том же духе зарабатывать рейтинг.

Rika1
Премного благодарен, после переключения зажигания все прошилось. Не ожидал что от такого ньюанса могут быть проблемы. Успехов Вам)

avatar

lemonch1k
Спасибо) сам просто с такой проблемой сталкивался в свое время

avatar

lemonch1k
Так в том то и дело что здесь все жевано и пережовано не один десяток раз а вам лень даже по ссылке с помощью поиска информацию найти и так уже не один год после покупки китайской елм 327.Поэтому и не торопяться вам ответить И нечего обижаться.

Добрый вечер!
Сегодня решил установить круиз-контроль и соотвественно прошиться согласно инструкции (блок ESU-411), но на 10 пункте , что-то пошло не так. Погасла приборка и часто заморгал индикатор иммобилайзера, после этого при повороте ключа во 2-ое положение приборка загорается на несколько секунд и тухнет и слышно шум со стороны бардачка (машина не заводится)…убил ли я все таки мозги или нет))

avatar

moto
Коннект есть? Прошиться еще раз не пробовали?

romasvo
Пишет время ожидания соединения истекло

avatar

moto
Зажигание выключалось?

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

avatar

Romich811

1 ноября 2015mobile

moto
Измерте напряжение на аккуме.
Скидывание клеммы ничем не поможет.

avatar

moto
Рома Romich811 говорит правильно, если щелкает реле ГЕМа, то сел акб!

цитата:
приборка загорается на несколько секунд и тухнет

100% сел аккумулятор, причем достаточно сильно, раз не хватает зажечь приборку!
Зарядите полностью аккумулятор или прикурите от какого нибудь исправного авто и прошейте эбу

Sholoiko
Так и случилось..сдох аккум. ночью зарядил. машина ожила.
Сейчас при чтении из PCM пишет, что в PCM отстуствует VID-блок

avatar

moto

цитата:
приборка загорается на несколько секунд и тухнет

в таком случае можно VID бок записать без перепрошивки.

Но если учесть что аккумулятор сел в тот момент когда запись прошивки не закончилась, настоятельно рекомендую повторить запись прошивки полностью!

Ребята, всем спасибо за подсказки!!!
Эпопея закончена..прошился, но есть повод задуматься о покупке нового аккума, т.к. прошивку пережил, а вот заводить авто не захотел)))

avatar

Partizan_161rus

1 ноября 2015

Всем привет! 1000 извинений за глупый вопрос, но тем не менее! В моём фокусе на данный момент прошита прошивка «7M51BBC 7M51-12A650-BBC 1,6L SIGMA iB5 -Ti-VCT mechanical thermostat C214/C307 17/03/2008»
Какими могут быть последствия в случае замены её на «7M51BGA 7M51-12A650-BGA 1,6L SIGMA iB5 -Ti-VCT C307 MY2008-25»? Они не взаимозаменяемые? У кого есть опыт? И как определить тип термостата? Заранее спасибо

avatar

Partizan_161rus
да BBC и BGA взаимозаменяемые, BGA на пол года примерно поновей, а термостат по моему легко определить, если к нему идут провода, то электрический, не идут провода — механический

avatar

Sholoiko

1 ноября 2015

avatar

Partizan_161rus:

Они не взаимозаменяемые?

да

цитата:
И как определить тип термостата?

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

Не имеет значение какую прошивку ставить (ГЛАВНОЕ ЧТОБ КОЛИЧЕСТВО ДАТЧИКОВ CO СООТВЕТСТВОВАЛИ ПРОШИВКЕ), у меня в оригинале стоял термостат с нагревателем, но после года эксплуатации термостата его заклинило (хотя покупал оригинал), в итоге купил обычный. Прошивки разные стояли, как под обычный термостат, так и «с нагревателем». поэтому обращать на это внимание не стоит

avatar

fanat81

1 ноября 2015

Приветствую!!!
Появилась ошибка В2477 и не стирается??
Проверил инфу по ошибке, пишет что модуль RCM не сконфигурирован???
Как это сделать???
Прага елм.и приблуда усб кней присутствует!!!
Фф2 1.8 2007 г.

avatar

Igor1310

1 ноября 2015

1

Partizan_161rus
Не знаю как у других, я себе BGA залить не смог. Машина выдала ошибку двигателя и заводится не захотела, пришлось залить BBC. Перед этим стояла BBB

DedMustdie67

1 ноября 2015mobile

Добрый вечер. Возникла проблема: после прошивки блока sid206 прошивкой от sid202 перестала работать esp и горит значок на панели. Как это можно решить?

avatar

BorisMan

2 ноября 2015mobile

DedMustdie67
пршить правильную прошивку.

DedMustdie67
не все прошивки потдерживают есп и круиз

fanat81
скорей всего у вас слетел VID или криво прошилась залейте бэкап

avatar

2

Igor1310
У меня была такая же заморочка после прошивки sid206 новой прошивкой. Не подошел вид блок. Перепрошил со своим вид блоком, но лампа есп все равно горела и в меню есп не включалось пока не включил DDS и включение аварийки при резком торможении…после этого лампа погасла и ошибки исчезли

avatar

JONIX1

2 ноября 2015mobile

alf1996
Незнал такой фишки.

avatar

JONIX1
Не утверждаю что у всех так. Я боролся с этой заморочкой методом тыка и у меня получилось таким способом…

avatar

Ani44

3 ноября 2015

Всем привет! У меня вот какой вопрос (может и не совсем в тему, или уже обсуждалось…) скажите пожалуйста., если залить тюненую прошивку под евро 2, нужно что бы катализатора уже не было? Ведь (если я правильно понимаю) если начнет разрушаться каталик, то лямбда 2 уже об этом не сообщит (т.к. отключена). И как повлияет вообщем прошивка евро 2 на кат? (повлияет ли?)

1 человек сейчас в теме

Понравилась статья? Поделить с друзьями:
  • Условия лицензионного соглашения на использование программного обеспечения обнаружена ошибка
  • Условия использования сообщить об ошибке на карте карта
  • Условия и возможные ошибки выбора профессии
  • Условия города отличны от села какая ошибка
  • Условия возникновения фундаментальной ошибки атрибуции является