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

Parametry procedury z użyciem wskaźników.
BU
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 6 lat
  • Postów:19
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

Kopiuj
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ć?

edytowany 3x, ostatnio: Bulailokiec
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

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


BU
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 6 lat
  • Postów:19
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:

Kopiuj

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

Kopiuj

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).

edytowany 7x, ostatnio: flowCRANE
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
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:

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

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

Kopiuj
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.


edytowany 4x, ostatnio: Patryk27
GS
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 4 godziny
1
Kopiuj
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

Kopiuj
type ttab = array  of tosoba;

tym samym temat zadania zawiera w sobie sprzeczność

Kopiuj
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;
edytowany 3x, ostatnio: grzegorz_so
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około godziny
  • Lokalizacja:Tuchów
  • Postów:12171
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:

Kopiuj
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.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 8x, ostatnio: flowCRANE

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.