Announcement

Collapse
No announcement yet.

Nhân hai mảng và lưu kết quả trong **pointer

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

  • [Ansi C] Nhân hai mảng và lưu kết quả trong **pointer

    Em muốn nhân hai mảng cấp phát động bằng hàm NhanHaiMang bên dưới, nhưng chương trình lại lặp vô hạn hoặc vấn đề gì đó mà trình dịch GCC không báo lỗi. Mong mọi người giúp đỡ

    http://pastebin.com/UjzxuLbe

    @
    truonganpn Em vẫn vào được ạ !
    Capture.PNG
    Last edited by 15520599; 26-12-2015, 16:14. Reason: Sua tieu de

  • #2
    Originally posted by 15520599 View Post
    Em muốn nhân hai mảng cấp phát động bằng hàm NhanHaiMang bên dưới, nhưng chương trình lại lặp vô hạn hoặc vấn đề gì đó mà trình dịch GCC không báo lỗi. Mong mọi người giúp đỡ

    http://pastebin.com/UjzxuLbe
    link pastebin 404 rồi em

    Comment


    • #3
      Originally posted by truonganpn View Post
      link pastebin 404 rồi em
      Link em vẫn vào được ạ? Đây là mã hàm:
      PHP Code:
      void NhanHaiMang(int const *aint const *bint const m, const int n, const int k) {    
          
      int ijx;
          
      int **c;
          
      c=(int**)(malloc(sizeof(int*)*(m*n)));
          for(
      i=0i<m; ++i) {
              for(
      x=0x<n; ++x) {
                  for(
      j=0j<k; ++j)
                      **(
      c+i*m+x) += *(a+i*m+j) **(b+j*k+x);
                  
      printf("%d\t", (c+i*m+x));
              }
      //        printf("\n");
          
      }


          for(
      i=0i<m; ++i)
              for(
      x=0x<n; ++x)
                  
      free(c+i*m+x);

      Last edited by 15520599; 26-12-2015, 19:15.

      Comment


      • #4
        Mình mới sửa lại hàm đôi chút, nhưng chương trình cho ra kết quả gấp 4 lần đáp án, mình nghĩ là do int** tăng thêm gấp 4 lần vào đáp án.
        Và chương trình có đôi lúc chạy được, đôi lúc không như hình bên dưới.

        lan 1.PNG
        lan 2.PNG

        Comment


        • #5
          Originally posted by 15520599 View Post
          Mình mới sửa lại hàm đôi chút, nhưng chương trình cho ra kết quả gấp 4 lần đáp án, mình nghĩ là do int** tăng thêm gấp 4 lần vào đáp án.
          Và chương trình có đôi lúc chạy được, đôi lúc không như hình bên dưới.

          [ATTACH=CONFIG]18491[/ATTACH]
          [ATTACH=CONFIG]18492[/ATTACH]
          Bạn vui lòng mô tả input và các tham số truyền vào hàm.
          Cho thêm ví dụ về input càng tốt.

          Comment


          • #6
            mình không hiểu lắm đoạn này của bạn là sao
            c=(int**)(malloc(sizeof(int*)*(m*n)));
            bạn muốn cấp phát cho con trỏ các con trỏ kiểu int (m*n) phần tử? Tại sao bạn cấp phát cho c (số dòng) con trỏ trước rồi sau đó cấp phát cho mỗi con trỏ kiểu int đó (số cột) ô nhớ kiểu int? Vả lại mình cũng không hiểu về mấy tên biến m, k, n bạn đặt lắm

            Comment


            • #7
              Originally posted by 12520332 View Post
              Bạn vui lòng mô tả input và các tham số truyền vào hàm.
              Cho thêm ví dụ về input càng tốt.

              a và b là các con trỏ kiểu nguyên được cấp phát bộ nhớ động tương đương với ma trận hai chiều a[m][k] và b[k][n]
              PHP Code:
                  int *a, *b;
                  
              a=new int[m*k];
                  
              b=(int *)(calloc((k*n), sizeof(int))); 

              Ta nhập a và b bằng hàm nhập ngẫu nhiên
              PHP Code:
              int RandInArr(int *a, const int m, const int k) {
                  
              int ij;
                  for (
              i=0i<m; ++i) {
                      for(
              j=0j<k; ++j)
                          *(
              a+i*m+j)=rand() ;
                  }
                  return 
              0;


              c là con trỏ cấp hai lưu c[m][n] kết quả phép nhân của a và b.
              Originally posted by 14520769 View Post
              bạn muốn cấp phát cho con trỏ các con trỏ kiểu int (m*n) phần tử? Tại sao bạn cấp phát cho c (số dòng) con trỏ trước rồi sau đó cấp phát cho mỗi con trỏ kiểu int đó (số cột) ô nhớ kiểu int? Vả lại mình cũng không hiểu về mấy tên biến m, k, n bạn đặt lắm
              Last edited by 15520599; 27-12-2015, 10:58. Reason: Sao khó nhập code thế nhỉ !

              Comment


              • #8
                Tôi không hiểu, làm sao chương trình của bạn có thể in kết quả ra được. Bên trên bạn khai báo c là một con trỏ cấp hai, nhưng ý bạn lại muốn nó là một con trỏ cấp một (m*n).
                Last edited by 12520947; 27-12-2015, 14:54.

                Comment


                • #9
                  Originally posted by 12520947 View Post
                  Tôi không hiểu, làm sao chương trình của bạn có thể in kết quả ra được. Bên trên bạn khai báo c là một con trỏ cấp hai, nhưng ý bạn lại muốn nó là một con trỏ cấp một (m*n).
                  Nói chung là đề như thế này:

                  Viết chương trình thực hiện các công việc sau:
                  - Nhập vào 3 số m, n, k, cấp phát động 2 mảng a(m*k) và b(k*n) theo hai cách khác nhau.
                  - Tính mảng c (được cấp phát động, c là loại int**) là tích của a và b.

                  Comment


                  • #10
                    Originally posted by 15520599 View Post
                    c là con trỏ cấp hai lưu c[m][n] kết quả phép nhân của a và b.
                    c = new int**[row_num] (cấp phát 1 vùng nhớ chứa đủ row_num kiểu int*, trả về con trỏ trỏ tới vị trí đầu của vùng nhớ, về cơ bản nó cũng chỉ là con trỏ, không quan trọng kiểu lắm);
                    sau đó cấp phát riêng cho từng dòng c+i = int[col_num]; (Cấp phát cho vị trí thứ i*(độ lớn của kiểu dữ liệu mà con trỏ c trỏ tới, ở đây là con trỏ, có thể viết thành c[i]) một vùng nhớ chứa đủ col_num kiểu int);

                    Nếu cấp phát kiểu c=new int**[row_num*col_num] là cấp phát 1 vùng nhớ dài liên tục kiểu int* với độ lớn row_num*col_num]*(độ lớn vùng nhớ kiểu con trỏ) byte

                    Comment


                    • #11
                      Originally posted by 15520599 View Post

                      a và b là các con trỏ kiểu nguyên được cấp phát bộ nhớ động tương đương với ma trận hai chiều a[m][k] và b[k][n]
                      PHP Code:
                          int *a, *b;
                          
                      a=new int[m*k];
                          
                      b=(int *)(calloc((k*n), sizeof(int))); 

                      Ta nhập a và b bằng hàm nhập ngẫu nhiên
                      PHP Code:
                      int RandInArr(int *a, const int m, const int k) {
                          
                      int ij;
                          for (
                      i=0i<m; ++i) {
                              for(
                      j=0j<k; ++j)
                                  *(
                      a+i*m+j)=rand() ;
                          }
                          return 
                      0;


                      c là con trỏ cấp hai lưu c[m][n] kết quả phép nhân của a và b.
                      ý của mình là thế này
                      PHP Code:
                      = new int*[m];
                      for (
                      int i 0< ; i++)
                      c[i] = new int[n]; 

                      Comment


                      • #12
                        Originally posted by 11520132 View Post
                        c = new int**[row_num] (cấp phát 1 vùng nhớ chứa đủ row_num kiểu int*, trả về con trỏ trỏ tới vị trí đầu của vùng nhớ, về cơ bản nó cũng chỉ là con trỏ, không quan trọng kiểu lắm);
                        sau đó cấp phát riêng cho từng dòng c+i = int[col_num]; (Cấp phát cho vị trí thứ i*(độ lớn của kiểu dữ liệu mà con trỏ c trỏ tới, ở đây là con trỏ, có thể viết thành c[i]) một vùng nhớ chứa đủ col_num kiểu int);

                        Nếu cấp phát kiểu c=new int**[row_num*col_num] là cấp phát 1 vùng nhớ dài liên tục kiểu int* với độ lớn row_num*col_num]*(độ lớn vùng nhớ kiểu con trỏ) byte
                        Cảm ơn anh đã hướng dẫn, em đã làm được.:sure: Nhưng mà không hiểu sao chương trình ra kết quả đúng nhưng có thông báo lỗi, hàm main() trả về giá trị khác không.
                        1.PNG
                        2.PNG
                        Đây là hàm hoàn chỉnh:

                        Comment


                        • #13
                          Originally posted by 15520599 View Post
                          Cảm ơn anh đã hướng dẫn, em đã làm được.:sure: Nhưng mà không hiểu sao chương trình ra kết quả đúng nhưng có thông báo lỗi, hàm main() trả về giá trị khác không.
                          [ATTACH=CONFIG]18494[/ATTACH]
                          [ATTACH=CONFIG]18495[/ATTACH]
                          Đây là hàm hoàn chỉnh:
                          http://bugs.vn/2590
                          Lỗi hàng này: free(c[i]+x);
                          Em cấp phát vùng nhớ cho c[i], sao lại free c[i] + x ? Cái +x ở đây là gì?

                          Comment

                          LHQC

                          Collapse
                          Working...
                          X