Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  3 813

•  TDictionary Custom Sort  5 919

•  Fast Watermark Sources  5 722

•  3D Designer  8 503

•  Sik Screen Capture  6 058

•  Patch Maker  6 500

•  Айболит (remote control)  6 491

•  ListBox Drag & Drop  5 352

•  Доска для игры Реверси  95 040

•  Графические эффекты  6 692

•  Рисование по маске  5 827

•  Перетаскивание изображений  4 875

•  Canvas Drawing  5 249

•  Рисование Луны  4 971

•  Поворот изображения  4 521

•  Рисование стержней  3 201

•  Paint on Shape  2 446

•  Генератор кроссвордов  3 318

•  Головоломка Paletto  2 630

•  Теорема Монжа об окружностях  3 422

•  Пазл Numbrix  2 258

•  Заборы и коммивояжеры  2 917

•  Игра HIP  1 885

•  Игра Go (Го)  1 802

•  Симулятор лифта  2 141

•  Программа укладки плитки  1 867

•  Генератор лабиринта  2 307

•  Проверка числового ввода  1 993

•  HEX View  2 304

•  Физический маятник  1 964

 
скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Использование указателей на целое



Дочь подходит к отцу-программисту, сидящему за компьютером:
- Папа... я беременна...
Отец, не отрывая глаз от монитора:
- А ты уверена, что от тебя?

Сначала вы должны создать тип:


Type
Pinteger : ^Integer;

Var
MyPtr : Pinteger;

Мне кажется, что в начале вы использовали плохой пример, имеет смысл использовать 32-битный указатель для 16-битной величины или распределять 10 байт для переменной.

Pascal позволяет вам использовать методы NEW и DISPOSE, которые автоматически распределяют и освобождают правильные размеры блока.

Например,


NEW(MyPtr) = GetMem(MyPtr, Sizeof(MyPtr))

Возможно, вы захотите подсчитать количество целочесленных переменных. В этом случае ознакомьтесь с возможностями TList. Пока лучше используйте линейный массив (или указатель на первый элемент, чтобы вычислить их количество, достаточно разделить количество занимаемой массивом памяти на количество элементов).

Для полноты, это должно быть:


NEW(MyPtr) = GetMem(MyPtr, SizeOf(MyPtr^));

SizeOf(MyPtr) всегда будет равен 4 байта, как 16-битный указатель.

Если я правильно разобрался в том, что вы хотите (динамический массив целых, количество элеметнов которого может быть известно только во время выполнения приложения), вы можете сделать так:


Type
  pIntArr = ^IntArr;
  IntArr  = Array[1..1000] of Integer;
Var
  MyPtr : pIntArr;
Begin
  GetMem(MyPtr, 10); { 10 = SizeOf(Integer) * 5 !!)
  { MyPtr[2]:=1; }
  // <<<< Заполняем массив >>>>
  MyPtr[2]^:=1;
  FreeMem(MyPtr,10);
End;

Технология похожа на ту, которуя Delphi использует при работе с pchar. Синтаксис очень похож:


type
  intarray = array[0..20000] of integer;

procedure TForm1.Button1Click(Sender: TObject);
var
  xptr:  ^IntArray;
begin
  GetMem(xptr, 10);
  xptr^[idx] := 1;  { где idx от 0 до 4, поскольку мы
                      имеем 10 байте = 5 целых }
  FreeMem(xptr, 10);
end;

Обратите внимание на то, в вам в действительности нет необходимости распределять массив для 20,000 элементов, но проверка диапазона Delphi не будет работать, если диапазон равен 20,000. (Предостережение будущим пользователям!)








Copyright © 2004-2025 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте