![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите хорошую книгу по работе с указателями
Галинка © (2006-04-15 01:17:00)Собственно сабж. Пытаюсь разобраться, но не очень получается. (((
TUser (2006-04-16 06:09:00) [1]
> System,Move((FArray + (alndex * FElementSize))^,
> (FArray+ (succ(alndex) * FElementSize))^,
> (Count - alndex) * FElementSize);
Обязательно ли читать книгу, в которой используется такой код?
Anatoly Podgoretsky (2006-04-15 14:41:00) [2]Посмотреть класс модуля в исходниках.
Галинка (2006-04-15 14:40:00) [3]Anatoly Podgoretsky © (15.04.06 14:32) [10]
Вот и он, в смысле автор, сравнивает это все с TList... Может может кто-нибудь еще что-то пососветовать, в смысле почитать...
Anatoly Podgoretsky (2006-04-15 14:32:00) [4]Галинка © (15.04.06 13:38) [8]
Неужели все это бесполезно?
С классом не безполезно, можно делать любую обертку, типичный представитель TList
Romkin (2006-04-15 13:47:00) [5]Главное - понять, что такое указатели и терминологию. Вот первое, что приходит в голову:
Допустим, есть дом на сотню квартир, и есть сантехник, его обслуживающий. У сантехника есть ящик, куда можно кинуть один листочек с номером квартиры. Когда ему скучно, он открывает этот ящичек, и если в нем есть листочек с номером квартиры, он идет в эту квартиру и устраивает потоп ;)
Так вот, квартиры - ячейки памяти, сантехник процедура, его ящичек - указатель (допустим, параметр процедуры), а листочек с номером квартиры - ссылка на ячейку памяти.
То есть в псевдокоде:
type
app = array [1..100] of word - квартиры, массив, word - просто для примера
procedure Устроить потоп(ящик: PWord); // сантехник, ящик - типированный указатель на квартиру.
var
Квартира: word
begin
...
if assigned(ящик) then
begin
Квартира := ящик^; //разыменовываем указатель
Делаем потоп
end
...
end
Вызов: Устроить потоп(@app[4]) - передаем ссылкуна четвертую квартиру.
А если Устроить потоп(nil) - ничего не будет, указатель пуст.
Теперь предположим, что привезли бытовку:
var
Бытовка: PWord; //Место куда ставить, указатель
begin
GetMem(Бытовка, SizeOf(Word)); //привезли
Устроить потоп(Бытовка); - НУ да, то, что и раньше
FreeMem(Бытовка); - увезли
Вот вроде и все, что нужно понимать :)
А массив - это просто массив. Сделать с ним можно многое, иногда пишут код, который делает с этим массивом что-то определенное, и тогда вся эта конструкция называется структурой данных. Каждая такая структура данных характеризуется набором действий, которые можно сделать в ней, и асимптотикой времени выполнения каждого такого действия. У тебя, похоже, именно структура - есть доюавление элемента, удаление, перестановка...
Галинка (2006-04-15 13:38:00) [6]Анатолий, просто я сейчас читаю Бакнела "Фундаментальные алгоритмы и структуры данных в Delphi". Там в разделе массивы он описывает как раз создание класса одномерного динамического массива со всеми функциями: добавление и вставка элемента, удаление элемента, поиск элемента, перестановка элементов и т.д. Неужели все это бесполезно?
Просто я очень часто пользуюсь массивами, особенно массивами из записей. Может было бы не плохо создать такой вот класс?
Anatoly Podgoretsky (2006-04-15 13:11:00) [7]У array of ... нет такиъ методов, да и сложно было бы их придумать, поскольку сложность массива не ограничена, ни по глубине, ни по измерениям, ни по типам.
Почитать - это надо в основном смотреть старые книги.
Работа напрямую с указателями мало отличается от работы без них, ранее надо было указывать ^, теперь достаточно точку. Вся сложность состоит при работе с выделением памяти, что бы не испортить указатель и освободить память если она не нужна. Во времена динамических массивов подобная самодеятельность нужна весьма редко. Но и она относится не к работе с указателями, а работе с управлением памятью.
Галинка (2006-04-15 13:04:00) [8]Gero © (15.04.06 02:29) [4]
а у array of ... тоже есть функции вставки, удаления, перестановки элементов? Просто я пользовалась ими просто как массивами переменной длины.
Анатолий, а можно про это где-то почитать? И вправду интересно...
Anatoly Podgoretsky (2006-04-15 12:06:00) [9]Как правило вся работа ведется через указатели, просто эта работа скрыта за высокоуровневыми конструкциями.
А сама работа очень простая и понятна. Указатель указывает на объект.
Gero (2006-04-15 02:29:00) [10]> т.е. создан и описан класс динамических массивов
Зачем класс, достаточно array of.
Галинка (2006-04-15 02:07:00) [11]DevilDevil © (15.04.06 01:44) [2]
спасибо. Благодаря Вашему примеру поняла, что было в книге написано. Я просто сейчас читаю книгу, в которой описано создание и работа с динамическими массивами, т.е. создан и описан класс динамических массивов. Так вот ьто, что вы написали, применяется там, для вставки, добавлени, удаления и замены элементов массива в форме:
System,Move((FArray + (alndex * FElementSize) )^,
(FArray+ (succ(alndex) * FElementSize) )^,
(Count - alndex) * FElementSize);
DevilDevil (2006-04-15 01:44:00) [12]Нет такой книги, потому что тема на одну главу.
Короче у тебя в компе есть оперативная память. Её можно изменять, заносить чё-либо туда, брать данные. Указатели применяются в тех программах, где происходит работа с самой памятью.
Скажи, какая у тебя задача, я постараюсь помочь!
Ну так вот. Ты можешь захватить памяти столько сколько тебе нужно:
var P : pointer;
begin
GetMem(P, 1024); // захватил 1 кб памяти
...
FreeMem(P);// Обязательно делай
end;
Существуют и другие способы захвата/освобождения памяти, это - самый простой. Если тебе надо занести допустим значение переменной типа Integer в эту память, начиная например с 1000го байта, то сделать это можно так:
var I : integer;
...
PInteger(dword(P) + 1000)^ := I; // вот такай конструкция
...
FreeMem(P);
end;
Соответственно, прочитать:
I := PInteger(dword(P) + 1000)^;
А если байт, то:
var b : byte;
...
b := pbyte(dword(P) + 1000)^;
...
end;
Ну и так для всех типов данных. Там есть ещё несколько прибамбасов. Так что пиши, что непонимаешь
Gero (2006-04-15 01:20:00) [13]Вряд ли существует книга по работе с указателями.