Данные не хранятся в структуре - PullRequest
0 голосов
/ 18 апреля 2011

Привет! Мне нужно прочитать данные из текстового файла в массив в структуре, а затем запустить несколько потоков, чтобы вычислить их и, наконец, показать результаты. Теперь я разработал часть чтения файлов и часть потоков, а также часть отображения .

Остается таинственная ошибка, когда я вызываю функцию ReadFile из MyFunctions.C, тогда она хорошо читает файл и хорошо отображает. значения. Я попробовал все, но не могу отследить ошибку ниже моя полная программа

myheader.h

struct Matrix {
    int m1[10][10];
    int row;
    int mult[10][10];
};

void *CalculateSquare(void *arguments);

main.C

#include <stdio.h>
#include<stdlib.h>
#include <pthread.h>
#include <semaphore.h>

#include "myheader.h"

#define Row 4
#define Column 4


int main()
{
    pthread_t pth[4];

    struct Matrix args;

    int i=0,j=0,k=0;

    ReadFromFile(&args);

    printf("Matrix is :\n");
        for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)
        {
            printf("%d\t",(int)args.m1[i][j]);
        }
    printf("\n");
    }
       ///////////////////////// Create New Thread and Store its Id in an array for future Use//////////////////
    for(i=0;i<Row;i++)
    {
        args.row = i;
        pthread_create(&pth[i],NULL,CalculateSquare,(void *)&args);
    }
    ///////////////////////// Join All threads so that program waits for completion of each/////////////////    

    for(i=0;i<Row;i++)
    {
        pthread_join(pth[i],NULL);
    }
    printf("Waiting for Thread to Complete\n");

    /////////////////////// Display the Matrix ////////////       
    printf("Square of the Matrix is :\n");
        for(i=0;i<Row;i++)
        {
            for(j=0;j<Column;j++)
                printf("%d\t",args.mult[i][j]);
            printf("\n");
        }



    return 0;

}

MyFunctions.C

#include <stdio.h>
#include<stdlib.h>

#include "myheader.h"

struct Matrix ReadFromFile(struct Matrix args)
{


    int col = 4, row = 4, i, j;
                int  temp;  
    FILE *fin;
    fin=fopen("test.txt","r");
    if (!fin)
        perror("Can't open input");

    //args.array = (int **)(malloc(sizeof(int**) *row ));
    for(i=0;i<4;i++)
    {
        //args.array[i] = (int **)(malloc(sizeof(int**) * col));
        for(j=0;j<4;j++)
        {

            fscanf(fin,"%d \n",&temp);
            args.m1[i][j] = (int)temp;
        }
    }
    fclose(fin);

for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)
        {
            printf("%d\t",(int)args.m1[i][j]);
        }
    printf("\n");
    }

return args;
}
/* This is our thread function.It takes the Row to Process  */
void *CalculateSquare(void *arguments)
{
    struct Matrix args =*((struct Matrix *) arguments);

    int rowToProcess;
    int j = 0;
    int k = 0;

    rowToProcess = (int)args.row;
    printf("Thread calculating Row Number %d\n",rowToProcess);

    for(j=0;j<4;j++)
        {
        args.mult[rowToProcess][j]=0;
            for(k=0;k<4;k++)
        {
                //args.mult[rowToProcess][j] += (int)(args.m1[rowToProcess][k]*args.m1[k][j]);      
        }
        }   
//  sleep(5);
    return NULL;
}

Выход

1   2   3   4   
5   6   7   8   
9   10  11  12  
13  14  15  16  
Matrix is :
2   2   -1  0   
0   2   1   4242343 
3   -1075858606 1   0   
4193048 -1075858606 4242341 0   
Thread calculating Row Number 1
Thread calculating Row Number 2
Thread calculating Row Number 3
Thread calculating Row Number 3
Waiting for Thread to Complete
Square of the Matrix is :
0   909653609   0   0   
0   0   0   0   
0   0   0   15868726    
15892704    134513372   -1217004872 15949812    

1 Ответ

1 голос
/ 18 апреля 2011

В вашем основном файле вы вызываете ReadFromFile(&args); - поэтому аргумент функции является указателем на структуру Matrix. Но у вас самой функции есть это объявление:

struct Matrix ReadFromFile(struct Matrix args)

Это означает, что ему нужна структура Matrix, а не указатель на нее. Вы можете изменить этот аргумент на указатель. Это, конечно, также означает, что вам нужно изменить доступ к этой структуре с args.m1[i][j] = (int)temp; на args->m1[i][j] = (int)temp;

Редактировать: Кроме того, если вы разместили весь заголовочный файл, вы пропустили объявление ReadFromFile.

Если честно, мне интересно, почему ваш код изначально компилировался с этими ошибками, вы можете вывести все предупреждения при компиляции (-Wall флаг для gcc)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...