2010-10-11 1 views
4

Я создал массив переменной длины в одной функции, однако мне нужно обратиться к этому массиву во второй функции. Проблема возникает, когда я помещаю объявление выше main(), поскольку его длина еще не определена, мой компилятор злится.Есть ли способ сделать массив переменной длины глобальным в C++?

Как обычно об этом идет речь?

EDIT:

Вот мой код до сих пор.

Мне нужно сделать имя массива [] 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; 
} 
+3

C++ не имеет массивов переменной длиной. Возможно, вы используете C? –

+2

C99, но у меня возникает соблазн сказать, что он имеет в виду что-то другое. @Anteater: Можем ли мы увидеть образец кода, пожалуйста? – EboMike

+0

«Это все еще неряшливо, так как я его разрабатываю». Во-первых, если вы правильно отформатируете свой код, даже при его разработке, это может значительно сократить время, затрачиваемое на отладку. Во-вторых, это показывает полное отсутствие уважения к людям здесь, которые хотят помочь ответить на ваш вопрос, когда вы не забираете две минуты, прежде чем размещать вопрос для форматирования кода и упрощения его чтения. –

ответ

13

C++ не поддерживает массивы переменной длины; либо вы не используете C++, либо используете языковое расширение для конкретной реализации.

В C++ вы должны использовать std::vector для массива с динамическим размером.

Если вам необходимо получить доступ к ним из нескольких функций, которые вы можете:

  • имеет функции, которые требуют доступа к vector взять ссылку на него в качестве аргумента или
  • сделать vector член класса переменную и сделать все функции, которые должны получить к ней функции-члены класса.

Какой смысл имеет смысл, зависит от того, что именно вы пытаетесь сделать.

+0

@james Не могли бы вы объяснить, что «C++ не поддерживает VLA, но компилятор разрешает его как расширение». Я понимаю, что C++ не поддерживает VLA, но следующий statemet вы можете объяснить немного больше? –

+1

@Als: Что именно нуждается в дальнейшем объяснении? C++ не поддерживает VLA. C99 делает. Если OP фактически использует C++ _and_ VLAs, то его компилятор должен поддерживать VLA как расширение языка. –

+0

Я использую Bloodshed Dev-C++ для справки. – rectangletangle

3

Что не так с std::vector? Вы не можете иметь VLA в C++ (g ++ предоставляет его как расширение, хотя).

1

Посмотрите на векторы, потому что, хотя вы можете в c, в стандартном C++, нет возможности использовать массивы переменной длины.

Также обратите внимание на новую IDE, отличную от кровопролития, такую ​​как Code :: Blocks или, если необходимо, по крайней мере, более новую версию Dev C++, чем кровопролитие.

  1. Dev-C++ не обновлялся с 2005 года, и в настоящее время не поддерживается . Программное обеспечение очень плохое. Во время моего написания существует 340 известных ошибок, которые никогда не будут исправлены.

  2. Трудно получить помощь, потому что сообщество разработчиков перешло к более новому программному обеспечению.

  3. В Dev-C++ отсутствуют функции, которые присутствуют в более современных решениях. Код завершение, intellisense и надлежащие средства отладки (среди другие) не предоставляются. Эти инструменты могут значительно улучшить рабочий процесс и эффективность опытного программиста и могут помочь узнать о новичках в .

  4. Сообщения об ошибках и шаги, необходимые для решения их плохо документированы по сравнению с более современными решениями и , потому что большинство программистов перешли от Dev-C++ это может быть трудно (если не невозможно), чтобы найти тех, кто может помочь вам. Некоторые проблемы не могут быть решены вообще. Компилятор , входящий в состав Dev-C++, очень устарел, и глючит. Устаревший компилятор может привести к ошибкам и неэффективному коду и может привести к повреждению в процессе обучения для новичков.

  5. Представленная система «devpack» больше не поддерживается современными библиотеками. Использование внешних библиотек в Dev-C++ может быть запутанным и трудным процессом для начинающих, которые ожидают, что эта простая система будет обрабатывать их для них.

Примечание: начинающие вещи не прямо указывали на вас, это было взято отсюда: http://clicktobegin.net/programming/why-you-shouldnt-use-dev-c/