Đoạn code chạy bị ngưng nửa chừng

Xin chào các bạn. Các bạn giúp mình xem đoạn code mình có bị lỗi Ngưng nửa chừng. Xin cám ơn

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
const int nam_hien_tai = 2021;
struct GV
{
    char *ten[50], *diachi[100], *sothich[200];
    int namsinh[100];
    int nam_bien_che[50];
    int tuoi [100];
};
int main()
{
    int sonhanvien;
    struct GV nhanvien;
    printf("\n Moi ban nhap so luong GV: ");
    scanf(" %d", &sonhanvien);
    int i;
    int j;
    for (i = 0; i < sonhanvien; i++)
    {
        printf("\n Nhan vien thu %d", i+1);
        fflush(stdin);
        printf("\n \n Moi Quy Thay/ Co nhap ten: ");
        fgets(nhanvien.ten[i], sizeof(nhanvien.ten[i]), stdin);
        fflush(stdin);
        printf("\n Moi Quy Thay/ Co nhap dia chi thuong tru/ tam tru: ");
        fgets(nhanvien.diachi[i], sizeof(nhanvien.diachi[i]), stdin);
        fflush(stdin);
        printf("\n Moi Quy Thay/ Co nhap so thich cua minh: ");
        fgets(nhanvien.sothich[i], sizeof(nhanvien.sothich[i]), stdin);
        fflush(stdin);
        printf("\n Moi Quy Thay/ Co nhap nam sinh: ");
        scanf(" %d", &nhanvien.namsinh[i]);
        fflush(stdin);
        printf("\n Moi Quy Thay/ Co nhap nam vao bien che: ");
        scanf(" %d", &nhanvien.nam_bien_che[i]);
        fflush(stdin);
        nhanvien.tuoi[i] = abs (nhanvien.namsinh[i]-nam_hien_tai);
            if (nhanvien.tuoi[i]>=40 && nhanvien.tuoi[i]<=65)
            {
                printf("\n Tham nien cua Quy Thay/ Co la: %d", abs(nhanvien.nam_bien_che[i] - nam_hien_tai));
            }
            else if(nhanvien.tuoi[i]>=24 && nhanvien.tuoi[i]<40)
            {
                printf("\n Tham nien cua Quy Thay/ Co la: %d", abs(nhanvien.nam_bien_che[i] - nam_hien_tai));
            }
            else
            {
                printf("\n Quy Thay/ Co moi ra truong. Chuc quy Thay  co nhung nam cong tac vui ve sap toi.\n");
            }
            fflush(stdin);
    }
    for (j = 0; j < sonhanvien; j++)
    {
        printf("\n Quy Thay/ Co thu %d: ", j+1);
        printf("\n Quy Thay/ Co ten: %s
                     \nDia chi thuong tru/ tam tru: %s.
                      \nSo thich cua minh: %s.
                       \nNam sinh: %d.
                        \nNam vao bien che: %d.
                         \nTham nien cua Quy Thay/ Co la: %d.\n", 
                                         nhanvien.ten[j], 
                                           nhanvien.diachi[j], 
                                             nhanvien.sothich[j],                  
                                               nhanvien.namsinh[j],                                          
                                                nhanvien.nam_bien_che[j], 
                                                    abs(nhanvien.nam_bien_che[j] - nam_hien_tai));
    }
                  fflush(stdin);
    printf("\n Chuc Quy Thay/ Co co ngay lam viec vui ve.🙂");
                   return 0;
}

Hi there,
Code cậu bị ngưng nửa chừng lúc nào? Cậu đã nhập được input gì rồi? Và có log gì show ra không cậu?
Đồng thời, sao cậu không tạo ra 1 mảng GV, mỗi GV có tên, địa chỉ, sở thích,… thay vì đưa hết mảng tên, mảng địa chỉ, mảng sở thích… vào GV? :smile:

5 Likes

Cám ơn bạn. Mình bị báo lỗi là từ vòng lặp đến nhập GV thứ 2. Bạn xem bản console của mình nhé. Vòng lặp Thứ nhất thì xong, và lặp thứ 2 thì nó lại thoát. Mình cũng không biết như thế nào. Mình đam mê C lắm nhưng do mình dạy tiếng Anh nên không có thời gian đi học bên ngoài. Toàn là tự mò và nhờ bạn bè trên mạng chỉ giúp này nọ. Cám ơn bạn lắm.

còn trên Macbook thì nó lại báo là truy cập bộ nhớ không được phép: Bạn xem giúp mình nhé. Cám ơn bạn lắm.

Bạn đang đang thực hiện 1 việc nguy hiểm: truy xuất con trỏ chưa được cấp phát bộ nhớ.
Bạn khai báo sai cấu trúc của 1 (MỘT) nhân viên. Cái sai này dẫn đến toàn bộ đoạn sau sai.
1983?

4 Likes

à, mong bạn chỉ mình sai ở điểm nào. Mình sửa lại. Cám ơn bạn đã giành thời gian chỉ mình. 1983? mình không hiểu. Mình sn 1983.

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
const int nam_hien_tai = 2021;
struct GV
{
    char *ten[50], *diachi[100], *sothich[200];
    int namsinh[100];
    int nam_bien_che[50];
    int tuoi [100];
};
int main()
{
    int sonhanvien;
    struct GV nhanvien;
    printf("\n Moi ban nhap so luong GV: ");
    scanf(" %d", &sonhanvien);
    int i;
    int j;
    for (i = 0; i < sonhanvien; i++)
    {
        printf("\n Nhan vien thu %d", i+1);
        fflush(stdin);
        printf("\n \n Moi Quy Thay/ Co nhap ten: ");
        fgets(nhanvien.ten[i], sizeof(nhanvien.ten[i]), stdin);
        fflush(stdin);
        printf("\n Moi Quy Thay/ Co nhap dia chi thuong tru/ tam tru: ");
        fgets(nhanvien.diachi[i], sizeof(nhanvien.diachi[i]), stdin);
        fflush(stdin);
        printf("\n Moi Quy Thay/ Co nhap so thich cua minh: ");
        fgets(nhanvien.sothich[i], sizeof(nhanvien.sothich[i]), stdin);
        fflush(stdin);
        printf("\n Moi Quy Thay/ Co nhap nam sinh: ");
        scanf(" %d", &nhanvien.namsinh[i]);
        fflush(stdin);
        printf("\n Moi Quy Thay/ Co nhap nam vao bien che: ");
        scanf(" %d", &nhanvien.nam_bien_che[i]);
        fflush(stdin);
        nhanvien.tuoi[i] = abs (nhanvien.namsinh[i]-nam_hien_tai);
            if (nhanvien.tuoi[i]>=40 && nhanvien.tuoi[i]<=65)
            {
                printf("\n Tham nien cua Quy Thay/ Co la: %d", abs(nhanvien.nam_bien_che[i] - nam_hien_tai));
            }
            else if(nhanvien.tuoi[i]>=24 && nhanvien.tuoi[i]<40)
            {
                printf("\n Tham nien cua Quy Thay/ Co la: %d", abs(nhanvien.nam_bien_che[i] - nam_hien_tai));
            }
            else
            {
                printf("\n Quy Thay/ Co moi ra truong. Chuc quy Thay  co nhung nam cong tac vui ve sap toi.\n");
            }
            fflush(stdin);
    }
    for (j = 0; j < sonhanvien; j++)
    {
        printf("\n Quy Thay/ Co thu %d: ", j+1);
        printf("\n Quy Thay/ Co ten: %s
                     \nDia chi thuong tru/ tam tru: %s.
                      \nSo thich cua minh: %s.
                       \nNam sinh: %d.
                        \nNam vao bien che: %d.
                         \nTham nien cua Quy Thay/ Co la: %d.\n", 
                                         nhanvien.ten[j], 
                                           nhanvien.diachi[j], 
                                             nhanvien.sothich[j],                  
                                               nhanvien.namsinh[j],                                          
                                                nhanvien.nam_bien_che[j], 
                                                    abs(nhanvien.nam_bien_che[j] - nam_hien_tai));
    }
                  fflush(stdin);
    printf("\n Chuc Quy Thay/ Co co ngay lam viec vui ve.🙂");
                   return 0;
}

Chỗ này nghĩa là 50 (100, 200) con trỏ đấy bạn, ko phải 50 ô char đâu.
Mà phải +1 lên do kí tự kết thúc.

4 Likes

à, vậy là mình phải khai báo riêng từng cái đúng không bạn?. Vậy trí sửa lại là.

char * name[50];
char * diachi[100];
char * sothich[200];

Đoạn khai báo riêng đó chả khác gì đoạn sai ở trên cả.

???
typedef struct _SOME_ONE{
    char name[50], address[100], fav[200];
    int birthyear;
    int gender;
} SOME_ONE;
...
SOME_ONE many[10];
4 Likes

cám ơn bạn lắm. Để mình làm lại.

Theo em nghĩ, anh/chị bị khai báo struct sai và nhầm đôi chỗ ạ.
em nghĩ Struct là kiểu cấu trúc, mà với mỗi kiểu cấu trúc GV gồm 1 tên, 1 địa chỉ, 1 sở thích, 1 năm sinh, 1 năm biên chế, 1 tuổi => Trong đoạn khai báo struct chỉ gồm 1 thông số, chứ k khai báo 1 mảng năm sinh, 1 mảng biên chế, 1 mảng tuổi cho 1 struct. Thay vào đó, thứ cần khai báo mảng là nhanvien ( 1 mảng gồm nhiều biến nhân viên kiểu cấu trúc GV )
Nên em nghĩ anh/chị nên sửa đoạn khai báo struct thành

struct GV {
    char ten[50], diachi[100], sothich[200];
    int namsinh;
    int nam_bien_che;
    int tuoi ;
};

và trong hàm main khai báo

struct GV nhanvien[100000];

Sau đó anh/chị sửa địa chỉ những đoạn tiếp sau là đc ạ (em đã thử sửa ạ )

Em cũng mới học C nên có chỗ nào hiểu sai mong mọi người chỉ thêm ạ :blush:

2 Likes

à, không sao bạn, đây là nơi sharing exp+ mà. Bạn cứ thoải mái. Trí đã sửa lại bài của trí rồi. MÌnh khỏi tạo con trỏ và mình chỉ cần khai báo

struct LeLai{
char name[50];
int age;
.....
}Staff[10];//minh giả sử cho 10 người.
int main()
{
int N_staff;
printf("Moi ban nhap vao so luong giao vien cua truong");
scanf(" %d", &N_staff);
 for(int i = 0; i<N_staff; i++) //nhap thong tin GV
  {
     printf("\n Giao Vien thu: %d", i+1);
     printf("\n Nhap ten giao vien: ");
     fgets(Staff[i].name, sizeof(....)...);
   .....
  }
   
  for(int xuat = 0; xuat<N_staff; xuat++) //xuat ra man hinh da nhap.
  {
    printf("\n %s, %d,....,", Staff[xuat].name,...);
  }
return 0;
}

cám ơn bạn lắm. Anh em trên group rất nhiệt tình giúp mình và các bạn khác. Chúc anh em luôn khoẻ mạnh và forum vững mạnh. Mình đã làm không được bài này. Nhưng các bạn trên và bạn đã chỉ mình nên mình làm lại bài thì chạy rất tốt. Cám ơn các bạn. <3

4 Likes

Khai báo biến trong file hay trong hàm sẽ ảnh hưởng đến nơi cấp phát vùng nhớ cho biến.
Khai báo trong file sẽ cấp phát ở data memory. Khai báo trong hàm main sẽ cấp phát ở stack memory.
Thông thường các chương trình đều có stack size khá nhỏ so với data memory, do đó việc cấp phát vùng nhớ rất lớn như 100000 có thể dẫn tới StackOverflow.
Mindset chung cho việc code trong C là giảm thiểu việc cấp phát stack quá lớn không cần thiết.

4 Likes

Em chưa học về cấp phát bộ nhớ mà chỉ hiểu đơn giản là khi khai báo sẽ đc cấp phát ở 1 vị trí nào đó và cũng chưa biết về các đặc tính, ưu điểm của các memory khác nhau ( VD như stack memory thì em có nghe qua rồi còn data memmory thì em chưa biết luôn ).

Qua comment của anh thì em có thử tìm hiểu sơ qua về phân loại các vùng nhớ và biết thêm khá nhiều cái hay ho. Em cảm ơn a nhiều ạ :smiling_face_with_three_hearts::smiling_face_with_three_hearts::smiling_face_with_three_hearts:

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?