我在C中制作矩阵乘法计算器。当我运行它时,会喷出许多数字并产生这样的结果:
57736 segmentation fault
我在哪里写错了?这是我写的代码:
int Mtx1row, Mtx1col, Mtx2row, Mtx2col, c, d, e;
int first[10][10], second[10][10], mult[10][10];
获取第一个矩阵行和列
printf("First Matrix: # of row and col?\n");
scanf("%d%d", &Mtx1row, &Mtx1col);
获取第二个矩阵行和列
printf("Second Matrix: # of row and col?\n");
scanf("%d%d", &Mtx2row, &Mtx2col);
比较第一个矩阵列和第二个矩阵行
if (Mtx1col != Mtx2row){
printf("Mtx1col != Mtx2row (x _ x)\n");
return 1;
}
获取第一个矩阵的元素
printf("Enter elements of First Matrix: \n");
for (c = 0; c < Mtx1row; c++)
for (d = 0; d < Mtx1col; d++)
{
printf("\tEnter element %d%d: ", c+1, d+1);
scanf("%d", &first[c][d]);
}
获取第二个矩阵的元素
printf("Enter elements of Second Matrix: \n");
for (c = 0; c < Mtx2row; c++)
for (d = 0; d < Mtx2col; d++)
{
printf("\tEnter element %d%d: ", c+1, d+1);
scanf("%d", &second[c][d]);
}
将Matrix 1和2相乘并存储到Matrix Product
for (c=0; c < Mtx2row; c++){
for (d=0; d < Mtx2col; d++){
for (e=0; e < Mtx1col; e++){
mult[c][d] += first[c][d] * second[d][e];
}
}
}
答案 0 :(得分:0)
如果只有
,则两个矩阵可以相乘In [134]:
def func(x):
return df['B'].shift(x['A'])[x.name]
df['C'] = df.apply(lambda x: func(x), axis=1)
df
Out[134]:
A B C
0 1 6 NaN
1 2 7 NaN
2 1 8 7.0
3 2 9 7.0
4 1 10 9.0
所以你需要在创建2D数组之前检查一下。
#columns of the first matrix = #rows of the second matrix.
注意强>
在C11下,VLA是可选功能而非强制功能, 因为他们在C99下 变长数组中的术语变量并不意味着你可以 创建后修改数组的长度。一旦创建,一个 VLA保持相同的大小。术语变量的含义是你 在第一次指定数组维度时可以使用变量 创建数组。
以上摘录摘自 Stephen Prata的C ++ Primer Plus第6版
答案 1 :(得分:-1)
至少有一个数组变量mult
,first
,second
没有为发生的访问提供足够的内存。
当Mtx2row
,Mtx2col
和Mtx1col
包含0到10之间的值时,内存访问应该没问题。所以请检查这些变量的值。作为第一步,您可以printf
这些值,更好的是编程检查,以排除超出范围的值。另外,请检查矩阵是否具有矩阵乘法的兼容维度,即Mtx1col
必须等于Mtx2row
。
编辑:
既然显示的代码包含scanf语句,我可以提供以下建议。 始终检查scanf的返回码以确保已解析所有参数。您甚至可以添加额外的%c
以确保没有额外的输入。在您的情况下,您还必须检查读取数组索引是否在允许范围内(此处为0-9)。