![]() |
|
Модераторы: bsa |
![]()
|
|
| djezul |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 13.6.2009 Где: Украина , Донецк Репутация: нет Всего: нет |
Вот код -
По нему есть несколько вопросов. 1 - что это за ошибка - ![]() Какова причина её возникновения ? И как её исправить ? И почему , там где я поставил <<<<< удаляется и q , а не только p , как удалить только p ? Прога , думаю и так понятно , но всё же скажу , должна создавать динамический массив с возможностью добавления. С 1 мерными у меня всё работает , но так почему то нет . |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
скорей всего вы пишете либо за пределы массива либо удаляете статический массив. |
|||
|
||||
| djezul |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 13.6.2009 Где: Украина , Донецк Репутация: нет Всего: нет |
ну по коду должно быть видно , что массив не статический, и за пределы вроде не вылетаю, тем более пишет , что в 52 строке , причем здесь она, никак не пойму.
|
|||
|
||||
| Albor |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 2 Всего: 9 |
При копировании массива (add()) копируются указатели p[i]=q[i]; затем массив q удаляется, соответственно все указатели массива p становятся недействительными. Копируя массив, копируй только содержимое, а указатели не трогай, в каждом массиве свои.
Это сообщение отредактировал(а) Albor - 3.7.2009, 16:54 |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
| djezul |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 13.6.2009 Где: Украина , Донецк Репутация: нет Всего: нет |
||||
|
||||
| Albor |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 2 Всего: 9 |
djezul, ты сам писал код? Если да, то должен понимать что написано. Что такое p[i] и q[i] - это указатели на char. Смотри, для q[i] ты делаешь следующее:
После этого q[i] указывает на область памяти, куда скопирована строка из surname. Дальше удаляется и вновь создаётся с новым размером массив p - нормально. Но дальше... что делает строка p[i]=q[i]? Ты просто копируешь указатель, после этого оба массива указывают на одни и те же данные, а строчка strcpy( p[i] , q[i] );? - посмотри в дебаге что ты копируешь и куда, указатели-то одинаковые, но это пол-беды (скажем даже не совсем беда, может у программера такой каприз
тогда p[i] уже не зависит от q[i]. Это сообщение отредактировал(а) Albor - 4.7.2009, 06:27 |
||||
|
|||||
| djezul |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 13.6.2009 Где: Украина , Донецк Репутация: нет Всего: нет |
Albor, спасибо , я врубился в это ещё после твоего 1 поста))) просто я ж говорю , при написании подобной проги только с 1 мерным массивом указетелей, так прокатывало , поэтому решил и тут так сделать) теперь понял , что это неправильно . Твой вариант работает , спасибо)
P.S. код писал сам)) Это сообщение отредактировал(а) djezul - 4.7.2009, 16:01 |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
new кидает exception, когда не может выделить память |
|||
|
||||
| djezul |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 13.6.2009 Где: Украина , Донецк Репутация: нет Всего: нет |
zim22, Спасибо , буду знать)
|
|||
|
||||
| djezul |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 13.6.2009 Где: Украина , Донецк Репутация: нет Всего: нет |
А как правильно сделать сортировку , мне нужно допустим по алфавиту отсортировать фамилии, вот я пытаюсь так
НО , так не работает , почемуто не хочет выделять достаточно памяти для p[i] , хотя я вроде еёудаляю , и создаю с необходимым количеством((( В чём тут ошибка? |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
| djezul |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 13.6.2009 Где: Украина , Донецк Репутация: нет Всего: нет |
zim22, не просто хочу научится работе с указателями) то понятно.
|
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
почитайте тогда книгу Б.Кернигана, Д.Ритчи "Язык программирования С". Глава 5 "Указатели и массивы". |
|||
|
||||
| Soah |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 18.2.2009 Репутация: 6 Всего: 54 |
strcmp |
|||
|
||||
| djezul |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 13.6.2009 Где: Украина , Донецк Репутация: нет Всего: нет |
zim22, Читал, и не только Б.Кернигана, Д.Ритчи , и Шилдта читал, но всё равно непонятно , почему не работает .
Soah, а зачем мне сравнивать строки, по тому коду , что я привел выше, поидее должно в переменную темп выделяться памяти , как раз сколько сколько надо . Кстати потом дописал только что , пишу ещё temp = NULL; , но всё равно не помогает , да и если я буду делать такую проверку, каким мне ещё способом перемещать по тому адресу содержимое p[i] , если не так как я сделал? |
|||
|
||||
| Soah |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 18.2.2009 Репутация: 6 Всего: 54 |
||||
|
||||
| djezul |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 13.6.2009 Где: Украина , Донецк Репутация: нет Всего: нет |
Soah, а всё врубился , спасибо , а то просто дебагер показывал вылет 3 строками ниже )))
Неа , не помогло , все равно вылет в этой строке показует
Добавлено через 4 минуты и 46 секунд Вот изменил код немного
Это сообщение отредактировал(а) djezul - 4.7.2009, 23:02 |
||||
|
|||||
| Soah |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 18.2.2009 Репутация: 6 Всего: 54 |
||||
|
||||
| djezul |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 13.6.2009 Где: Украина , Донецк Репутация: нет Всего: нет |
||||
|
||||
| Soah |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 18.2.2009 Репутация: 6 Всего: 54 |
||||
|
||||
| djezul |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 13.6.2009 Где: Украина , Донецк Репутация: нет Всего: нет |
Soah,
А что в нём не так ? Я исправил N на N + 1 , но ошибка не там возникает , даже при написании N + 1 , ошибка вылетает тут
|
||||
|
|||||
| Soah |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 18.2.2009 Репутация: 6 Всего: 54 |
||||
|
||||
| djezul |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 13.6.2009 Где: Украина , Донецк Репутация: нет Всего: нет |
||||
|
||||
| Soah |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 18.2.2009 Репутация: 6 Всего: 54 |
можете обьяснить почему N+1? но ведь изначально количество элементов 4. да? N = 4 i < N +1 или i < 5 i = 0 i+1 = 1 -> p[0] и p[1] i = 1 i+1 = 2 -> p[1] и p[2] i = 2 i+1 = 3 -> p[2] и p[3] i = 3 i+1 = 4 -> p[3] и p[4] i = 4 i+1 = 5 -> p[4] и p[5] p[0]..p[5] -> 6 элементов, но ведь N = 4 смотрите, допустим у нас массив из 3 элементов, тогда первый элемент сравниваем со вторым, второй с третьим -> два сравнения - две итерации массив из 4 элементов, тогда первый элемент сравниваем со вторым, второй с третьим, третий с четвёртым -> три сравнения - три итерации |
|||
|
||||
| djezul |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 13.6.2009 Где: Украина , Донецк Репутация: нет Всего: нет |
Вы хотите сказать , что N нужно присваивать N - 1 , то есть так
Попробовал , та же ошибка в том же месте) |
|||
|
||||
| Soah |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 18.2.2009 Репутация: 6 Всего: 54 |
||||
|
||||
| djezul |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 13.6.2009 Где: Украина , Донецк Репутация: нет Всего: нет |
Да , спасибо , что так долго и упорно вдалбливали мне в голову , а не просто сказали что исправить)) А насчёт NULL , так препод сказал делать , правда в другой задаче, приводит к типу void * , а тут я впихнул , уже будучи в растеряности )))) Ещё раз спасибо) |
|||
|
||||
| djezul |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 13.6.2009 Где: Украина , Донецк Репутация: нет Всего: нет |
Ну а здесь почему ошибка? Это сообщение отредактировал(а) djezul - 5.7.2009, 02:36 |
|||
|
||||
| Soah |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 18.2.2009 Репутация: 6 Всего: 54 |
указатели тут ни причём, надо правильно составлять алгоритмы и пользоваться отладчиком. Это сообщение отредактировал(а) Soah - 5.7.2009, 21:53 |
|||
|
||||
| djezul |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 13.6.2009 Где: Украина , Донецк Репутация: нет Всего: нет |
||||
|
||||
| Soah |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 18.2.2009 Репутация: 6 Всего: 54 |
не заметил
djezul, |
||||||||
|
|||||||||
| djezul |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 13.6.2009 Где: Украина , Донецк Репутация: нет Всего: нет |
Soah, я уже заменил код на такой
Насчёт правильного составления, тут и опыт играет роль, согласитесь . А отладчиком я пользуюсь , и пошаговой отладкой, уже раз 20 прошёл. Я не понимаю , почему q равно N поидее а не N - 1 . Причём такой момент , если я удаляю последний элемент, всё удаляется, а если не последний , то ошибка в этой строке , p[i] = new char[strlen(q[i]) + 1]; Вот именно , почему возникает вопрос? Ведб в 1 цикле, должно пропускаться . При этом если я делаю так
То ошибка возникает тут - for ( int i = 0 ; i < N ; i++ ) delete[] q[i]; |
||||
|
|||||
| Soah |
|
||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 18.2.2009 Репутация: 6 Всего: 54 |
если пока в уме решать такие задачи не получается, возьмите ручку и решайте на бумажке допустим p[0] -> "123" p[1] -> "456" p[2] -> "789" p[3] -> "000" value = 1
после этого кода q[0] -> "123" q[1] -> ??? q[2] -> "789" как Вы думаете это правильно? вроде бы алгоритм правильный, сейчас времени проверить нет, только Вы делаете лишнюю работу
зачем создавать копию массива q, если можно присвоить p указатель на ту память которая уже есть
|
||||||||||
|
|||||||||||
| djezul |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 13.6.2009 Где: Украина , Донецк Репутация: нет Всего: нет |
||||
|
||||
| Soah |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 18.2.2009 Репутация: 6 Всего: 54 |
а зачем удалять q? смотрите, p ->(указывает) на массив p[0]..p[3] p[0] -> "123" p[1] -> "456" p[2] -> "789" p[3] -> "000" value = 1 формируем q q[0] -> "123" q[1] -> "789" q[2] -> "000" удаляем память под строки p[0]..p[4] и массив p p = q, означает что p будет указывать туда где и q, то есть на массив строк("123", "789", "000") |
|||
|
||||
| djezul |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 13.6.2009 Где: Украина , Донецк Репутация: нет Всего: нет |
Но ведь при 2 вызове функции , разве q сформируется правильно , если не отчистить занимаемою им память? Ведь возможно у меня будет p[0] -> "123" p[1] -> "456" p[2] -> "789" p[3] -> "000" Я удалю , останется q[0] -> "123" q[1] -> "789" q[2] -> "000" Я захочу добавить ещё 2 q[0] -> "123" q[1] -> "789" q[2] -> "000" q[3] -> "541" q[4] -> "000" И снова захочу удалить 5 элемент , но ведб в таком случае , функция правильно не отработает ? Или я что то не так понимаю? |
|||
|
||||
| Soah |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 512 Регистрация: 18.2.2009 Репутация: 6 Всего: 54 |
||||
|
||||
| djezul |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 13.6.2009 Где: Украина , Донецк Репутация: нет Всего: нет |
||||
|
||||
| ller |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.8.2008 Где: г. Таганрог Репутация: 2 Всего: 4 |
Вопрос по теме. Не буду новую заводить.
Есть некоторый класс
Я понимаю, что так делать нельзя, но есть какие то пути как сделать указание элемента в виде масива n-мерного. Один из вариантов как я вижу, это использовать
Но хочется сделать велосипед, в качестве получения опыта Это сообщение отредактировал(а) ller - 14.7.2009, 21:32 |
||||
|
|||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |