Tablica jako wynik funkcji.

2013-03-20 21:37
Zaleski
0

Witam, chcę zwrócić tablicę jako wynik funkcji, kod który napisałem uruchamia cmd i je za chwile zamyka pomimo readln; dodanego na końcu.

program tab_f;

{$APPTYPE CONSOLE}

uses
  SysUtils;

// procedury i funkcje tu:

type
TIntegerArray = array of Integer;

var
  i:  integer;
  tab: TIntegerArray;
function wypelnij_tab(tablica:TIntegerArray)  : TIntegerArray;
var
  i:integer;
begin
  for i:=0 to 10 do
  begin
  tablica[i]:=1;
  end;
  result:=tablica;
end;

begin
wypelnij_tab(tab);
for i:=1 to 10 do
  begin
    writeln(tab[i]);
  end;
writeln('');
readln;

end.
edytowany 2x, ostatnio: furious programming, 2016-12-13 18:26

Pozostało 580 znaków

2013-03-20 22:01
1

a gdzie SetLength?

Pozostało 580 znaków

2013-03-20 22:25
1
szopenfx napisał(a):

a gdzie SetLength?
Poza tym tablice dynamiczne indeksowane są od 0 więc dlaczego pętle
for i:=1 to 10 do tak w ogóle to zdecydowanie lepiej zastosować pętle
for i:=Low(tab) to High(tab) do


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
Pokaż pozostałe 3 komentarze
@TomRiddle a kto mi każe indeksować od 0 jak będę miał życzenie to zrobię tablicę tab: array ['a'..'d'] of Integer; i kto mi zabroni :P - kAzek 2013-03-21 14:50
A może sobie nawet zrobić - TomRiddle 2013-03-21 14:54
type Mikser = String[2]; var Dupa, Gowno: Integer; a: array [Dupa..Gowno] of Mikser; - TomRiddle 2013-03-21 14:54
i nikt Ci nie zabroni, ale i tak nikt tego nie robi bo przyzwyczajenie drugą naturą człowieka. - TomRiddle 2013-03-21 14:54
@TomRiddle: Low(tab) to nie jest zmarnowana jedna miliardowa sekundy, ponieważ dla tablic dynamicznych w każdym porządnym kompilatorze (a tak jest afair we FPC oraz Delphi) wyrażenie to jest od razu zamieniane na 0. Żadnej straty, a kod czytelniejszy. - Patryk27 2013-03-22 15:16

Pozostało 580 znaków

2013-03-20 22:58
Zaleski
0

jeżeli poprawię pętlę to pozostałe rzeczy są poprawnie? chcę zrozumieć zwracanie tablicy przez funkcję, na razie wiem, że podałem jako zmienną do funkcji tablicę i zwracam wynik typem tablicowym ale nie wiem dlaczego to nie chciało działać.h

Pozostało 580 znaków

2013-03-20 23:07
0

@szopenfx już napisał musisz ustalić rozmiar tablicy funkcją SetLength (przed pierwszym odwołaniem się do niej). Poza tym w ten sposób funkcją wypelnij_tab nie możesz zwrócić tablicy, ponieważ nie ma ona ustalonego rozmiaru zrób może procedure wypelnij_tab(var tablica:TIntegerArray) ; no i na końcu działania programu (lub gdy przestaniesz już korzystać z tej tablicy) kosmetycznie zmień rozmiar tablicy na 0.


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: kAzek, 2013-03-20 23:08

Pozostało 580 znaków

2013-03-20 23:15

Trzeba zastosować się do porad poprzedników. A przede wszystkim zanim zacznie się zadawać jakieś pytania na forum, to przeczytać jakieś kursy albo choćby kompendium Delphi na stronie 4p. Bez znajomości elementarnych podstaw języka, daleko nie zajdziesz. A co do kodu, to jeżeli już się upierasz przy stosowaniu funkcji ( chociaż takie rzeczy jak tablica lepiej zwracać przykładową procedurą, tak jak podał @kAzek ). Ja bym to zakodował jak poniżej. A i jeżeli nie umiesz porządnie formatować kodu to skorzystaj z: http://olesio.eu/jcf - wystarczy wypakować i ustawić, a później używać. A i kod w delphi wstawiamy w tagi delphi. Poza tym moduł SysUtils przy tym kodzie, co podałeś - jest zbędny.

program tab_f;

{$APPTYPE CONSOLE}

type
  TIntegerArray = array of Integer;

function WypelnijTab : TIntegerArray;
var
  I : integer;
begin
  SetLength(Result, 10);
  for i := Low(Result) to High(Result) do
  begin
    Result[I] := 1;
  end;
end;

var
  I : integer;
  Tab : TIntegerArray;
begin
  Tab := WypelnijTab;
  for I := Low(Tab) to High(Tab) do
  begin
    Writeln(Tab[I]);
  end;
  Readln;
end.

edytowany 3x, ostatnio: olesio, 2013-03-22 13:38
To SetLength na końcu jest niepotrzebne. FPC: http://www.freepascal.org/doc[...]f/refsu18.html#x42-480003.3.1 The memory will be disposed of at the exit of the current procedure or function.. W Delphi jest identycznie (reference counting). - Patryk27 2013-03-21 07:19
A po kiego funkcja WypelnijTab() dostaje ten parametr? - _13th_Dragon 2013-03-21 09:10
@Patryk27 może i na końcu nie trzeba zwalniać (przez zmianę rozmiaru na 0) ale jednak gdy w programie korzystamy przez pewien czas z dużej tablicy a pewnym momencie przestanie ona być potrzebna to chyba lepiej zrobić SetLength(Tab, 0); a nawet na końcu programu to nie jest żadnym błędem a nawet powiedziałbym dobrym zwyczajem (taką kosmetyką) po prostu przeglądając kod już widać że tablica ma rozmiar zero. - kAzek 2013-03-21 10:25
... oraz przy SetLength(Tb,0) pamięć jest zwalniana natychmiast, a bez tego gdzieś później (to z obserwacji - nie znalazłem informacji o tym, mimo że szukałem). Jeżeli tablica jest spora to warto zrobić SetLength(Tb,0) dla natychmiastowego zwolnienia. - _13th_Dragon 2013-03-21 10:29
Kod poprawiony, według zalecen. Wcześniej nie był idealny, bo wiadomo - pisany na szybko to nie wszystko przemyślałem. - olesio 2013-03-22 13:39

Pozostało 580 znaków

2013-03-20 23:37
Zaleski
0

czytam poradnik od Was, i w 2 rozdziale są funkcje, procedury i tablice. chciałem to jakoś połączyć, próbowałem różnych kombinacji, a tego akurat tam nie było. dziękuję za pomoc.

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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