Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
JIawliet
78 / 78 / 31
Регистрация: 20.07.2016
Сообщений: 331
Завершенные тесты: 2
#1

Задание размера массива на этапе исполнения

13.01.2017, 12:42. Просмотров 923. Ответов 25
Метки нет (Все метки)

Qt 5.4.1, MinGW 32bit... спокойно кушает такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int main ()
{
  int i;
  std::cin >> i;
  int arr[i];
  
  std::cout << "\nOK\n";
 
  return 0;
}
Хочу чтоб программа не компилировалась, как в других нормальных компиляторах) это зависит от настроек или просто MinGW сошел с ума?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2017, 12:42
Ответы с готовыми решениями:

Вычисление размера массива на этапе компиляции
Нашел код который вычисляет размер массива на этапе компиляции Но сам код мне...

Конструктор копирования, аварийное завершение на этапе исполнения
#include &lt;iostream.h&gt; #include &lt;string.h&gt; class String{ private: ...

Ошибка на этапе исполнения при работе с файлами
Здравствуйте, писал прогу по работе с файлами и структурами, наткнулся на такую...

Задание размера массива символов
Доброго времени суток. Суть такая-нужно создать описатель типа MPI, который...

Задание размера и инициализация массива указателей в конструкторе
1) h: SDL_Texture *textures; Как задать размер и инициализировать в...

25
Croessmah
++Ͻ
14489 / 8270 / 1553
Регистрация: 27.09.2012
Сообщений: 20,312
Записей в блоге: 3
Завершенные тесты: 1
13.01.2017, 12:45 #2
Лучший ответ Сообщение было отмечено JIawliet как решение

Решение

Используется расширение VLA.

Добавьте компилятору флаг -pedantic-errors.
1
MrGluck
Модератор
Эксперт CЭксперт С++
8076 / 4928 / 1431
Регистрация: 29.11.2010
Сообщений: 13,352
13.01.2017, 12:45 #3
Цитата Сообщение от JIawliet Посмотреть сообщение
спокойно кушает такой код:
Это называется VLA. gcc (и его порт MinGW) спокойно умеют с ним работать.
Цитата Сообщение от JIawliet Посмотреть сообщение
это зависит от настроек
Да. Добавьте в настройках компилятора флаг -pedantic-errors
warnings demanded by strict ISO C and ISO C++
1
JIawliet
78 / 78 / 31
Регистрация: 20.07.2016
Сообщений: 331
Завершенные тесты: 2
13.01.2017, 14:07  [ТС] #4
Цитата Сообщение от MrGluck Посмотреть сообщение
gcc (и его порт MinGW) спокойно умеют с ним работать.
ну как спокойно, допустим это не работает, если разкомментировать 1 и закомментировать 2:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <random>
#include <algorithm>
#include <functional>
#include <iterator>
 
//=====================================================================================
template <typename T, size_t N>
size_t getSize (const T (&arr)[N])
{ return N; }
 
//=====================================================================================
int main ()
{
  /*
 
  // 1
  int i;
  std::cin >> i;
  int arr[i];
  
  */
 
 
  // 2
  int arr[10];
 
  std::random_device rd;
  std::default_random_engine dre(rd());
  std::uniform_int_distribution<> distr(0, 9);
 
  std::generate(std::begin(arr), std::end(arr), std::bind(distr, dre));
  std::copy(std::begin(arr), std::end(arr), std::ostream_iterator<int>(std::cout, " "));
  std::cout << std::endl;
 
  std::cout << getSize(arr) << std::endl;
 
  return 0;
}
падает на std::begin(), std::end(), getSize().

Croessmah, MrGluck,
а вот еще прикол:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
int main ()
{
  int i = 10;
  delete &i;
  std::cout << "Ok\n";
 
  return 0;
}
это тоже какое-то богомерзкое расширение? потому что все работает
Причем даже с флагом -pedantic-errors.

P.S: даже std::random_device криво работает.. что это за компилятор такой(((
0
Croessmah
++Ͻ
14489 / 8270 / 1553
Регистрация: 27.09.2012
Сообщений: 20,312
Записей в блоге: 3
Завершенные тесты: 1
13.01.2017, 14:10 #5
Цитата Сообщение от JIawliet Посмотреть сообщение
Причем даже с флагом -pedantic-errors.
Ну дык код верный.
Цитата Сообщение от JIawliet Посмотреть сообщение
это тоже какое-то богомерзкое расширение?
С чего бы вдруг? Это UB.

Цитата Сообщение от JIawliet Посмотреть сообщение
падает на std::begin(), std::end(), getSize().
А с чего оно должно нормально работать?
Для std::end и для getSize нужен размер,
причем на этапе компиляции.
Ну и: http://rextester.com/HNFPV71647
0
MrGluck
Модератор
Эксперт CЭксперт С++
8076 / 4928 / 1431
Регистрация: 29.11.2010
Сообщений: 13,352
13.01.2017, 14:23 #6
Цитата Сообщение от JIawliet Посмотреть сообщение
падает на std::begin(), std::end(), getSize().
VLA стоит рассматривать как обёртку над динамическим массивом, а не разновидность статического. Тогда всё встаёт на свои места.

Добавлено через 4 минуты
Цитата Сообщение от JIawliet Посмотреть сообщение
даже std::random_device криво работает
Скажите спасибо, что убрали падение во время выполнения. Теперь просто заглушка стоит.
А что вы ещё хотели от порта? Он лишь даёт возможность использовать gcc под windows, никто не гарантирует полностью рабочий функционал.
На unix системах std::random_device использует значения из /dev/null. На винде этого понятное дело нет, там для ГСЧ используется криптоключи или что-то типо того. Просто никто не стал заморачиваться и писать с нуля ГСЧ под винду.
Если он вам так нужен - возьмите VS. Благо, последние версии стали всё больше фич поддерживать из стандарта.
1
JIawliet
78 / 78 / 31
Регистрация: 20.07.2016
Сообщений: 331
Завершенные тесты: 2
13.01.2017, 14:23  [ТС] #7
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну дык код верный.
На этапе выполнения программа падает в RAD, VS... и как пример - скрин. (в прогу добавил еще строку, но от этого смысл особо не поменялся)

Цитата Сообщение от Croessmah Посмотреть сообщение
А с чего оно должно нормально работать?
Для std::end и для getSize нужен размер,
причем на этапе компиляции.
я об этом и говорю, что
Цитата Сообщение от MrGluck Посмотреть сообщение
gcc (и его порт MinGW) спокойно умеют с ним работать.
спокойно уж точно не работает.
0
Миниатюры
Задание размера массива на этапе исполнения  
MrGluck
Модератор
Эксперт CЭксперт С++
8076 / 4928 / 1431
Регистрация: 29.11.2010
Сообщений: 13,352
13.01.2017, 14:25 #8
Я когда-то сам интересовался данным вопросом:
std::random_device
1
JIawliet
78 / 78 / 31
Регистрация: 20.07.2016
Сообщений: 331
Завершенные тесты: 2
13.01.2017, 14:25  [ТС] #9
Цитата Сообщение от MrGluck Посмотреть сообщение
VLA стоит рассматривать как обёртку над динамическим массивом, а не разновидность статического. Тогда всё встаёт на свои места.
Ок. Пользоваться этим я конечно не буду
0
MrGluck
Модератор
Эксперт CЭксперт С++
8076 / 4928 / 1431
Регистрация: 29.11.2010
Сообщений: 13,352
13.01.2017, 14:26 #10
Цитата Сообщение от JIawliet Посмотреть сообщение
спокойно уж точно не работает.
Я как бы про VLA говорил.

А то, что вы привели - UB, компиляторы вправе делать с ним что хотят (фактически это UB и значит).
0
Croessmah
++Ͻ
14489 / 8270 / 1553
Регистрация: 27.09.2012
Сообщений: 20,312
Записей в блоге: 3
Завершенные тесты: 1
13.01.2017, 14:27 #11
Цитата Сообщение от JIawliet Посмотреть сообщение
На этапе выполнения программа падает
UB - оно такое, фиг его знает что будет.
Цитата Сообщение от JIawliet Посмотреть сообщение
спокойно уж точно не работает.
А Вы зачем барана с козлом пытаетесь скрестить?
0
JIawliet
78 / 78 / 31
Регистрация: 20.07.2016
Сообщений: 331
Завершенные тесты: 2
13.01.2017, 14:32  [ТС] #12
Цитата Сообщение от Croessmah Посмотреть сообщение
А Вы зачем барана с козлом пытаетесь скрестить?
мне дали такой код и говорят, что работает... проверил - действительно работает, а тут уже начал разбираться почему... в любом случаи я таким пользоваться не буду, не по стандарту
0
MrGluck
Модератор
Эксперт CЭксперт С++
8076 / 4928 / 1431
Регистрация: 29.11.2010
Сообщений: 13,352
13.01.2017, 14:33 #13
Цитата Сообщение от Croessmah Посмотреть сообщение
А Вы зачем барана с козлом пытаетесь скрестить?
Из вики:
Гибрид овцы и козы — гибрид, полученный от скрещивания барана с козой или козла с овцой. Домашняя коза принадлежит к роду горных козлов, домашняя овца — к роду баранов. У козы 60 хромосом, а у овцы 54. Потомство, полученное в результате скрещивания, обычно бывает мертворожденным.
Так что всё понятно

Добавлено через 49 секунд
Цитата Сообщение от JIawliet Посмотреть сообщение
не по стандарту
Кстати, в стандарт языка С, а именно С99, их (VLA) включили
0
Croessmah
++Ͻ
14489 / 8270 / 1553
Регистрация: 27.09.2012
Сообщений: 20,312
Записей в блоге: 3
Завершенные тесты: 1
13.01.2017, 14:34 #14
Цитата Сообщение от JIawliet Посмотреть сообщение
мне дали такой код и говорят, что работает...
Компиляторозависимый код.
Дайте им в ответ clang'овые "чудеса":
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//clang 3.7.0
 
#include <iostream>
 
 
int foo()
{
    foo();
    return 10;
}
 
 
int main()
{
    std::cout << foo();
}
http://rextester.com/SBMSE78979
3
JIawliet
78 / 78 / 31
Регистрация: 20.07.2016
Сообщений: 331
Завершенные тесты: 2
13.01.2017, 14:39  [ТС] #15
Цитата Сообщение от Croessmah Посмотреть сообщение
Дайте им в ответ clang'овые "чудеса":
что это такое? как оно вообще работает?) (я про код)
0
Croessmah
++Ͻ
14489 / 8270 / 1553
Регистрация: 27.09.2012
Сообщений: 20,312
Записей в блоге: 3
Завершенные тесты: 1
13.01.2017, 14:44 #16
Цитата Сообщение от JIawliet Посмотреть сообщение
что это такое?
Бесконечная рекурсия (или цикл),
которые не меняют внешнее состояние - UB.
Цитата Сообщение от JIawliet Посмотреть сообщение
как оно вообще работает?
А вот с UB компилятор может творить что угодно.
В данном случае он видит,
что из рекурсии только один выход с результатом 10,
а значит другого результата быть не может,
т.к. код ничего больше не меняет,
то можно всё лишнее выпилить к чертям.
Для примера:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
 
 
int y;
 
void bar(int &x)
{
    x = 10;
}
 
int foo()
{
    int x;
    bar(x);//ok - внешнее состояние не меняется (x локальный для рекурсии), поэтому вся рекурсия - UB
    //bar(y);//error - bar изменяет внешнее состояние, значит не UB и рекурсию удалять не нужно.
    foo();
    return 10;
}
 
 
int main()
{
    std::cout << foo();
}
http://rextester.com/VKTD82878
http://rextester.com/NUCPZ66533
1
JIawliet
78 / 78 / 31
Регистрация: 20.07.2016
Сообщений: 331
Завершенные тесты: 2
13.01.2017, 14:50  [ТС] #17
Цитата Сообщение от Croessmah Посмотреть сообщение
Бесконечная рекурсия (или цикл),
которые не меняют внешнее состояние - UB.
рекурсию я видел, но интересно было как ее компилятор проигнорировал) спасибо за объяснения)
0
hoggy
Заблокирован
Эксперт С++
13.01.2017, 15:05 #18
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну дык код верный.
ub - по определению не верный)

каель жрать отказался.
жосиси - тоже.
и только шланг сожрал и даже не просралсо

Цитата Сообщение от JIawliet Посмотреть сообщение
что это такое? как оно вообще работает?)
это шланг... ))
1
Croessmah
++Ͻ
14489 / 8270 / 1553
Регистрация: 27.09.2012
Сообщений: 20,312
Записей в блоге: 3
Завершенные тесты: 1
13.01.2017, 15:08 #19
Цитата Сообщение от hoggy Посмотреть сообщение
ub - по определению не верный
Для компилятора код верный.
А то что программист фигню написал не рабочую,
ну извините, не компиляторного ума дело.

Цитата Сообщение от hoggy Посмотреть сообщение
жосиси - тоже.
Сожрал же: http://rextester.com/VHMIQL73353


Не по теме:

gcc - жосиси
g++ - жопипи

0
hoggy
Заблокирован
Эксперт С++
13.01.2017, 15:13 #20
Цитата Сообщение от Croessmah Посмотреть сообщение
Для компилятора код верный.
факт успешного билда не является критерием well-formed.
то бишь, успешная сборка не делает код "верным".

Цитата Сообщение от Croessmah Посмотреть сообщение
Сожрал же:
сожрал бы, если бы билд не сыпался.
0
13.01.2017, 15:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2017, 15:13

Размерность статического массива на этапе выполнения
подскажите почему гцц-шный (Code Blocks 16.01) компилятор пропустил такой код,...

Ошибка исполнения при заполнении массива
Программа работы с квадратными матрицами. Используются динамические массивы....

Вывод массива по спирали. Ошибка исполнения.
Дан квадратный массив задаваемой размерности, нужно вывести в ряд его элементы...


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

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

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