#c #c #arrays
#c #c #массивы
Вопрос:
const int num = 16;
struct inputs{
double X1[num];
double X2[num];
};
Выдает ошибку:
ошибка: изменено значение ‘X1’ в области действия файла
То же самое было верно для ‘X2’.
Но я помню, что вышесказанное подходит для C , вышесказанное в порядке (возможно, я ошибочно принимаю за C ).
Кто-нибудь может прояснить это для меня?
Ответ №1:
Я могу указать вам на часто задаваемые вопросы по C: я не понимаю, почему я не могу использовать значения const в инициализаторах и измерениях массива.
В основном это говорит о том, что num
это не истинная константа, она доступна только для чтения. Чтобы получить истинную константу, вам понадобится #define num 16
.
Также на этой странице: C отличается от C в этом отношении.
Ответ №2:
Да, разница есть. В C const
переменная по-прежнему не рассматривается как истинная константа времени компиляции (официально она не является частью a constant expression
), поэтому это запрещено. Обратите внимание, однако, что, хотя C не требует, чтобы компилятор разрешал это, стандарт дает разрешение реализации принимать другие формы постоянных выражений, поэтому она может принять это, если захочет.
В C const
переменная рассматривается как константа, поэтому она разрешена.
Интересно, что примерно наоборот, когда вы используете значение, переданное в качестве параметра функции:
void f(int size) {
int array[size];
}
Это разрешено в C, но не в C . Это variably modified
массив; сообщение об ошибке, которое вы получаете, в основном пытается сообщить вам, что они разрешены только внутри функций.
Комментарии:
1. В C вы можете передать размер массива функции? Узнал ! Спасибо!
2. @Rich: да, но только если ваш компилятор соответствует C99 (по крайней мере, в этом отношении) — это не было включено в C89 / 90 (хотя это было довольно распространенное расширение даже для старых компиляторов).
Ответ №3:
Не в структуре. Вы можете сделать это в локальной области.
Комментарии:
1. Даже для C? Согласно другим ответам, это невозможно для C. может быть, нормально для C ?
2. Я бы доверял Адаму, потому что я не помню точных стандартов. Его версия звучит правдоподобно.
Ответ №4:
В C константы времени компиляции могут использоваться как длины в объявлениях массивов, а const
переменные (только некоторые из них) могут быть константами времени компиляции. Вот почему это будет работать на C .
C, однако, имеет функцию, которая выглядит аналогично, массив переменной длины. Это означает, что вы можете использовать любое целочисленное выражение (даже вычисляемое во время выполнения) в качестве длины массива, но только для локальных переменных. Вот почему ваш компилятор жалуется на «изменяемый ‘X1’ в области действия файла«.
Ответ №5:
Вы должны использовать постоянное значение. Поэтому в C вы должны использовать a #define
в этом отношении. Для C это было бы нормально.
Используйте это вместо:
#define num 16
struct inputs{
double X1[num];
double X2[num];
};
Комментарии:
1. Неудачный выбор слова, означал уважение.
Ответ №6:
Как уже говорилось другими, C и C отличаются в отношении постоянных целочисленных выражений.
Но вам не нужно использовать макрос, как предлагали другие, чтобы иметь код, который работает с обоими. Если вы хотите сделать это с помощью «scope», вы можете сделать это с помощью константы перечисления. Что-то вроде
enum { num = 16 };
struct inputs {
double X1[num];
double X2[num];
};
будет работать для обоих, независимо от того, помещаете ли вы это в область действия файла или функции.