Announcement

Collapse
No announcement yet.

[C++] Lỗi Unhandled exception at ... Access violation writing location ...

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [C++] Lỗi Unhandled exception at ... Access violation writing location ...

    Đề bài : Lập một mảng 2 chiều m dòng , n cột . Giá trị của mỗi ô là từ 0 đến m*n . Hãy in các trường hợp tổng các dòng bằng nhau .

    Ví dụ mảng
    x y x
    a b c

    thì x+y+z = a+b+c

    Bài làm của mình như thế này ( đã bỏ những thứ không ảnh hưởng đến lỗi đi )

    PHP Code:
    #include <stdio.h>

    int sodng,socot;
    int i,c,dem=0;
    int **a;



    int different(int c ,int dong ,int cot)
    {
        return 
    1;
    }
    void in()
    {
        
        for(
    int dong=0;dong<sodng;dong++)
        {
            for(
    int cot=0;cot<socot;cot++)
            {
                
    printf("%d  ",a[dong][cot]);

            }
            
    printf("\n");
        }
        
    printf("\n");

    }

    int tong(int dong ,int cot)
    {
            return 
    1;
    }


    void timgiatri(int dong int cot)
    {
            for(
    int c=0;c<=sodng*socot;c++)
            {
                if (
    different(c,dong,cot)==1)
                {
                    
    a[dong][cot]=c;     \* dòng này bị lỗi *\
                    if (
    dong<sodng-1)
                    {
                        
    timgiatri(dong,cot+1);
                    }
                    if (
    dong==sodng-1)
                    {
                        
    timgiatri(dong+1,0);
                    }
                }
            }
        
    }

    void main()
    {
        
    printf("So dong la :");
        
    scanf("%d",&sodng);
        
    printf("So cot la:");
        
    scanf("%d",&socot);
        
    = new int*[socot];
        for(
    i=0;i<socot;i++)
        {
            
    a[i] = new int[socot];
        }
        
    in();
        
    timgiatri(0,0);
        
        

    Khi mình chạy thì giá trị các phần tử đều ra số rất lớn . Chạy debugging thì bị lỗi " Unhandled exception at 0x000A157C in BAI6-FINAL.exe: 0xC0000005: Access violation writing location 0x013AA000. " ở dòng đã đánh dấu .
    Số dòng mình để là sodng vì vi phạm phải từ cấm (???) nhé . Bạn nào biết giúp mình với .

  • #2
    Logic trong chương trình của bạn có vấn đề rất lớn rồi đấy, bạn khởi tạo:
    Code:
        a = new int*[socot];
        .....
        for.....
            a[i] = new int[socot];
        ....
    Bạn định tạo ma trận vuông à? thế thì sử dụng $sodng làm gì?

    Về logic phần còn lại cũng có vấn đề: mình không quan tâm cái nào là cột, cái nào là dòng nhưng nếu bạn đã tạo mảng dựa trên $socot sau đó lại truy xuất dựa trên $sodng thì tất nhiên là bạn sẽ truy cập đến vùng nhớ không hợp lệ rồi.
    Code:
    for(int dong=0;dong<sodng;dong++) // sodng?
        {
            for(int cot=0;cot<socot;cot++)
            {
                printf("%d  ",a[dong][cot]); // Unhandled exception
            }
            printf("\n");
        }
    Bạn đã sai ngay từ hàm in rồi nói chi tới mấy hàm kia?
    Còn vấn đề tại sao nó in ra số lớn: bạn đã khởi tạo giá trị cho các phần tử trong mảng chưa?

    Comment


    • #3
      Như anh ở trên đã nói, khi bạn khởi tạo mảng chỉ dựa vào số cột thì ta sẽ có 1 ma trận vuông socot x socot. Sẽ xảy ra lỗi khi truy xuất đến dòng > cột.
      Khi ta chào đời, ta khóc mọi người cười
      Sống sao để khi chết đi ta cười còn mọi người khóc.


      Cuộc đời chỉ đáng sống khi còn bạn bè, người thân và quan trọng nhất là ta còn có thể đem lại niềm vui cho người khác

      Comment


      • #4
        Originally posted by 09520102
        Cho dù có cấp phát đúng đi nữa thì cũng mắc lỗi cũ thôi. Thực ra cái sai mà bạn này chỉ ra là ở chỗ: Khi gọi hàm timgiatri(0,0); tham số đc truyền vào "dong=0", "cot=0".
        Hàm different thì luôn trả về 1 rồi, như vậy sau khi thực hiện xong câu lệnh gán a[dong][cot]=c; hàm timgiatri đc gọi đệ quy mà tham số "dong" của hàm nhận giá trị truyền vào vẫn là 0 (chỉ có "cot" đc tăng 1 đơn vị)
        => đệ quy ko có điểm dừng do dong=0 luôn luôn < sodng, các địa chỉ a[0][n] liên tục đc gán giá trị =c sau mỗi lần hàm timgiatri đc gọi đệ quy và khi 1 địa chỉ a[0][n] (khi n đã tăng >cot) nào đó ko cho phép chương trình truy cập nữa thì nó sẽ báo lỗi như trên thôi.
        Mà nhìn cả chương trình thì hình như mình thấy nó ko giải quyết đc vấn đề gì hết
        Theo bạn ấy nói là "đã bỏ những thứ không ảnh hưởng đến lỗi đi" nên em nghĩ có thể bạn đó muốn giấu nội dung vì lý do gì đấy...
        Khi ta chào đời, ta khóc mọi người cười
        Sống sao để khi chết đi ta cười còn mọi người khóc.


        Cuộc đời chỉ đáng sống khi còn bạn bè, người thân và quan trọng nhất là ta còn có thể đem lại niềm vui cho người khác

        Comment


        • #5
          Có gì em cứ gữi trọn bộ source lên để các anh khóa trước tìm lỗi dùm! Như vậy thì khó bắt bệnh lắm em.

          Comment


          • #6
            Lỗi đó quá rõ rồi thiết nghĩ cũng không cần nguyên source code đâu. Nhưng mình recommend chủ post là nên update thường xuyên những gì bạn hỏi để tự giúp chính bạn fix bug, phần khác là để người giúp bạn biết được liệu rằng thông tin người ta cung cấp cho bạn có đúng không? Chứ post lên mà bỏ đó thì..... :badsmell:
            Last edited by 08520021; 17-09-2013, 17:26.

            Comment


            • #7
              [MENTION=7451]09520102[/MENTION] : Làm gì có chuyện tự nhiên truy cập 1 địa chỉ nhiều quá cái nó không cho truy cập nữa anh :v
              [MENTION=20171]12520804[/MENTION]: Lỗi này là lỗi truy cập vào vùng nhớ không do chương trình cấp phát, bạn debug chạy từng lệnh thì sẽ ra
              Bạn có thể đưa cái biến 2 cái biến trong [] vào watch xem khi nào nó nhảy ra ngoài phạm vi của mảng

              Comment


              • #8
                Bạn chủ thớt post cái này đến nay là 4 ngày và 7 lần trả lời rồi mà không thấy xuất hiện lại, chắc đem con bỏ chợ rồi.

                Comment

                LHQC

                Collapse
                Working...
                X