gpt4 book ai didi

c - 数据不存储在结构中

转载 作者:行者123 更新时间:2023-11-30 19:24:16 25 4
gpt4 key购买 nike

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

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

myheader.h

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

void *CalculateSquare(void *arguments);

主.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

最佳答案

在你的主文件中你调用 ReadFromFile(&args); - 所以函数参数是指向结构体 Matrix 的指针。但是你的函数本身有这样的声明:

struct Matrix ReadFromFile(struct Matrix args)

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

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

说实话,我想知道为什么你的代码实际上首先编译时会出现这些错误,你可能想在编译时输出所有警告(gcc 的 -Wall 标志)

关于c - 数据不存储在结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5696454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com