0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 24
|
||||||
1 | ||||||
Есть динамический массив с размерностью 5, необходимо его сделать с размерностью 6, заполнить цифрами и вывести на экран27.03.2014, 18:16. Показов 1347. Ответов 18
Метки нет (Все метки)
День добрый.
Не хочется никому морочить голову дурацкими вопросами, поэтому стараюсь находить на все свои вопросы ответы сам. Но тут я столкнулся с совершенно непонятной для меня проблемой и решение ее нигде не могу найти. Когда я запускаю выполнение программы на экран выводится полная ерунда , но если запустить отладчик все нормально и на экран выводятся данные динамического массива. Из-за чего такое может происходить? Голову ломаю второй день. Задача следующая - есть динамический массив с размерностью 5, необходимо его сделать с размерностью 6, заполнить цифрами и вывести на экран. Код, который внизу, при запуске отладчика все отлично выводит на экран, а при запуске программы выводить ерунду. Буду очень благодарен если кто-то натолкнет на решение проблемы. Пользуюсь стандартным инструментарием microsoft visual studio 2010
Если просто заполнить массив данными , то все ОК и в отладчике и в запуске программы, если сделать как в коде вверху, то в отладчике ОК , а при запуске программы нет.
0
|
27.03.2014, 18:16 | |
Ответы с готовыми решениями:
18
Создать и вывести на экран двумерный массив целых чисел размерностью 3х3 Как создать динамический массив размерностью m на n? Сформировать динамический двумерный массив, заполнить его случайными числа-ми и вывести на экран монитора. Добавить строку в начало матрицы Заполнить массив размерностью 6x6 по правилу |
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|||||||||||||||||||||
27.03.2014, 18:41 | 2 | ||||||||||||||||||||
не уверен
но по моему нарушен приоритет, не увеличиваешь значение а увеличиваешь адрес по аналогии
вот так
а лучше пользуйся не указателем а ссылкой
0
|
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 24
|
|
27.03.2014, 21:49 [ТС] | 3 |
Нет , не помогает.
И если я иду именно по шагам в отладчике, то все работает и указателем и ссылкой. Но только я запускаю программу на экран выводится как будто массив не заполнен.
0
|
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 24
|
|
27.03.2014, 22:09 [ТС] | 4 |
0
|
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 24
|
|
27.03.2014, 22:20 [ТС] | 6 |
Это наверно проблема в моем microsoft visual studio 2010?
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
||||||
27.03.2014, 22:27 | 7 | |||||
Нет, там все в порядке.
CheburatorUA, Обратив внимание, что ты скопировал указатель в функцию. Снаружи осталось старое значение. А новый массив выделился в совершенно новом месте. Попробуй вот такой код, он должен работать правильно:
Нет, проблема в UB в коде. Добавлено через 5 минут Потому что нормально работающая программа - частный случай неопределенного поведения
2
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
27.03.2014, 22:37 | 8 |
Да, сейчас увидел. Странно, что у меня выводит не мусор.
А почему UB? Почему у меня выводит не мусор? Добавлено через 3 минуты Как в особождённой памяти оказываются данные из памяти под другим массивом?
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
27.03.2014, 22:43 | 9 |
Доступ по указателю к которому был применен delete - UB
Может случиться, если компилятор встроит функцию.
1
|
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 24
|
|
27.03.2014, 22:46 [ТС] | 10 |
Да, такой код заработал, спасибо.
Вот только тогда почему если делать пошагово в отладчике, то все работает, я даже выше скришнот прикрепил. А у alsav22 вообще все получилось с моим кодом, мистика). Еще раз спасибо за работающий код.
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
27.03.2014, 22:48 | 11 |
Неопределенное поведение, это термин для обозначения поведения некорректной программы. Оно может выражаться в том числе и в том, что все работает нормально. Ты понял почему была проблема?
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
|
27.03.2014, 22:51 | 12 |
потому что UB неопределенное поведение
при релизе идет оптимизация и результирующий код совершенно не похож на исходный попробуй отключи оптимизацию и проверь как я на это не обратил внимания на четыре раза пересмотрел и не заметил
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
27.03.2014, 22:52 | 13 |
alsav22, кстати, про встраивание я зря сказал: оптимизация не должна влиять на поведение программы. Скорее всего это может случиться, если new вернет тот же самый адрес, при новом выделении памяти. Оказался свободный участок в том же месте. Просто повезло.
UPD: проверил у себя, так и есть - адреса равны, в итоге все работает. При чем даже в релизе. Но это случайность.
1
|
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 24
|
|
27.03.2014, 23:14 [ТС] | 14 |
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
27.03.2014, 23:20 | 15 |
CheburatorUA, ключевое слово "копия" Ты записал новое значение от new в копию. А исходное, которое ты передавал осталось старым (и уже невалидным, т.к. был delete[]). Так получилось что new вернул тот же самый адрес, в итоге ничего не сломалось.
0
|
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 24
|
|
31.03.2014, 00:23 [ТС] | 16 |
Как-то странно все равно. В моей версии в main проинициализировали указатель, затем под этот указатель выделена память для массива. Указатель передан в функцию, затем по этому указателю память удалена и снова выделена, но на одну ячейку больше. Ну выделена эта память в копии т.е. в функции, но ведь указатель не поменялся и память выделена. Перечитав довольно много литературы я так понял , что указатели именно для таких ситуаций и существуют, а тут оказалось, что необходимо еще дополнительно и ссылку указывать.
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|
31.03.2014, 00:33 | 17 |
Сообщение было отмечено CheburatorUA как решение
Решение
Всё хорошо пока действия в функции, куда передан указатель по значению (копия), осуществляются над данными, адрес которых находится в указателе:
Адрес и в копии, и в оригинале (в main()) пока одинаковы, поэтому всё хорошо. В том то и дело, что поменялся (поменялся адрес, который хранится в указателе). При выделении новой памяти, адрес этой памяти записыается в сам указатель, т.е. меняются уже не данные, адрес которых находится в указателе, а сам этот адрес (значение указателя), и меняется он в копии, а не в том указателе, который был в main().
2
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
|
|
31.03.2014, 00:49 | 18 |
Ссылку не обязательно. Есть еще вариант с указателем на указатель (float **). Тогда мы будем передавать адрес указателя, который указывает на наши данные. И через этот адрес мы всегда можем получить доступ к тому самому указателю (в нашем случае он будет находиться в main), указывающему на наши данные. Я всегда тем, кто плохо понимает всю эту кухню, рисую схемы на доске. Но здесь не получится, так что попробуй понять, что написали alsav22 и я.
2
|
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 24
|
|
31.03.2014, 13:37 [ТС] | 19 |
Спасибо за пояснения. Теперь я понял. А то я не мог сам понять, меня как заклинило на этом указателе.
0
|
31.03.2014, 13:37 | |
31.03.2014, 13:37 | |
Помогаю со студенческими работами здесь
19
Массив размерностью 100 заполнить случайными числами Создать динамический массив, заполнить его и вывести Создать массив размерностью 7 х 7, заполнить его случайным образом цифрами Заполнить и вывести на экран массив размерностью 5 квадратами номеров элементов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |