Wątek przeniesiony 2014-03-08 21:52 z Delphi i Pascal przez olesio.

Przekazywanie tablic do funkcji

0

Witam,
już kiedyś zakładałem tu tema, dotyczący wyboru języka. Ostatecznie zostałem przy Pascalu. Daje mi on wystarczająco dużo. Na razie, więcej nie potrzebuje.

Teraz mam jedno pytanie. Da się przekazać tablice do funkcji? Mam fragment kodu, który odczytuje z pliku tekstowego... tekst i zapisuje go w tablicy. Bo dopisaniu kodu, program działał tak jak trzeba. Teraz chciałem trochę to uporządkować i dobudować jeszcze kilka elementów, dlatego postanowiłem wszystko podzielić na funkcje. Działają wszystkie poza tą jedną. Nie wiem gdzie jest błąd, ale zakładam, że właśnie w tym miejscu. Tablica ma ok 1000 elementów. Funkcja ma brać element z tablicy na podstawie działań już w tej funkcji. Jak ją odpowiednio przekazać by wszystko zadziałało prawidłowo.

Aha. Chodzi o to, że musi być przekazana cała tablica, a nie tylko jeden jej element. Po dopiero w funkcji inna zmienna pobiera z tablicy odpowiednią wartość, obliczoną przez funkcje.
Dzięki

0

Jeżeli normalnie nie możesz przekazać całej tablicy bo musisz modyfikować jej wielkośc itp. To dodaj własny typ. I zrób to w taki sposób jaki pokazuje poniższy przykład kodu z Delphi 7. Rownież jeżeli trzeba zwrócić coś jako tablicę funkcją. Wtedy robi się to poprzez własny typ. Poza tym wydaję się mi, że temat dotyczy banalnych podstaw, dlatego przenoszę do Newbie.

//...

type
  TStationKind = (skAll, skFavorites, skOwn);
  TStationData = class(TObject)
    StationKind : TStationKind;
    NetworkCaching, Params, Url, W, P, MetaTitle : string;
  end;
  TArrayOfStationData = array of TStationData;

procedure DeleteArrayIndex(var X : TArrayOfStationData; Index : Integer);
begin
  if (Index <= High(X)) and (Index >= Low(X)) then
  begin
    if Index = High(X) then
    begin
      SetLength(X, Length(X) - 1);
    end
    else
    begin
      System.Move(X[Index + 1], X[Index], (Length(X) - Index - 1) * SizeOf(TArrayOfStationData) + 1);
      SetLength(X, Length(X) - 1);
    end;
  end;
end;
0

Pewnie faktycznie to podstawy, mi wystarczają :p

Szczerze mówiąc, nie wiem jak mam się za ten podany kod zabrać.

Jeszcze raz napiszę, dokładniej, co konkretnie chce zrobić. A więc mam plik tekstowy, którego linie są wczytywane do tablicy. Teraz chce tablice przenieść do funkcji. Co roi funkcja? Na początek tworzy nazwy plików na podstawie elementów tablicy. Później otwiera odpowiedniej pliki tekstowo. Wyszukuje w każdym pliku odpowiedni element, określony w pliku jako 'nazwa'. Tworzy listę niepowtarzalnych nazwy. Wyświetla na ekran. Daje mi możliwość wyboru. Nazwa którą wybiorę, jest zwracana przez funkcję.

1

@lucasp17 - tablice przekazuje się do funkcji/procedury tak samo, jak i zmienne innych typów; Jeżeli tablica jest statyczna to argument musi mieć określony typ, np.:

type
  TStaticArray = array [10 .. 20] of AnsiString;

  function StaticArrayFunction(AArray: TStaticArray): AnsiString;
  begin
    // operacje na statycznej tablicy AArray
  end;

Jeżeli używasz macierzy dynamicznej, to możesz ją przekazać na (co najmniej) dwa sposoby - określając jej typ lub jako open array:

type
  TDynamicArray = array of AnsiString;

  function DynamicArrayFunction(AArray: TDynamicArray): AnsiString;
  begin
    // operacje na dynamicznej tablicy AArray
  end;

  function OpenArrayFunction(AArray: array of AnsiString): AnsiString;
  begin
    // operacje na otwartej tablicy AArray
  end;

Różnica jest taka, że dynamiczne i otwarte tablice zawsze są indeksowane od 0, a statyczne mogą mieć dowolną indeksację (zgodną z wytycznymi); Jeżeli używasz statycznej lub dynamicznej tablicy jako argumentu funkcji, to musisz przekazać tablicę o konkretnym typie; Jeśli zaś używaż tablicy otwartej - możesz przekazać dowolną tablicę, dowolnego typu i dowolnie indeksowaną; Tutaj jednak trzeba uważać na indeksację, jeśli argument jest tablicą otwartą, a przekazujesz tablicę indeksowaną nie od 0;

Dodatkowo dochodzą do tego sposoby przekazywania parametrów - przez stałą, przez wartość, przez referencję i przez pustą referecję (ze słowem kluczowym Out); Warto też o nich poczytać, bo w różnych sytuacjach przydają się różne sposoby (warto znać je wszystkie).

0
furious programming napisał(a):

@lucasp17 - tablice przekazuje się do funkcji/procedury tak samo, jak i zmienne innych typów; Jeżeli tablica jest statyczna to argument musi mieć określony typ, np.:

type
  TStaticArray = array [10 .. 20] of AnsiString;

  function StaticArrayFunction(AArray: TStaticArray): AnsiString;
  begin
    // operacje na statycznej tablicy AArray
  end;

Dzięki. To mi wystarczyło. Coś nowego się nauczyłem.
Ja próbowałem robić to w ten sposób:

 function StaticArrayFunction(AArray: array [10 .. 20] of AnsiString): AnsiString;
  begin
    // operacje na statycznej tablicy AArray
  end;

Ale działać to nie chciało. Teraz jest już wszystko ok.

0

No właśnie w tym rzecz - nie możesz określić typu tablicowego argumentu w ten sposób; Musisz określić typ wcześniej i ten typ wykorzystać w deklaracji parametrów funkcji lub procedury;

Porada na przyszłość - czytaj komunikaty kompilacji i staraj się je zrozumieć.

0

Nie mam najmniejszego pojęcia jak zrozumieć:

Project program raised exception class 'RunError(2)'.

In file 'POINTER' at line -1

A teraz jeszcze jedno dodatkowe pytanie. Czy jest w Pascalu możliwość edytowania pliku na serwerze FTP? Mogę to robić ręcznie, ale przenoszenie czasami kilkudziesięciu plików do różnych folderów jest męczące. Gdyby dało się to zautomatyzować byłoby świetnie. Szukałem czegoś na ten temat w google, ale nie wiele mi to pomogło.

1

@lucasp17: co do tablic, to mój przykład pokazywał jak to ogarnąć. A jeżeli chodzi o FTP'a to można użyć pakietów Indy albo Synapse. Lub pod czystym WinAPI, modułu Simple TCP do pobrania z http://piechnat.pl/article/simpletcp.html Tylko w tym drugim przypadku trzeba kodzić obsługę socketów dla klienta lub serwea po swojemu. Chociaż na stronie są dołaczone krótkie przykłady. A protokół FTP jest dobrze opisany w sieci.

Jednak, jeśli używasz Lazarusa lub FPC, to pewnie w kodzie Simple TCP trzeba będzie dokonać zmian, na pewno dodać dyrektywę kompilatora {$MODE DELPHI}, ale i pewnie inne dodatki, w zależności od zgłaszanych błędów. Także na początek najprościej powinno się wedle mnie udać ogarnąć temat pod Synapse. Na stronie projektu są najniezbędeniejsza dokumentacja oraz w samym pakiecie dołączone przykłady użycia.

0

Ok wielkie dzięki. Temat można zamknąć.

A co do FTP, to po prostu nie chciałem zakładać kolejnego tematu, bo tylko się pytałem czy jest taka możliwość, a więc nie było sensu robić tematu na takie pytanie. Jeżeli będę coś z tym kombinował i nie będzie mi wychodziło to na pewno nowy temat założę.

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