Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 08.05.2016
Сообщений: 6

Динамический массив: ошибка в конструкторе

08.05.2016, 20:16. Показов 844. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую! Слушаю лекцию ТЕХНОПАРК, и там рассказывается про динамический массив с примером на C++ (есть 2 аналогичных видео: 1 вариант, 2 вариант). В общем, на слайде приводится такой код (кроме main):
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
40
41
42
43
44
45
#include <iostream>
#include <assert.h>
 
using namespace std;
 
struct CArray1 {
    double* Buffer;
    int BufferSize;
    int RealSize;
 
    CArray() : Buffer(0), BufferSize(0), RealSize(0) {}
};
 
double GetAt( const CArray1& arr, int index )
{
    assert( index >= 0 && index < arr.RealSize && arr.Buffer != 0);
    return arr.Buffer[index];
}
 
// Увеличение буфера.
void grow( CArray1& arr )
{
    int newBufferSize = arr.BufferSize * 2;
    double* newBuffer = new double[newBufferSize];
    for( int i = 0; i < arr.RealSize; ++i)
        newBuffer[i] = arr.Buffer[i];
    delete[] arr.Buffer;
    arr.Buffer = newBuffer;
    arr.BufferSize = newBufferSize;
}
 
// Добавление нового элемента.
void Add( CArray1& arr, double element )
{
    if( arr.RealSize == arr.BufferSize )
        grow( arr );
    assert( arr.RealSize < arr.BufferSize && arr.Buffer !=0  );
    arr.Buffer[arr.RealSize++] = element;
}
 
int main()
{
    cout << "Hello World!" << endl;
    return 0;
}
Но у меня при его запуске возникает еррор:
Code
1
2
3
D:\YandexDisk\C\test2\main.cpp:34: предупреждение: no return statement in function returning non-void [-Wreturn-type]
     CArray() : Buffer(0), BufferSize(0), RealSize(0) {}
                                                       ^
В чем ошибка?

Я тут продолжил слушать лекцию, и там ещё один вариант предложили:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class CArray {
public:
    CArray() : buffer( 0 ), bufferSize( 0 ), realSize( 0 ) {}
    ~CArray() { delete[] buffer; }
 
    // Доступ по индксу.
    double GetAt( int index ) const;
    double operator[]( int index ) const { return GetAt( index ); }
    double& operator[]( int index );
 
    // Добавление нового элемента.
    void Add( double element );
 
private:
    double* buffer; // Буфер.
    int bufferSize; // Размер буфера.
    int realSize; // Количество элементов в массиве.
 
    void grow();
};
Этот вариант скомпилировался без проблем. Я уже так-то увидел разницу. Если в 11 строке первого примера написать "CArray1", то компилируется без проблем.
Опечатка на слайде?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.05.2016, 20:16
Ответы с готовыми решениями:

Динамический массив в Конструкторе Формы
Такс это в юните: #include &lt;vcl.h&gt; #pragma hdrstop #include &quot;Unit1.h&quot; #include &quot;MYDLL.cpp&quot; float **a; float *x; int...

Динамический массив при наследовании, элементами которого являются объекты класса наследника динамический массив
Попробовал создать динамический массив, у которого элементы - объекты класса динамический массив, причем использовал класс-наследник от...

Динамический массив ,элементами которого являются объекты класса динамический массив
Доброго времени суток, захотел создать динамический массив ,элементами которого являются объекты класса динамический массив, если...

11
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
08.05.2016, 20:18
Nayn Cat, сами как думаете?
0
0 / 0 / 0
Регистрация: 08.05.2016
Сообщений: 6
08.05.2016, 21:41  [ТС]
S_el, опечатка на слайде?

Добавлено через 1 час 7 минут
В лекции утверждается, что если в какой-то функции создать статический массив размером "миллион", то программа скомпилируется, но при вызове функции возникнет ошибка "стековерфлоу". Но у меня другая ошибка

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
void testArr()
{
    int n = 1000000;
    int intArray[n];
    for( int i = 0; i < n; ++i)
        intArray[i] = i;
 
    cout << intArray[5] << endl;
 
}
 
int main()
{
    cout << "input 1" << endl;
    string num_in = "";
    cin >>num_in;
    if(num_in == "1")
        testArr();
     return 0;
}
Code
1
2
3
4
5
6
7
8
9
10
11
---------------------------
Получен сигнал
---------------------------
<p>Приложение остановлено, так как оно получило сигнал от операционной системы.<p>
<table><tr>
<td>Сигнал: </td><td>SIGSEGV</td></tr><tr><td>Назначение: </td>
<td>Segmentation fault</td>
</tr></table>
---------------------------
OK   
---------------------------
Я юзаю Qt Creator, это он так влияет на ошибку?
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
08.05.2016, 22:32
Цитата Сообщение от Nayn Cat Посмотреть сообщение
В лекции утверждается, что если в какой-то функции создать статический массив размером "миллион", то программа скомпилируется, но при вызове функции возникнет ошибка "стековерфлоу". Но у меня другая ошибка
Ваша программа вообще компилироваться не должна. VLA поддерживается в C99, но не в C++.

Цитата Сообщение от Nayn Cat Посмотреть сообщение
опечатка на слайде?
верно, если у вас были сомнения - выкидывайте курс и берите толковую книгу.
0
0 / 0 / 0
Регистрация: 08.05.2016
Сообщений: 6
08.05.2016, 23:15  [ТС]
Цитата Сообщение от S_el Посмотреть сообщение
Ваша программа вообще компилироваться не должна
Тем не менее, она скомпилировалась (как и утверждал лектор). Я экзешник не могу просто так запустить, ругается
Code
1
2
3
4
5
6
7
---------------------------
test2.exe - Системная ошибка
---------------------------
Запуск программы невозможен, так как на компьютере отсутствует libwinpthread-1.dll. Попробуйте переустановить программу. 
---------------------------
ОК   
---------------------------
Только в отладчике все программы работают. Надо Qt Creator пересобрать. Или как-то настраивать чтоб хоть на моём компе работало.
Цитата Сообщение от S_el Посмотреть сообщение
верно, если у вас были сомнения - выкидывайте курс и берите толковую книгу.
Тут нюанс просто, курс не по C++, но примеры рассматривают на C++.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
08.05.2016, 23:23
Цитата Сообщение от Nayn Cat Посмотреть сообщение
Тем не менее, она скомпилировалась (как и утверждал лектор).
Конечно. Из-за расширений в gсс(g++) не уверен как этот компилятор правильно называть
Но это не значит что код должен компилироваться.

Цитата Сообщение от Nayn Cat Посмотреть сообщение
Тут нюанс просто, курс не по C++, но примеры рассматривают на C++.
Тогда точно стоит взять книгу, чтобы вопросы уточнять там, а не создавать кучу однообразных тем( я не конкретно вас имею ввиду, а то,что для многих проще шлепнуть новую тему, вместо траты времени на поиск из уже созданных).

Добавлено через 2 минуты
Вот, даже если добавить
C++
1
using namespace std;
который также пропущен, раз везде отсутствует явное указание пространства имен std
http://rextester.com/SSW2064
0
0 / 0 / 0
Регистрация: 08.05.2016
Сообщений: 6
08.05.2016, 23:55  [ТС]
Цитата Сообщение от S_el Посмотреть сообщение
Вот, даже если добавить
C++Выделить код
1
using namespace std;
который также пропущен, раз везде отсутствует явное указание пространства имен std
http://rextester.com/SSW2064
Это я случайно на форум кинул без этой строчки, она у меня была... Но суть примера в том, что если размер массива, например, 5 (меньше миллиона) - то всё отработает без ошибок. Если 1000000, то должна быть ошибка. Типа, такой массив надо создавать через new.
http://rextester.com/SSW2064 - тут не работает ни с миллионом, ни с другим меньшем числом. На сколько я понял, это из-за "cin >>num_in;". Как-то по другому надо описать ввод что-ли. Кстати спасибо за ссылку на ресурс)

Цитата Сообщение от S_el Посмотреть сообщение
а не создавать кучу однообразных тем
ну, я не нашёл в этом разделе что-то типа "Новичкам. Задай вопрос - получи ответ"
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
09.05.2016, 00:03
Цитата Сообщение от Nayn Cat Посмотреть сообщение
ну, я не нашёл в этом разделе что-то типа "Новичкам. Задай вопрос - получи ответ"
Правила форума запрещают. Здесь один вопрос - одна тема.

Цитата Сообщение от Nayn Cat Посмотреть сообщение
Если 1000000, то должна быть ошибка.
Так и должно быть, так как при таком способе память выделяется на стеке, а если через new - то в куче. Не буду расписывать подробно, так как даже на этом форуме, вопрос разбирался неоднократно, более компетентными в этих вещах, людьми, чем я.
0
0 / 0 / 0
Регистрация: 08.05.2016
Сообщений: 6
09.05.2016, 00:17  [ТС]
Цитата Сообщение от S_el Посмотреть сообщение
Не буду расписывать подробно, так как даже на этом форуме, вопрос разбирался неоднократно, более компетентными в этих вещах, людьми, чем я.
Та у меня по теории и нет вопросов, в лекции всё норм разжевали. Просто хочу ошибку связанную именно со стеком увидеть.
http://rextester.com/XWDWZ15848 - начинается выполнение, но когда начинает выполнятся функция с int intArray[1000000], то тоже другой еррор.
"Process exit code is not 0: -1073741571"
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
09.05.2016, 09:14
Вот код, который компилируется в VS 2008:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
void testArr()
{
    const int n = 1000000;
    int intArray[n];
    for(int i = 0; i < n; ++i)
        intArray[i] = i;
    cout << intArray[5] << endl;
 
}
int main()
{
    cout << "input 1" << endl;
    char num_in;
    cin >>num_in;
    if(num_in == '1')
        testArr();
     return 0;
}
А вот вывод об ошибке времени исполнения:
Необработанное исключение в "0x0085f457" в "test.exe": 0xC00000FD: Stack overflow.
0
0 / 0 / 0
Регистрация: 08.05.2016
Сообщений: 6
10.05.2016, 00:53  [ТС]
Цитата Сообщение от zss Посмотреть сообщение
А вот вывод об ошибке времени исполнения:
Необработанное исключение в "0x0085f457" в "test.exe": 0xC00000FD: Stack overflow.
Это вам такую ошибку VS 2008 выдаёт во время выполнения когда вы в нём что-то типа RUN запускаете? Или это уже без VS 2008 ошибка?

Пробовал скомпилировать на ноуте, Ubuntu x64 g++, там выдаёт - "Ошибка сегментирования (сделан дамп памяти)". Там кстати размер массива пришлось увеличить больше чем в два раза.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
10.05.2016, 01:00
Nayn Cat, это нормально:
http://stackoverflow.com/quest... k-overflow
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.05.2016, 01:00
Помогаю со студенческими работами здесь

Динамический массив - ошибка на 4-ой итерации
Подскажите новичку пожалуйста в чём проблема ? вылетает ошибка на 4-ой итерации float **answers = new float*; answers = new float; ...

Ошибка при добавлении элемента в динамический массив
Всем привет! Создал класс для работы с дин.массивом. Нормально компилируется и выводит массив, но когда добавляю новый элемент, выдает...

Динамический массив структур. Ошибка преобразования типов
Всем привет есть задачка на структуры. Нужно через структуру В сделать динамический массив структуры А. Написал функцию, но компилятор...

Ошибка при вводе в динамический двумерный массив
заполнить матрицу не могу. ошибка где то от 19 до 24 строки. #include &lt;conio.h&gt; #include &lt;iostream&gt; #include &lt;math.h&gt; ...

Динамический массив. Ошибка при выполнении программы
Программа должна предоставить заполнение массива пользователю, а дальше вывести массив на экран. (Массив динамический) При компиляции...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru