5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
1

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

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

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


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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.11.2012, 00:17
Ответы с готовыми решениями:

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

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

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

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

51
256 / 46 / 4
Регистрация: 24.11.2012
Сообщений: 466
01.12.2012, 20:23 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от 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Эксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
01.12.2012, 20:33 42
Лично мое мнение, что массивы для сей, а там и VLA есть. В С++ можно с радостью использовать вектора и проблем не знать.
1
256 / 46 / 4
Регистрация: 24.11.2012
Сообщений: 466
01.12.2012, 20:36 43
а как же кампатибл, энивэй что есть в сях, есть в плюсах.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
01.12.2012, 20:40 44
Цитата Сообщение от 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Эксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
01.12.2012, 20:40 45
activnaya, так он и есть. VS не поддерживает стандарт C99, VLA на С и С++ нет. gcc (MinGW) поддерживает C99. VLA есть и в С и в С++, хоть последнее и не по стандарту.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
01.12.2012, 20:47 46
Хотя нет, я поторопился с выводами. Выделение ячейки памяти Y под "m" было для функции "printf", так всегда делается. Значит всё же имеем вот это выделение памяти:
C++
1
int m= 3;
до печати "Entry", а инициализацию после.
1
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
01.12.2012, 21:00 47
Цитата Сообщение от activnaya Посмотреть сообщение
энивэй что есть в сях, есть в плюсах.
Ну это не так. __VA_ARGS__ только в С++11 добавили, неявного приведения любого указателя из void * вроде вообще никогда не было, те же VLA. Всё таки это разные языки.
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
01.12.2012, 21:12 48
Цитата Сообщение от activnaya Посмотреть сообщение
а вот создание локального массива с использованием VLA имеет смысл.
смысл имеет использование стекового аллокатора
0
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
02.12.2012, 15:39 49
Макрос __VA_ARGS__ как минимум в gcc реализован уже давно.
0
256 / 46 / 4
Регистрация: 24.11.2012
Сообщений: 466
02.12.2012, 17:47 50
Цитата Сообщение от gray_fox Посмотреть сообщение
__VA_ARGS__ только в С++11 добавили
#include <cstdarg> и не надо никаких с++11
1
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
02.12.2012, 18:42 51
Цитата Сообщение от activnaya Посмотреть сообщение
#include <cstdarg> и не надо никаких с++11

Не по теме:

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

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

0
256 / 46 / 4
Регистрация: 24.11.2012
Сообщений: 466
02.12.2012, 18:54 52
MrGluck, а вот не правда я не призывала не использовать с++11. Я только намекнула субъекту, что он как бэ немного не в теме.
0
02.12.2012, 18:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.12.2012, 18:54
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru