Toon posts:

[VB6] Snellere manier voor Evaluate()

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik gebruik een 3th-party applicatie om cartografische berekeningen mee te doen (Surfer 8 ).
Deze applicatie kan maar twee variabelen aan.
Dus:
Ik kan functies gebruiken als C=23*A+78 en C=23*A+45*B-67
waar C de nieuwe kaart is en A en B bestaande kaarten zijn.

Nu komt het bij ons regelmatig voor dat we meer dan 2 variabelen willen gebruiken, dus dat we functies nodig hebben als:
C=23*A+45*B-67*D+89 of zelfs C=23*A+45*B-67*D+89*E-123

Surfer is prima te programmeren via VB6 en dit probleem los ik als volgt op.

Ik gebruik de volgende functie:
C=23*A+45*B-67*D+89
Ik lees de data van de kaarten A, B en D in geheugen in.
Bepaal per coordinatenpaar de waarde van elk punt in elke kaart.
Vervang in de functie de letters A, B of D met de waarde uit de bijbehorende kaart en gebruik Evaluate() om die uitkomst te berekenen.
Dus
Functie is C=23*A+45*B-67*D+89
De waarde van kaart A op punt x,y is 15.6,
van B is 18.9
en van D is 28.25
Na een Replace ziet de functie er als volgt uit:
23*15.6+45*18.9-67*D+28.25
Deze string stop ik in Evaluate()
Uitkomst = CDbl(Evaluate(sFunctie))
en ik heb de uitkomst.

Dit werkt prima alleen is heel erg traag.
Het langste duurt de Evaluate functie.
Normaal duurt een kaart berekenen ca. 40 sec (afhankelijk hoe groot, etc) en nu duurt het 2 min 20.

Mijn vraag is dan ook.
Weet iemand een andere en snellere manier om een string te berekenen?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Wat is er mis met een temporary?

C=23*A+45*B-67*D+89 =>

C = T1-67*D+89
T1 = 23*A+45*B

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
@MSalters:
Zo doen we het nu ook, uiteraard ;)

Maar dat geeft een aantal problemen.
Zoals bijv. het fine-tunen van de formule, vaak moet er nog een beetje bij of er een beetje af.
Mijn applicatie die al de formules beheerd en Surfer aanstuurt heeft ook een automatisch printfunctie. In de huidige opzet, dus met een temporary, worden er nogal wat kaarten onnodig geprint (meerdere exemplaren) op duur papier en met een dure printer.
Zo zijn er nog wat andere problemen die er voor gezorgt hebben dat ik een andere oplossing ben gaan zoeken.

Bedankt voor het meedenken, maar heb je ook een alternatief voor Evaluate().

Verwijderd

Ik zou hier eens kijken

http://digilander.libero....MathExpressionsParser.htm
This document describes the clsMathParser 3.4.x pack for evaluating math expressions. It accepts in input any string representing an arithmetic or algebraic expression and a list of the variable's values; it returns a numeric value in double precision. clsMathParser can be used to calculate formulas (expressions) given at runtime, for example to plot and tabulate functions, to make numerical computations and more. It works in VB 6, VBA 97/2000/XP .

Verwijderd

Topicstarter
@freewilly:
Geweldig. Heel erg bedankt.

Ik heb de class opgehaald in mijn progje gestopt, een paar regels toegevoegd en het gaat als een speer!
20 seconden waar ik eerst meer dan 2 min. voor nodig had.

Verwijderd

Heb deze klasse recentelijk gebruikt, en het is me echt heel erg bevallen, leek me al precies wat je zocht. Top stukje code.
Pagina: 1