Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.06.2011, 15:31   #1
eugrita
Пользователь
 
Регистрация: 01.04.2010
Сообщений: 11
По умолчанию Аналоги динамических массивов в TP, PascalABC

полноценного открытого массива скажем type arr=array of integer;
Pascal не поддерживает. Используют аналоги:
Код:
type mA=array[1..1] of TRab;
   pA=^mA;
var  A: pA;
далее к A можно применить выделение памяти GetMem и обращаться к массиву через указатели типа A^[i]
В Примере классов (pascalABC) с использованием этого такое выделение памяти приводит к сообщению о выходе за граница массива
Код:
type
  Trab=class
  suc: Trab;
  FIO: string;
  NK: kf; 
  stavka: integer;
  constructor Create(Fam:string;nkaf:integer);
end;
type mA=array[1..1] of TRab;
   pA=^mA;
Type Tarr = class {динамический массив элементов Trab}
 public
   n: integer;
   A: pA;
   constructor Create;
   procedure add(val: Trab);
 end;
procedure Tarr.add(val: Trab);
 var siz:word;
  begin
   n:=n+1; siz:=n*SizeOf(mA); GetMem(A,siz);
   A^[n]:=val;//здесь при n>1  ошибка выход за границы массива
  end;
Как быть?
eugrita вне форума Ответить с цитированием
Старый 21.06.2011, 16:42   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

хакерство всё это... грязные методы...
может лучше посмотреть на использование динамических структур (связных списков) ?! Это может оказаться и надежнее, и красивее и эффективнее, чем манипуляции с указателями...

а вообще, мне удалось обмануть это Pascal.ABC таким образом:
Код:
type mA=array[1..1] of integer;
     mAFictive=array[1..10000] of integer;
     pAFict = ^mAFictive;

procedure ArrayAdd(var AAA : pAFict; var N : integer; val: integer);
 var siz : word;
     pAF, p4Free : pAFict;
     i : integer;
  begin
    n:=n+1;
    siz:=n*SizeOf(mA);
    GetMem(pAF,siz); {выделяем новую область памяти}
    // копируем туда старые данные
    for i:=1 to n-1 do pAF^[i] :=  AAA^[i]; // можно через CopyMem переписать...
    p4Free := AAA; {сохраним указатель на ту память, чтобы была выделена ранее}
    AAA := pAF; {теперь новая память доступна}
    FreeMem(p4Free); {очистим предыдущий указатель}
    AAA^[n]:=val;
  end;

var
  i, n   : integer;
  pAF : pAFict;
begin
   WriteLn('Хакерские приемы в PASCAL.ABC');
   n:=0;
   ArrayAdd( pAF, n, 200 );
   ArrayAdd( pAF, n, 300 );
   ArrayAdd( pAF, n, 400 );
   for i:=1 to N do
//     Writeln(i, ' = ', pAFict(A)^[i]);
     Writeln(i, ' = ', pAF^[i]);
     
   FreeMem(pAF); // обязательно освободить память...
   readln;
end.

Кстати, если выделить память ОДИН раз (сразу, сколько надо - задать нужное N и выделить), тогда не понадобятся трюки с копированием из старой области памяти в новую, это весьма положительно скажется на быстродействии...

Последний раз редактировалось Serge_Bliznykov; 21.06.2011 в 16:46.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Из динамических массивов в обычные Zayka Помощь студентам 9 18.04.2011 01:32
удаление динамических массивов Dimarik Общие вопросы C/C++ 20 14.03.2011 12:30
сортировка динамических массивов в Си тина сорока Помощь студентам 2 26.02.2010 00:39
обработка динамических массивов funky Помощь студентам 0 11.05.2009 17:53
C++. Объявление динамических массивов. Парсифаль Помощь студентам 27 03.05.2009 23:21