Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
68 / 68 / 18
Регистрация: 03.06.2012
Сообщений: 176

Почему таким способом нельзя создать массив?

29.06.2012, 12:52. Показов 1480. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хочу создать массив вот таким способом, но выскакивает ошибка
error C2057: требуется константное выражение. Ведь у меня и так константа!?
C++
1
2
3
4
5
6
7
8
9
10
#include "stdafx.h"
#include "iostream"
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    short arr[ int(sqrt(16.0)) ];
 
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.06.2012, 12:52
Ответы с готовыми решениями:

Почему нельзя так объявить двумерный массив?
Ошибка возникает если для массива tempArray при объявлении(и одновременной инициализации) использовать переменную(size) которую принимает...

Почему нельзя объявить динамический массив глобально
вот код #include <iostream> #include <string> int w = 0; string *s = new string ; using namespace std; int main { ...

Найти номер счета который нельзя будет получить из цифр числа X заданным способом
Ограничение по времени, сек 2 Ограничение по памяти, мегабайт 64 Банк «Кисловодск» переходит на новый вид банковских карт. Для этого...

13
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
29.06.2012, 13:14
Требуется константа времени компиляции, а не просто константа. sqrt - runtime функция, так что и результат у тебя в рантайме получается. Используй new/delete.
1
68 / 68 / 18
Регистрация: 03.06.2012
Сообщений: 176
29.06.2012, 13:32  [ТС]
Спасибо, Deviaphan, а то я думал-думал в чем причина. А тут все оказывается в этой функции sqrt()
0
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
29.06.2012, 15:42
C++
1
2
3
4
5
6
7
8
9
10
11
#include "stdafx.h"
#include "iostream"
using namespace std;
constexpr int getArrSize() {return std::sqrt(16.0);}
 
int _tmain(int argc, _TCHAR* argv[])
{
    short arr[ getArrSize() ];
 
    return 0;
}
1
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
29.06.2012, 15:44
Цитата Сообщение от gooseim Посмотреть сообщение
constexpr
Осталось дождаться широкой поддержки со стороны компиляторов.(
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
29.06.2012, 19:32
gooseim, не понимаю, sqrt же не constexpr
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
29.06.2012, 20:11
Цитата Сообщение от silent_1991 Посмотреть сообщение
е понимаю, sqrt же не constexp
Видимо всё-таки constexpr, по крайней мере g++ жуёт такое:
C++
1
2
3
4
5
6
#include <cmath>
 
 
int main() {
   int vector[static_cast<std::size_t>(std::sqrt(16.))];
}
http://liveworkspace.org/code/... 4de9b49595
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
29.06.2012, 20:18
gray_fox, не показатель. GCC даже переменную пережуёт с помощью VLA-расширения своего. А так он вроде мог вычислять некоторые функции во время компиляции, по-крайней мере strlen. Не знаю, относилось ли это к sqrt.
0
29.06.2012, 20:24

Не по теме:

grizlik78, не уж то интерпретирует О_о

0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
29.06.2012, 20:37
Вроде это builtin функции. И тогда да, sqrt от константы тоже может вычисляться во время компиляции.
http://gcc.gnu.org/onlinedocs/... ltins.html
Надо эксперимент поставить, делает ли он это при выключенной оптимизации.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
29.06.2012, 20:39
grizlik78, ну, по крайней мере это особенность реализации, последний стандарт ничего не говорит про constexpr ни для одной перегрузки sqrt. Так что штука непереносимая.
А жаль.
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
29.06.2012, 20:42
Цитата Сообщение от grizlik78 Посмотреть сообщение
GCC даже переменную пережуёт с помощью VLA-расширения своего
Не, не vla, иначе было бы предупреждение (по крайней мере с -pedantic). Я так понимаю sqrt по стандарту не constexpr, но никто не запрещает сделать её таковой, если это возможно.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
29.06.2012, 20:43
gray_fox, если стандарт не определяет этого, то такой код не будет переносимым.
1
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
29.06.2012, 20:47
C++
1
2
3
4
5
6
#include <cmath>
 
int main()
{
    return static_cast<int>(sqrt(16.0));
}
$ g++ -O3 -S testsqrt.cpp
Assembler
1
2
3
4
5
6
main:
.LFB88:
    .cfi_startproc
    movl    $4, %eax
    ret
    .cfi_endproc
$ g++ -O0 -S testsqrt.cpp
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
main:
.LFB85:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $4, %eax
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
Добавлено через 36 секунд
От вызова sqrt не осталось и следа

Добавлено через 2 минуты
А так есть:
$ g++ -fno-builtin -O3 -S testsqrt.cpp
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
main:
.LFB88:
    .cfi_startproc
    subq    $8, %rsp
    .cfi_def_cfa_offset 16
    movsd   .LC0(%rip), %xmm0
    call    sqrt
    addq    $8, %rsp
    .cfi_def_cfa_offset 8
    cvttsd2si   %xmm0, %eax
    ret
    .cfi_endproc
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.06.2012, 20:47
Помогаю со студенческими работами здесь

Почему нельзя создать шаблонный массив?
public &lt;T&gt; T remove(T symbols, int index) { if (index &gt;= 0 &amp;&amp; index &lt; symbols.length) { ...

Почему не получается открыть файл на запись таким способом?
В конечном итоге, в файл не записывается ничего(компилируется и завершается нормально), объясните пожалуйста механизм работы, это бы мне...

Почему нельзя создать трёхмерный невыровненный массив?
Объясните, пожалуйста почему нельзя создать трёхмерный невыровненный массив, ошибку выдаёт пр попытке заполнить вторую размерность ошибка:...

Почему нельзя инициализировать словарь таким образом?
Dictionary&lt;char, int&gt; d2 = new Dictionary&lt;char, int&gt;() {new KeyValuePair&lt;char, int&gt;('a', 1), ...

Почему нельзя создать массив generic объектов с определёнными параметрами типов?
Почему нельзя создать массив generic объектов с определёнными параметрами типов? К примеру, почему вот эта строчка запрещена? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru