Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.30;
Скачать: CL | DM;

Вниз

Подскажите хорошую книгу по работе с указателями   Найти похожие ветки 

 
Галинка ©   (2006-04-15 01:17) [0]

Собственно сабж. Пытаюсь разобраться, но не очень получается. (((


 
Gero ©   (2006-04-15 01:20) [1]

Вряд ли существует книга по работе с указателями.


 
DevilDevil ©   (2006-04-15 01:44) [2]

Нет такой книги, потому что тема на одну главу.

Короче у тебя в компе есть оперативная память. Её можно изменять, заносить чё-либо туда, брать данные. Указатели применяются в тех программах, где происходит работа с самой памятью.
Скажи, какая у тебя задача, я постараюсь помочь!

Ну так вот. Ты можешь захватить памяти столько сколько тебе нужно:
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;


Ну и так для всех типов данных. Там есть ещё несколько прибамбасов. Так что пиши, что непонимаешь


 
Галинка ©   (2006-04-15 02:07) [3]

DevilDevil ©   (15.04.06 01:44) [2]

спасибо. Благодаря Вашему примеру поняла, что было в книге написано. Я просто сейчас читаю книгу, в которой описано создание и работа с динамическими массивами, т.е. создан и описан класс динамических массивов. Так вот ьто, что вы написали, применяется там, для вставки, добавлени, удаления и замены элементов массива в форме:

System,Move((FArray + (alndex * FElementSize) )^,
                  (FArray+ (succ(alndex) * FElementSize) )^,
                  (Count - alndex) * FElementSize);


 
Gero ©   (2006-04-15 02:29) [4]

> т.е. создан и описан класс динамических массивов

Зачем класс, достаточно array of.


 
Anatoly Podgoretsky ©   (2006-04-15 12:06) [5]

Как правило вся работа ведется через указатели, просто эта работа скрыта за высокоуровневыми конструкциями.
А сама работа очень простая и понятна. Указатель указывает на объект.


 
Галинка ©   (2006-04-15 13:04) [6]

Gero ©   (15.04.06 02:29) [4]

а у array of ... тоже есть функции вставки, удаления, перестановки элементов? Просто я пользовалась ими просто как массивами переменной длины.

Анатолий, а можно про это где-то почитать? И вправду интересно...


 
Anatoly Podgoretsky ©   (2006-04-15 13:11) [7]

У array of ... нет такиъ методов, да и сложно было бы их придумать, поскольку сложность массива не ограничена, ни по глубине, ни по измерениям, ни по типам.

Почитать - это надо в основном смотреть старые книги.
Работа напрямую с указателями мало отличается от работы без них, ранее надо было указывать ^, теперь достаточно точку. Вся сложность состоит при работе с выделением памяти, что бы не испортить указатель и освободить память если она не нужна. Во времена динамических массивов подобная самодеятельность нужна весьма редко. Но и она относится не к работе с указателями, а работе с управлением памятью.


 
Галинка ©   (2006-04-15 13:38) [8]

Анатолий, просто я сейчас читаю Бакнела "Фундаментальные алгоритмы и структуры данных в Delphi". Там в разделе массивы он описывает как раз создание класса одномерного динамического массива со всеми функциями: добавление и вставка элемента, удаление элемента, поиск элемента, перестановка элементов и т.д. Неужели все это бесполезно?

Просто я очень часто пользуюсь массивами, особенно массивами из записей. Может было бы не плохо создать такой вот класс?


 
Romkin ©   (2006-04-15 13:47) [9]

Главное - понять, что такое указатели и терминологию. Вот первое, что приходит в голову:
Допустим, есть дом на сотню квартир, и есть сантехник, его обслуживающий. У сантехника есть ящик, куда можно кинуть один листочек с номером квартиры. Когда ему скучно, он открывает этот ящичек, и если в нем есть листочек с номером квартиры, он идет в эту квартиру и устраивает потоп ;)
Так вот, квартиры - ячейки памяти, сантехник процедура, его ящичек - указатель (допустим, параметр процедуры), а листочек с номером квартиры - ссылка на ячейку памяти.
То есть в псевдокоде:

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(Бытовка); - увезли

Вот вроде и все, что нужно понимать :)
А массив - это просто массив. Сделать с ним можно многое, иногда пишут код, который делает с этим массивом что-то определенное, и тогда вся эта конструкция называется структурой данных. Каждая такая структура данных характеризуется набором действий, которые можно сделать в ней, и асимптотикой времени выполнения каждого такого действия. У тебя, похоже, именно структура - есть доюавление элемента, удаление, перестановка...


 
Anatoly Podgoretsky ©   (2006-04-15 14:32) [10]

Галинка ©   (15.04.06 13:38) [8]
Неужели все это бесполезно?

С классом не безполезно, можно делать любую обертку, типичный представитель TList


 
Галинка ©   (2006-04-15 14:40) [11]

Anatoly Podgoretsky ©   (15.04.06 14:32) [10]

Вот и он, в смысле автор, сравнивает это все с TList... Может может кто-нибудь еще что-то пососветовать, в смысле почитать...


 
Anatoly Podgoretsky ©   (2006-04-15 14:41) [12]

Посмотреть класс модуля в исходниках.


 
TUser ©   (2006-04-16 06:09) [13]


> System,Move((FArray + (alndex * FElementSize))^,
>                   (FArray+ (succ(alndex) * FElementSize))^,
>                   (Count - alndex) * FElementSize);

Обязательно ли читать книгу, в которой используется такой код?



Страницы: 1 вся ветка

Текущий архив: 2006.04.30;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.025 c
15-1144322061
Суслик
2006-04-06 15:14
2006.04.30
XML parser


2-1145188039
АЮМ
2006-04-16 15:47
2006.04.30
сохранить в файл?


15-1144484300
(AD)acid
2006-04-08 12:18
2006.04.30
Смерш 2 Василия Голвачева


2-1144657313
ANB_Temp
2006-04-10 12:21
2006.04.30
Как в самой 1C выполнить ее же выражение ?


2-1144910064
fast2
2006-04-13 10:34
2006.04.30
Как записать на паскале (в Делфи) выражение: