【问题标题】:Is there any way to make a variable length array global in c++?有没有办法在 C++ 中使可变长度数组成为全局变量?
【发布时间】:2011-04-23 15:01:31
【问题描述】:

我在一个函数中创建了一个可变长度数组,但是我需要在第二个函数中引用这个数组。当我将声明放在 main() 上方时,会出现问题,因为它的长度尚未定义,我的编译器很生气。

通常如何处理这件事?

编辑:

这是我目前的代码。

我需要将数组的 name[] midterm[] 和 final[] 设为全局。它们都在 student_input() 中。

#include <iostream>
using namespace std ;

void student_input();
void student_output();

int i , ns ;

main(){

    int width,height,mult;

    cout << "Enter the number of students:" << endl;
    cin >> ns;

    i = 0 ;
    while( i < ns){
           i = i + 1 ;
           student_input();
           }

    i = 0 ;
    while( i < ns){
           i = i + 1 ;
           student_output();
           }

    system("pause");  
}

void student_input() {
    int si_i,si_midterm,si_final, midterm[ns + 1], final[ns + 1];
    string si_name, name[ns + 1]; 

    cout <<  endl <<  endl << "\t----- Student " << i << " -----" << endl << endl << endl;

    cout << "Enter name for student " << i << ":\t"<< endl;
    cin >> si_name;
    name[i] = si_name ; 

    cout << "Enter midterm score for student " << i << ":\t"<<  endl;

    cin >> si_midterm;
    midterm[i] = si_midterm ;

    cout << "Enter final exam score for student " << i << ":\t"<<  endl ;
    cin >> si_final;
    final[i] = si_final ;

    cout <<  endl <<  endl;

    si_i = 0 ;
    while (si_i < 7){
          si_i = si_i + 1; 
          cout << "Enter lab " << si_i <<" for student " << i << ":\t"<<  endl;
          }

    cout << name[i] <<  endl << midterm[i] <<  endl<<final[i] <<  endl;      
    return;
}

void student_output() {
    cout <<"hello! "<<  endl;
    return;
}

【问题讨论】:

  • C++ 没有可变长度数组。也许您正在使用 C?
  • C99 确实如此,但我很想说他指的是别的东西。 @Anteater:我们可以看看代码示例吗?
  • “我在开发它仍然很草率。”首先,如果你正确地格式化你的代码,即使是在开发它的时候,它也可以帮助你显着减少你花在调试上的时间。其次,当您在发布问题之前没有花两分钟时间来格式化您的代码并使其易于阅读时,这表明对这里想要帮助回答您问题的人完全缺乏尊重。
  • 好的,我会清理它,我的意思是在许多测试行和最终脚本中不会出现的东西中的草率。
  • 这一行 name[ns + 1]; 在 C++ 中格式不正确。您应该使用std::vector,VLA 不在 C++ 中。您的编译器允许它作为扩展。

标签: c++ arrays function global-variables


【解决方案1】:

C++ 不支持变长数组;要么您没有使用 C++,要么您使用的是特定于实现的语言扩展。

在 C++ 中,您应该将 std::vector 用于动态大小的数组。

如果您需要从多个功能中访问它,您可以:

  • 让需要访问vector 的函数将引用它作为参数,或者
  • vector 设为类成员变量,并将所有需要访问它的函数设为类的成员函数。

哪一个更有意义取决于您到底想要做什么。

【讨论】:

  • @james 你能解释一下,“C++ 不支持 VLA,但编译器允许它作为扩展”我明白 c++ 不支持 VLA,但是下面的声明你能解释一下吗?
  • @Als:究竟有什么需要进一步解释的? C++ 不支持 VLA。 C99 可以。如果 OP 实际上使用 C++ VLA,那么他的编译器必须支持 VLA 作为语言扩展。
  • 我用的是Bloodshed Dev-c++,供参考。
  • @James:如果 C++ 标准不支持 VLA,那么为什么应该遵循标准的编译器支持这样的扩展?是否应该允许标准和编译器实现之间存在这种差异?
  • @Als:大多数(全部?)编译器支持非标准语言扩展,很少(不是?)编译器完全遵守语言标准。如果可以关闭或默认关闭,我对语言扩展没有问题。
【解决方案2】:

std::vector 有什么问题?您不能在 C++ 中拥有 VLA(尽管 g++ 将其作为扩展提供)。

【讨论】:

    【解决方案3】:

    查看向量,因为虽然你可以在 c 中,但在标准 c++ 中没有办法使用可变长度数组。

    另外,请查看除 Bloodshed 之外的新 IDE,例如 Code::Blocks,或者如有必要,至少使用比 Bloodshed 更新的 Dev c++ 版本。

    1. Dev-C++ 自 2005 年以来未更新,目前未更新 保持。软件漏洞很大。在我写作的时候 有 340 个永远无法修复的已知错误。

    2. 很难获得帮助,因为编程社区已经转向更新的软件。

    3. Dev-C++ 缺少更现代的解决方案中存在的功能。代码 完成、智能感知和适当的调试工具(在 其他)不提供。这些工具可以大大提高 经验丰富的程序员的工作流程和效率,并可能有助于 初学者的学习。

    4. 错误消息和解决所需的步骤 与更现代的解决方案相比,它们的文档记录很少,并且 因为大多数程序员已经从 Dev-C++ 很难(如果不是不可能的话)找到能够帮助您的人。 有些问题可能根本无法解决。编译器 包含在 Dev-C++ 中的是非常过时的,并且有缺陷。一个过时的 编译器可能会导致错误和低效的代码,并且可能会造成破坏 到初学者的学习过程。

    5. 提供的“devpack”系统 现代图书馆不再支持。使用外部库 对于初学者来说,在 Dev-C++ 中学习可能是一个令人困惑和困难的过程 期待这个简单的系统为他们处理。

    注意:初学者的东西不直接指向你,这是从这里截取的:http://clicktobegin.net/programming/why-you-shouldnt-use-dev-c/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-31
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多