Модератор: Модераторы

 Ведь адресная арифметика в fpc нормально работает.
 Ведь адресная арифметика в fpc нормально работает.const  W = 10;
       H = 5;
type  PInt = ^integer;
var   p : ^PInt;
   newp : pointer;
   i, j : integer;
begin
   getmem(newp, H*sizeof(PInt));
   p := newp;
   for i := 0 to H-1 do
   begin
      getmem(newp, W*sizeof(integer));
      (p+i)^ := newp;
   end;
   for i := 0 to H-1 do
       for j := 0 to W-1 do  ((p+i)^+j)^ := i*W + j ;
   
   for i := 0 to H-1 do
       for j := 0 to W-1 do  write( ((p+i)^+j)^, ' ');
end.majhar писал(а):type PInt = ^integer;
var p : ^PInt;
...

Const
  COL = 5;
  ROW = 10;
Var
  DynArray: array of Integer;
  i, j: Integer;
  va-bank: integer;
Begin
...
//Выделяем память под массив
SetLength(DynArray, COL, ROW);
//Заполняем данными
Randomize;
For i:=0 To COL-1 Do
  For j:=0 To ROW-1 Do
     DynArray[i, j]:=Random(100);
//Берём данные из первой попавшийся ячейки
va-bank:=DynArray[Random(COL), Random(ROW)];
//... и превращаем программу в Лас-Вегас казино :)
If va-bank=99 Then
  WriteLn('Вы выиграли 1 000 000 долларов!!!')
Else
  WriteLn('Ну всё, пипец! Ты проиграл даже штаны...');
End;
 ) черновая работа спрятана с глаз долой и программиста рутина не напрягает, а он полностью отдаётся творчеству и ваяет нетленку.
 ) черновая работа спрятана с глаз долой и программиста рутина не напрягает, а он полностью отдаётся творчеству и ваяет нетленку. 
Vadim писал(а):
- Код: Выделить всё
Var
DynArray: array of Integer;
i, j: Integer;
va-bank: integer;
Begin
...
//Выделяем память под массив
SetLength(DynArray, COL, ROW);
Vadim писал(а):У Вас тут получается "указатель на указатель на целочисленный тип". Не слишком ли сложная конструкция?
Мало того, она ещё и сложноинициализируема и сложна для понимания происходящих там процессов. И данные оттуда сложно доставать...
Особенно если речь только о прикладных программах.Vadim писал(а):Нас вообще не должны заботить технические подробности выделения памяти. А с указателями основной процент затрат времени при написании программы уйдёт именно на эту нудную и совершенно неинтересную работу - выделение и освобождение памяти. Мало того, можно выдрать себе последнии волосы из головы, пытаясь найти ошибку связанную с неправильной работой с указателями.
majhar писал(а):Как это???
 Я только там в объявлении неправильно матрицу написал. Надо вот так:
 Я только там в объявлении неправильно матрицу написал. Надо вот так:DynArray: array of array of Integer;
majhar писал(а):Это спорный вопрос. Мне, например, работа функции fpc_dynarray_setlength из rtl, гораздо менее понятна.
 Но если исходить из того, с чем Вы полностью согласны, то вникать в реализацию каждой функции RTL нет никакой необходимости до тех пор, пока эта функция делает то, что нам нужно. И нас примирять с этой функцией должно то обстоятельство, что предназначена она для внутреннего применения в модуле system. Разве что Вы захотите довести скорость работы с динамическими массивами до уровня первой космической.
 Но если исходить из того, с чем Вы полностью согласны, то вникать в реализацию каждой функции RTL нет никакой необходимости до тех пор, пока эта функция делает то, что нам нужно. И нас примирять с этой функцией должно то обстоятельство, что предназначена она для внутреннего применения в модуле system. Разве что Вы захотите довести скорость работы с динамическими массивами до уровня первой космической. 
 Классы, которые созданы по типу хранения данных наподобие массива (например TStringList или TList), обеспечивают неизмеримо большее удобство в применении, чем динамический массив. Ведь динамический массив ограничен функционально тем, что это всего лишь коробочка для хранения данных, с неизвестным начальным объёмом. Кроме хранения он ничего более не умеет.
 Классы, которые созданы по типу хранения данных наподобие массива (например TStringList или TList), обеспечивают неизмеримо большее удобство в применении, чем динамический массив. Ведь динамический массив ограничен функционально тем, что это всего лишь коробочка для хранения данных, с неизвестным начальным объёмом. Кроме хранения он ничего более не умеет.
Vadim писал(а):Правда на сегодняшний день и динамические массивы уже вчерашний день. Классы, которые созданы по типу хранения данных наподобие массива (например TStringList или TList), обеспечивают неизмеримо большее удобство в применении, чем динамический массив. Ведь динамический массив ограничен функционально тем, что это всего лишь коробочка для хранения данных, с неизвестным начальным объёмом. Кроме хранения он ничего более не умеет.А вот классу можно придать нужный функционал, например он может не только хранить матрицу, но и производить её транспортирование или инвертирование, если речь идёт о логическом содержимом. И уже в пользовательской программе не нужно ломать голову, как нам транспортировать матрицу, мы её просто транспортируем и всё...

Вернуться в Обучение Free Pascal
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1