用c语言中的线程乘法矩阵

用c语言中的线程乘法矩阵,c,matrix,C,Matrix,我试图用线程乘以矩阵来编写代码时遇到了一个问题。我没有警告(我使用std=c99-Wall-pedantic-lpthread编译),但是当我尝试使用我的代码时,我总是遇到内核转储的问题。 我把我的代码放在这里,请求你给我一些提示,因为我真的快要发疯了。我不知道我能修什么。我受到启发 #包括 #包括 #包括 #包括 #包括 #包括 #包括“sys/types.h” #包括“unistd.h” #包括“pthread.h” int-xA; int yA; int-xB; int-yB; int-x

我试图用线程乘以矩阵来编写代码时遇到了一个问题。我没有警告(我使用std=c99-Wall-pedantic-lpthread编译),但是当我尝试使用我的代码时,我总是遇到内核转储的问题。 我把我的代码放在这里,请求你给我一些提示,因为我真的快要发疯了。我不知道我能修什么。我受到启发

#包括
#包括
#包括
#包括
#包括
#包括
#包括“sys/types.h”
#包括“unistd.h”
#包括“pthread.h”
int-xA;
int yA;
int-xB;
int-yB;
int-xC;
int yC;
int*mA;
int*mB;
int*mC;
pthread_t*线程;
int-numOfThread;
int**ap=&mC;
int**A=&mA;
int**B=&mB;
int*allocResultMatrix(int xA、int yB、int*xC、int*yC){
*xC=xA;
*yC=yB;
返回(整数*)malloc(sizeof(整数)*(*xC**yC));
}
void生成矩阵(int**ar,int x,int y){
*ar=(int*)malloc(sizeof(int)*(x*y));
int k=-1;
整数范围=1000;
对于(int i=0;i如果(atoi(argv[2])>0&&atoi(argv[2])0&&atoi(argv[3])0&&atoi(argv[4])0&&atoi(argv[5])您正在分配一维数组,并尝试将其作为二维数组访问

特别是,
multipleMatrix
中的表达式
ap[i][j]
假设您有一个指向整数数组的指针数组,但实际情况并非如此

如果选中使用Klocwork或类似工具运行代码,您将注意到
ap[i][j]
仅对值
i=[0..xA*yB]
j=0
有效

您可以分配二维数组:

int **allocate(int x, int y)
{
   int **result = malloc(x * sizeof(int*));
   for (int i = 0; i < y; i++)
   {
      result[i] = malloc(y * sizeof(int));
   }
   return result;
}
int**allocate(int x,int y)
{
int**result=malloc(x*sizeof(int*);
for(int i=0;i
或与一维相乘:

int s = (int)slice;
int from = (s * xA)/numOfThread;
int to = ((s+1) * xA)/numOfThread;

for (int i = from; i < to; i++)
{  
  for (int j = 0; j < yB; j++)
  {
    ap[i * yB + j] = 0;
    for (int k = 0; k < yA; k++)
    {
      ap[i * yB + j] += A[i * yA + k]*B[k * yB + j];
    }
  }
}
ints=(int)切片;
int-from=(s*xA)/numOfThread;
int-to=((s+1)*xA)/numof线程;
for(int i=from;i
使用调试器分析核心转储。不要费心写这段代码,它已经写了很多次了。例如:好的,我试过了,但仍然不起作用。例如,我得到了第二个选项:错误:二进制*的操作数无效(有“int*”和“int*”)
int s = (int)slice;
int from = (s * xA)/numOfThread;
int to = ((s+1) * xA)/numOfThread;

for (int i = from; i < to; i++)
{  
  for (int j = 0; j < yB; j++)
  {
    ap[i * yB + j] = 0;
    for (int k = 0; k < yA; k++)
    {
      ap[i * yB + j] += A[i * yA + k]*B[k * yB + j];
    }
  }
}