2016-08-18 62 views
1

我想用一个函数在矩阵中输入特定的值,但由于位于matInit函数中的错误,我一直收到分段错误。无论我将其设置为bar.col [i] .els [k] = 0(如下所示),还是将bar.col [i]保存为数组,然后执行for循环,都会收到此错误k值。我觉得分段错误是由于尺寸不匹配,但我没有看到我做错了什么。我也必须通过这个结构来输入价值,因为这是这个项目的一个要求。如何将文件中的值输入矩阵?

#include <iostream> 
#include <cmath> 
#include <fstream> 
using namespace std; 

struct Vector { 
    float* els; 
    int len; 
}; 

struct Matrix { 
    Vector* col; 
    int ncols; // total number of columns in matrix 
}; 

// Initializer functions for our structures 
Vector vecInit(int);  // Provided below 
Matrix matInit(int,int); // ** You must complete this 

// Overloaded operators 
Vector operator+(Vector,Vector); // Provided below 
Vector operator*(float,Vector); // ** You must write this 
Vector operator*(Matrix,Vector); // ** You must write this 
istream& operator>>(istream&, Vector&); // Provided below 
istream& operator>>(istream&, Matrix&); // ** You must write this 

// Other Vector functions 
float vecDot(Vector,Vector); // ** You must write this 

// main code 
// **** This must be left unchanged in your submission ***** 
int main(void) { 
    int m,n,nv,nw; 
    ifstream fin("mat.def"); 

    if (!fin.is_open()) { 
    cout << "Cannot find file mat.def!" << endl; 
    } 
    else { 
    // Load details of matrix M from file 
    fin >> m >> n; 
    Matrix M = matInit(m,n); 
fin >> M; 
cout << "M is " << m << "x" << n << endl; 



    } 

    return 0; 

} 
// ***************************************************** 

// Support function definitions 

// ** Provided Code. Do not change ** 

// Vector structure initializer 

// *** Partially provided code. Change as needed below *** 

//  Matrix structure initializer 
    Matrix matInit(int m, int n) { 
    Matrix bar; 

bar.ncols = n; 
bar.col = new Vector[m]; 



for (int i=0;i<n;i++) { 

for (int k=0;k<m;k++) { 
bar.col[i].els[k]=0; 
} 
} 







    return bar; 

} 


istream& operator>>(istream& input, Matrix& M) { 
int leng=M.col[0].len; 


for (int i=0;i<M.ncols;i++) { 
for (int k=0;k<leng;k++) { 

input >> M.col[i].els[k]; 
} 
} 
    return input; 
} 
+0

由于随机的,杂乱的缩进,显示的代码大部分是不可读的。请清理您的代码并正确缩进,以使其可读和清晰。 –

+0

欢迎来到Stack Overflow。我们要求[最小完整示例](http://stackoverflow.com),而不仅仅是为了我们自己的方便。如果您已将此归结为最小的情况,您可能已经自行发现了这个问题。 – Beta

+0

我的歉意,我会牢记未来 – Crass

回答

1

在将值分配给元素之前,您必须在每个向量中分配数组。

Matrix matInit(int m, int n) { 
    Matrix bar; 

    bar.ncols = n; 
    bar.col = new Vector[n]; // use n instead m for consistency 

    for (int i=0;i<n;i++) { 
    bar.col[i].els = new float[m]; // add this line to allocate arrays 
    for (int k=0;k<m;k++) { 
     bar.col[i].els[k]=0; 
    } 
    } 

    return bar; 
} 
+0

有趣,非常感谢! – Crass