Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
29.06.2012, 12:52     Почему таким способом нельзя создать массив? #1
Хочу создать массив вот таким способом, но выскакивает ошибка
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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
29.06.2012, 13:14     Почему таким способом нельзя создать массив? #2
Требуется константа времени компиляции, а не просто константа. sqrt - runtime функция, так что и результат у тебя в рантайме получается. Используй new/delete.
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
29.06.2012, 13:32  [ТС]     Почему таким способом нельзя создать массив? #3
Спасибо, Deviaphan, а то я думал-думал в чем причина. А тут все оказывается в этой функции sqrt()
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
29.06.2012, 15:42     Почему таким способом нельзя создать массив? #4
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;
}
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
29.06.2012, 15:44     Почему таким способом нельзя создать массив? #5
Цитата Сообщение от gooseim Посмотреть сообщение
constexpr
Осталось дождаться широкой поддержки со стороны компиляторов.(
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
29.06.2012, 19:32     Почему таким способом нельзя создать массив? #6
gooseim, не понимаю, sqrt же не constexpr
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
29.06.2012, 20:11     Почему таким способом нельзя создать массив? #7
Цитата Сообщение от 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/b96d56...185c4de9b49595
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
29.06.2012, 20:18     Почему таким способом нельзя создать массив? #8
gray_fox, не показатель. GCC даже переменную пережуёт с помощью VLA-расширения своего. А так он вроде мог вычислять некоторые функции во время компиляции, по-крайней мере strlen. Не знаю, относилось ли это к sqrt.
silent_1991
29.06.2012, 20:24
  #9

Не по теме:

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

grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
29.06.2012, 20:37     Почему таким способом нельзя создать массив? #10
Вроде это builtin функции. И тогда да, sqrt от константы тоже может вычисляться во время компиляции.
http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
Надо эксперимент поставить, делает ли он это при выключенной оптимизации.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
29.06.2012, 20:39     Почему таким способом нельзя создать массив? #11
grizlik78, ну, по крайней мере это особенность реализации, последний стандарт ничего не говорит про constexpr ни для одной перегрузки sqrt. Так что штука непереносимая.
А жаль.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
29.06.2012, 20:42     Почему таким способом нельзя создать массив? #12
Цитата Сообщение от grizlik78 Посмотреть сообщение
GCC даже переменную пережуёт с помощью VLA-расширения своего
Не, не vla, иначе было бы предупреждение (по крайней мере с -pedantic). Я так понимаю sqrt по стандарту не constexpr, но никто не запрещает сделать её таковой, если это возможно.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
29.06.2012, 20:43     Почему таким способом нельзя создать массив? #13
gray_fox, если стандарт не определяет этого, то такой код не будет переносимым.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2012, 20:47     Почему таким способом нельзя создать массив?
Еще ссылки по теме:

Почему нельзя подставлять переменные в выражения #if #else? C++
C++ Почему нельзя написать просто - using namespace boost;
C++ Почему два char нельзя сравнивать так ==?

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
29.06.2012, 20:47     Почему таким способом нельзя создать массив? #14
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
Yandex
Объявления
29.06.2012, 20:47     Почему таким способом нельзя создать массив?
Ответ Создать тему
Опции темы

Текущее время: 21:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru