数据不存储在结构中

时间:2011-04-17 21:08:35

标签: c linux data-structures

您好我必须从文本文件中读取数据到结构中的数组,然后启动多个线程来计算它,最后显示结果。现在我已经找到了文件读取部分和线程部分以及显示部分

当我从MyFunctions.C调用我的ReadFile函数然后它很好地读取文件并显示良好但是如果我在同一个文件中调用相同的函数但是从其他.c文件调用它然后它显示垃圾时,剩下的是神秘的BUG我尝试了所有的东西,但无法跟踪BUG以下是我的完整程序

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 个答案:

答案 0 :(得分:1)

在主文件中调用ReadFromFile(&args); - 因此函数参数是指向结构矩阵的指针。但是你的功能本身就有这个声明:

struct Matrix ReadFromFile(struct Matrix args)

这意味着它需要一个结构矩阵 - 而不是指向它的指针。您可能希望将此参数更改为指针。 这当然也意味着您需要将此结构的访问权限从args.m1[i][j] = (int)temp;更改为args->m1[i][j] = (int)temp;

编辑:另外,如果您发布了整个头文件,则错过了ReadFromFile的声明。

老实说,我想知道为什么你的代码实际上是首先编译出来的那些错误,你可能想在编译时输出所有警告(-gall标志为gcc)