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ố 12 kết quả

Đề tài: trình biên dịch làm sai kết quả???

  1. #1
    Ngày gia nhập
    08 2008
    Bài viết
    4

    Mặc định trình biên dịch làm sai kết quả???

    Mình dùng Cfree với compiler mingw để chạy chương trình dưới đây thì kết quả không hiện ra như mình mong muốn, nó xuất hiện 1 số ký tự lah

    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3. #include <string.h>
    4. typedef struct
    5.     {
    6.         char hoten[25];
    7.         int diem;
    8.     }person;
    9. char *ten(char *);
    10. void doicho(person *,person *);
    11. void nhap(person *);
    12. void in(person);
    13.  
    14. void nhap(person *p)
    15. {
    16.     printf("Ho va ten:");
    17.     gets(p->hoten);
    18.     printf("\nDiem:");
    19.     scanf("%d%*c",&p->diem);
    20. }
    21.  
    22. void in(person p)
    23. {
    24.     printf("\n\nHo va ten:%-25s",p.hoten);
    25.     printf("Diem:%d",p.diem);
    26. }
    27.  
    28. char *ten(char *ht)
    29. {
    30.     int i,j,k;
    31.     char *temp;
    32.     for(i=strlen(ht)-1;i>=0;i--)
    33.         if(ht[i]==' ') break;
    34.     i++;
    35.     k=i;
    36.     for(j=0;j<k;i++,j++)
    37.         temp[j]=ht[i];
    38.     temp[i]='\0';
    39.     return(temp);
    40. }
    41.  
    42. void doicho(person *p1,person *p2)
    43. {
    44.     person temp;
    45.     temp=*p1;
    46.     *p1=*p2;
    47.     *p2=temp;
    48. }
    49.  
    50. main()
    51. {
    52.     person ds[50];
    53.     char *temp1,*temp2;
    54.     int n,i,j;
    55.    
    56.     printf("Nhap vao so nguoi:");
    57.     scanf("%d%*c",&n);
    58.     for(i=0;i<n;i++)
    59.     {
    60.         printf("\n\nNhap thong tin nguoi thu %d.\n",i+1);
    61.         nhap(&ds[i]);
    62.     }
    63.     /*for(i=0;i<n-1;i++)
    64.     for(j=i+1;j<n;j++)
    65.     {
    66.         temp1=ten(ds[i].hoten);
    67.         temp2=ten(ds[j].hoten);
    68.         if(stricmp(temp1,temp2)>0) doicho(&ds[i],&ds[j]);
    69.     }
    70.    
    71.     printf("Danh sach sau khi da duoc sap xep\n\n\n");
    72.     for(i=0;i<n;i++) in(ds[i]);
    73.     getch();
    74. }*/
    75.    
    76.     temp1=ten(ds[0].hoten);
    77.     puts(temp1);
    78.     temp2=ten(ds[1].hoten);
    79.     puts(temp2);
    80.     getch();
    81. }

    nếu mình dùng compiler bcc5.5 thì sau khi nhập danh sách xong sẽ bị báo lỗi thoát ra ngay. Nếu vẫn đoạn code đó mình chạy trong BorlandC thì rất tốt, không bị lỗi hiển thị nào cả, bạn nào giải thích giúp mình với????
    Đã được chỉnh sửa lần cuối bởi banhbaochay : 21-08-2008 lúc 11:14 PM.

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

    Mình chưa dùng 2 thằng bạn nói trên nhưng thấy đoạn code của bạn thì mình nghĩ rằng lỗi là do bạn chứ không phải là do compiler.
    1 - bạn khai báo con trỏ mà không cấp phát vùng nhớ cho nó.
    2 - khi kết thúc chương trình bạn không thu hồi lại.
    bạn thử cấp phát và free các biến con trỏ trong hàm main của bạn thử có bị lỗi nữa không.

  3. #3
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Bạn zkday2686 nói đúng rồi đó, lỗi là do bạn chưa cấp phát vùng nhớ cho con trỏ temp1 và temp2. Nếu bạn chạy chương trong BorlandC thì nó vẫn được nhưng rất hên xui vì nếu hên thì con trỏ trỏ vào vùng nhớ không quan trọng thì vẫn chạy được nhưng mà như vậy cũng làm sai lệch dữ liệu của chương trình. Nếu xui mà ghi trúng vùng nhớ hệ thống thì chương trình sẽ bị crash.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  4. #4
    Ngày gia nhập
    08 2008
    Bài viết
    4

    Mình đã thử làm như bạn nói nhưng nó bị lỗi ngay, có nghĩa là sau khi nhập dữ liệu vào danh sách xong thì Microsoft thông báo lỗi không cho chạy nữa. Mình nghĩ vấn đề không phải ở chỗ đó vì cũng chương trình đó mình chạy trên Borland C thì không gặp phải vấn đề gì cả. Thế bạn đang dùng chương trình gì để lập trình C thế, mình muốn dùng những chương trình soạn thảo dễ nhìn để tiện theo dõi code chứ dùng BorlandC thì rất khó nhìn..
    Theo như mình đọc trong sách của thầy Phạm Văn Ất cũng như trong "The C Programming Language" thì thấy rất nhiều chương trình dùng đến con trỏ nhưng không cần thông qua thao tác cấp phát. Mình chỉ thấy trong các cấu trúc có trường con trỏ hoặc danh sách liên kết thì mới dùng đến các hàm cấp phát bộ nhớ thôi mà??
    Đã được chỉnh sửa lần cuối bởi banhbaochay : 21-08-2008 lúc 11:54 PM.

  5. #5
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mấy trình biên dịch trong win đều khởi tạo trị của biến về 0, biến con trỏ được khởi tạo = null còn BorlandC trong DOS khi khai báo biến nó không khởi tạo trị về null nên biến con trỏ trỏ vào một vùng nhớ ngẫu nhiên, nếu vùng nhớ này không quan trọng thì không có gì nhưng nó trỏ vào bảng vector ngắt thì sẽ treo máy nếu chạy trong DOS và báo dont send nếu chạy trong win. Khả năng chạy được trong BorlandC có được là do sự hên xui. Mấy biến con trỏ không cấp phát thì phải trỏ vào đối tượng đã được cấp phát chứ không thể trỏ ngẫu nhiên được. Đoạn code của bạn khi chạy nó sẽ phát sinh lỗi từ những chỗ này :

    C++ Code:
    1.     for(i=strlen(ht)-1;i>=0;i--)
    2.         if(ht[i]==' ') break;
    3.     i++;
    4.     k=i;
    5.     for(j=0;j<k;i++,j++)
    6.         temp[j]=ht[i];
    7.     temp[i]='\0';

    Hơn nữa việc gán biến chuỗi của bạn cũng là sai vì biến chuỗi phải gán bằng hàm strcpy chứ không phải chỉ đơn thuần là gán bằng toán tử "=" như biến số được.

    Kết luận : trình biên dịch không bao giờ có lỗi cả.
    Đã được chỉnh sửa lần cuối bởi meoconlongvang : 22-08-2008 lúc 09:18 AM.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  6. #6
    Ngày gia nhập
    08 2008
    Bài viết
    4

    Mặc định trình biên dịch làm sai kết quả???

    Về phần cấp phát bộ nhớ động cho con trỏ bạn nói mình đã hiểu,cám ơn bạn.
    Mình cũng đồng ý gán biến chuỗi phải dùng strcpy và không thể dùng toán tử "=". Tuy nhiên trong code của mình đó không phải là gán biến chuỗi, mình thực thi gán ký tự nên toán tử "=" vẫn có nghĩa, nếu mình gán biến chuỗi bằng toán tử "=" thì sẽ xuất hiện lỗi Lvalue ngay và không thể chạy được chương trình chứ, trong khi đoạn code tách tên đó mình đã thử và chạy tốt mà.

  7. #7
    Ngày gia nhập
    08 2008
    Bài viết
    4

    Hic, bạn nào trả lời giùm mình với :( .
    Mình cũng muốn hỏi thêm về cái cấp phát bộ nhớ cho con trỏ. Trong rất nhiều tài liệu ví dụ về hàm hoán vị dưới đây đều không cấp phát bộ nhớ cho con trỏ mà chương trình vẫn đúng mà:
    C Code:
    1. void hoanvi(int *a,int *b)
    2. {
    3.    int temp;
    4.    temp=*a;
    5.    *a=*b;
    6.    *b=temp;
    7. }

  8. #8
    Ngày gia nhập
    01 2008
    Nơi ở
    UIT
    Bài viết
    129

    *a và *b là parameters nên tự động đc compiler cấp bộ nhớ

    bạn thử khai báo như sau:

    int *x;
    int temp;
    temp = *x;

    --> compiler sẽ cảnh báo ngay lập tức

    không nên dùng borland compiler, nên dùng mingw hay vc compiler thì hơn
    Đã được chỉnh sửa lần cuối bởi Hok_bik_zi : 23-08-2008 lúc 12:05 PM.

  9. #9
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Hai con trỏ a,b được truyền vào hàm tức là nó đã được trỏ vào vùng nhớ đã cấp phát. Bạn đừng nhìn vào đoạn code này mà hãy xem cái đoạn code mà gọi hàm thì mới biết được a,b trỏ vào đâu.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

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

    à ra thế, cám ơn 2 bạn nhiều nhé

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

  1. Sửa máy tính tại nhà quận long biên, gia lâm, phục vụ 24/7. LH: 0986356604
    Gửi bởi hopluccc trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 31-08-2013, 03:29 PM
  2. Sửa máy tính tại nhà quận long biên giá rẻ 0986356604
    Gửi bởi hopluccc trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 1
    Bài viết cuối: 30-08-2013, 06:30 AM
  3. Kinh hoàng vụ giết người tại quận Long Biên
    Gửi bởi quynhcute trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 23-08-2012, 01:10 AM
  4. Sử dụng Visual Studio 2010 biên dịch mã C++ kết quả toàn chữ Tàu?
    Gửi bởi soldtheworld trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 10
    Bài viết cuối: 15-04-2011, 10:03 AM
  5. Visual C# 2010 khi biên dịch bị lỗi không hiện kết quả?
    Gửi bởi hoangvanthai trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 12-03-2011, 10:27 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