簡體   English   中英

如何在不同的 function 中訪問存儲在動態 memory 中的變量?

[英]How can I access variables stored in the dynamic memory in a different function?

所以我做了一小段代碼,詢問用戶數組的大小和數組的內容(按順序),並在動態 memory(堆?)中創建數組。

void leesgetallen() {
    int *n = new int();
    cout << " Wat is de lengte van de Array?" << endl;
    cin >> *n;
    int g;
    int *A = new int[*n];
    cout << "Geef de getallen van de Array in stijgende volgorde." << endl;
    for (int i = 0; i < *n; i++) {
        cout << "Geef getal nummer " << i << " :";
        cin >> g;
        A[i] = g;
    }
    cout << "Ter controle, dit is de ingegeven Array: ";
    for (int *pa = A; pa != A + *n; pa++) {
        cout << *pa << " ";
    }
}

就其本身而言,這非常有效。

但是,當我嘗試使用該數組 (A) 和所述數組的大小 (*n) 時,它無法識別 A 和 *n。 我不太明白如何使用這些變量,就我的理解而言,如果它們在動態 memory 中它們應該是全局的?

我需要訪問它們的原因是因為我想使用不同的 function 來計算輸入數組的平均值。

像這樣。

int gem(int a[], int n) {
    int som = 0;
    for (int *pa = a; pa != a + n; pa++) {
        som += *pa;
    }
    int gemiddelde = som / n;
    cout << "Het gemiddelde van deze array is: " << gemiddelde << endl;
    return gemiddelde;
}


void leesgetallen() {
    int *n = new int();
    cout << " Wat is de lengte van de Array?" << endl;
    cin >> *n;
    int g;
    int *A = new int[*n];
    cout << "Geef de getallen van de Array in stijgende volgorde." << endl;
    for (int i = 0; i < *n; i++) {
        cout << "Geef getal nummer " << i << " :";
        cin >> g;
        A[i] = g;
    }
    cout << "Ter controle, dit is de ingegeven Array: ";
    for (int *pa = A; pa != A + *n; pa++) {
        cout << *pa << " ";
    }
}


int main() {
    leesgetallen();
    gem(A, *n);
    delete *n;
    delete[] A;
}

誰能幫我嗎?

ps:所有文字都是荷蘭語,但我希望這並不重要。

從 function 內部與調用者/外部通信的主要方式:

  • return變量。 無論如何,這就是函數的意義所在。 您可以使用std::tuple<>返回多個變量,或者簡單地為返回類型聲明一個結構(對於復雜類型來說是首選)。

  • 使其成為成員 function 並更新它所應用的 object。

  • 使用 output 參數(例如int*& A )。 這通常比返回變量更不受歡迎; 過去,以這種方式返回例如狀態碼是很常見的。

  • 更新一個全局變量(通常是static變量)

  • 調用處理結果的 function。 這可能只是更新全局,或做其他事情。 處理 function 在您的 function 中是已知的,或者作為模板傳遞給它(或在某些情況下,function 指針/ std::function<> )參數。 模板參數的好處是您不需要提前知道類型(例如intlong )。 以這種方式實現工廠很常見。 當它是 function 中的最后一次調用時,它被稱為繼續傳遞。

  • 更新環境(例如文件或其他外部)。 這在可能有多個代碼實例一起工作的大型系統中特別有用,但也比其他方法慢幾個數量級(對於您的實際線程)。

請注意,變量不會因為它們是動態分配的而全局可見。 您仍然需要選擇一種方法讓它們對調用者(或您將使用它們的代碼的其他部分)可見。

new int[*n]創建新的全局(某種意義上)未命名數組,並返回指向其開頭的指針。 該指針是訪問該數組的唯一方法。 但是您存儲它的變量Aleesgetallen的本地變量,因此只能從所述 function 訪問。 為了克服這個問題,例如,您可以在main中定義An ,並將對這些變量的引用(或指針)傳遞給leesgetallen (或者,正如@lorro 所建議的那樣,在一個元組中返回它們的值)

另請注意, n不需要動態分配,因為您肯定知道它對於您的整個程序來說恰好是一個int

謝謝大家,我找到了解決方案。 並且更多地了解動態分配和 memory 管理。

這是供將來參考的解決方案。

int gem(int a[], int n) {
    int som = 0;
    for (int *pa = a; pa != a + n; pa++) {
        som += *pa;
    }
    int gemiddelde = som / n;
    cout << "Het gemiddelde van deze array is: " << gemiddelde << endl;
    return gemiddelde;
}


void leesgetallen(int *n, int *A) {
    cout << " Wat is de lengte van de Array?" << endl;
    cin >> *n;
    int cn = *n;
    cout << "controle: n = " << *n << endl;
    int g = 0;
    cout << "Geef de getallen van de Array in stijgende volgorde." << endl;
    for (int i = 0; i != cn; i++) {
        cout << "Geef getal nummer " << i + 1 << " :";
        cin >> g;
        A[i] = g;
    }
    cout << "Ter controle, dit is de ingegeven Array: " << endl;
    for (int *pa = A; pa != A + *n; pa++) {
        cout << *pa << " ";
    }
    cout << endl;
}


int main() {
    int n = 0;
    int *A = new int[n];
    leesgetallen(&n, A);
    gem(A, n);
    delete[] A;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM