我正在尝试完成一个研讨会,但是在if语句中调用inputVector函数后,我遇到了分段错误。我不知道为什么它会给我一个错误。编译时没有警告,对传递的数组的测试实际显示记录的内容。我正在运行OSX Maverick,但我也在linux系统上测试无济于事。如果有人可以对此发光,我会非常感激。
#include <stdio.h>
#include "matrix.h"
int main() {
int row = 0 , col = 0, option = 0;
int vector[9], result[9];
int matrix[9][9];
do{
printf("Number of rows (0 to exit) ? ");
scanf("%d", &row);
if(row != 0) {
printf("Number of columns ? ");
scanf("%d", &col);
inputMatrix(row, col, matrix);
printf("Pre (0) or Post (1) Multiply ? ");
scanf("%d", &option);
if(option == 0){
inputVector(row, vector);
printf("TESTING 1");
preMulti(row, col, matrix, vector, result);
printf("TESTING 2");
display(col, result);
}
else if(option == 1){
inputVector(col, vector);
postMulti(row, col, matrix, vector, result);
display(row, result);
}
return 0;
}// END IF
} while( row != 0 );// End While
} // End Main
#include "matrix.h"
#include <stdio.h>
void inputMatrix(int row , int col, int matrix[][MAXCOL]) {
for ( int i = 0; i < row; i++) {
printf("Row %d ? ", i + 1);
for ( int k = 0; k < col; k++)
scanf("%d", &matrix[i][k]);
}
}
void inputVector(int size, int vector[]) {
printf("Vector? ");
for(int i = 0; i < size; i++){
scanf("%d" , &vector[i]);
printf(" Recorded %d \n", vector[i]);
}
printf("TESTING 3");
}
void preMulti(int row, int col, int matrix[][MAXCOL], int vector[], int result[]) {
for(int i = 0; i < col; i++ ) {
result[i] = 0;
for( int k = 0; k < row; i++)
result[i] += vector[k] * matrix[k][i];
}
}
void postMulti(int row, int col, int matrix[][MAXCOL], int vector[], int result[]) {
for( int i = 0; i < row; i++ ) {
result[i] = 0;
for( int k = 0; k < col; i++)
result[i] += vector[k] * matrix[i][k];
}
}
void display(int size, int vector[]) {
printf("Result: ");
for ( int i = 0; i < size; i++)
printf("%d ", vector[i]);
}
答案 0 :(得分:1)
一些建议:
将数组参数更改为指针。而不是int vec[]
,请使用int *vec
。而不是int matrix[][MAXCOL]
,请使用int **matrix
。这将更多的工作重新放在编译器上以管理内存布局。如果您碰巧更改了矩阵的大小,则无需更新所有原型中的固定边界。
同样,在主例程中使用MAXCOL
。 matrix
被声明为[9][9]
,但MAXCOL
实际上等于9?
使主例程和matrix.cpp在其参数中保持一致。使用inputVector
或row
数字作为参数调用col
,但它期望的参数是
向量中元素的数量。
答案 1 :(得分:1)
这是你的问题(导致你的段错误的问题,至少),这发生在几个地方,preMulti()
和postMulti()
:
for( int k = 0; k < row; i++)
最后应为k++
,而不是i++
。
答案 2 :(得分:1)
我确实使用过调试器,但我发现问题不在你的inputVector
函数中,而是在这里(当模拟inputMatrix
不会时,inputVector
还有什么工作?):
void preMulti(int row, int col, int matrix[][MAXCOL], int vector[],int result[]){
for(int i = 0; i < col; i++ ) {
result[i] = 0;
for( int k = 0; k < row; i++) // i++ will cause SIGSEGV
result[i] += vector[k] * matrix[k][i]; // probably k++ ?
}
}