Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
#1

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

29.06.2012, 12:52. Просмотров 625. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2012, 12:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему таким способом нельзя создать массив? (C++):

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

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

Почему break нельзя использовать в if? - C++
почему break нельзя использовать в if вот код if(f.eof()==1) { break; } про break MVS говорит что ОПЕРАТОР break...

Почему нельзя подставлять переменные в выражения #if #else? - C++
Почему код работает, не должен же, потому что выражение стоящее после #if вычисляется на этапе компиляции, переменные подставлять нельзя?? ...

Почему в switch нельзя определять переменные? - C++
int main() { setlocale(LC_ALL, "Russian"); int n; std::cout << "Введите число: "; std::cin >> n; switch...

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

13
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
29.06.2012, 13:14 #2
Требуется константа времени компиляции, а не просто константа. sqrt - runtime функция, так что и результат у тебя в рантайме получается. Используй new/delete.
1
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
29.06.2012, 13:32  [ТС] #3
Спасибо, Deviaphan, а то я думал-думал в чем причина. А тут все оказывается в этой функции sqrt()
0
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
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;
}
1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
29.06.2012, 15:44 #5
Цитата Сообщение от gooseim Посмотреть сообщение
constexpr
Осталось дождаться широкой поддержки со стороны компиляторов.(
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
29.06.2012, 19:32 #6
gooseim, не понимаю, sqrt же не constexpr
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 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/b96d560c7d4cd81af8185c4de9b49595
0
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
29.06.2012, 20:18 #8
gray_fox, не показатель. GCC даже переменную пережуёт с помощью VLA-расширения своего. А так он вроде мог вычислять некоторые функции во время компиляции, по-крайней мере strlen. Не знаю, относилось ли это к sqrt.
0
silent_1991
29.06.2012, 20:24
  #9

Не по теме:

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

0
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
29.06.2012, 20:37 #10
Вроде это builtin функции. И тогда да, sqrt от константы тоже может вычисляться во время компиляции.
http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
Надо эксперимент поставить, делает ли он это при выключенной оптимизации.
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
29.06.2012, 20:39 #11
grizlik78, ну, по крайней мере это особенность реализации, последний стандарт ничего не говорит про constexpr ни для одной перегрузки sqrt. Так что штука непереносимая.
А жаль.
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
29.06.2012, 20:42 #12
Цитата Сообщение от grizlik78 Посмотреть сообщение
GCC даже переменную пережуёт с помощью VLA-расширения своего
Не, не vla, иначе было бы предупреждение (по крайней мере с -pedantic). Я так понимаю sqrt по стандарту не constexpr, но никто не запрещает сделать её таковой, если это возможно.
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
29.06.2012, 20:43 #13
gray_fox, если стандарт не определяет этого, то такой код не будет переносимым.
1
grizlik78
Эксперт С++
1966 / 1459 / 120
Регистрация: 29.05.2011
Сообщений: 3,018
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
1
29.06.2012, 20:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2012, 20:47
Привет! Вот еще темы с ответами:

Почему нельзя объявить указатель на шаблонную структуру? - C++
template &lt;class T&gt; typedef struct per { T znach; int kol_vo_povt; }* p; int main() { per&lt;int&gt; k; }

Почему нельзя компилировать отдельный заголовочный файл? - C++
Вообще можно весь код поместить в один .cpp файл. Но, как я понимаю, люди советуют все функции помещать в отдельные заголовочные файлы. А...

Почему нельзя написать просто - using namespace boost; - C++
Доброго времени суток. В общем, есть программа, в которой я использую тип cpp_int. Вроде его объявление содержится в заголовочном файле...

Почему нельзя выделить статически кусок в ~100 MB? - C++
Есть код #include &lt;iostream&gt; using namespace std; enum { length = 256, count = 50 }; struct Town { char name =...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru