Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 15 kết quả

Đề tài: Cấp phát bộ nhớ qua hàm trong lập trình C như thế nào?

  1. #1
    Ngày gia nhập
    11 2007
    Bài viết
    153

    Question Cấp phát bộ nhớ qua hàm trong lập trình C như thế nào?

    hiz hiz mình không biết cách cấp phát bộ nhớ qua hàm ?? đã code thử 1 bài rồi nhưng khi làm nó báo lỗi luôn bạn nào biết chỉ mình với mình dùng BC 5.02.
    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. #include <malloc.h>
    4.  
    5. void khaibao(int *mang1,int *mang2,int *n,int *m)
    6. {
    7.     printf("\n moi ban nhap vao so phan tu cua mang1: ");
    8.    scanf("%d",&n);
    9.    mang1=(int *) calloc(*n, sizeof(int));
    10.    if(mang1==NULL)
    11.    {
    12.     printf("\n loi cap phat bo nho mang1.");
    13.       getch();
    14.       return;
    15.  
    16.    }
    17.    printf("\n moi ban nhap vao so phan tu cua mang2: ");
    18.    scanf("%d",&m);
    19.    mang2=(int *) calloc(*m, sizeof(int));
    20.    if(mang2==NULL)
    21.    {
    22.     printf("\n loi cap phat bo nho mang2.");
    23.       getch();
    24.       return;
    25.  
    26.    }
    27. }
    28.  
    29. void nhaplieu(int *mang1,int *mang2,int *n,int *m)
    30. {
    31. int i;
    32.  
    33. printf("\n moi ban nhap vao cac phan tu cua mang 1: ");
    34.    for(i=0;i<*n;i++)
    35.    {
    36.     printf("\n moi ban nhap vao phan tu thu %d: ",i+1);
    37.       scanf("%d",&mang1[i]);
    38.  
    39.    }
    40. printf("\n moi ban nhap vao cac phan tu cua mang 2: ");
    41.    for(i=0;i<*m;i++)
    42.    {
    43.     printf("\n moi ban nhap vao phan tu thu %d: ",i+1);
    44.       scanf("%d",&mang2[i]);
    45.    }
    46. }
    47.  
    48. void indulieu(int *mang1,int *mang2,int *n,int *m)
    49. {
    50. int i;
    51.  printf("\n du lieu mang 1: ");
    52.     for(i=0;i<*n;i++)
    53.    {
    54.     printf("%d ",mang1[i]);
    55.  
    56.    }
    57.  printf("\n du lieu mang 2: ");
    58.     for(i=0;i<*m;i++)
    59.    {
    60.     printf("%d ",mang2[i]);
    61.    }
    62. }
    63. void main()
    64. {
    65. int *n,*m;
    66. int f;
    67. int *mang1;
    68. int *mang2;
    69.    do{
    70.     clrscr();
    71.       printf("\n\t\t ======CHUONG TRINH SU LY SO NGUYEN======");
    72.       printf("\n1. Khai bao 2 mang so nguyen.");
    73.       printf("\n2. Nhap du lieu 2 mang.");
    74.       printf("\n3. Sap xep 2 mang theo chieu tang dan.");
    75.       printf("\n4. Thoat.");
    76.       printf("\n Moi ban nhap lua chon cua minh: ");
    77.       scanf("%d",&f);
    78.       switch(f)
    79.       {
    80.         case 1:
    81.                     khaibao(mang1,mang2,n,m);
    82.                   break;
    83.          case 2:
    84.                   nhaplieu(mang1,mang2,n,m);
    85.                   break;
    86.          case 3:
    87.                   indulieu(mang1,mang2,n,m);
    88.                   break;
    89.          case 4:
    90.                   printf("\n\t\t ---YOU HAVE LOGED OUT- SEE YOU AGAIN---");
    91.                   return;
    92.  
    93.          default :
    94.          printf("\n xin nhap lai lua chon cua ban.");
    95.  
    96.       }
    97.       getch();
    98.  
    99.  
    100.  
    101.    }while(f!=4);
    102.    
    103. }

  2. #2
    Ngày gia nhập
    10 2007
    Bài viết
    169

    Bạn thử lại xem nha!
    C++ Code:
    1. bool AllocMemory(int* arr,int Size)
    2. {
    3.     if(arr) free(arr);
    4.     arr = (int*)malloc(sizeof(int)*Size);
    5.     if(!arr) return 0;
    6.     return 1;
    7. }
    8. int _tmain(int argc, _TCHAR* argv[])
    9. {
    10.     int* arr;
    11.     int Size = 10;
    12.     if(AllocMemory((int*)&arr,Size))
    13.     {
    14.         int* Ptr = arr;
    15.         for(int i = 0;i < Size;i++)
    16.         {
    17.             *Ptr++ = 65;
    18.         }
    19.         // Print
    20.         Ptr = arr;
    21.         for(int i = 0;i < Size;i++)
    22.         {
    23.             printf("%d ",*Ptr++);
    24.         }
    25.     }
    26.     else printf("Error");
    27.     return 0;
    28. }

  3. #3
    Ngày gia nhập
    11 2007
    Bài viết
    153

    hiz hiz mình vẫn không hiểu cái bài giải của bạn cao quá có thể giải dễ hơn được không?

  4. #4
    Ngày gia nhập
    10 2007
    Bài viết
    169

    C++ Code:
    1. bool AllocMemory(int* arr,int Size)
    2. {
    3.     if(arr) free(arr);  // Nếu vùng nhớ còn thì free
    4.     arr = (int*)malloc(sizeof(int)*Size);   // Cấp phát bộ nhớ
    5.     if(!arr) return 0;  // return 0 = false nếu không cấp phát được
    6.     return 1;
    7. }
    8. int _tmain(int argc, _TCHAR* argv[])
    9. {
    10.     int* arr;       // Khai báo con trỏ mảng
    11.     int Size = 10;  // Kích thước mảng là 10
    12.     // Truyền địa chỉ của arr vào hàm để AllocMemory có thể thay đổi địa
    13.     // chỉ đến vùng địa chỉ mới đc cấp phát
    14.     if(AllocMemory((int*)&arr,Size))    // Gọi hàm cấp phát bộ nhớ
    15.     {
    16.         // Nhâp liệu bằng pointer
    17.         int* Ptr = arr;
    18.         for(int i = 0;i < Size;i++)
    19.         {
    20.             *Ptr++ = 65;
    21.             // Hỏng thích thì dùng vầy :
    22.             // arr[i] = 65;
    23.         }
    24.         // Print
    25.         Ptr = arr;
    26.         for(int i = 0;i < Size;i++)
    27.         {
    28.             printf("%d ",*Ptr++/*ar[i]*/);
    29.         }
    30.     }
    31.     else printf("Error");
    32.     return 0;
    33. }

    Bạn củng có thể làm vầy cho đơn giản:
    C++ Code:
    1. void* AllocMemory(int Size)
    2. {
    3.     return (int*)malloc(sizeof(int)*Size);
    4. }
    5. int _tmain(int argc, _TCHAR* argv[])
    6. {
    7.     int* arr;
    8.     int Size = 10;
    9.     if((arr = (int*)AllocMemory(Size)))
    10.     {
    11.         int* Ptr = arr;
    12.         for(int i = 0;i < Size;i++)
    13.         {
    14.             *Ptr++ = 65;
    15.         }
    16.         // Print
    17.         Ptr = arr;
    18.         for(int i = 0;i < Size;i++)
    19.         {
    20.             printf("%d ",*Ptr++);
    21.         }
    22.     }
    23.     else printf("Error");
    24.     return 0;
    25. }

  5. #5
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Đoạn code ban đầu của hàm AllocMemory của RadicalLight có lỗi đấy. Ở bên dưới, trong _tmain, int *arr chỉ khai báo, chưa có trị default gán cho nên sẽ có giá trị rác (= 0xCCCCCCCC trong VC++), truyền vào hàm AllocMemory, bị free ngay đầu, crash ngay.
    Nên đơn giản hàm AllocMemory, đừng * sizeof(int), size = bao nhiêu thì cấp bao nhiêu bytes. Coder dùng hàm sau này sẽ dể lẫn lộn.
    Code:
    LPVOID AllocMemory(size_t cbSize, BOOL bZeroMem)
    {
        LPVOID lpRet = NULL;
    
    #ifdef _ASSERTE
        _ASSERTE(cbSize > 0);
    #endif
    
        if (cbSize > 0)
        {
            lpRet = malloc(cbSize);
            if ((NULL != lpRet) && (TRUE == bZeroMem))
            {
                memset(lpRet, 0, cbSize);
            }
        }
    
        return lpRet;
    }
    Đã được chỉnh sửa lần cuối bởi TQN : 20-12-2007 lúc 05:54 AM.

  6. #6
    Ngày gia nhập
    07 2007
    Nơi ở
    Hồ Chí Minh
    Bài viết
    66

    Mặc định Cấp phát bộ nhớ qua hàm trong lập trình C như thế nào?

    #ifdef _ASSERTE
    _ASSERTE(cbSize > 0);
    #endif

    Trong code của bạn có cái dòng này. Tôi ko hiểu nó, bạn giải thích 1 chút dc ko

  7. #7
    Ngày gia nhập
    11 2007
    Bài viết
    153

    khiếp quá toàn cao thủ giảng siêu ghê nhưng tiếc mình chưa học tới mấy cái đó nên chẳng hiểu gì cả ?__? mình thấy của mình có 1 chỗ sai là lúc truyền con trỏ n và m thì khi nhập giá trị lại quên là để &n,&m ^^!! ,sửa lại rồi đến lúc chạy thì nhập các phần tử mảng 1 không sao nhập phần tử mảng 2 báo ko truy cập được tới vị trí ô nhớ đó chả biết tại sao luôn bạn nào biết sửa giùm mình với mình xin cảm ơn trước.
    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. #include <malloc.h>
    4.  
    5. void khaibao(int *mang1,int *mang2,int *n,int *m)
    6. {
    7.     printf("\n moi ban nhap vao so phan tu cua mang1: ");
    8.    scanf("%d",n);
    9.    mang1=(int *) calloc(*n, sizeof(int));
    10.    if(mang1==NULL)
    11.    {
    12.     printf("\n loi cap phat bo nho mang1.");
    13.       getch();
    14.       return;
    15.  
    16.    }
    17.    printf("\n moi ban nhap vao so phan tu cua mang2: ");
    18.    scanf("%d",m);
    19.    mang2=(int *) calloc(*m, sizeof(int));
    20.    if(mang2==NULL)
    21.    {
    22.     printf("\n loi cap phat bo nho mang2.");
    23.       getch();
    24.       return;
    25.  
    26.    }
    27. }
    28.  
    29. void nhaplieu(int *mang1,int *mang2,int n,int m)
    30. {
    31. int i;
    32.  
    33. printf("\n moi ban nhap vao cac phan tu cua mang 1: ");
    34.    for(i=0;i<n;i++)
    35.    {
    36.     printf("\n moi ban nhap vao phan tu thu %d: ",i+1);
    37.       scanf("%d",&mang1[i]);
    38.  
    39.    }
    40. printf("\n moi ban nhap vao cac phan tu cua mang 2: ");
    41.    for(i=0;i<m;i++)
    42.    {
    43.     printf("\n moi ban nhap vao phan tu thu %d: ",i+1);
    44.       scanf("%d",&mang2[i]);
    45.    }
    46. }
    47.  
    48. void indulieu(int *mang1,int *mang2,int n,int m)
    49. {
    50. int i;
    51.  printf("\n du lieu mang 1: ");
    52.     for(i=0;i<n;i++)
    53.    {
    54.     printf("%d ",mang1[i]);
    55.  
    56.    }
    57.  printf("\n du lieu mang 2: ");
    58.     for(i=0;i<m;i++)
    59.    {
    60.     printf("%d ",mang2[i]);
    61.    }
    62.    free(mang1);
    63.    free(mang2);
    64. }
    65. void main()
    66. {
    67. int n,m;
    68. int f;
    69. int *mang1;
    70. int *mang2;
    71.    do{
    72.     clrscr();
    73.       printf("\n\t\t ======CHUONG TRINH SU LY SO NGUYEN======");
    74.       printf("\n1. Khai bao 2 mang so nguyen.");
    75.       printf("\n2. Nhap du lieu 2 mang.");
    76.       printf("\n3. Sap xep 2 mang theo chieu tang dan.");
    77.       printf("\n4. Thoat.");
    78.       printf("\n Moi ban nhap lua chon cua minh: ");
    79.       scanf("%d",&f);
    80.       switch(f)
    81.       {
    82.         case 1:
    83.                     khaibao(mang1,mang2,&n,&m);
    84.                   break;
    85.          case 2:
    86.                   nhaplieu(mang1,mang2,n,m);
    87.                   break;
    88.          case 3:
    89.                   indulieu(mang1,mang2,n,m);
    90.                   break;
    91.          case 4:
    92.                   printf("\n\t\t ---YOU HAVE LOGED OUT- SEE YOU AGAIN---");
    93.                   return;
    94.  
    95.          default :
    96.          printf("\n xin nhap lai lua chon cua ban.");
    97.  
    98.       }
    99.       getch();
    100.  
    101.  
    102.  
    103.    }while(f!=4);
    104.  
    105.  
    106. }

  8. #8
    Ngày gia nhập
    10 2007
    Bài viết
    169

    C Code:
    1. #include "stdafx.h"
    2. #include <stdio.h>
    3. #include <conio.h>
    4. #include <malloc.h>
    5.  
    6. void khaibao(int* &mang1,int* &mang2,int *n,int *m)
    7. {
    8.     printf("\n moi ban nhap vao so phan tu cua mang1: ");
    9.    scanf("%d",n);
    10.    mang1=(int *) calloc(*n, sizeof(int));
    11.    if(mang1==NULL)
    12.    {
    13.     printf("\n loi cap phat bo nho mang1.");
    14.       getch();
    15.       return;
    16.  
    17.    }
    18.    printf("\n moi ban nhap vao so phan tu cua mang2: ");
    19.    scanf("%d",m);
    20.    mang2=(int *) calloc(*m, sizeof(int));
    21.    if(mang2==NULL)
    22.    {
    23.     printf("\n loi cap phat bo nho mang2.");
    24.       getch();
    25.       return;
    26.  
    27.    }
    28. }
    29.  
    30. void nhaplieu(int *mang1,int *mang2,int n,int m)
    31. {
    32. int i;
    33.  
    34. printf("\n moi ban nhap vao cac phan tu cua mang 1: ");
    35.    for(i=0;i<n;i++)
    36.    {
    37.     printf("\n moi ban nhap vao phan tu thu %d: ",i+1);
    38.       scanf("%d",&mang1[i]);
    39.  
    40.    }
    41. printf("\n moi ban nhap vao cac phan tu cua mang 2: ");
    42.    for(i=0;i<m;i++)
    43.    {
    44.     printf("\n moi ban nhap vao phan tu thu %d: ",i+1);
    45.       scanf("%d",&mang2[i]);
    46.    }
    47. }
    48.  
    49. void indulieu(int *mang1,int *mang2,int n,int m)
    50. {
    51. int i;
    52.  printf("\n du lieu mang 1: ");
    53.     for(i=0;i<n;i++)
    54.    {
    55.     printf("%d ",mang1[i]);
    56.  
    57.    }
    58.  printf("\n du lieu mang 2: ");
    59.     for(i=0;i<m;i++)
    60.    {
    61.     printf("%d ",mang2[i]);
    62.    }
    63.    free(mang1);
    64.    free(mang2);
    65. }
    66. void _tmain(int argc, _TCHAR* argv[])
    67. {
    68. int n,m;
    69. int f;
    70. int *mang1;
    71. int *mang2;
    72.    do{
    73. //      clrscr();
    74.       printf("\n\t\t ======CHUONG TRINH SU LY SO NGUYEN======");
    75.       printf("\n1. Khai bao 2 mang so nguyen.");
    76.       printf("\n2. Nhap du lieu 2 mang.");
    77.       printf("\n3. Sap xep 2 mang theo chieu tang dan.");
    78.       printf("\n4. Thoat.");
    79.       printf("\n Moi ban nhap lua chon cua minh: ");
    80.       scanf("%d",&f);
    81.       switch(f)
    82.       {
    83.         case 1:
    84.                     khaibao(mang1,mang2,&n,&m);
    85.                   break;
    86.          case 2:
    87.                   nhaplieu(mang1,mang2,n,m);
    88.                   break;
    89.          case 3:
    90.                   indulieu(mang1,mang2,n,m);
    91.                   break;
    92.          case 4:
    93.                   printf("\n\t\t ---YOU HAVE LOGED OUT- SEE YOU AGAIN---");
    94.                   return;
    95.  
    96.          default :
    97.          printf("\n xin nhap lai lua chon cua ban.");
    98.  
    99.       }
    100.       getch();
    101.  
    102.  
    103.  
    104.    }while(f!=4);
    105. }

  9. #9
    Ngày gia nhập
    11 2007
    Bài viết
    153

    ặc không 1 lời bình luận lỗi code luôn,dù sao cũng cám ơn bạn rất nhiều hiz hiz, bó tay thật rồi chả lẽ không ai giúp được mình sao hu hu

  10. #10
    Ngày gia nhập
    10 2007
    Bài viết
    169

    Khi bạn muốn hàm có thể thay đổi được giá trị của tham số truyền vào thì phải làm sao!
    Code:
    void khaibao(int* mang1,int* mang2,int *n,int *m)
    Khi bạn khai báo như vầy và dùng
    Code:
    khaibao(mang1,mang2,&n,&m);
    thì cũng giống như :
    Code:
    void func(int i)
    {
    i = 10;
    }
    ...
    int x = 100;
    func(x);
    // x = 100
    Có nghĩa là hàm của bạn sao khi cấp phát bộ nhớ xong thì không thể gán địa chỉ của vùng nhớ đó cho biến truyền vào!

    Bạn nên xem thật kĩ về pointer trong C++ và làm thật nhiều ví dụ về nó rồi bạn sẻ dể hiểu hơn! Lời khuyên của mình là "không thử qua thì không bao giờ biết nó là cái gì"!
    Bạn mở đoạn code của bạn lên và thử xem ^_^!

Các đề tài tương tự

  1. Làm Chữ chạy trên form C# như thẻ <marquee> trong HTML thế nào?
    Gửi bởi magnet241 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 05-04-2012, 11:55 AM
  2. In thẻ,hóa đơn từ các textbox,combobox,datetimepicker trong form C# như thế nào?
    Gửi bởi snoit trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 04-04-2012, 03:13 PM
  3. Game Tạo Form trong suốt trong C# tựa game Thần Võ như thế nào?
    Gửi bởi tocvang_pro trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 21-09-2011, 04:21 PM
  4. Sử lí như thế nào khi nhập rất chậm trong trình xoạn thảo trong devC
    Gửi bởi toansvcn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 13
    Bài viết cuối: 23-05-2011, 10:04 PM
  5. Code tìm kiếm trong cây nhị phân trong C++. Lỗi chỉ tìm được từ đầu tiên trong file thôi sửa thế nào?
    Gửi bởi elvish trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 1
    Bài viết cuối: 11-04-2010, 09:43 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn