2015-11-18 28 views
0

嘿,大家我重新学习C++做一些黑客级别的挑战,并得到一个段错误的错误。该程序应该考虑矩阵的维数并计算两个对角线,然后将它们相加。我很确定错误在于2d数组如何传递给computeMainDiagonal和computeSecondaryDiagonal函数。谢谢您的帮助 !C++通过值传递数组导致段错误

int ComputeMatrixMainDiagonal(int matrixDimensions, int* matrix){ 
    int rowIndent = 0; 
    int diagonalValue; 

    for(int i = 0;i < matrixDimensions;i++){ 
     diagonalValue =+ (&matrix)[i][rowIndent]; 
     rowIndent++; 
    } 
    return diagonalValue; 
} 

int ComputeMatrixSecondaryDiagonal(int matrixDimensions, int* matrix){ 
    int rowIndent = matrixDimensions; 
    int diagonalValue; 

    for(int i = matrixDimensions;i > 0;i--){ 
     diagonalValue =+ (&matrix)[i][rowIndent]; 
     rowIndent--; 
    } 
    return diagonalValue; 
} 


int main() { 
    int matrixDimension; 
    int differenceAcrossSumsOfDiagonal; 
    int matrixMainDiagonal; 
    int matrixSecondaryDiagonal; 

    int * matrixPointer; 

    cin >> matrixDimension; //get matrix dimensions 
    int matrix[matrixDimension][matrixDimension]; //declare new matrix 
    for(int index = 0; index < matrixDimension;index++){ //populate matrix 
     for(int i = 0; i < matrixDimension;i++){ 
      cin >> matrix[index][i]; 
     } 
    } 
    matrixMainDiagonal = ComputeMatrixMainDiagonal(matrixDimension,&matrix[matrixDimension][matrixDimension]);  
    matrixSecondaryDiagonal = ComputeMatrixSecondaryDiagonal(matrixDimension,&matrix[matrixDimension][matrixDimension]); 

    differenceAcrossSumsOfDiagonal = (matrixMainDiagonal + matrixSecondaryDiagonal); 

    cout << differenceAcrossSumsOfDiagonal; 

    return 0; 
} 
+1

声明“int matrix [matrixDimension] [matrixDimension]”是无效的C++(它是C99 VLA)。使用的索引是1。 C++原始数组索引是基于0的。这就是说你应该自己调试你的代码。诚然,有些人只能看代码并发现它有什么问题,但如果将所有小问题分发给其他人,你永远无法获得任何地方。 –

+0

'&matrix [matrixDimension] [matrixDimension]'在矩阵后面提供一个地址。 –

+0

@MartinZabel这就是所谓的红丸吗? –

回答

1

您的分段错误可能发生,因为&matrix[matrixDimension][matrixDimension]并不意味着您认为它的含义。你的问题标题表明你认为这是一种通过价值传递数组的方式(尽管你为什么想这么做会让我感到遗憾),但是传递值与传递引用是一个函数是宣称为,而不是它被称为。

表达式&matrix[matrixDimension][matrixDimension]将是矩阵的matrixDimension行的matrixDimension个元素的地址。这超出了矩阵的范围,因为数组的最大索引小于数组维数。即使你写了&matrix[matrixDimension - 1][matrixDimension - 1],但是,它不会是你想要的。您想要阵列的第一个元素的地址,即&matrix[0][0]或简单地matrix,尽管由于具有不同的类型(对应于matrix的元素的不同意义),它们是不等价的。

+0

感谢您的回答我想我明白你在说什么,我做错了什么。我试图将数组传递给函数ComputeMatrixMainDiagonal(),以便它可以计算第一个主对角线。你能否详细说明“虽然你为什么想这么做会逃避我”。如果我需要操作数组,我需要通过引用来传递它,但因为我只是将数值从数组中取出来进行计算传递值应该是正确的?另外,这怎么可能被改为通过引用。谢谢! –

+0

按值传递*数组意味着传递其所有元素,实际上你根本无法做到。但是,你可以传递一个指针(按值),这很好。 –

+0

@DougRay,请注意,你已经用[c]和[C++]标记了问题是相反的适当的。这几乎总是做错的事情,但是你的代码使用了每种语言的特性,而这些特性在另一种语言中不存在。 –