Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587

С++ VLA и прочее...

30.11.2012, 00:17. Показов 6981. Ответов 51
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
 Комментарий модератора 
Перенесено из Порекомендуйте компилятор


Dev-C++ меня удивляет. Вот такой код компилирует без ошибок и предупреждений:
C++
1
2
3
4
5
6
7
int main()
{
    int m;
    int arr[m];
    
    return 0;
}
А такой и выполняет:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
 
int main()
{
    int m;
    cin >> m;
    int arr[m];
    
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.11.2012, 00:17
Ответы с готовыми решениями:

Скремблирование и прочее
Добрый день, помогите разобраться. Нужно написать программу для скремблирование файлов. Но перед этим вопрос: как из исходного файла...

Рекурентная формула и прочее
Добрый день , пишу вам для получения помощи! Никак не могу сделать рекурентную формулу и программу под выражением &quot;б&quot;Помогите...

Дирректива define и прочее
Помогите пожалуйста решить задание, никогда раньше с такими не сталкивался! =( 1) Даны целые числа x, у и вещественное число z....

51
 Аватар для activnaya
256 / 46 / 4
Регистрация: 24.11.2012
Сообщений: 466
01.12.2012, 20:23
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Jupiter Посмотреть сообщение
не надо нам VLA! это зло
в cstyle нужен. Однако вспомним что с++ это ООП и такой класс скомпилируется, но работать не будет.
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
class A
{
public:
    int array[];
    uint32_t siz;
 
    A(uint32_t s)
    {
        siz = s;
        array[ siz ];
 
        for (uint32_t i = 0; i < siz; ++i)
            array[ i ] = i;
    }
 
    ~A(){}
 
    uint32_t size() { return siz; }
 
    void print()
    {
        for (uint32_t i = 0; i < siz; ++i)
            std::cout << std::setw(3) << array[ i ];
    }
 
};
Поэтому используя ООП нам не удастся создать элемент класса с использованием VLA, а вот создание локального массива с использованием VLA имеет смысл.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
01.12.2012, 20:33
Лично мое мнение, что массивы для сей, а там и VLA есть. В С++ можно с радостью использовать вектора и проблем не знать.
1
 Аватар для activnaya
256 / 46 / 4
Регистрация: 24.11.2012
Сообщений: 466
01.12.2012, 20:36
а как же кампатибл, энивэй что есть в сях, есть в плюсах.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
01.12.2012, 20:40
Цитата Сообщение от alsav22 Посмотреть сообщение
Выделение памяти произойдёт при входе в main() до выполнения первой инструкции в тексте кода:
По моему разумению всё должно идти своим чередом, инструкция за инструкцией. То есть сперва печать "Entry", потом выделение памяти под "m", потом инициализация "m", потом печать "m". Посмотрим в отладчике. С cout тяжело отследить, а с printf легко

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <stdio.h>
using namespace std;
 
int main() { 
 cout << "Entry"; 
 int m = 3; 
 printf ("%d", m); 
 return 0; 
}
отследил, было так: сперва выделение памяти X, потом печать "Entry", потом занесение в X-> 3, потом выделение памяти Y, потом занесение в Y->3, потом печать "m". Причём при печати "m" использовалось значение ячейка памяти Y а не X.

Цитата Сообщение от alsav22 Посмотреть сообщение
Выделение памяти произойдёт при входе в main() до выполнения первой инструкции в тексте кода:
ну то есть в данном конкретном случае выделение памяти и инициализация произошло как до так и после печати "Entry". Фактически в main под переменную "m" было выделено две ячейки памяти. Учитывая, что при печати "m" использовалась ячейка памяти Y, я бы сказал что после. А зачем комплятор придумал занесение X-> 3 (до печати "Entry") я не знаю и знать не хочу

Зачем тебе вообще это? Ну если так надо знать, сходи на wasm.ru, там в раздел "исследование программ", там научат работать с отладчиком. А то я закалебусь смотреть постоянно.
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
01.12.2012, 20:40
activnaya, так он и есть. VS не поддерживает стандарт C99, VLA на С и С++ нет. gcc (MinGW) поддерживает C99. VLA есть и в С и в С++, хоть последнее и не по стандарту.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
01.12.2012, 20:47
Хотя нет, я поторопился с выводами. Выделение ячейки памяти Y под "m" было для функции "printf", так всегда делается. Значит всё же имеем вот это выделение памяти:
C++
1
int m= 3;
до печати "Entry", а инициализацию после.
1
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
01.12.2012, 21:00
Цитата Сообщение от activnaya Посмотреть сообщение
энивэй что есть в сях, есть в плюсах.
Ну это не так. __VA_ARGS__ только в С++11 добавили, неявного приведения любого указателя из void * вроде вообще никогда не было, те же VLA. Всё таки это разные языки.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
01.12.2012, 21:12
Цитата Сообщение от activnaya Посмотреть сообщение
а вот создание локального массива с использованием VLA имеет смысл.
смысл имеет использование стекового аллокатора
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
02.12.2012, 15:39
Макрос __VA_ARGS__ как минимум в gcc реализован уже давно.
0
 Аватар для activnaya
256 / 46 / 4
Регистрация: 24.11.2012
Сообщений: 466
02.12.2012, 17:47
Цитата Сообщение от gray_fox Посмотреть сообщение
__VA_ARGS__ только в С++11 добавили
#include <cstdarg> и не надо никаких с++11
1
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
02.12.2012, 18:42
Цитата Сообщение от activnaya Посмотреть сообщение
#include <cstdarg> и не надо никаких с++11

Не по теме:

Как без с++11 ? Я уже стал слишком слаб и нежен, без него не умею(

Зачем жить, если -std=++98 :D

0
 Аватар для activnaya
256 / 46 / 4
Регистрация: 24.11.2012
Сообщений: 466
02.12.2012, 18:54
MrGluck, а вот не правда я не призывала не использовать с++11. Я только намекнула субъекту, что он как бэ немного не в теме.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.12.2012, 18:54

Указатель на массив char и прочее
Страуструп для проверки прочитанного в заданиях после одной из глав просит через typedef сделать пару объявлений и вот как делать некоторые...

Класс, конструктор, деструктор и прочее
Добрый день. Есть задание: Написать программу работы с матрицами (матрица представляет собой двумерный массив). Матрица является...

ООП Язык С Конструкторы и прочее
Текст задания: (ну хоть убейте, но не понимаю). Если не целый код, то хоть ссылки на похожее, на примеры, гугл не помогает Создайте...

Стиль написания кода(читабельность и прочее)
Недавно делал тестовое задание для поиска работы, но мне сказали, что код не совсем корректно написан. Задание:Написать рекурсивный и не...

Размер примитивных типов, выравнивание и прочее
Как обычно борются с тем, что примитивный тип от компа к компу разного размера? Допустим, если записывают данные по сети или в двоичные...


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

Или воспользуйтесь поиском по форуму:
52
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru