параметр постоянной функции в качестве размера статического массива?

0

Я не совсем уверен, почему это не работает

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 спасибо!

Теги:
arrays
static
const

2 ответа

0

Аргумент const int a аргументом "только для чтения". Это не обязательно значение, которое компилятор знает во время компиляции. Однако вы можете использовать аргумент шаблона.

template <int N = 42>
void foo() {
    int myArray[N];
}

Однако C разрешает то, что вы там написали, C++ не будет, но будет в C++ 14 с " std::dynarray ".

0

Не перепутать const квалифицирован и постоянной.

const просто говорит, что вы не имеете права изменять переменную.

В C++, если переменная const, также являющаяся константой времени компиляции, будет разрешена. Здесь это параметр для функции, поэтому компилятор не знает, какое значение оно заменило бы во время компиляции.

В C все по-другому. В современном C, то есть C с 1999 года, допускаются массивы переменной длины с такими значениями, которые известны только во время выполнения. К сожалению, все еще есть компиляторы C, которые не соответствуют C99. Среди них AFAIR micorsoft.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню