Я не совсем уверен, почему это не работает
void foo(const int a=10){
const int b = 10;
int c[a];
int d[b];
}
Я думал, что я говорю компилятору, что константа a - я даже говорю, что значение по умолчанию - 10 :).
Почему он кричит:
1>sum_floats_txt.cpp(105): error C2057: expected constant expression
1>sum_floats_txt.cpp(105): error C2466: cannot allocate an array of constant size 0
1>sum_floats_txt.cpp(105): error C2133: 'c' : unknown size
Я знаю, что мне это говорит, но я не знаю, как делать то, что я хочу делать: - функция со статическим массивом внутри размера, зависящим от внешней константы. Функция подсчитывает что-то и возвращает время, затраченное на выполнение (выполнение этого в RTOS).
Поэтому я хочу назвать эту функцию различными параметрами из main. Чтобы узнать, для какого параметра он выполняет кратчайший.
Проблема в том, как работают статические массивы? Он должен иметь постоянный размер во время компиляции. Поэтому для разных статических массивов я должен определить их больше.
Возможным решением является создание большего количества функций или более статических массивов с предопределенными различными размерами. И называть их один за другим, но есть тысячи разных размеров.
Я не хочу делать неавтоматизированную итерацию, чтобы получить лучшие параметры! Могут ли аргументы из main передаваться функции перед выполнением справки?
VS2010 + RTX64 2013 (не должно быть проблемой) win7 спасибо!
Аргумент const int a
аргументом "только для чтения". Это не обязательно значение, которое компилятор знает во время компиляции. Однако вы можете использовать аргумент шаблона.
template <int N = 42>
void foo() {
int myArray[N];
}
Однако C разрешает то, что вы там написали, C++ не будет, но будет в C++ 14 с " std::dynarray
".
Не перепутать const
квалифицирован и постоянной.
const
просто говорит, что вы не имеете права изменять переменную.
В C++, если переменная const
, также являющаяся константой времени компиляции, будет разрешена. Здесь это параметр для функции, поэтому компилятор не знает, какое значение оно заменило бы во время компиляции.
В C все по-другому. В современном C, то есть C с 1999 года, допускаются массивы переменной длины с такими значениями, которые известны только во время выполнения. К сожалению, все еще есть компиляторы C, которые не соответствуют C99. Среди них AFAIR micorsoft.