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

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

Войти
Регистрация
Восстановить пароль
 
 
JIawliet
77 / 77 / 18
Регистрация: 20.07.2016
Сообщений: 302
Завершенные тесты: 2
#1

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

13.01.2017, 12:42. Просмотров 402. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задание размера массива на этапе исполнения (C++):

Вычисление размера массива на этапе компиляции - C++
Нашел код который вычисляет размер массива на этапе компиляции Но сам код мне не понятен. Объясните плз #include &lt;iostream&gt; ...

Конструктор копирования, аварийное завершение на этапе исполнения - C++
#include &lt;iostream.h&gt; #include &lt;string.h&gt; class String{ private: char *data; int max_length; public: ...

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

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

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

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

25
Croessmah
Пришел
Эксперт CЭксперт С++
13759 / 7839 / 893
Регистрация: 27.09.2012
Сообщений: 19,247
Записей в блоге: 3
Завершенные тесты: 1
13.01.2017, 12:45 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Используется расширение VLA.

Добавьте компилятору флаг -pedantic-errors.
1
MrGluck
Модератор
Эксперт CЭксперт С++
7525 / 4663 / 704
Регистрация: 29.11.2010
Сообщений: 12,740
13.01.2017, 12:45 #3
Цитата Сообщение от JIawliet Посмотреть сообщение
спокойно кушает такой код:
Это называется VLA. gcc (и его порт MinGW) спокойно умеют с ним работать.
Цитата Сообщение от JIawliet Посмотреть сообщение
это зависит от настроек
Да. Добавьте в настройках компилятора флаг -pedantic-errors
warnings demanded by strict ISO C and ISO C++
1
JIawliet
77 / 77 / 18
Регистрация: 20.07.2016
Сообщений: 302
Завершенные тесты: 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
Пришел
Эксперт CЭксперт С++
13759 / 7839 / 893
Регистрация: 27.09.2012
Сообщений: 19,247
Записей в блоге: 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Эксперт С++
7525 / 4663 / 704
Регистрация: 29.11.2010
Сообщений: 12,740
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
77 / 77 / 18
Регистрация: 20.07.2016
Сообщений: 302
Завершенные тесты: 2
13.01.2017, 14:23  [ТС] #7
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну дык код верный.
На этапе выполнения программа падает в RAD, VS... и как пример - скрин. (в прогу добавил еще строку, но от этого смысл особо не поменялся)

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

А то, что вы привели - UB, компиляторы вправе делать с ним что хотят (фактически это UB и значит).
0
Croessmah
Пришел
Эксперт CЭксперт С++
13759 / 7839 / 893
Регистрация: 27.09.2012
Сообщений: 19,247
Записей в блоге: 3
Завершенные тесты: 1
13.01.2017, 14:27 #11
Цитата Сообщение от JIawliet Посмотреть сообщение
На этапе выполнения программа падает
UB - оно такое, фиг его знает что будет.
Цитата Сообщение от JIawliet Посмотреть сообщение
спокойно уж точно не работает.
А Вы зачем барана с козлом пытаетесь скрестить?
0
JIawliet
77 / 77 / 18
Регистрация: 20.07.2016
Сообщений: 302
Завершенные тесты: 2
13.01.2017, 14:32  [ТС] #12
Цитата Сообщение от Croessmah Посмотреть сообщение
А Вы зачем барана с козлом пытаетесь скрестить?
мне дали такой код и говорят, что работает... проверил - действительно работает, а тут уже начал разбираться почему... в любом случаи я таким пользоваться не буду, не по стандарту
0
MrGluck
Модератор
Эксперт CЭксперт С++
7525 / 4663 / 704
Регистрация: 29.11.2010
Сообщений: 12,740
13.01.2017, 14:33 #13
Цитата Сообщение от Croessmah Посмотреть сообщение
А Вы зачем барана с козлом пытаетесь скрестить?
Из вики:
Гибрид овцы и козы — гибрид, полученный от скрещивания барана с козой или козла с овцой. Домашняя коза принадлежит к роду горных козлов, домашняя овца — к роду баранов. У козы 60 хромосом, а у овцы 54. Потомство, полученное в результате скрещивания, обычно бывает мертворожденным.
Так что всё понятно

Добавлено через 49 секунд
Цитата Сообщение от JIawliet Посмотреть сообщение
не по стандарту
Кстати, в стандарт языка С, а именно С99, их (VLA) включили
0
Croessmah
Пришел
Эксперт CЭксперт С++
13759 / 7839 / 893
Регистрация: 27.09.2012
Сообщений: 19,247
Записей в блоге: 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
77 / 77 / 18
Регистрация: 20.07.2016
Сообщений: 302
Завершенные тесты: 2
13.01.2017, 14:39  [ТС] #15
Цитата Сообщение от Croessmah Посмотреть сообщение
Дайте им в ответ clang'овые "чудеса":
что это такое? как оно вообще работает?) (я про код)
0
13.01.2017, 14:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2017, 14:39
Привет! Вот еще темы с ответами:

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

Задание размера матрицы - C++
Подскажите, плз, как грамотно задать размер матрицы в следующем листинге. #include &lt;iostream&gt; #include &lt;windows.h&gt; #include &lt;cmath&gt; ...

Задание размера числа - C++
Добрый день. Подскажите пожалуйста как можно задать целое положительное число в С++ длиною ровно 39 бит. Заранее благодарю.

Задан вещественный массив размера N. Создать целочисленный массив такого же размера, в котором будут записаны индексы исходного массива в порядке во - C++
Помогите с задачей: Задан вещественный массив размера N. Создать целочисленный массив такого же размера, в котором будут записаны...


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

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

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