Strona: [  << <   1 2   > >>  ]  z  2     
Autor Temat: Jak przekazac tablicę do funkcji
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004
Jak przekazac tablicę do funkcji

Witam

Tak jak w pytaniu

powiedzmy mam funkcję "oblicz"

W innym miejscu deklaruję sobie zmienną tablicowa

Dim wartosci() As Integer

i wywołuję funkcję oblicz ale tak by przekazać jej moją zmienną tablicową np. Call oblicz(wartosci)

Jak to zrobić

Nie da się normalnie stworzyć funkcji, która na jako argument będzie miała tablicę

jak to zrobić ??


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

24-12-2004 22:23
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
Chudy
[TLHW]Wiktor



Typ: moderator
Postów: 574
Zarejestrowany: Aug 2002

W funkcji wystarczy stworzyć argument typu Variant, czyli domyślny. Wystarczy:
Function Oblicz(Wartosci)
...
End Functon
Albo:
Function Oblicz(Wartosci As Variant)
...
End Function


_____________________________________________
Projekt "Thunder Cannons" nadchodzi...

24-12-2004 23:28
Pokaż profil Chudy  Wyślij email do Chudy   Odwiedź stronę Chudy       1220895
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Własnie w tym problem że nie działa mi to - gdy w funkcji zrobię coś takiego jak:

Wartosci(1) = 1

to wyskakuje mi błąd


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

25-12-2004 00:10
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

1) Z powyższych postów wynika, że i zdeklarowana tablica i parametr mają tą samą nazwę, więc występuje coś, co jest dopuszczalne, ale lepiej tego unikać - to tak na marginesie .

2) Może źle przypisujesz do parametru:
wynik = oblicz(tablica(0)) - lub coś w tym rodzaju.
Spróbuj tak:
wynik = oblicz(tablica)

I podawaj w pytaniach jaki to jest błąd, bo sama informacja "jest błąd" czasami niewiele mówi .


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

25-12-2004 09:50
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

ale w tym problem że ja nie jestem na etapie zwracania wartości przez funkcję tylko na przekształacaniu wartosci zawartych w tablicy - wyskakuje mi błąd już przy pierwszym przypisaniu do tablicy

np.
Public Function bla (wartosci)
  wartosci(1) = 1 - i tu już wyskakuje błąd ze typ sie nie zgadza


Ale czemu - "wartosci" jest typu Variant a zawartosci typu integer

"Redim" wykonywany jest przed przekazaniem tablicy do funkcji

P.S. Tablica przekazywana jest jako "Optional" - może to ma jakiś wpływ

[Post edytowany dnia 25-12-2004 11:29 przez DJK]


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

25-12-2004 11:23
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

1) Przeczytaj jeszcze raz o czym napisałem - tam nie ma nawet słówka o zwracaniu. jest o przypisaniu. To, że masz błąd gdzieś w srodku może mieć przyczynę także kilkaset linii wcześniej - niekoniecznie w tej samej linii. W tym przypadku wygląda na to, że w zmiennej wartosci nie ma tablicy. Ponieważ jest ona tam umieszczana przy przekazywaniu argumentówm, dlatego właśnie pytam o to miejsce - bo tam mogłeś popełnić błąd.

2) zawartość nie jest typu Integer, tylko typu Array. A w VB tylko typ Array i Variant są w stanie przechowywać ten typ danych. ponieważ nie da się bezpośrednio przenieść danych z jednej zmiennej Array do drugiej takiej zmiennej - możemy posłużyć się tylko zmienną typu Variant. i dlatego wartosci są typu Variant.

3) Zmieniłeś już nazwę tej zmiennej, o której mówiłem?

[Post edytowany dnia 25-12-2004 11:46 przez marcin_an]


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

25-12-2004 11:46
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Dim tablica() As Integer - typu Array ??

Jakiego typu jest tablica(1) ?


Wszystko załatwione - okazało się, że w funkcji była zadeklarowana zmienna o takiej samej nazwie co argument przekazywany

A tak na marginesie - to czy da się zrealizować taki algorytm ??

Function "Szukaj" As Integer
  If Znaleziono then
              Szukaj = Znalezione ' tu ma zwrócić co znalazła
              Kontynuuj Szukanie
End Function

Tylko bez wykorzystywania tablicy no i zmiennych globalnych

[Post edytowany dnia 25-12-2004 13:09 przez DJK]


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

25-12-2004 12:30
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

1) Ehh.. trzeba było sprawdzić od razu, gdy za pierwszym razem zwróciłem an to wuagę

2) Tak, typu Array. Jeśli zaraz po nazwie zmiennej są nawiasy, to jest to uznawane za deklarację typu Array, a "As <type>" jest wtedy traktowane jako określenie podtypu (np. w tym przypadku Array of Integer).

3) tablica(1) jest typu Array, z podtypem Integer (przy założeniu, że to jest ta sama tablica(), co w deklaracji przed nią).

(Uzupełnienie do 2-3) Wiem, że wszędzie się pisze, że jest to tablica elementów typu Integer (albo coś podobnego), ale patrząc na "wygląd" zmiennej i jej strukturę nalezy uznać, że jest to jeszcze inny typ - i tutaj akurat nawet MSDN podaje Array jako oddzielny typ.

4) A dlaczego nie? Co prawda nie wiem, w jakim języku to jest zapisane, ale ideę rozumiem. Z jednym tylko zastrzeżeniem - nie wiem, w czym ta funkcja ma szukać. Powiedz jeszcze, gdzie jej się wsadza dane wejściowe .


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

25-12-2004 13:35
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Poprawka: MSDN jednak nie podaje Array jako oddzielnego typu. Ale i tak jego cechy nie pozwalaja go uznać np. za Integer czy jakikolwiek inny .


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

25-12-2004 13:43
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Np szukać w wypełnionej tablicy

Powiedzmy, że Tablica = [1,2,3,2,1,2,3]

Function Szukaj As Integer
If Tablica = 2 Then
        Szukaj = "jest"
Else
        Szukaj = "nie ma"
End If
End Function

MsgBox Szukaj - i tu pojawi się "nie ma" bo ostatni element =3

A chciałem aby pokazało się "jest "tyle razy ile jest 2

Oczywiście używamy tu pętli For zeby indeksować tablicę

[Post edytowany dnia 25-12-2004 15:26 przez DJK]


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

25-12-2004 15:26
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Chodzi ci o coś takiego?

Sub Szukaj(nTablica As Variant, nSzukane As Integer)
    Dim cx As Integer
    Dim f As Byte

    For cx = 0 to UBound(nTablica)
        f = True
        If nTablica(cx) = nSzukane Then MsgBox "Jest"
    Next
    If f Then MsgBox "Nie ma"
End Sub



_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

25-12-2004 16:10
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Nie bardzo

Chciałbym aby funkcja zwracała NA ZEWNĄTRZ częściowe wyniki

Na ogół jest tak że funkcja zwraca jeden ostateczny wynik.

Dlatego pytam czy da się to zrobić

W tym twoim przykładzie Msgbox znajduje się wewnątrz funkcji a chciałbym aby "jest" "nie ma" było zwracane na zewnątrz

Ogólnie to chodzi o to by raz wywołać funkcję i jezeli znalazło to funkcja zwraca "jest" a jeśli nie to zwraca "nie ma" - wiadomo ze w tablicy może być wystąpić kilka razy szukana wartość

Możnaby zrobić to tak że raz wywołujemy funkcję i do globalnej tablicy wpisujemy częsciowe wyniki np. indeks znalezionej pozycji, a potem z zewnątrz odczytać tą globalną tablicę - ale pytam czy da się to zrobić bez używania jakichkolwiek pomocniczych zmiennych (globalnych)

[Post edytowany dnia 25-12-2004 16:22 przez DJK]


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

25-12-2004 16:15
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Ehh.. dobrze, już widzę o co ci chodzi .

DJK, pamiętasz ze szkoły definicję funkcji?

Funkcja przypisuje argumentom dokładnie jeden element ze zbioru rozwiązań.

Z tego dość jasno wynika, że nie może zwrócić kilku wyników.

Z programistycznego punktu widzenia wygląda to jeszcze dziwniej, bo oznaczałoby to, że funkcja kończyłaby się, zwracała wynik, potem program by się wykonywał dalej (przypisanie wyniku, wyświetlenie itd.) i potem nagle wracałby gdzieś do środka funkcji (czyli właściwie gdzie?), przywracał jej dane (które zwykle już w tym momencie zostały zamazane) i wykonywał dalej.
Oczywiście - techniczna możliwosc wykonania czegoś takiego istnieje. O ile na niskim poziomie (Assembler, kod maszynowy itp.) da się to jeszcze łatwo i sensownie wykonać, o tyle w języku wysokiego poziomu, jakim jest VB - nie da się tego zrobić wprost. Musiałbyś dorobić trochę zmiennych (do których funkcja co chcwilę zpaisywałabny, w którym miejscu sie skońćzyła i jakie miałą dane), potem przechodziłaby na swój koniec, zwracała dane, program byłby wykonywany i w pewnym miejscu musiałbyś umieścić powrót do wcześniejszego stanu, znowu wywołanie tej funkcji (i jakoś powiedzieć jej, że ona się ma wykonywać od środka, nie od początku) itd. Sam widzisz, że dużo z tym roboty, a VB sam w sobie nie jest stworzony do takiej gimnastyki (ale jest w nim możliwa).


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

25-12-2004 16:51
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Pozostaje ci to zrobić właśnie na zasadzie zapisywania na zewnątrz indeksu i tablicy i wywoływania tej funkcji właśnie w ten sposób, w jaki to opisałeś .


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

25-12-2004 16:52
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

No ok - tyle że jeżeli chodzi o to zwracanie wyników itp. (szkoła podstawowa ) to nie chodziło mi o zwracanie ostatecznych wyników tylko częściowych.


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

25-12-2004 17:12
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

No ok - tyle że jeżeli chodzi o to zwracanie wyników itp. (szkoła podstawowa ) to nie chodziło mi o zwracanie ostatecznych wyników tylko częściowych.


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

25-12-2004 17:15
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Zwracanie częściowych wyników to też zwracanie wyników.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

25-12-2004 17:16
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Ewentualnie możesz kazać jej zwrócić tablicę zawierajacą odpowiednio elementy "jest", "nie ma" i potem w pętli wywoływać MsgBox z kolejnymi elementami tej tablicy - ale chyba nie o to ci chodziło.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

25-12-2004 17:17
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Tyle ze częściowych - z programistycznego punktu funkcja może zwrócić tylko jeden wynik i tyle

z Matematycznego punktu może być kilka

No na tym w sumie polegało pytanie - czy da się to zrobić bez tablicy -

Odpowiedź: NIE

[Post edytowany dnia 25-12-2004 17:20 przez DJK]


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

25-12-2004 17:18
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

1) Podaj mi przykład matematycznej, która moze zwrócić więcej niż jeden wynik

2) Zamiast tablicy możesz użyć np. Stringa...


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

25-12-2004 17:59
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
Wszystkich odpowiedzi: 27 :: Maxymalnie na stronę: 20
Strona: [  << <   1 2   > >>  ]  z  2