Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 8. 11. 2014 11:55:19

LADER
Člen
Registrace: 3. 4. 2013
Příspěvků: 145

Funkce zpětně zapisuje do pole z kterého pouze čte - VYŘEŠENO

Teď jsem se od včerejška trápil s programem, kdy jsem četl jedno pole dat buňku po buňce, počítal a zapisoval výsledek do druhého pole. Bohužel se mi výpočet zapisoval i do pole ze kterého jsem četl.
Takhle vypadal zápis chybného volání funkce (zjednodušeno):

B(i,j) = Funkce(A(i,j))

a takhle vypadá správné volání přes dočasnou proměnou (nic se nezapisuje):

X = A(i,j)
B(i,j) = Funkce(X)

Pravděpodobně v prvém případě se předává pouze odkaz na proměnou. V druhé případě se předává hodnota. Chyba se projeví pouze u pole.
Nevím jestli je to normální vlastnost. No vzhledem k tomu, že program jsem měl dost složitý a o tomto jsem nevěděl, tak se to fakt blbě hledá.

Editoval LADER (9. 11. 2014 09:52:23)


Ubuntu 22.04.4 LTS, LibreOffice Verze: 7.6.6.3, wxMaxima 20.12.1, Maxima 5.47.0 (SBCL)

Offline

#2 8. 11. 2014 12:38:19

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,468

Re: Funkce zpětně zapisuje do pole z kterého pouze čte - VYŘEŠENO

U pole (array) by se jednalo zřejmě o zápis do dvojrozměrného pole. Ovšem podle notace Funkce(A(i,j)) to vypadá zase jako vzorec - respektive Function spouštěná ze sešitu s parametry A(i;j).
     Pokud se jedná skutečně jen o operace v rámci Basicu (bez manuálního vstupu buňkou sešitu) pak by zřejmě mělo fungovat i to první vyjádření. Problém může být ve volání vektorů a zápisu do array.
     Skutečně je někdy potřeba načíst rekurzivně hodnoty z array(i,j) do pomocné proměnné, aby to šlo zpětně do téhož umístění vložit. Tam je pak otázkou použití string a s tím související SPLIT nebo i MERGE.


     Jestli je to tak nebo onak z uvedeného asi neposoudím správně, ale
GetArray....B(i,j) načte proměnou, ale
SetArray....B(i,j) vloží proměnnou.
     Takže jestli chcete vkládat, nemůžete vkládat funkci, ale jen její výsledek. Potom potřebujete opravdu pomocnou proměnnou - například :
Dim iVar as Něco
iVar = Funkce(A(i,j)) 'a následně
B(i,j) = iVar
     Práce s polem není tak úplně jednoduchá a jde skutečně také o typ pole (rozměry, typ jako variant, string a td.)
     Jestliže načítáte ze sešitu buňky tak si také musíte dávat pozor jak jsou deklarované. nejlepší je to jako 'object' kde je pak proměnnou například Cell.Value tedy :
B(i,j) = Cell.Value.


     Jak jsem ale již uvedl - bez ukázky to ani neumím správně odhadnout. Mohlo by se jednat o volání specializovaných funkcí jako vzorce - skutečně například do buňky sešitu =X(i;j).

Editoval neutr (8. 11. 2014 12:42:54)


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#3 8. 11. 2014 13:12:02

LADER
Člen
Registrace: 3. 4. 2013
Příspěvků: 145

Re: Funkce zpětně zapisuje do pole z kterého pouze čte - VYŘEŠENO

Jedná se makro ve smyčce 'For-Next' kde jsem načítal jednotlivé buňky dvourozměrného pole A(i,j),  zpracoval a výsledek zapisoval do pole B(i,j).

Toto je špatně - výsledek se zapíše i do pole A (vyzkoušeno):

Dim iVar As Integer
iVar = Funkce(A(i,j))
B(i,j) = iVar

Toto je dobře:

Dim iVar As Integer
iVar = A(i,j)
B(i,j) = Funkce(iVar)

Toto je taky dobře:

B(i,j) = Funkce(ByVal A(i,j))

Ubuntu 22.04.4 LTS, LibreOffice Verze: 7.6.6.3, wxMaxima 20.12.1, Maxima 5.47.0 (SBCL)

Offline

#4 8. 11. 2014 13:36:14

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,468

Re: Funkce zpětně zapisuje do pole z kterého pouze čte - VYŘEŠENO

Ano jasně - já jsem si to neuvědomil. "Funkce(A(i,j)" Volá jako parametr array a ne hodnotu, která leží pod vektory (i,j). Omlouvám se :-)
     Ale z toho dalšího vyjádření vyplývá, že byl nesprávně předáván parametr funkci. Jde samozřejmě o to, co ta funkce dělá. Takhle to vypadá, že je to jen prostředník mezi A() a B(), tedy stejně jako iVar. Mám takový dojem, že by to mohlo být správně u starších verzích OOo. LO se chová prakticky jako když by bylo deklarováno Option Explicid. Dřív to bylo "volnější".


     Nepostačuje tam jenom například B(i,j) = A(i,j)+něco? Tohle jsou časté případy pro převody mezi různými array př : array as string a array as object (i opačně)

Editoval neutr (8. 11. 2014 13:51:16)


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#5 8. 11. 2014 14:48:53

lp.
Člen
Registrace: 24. 9. 2009
Příspěvků: 844

Re: Funkce zpětně zapisuje do pole z kterého pouze čte - VYŘEŠENO

Bez výpisu Funkce se dá jen hádat, ale zdá se. že jste na to přišel.

Prvek pole se do fuknce předával odkazem, Pokud jste parametr potom upravoval, tak se změnila i buňka parametru.

Dejte to ByVal do deklarace funkce a mělo by to fungovat (hádám).

Offline

Zápatí