Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
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ố 11 kết quả

Đề tài: Lập trình đa luồng trong C

  1. #1
    Ngày gia nhập
    12 2014
    Bài viết
    7

    Mặc định Lập trình đa luồng trong C

    Mình có một bài như này:
    Cho 10 file txt, mỗi file chứa 1 dãy số. Viết chương trình tính trung bình cộng mỗi file. Và tính tổng trung bình cộng của tất cả file.

    Mình mới viết tính trung bình cộng của từng file nhưng mà khi chay máy báo lỗi bộ nhớ. Ai giúp mình với!
    Code:
    #include <stdio.h>
    #include <pthread.h>
    pthread_t p[10];
    
    void *mittelwert(void *args)
    {
    	float mittelwert;
    	int zahl;
    	int summe=0;
    	int i=0;
    	FILE *pFile;
    	while(!feof(pFile)) 
    		{
    		fscanf (pFile, "%i", &zahl);
    		summe=summe+zahl;
    		i++;
    		}
    
    	mittelwert=(float)summe/i;
    	printf("Mittewert: %.2f \n",mittelwert);
    	fclose(pFile);
    	return NULL;
    }
    
    int main(){
    FILE *text[10];
    	
    	text[0]= fopen("zahlen1.txt","r");
    	text[1]= fopen("zahlen2.txt","r");
            text[2]= fopen("zahlen3.txt","r");
    	text[3]= fopen("zahlen4.txt","r");
    	text[4]= fopen("zahlen5.txt","r");
    	text[5]= fopen("zahlen6.txt","r");
    	text[6]= fopen("zahlen7.txt","r");
    	text[7]= fopen("zahlen8.txt","r");
    	text[8]= fopen("zahlen9.txt","r");
    	text[9]= fopen("zahlen10.txt","r");
    	
    	pthread_create(&p[0], NULL, mittelwert, &text[0]);
    	pthread_create(&p[1], NULL, mittelwert, &text[1]);
    	pthread_create(&p[2], NULL, mittelwert, &text[2]);
    	pthread_create(&p[3], NULL, mittelwert, &text[3]);
    	pthread_create(&p[4], NULL, mittelwert, &text[4]);
    	pthread_create(&p[5], NULL, mittelwert, &text[5]);
    	pthread_create(&p[6], NULL, mittelwert, &text[6]);
    	pthread_create(&p[7], NULL, mittelwert, &text[7]);
    	pthread_create(&p[8], NULL, mittelwert, &text[8]);
    	pthread_create(&p[9], NULL, mittelwert, &text[9]);
    	
    	pthread_join (p[0], NULL);
    	pthread_join (p[1], NULL);
    	pthread_join (p[2], NULL);
    	pthread_join (p[3], NULL);
    	pthread_join (p[4], NULL);
    	pthread_join (p[5], NULL);
    	pthread_join (p[6], NULL);
    	pthread_join (p[7], NULL);
    	pthread_join (p[8], NULL);
    	pthread_join (p[9], NULL);
    	pthread_exit(NULL);
    	printf("\n");
    	return 0;
    }
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.
    Đã được chỉnh sửa lần cuối bởi Quang92 : 01-12-2014 lúc 03:57 PM.

  2. #2
    Ngày gia nhập
    11 2011
    Bài viết
    152

    2:37 AM mà ngồi code chắc buồn ngủ lắm rồi
    1. chưa thấy gán pFile mà đã while(!feof(pFile)) thì lỗi là phải.
    C++ Code:
    1.     FILE *pFile;
    2.     while(!feof(pFile))

    2. text[2] trở đi không thấy fopen???!!!
    Đã được chỉnh sửa lần cuối bởi litikali : 01-12-2014 lúc 09:50 AM.

  3. #3
    Ngày gia nhập
    12 2014
    Bài viết
    7

    Gán như nào vậy bạn. Mình k biết gán như nào cho nó lấy giá trị của mấy file txt kia.
    Đoạn dưới text[2] mình lỡ tay xóa mất, h mới để ý

  4. #4
    Ngày gia nhập
    11 2011
    Bài viết
    152

    Trích dẫn Nguyên bản được gửi bởi Quang92 Xem bài viết
    Gán như nào vậy bạn. Mình k biết gán như nào cho nó lấy giá trị của mấy file txt kia.
    Đoạn dưới text[2] mình lỡ tay xóa mất, h mới để ý
    Bạn thử chỉnh như sau.
    C++ Code:
    1. #include <stdio.h>
    2. #include <pthread.h>
    3. pthread_t p[10];
    4.  
    5. void *mittelwert(void *args)
    6. {
    7.     float mittelwert;
    8.     int zahl;
    9.     int summe=0;
    10.     int i=0;
    11.     FILE *pFile = (FILE *) args;
    12.     while(!feof(pFile))
    13.     {
    14.         fscanf (pFile, "%i", &zahl);
    15.         summe=summe+zahl;
    16.         i++;
    17.     }
    18.  
    19.     mittelwert=(float)summe/i;
    20.     printf("Mittewert: %.2f \n",mittelwert);
    21.     fclose(pFile);
    22.     return NULL;
    23. }
    24.  
    25. int main()
    26. {
    27.     FILE *text[10];
    28.  
    29.     text[0]= fopen("zahlen1.txt","r");
    30.     text[1]= fopen("zahlen2.txt","r");
    31.     text[2]= fopen("zahlen3.txt","r");
    32.     text[3]= fopen("zahlen4.txt","r");
    33.     text[4]= fopen("zahlen5.txt","r");
    34.     text[5]= fopen("zahlen6.txt","r");
    35.     text[6]= fopen("zahlen7.txt","r");
    36.     text[7]= fopen("zahlen8.txt","r");
    37.     text[8]= fopen("zahlen9.txt","r");
    38.     text[9]= fopen("zahlen10.txt","r");
    39.  
    40.     pthread_create(&p[0], NULL, mittelwert, (void *) text[0]);
    41.     pthread_create(&p[1], NULL, mittelwert, (void *) text[1]);
    42.     pthread_create(&p[2], NULL, mittelwert, (void *) text[2]);
    43.     pthread_create(&p[3], NULL, mittelwert, (void *) text[3]);
    44.     pthread_create(&p[4], NULL, mittelwert, (void *) text[4]);
    45.     pthread_create(&p[5], NULL, mittelwert, (void *) text[5]);
    46.     pthread_create(&p[6], NULL, mittelwert, (void *) text[6]);
    47.     pthread_create(&p[7], NULL, mittelwert, (void *) text[7]);
    48.     pthread_create(&p[8], NULL, mittelwert, (void *) text[8]);
    49.     pthread_create(&p[9], NULL, mittelwert, (void *) text[9]);
    50.  
    51.     pthread_join (p[0], NULL);
    52.     pthread_join (p[1], NULL);
    53.     pthread_join (p[2], NULL);
    54.     pthread_join (p[3], NULL);
    55.     pthread_join (p[4], NULL);
    56.     pthread_join (p[5], NULL);
    57.     pthread_join (p[6], NULL);
    58.     pthread_join (p[7], NULL);
    59.     pthread_join (p[8], NULL);
    60.     pthread_join (p[9], NULL);
    61.     pthread_exit(NULL);
    62.     printf("\n");
    63.     return 0;
    64. }
    Mà tôi nghi ngờ là chưa chạy được. Nếu thật là chưa chạy được bạn thử thay đường dẫn của file bằng đường dẫn tuyệt đối như vầy:
    Code:
    text[0]= fopen("/home/nhat/Desktop/zahlen1.txt","r"); // đây chỉ là ví dụ

  5. #5
    Ngày gia nhập
    12 2014
    Bài viết
    7

    Trích dẫn Nguyên bản được gửi bởi litikali Xem bài viết
    Bạn thử chỉnh như sau.
    C++ Code:
    1. #include <stdio.h>
    2. #include <pthread.h>
    3. pthread_t p[10];
    4.  
    5. void *mittelwert(void *args)
    6. {
    7.     float mittelwert;
    8.     int zahl;
    9.     int summe=0;
    10.     int i=0;
    11.     FILE *pFile = (FILE *) args;
    12.     while(!feof(pFile))
    13.     {
    14.         fscanf (pFile, "%i", &zahl);
    15.         summe=summe+zahl;
    16.         i++;
    17.     }
    18.  
    19.     mittelwert=(float)summe/i;
    20.     printf("Mittewert: %.2f \n",mittelwert);
    21.     fclose(pFile);
    22.     return NULL;
    23. }
    24.  
    25. int main()
    26. {
    27.     FILE *text[10];
    28.  
    29.     text[0]= fopen("zahlen1.txt","r");
    30.     text[1]= fopen("zahlen2.txt","r");
    31.     text[2]= fopen("zahlen3.txt","r");
    32.     text[3]= fopen("zahlen4.txt","r");
    33.     text[4]= fopen("zahlen5.txt","r");
    34.     text[5]= fopen("zahlen6.txt","r");
    35.     text[6]= fopen("zahlen7.txt","r");
    36.     text[7]= fopen("zahlen8.txt","r");
    37.     text[8]= fopen("zahlen9.txt","r");
    38.     text[9]= fopen("zahlen10.txt","r");
    39.  
    40.     pthread_create(&p[0], NULL, mittelwert, (void *) text[0]);
    41.     pthread_create(&p[1], NULL, mittelwert, (void *) text[1]);
    42.     pthread_create(&p[2], NULL, mittelwert, (void *) text[2]);
    43.     pthread_create(&p[3], NULL, mittelwert, (void *) text[3]);
    44.     pthread_create(&p[4], NULL, mittelwert, (void *) text[4]);
    45.     pthread_create(&p[5], NULL, mittelwert, (void *) text[5]);
    46.     pthread_create(&p[6], NULL, mittelwert, (void *) text[6]);
    47.     pthread_create(&p[7], NULL, mittelwert, (void *) text[7]);
    48.     pthread_create(&p[8], NULL, mittelwert, (void *) text[8]);
    49.     pthread_create(&p[9], NULL, mittelwert, (void *) text[9]);
    50.  
    51.     pthread_join (p[0], NULL);
    52.     pthread_join (p[1], NULL);
    53.     pthread_join (p[2], NULL);
    54.     pthread_join (p[3], NULL);
    55.     pthread_join (p[4], NULL);
    56.     pthread_join (p[5], NULL);
    57.     pthread_join (p[6], NULL);
    58.     pthread_join (p[7], NULL);
    59.     pthread_join (p[8], NULL);
    60.     pthread_join (p[9], NULL);
    61.     pthread_exit(NULL);
    62.     printf("\n");
    63.     return 0;
    64. }
    Mà tôi nghi ngờ là chưa chạy được. Nếu thật là chưa chạy được bạn thử thay đường dẫn của file bằng đường dẫn tuyệt đối như vầy:
    Code:
    text[0]= fopen("/home/nhat/Desktop/zahlen1.txt","r"); // đây chỉ là ví dụ
    Không được bạn à . Máy vẫn báo lỗi bộ nhớ :(

  6. #6
    Ngày gia nhập
    11 2011
    Bài viết
    152

    Mặc định Lập trình đa luồng trong C

    Trích dẫn Nguyên bản được gửi bởi Quang92 Xem bài viết
    Không được bạn à . Máy vẫn báo lỗi bộ nhớ :(
    Bạn thêm vào dưới mỗi dòng fopen đoạn code để check xem có mở dc file ko
    C++ Code:
    1.     text[0]= fopen("zahlen1.txt","r");
    2.     if (text[0] == NULL)
    3.     {
    4.         printf("Cannot open file: zahlen1.txt");
    5.         return 0;
    6.     }
    Nghi là không mở được file vì nguyên nhân nào đó.

  7. #7
    Ngày gia nhập
    12 2014
    Bài viết
    7

    Trích dẫn Nguyên bản được gửi bởi litikali Xem bài viết
    Bạn thêm vào dưới mỗi dòng fopen đoạn code để check xem có mở dc file ko
    C++ Code:
    1.     text[0]= fopen("zahlen1.txt","r");
    2.     if (text[0] == NULL)
    3.     {
    4.         printf("Cannot open file: zahlen1.txt");
    5.         return 0;
    6.     }
    Nghi là không mở được file vì nguyên nhân nào đó.
    Mình đã thử cho !=NULL và ==NULL rồi nhưng mà vẫn báo lỗi như vậy -.-

  8. #8
    Ngày gia nhập
    11 2011
    Bài viết
    152

    Trích dẫn Nguyên bản được gửi bởi Quang92 Xem bài viết
    Mình đã thử cho !=NULL và ==NULL rồi nhưng mà vẫn báo lỗi như vậy -.-
    cụ thể báo lỗi thế nào?

  9. #9
    Ngày gia nhập
    12 2014
    Bài viết
    7

    Trích dẫn Nguyên bản được gửi bởi litikali Xem bài viết
    cụ thể báo lỗi thế nào?
    Memmory access error.

  10. #10
    Ngày gia nhập
    11 2011
    Bài viết
    152

    Bạn up hình đoạn code và thông báo lỗi của bạn lên xem có đúng ko? Và tạm thời đơn giản hóa chương trình thế này xem sao đã

    C++ Code:
    1. #include <stdio.h>
    2. #include <pthread.h>
    3. pthread_t p[10];
    4.  
    5. void *mittelwert(void *args)
    6. {
    7.     float mittelwert;
    8.     int zahl;
    9.     int summe=0;
    10.     int i=0;
    11.     FILE *pFile = (FILE *) args;
    12.     while(!feof(pFile))
    13.     {
    14.         fscanf (pFile, "%i", &zahl);
    15.         summe=summe+zahl;
    16.         i++;
    17.     }
    18.  
    19.     mittelwert=(float)summe/i;
    20.     printf("Mittewert: %.2f \n",mittelwert);
    21.     fclose(pFile);
    22.     return NULL;
    23. }
    24.  
    25. int main()
    26. {
    27.     FILE *text[10];
    28.  
    29.     text[0]= fopen("zahlen1.txt","r");
    30.     if (text[0] == NULL)
    31.     {
    32.         printf("Cannot open file: zahlen1.txt");
    33.         return 0;
    34.     }
    35.     /*text[1]= fopen("zahlen2.txt","r");
    36.     text[2]= fopen("zahlen3.txt","r");
    37.     text[3]= fopen("zahlen4.txt","r");
    38.     text[4]= fopen("zahlen5.txt","r");
    39.     text[5]= fopen("zahlen6.txt","r");
    40.     text[6]= fopen("zahlen7.txt","r");
    41.     text[7]= fopen("zahlen8.txt","r");
    42.     text[8]= fopen("zahlen9.txt","r");
    43.     text[9]= fopen("zahlen10.txt","r");*/
    44.  
    45.     pthread_create(&p[0], NULL, mittelwert, (void *) text[0]);
    46.     /*pthread_create(&p[1], NULL, mittelwert, (void *) text[1]);
    47.     pthread_create(&p[2], NULL, mittelwert, (void *) text[2]);
    48.     pthread_create(&p[3], NULL, mittelwert, (void *) text[3]);
    49.     pthread_create(&p[4], NULL, mittelwert, (void *) text[4]);
    50.     pthread_create(&p[5], NULL, mittelwert, (void *) text[5]);
    51.     pthread_create(&p[6], NULL, mittelwert, (void *) text[6]);
    52.     pthread_create(&p[7], NULL, mittelwert, (void *) text[7]);
    53.     pthread_create(&p[8], NULL, mittelwert, (void *) text[8]);
    54.     pthread_create(&p[9], NULL, mittelwert, (void *) text[9]);*/
    55.  
    56.     pthread_join (p[0], NULL);
    57.     /*pthread_join (p[1], NULL);
    58.     pthread_join (p[2], NULL);
    59.     pthread_join (p[3], NULL);
    60.     pthread_join (p[4], NULL);
    61.     pthread_join (p[5], NULL);
    62.     pthread_join (p[6], NULL);
    63.     pthread_join (p[7], NULL);
    64.     pthread_join (p[8], NULL);
    65.     pthread_join (p[9], NULL);*/
    66.     pthread_exit(NULL);
    67.     printf("\n");
    68.     return 0;
    69. }
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

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