0.25
Модератор: Jolly Roger
- Харука-тян
- Мастер
- Сообщения: 544
- Зарегистрирован: 29 ноя 2006, 00:23
- Контактная информация:
Re: ランセラン : リロード (Lanceran : Reload)
Терпеть не могу переписывать код. Потому, что это бесполезно. С другой стороны, когда всё собрано из костылей - это не дело. Но при полном переписывании есть большая вероятность повторного переноса костылей в новую версию, а при частичном - из костылей строится мостик между новым кодом и старым. Что делать и как дальше быть?
- Maelstrom
- Мастер
- Сообщения: 2062
- Зарегистрирован: 26 ноя 2006, 14:19
- Откуда: г. Усть-Кирдык
- Контактная информация:
Re: ランセラン : リロード (Lanceran : Reload)
Тогда зачем переписываешь?Терпеть не могу переписывать код. Потому, что это бесполезно.
Айв кнгенгах Йог-Сотот
- Jolly Roger
- Сообщения: 2973
- Зарегистрирован: 27 ноя 2009, 09:10
- Откуда: Minsk, Belarus
Re: ランセラン : リロード (Lanceran : Reload)
Код переписывать таки очень даже полезно.
Только по кускам, убивая костыли по одному или парами.
Только по кускам, убивая костыли по одному или парами.
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.
Re: ランセラン : リロード (Lanceran : Reload)
А где конкретно костыли?
Если какая-то функция написана через задницу, но работает, то черт с ней, я щитаю.
А если уже вся программа начинает приобретать вид лихо закрученного детектива, в котором одна функция исправляет ошибки, возникающие в ходе исполнения другой - тогда наверное лучше переписать все с начала. И перед этим посвятить пару часиков размышлениям и благочестивой медитации на то, какой вообще будет общая структура программы.
Если какая-то функция написана через задницу, но работает, то черт с ней, я щитаю.
А если уже вся программа начинает приобретать вид лихо закрученного детектива, в котором одна функция исправляет ошибки, возникающие в ходе исполнения другой - тогда наверное лучше переписать все с начала. И перед этим посвятить пару часиков размышлениям и благочестивой медитации на то, какой вообще будет общая структура программы.
- MyParanoya
- Сообщения: 159
- Зарегистрирован: 01 дек 2009, 19:13
Re: ランセラン : リロード (Lanceran : Reload)
я конечно пафосный гей-кодер, но вмешаюсь)
зачем оставлять через жопу то, что сделано только для себя и имеет целью повышения навыка в т.ч.?
ведь потом будет соблазн все остальное делать через жопу)
зачем оставлять через жопу то, что сделано только для себя и имеет целью повышения навыка в т.ч.?
ведь потом будет соблазн все остальное делать через жопу)
Re: ランセラン : リロード (Lanceran : Reload)
Ну не знаю, я всегда пишу не для скилов, а чтобы реализовать интересную идею и заодно сбросить Бискапа с парахода современности, лол.
Я вот не 100% не смог бы написать 7drl или yet another adom, просто потому, что не нашел бы мотивации их делать.
И мне интереснее написать неработающий кусок, чем переписывать работающий, но неэстетично написанный.
Я вот не 100% не смог бы написать 7drl или yet another adom, просто потому, что не нашел бы мотивации их делать.
И мне интереснее написать неработающий кусок, чем переписывать работающий, но неэстетично написанный.
- Maelstrom
- Мастер
- Сообщения: 2062
- Зарегистрирован: 26 ноя 2006, 14:19
- Откуда: г. Усть-Кирдык
- Контактная информация:
Re: ランセラン : リロード (Lanceran : Reload)
Открою тебе страшную тайну: не все задрачивают код до посинения, чтобы что-то там повысить. Некоторые хотят сделать рогаликзачем оставлять через жопу то, что сделано только для себя и имеет целью повышения навыка в т.ч.?
Айв кнгенгах Йог-Сотот
- Харука-тян
- Мастер
- Сообщения: 544
- Зарегистрирован: 29 ноя 2006, 00:23
- Контактная информация:
Re: ランセラン : リロード (Lanceran : Reload)
Кто-нибудь знает, как в фрипаскале можно взять адрес переменной?
такая конструкция не работает:
такая тем более
что делать?
такая конструкция не работает:
Код: Выделить всё
pItem := addr(TItem.Create());
Код: Выделить всё
pItem := @(TItem.Create());
- Максим Кич
- Администратор
- Сообщения: 1642
- Зарегистрирован: 03 дек 2006, 20:17
- Откуда: Витебск, Беларусь
- Контактная информация:
Re: ランセラン : リロード (Lanceran : Reload)
Если тебе нужен указатель на переменную, то для класса TItem, это будет:Харука-тян писал(а):Кто-нибудь знает, как в фрипаскале можно взять адрес переменной?
такая конструкция не работает:такая тем болееКод: Выделить всё
pItem := addr(TItem.Create());
что делать?Код: Выделить всё
pItem := @(TItem.Create());
var pItem:TItem;
//bla-bla-bla
pItem := TItem.Create();
И есть смысл работать именно с классами, не влезая в pointer-ы.
Dump the screen? [y/n]
- Харука-тян
- Мастер
- Сообщения: 544
- Зарегистрирован: 29 ноя 2006, 00:23
- Контактная информация:
Re: ランセラン : リロード (Lanceran : Reload)
Конструктор TItem возвращает TItem, и доказать компилятору, что это совместимые типы, я не могуМаксим Кич писал(а):pItem := TItem.Create();
- Максим Кич
- Администратор
- Сообщения: 1642
- Зарегистрирован: 03 дек 2006, 20:17
- Откуда: Витебск, Беларусь
- Контактная информация:
Re: ランセラン : リロード (Lanceran : Reload)
Если ты пытаешься совместить в одной переменной несовместимые типы — ты скорее всего делаешь изначально что-то не то. А если речь идёт об экземплярах класса, то ты наверняка делаешь что-то не то.Харука-тян писал(а):Конструктор TItem возвращает TItem, и доказать компилятору, что это совместимые типы, я не могуМаксим Кич писал(а):pItem := TItem.Create();
Давай ты всё-таки расскажешь свой коварный замысел, потому что вне контекста сложно себе представить, в чём проблема и как её решать.
Dump the screen? [y/n]
- Харука-тян
- Мастер
- Сообщения: 544
- Зарегистрирован: 29 ноя 2006, 00:23
- Контактная информация:
Re: ランセラン : リロード (Lanceran : Reload)
С этим я уже справилась. Теперь затыкаю утечки памяти Проверяю память в ячейке сразу после выставления - всё в порядке. Обращаюсь к этой ячейке из другой процедуры - ошибка. Я дура?
Код: Выделить всё
//создание предмета
TMap.AddItem(itemID:string; x,y: byte);
var
itm: TItem;
begin
itm := TItem.Create; //В ячейку карты x,y записывается
PutItem(addr(itm), x, y); //указатель на созданный предмет
end;
TMap.PutItem(itm: pItem);
begin
Map[x,y].Item := itm;
end;
TMap.DrawCell(x,y:byte);
begin
if Map[x,y].Item<>nil then //и тут ошибка обращения. указатель не nil, но и не на предмет.
Output.DrawChar(x,y+3, Map[x,y].Item^.Color, Map[x,y].Item^.Picture);
//как такое может быть?
end;
- Максим Кич
- Администратор
- Сообщения: 1642
- Зарегистрирован: 03 дек 2006, 20:17
- Откуда: Витебск, Беларусь
- Контактная информация:
Re: ランセラン : リロード (Lanceran : Reload)
А ты уверена, что проблема не с этим:
Что есть Color и Picture, и зачем так сурово к ним обращаться?
Код: Выделить всё
Map[x,y].Item^.Color, Map[x,y].Item^.Picture
Dump the screen? [y/n]
- Харука-тян
- Мастер
- Сообщения: 544
- Зарегистрирован: 29 ноя 2006, 00:23
- Контактная информация:
Re: ランセラン : リロード (Lanceran : Reload)
Проблема не с этим. Color и Picture - цвет и символ для отрисовки предмета. У меня только что получилось заставить игру не вылетать, и теперь я вижу вместо валяющегося на земле предмета пустоту. После выполнения "look', пустота превращается в синюю в. А должна быть зелёная [. Чертовщина какая-то...
Причина такой суровости заключается в том, что все предметы имеют ссылки previtm и nextitm на предыдущий и следующий премет в инвентаре/на земле. Это список с двусторонней связкой. И он у меня как-то не так получился. Хныыыык...
Причина такой суровости заключается в том, что все предметы имеют ссылки previtm и nextitm на предыдущий и следующий премет в инвентаре/на земле. Это список с двусторонней связкой. И он у меня как-то не так получился. Хныыыык...
- Максим Кич
- Администратор
- Сообщения: 1642
- Зарегистрирован: 03 дек 2006, 20:17
- Откуда: Витебск, Беларусь
- Контактная информация:
Re: ランセラン : リロード (Lanceran : Reload)
С моей досужей точки зрения, корень твоих бед в том, что ты пытаешься принудительно работать с указателями там, где они и так уже есть. Не глядя на код могу сразу сказать, что он может быть переписан без единой «птички^».Харука-тян писал(а):Проблема не с этим. Color и Picture - цвет и символ для отрисовки предмета. У меня только что получилось заставить игру не вылетать, и теперь я вижу вместо валяющегося на земле предмета пустоту. После выполнения "look', пустота превращается в синюю в. А должна быть зелёная [. Чертовщина какая-то...
Причина такой суровости заключается в том, что все предметы имеют ссылки previtm и nextitm на предыдущий и следующий премет в инвентаре/на земле. Это список с двусторонней связкой. И он у меня как-то не так получился. Хныыыык...
Dump the screen? [y/n]
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 56 гостей