Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Аналог new[]()/malloc()/calloc() в паскале

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Господа!
 
Есть ли в паскале аналог new[]()/malloc()/calloc()? Для размещения массива. Причем именно в паскале, а не, боже упаси, Delphi!

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 10:43 26-01-2005
Ang



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
TheChampion
Смотри в хелпе New/Dispose или Mark/Release

Всего записей: 251 | Зарегистр. 25-07-2001 | Отправлено: 13:44 26-01-2005
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ang
 
New не выделят памяти под более чем одну переменную.

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 13:55 26-01-2005
Ang



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
TheChampion
 
type
  TManyInOne: array[0..49] of integer;
var
  MyArray: ^TManyInOne;
...
  New(MyArray);
...
 
 А так не пойдёт?

Всего записей: 251 | Зарегистр. 25-07-2001 | Отправлено: 14:43 26-01-2005
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
в боже спаси Дельфи (в бытность Object Pascal) есть...
в стандартном "Н.Виртoвском" -- нет...
 
в Дельфи c введением дин массивов за последнее время это все хозяйство стало до безoбразия просто:
 

Код:
 
var
  myLargeDoubleArray: array of double;
 
begin
...
 SetLength(myLargeDoubleArray, 100000); //alloc
 SetLength(myLargeDoubleArray, 200000); //realloc
 
//юзаем без всяких крышечек:
 myLargeDoubleArray[0] := 2.87;
 myLargeDoubleArray[100] := 3.14;
 myLargeDoubleArray[200000-1] := 12345.67890;
 
 SetLength(myLargeDoubleArray, 0); //free
//или вот так:
  myLargeDoubleArray := nil;
...
end.
 

Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 16:12 26-01-2005 | Исправлено: akaGM, 16:25 26-01-2005
pand



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
Вопрос, все таки не по Дельфи.
TheChampion
Все работает именно так как написал Ang функция New выделяет место под любой тип кторый просишь, а определение вначале типа-массива, а затем его использование - это именно тот способ который пропагандирует Паскаль - ака типизируемый язык. Привыкай, для любой вещи сложнее локального использования, всегда проще сразу объявить новый тип.

Всего записей: 1529 | Зарегистр. 03-08-2004 | Отправлено: 16:38 26-01-2005
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
pand
Проблема вот в чем: нужен динамический массив неизвестной длины, как в C/C++. Предложенный способ ничем не отличается от простого объявления массива из 50 элементов, т. е. длина все равно фиксирована.
 
И еще: где взять стандарт ISO/IEC 10206 Extended Pascal Programming Language?
 
Говорят, что чуть ли не круче C++, хочется взглянуть.

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 16:49 26-01-2005
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TheChampion
 

Цитата:
Проблема вот в чем: нужен динамический массив неизвестной длины, как в C/C++.

а чем С не подходит?
если напишешь чуть конкретнее...
 
а так...
для Линакса (да и для виндов) есть free Pascal (знаешь?) -- он стремится к совместимости с борландом,
есть gpc, но он слабоват...
 
я, например, Паскаль только для ГУИ использую, весь счет и прочее -- С и Фортран...
считаю, что спарка языков -- панацея...
 
попробуй поиграть с

Код:
 
type
  TArray = array[0..0] of нужный_тип;
  PArray = ^TArray;
 

и GetMem()/FreeMem(), которые сейчас уже во всех паскаль-клонах есть...
с отключенной проверкой диапазонов...
-------------
 
pand
кажется я и "не по дельфи ответил"...

Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 17:06 26-01-2005 | Исправлено: akaGM, 17:12 26-01-2005
Ang



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
TheChampion
Для динамического выделения памяти можно использовать GetMem/FreeMem. Про это можно, например, здесь посмотреть пример. http://program.rin.ru/razdel/html/319.html

Всего записей: 251 | Зарегистр. 25-07-2001 | Отправлено: 17:12 26-01-2005
Andrey_aka_Master



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
на уроках информатики нам говорили, что динамический массив в pascal можно легко создать используюя ооп, вот нашет примерчик в одном факе:

Код:
 
....
type
  TArray = array [0..127] of double;
  PArray = ^TArray;
  TDynArray = object
  p: PArray;
  count: integer;
  constructor Create(ACount: integer); { инициализация }
  procedure SetCount(ACount: integer); { установка количества элементов }
  procedure Reset; { обнуление данных }
  destructor Destroy; { уничтожение }
end;
 
constructor TDynArray.Create(aCount: integer);
begin
  p := nil;
  count := 0;
  SetCount(ACount);
end;
 
procedure TDynArray.SetCount(ACount: integer);
var
  np: PArray;
begin
  if count = ACount then
  Exit;
  { память не была выделена }
  if p = nil then
  begin
    { новое количество элементов в массиве равно 0 }
    if ACount <= 0 then
    begin
      count := 0;
    end
    { новое количество элементов в массиве больше 0 }
    else
    begin
      { выделение памяти }
      GetMem(p, ACount * sizeof(double));
      { обнуление данных }
      fillchar(p^, ACount * sizeof(double), 0);
      count := ACount;
    end;
  end
  else
  begin
    { новое количество элементов в массиве равно 0 }
    if ACount <= 0 then
    begin
      { освобождение памяти }
      FreeMem(p, count * sizeof(double));
      count := 0;
    end
    else
    begin
      { выделение памяти }
      GetMem(np, ACount * sizeof(double));
      { требуется увеличить количество элементов }
      if ACount > count then
      begin
        { перемещение старых данных на новое место }
        move(p^, np^, count * sizeof(double));
        { обнуление новых элементов массива }
        fillchar(np^[count], (ACount - count) * sizeof(double), 0);
      end
      else
      begin
        { перемещение части старых данных на новое место }
        move(p^, np^, ACount * sizeof(double));
      end;
      { освобождение старой памяти }
      FreeMem(p, count * sizeof(double));
      p := np;
      count := ACount;
    end;
  end;
end;
 
procedure TDynArray.Reset;
begin
  { обнуление данных }
  fillchar(p^, count * sizeof(double), 0);
end;
 
destructor TDynArray.Destroy;
begin
  SetCount(0);
end;
 

 
Вообще пример для delphi, но для pascal, имхо тоже подойдет.

Всего записей: 175 | Зарегистр. 24-03-2003 | Отправлено: 17:19 26-01-2005
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Andrey_aka_Master
ты на мой пример посмотри... борланды это давно в ртл встроили...
 
TheChampion
а под какую платформу прикладнуха?

Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 17:24 26-01-2005
pand



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TheChampion
Извини, но по делу тебе снова ответить не успел akaGM и
Ang оба написали правильные вещи. Вообще описал бы ты свою задачу и среду разработки - ответы стали бы полезней.

Всего записей: 1529 | Зарегистр. 03-08-2004 | Отправлено: 20:47 26-01-2005
TheChampion

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
All
 
Всем огромное спасибо за помощь и советы.
 
Эта штука нужна для "академического паскаля", т. е. для учебника. Там есть глава про АТД, одним из которых является вектор, т. е. массив произвольной длины. В учебнике примеры на двух языках --- на паскале и Си. На Си все прекрасно, а с паскалем плохо, т. к. стандартный --- просто ужас, а в Delphi встают проблемы совместимости.
 
Тот факт, что GetMem/FreeMem есть везде --- прекрасно. Воспользуюсь ими.
 
Еще раз всем спасибо.
 
PS: Может кто видел ISO/IEC 10206 Extended Pascal Programming Language?

Всего записей: 656 | Зарегистр. 25-06-2004 | Отправлено: 11:04 27-01-2005
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
TheChampion

Цитата:
PS: Может кто видел ISO/IEC 10206 Extended Pascal Programming Language?

 
вот выдержка из мануала гнутого паскаля 3.3.x (выделено мною):
 

Цитата:
 
The purpose of the GNU Pascal project is to produce a Pascal compiler (called GNU Pascal or GPC) which
 
 * combines the clarity of Pascal with powerful tools suitable for real-life programming,
 * supports both the Pascal standard and the Extended Pascal standard as      
    defined by ISO, ANSI and IEEE (ISO 7185:1990, ISO/IEC 10206:1991,  
    ANSI/IEEE  770X3.160-1989),
 * supports other Pascal standards (UCSD Pascal, Borland Pascal, parts of Borland Delphi, Mac  
    Pascal and Pascal-SC) in so far as this serves the goal of clarity and usability,
 * may be distributed under GNU license conditions, and
 * can generate code for and run on any computer for which the GNU C compiler can generate      
    code and run on.  
 
Pascal was originally designed for teaching. GNU Pascal provides a smooth way to proceed to challenging programming tasks without learning a completely different language.
 
The current release implements Standard Pascal (ISO 7185, levels 0 and 1), most of Extended Pascal (ISO 10206, aiming for full compliance), is highly compatible to Borland Pascal (version 7.0), has some features for compatibility to other compilers (such as VAX Pascal, Sun Pascal, Mac Pascal, Borland Delphi and Pascal-SC).  
 

 
а вот урл на спецификацию:
http://pascal-central.com/docs/iso10206.txt
но это, наверное, ты лучше меня знаешь...

Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 12:34 27-01-2005 | Исправлено: akaGM, 12:43 27-01-2005
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Аналог new[]()/malloc()/calloc() в паскале


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru