我正在使用 C 構建一個陣列,然后將其傳遞給 Python(類似于:Embed python / numpy in C )。我是 C 的新手,我對代碼的一些細節感到困惑。我希望我能理解這段代碼是如何作業的,因為我需要改變它。所以我的問題是:這種初始化陣列的方法是什么?
const int SIZE{ 10 };
double(*c_arr)[SIZE]{ new double[SIZE][SIZE] };
作為記錄,我已經能夠通過呼叫使其成為一個矩形陣列:
const int numberRows = 5000;
const int numberColumns = 500;
double(*c_arr)[numberColumns]{ new double[numberRows][numberColumns] };
我填充陣列:
// fill the array from a file
std::string line;
int row = 0;
int column = 0;
while (std::getline(dataFile, line)) {
std::stringstream lineStream(line);
std::string cell;
while (std::getline(lineStream, cell, '\t')) {
c_arr[row][column] = std::stod(cell);
column ;
}
row ;
column = 0;
if (row == numberRows) {
break;
}
}
還是不明白什么意思double(*c_arr)。每當我嘗試以不同方式初始化此陣列時,都會出錯。例如:double *c_arr[numberRows][numberColumns];當我嘗試填充陣列時引發錯誤c_arr[row][column] = std::stod(cell);。如果我將初始化更改為: double c_arr[numberRows][numberColumns];,那么在運行時會出現分段錯誤。我最終想要實作的是一個回傳陣列指標的函式;就像是:
double *load_data(int rows, int columns) {
double(*c_arr)[columns]{ new double[rows][columns] };
//fill array here
return (c_arr)
}
當我構造這樣的函式時,在第二次出現columns變數時出現錯誤:expression must have a constant value -- the value of parameter "columns" cannot be used as a constant。我真的不知道如何做到這一點,但我希望如果我能理解陣列初始化,我將能夠正確構造load_data函式。
uj5u.com熱心網友回復:
double(*c_arr)[SIZE]{ new double[SIZE][SIZE] };
以上是/可以讀作:
c_arr 是一個指向 size 陣列的指標
SIZE。接下來,new double[SIZE][SIZE]創建一個二維陣列并回傳一個指向它的第一個元素的指標(它也是一個雙精度陣列)。接下來,c_arr使用上一步回傳的指標初始化指標new double[SIZE][SIZE];
現在讓我們來看看:
double *c_arr[numberRows][numberColumns];
在本例中,c_arr是指向 double 的指標的二維陣列。因此,您無法使用單個指標初始化這個二維指標陣列,例如:
double d=15;
double *c_arr[5][6]=&d ;//incorrect
現在來到你的錯誤:
當我構造這樣的函式時,我在第二次出現列變數時出現錯誤:運算式必須有一個常量值——引數“列”的值不能用作常量
這是因為,在 C 中,陣列的大小必須是編譯時常量( constant expression)。例如,
int n = 10;
double arr[n]; //incorrect
正確的方法是:
const int n = 10;
double arr[n];//correct
所以在你的代碼中,named 的變數columns不是一個常量運算式,這就是你得到上述錯誤的原因。
要正確回傳指向陣列的指標,您可以將load_data函式修改為:
auto load_data(int rows, int columns) -> double (*)[5]{
double(*c_arr)[5]{ new double[4][5] };
//fill array here
return c_arr;
}
在上面對 的修改中load_data,您可以使用其他常量運算式來代替使用數字 4 和 5。
uj5u.com熱心網友回復:
這種初始化陣列的方法是什么?
const int SIZE{ 10 }; double(*c_arr)[SIZE]{ new double[SIZE][SIZE] };
c_arr是一個指標,double[SIZE]即指向雙精度陣列的指標。
new double[SIZE][SIZE]分配一個默認的初始化動態陣列double[SIZE]. 結果是指向第一個元素的指標。該指標用于初始化c_arr.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/360367.html
上一篇:指標改變它指向的地址的值
