Parametry procedury z użyciem wskaźników.

0

Witam,mam proste pytanie.
Chciałbym przerobić w programie procedurę bez parametrów na procedurę którą zawiera parametr=tablice.
Tutaj jest kod programu z użyciem procedury bez parametru

program Project1;

const N=5;

  type tosoba = record
  nazwisko: string[20];
  r, m, d: word;
  id: longint;
  end;


type ttab = array[1..N] of tosoba;


var ptab: ^ttab;

procedure dodajaca();

begin
new(ptab);

writeln('Nazwisko:');
readln(ptab^[1].nazwisko);

writeln('Data urodzenia:');
readln(ptab^[1].r,ptab^[1].m,ptab^[1].d);

writeln('Id:');
readln(ptab^[1].id);

writeln('Nazwisko:',ptab^[1].nazwisko);
writeln('Urodzony: ',ptab^[1].r,' ',ptab^[1].m,' ',ptab^[1].d);
writeln('Id: ',ptab^[1].id);
end;

begin

dodajaca();
readln;


end.

Niestety nie wiem jak to uczynić,ktoś jest w stanie mi to wytłumaczyć?

0

Napisz, co chcesz osiągnąć etc. - co ma ta Twoja procedura robić?
Dlaczego masz tu wskaźnik na tablicę?

0

Tak aby program działał jak działa teraz tylko z parametrem(tablicą).

A Zadanie brzmi :

Utworzyć dynamiczną tablicę rekordów typu tosoba o rozmiarze N, gdzie N – stała. Wskaźnik ptab do początku tablicy określają następujące deklaracje:

const N=5;
type ttab = array[1..N] of tosoba;
Var ptab: ^ttab;


Opracować procedurę, która inicjuje tablicę losowymi danymi lub danymi wprowadzanymi z klawiatury. Przetestować procedurę w programie głównym. Przed zakończeniem programu zwolnić pamięć.

Jeszcze zapomniałem o zwolnieniu pamięci(wiem,że dispose).

I jeszcze mam pytanie czym się różni wskaźnik na tablice a tablica wskaźników(czy jakoś tak).

1

Tak aby program działał jak działa teraz tylko z parametrem(tablicą).

Zacznijmy od uproszczenia problemu: masz tablicę liczb.
W jaki sposób, przy wykorzystaniu procedury, dodasz do tej tablicy nową liczbę?

czym się różni wskaźnik na tablice a tablica wskaźników(czy jakoś tak).

Wskaźnik na tablicę to, cóż, wskaźnik na tablicę.
Na przykład wskaźnik na tablicę liczb:

Type TArray = Array of Integer;
     PArray = ^TArray; // wskaźnik na tablicę

A tablica wskaźników to, cóż, tablica wskaźników :P

Type TArray = Array of Pointer; // tablica wskaźników

Utworzyć dynamiczną tablicę rekordów typu tosoba o rozmiarze N, gdzie N – stała

Czyli należy utworzyć dynamiczną tablicę rekordów, która ma stały rozmiar? Obawiam się, że nie w tym wszechświecie.

1
type ttab = array[1..N] of tosoba;

to jest deklaracja typu tablicy o stałym rozmiarze "n"

deklaracja typu dynamicznej tablicy powinna wyglądać tak

type ttab = array  of tosoba;

tym samym temat zadania zawiera w sobie sprzeczność

Utworzyć dynamiczną tablicę rekordów typu tosoba o rozmiarze N, gdzie N – stała. Wskaźnik ptab do początku tablicy określają następujące deklaracje:

const N=5;
type ttab = array[1..N] of tosoba;
1
Patryk27:

Czyli należy utworzyć dynamiczną tablicę rekordów, która ma stały rozmiar? Obawiam się, że nie w tym wszechświecie.

grzegorz_so:

tym samym temat zadania zawiera w sobie sprzeczność

Nic nie stoi na przeszkodzie, aby macierzy dynamicznej używać jako statycznej i statycznej jako dynamicznej :]

Z pozoru jest to sprzeczność, jednak z punktu widzenia implementacji, dynamiczna macierz to jedynie typ danych, ot specyficzny kontener. Z jego natury wcale nie wynika, że musi zmieniać swój rozmiar podczas danej sesji. Wspomniany stały rozmiar macierzy nie dotyczy ograniczeń wykorzystanego typu danych, a tylko tego konkretnego przypadku, czyli tego jednego dziwnego zadania.

Nie zmienia to jednak faktu, że to podejście starodawne i trąci trochę nonsensem. W Turbo Pascalu nie istniały macierze dynamiczne, więc trzeba było kombinować z wytworzeniem takich dynamicznych tworów.


Zakładając, że program ma posługiwać się wyłącznie wskaźnikami na macierz dynamiczną, przykładowa obsługa może wyglądać tak jak poniżej. W tagu jest jedynie pascal, bez sprecyzowania konkretnego dialektu, więc przykład napisałem we Free Pascalu:

type
  TNumbers = array of UInt8;
  PNumbers = ^TNumbers;

  procedure InitNumbers(out ANumbers: PNumbers);
  begin
    New(ANumbers);
    SetLength(ANumbers^, 0);
  end;

  procedure DisposeNumbers(var ANumbers: PNumbers);
  begin
    Dispose(ANumbers);
    ANumbers := nil;
  end;

  procedure AddNumber(const ANumbers: PNumbers; const ANumber: UInt8);
  begin
    SetLength(ANumbers^, Length(ANumbers^) + 1);
    ANumbers^[High(ANumbers^)] := ANumber;
  end;

  procedure ShowNumbers(const ANumbers: PNumbers);
  var
    LNumber: UInt8;
  begin
    for LNumber in ANumbers^ do
      Write(LNumber:3);

    WriteLn();
  end;

var
  Numbers: PNumbers;
begin
  InitNumbers(Numbers);
  try
    AddNumber(Numbers, 0);
    AddNumber(Numbers, 1);
    AddNumber(Numbers, 5);
    ShowNumbers(Numbers);
  finally
    DisposeNumbers(Numbers);
  end;
end.

Co prawda dotyczy macierzy liczb, jednak na potrzeby testu wystarczy - dodanie obsługi struktur to zadanie dla pytającego. Powyższy kod działa jak najbardziej prawidłowo - brak błędów oraz wycieków pamięci (sprawdziłem pod HeapTrc). Kod można sprawdzić tutaj.

Tak więc użycie wskaźnika na dynamiczną macierz jest jak najbardziej możliwe.

1 użytkowników online, w tym zalogowanych: 0, gości: 1