繁体   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