Lỗi thời gian chạy C++

Sau hàng giờ nỗ lực thiết kế thuật toán và triển khai mã, điều tồi tệ nhất mà một lập trình viên có thể gặp phải là lỗi thời gian chạy. Thông thường, vào thời điểm chúng tôi viết mã xong và gửi vấn đề, chúng tôi đã cạn kiệt tinh thần đến mức nhìn thấy một lỗi thời gian chạy chỉ gợi lên một cảm xúc. “Tại sao lại là tôi”. Một lỗi thời gian chạy có thể có nghĩa là BẤT CỨ ĐIỀU GÌ và có khả năng là bạn phải đọc đi đọc lại toàn bộ mã để có thể tìm ra nguồn gốc của lỗi. Điều này có thể dẫn đến hàng giờ gỡ lỗi tẻ nhạt. Nhưng không còn nữa

Ở đây, chúng ta sẽ thảo luận về 6 lỗi thời gian chạy phổ biến nhất. Khi bạn đã quen thuộc với các loại lỗi khác nhau này, việc định vị chúng trong mã của bạn sẽ dễ dàng hơn nhiều và giảm 50% thời gian gỡ lỗi của bạn

  1. Chỉ mục vượt quá giới hạn/chỉ mục mảng âm — truy cập một chỉ mục chưa phải là một phần của mảng
#include 
#include
using namespace std;
int main() {
// your code goes here
vector arr = vector();

int n,sum = 0;
cin>>n;
for(int i=0;i cin>>arr[i];
sum = sum+arr[i];
}
cout< return 0;
}

Hãy thử chạy chương trình đơn giản này để tìm tổng của n số với một số đầu vào.
Bạn sẽ thấy lỗi thời gian chạy. Tại sao?

Bởi vì mảng vectơ trống, nó không có phần tử. Cố gắng truy cập phần tử tại chỉ mục i bằng arr[i] là một lỗi, vì kích thước của vectơ vẫn là 0. Có thể có nhiều cách tiếp cận để khắc phục điều này

i) Khai báo kích thước của vector ở đầu

 vector arr = vector(10000);

Được ưu tiên khi kích thước đầu vào có giới hạn trên được xác định

ii) Hoặc khai báo véc tơ sau khi đọc kích thước đầu vào, n,

 cin>>n;
vector arr = vector(n);

iii) Hoặc tăng kích thước của vectơ lên ​​1 lần mỗi khi bạn nhập dữ liệu vào

//remove already added elements from previous test cases
arr.clear();
for(int i=0;i int temp;
cin>>temp;
arr.push_back(temp); // creating a new(ith) elemen
sum = sum+arr[i];
}

Cách cuối cùng có thể gây rắc rối không lường trước nếu bạn không cẩn thận ( e. g. trong các vấn đề có nhiều trường hợp thử nghiệm, bạn có thể thêm đầu vào của trường hợp thử nghiệm mới vào sau đầu vào của trường hợp thử nghiệm trước đó). Hãy chắc chắn rằng bạn xóa véc tơ của mình cho mọi trường hợp thử nghiệm

GHI CHÚ. Trong C++, nếu bạn đang sử dụng vectơ, mảng. at(i) an toàn hơn nhiều khi sử dụng. mảng[i] có thể không đưa ra lỗi thời gian chạy và có thể mang lại cho bạn kết quả không mong muốn khi tôi vượt quá giới hạn và khiến việc gỡ lỗi trở nên cực kỳ khó khăn

2. Khai báo một mảng rất lớn/yêu cầu một lượng lớn bộ nhớ

int size = 1e7;int arr[size]; //array of 1e7 size

Nếu chương trình cố gắng yêu cầu bộ nhớ nhiều hơn giới hạn bộ nhớ tối đa cho chương trình, nó sẽ gây ra lỗi thời gian chạy. Giới hạn có thể khác nhau tùy thuộc vào nền tảng hoặc đối với các sự cố khác nhau.
Thông thường, kích thước tối đa của mảng int mà bạn có thể khai báo nằm trong khoảng 10⁶-10⁷

sửa chữa có thể

i. Xem nếu thay vì mảng int, bạn có thể sử dụng mảng ngắn/mảng bool

Điều đó có thể làm giảm không gian cần thiết đủ để tránh lỗi thời gian chạy

ii. Cố gắng giải quyết vấn đề mà không sử dụng một mảng lớn như vậy

Vấn đề được giải quyết bằng cách sử dụng ít bộ nhớ hơn bằng một số kỹ thuật khác. e. g. Thoạt nhìn, vấn đề sau từ codeforces có vẻ như có thể được giải quyết bằng cách sử dụng mảng, nhưng khi bạn thấy ràng buộc, bạn sẽ thấy kích thước của mảng 2D sẽ lớn hơn 10⁸. Nhưng vấn đề có thể giải quyết được ngay cả khi không sử dụng một mảng lớn như vậy

Vấn đề - 79B - Codeforces

Fox Ciel đã nhìn thấy một cánh đồng rộng lớn khi cô ấy đang ở trên xe buýt. Trường là một hình chữ nhật được chia thành các ô 1 × 1. Một số tế bào đã…

mật mã. com

3. Vi phạm giới hạn đệ quy/tràn ngăn xếp

Lấy ví dụ về một chương trình đơn giản để tìm giai thừa của bất kỳ số nguyên không âm nào

#include 
#include
using namespace std;
long long int factorial(long long int n)
{
if(n==1)
return 1;
long long int x = factorial(n-1);
return n*x;
}
int main() {
//cout< cout<}

Hàm đệ quy có vẻ chính xác, với trường hợp cơ sở được khai báo và tất cả. Nhưng chương trình sẽ gây ra lỗi TLE hoặc thời gian chạy. Tại sao? .
Giai thừa(0) sẽ tiếp tục gọi giai thừa(-1) giai thừa(-2) v.v.. vô thời hạn cho đến khi nó hiển thị TLE hoặc RTE do vi phạm giới hạn đệ quy/tràn ngăn xếp.

Sửa chữa. Suy nghĩ cẩn thận về tất cả các trường hợp cơ sở và ngăn chặn "rò rỉ" đệ quy

4. Phép chia/mô đun với số 0/sqrt của số âm

Bất kỳ chỗ nào trong mã có a%b hoặc a/b đều có thể gây ra lỗi thời gian chạy. do chia hết cho 0

5. Phân tích cú pháp dòng đầu vào

import java.util.*;
import java.lang.*;
import java.io.*;
class Main
{
public static void main (String[] args) throws java.lang.Exception
{
// your code goes here
BufferedReader inp = new BufferedReader (new InputStreamReader(System.in));
int T= Integer.parseInt(inp.readLine()); // for taking a number as an input
System.out.println(T);
String str = inp.readLine(); // for taking a string as an input
}
}

Chương trình trên chỉ lấy một số nguyên đầu vào và in nó. Hãy thử chèn một khoảng trắng sau đầu vào số nguyên và xem điều gì sẽ xảy ra. Nó sẽ gây ra lỗi thời gian chạy. Luôn cắt khoảng trắng ở đầu/cuối khi phân tích cú pháp đầu vào. Trong JAVA, nó có thể được thực hiện bằng cách sử dụng trim()

6. Tràn số nguyên

#include 
#include
using namespace std;


int main() {
// your code goes here
int temp;
vector x= vector(40000);
for(short int i=0;i<40000;i++){
temp = x.at(i);
}
return 0;
}

Bản thân tràn số nguyên có thể không gây ra lỗi thời gian chạy, nhưng nó có thể gián tiếp gây ra lỗi thời gian chạy, như trong ví dụ trên. Vòng lặp trên được cho là chạy 40000 lần, cho đến khi i=0 đến i=39,999. Nhưng sau khi giá trị của i trở thành 32767, việc tăng nó sẽ dẫn đến tràn và giá trị của i được đặt thành -32768. Lỗi này được gọi là tràn. Kết quả là x. at(i) sẽ đưa ra lỗi chỉ số âm, vì đoạn mã này đang cố truy cập chỉ số âm của véc tơ x

Sửa chữa. đọc các ràng buộc đầu vào và chọn loại biến cho phù hợp. Nếu giá trị của một biến cần đi đến n, hãy đảm bảo rằng biến/kiểu dữ liệu có khả năng lưu trữ giá trị của n

Đây là những nguồn lỗi thời gian chạy cơ bản và phổ biến nhất. Bất cứ khi nào bạn gặp lỗi thời gian chạy, hãy tìm kiếm 6 mẫu này trong mã và một trong số chúng chắc chắn sẽ là chìa khóa để sửa mã của bạn

Trong phần tiếp theo của loạt bài này, chúng ta sẽ xem xét một kỹ thuật để loại bỏ tận gốc nguồn gây ra lỗi thời gian chạy chỉ bằng vài cú nhấp chuột mà KHÔNG cần phải xem lại toàn bộ mã một lần nữa

Tại sao mã của tôi báo lỗi thời gian chạy?

Lỗi thời gian chạy có thể là một vấn đề chính đáng trong mã, chẳng hạn như dữ liệu đầu vào được định dạng không chính xác hoặc thiếu tài nguyên (e. g. không đủ bộ nhớ hoặc dung lượng đĩa). Khi xảy ra lỗi thời gian chạy trong Java, trình biên dịch sẽ chỉ định các dòng mã nơi gặp lỗi.

Điều gì gây ra lỗi thời gian chạy C#?

Lỗi thời gian chạy xảy ra trong khi thực hiện chương trình. Đây cũng được gọi là ngoại lệ. Điều này có thể do đầu vào của người dùng không phù hợp, logic thiết kế không đúng hoặc lỗi hệ thống . Các ngoại lệ có thể được xử lý bằng cách sử dụng các khối thử bắt.

Lỗi biên dịch và lỗi thời gian chạy trong C là gì?

Lỗi thời gian biên dịch thường đề cập đến các lỗi tương ứng với ngữ nghĩa hoặc cú pháp. Lỗi thời gian chạy đề cập đến lỗi mà chúng tôi gặp phải trong quá trình thực thi mã trong thời gian chạy . cố định. Chúng ta có thể dễ dàng sửa lỗi thời gian biên dịch trong quá trình phát triển mã. Trình biên dịch không thể xác định lỗi thời gian chạy.

Ví dụ về lỗi thời gian chạy là gì?

Dưới đây là một số ví dụ về các lỗi thời gian chạy phổ biến mà bạn chắc chắn sẽ gặp phải. Tên biến và hàm sai chính tả hoặc viết hoa sai chính tả . Nỗ lực thực hiện các phép toán (chẳng hạn như phép toán) trên dữ liệu không đúng loại (ví dụ:. cố gắng trừ hai biến chứa giá trị chuỗi)