Другие языки программирования и технологии

Почему требует константу? С++

Требует что-бьі end бьіла константой, в 3х строках где long. Что я не так сделал понять не могу
codepad. org/73qvtffI - код в нормальном виде. (пробел после org)

#include "stdafx.h"
#include <iostream>
#include "math.h"
#include <conio.h>
#include <stdio.h>

using namespace std;
int main(){
cout << "This program solves an example of Newton's cooling law:\n";
cout << "T'(t) = -r[T(t) - E], where T is the temperature of the cooling\n";
cout << "object, t is time, r governs the rate of cooling and E is\n";
cout << "ambient temperature.\n";
long double E = 0;
cout << "\nPlease input a value for E:\n> ";
cin >> E;
long double r = 0;
cout << "\nPlease input a value for r:\n>> ";
cin >> r;
long double T0 = 0;
cout << "\nPlease input a value for T(0)\n> ";
cin >> T0;
long double dt = 0;
cout << "\nPlease input a value for the time interval, dt, in seconds : \n> ";
cin >> dt;
int end = 0;
cout << "\nPlease input the number of intervals to calculate : \n> ";
cin >> end;
long double TPrime[end + 2];
long double Temp[end + 2];
long double Time[end + 2];
Time[1] = 0;
TPrime[1] = -r*(T0 - E); // TPrime is the ~derivative of T.
Temp[1] = T0;
for (int i = 1; i<end + 2; i++) {
TPrime[i + 1] = -r*(Temp[i] - E);
Temp[i + 1] = Temp[i] + TPrime[i + 1] * dt;
Time[i + 1] = Time[i] + dt;
cout << Time[i] << "\t" << Temp[i] << endl;
}
return 0;
}
const int buffer = 1024;
long double TPrime[buffer], Temp[buffer], Time[buffer];
int end;
cout << "\nPlease input the number of intervals to calculate : \n> ";
cin >> end;
end += 2;
Time[1] = 0;
TPrime[1] = -r*(T0 - E); // TPrime is the ~derivative of T.
Temp[1] = T0;
for (int i = 1; i < end + 2; i++) {
TPrime[i + 1] = -r*(Temp[i] - E);
Temp[i + 1] = Temp[i] + TPrime[i + 1] * dt;
Time[i + 1] = Time[i] + dt;
cout << Time[i] << "\t" << Temp[i] << endl;
}
// но от этого ваша программа всё-равно будет работать не так как вы рассчитываете?
// вы что-нибудь о нулевом индексе массива слышали?
Александр Петров
Александр Петров
77 244
Лучший ответ
Всё из-за того, что он используется как константа в объявлении переменных TPrime, Temp и Time. Компилятор не может подставить заранее неизвестное число на место end и, следовательно, задать размерность массивов.
ММ
Макс Махлов
53 559
C++ по стандарту не допускает массивов VLA (Variable Length Array). Длина статических массивов может в нем быть задана только константным выражением.
Асет Нурпеисов
Асет Нурпеисов
84 717
Sergei Goplov Уже 3 года, как допускает, вообще-то, но тут явно старый компилятор (или в режиме совместимости с C++98).
Асет Нурпеисов Насколько я читал, в стандарте C++11 требование поддержки VLA отсутствует. В лучшем случае она допускается только опционально по желанию разработчика компилятора. Например,
https://groups.google.com/forum/#!topic/comp.std.c/AoB6LFHcd88
Ее нет даже в стандарте C++14, хотя там решили придумать новый класс dynarray:
http://blog.smartbear.com/development/a-glimpse-into-c14/
Используй динамический массив. Статика работает только с константными значениями.
У Вас такая стадия, где std::vector использовать не запрещено. По идее.

codepad .org/cd5EsJG0

Вот Вам unified diff с фиксом. Не потеряли бы хэдэры на кодпаде, было бы еще короче. Фикс минимальный, правил только то, про что сказали. И выкинул виндовые хэдэры, просто потому что у меня их нет: -)
Александр Горчаков Если не врубились в diff, то вот изменения:

И #include <vector> в начале еще. Нулевой индекс - отдельная тема, он что в массиве с нуля считается, что в векторе, разницы нет. Но Вы про это пока не спросили.

long double* TPrime;
TPrime = (long double*)malloc((end + 2)*sizeof(long double));
Rr Kk
Rr Kk
10 928
это выглядит примерно как отведи мне в стеке столько-то памяти, сколько пока не знаю, но ты же компилятор-придумай там чо-нить..