好的,我對編程和 C 還很陌生,所以請放輕松。我正在嘗試撰寫一個程式,該程式采用金屬板的尺寸進行二維有限元方法分析(忽略厚度)。因此,我為我的零件(板)創建了一個類,為網格創建了元素,為元素創建了節點。網格將由方形元素組成,并將應用于板的正面。現在,我正在著手整理網格,然后再轉到元素和節點類。
我正在使用(或想要使用)動態分配來創建一個包含網格元素的二維陣列(我的網格)。我正在嘗試撰寫一個函式“meshingPart”來創建二維陣列,行數是板的高度,列是板的長度。
當我運行程式時,我收到這些錯誤,但我不知道如何修復它們:
In member function 'void PartClass::meshingPart(int&, int, int)':
error: invalid types 'int[int]' for array subscript
At global scope:
error: expected constructor, destructor, or type conversion before '(' token
另外,當我使用我的 printPart() 函式時,它會列印指標的地址還是陣列的值?我對此并不完全確定,我也是指標的新手。
任何幫助將非常感激!提前致謝。
class PartClass
{
private:
const int HEIGHT; // mm
const int LENGTH; // mm
const int WIDTH; // mm
const int SEED; // mm
const int MESHROW;
const int MESHCOL;
int *partMesh; // Mesh array - an int pointer
// Creates the mesh for the part by generating elements to fill the width and length
// of the part. The elements are stored in a 2-D array.
void meshingPart(const int &partMesh, int inRow, int inCol);
public:
// Constructs a part with the given parameters, seeds the part for the mesh,
// then creates the mesh by generating square elements with length = height = SEED.
PartClass(int inHeight, int inLength, int inWidth, int inSeed);
void printPart()
{
cout << "Part mesh:" << *partMesh << endl;
}
};
class ElementClass
{
private:
int elemID;
static int numElems;
// Shape functions:
int N1;
int N2;
int N3;
int N4;
public:
// Default constructor
ElementClass()
{
elemID = numElems;
numElems ;
};
};
PartClass :: PartClass(inHeight, inLength, inWidth, inSeed)
{
HEIGHT = inHeight;
LENGTH = inLength;
WIDTH = inWidth;
SEED = inSeed;
MESHROW = HEIGHT/SEED;
MESHCOL = LENGTH/SEED;
// Dynamically declares an array, gets memory, assigns address to partMesh.
partMesh = new int[MESHROW][MESHCOL];
meshingPart(&partMesh, MESHROW, MESHCOL);
}
void PartClass :: meshingPart(int &partMesh, int inRow, int inCol)
{
for( int i; i < inRow; i )
{
for( int j; j < inCol; j )
{
partMesh[i][j] = ElementClass();
}
}
}
uj5u.com熱心網友回復:
顯示的代碼存在多個問題,而不是一個問題。必須修復所有問題才能解決所有編譯錯誤。
void PartClass :: meshingPart(int &partMesh, int inRow, int inCol)
此類方法的第一個引數被宣告為對單個、lonely 的參考int。它不是陣列,因此此類方法中將其視為陣列的代碼將使您的 C 編譯器非常非常難過。
int *partMesh; //
partMesh = new int[MESHROW][MESHCOL];
partMesh被宣告為指向 an 的指標int。該new運算式有效地生成一個指向MESHCOL整數陣列的指標。在 C 中,您不能將指向陣列的指標轉換為不同型別的指標。
此外,這里顯示的任何內容都不需要new首先使用。partMesh可以簡單地是一個std::vector<vector<int>>,而new被戰略性的取代resize()。作為額外的獎勵,您的 C 程式將在不再需要時自動洗掉所有這些記憶體,不會泄漏它,并在需要時實作正確的復制/移動語意!
meshingPart(&partMesh, MESHROW, MESHCOL);
正如我們已經得出的結論,該函式的第一個引數是對陣列的參考。int將指向的指標的地址傳遞給它也不起作用。
此外,由于partMesh是同一個類的成員,在類中具有一個函式,以某種形式將同一個類的成員傳遞給另一個類的方法,無論如何都是絕對有用的。由于它是同一個類的成員,所以不需要傳遞,類方法可以直接訪問它。畢竟,這就是課程的全部內容。
綜上所述:
導致這些編譯錯誤的 C 型別系統有幾個問題。
new這里甚至不需要使用,來初始化指標,要么需要調整它的型別以反映它是一個指向二維陣列的指標,要么需要調整new陳述句本身來分配一個一維陣列,因為這是 C 唯一允許您轉換為普通指標的東西。甚至這也是過度設計的,因為 astd::vector會自己處理所有這些討厭的細節。甚至不需要將同一個類的成員傳遞給同一個類的方法,作為引數,直接讓類方法訪問即可。
很明顯,生成所示代碼的可能程序是完整地撰寫它,并且只有在撰寫完整個代碼后才嘗試編譯。每次使用這種方法時,幾乎都可以保證出現大量編譯錯誤。一次只寫幾行,測驗它們,確保它們正常作業,然后再寫幾行,這樣撰寫大型程式的效率要高得多。這樣,需要修復的錯誤數量將保持非常少且易于管理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/360383.html
