Rambler's Top100

Твой мир ПРОграммирования-Delphi, Pascal, C++

Объявление

Если это Ваш первый визит на форум, то советуем зарегистрироваться. Зарегистрированные пользователи могут задавать вопросы и просматривать темы со скрытым текстом. Чтобы зарегистрироваться, нажмите Регистрация.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Твой мир ПРОграммирования-Delphi, Pascal, C++ » Pascal » Загвоздка в динамических массивах


Загвоздка в динамических массивах

Сообщений 1 страница 8 из 8

1

Просветите меня по динамическим массивам.
Как их сформировать в Паскале, как их передавать функциям и процедурам, как потом освобождать память из под них.

Дайте, пожалуйста пример небольшой программки именно с динамическими массивами: пусть юзер будет вводить число элементов массива, потом вводит эти элементы(или рандом), пусть будет функция или процедура работающая с этим динамическим массивом (пусть выводит их).

Вот это бы мне действительно помогло.
Нужно, чтобы обязательно в TURBO PASCAL 7.0 работало

0

2

В стандартном паскале дин. массивов нет. Они вообще появились в Delphi 1-2.
Для Delphi справедлив код:
var a:array of integer; //обьявление дин. массива
...

...
function all(a:tmas):real;....

Будут вопросы , задавай.

0

3

А как мне обойти эту проблему в Турбо Паскаль 7.0? Мне например нужно переделать следующую прогу Си в Турбо Паскаль:

Код:
#include <stdio.h>
#include <conio.h>
void outmas(char *masch, int sz)
{
      for(int i=0;i<sz;i++)
          printf("%d\t",masch[i]);
}//outmas

void main(void)
{
      clrscr();
      char *masch;
      int sz;
      printf("Введите размер массива ");
      scanf("%d",&sz);
      /*выделим память*/
      masch=(char *)malloc(sz*sizeof(char));
      
      if(masch==NULL)
      {
           perror("masch"); exit(1);
      }

      for(int i=0;i<sz;i++)
            masch[i]=i;

      outmas(masch);
      
      free(masch);//освобождаем память
}//main

0

4

Нашел как эмулировать динамические массивы в Турбо Паскаль 7.0,
написал процедуру вывода динамического массива outmas.
Теперь передо мной встал вопрос: можно ли через эту процедуру как-нибудь выводить содержимое обычных массивов? Если можно, то покажите как, пожалуйста.
Если нельзя, то как создать такую же процедуру для обычного массива.

Код:
uses crt;
type
   {- Массивы и указатели на них -}
      tIntArr0 = array [0..$FFF0 div SizeOf(integer)-1] of integer;
      tIntArr1 = array [1..$FFF0 div SizeOf(integer)] of integer;
      tPtrIntArr0 = ^tIntArr0;
      tPtrIntArr1 = ^tIntArr1;

{процедура вывода массива без ведущих нулей}
procedure outmas(ptr: tPtrIntArr0; size: integer);
var
   i: integer;
   flag: byte;
begin
   flag:=0;{признак того, что встречен не ноль}
   for i:=1 to size do
                      begin
                         if(flag<>0) then
                            write(ptr^[i],' ')
                         else
                            if(ptr^[i]<>0) then
                               begin
                                  write(ptr^[i],' ');
                                  flag:=1;
                               end;
                      end;
end;{outmas}

var
     pDynArray : tPtrIntArr0;{tIntArr1;}
     nSize : integer;
     i: integer;
begin
  clrscr;
  write ('Vvedite size: ');
  readln (nSize);

 {Тут, конечно, по хородему, надо проверить, чтобы введенное nSize не было
  большим настольо, чтобы требуемый размер памяти не превосходил $FFFF}

  if (nSize > ($FFF0 div SizeOf(integer)))
     then begin
               writeln ('Slishkom bolsjoe chislo!');
               Halt;
          end;
  if MaxAvail < SizeOf(integer)*nsize then


  else
      begin
        GetMem (pDynArray, nSize * SizeOf (pDynArray^[1]));
 { Тут опять, по-хорошему, проверить, что память выделилась }


 { Далее действия как с обычны массивом }
  for i:=1 to nsize do
                       pDynArray^ [i] := 2;
  pDynArray^ [nsize] := 10;
  pDynArray^ [nsize-1] := 20;
  pdynarray^[1]:=1;
  pdynarray^[2]:=0;
{ ..........................................}
{  writeln('pDynArray^ [1] = ',pDynArray^ [1]); }
  outmas(pDynArray,nSize);

  FreeMem (pDynArray, nSize * SizeOf (pDynArray^[1]));
  readln;{задержка}
       end;
end.

0

5

1.Я код подредактировал, т.к он у меня не работал- неправильно составлено условие.
2. Я понимаю, что твой вопрос заключается в том как это использовать для обычных массивов-
необходимо написать процедуру, которая будет содержать весь исходный код.
Самое сложное - преобразование типов. Думаю стоит сделать функцию, которая будет просто переобразовывать 2 массива- лучше через указатели.
В общем вот вариант исходный и потом функция(не тестировал).

0

6

Код:
program asd;
uses crt;
type
   {- Массивы и указатели на них -}
      tIntArr0 = array [0..$FFF0 div SizeOf(integer)-1] of integer;
      tIntArr1 = array [1..$FFF0 div SizeOf(integer)] of integer;
      tPtrIntArr0 = ^tIntArr0;
      tPtrIntArr1 = ^tIntArr1;

{процедура вывода массива без ведущих нулей}
procedure outmas(ptr: tPtrIntArr0; size: integer);
var
   i: integer;
   flag: byte;
begin
   flag:=0;{признак того, что встречен не ноль}
   for i:=1 to size do
                      begin
                         if(flag<>0) then
                            write(ptr^[i],' ')
                         else
                            if(ptr^[i]<>0) then
                               begin
                                  write(ptr^[i],' ');
                                  flag:=1;
                               end;
                      end;
end;{outmas}

[hide=0]var
     pDynArray : tPtrIntArr0;{tIntArr1;}
     nSize : integer;
     i: integer;
     MaxAvail:integer;
begin
  clrscr;
  write ('Vvedite size: ');
  readln (nSize);

 {Тут, конечно, по хородему, надо проверить, чтобы введенное nSize не было
  большим настольо, чтобы требуемый размер памяти не превосходил $FFFF}

  if (nSize > ($FFF0 div SizeOf(integer)))
     then begin
               writeln ('Slishkom bolsjoe chislo!');
               Halt(1);
          end;
  if MaxAvail < SizeOf(integer)*nsize then

      begin
        GetMem(pDynArray, SizeOf(integer)*nsize);

 { Тут опять, по-хорошему, проверить, что память выделилась }


 { Далее действия как с обычны массивом }
  for i:=1 to nsize do
                       pDynArray^ [i] := 2;
  pDynArray^ [nsize] := 10;
  pDynArray^ [nsize-1] := 20;
  pdynarray^[1]:=1;
  pdynarray^[2]:=0;
{ ..........................................}
{  writeln('pDynArray^ [1] = ',pDynArray^ [1]); }
  outmas(pDynArray,nSize);

  FreeMem (pDynArray);[/hide]  readln;{задержка}
       end;
       end.

0

7

Код:
unit dinarray;
uses crt;
type
   {- Массивы и указатели на них -}
      tIntArr0 = array [0..$FFF0 div SizeOf(integer)-1] of integer;
      tIntArr1 = array [1..$FFF0 div SizeOf(integer)] of integer;
      tPtrIntArr0 = ^tIntArr0;
      tPtrIntArr1 = ^tIntArr1;

{процедура вывода массива без ведущих нулей}
procedure outmas(ptr: tPtrIntArr0; size: integer);
var
   i: integer;
   flag: byte;
begin
   flag:=0;{признак того, что встречен не ноль}
   for i:=1 to size do
                      begin
                         if(flag<>0) then
                            write(ptr^[i],' ')
                         else
                            if(ptr^[i]<>0) then
                               begin
                                  write(ptr^[i],' ');
                                  flag:=1;
                               end;
                      end;
end;{outmas}
[hide=0]procedure setlength(pDynArray : tPtrIntArr0;nSize : integer);
var
     i: integer;
     MaxAvail:integer;
begin
 {Тут, конечно, по хородему, надо проверить, чтобы введенное nSize не было
  большим настольо, чтобы требуемый размер памяти не превосходил $FFFF}

  if (nSize > ($FFF0 div SizeOf(integer)))
     then begin
               writeln ('Slishkom bolsjoe chislo!');
               Halt(1);
          end;
  if MaxAvail < SizeOf(integer)*nsize then

      begin
        GetMem(pDynArray, SizeOf(integer)*nsize);

 { Тут опять, по-хорошему, проверить, что память выделилась }[/hide] { Далее действия как с обычны массивом }
  for i:=1 to nsize do
                       pDynArray^ [i] := 2;
  pDynArray^ [nsize] := 10;
  pDynArray^ [nsize-1] := 20;
  pdynarray^[1]:=1;
  pdynarray^[2]:=0;
{ ..........................................}
{  writeln('pDynArray^ [1] = ',pDynArray^ [1]); }
  outmas(pDynArray,nSize);

  FreeMem (pDynArray);
  readln;{задержка}
       end;

  [hide=0]function getright(a:array[1..1000] of integer):pDynArray;//f-новый размер массива
  var s:pointer; r:pDynArray;
  begin
  s:=^a;   // идея заключается в том чтобы сделать указатель на исходный массив, а потом его присвоить указателю на динамический.
   result:=a;
  end;[/hide]       end.

0

8

Спасибо за ответ, но к этому времени я уже нашел другое решение (очень похоже на Ваше).
Если интересно, то вот:

Код:
.....
var
   myarr: array [1..20] of integer;
begin
.............
..........
outmas(tPtrIntArr0(@myarr),sizeof(myarr)/sizeof(myarr[1]));
.............

0


Вы здесь » Твой мир ПРОграммирования-Delphi, Pascal, C++ » Pascal » Загвоздка в динамических массивах