Текущий архив: 2007.07.01;
Скачать: CL | DM;
Вниз
Вопрос про динамические массивы и указатели. Найти похожие ветки
← →
@!!ex_ (2007-06-02 18:15) [0]Есть массив:
Cars:array of TCar;
Я беру и делаю так:
Car:^TCar;
Car:=@Cars[N];
Cars[N+1]:=Cars[N];
Cars[N]:=...;
Вопрос, на что будет указывать Указатель Car?
ведь по идее, дин. массивы - это массивы указателей. Следовательно Car будет указывать в правильное место. Нет?
← →
@!!ex_ (2007-06-02 18:15) [1]В правильное место, имеется ввиду на тот же элемент массива, как будто он никуда и не переезжал.
← →
Anton_K © (2007-06-02 18:25) [2]
> дин. массивы - это массивы указателей
нет, это указатели на массивы.
← →
Loginov Dmitry © (2007-06-02 18:26) [3]и как ведь по идее, дин. массивы - это массивы указателей вяжется с
на что будет указывать Указатель Car?
← →
@!!ex_ (2007-06-02 18:30) [4]> [3] Loginov Dmitry © (02.06.07 18:26)
> и как ведь по идее, дин. массивы - это массивы указателей
> вяжется с
> на что будет указывать Указатель Car?
Как я это понимаю:
Массив указателей:
Первый элемент - указывает на 005224
Второй элемент - указывает на 005225
Третий элемент - указывает на 005226
Четвертый элемент - указывает на 005227
Я в Car значение адрес второго элемента, тоесть Car=005225
После чего, скажем меняю второй и третий элемент местами,
становится так:
Первый элемент - указывает на 005224
Второй элемент - указывает на 005226
Третий элемент - указывает на 005225
Четвертый элемент - указывает на 005227
Однако Car по прежнему указывает на ТОТ же элемент.
Я догадываюсь, что где то в логике, возможно есть косяк. Поэтому и спрашиваю.
← →
Loginov Dmitry © (2007-06-02 18:44) [5]> После чего, скажем меняю второй и третий элемент местами,
>
> становится так:
> Первый элемент - указывает на 005224
> Второй элемент - указывает на 005226
> Третий элемент - указывает на 005225
> Четвертый элемент - указывает на 005227
Ниче подобного. Элементы твоего динамического массива содержат значения, а не указатели.
← →
@!!ex_ (2007-06-02 18:50) [6]Ок. Тогда все вообще хреново, поскольку при изменении размера массива все указатели на элементы массива уходят в трэш.
Как мне сохранить доступ к некоторму элементу?
Смысл такой, делаю ракету, ей указывается цель, и она к ней должна лететь. Цель двигается. Соответственно постоянно коректировка курса.
Все бы ничего, но количество объектов постоянно меняется и соответственно массив постоянно меняется.
Как можно сделать?
← →
Loginov Dmitry © (2007-06-02 19:04) [7]и что такое TCar?
← →
Zeqfreed © (2007-06-02 19:09) [8]Списки указателей вместо массива использовать?
← →
@!!ex_ (2007-06-02 19:10) [9]> Loginov Dmitry © (02.06.07 19:04)
немеренная запись, содержащяя в том числе и позицию объекта, которая мне и нужна.
← →
Kolan © (2007-06-02 19:10) [10]Вот ум меня вопрос, вот это «^» и «@» ты без них никак обойтись не можешь?
← →
@!!ex_ (2007-06-02 19:14) [11]> [8] Zeqfreed © (02.06.07 19:09)
Гору кода переписывать. :(
> [10] Kolan © (02.06.07 19:10)
А какие варианты?
Сам массив из внешних источников не доустпен, да и не элементы постоянно меняются местами из-за того, что их количество меняется.
Тоесть надо из середины убрать элемент, делаю так:
Items[N]:=Items[Count-1];
dec(Count);
В итоге номер элемента быстро сбивается и перестает быть равным ранее заданному значению.
Я так понимаю, вариантов решения нет вообще, и архитектуру придется менять.
Спасибо!
← →
Loginov Dmitry © (2007-06-02 19:14) [12]> немеренная запись, содержащяя в том числе и позицию объекта,
> которая мне и нужна.
Ну если запись такая такая немеренная, то лучше объявить массив указателей
Cars:array of ^TCar;
и самому заниматься распределением памяти с помощью New/Dispose
Также обрати внимание на [8].
← →
Kolan © (2007-06-02 19:20) [13]> объявить массив указателей
Массив указателей на указатели из указателей, нах они вам сдались?
> да и не элементы постоянно меняются местами из-за того,
> что их количество меняется.
Ну и возьми список. «Врефакторить» список вместо массива должно быть не сложно. Избавься от этих указателей они все запутывают.
← →
VirEx © (2007-06-02 19:21) [14]type
PCar = ^TCar;
TCar = record
name:string;
price:integer;
...и т.п.
end;
var
Cars:array of PCar;
begin
setlength(Cars,5);//теперь длина динамического массива 6 элементов от нуля
getmem(Cars[0],SizeOf(TCar));//выделяем для элемента в массиве память
Cars будет указывать на начало динамического массива в памяти
Cars[0] будет указывать на offset нужного элемента в массиве
← →
Loginov Dmitry © (2007-06-02 19:23) [15]> [13] Kolan © (02.06.07 19:20)
Хорош гнать, ок?
← →
Loginov Dmitry © (2007-06-02 19:25) [16]> getmem(Cars[0],SizeOf(TCar));//выделяем для элемента в массиве
> память
Тогда ужNew(Cars[0])
← →
Kolan © (2007-06-02 19:27) [17]> getmem(Cars[0],SizeOf(TCar));//выделяем для элемента в массиве
> память
Не пиши так(Автор). Начни сReplace Record with Data Class
. Имхо все поправишь быстро…
← →
Kolan © (2007-06-02 19:28) [18]> Хорош гнать, ок?
Тише, ок.
А что не так? Что не нравиться? Нафига тут вообще массив?
← →
Kolan © (2007-06-02 19:29) [19]Имхо это запах
Primitive Obsession
.
← →
VirEx © (2007-06-02 19:37) [20]getmem - выделяет память с заданным размером.
new - в зависимости от типа, выделяет память с размером типа и инициализирует.
не особо большие различия.
← →
Loginov Dmitry © (2007-06-02 19:39) [21]> А что не так?
Ну что это за такое: "Избавься от этих указателей они все запутывают"?
Это одно из решений задачи. Ты же сам предлагаешь использовать список. Но что в нем предлагаешь хранить? Надо думать, теже указатели, которые так тебя запутывают :)
← →
Loginov Dmitry © (2007-06-02 19:43) [22]> не особо большие различия.
ну-ну. Можешь использовать GetMem, если различие для тебя не особо большое))
а вообще вся фишка New - в именно в инициализации и в отсутствии необходимости указывать размер структуры. А инициализация - не только обнуление полей структуры.
← →
Kolan © (2007-06-02 19:43) [23]> Но что в нем предлагаешь хранить?
Объекты! Да, по сути это указатели но я об этом не думаю когда пишу. Я думаю что уменя масив машин(из сабжа) и все встаёт на места… И все перестановки можно потом переместить в объект TCar…
← →
Kolan © (2007-06-02 19:45) [24]> Надо думать, теже указатели, которые так тебя запутывают
И не только меня кстати:
«Вопрос, на что будет указывать Указатель Car?» — © Сабж
← →
VirEx © (2007-06-02 19:57) [25]на область памяти в которой расположен массив
← →
VirEx © (2007-06-02 19:58) [26]..и если память под массив не выделена будет AV
← →
Loginov Dmitry © (2007-06-02 19:59) [27]> Объекты! Да, по сути это указатели но я об этом не думаю
> когда пишу. Я думаю что уменя масив машин(из сабжа) и все
> встаёт на места… И все перестановки можно потом переместить
> в объект TCar…
TCar у Автора - это не объект, а структура.
> И не только меня кстати:
> «Вопрос, на что будет указывать Указатель Car?» — © Сабж
Это легко излечимо :)
← →
Kolan © (2007-06-02 20:03) [28]> TCar у Автора — это не объект, а структура.
[17] Kolan © (02.06.07 19:27)
:-|
…
← →
@!!ex_ (2007-06-02 20:03) [29]С указателями я как бы дружу.
Вопрос в том, что не понимаю, как работает дин. массив.
Видимо придется в итоге все переписывать на свою реализацию массивов.
← →
Kolan © (2007-06-02 20:08) [30]> Видимо придется в итоге все переписывать на свою реализацию
> массивов.
Ла на посл попытка с моей стороны.
Имхо надо чуток проанализоровать. Пост проPrimitive Obsession
тебя не натолкнул на мысль?
Что такое у тебя TCar?
И зачем тебе их список/массив?
← →
@!!ex_ (2007-06-02 20:10) [31]> Kolan © (02.06.07 20:08)
Я имею ввиду, что вообще в проекте откажусь от дин. массивов стандартных.
TCar - record.
Список/массив... А где их хранить то? :))
Их же поведение надо расчитывать, отрисовывать, взаимодействие мира с ними, тоже считать.
← →
Kolan © (2007-06-02 20:13) [32]> TCar — record.
Что за сущность из предметной области TCar описывает. Те словами типа TCar — «представляет собой машину на стоянке а кода их много — это все машины на стоянке»
> Их же поведение надо расчитывать, отрисовывать, взаимодействие
> мира с ними, тоже считать.
Ну, такuse OOP dude
.
← →
Kolan © (2007-06-02 20:14) [33]> дин. массивов стандартных.
И сделаешь нестандартные? И это будет: (имхо)Primitive Obsession
Most programming environments have two kinds of data. Record types allow you to structure data into meaningful groups. Primitive types are your building blocks. Records always carry a certain amount of overhead. They may mean tables in a database, or they may be awkward to create when you want them for only one or two things.
One of the valuable things about objects is that they blur or even break the line between primitive and larger classes. You can easily write little classes that are indistinguishable from the built-in types of the language. Java does have primitives for numbers, but strings and dates, which are primitives in many other environments, are classes.
People new to objects usually are reluctant to use small objects for small tasks, such as money classes that combine number and currency, ranges with an upper and a lower, and special strings such as telephone numbers and ZIP codes. You can move out of the cave into the centrally heated world of objects by using Replace Data Value with Object on individual data values. If the data value is a type code, use Replace Type Code with Class if the value does not affect behavior. If you have conditionals that depend on the type code, use Replace Type Code with Subclasses or Replace Type Code with State/Strategy.
If you have a group of fields that should go together, use Extract Class. If you see these primitives in parameter lists, try a civilizing dose of Introduce Parameter Object. If you find yourself picking apart an array, use Replace Array with Object.
Страницы: 1 вся ветка
Текущий архив: 2007.07.01;
Скачать: CL | DM;
Память: 0.56 MB
Время: 0.014 c