Разве вы не ненавидите, когда вы пытаетесь запустить программу и получаете сообщение об ошибке «Ошибка выполнения»? К сожалению, несмотря на то, что люди регулярно раздражают, ужасная ошибка времени выполнения не очень хорошо объясняет сама себя и то, что именно произошло.
Ошибки времени выполнения бывают разных форм и размеров, и они печально известны тем, что мешают вашему рабочему процессу. Таким образом, вот некоторые из наиболее распространенных ошибок времени выполнения, их причины и способы их устранения.
Что такое ошибки во время выполнения?
Ошибка выполнения возникает в программе, пока она выполняется. Ошибки времени выполнения определяются тем, как они возникают после компиляции программы, а не во время разработки программы. Ошибки времени выполнения разочаровывают тем, что они могут привести к неожиданному завершению работы программы, и иногда бывает трудно определить единственную причину.
Различные типы ошибок времени выполнения
Во время выполнения могут возникать несколько различных типов ошибок, поэтому рекомендуется узнать, что они из себя представляют и что их вызывает. Таким образом, вы будете точно знать, что делать, когда кто-то поднимает свою уродливую голову.
1. Ошибка деления на ноль
Ваш компьютер выполняет много математических операций при обработке данных, а это означает, что ошибки могут возникать даже при выполнении простых арифметических действий. Например, одна распространенная ошибка времени выполнения называется ошибкой «Делить на ноль». Этот симпатичный на носу; это происходит, когда ваш компьютер производит вычисления и пытается разделить число на 0.
Когда вы пытаетесь разделить число на 0, вы получите неопределенное число. Когда компьютер делает это, он не знает, что делать с неопределенным числом, и вызывает сбой программы.
К сожалению, это не та ошибка, которую вы можете решить на своей стороне. Если вы обнаружите ошибку деления на ноль, лучше всего обратиться к разработчику программного обеспечения.
2. Ошибки, вызванные неполной установкой
Иногда в процессе установки что-то идет не так. Существует множество причин, по которым программа не устанавливается должным образом, и когда это происходит, это может привести к проблемам.
Иногда некоторые файлы не устанавливаются или в установочном пакете есть ошибки. В любом случае, если программа не установлена должным образом, определенные файлы, которые ей необходимо запустить, могут не существовать, что приведет к ошибке выполнения. В этом случае лучше всего переустановить программу или попробовать найти другую версию установочного пакета.
3. Логические ошибки в программировании программного обеспечения.
Независимо от того, насколько хорош программист, всегда возникают случайные ошибки. Логическая ошибка — это тип ошибки времени выполнения, который может указывать на ошибку в кодировании.
По теме: Типы ошибок программирования и как их избежать
Горячий ответ: кодирование — это довольно сложно. Существуют тысячи и тысячи символов, которые необходимо правильно ввести для правильной работы программы. Если в коде есть опечатки, это может привести к неожиданным результатам. Из-за этого программа может глючить или даже вообще вылетать.
Лучше всего обратиться к разработчику программного обеспечения. Вы также должны проверить, используете ли вы самую последнюю версию программного обеспечения. В более поздней версии проблема может быть решена.
4. Ошибки, вызванные утечками памяти.
Еще одна довольно распространенная ошибка времени выполнения — ошибка утечки памяти. Когда программа запущена, она использует часть оперативной памяти. Затем, когда программа завершается, она сообщает системе, что она завершена, и освобождает эту оперативную память, чтобы другие программы могли ее использовать. Однако иногда программа этого не делает, и программы продолжают использовать новую оперативную память, пока она не закончится.
Связанный: Как устранить нехватку оперативной памяти или утечки памяти в Windows
Представьте себе жилой комплекс с 10 квартирами, восемь из которых заняты. Если трое жильцов уезжают, не сообщив об этом руководству квартиры, офис считает, что восемь квартир все еще заняты, когда заняты только пять. Затем, когда еще три человека хотят переехать, офис отказывает одному человеку, полагая, что для него нет места.
Утечка памяти может привести к проблемам с ОЗУ, снижению производительности и сбоям программы. В этом случае хорошим решением будет перезагрузка компьютера. Это полностью очистит всю оперативную память.
5. Ошибка ненулевого статуса выхода.
Программное обеспечение состоит из множества строк кода. Каждая линия должна функционировать должным образом, чтобы все работало бесперебойно. К сожалению, бывают случаи, когда линия работает не так, как должна, что приводит к ошибкам.
Одна такая ошибка называется ошибкой ненулевого статуса выхода. Для разных систем кодирования каждой строке кода присваивается статус выхода, который представляет собой число, указывающее, была ли она выполнена успешно или нет. Если компьютер успешно выполнил линию, он получает 0 в качестве статуса выхода. Если оно находится в диапазоне от 1 до 255, значит, это сбой. Хороший пример: если вы запустите строку, которая пытается получить доступ к файлу, которого нет на компьютере, она, скорее всего, получит код выхода 1.
Связанный: Способы проверить, существует ли файл с помощью Python
6. Ошибка переполнения
Когда дело доходит до кодирования, всегда есть ограничения. Например, когда вы пытаетесь поместить число в переменную (также известную как свойство), существует ограничение на то, насколько большим может быть это число. Если вы попытаетесь назначить большее число, чем этот предел, вы получите ошибку переполнения во время выполнения, что может привести к тому, что программа перестанет отвечать.
Когда вы получаете ошибку переполнения, вы должны начать с проверки, является ли ваша версия программного обеспечения последней. Если вы используете последнюю версию, попробуйте переустановить программное обеспечение.
7. Ошибка ошибки сегментации
Ошибки ошибки сегментации являются наиболее распространенным типом ошибок времени выполнения. Существуют определенные правила, которым программа должна следовать при доступе к памяти и записи в нее. Когда некоторые из этих правил нарушаются, вы рискуете получить ошибку ошибки сегментации.
Ошибка сегментации может произойти несколькими способами. Вот некоторые общие причины:
-
когда программа пытается записать в постоянную память
-
когда программа пытается получить доступ к памяти, к которой ей не разрешен доступ
-
когда программа пытается разыменовать освобожденную память или указатели NULL
-
когда программа пытается получить доступ к большему количеству данных, чем разрешено
-
когда программа пытается записать место, которое ей не разрешено
Если вы столкнетесь с одной из этих проблем, Переполнение стека есть отличный список решений, которые вы можете попробовать, поэтому обязательно ознакомьтесь с ним.
Множество ошибок во время выполнения в дикой природе
Когда дело доходит до ошибок времени выполнения, это только верхушка айсберга. Этот список можно продолжить, так как существует множество ошибок и еще больше способов их вызвать. Лучшее, что можно сделать, — это изучить больше ошибок времени выполнения, как их идентифицировать и как их решать; это может помочь предотвратить множество неприятностей.
-
Перезагрузите компьютер
Старый, но хороший, перезапуск вашей системы часто может исправить проблемы, и ошибки времени выполнения не являются исключением.
-
Закрыть другие приложения
Возможно, другое приложение мешает тому, которое вы пытаетесь запустить, или использует слишком много системных ресурсов, не оставляя достаточно для рассматриваемой программы. Используйте диспетчер задач Windows, чтобы закрыть любую программу, которая вам не нужна, затем попробуйте снова открыть приложение.
-
Запустите приложение в безопасном режиме
Безопасный режим — самая скромная операционная система Windows, которую вы можете запустить. Иногда это позволяет приложениям запускаться, что в противном случае было бы невозможно. Загрузитесь в безопасном режиме, затем попробуйте снова запустить приложение.
-
Обновить программу
Проблема может быть связана с ошибкой или ошибкой в последнем выпуске программы, которую вы пытаетесь запустить. Если вы можете, обновите его, используя отдельную утилиту, или вручную загрузите последнюю версию с помощью браузера, чтобы посмотреть, решит ли это проблему.
-
Переустановите приложение
-
Обновите свои драйверы
-
Сканирование на наличие вредоносных программ
-
Убедитесь, что у вас достаточно памяти и памяти
Иногда приложениям требуется немного дополнительного места для хранения или памяти для правильной работы. Убедитесь, что в вашей системе достаточно каждого из них, используя диспетчер задач. Если вам нужно освободить место на вашем компьютере, вам поможет инструмент анализа диска .
Если ничего не помогает, ищите пользователей онлайн, сталкивающихся с подобными проблемами Форумы и социальные сети, такие как Reddit, могут быть ценным ресурсом. Вы также можете попробовать связаться со службой поддержки, чтобы найти обходной путь для ошибки времени выполнения.
Другие проблемы, такие как ошибка во время выполнения
Я решал ArithmaticII. Я получаю правильный вывод для ввода ниже
Вход: 4
1 + 1 * 2 =
29/5 =
103 * 103 * 5 =
50 * 40 * 250 + 791 =
Выход:
4
5
53045
500791
Я получаю правильный результат, но когда я отправляю свое решение в spoj, я я получаю ошибку времени выполнения как SIGABRT
. Из-за проблемы с переполнением я использую stoll
. Когда я пытался отладить свою программу, казалось, что все работает нормально.
Примечание-> Он также может содержать пробелы для улучшения читаемости.
Эта строка кажется мне подозрительной, потому что мои программы останавливаются (ошибка времени выполнения), когда я не предоставляю пробел во вводе (1 * 1 + 2 =) terminate вызывается после создания экземпляра 'std :: invalid_argument' what (): stoll
Помогите пожалуйста, где я делаю не так?
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main() {
int t;
string str;
cin >> t;
while (t--) {
///using cin.ignore() as input as preceded by a single line
cin.ignore();
getline(cin, str, 'n');
stringstream split(str);
///now use getline with specified delimeter to split string stream
string intermediate;
int flag = 0;
long long int ans=1;
while (getline(split, intermediate, ' ')) {
if (intermediate == "=") {
cout << ans<<"n";
break;
}
if (intermediate == "*") {
flag = 1;
continue;
}
else if (intermediate == "/") {
flag = 2;
continue;
}
else if (intermediate == "+") {
flag = 3;
continue;
}
else if(intermediate == "-"){
flag = 4;
continue;
}
if (flag == 1) {
ans *= stoll(intermediate);
}
else if (flag == 2) {
ans /= stoll(intermediate);
}
else if (flag == 3) {
ans += stoll(intermediate);
}
else if (flag == 4) {
ans -= stoll(intermediate);
}
else if (flag == 0) {
ans = stoll(intermediate);
}
}
}
}
2 ответа
Используя именно тот ввод, который вы опубликовали выше:
4
1 + 1 * 2 =
29 / 5 =
103 * 103 * 5 =
50 * 40 * 250 + 791 =
Я могу воспроизвести вашу ошибку:
terminate вызывается после создания экземпляра ‘std :: invalid_argument’
what (): stoll
Прервано
Готов поспорить, вы удалили символы новой строки в образце ввода, чтобы упростить ситуацию — в любом случае это то, как это выглядит в вашем коде. Вы выполняете getline
и тянете ровно столько строк, сколько указано в первом вводе. Это означает, что вы потянете пустую строку (intermediate
будет пустой строкой) и попытаетесь ее обработать.
А что происходит, когда вы пытаетесь позвонить stoll("")
? Ошибка у вас!
Вы можете попробовать проверить, появляется ли пустая строка, а затем продолжить, например:
getline(cin, str, 'n');
if(str.empty()) {
t++; //we didn't actually do anything, so increment t
continue;
}
stringstream split(str);
...
Или вы можете использовать тот факт, что оператор >>
уже останавливается, когда он попадает в пробел (и съедает все пробелы, которые он может, чтобы перейти к следующему съедобному символу). Таким образом, вместо того, чтобы читать строку за раз, вы можете продолжать чтение, пока не найдете символ =
.
0
scohe001
12 Фев 2019 в 23:27
cin >> t;
не ест символ новой строки после чтения числа 4 из ввода. Когда программа входит в цикл, cin.ignore()
заканчивает первую строку ввода, а затем getline(...)
читает пустую строку. Вы получаете пустую строку, которую нельзя преобразовать в int.
Добавление еще одного cin.ignore()
после чтения t
устраняет ошибку времени выполнения.
Вам все равно придется обрабатывать случай, когда между токенами нет пробелов. Это требует переосмысления внутреннего цикла while:
long long int ans;
char op;
split >> ans;
while (split >> skipws >> op) {
if (op == '=') {
cout << ans << 'n';
break;
}
long long int n;
split >> n;
if (op == '*')
ans *= n;
else if (op == '/')
ans /= n;
else if (op == '+')
ans += n;
else if(op == '-')
ans -= n;
}
0
krisz
13 Фев 2019 в 06:37
Отладка программы призвана выискивать «вредителей» кода и устранять их. За это отвечают отладчик и журналирование для вывода сведений о программе.
В предыдущей части мы рассмотрели исходный код и его составляющие.
После того, как вы начнете проверять фрагменты кода или попытаетесь решить связанные с ним проблемы, вы очень скоро поймете, что существуют моменты, когда программа крашится, прерывается и прекращает работу.
Это часто вызвано ошибками, известными как дефекты или исключительные ситуации во время выполнения. Акт обнаружения и удаления ошибок из нашего кода – это отладка программы. Вы лучше разберетесь в отладке на практике, используя ее как можно чаще. Мы не только отлаживаем собственный код, но и порой дебажим написанное другими программистами.
Для начала необходимо рассортировать общие ошибки, которые могут возникнуть в исходном коде.
Синтаксические ошибки
Эти эрроры не позволяют скомпилировать исходный код на компилируемых языках программирования. Они обнаруживаются во время компиляции или интерпретации исходного кода. Они также могут быть легко обнаружены статическими анализаторами (линтами). Подробнее о линтах мы узнаем немного позже.
Синтаксические ошибки в основном вызваны нарушением ожидаемой формы или структуры языка, на котором пишется программа. Как пример, это может быть отсутствующая закрывающая скобка в уравнении.
Семантические ошибки
Отладка программы может потребоваться и по причине семантических ошибок, также известных как логические. Они являются наиболее сложными из всех, потому что не могут быть легко обнаружены. Признак того, что существует семантическая ошибка, – это когда программа запускается, отрабатывает, но не дает желаемого результата.
Рассмотрим данный пример:
3 + 5 * 6
По порядку приоритета, называемому старшинством операции, с учетом математических правил мы ожидаем, что сначала будет оценена часть умножения, и окончательный результат будет равен 33. Если программист хотел, чтобы сначала происходило добавление двух чисел, следовало поступить иначе. Для этого используются круглые скобки, которые отвечают за смещение приоритетов в математической формуле. Исправленный пример должен выглядеть так:
(3 + 5) * 6
3 + 5, заключенные в скобки, дадут желаемый результат, а именно 48.
Ошибки в процессе выполнения
Как и семантические, ошибки во время выполнения никогда не обнаруживаются при компиляции. В отличие от семантических ошибок, эти прерывают программу и препятствуют ее дальнейшему выполнению. Они обычно вызваны неожиданным результатом некоторых вычислений в исходном коде.
Вот хороший пример:
input = 25 x = 0.8/(Math.sqrt(input) - 5)
Фрагмент кода выше будет скомпилирован успешно, но input 25 приведет к ZeroDivisionError. Это ошибка во время выполнения. Другим популярным примером является StackOverflowError или IndexOutofBoundError. Важно то, что вы идентифицируете эти ошибки и узнаете, как с ними бороться.
Существуют ошибки, связанные с тем, как ваш исходный код использует память и пространство на платформе или в среде, в которой он запущен. Они также являются ошибками во время выполнения. Такие ошибки, как OutOfMemoryErrorand и HeapError обычно вызваны тем, что ваш исходный код использует слишком много ресурсов. Хорошее знание алгоритмов поможет написать код, который лучше использует ресурсы. В этом и заключается отладка программы.
Процесс перезаписи кода для повышения производительности называется оптимизацией. Менее популярное наименование процесса – рефакторинг. Поскольку вы тратите больше времени на кодинг, то должны иметь это в виду.
Отладка программы
Вот несколько советов о том, как правильно выполнять отладку:
- Использовать Linters. Linters – это инструменты, которые помогают считывать исходный код, чтобы проверить, соответствует ли он ожидаемому стандарту на выбранном языке программирования. Существуют линты для многих языков.
- Превалирование IDE над простыми редакторами. Вы можете выбрать IDE, разработанную для языка, который изучаете. IDE – это интегрированные среды разработки. Они созданы для написания, отладки, компиляции и запуска кода. Jetbrains создают отличные IDE, такие как Webstorm и IntelliJ. Также есть NetBeans, Komodo, Qt, Android Studio, XCode (поставляется с Mac), etc.
- Чтение кода вслух. Это полезно, когда вы ищете семантическую ошибку. Читая свой код вслух, есть большая вероятность, что вы зачитаете и ошибку.
- Чтение логов. Когда компилятор отмечает Error, обязательно посмотрите, где он находится.
Двигаемся дальше
Поздравляем! Слово «ошибка» уже привычно для вас, равно как и «отладка программы». В качестве новичка вы можете изучать кодинг по книгам, онлайн-урокам или видео. И даже чужой код вам теперь не страшен
В процессе кодинга измените что-нибудь, чтобы понять, как он работает. Но будьте уверены в том, что сами написали.
Викторина
- Какая ошибка допущена в фрагменте кода Python ниже?
items = [0,1,2,3,4,5] print items[8] //комментарий: элементы здесь представляют собой массив с шестью элементами. Например, чтобы получить 4-й элемент, вы будете использовать [3]. Мы начинаем отсчет с 0.
- Какая ошибка допущена в фрагменте кода Python ниже?
input = Hippo' if input == 'Hippo': print 'Hello, Hippo'
Ответы на вопросы
- Ошибка выполнения: ошибка индекса вне диапазона.
2. Синтаксическая ошибка: Отсутствует стартовая кавычка в первой строке.
Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article
In this article, we will discuss the reason for the run-time error and its solution. Runtime Error: A runtime error in a program is an error that occurs while the program is running after being successfully compiled. Below are some methods to identify the reason behind Runtime errors:
Method 1: When the index of the array is assigned with a negative index it leads to invalid memory access during runtime error. Below is the C++ Program to illustrate the invalid memory access during run-time:
C++
#include <iostream>
using
namespace
std;
int
arr[5];
int
main()
{
int
answer = arr[-10];
cout << answer;
return
0;
}
Method 2: Sometimes Array or vector runs out of bounds of their limits resulting in a runtime error. Below is the C++ program illustrating array runs out of bound:
C++
#include <iostream>
using
namespace
std;
int
main()
{
long
n;
n = 100000000000;
long
a[n];
cout << a[1] <<
" "
;
return
0;
}
Output:
Explanation:
- This is an error for index out of bound.
- It can be resolved by using the size of the array/vector as within the limit.
Method 3: Some silly mistakes like dividing by zero encountered while coding in a hurry, sometimes leads to runtime error. Below is the C++ program illustrating runtime error by dividing by zero and un-assigned variables:
C++
#include <iostream>
using
namespace
std;
int
main() {
int
n = 0;
cout << 5/n;
return
0;
}
Output:
C++
#include <iostream>
using
namespace
std;
int
main()
{
long
long
N;
long
arr[N];
cin >> N;
for
(
int
i = 0; i < N; i++) {
cin >> arr[i];
}
for
(
int
i = 0; i < N; i++) {
cout << arr[i] <<
" "
;
}
return
0;
}
Output:
Explanation:
The above program shows “Bad memory access (SIGBUS)” because:
- Here, variable N is assigned a garbage value resulting in a runtime error.
- Sometimes, it depends on how the compiler assigned the garbage value.
- This can be resolved by declaring arr[N] after scanning the value for variable n and checking if it is the upper or lower limit of the array/vector index.
Last Updated :
20 Dec, 2022
Like Article
Save Article