2013-09-29 32 views
1

我很新的C++編碼,所以我很抱歉如果這個問題有一個非常明顯的簡單答案。我試圖創建隨機數從-1到1。這些矩陣是我現在用的是兩個功能:傳遞多維數組時分段錯誤,C++

#include <iostream> 
#include "matrix_fill_random.cpp" 
using namespace std; 

int main(int argc, int argv[]){ 

int n1, n2, n3; 

if (argc != 4) { 
    cerr << "This program requires 3 argument!" <<endl; 
    return 1; 
} 
else{ 
    n1 = argv[1]; 
    n2 = argv[2]; 
    n3 = argv[3]; 

    double** a; 

    matrix_fill_random(n1, n2, a); 

    return 0; 
} 
} 

#include <iostream> 
using namespace std; 

int matrix_fill_random(int n1, int n2, double** a){ 
for (int i=0; i<n1; i++){ 
    for (int j=0; j<n2; j++){ 
     double num = rand() % 2 - 1; 
     a[i][j]=num; 
    } 
} 
return 0; 
} 

最後,我想創建兩個矩陣然後將它們相乘,這樣n1,n2和n3代表兩個矩陣的行和列,但這並不是太重要。我認爲錯誤可能在於我如何聲明變量或將它們傳遞給其他函數,但我不完全確定。

我覺得如果我能理解創建其中一個矩陣的原理,那麼這將轉化爲我需要使用的其他功能。

+1

'matrix_fill_random'正在爲'a [i] [j]'賦值,但是您沒有爲'a'分配任何內存。 – lurker

+0

另外,'main'的第二個參數是'char * argv []'not'int argv []'。這會導致你的'n1 = argv [1]'編譯失敗(應該是因爲它無效)。您需要將'argv [1]'轉換爲int。對於其他n也是如此。 – lurker

+0

如果使用C++,不要使用普通的c數組(除非必須)。更喜歡std :: vector。 – user1595178

回答

1
double** a; 

您還沒有分配的內存的指針,所以每次你得到未定義行爲,你使用它提領operator []

你應該將其通過該功能前一次分配a ...

double** a = new double*[n1]; 

和一次內部的功能循環:

for (int i = 0; i < n1; i++) 
{ 
    a[i] = new double[n2]; 
    for (int j = 0; j < n2; j++) 
    { 
     double num = rand() % 2 - 1; 
     a[i][j] = num; 
    } 
} 

但是不要忘了delete[]指針一旦完成使用它。你也應該在for循環中分配其他的指針。

當然,這可以通過使用std::vector來避免。這裏是你的程序裝有標準庫:

std::vector<std::vector<double>> a(n1, std::vector<double>(n2)); 

int matrix_fill_random(std::vector<std::vector<double>> a) 
{ 
    for (int i = 0; i < a.size(); ++i) 
    { 
     for (int j = 0; j < a[i].size(); ++j) 
     { 
      double num = rand() % 2 - 1; 
      a[i][j] = num; 
     } 
    } 
    return 0; 
} 
+0

好吧,我明白這是如何分配內存的,所以我可以分配一些東西給它,並且我明白在進入matrix_fill_random和循環之前你是如何做到的。然而,我在'double ** a = new double [n1];''處得到一個錯誤,''在初始化中不能將'double *'轉換爲'double **'。'我也沒有看到'std :: vector'之前,你能指點我一個地方,我可以更多地瞭解它嗎? –

+0

@CalvinMiller哎呀!那應該是'double ** a = new double * [n1]'。感謝您指出了這一點。 :) – 0x499602D2

+0

是的,似乎已經修復它。感謝您的幫助 –

0
double** a; 
matrix_fill_random(n1, n2, a); 

傳遞未初始化的指針a給函數,它試圖初始化二維數組的元素:

a[i][j]=num; 

這將調用一個未定義的行爲。最簡單的解決辦法是分配的內存單塊,這將是大到足以容納矩陣:

double* a = new double[rows * cols]; 
matrix_fill_random(n1, n2, a); 
delete[] a; 
a = NULL; 

... 

// accessing element a[i][j] in the function's body: 
a[i*cols + j] = num; 

,但最合理的解決辦法是使用std::vector代替C風格的數組。

1

a分配內存。你沒有爲a分配內存。沙內聲明double** a;

double** a = new double[n1]; 

和改變循環如下

for (int i = 0; i < n1; i++) 
    { 
    //Every row will be of size = number of columns. 
    a[i] = new double[n2]; 
    for (int j = 0; j < n2; j++) 
    { 
     double num = rand() % 2 - 1; 
     a[i][j] = num; 
    } 
    } 
0

你需要將它傳遞給matrix_fill_random()之前分配內存以a

double** a = new double[n1]; 

由於您使用C++雖然,你應該考慮使用vector或其他template container