![]() |
|
Модераторы: Poseidon |
![]()
|
|
| reddevil |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 27.6.2005 Где: Украина. г.Днепро петровск Репутация: нет Всего: нет |
Новая задача - новая проблема.
Помогите понять почему компилятор выдает ошибку в данном коде
|
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 6 Всего: 173 |
Размерность массива должна быть константой времени компиляции. Правда, новый стандарт C99 позволяет то, что ты написал - но твой компилятор видимо его не поддерживает. Тебе здесь нужно динамическое выделение памяти:
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| reddevil |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 27.6.2005 Где: Украина. г.Днепро петровск Репутация: нет Всего: нет |
Спасибо за ответ,
при динамическом выделении памяти заработало
честно, компилировал все в одно время еслиб кто сказал что это за время компиляции Это сообщение отредактировал(а) reddevil - 16.7.2005, 00:22 |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 2 Всего: 20 |
reddevil
Дело в том, что существуют вещи, которые реально существуют только на уровне компилятора и его макро-языка. К этому относятся всевозможные макросы, а также константы. В старом стандарте Си массив(не динамический) !!!должен!!! иметь константый размер. То есть при компиляции, все места использования макросов и констант будут заменены соответсвенными инструкциями и значениями. "Время компиляции" В данном контексте подразумевается "момент компиляции". Что есть не что инное, как часть процесса подстановки значений и инструкций. ИМХО помоему в этот процесс также входит создание object's, которые связываются линковщиком в следующем процессе - процессе связывания и сборки. |
|||
|
||||
| reddevil |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 27.6.2005 Где: Украина. г.Днепро петровск Репутация: нет Всего: нет |
Спасибо за ответы!
Но вот начал новую прогу и...
компилирую, запускаю, дохожу до delete и появляется окно про ошибку. помогите раздуплится в чем тут ошибка |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 2 Всего: 20 |
reddevil
Во первых... чес слово впервые вижу чтобы так память выделяли из кучи На самом деле выделяется шиш. В твоем случае нужно задать размер дин. массива, то есть: char *first=new char[MAX_LONG_FIRST] ; char *second=new char[MAX_LONG_SECOND] ; Естесственно, что у тебя будет ошибка, потому что ты освобождаешь память тобой не занятую. Далее... Вместо:
delete[] first; delete[] second; Ты ведь освобождаешь память не из под простого указателя. А из под динамического массива. |
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 5 Всего: 18 |
|
|||
|
||||
| reddevil |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 38 Регистрация: 27.6.2005 Где: Украина. г.Днепро петровск Репутация: нет Всего: нет |
тогда происходит ошика компиляции в строках
подскажите как правильно сделать, чтоб при проверке на true, изменялось два массива: в первом - СТРОКА1, во втором - СТРОКА2, и не оборот: в первом - СТРОКА2, во втором - СТРОКА1. |
||||
|
|||||
| En_t_end |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 2 Всего: 20 |
Блин, только сейчас заметил ))) Как решить эту проблему ? Есть два решения... 1. Отказаться от динам. массивов в данном контексте, ибо здесь можно обойтись обычными массивами, которые уничтожются после вызова твоей функции и сотвественно тебе не надо будет явно освобождать память, за тебя все сделает Си. 2. Работая с указателями, а в частности с дин. массивами, надо всегда быть собранным и просто так не раскидывать на право и на лево "присваивание". Запомни правило, в большинстве случаев, если операция имеет вид: test_pointer = "Test"; ... где test_pointer указатель, а "Test" некая строка, то эта операция означает, что теперь test_pointer будет указывать на некую стековую переменную(здесь массив) с некоторым адрессом НЕ из кучи. Если бы ты поставил знак разыменования перед test_pointer, например так: *test_pointer = 'T'; , то здесь ты бы уже работал не с адресами а со значениями элементов динамического массива. В частности присвоил бы первому(в данном контексте именно иму) члену массива значение 'T'. Эта операция в данном контексте может быть заменена на test_pointer[0] = 'T'; Если же ты все таки ради обучения решил использовать дин. массив, то посмотри в сторону strcpy aka lstrcpy- Win version, которая возвращает первый аргумент, но предварительно !!!скопировав!!! в его элементы значения из элементов второго. ЗЫ извиняюсь за ошибки как логические, так и орф. - писал спросоня Это сообщение отредактировал(а) En_t_end - 19.7.2005, 07:24 |
||||
|
|||||
![]()
|
| Правила форума "Центр помощи" | |
|
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Центр помощи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |