Satznummer eines Array

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Tom,
nach Deiner Logik wäre auch dies ein mehrdimensionales Array:

Code: Alles auswählen

aArray := {} 
Aadd(aArray,'a')
Aadd(aArray,'b')
Aadd(aArray,'c')
Auch dieses Array hat zwei Dimensionen, aber in X-Richtung nur einen Eintrag :!: :thefinger: :tongue3: :wink: :D

Viele Grüße,
der Korinthenkacker
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Freund Korinthe. :lol:

Sorry, aber Dein Array hat nur eine Dimension, wenn man es als Array mit referenzierten Elementen betrachtet. Da Du zufällig Strings in dieses Array gefüllt hast, geht natürlich ? aArray[1,1] (Antwort: a), aber mit numerischen Einträgen schon nicht mehr.
Herzlich,
Tom
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Mist - durchschaut :D

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi,

noch eine kleine Frage hinterher und zwar hier, damit das Thema nicht in einem neuen Thread nochmals erklärt werden muß.

Habe ich denn eine Möglichkeit AEVAL() in meinem Fall mittendrin zu unterbrechen, wenn irgendwas in meiner Funktion nicht so ist, wie ich es wünsche? Normalerweise kann ich ja ein .F. zurückschicken, aber das alleine dürfte AEVAL() nicht vorzeitig beenden!?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Manfred.

Du mußt den Zähler einfach auf die Länge des Arrays oder einen sehr hohen Wert setzen:

Code: Alles auswählen

AEval(aArray,{|a,i| i := rechungsdruck(a,i)})

FUNCTION rechnungsdruck(aElement,nPtr)
....
RETURN IF(lAbbruch,99999999,nPtr)
Da i nach Ausführung der Anweisung inkrementiert wird, dürfte das funktionieren.

BTW, AEval() übergibt bei Nutzung des ersten Codeblock-Parameters das Element. Wenn Du das gesamte Array in der aufgerufenen Funktion benötigst, mußt Du aArray übergeben, nicht a.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Tom,

nö, klappt so nicht.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hi Manfred,

ich arbeite auch sehr viel mit Arrays. auch mit mehrdeminsionalen.
Diese benötige ich z.b. zum Drucken. Dies mache ich folgendermaßen:

for i = 1 to Len(Array)

GraStringAt(oPs, {100,900}, Array[1]
GraStringAt(oPs, {100,870}, Array[2]
usw.
Next i

Hier ist I mein "Record-Zähler". Damit kann ich dann auch bestimmen,
wenn bei einer gewissen Satzzahl etwas passieren soll.

So zur Info.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi,

hat sich alles erledigt, ich habe erstmal AEVAL gegen For next ersetzt, jetzt kann ich es so machen, wie ich will.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Tom,
Tom hat geschrieben: Das hier ist Blödsinn:

Code: Alles auswählen

AEVAL(aKunde,{|aKunde| rechnungsdruck(aKunde)})
die Doppelverwendung des aKunde ist sicher verwirrend, aber es funktioniert ! Das erste aKunde enthält das ganze Array, übergeben wird an diesen Codeblock mit gleichem Namen wie das ursprüngliche Array nur die aktuelle Zeile des ursprünglichen Arrays.
Gleiche Variablennamen im jeweiligen local Umfeld.

etwa so

111
222 -> 222
333
Tom hat geschrieben: So ist es sinnreicher:

Code: Alles auswählen

AEVAL(aKunde,{|a,i| rechnungsdruck(a[i])})
den 2. Parameter als Array Laufvariable hatte ich noch nie gesehen.
Werde ich mir merken :) ,
aber diesen dann bei a zu verwenden, welches ja nur eine Zeile von aKunde ist, ist ein Tippfehler.
Entweder
-> rechnungsdruck(aKunde,i)
oder besser
-> rechnungsdruck(a,i)
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Manfred hat geschrieben:Hi,
hat sich alles erledigt, ich habe erstmal AEVAL gegen For next ersetzt, jetzt kann ich es so machen, wie ich will.
Hi Manfred,

aEval() ist gegenüber For / Next deutlich schneller, aber nicht immer so leicht zu durchschauen ;)
Mit for next ist man auf der sicheren Seite :!:
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

das habe ich mittlerweile auch schon spitz gekriegt. Das problem ist halt, wie unterbricht man es , wenn man wie bei mir eine Funktion aufrufen will, die auch ein .F. zurückliefern kann. Bleibt im Moment nur For next.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Manfred.

So dürfte es gehen:

Code: Alles auswählen

lWeitermachen := .T.
AEval(aArray,{|a,i| IF(lWeiterMachen,lWeitermachen := rechungsdruck(a,i),NIL)})

FUNCTION rechnungsdruck(aElement,nPtr)
....
RETURN lAbbruch
Das durchläuft die Schleife zwar i Male, macht aber ab dem Moment, in dem "rechnungsdruck" .F. zurückliefert, nichts mehr, außer bis zum Ende zu zählen.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Tom,

das werde ich mal probieren, das sieht mir recht schlau aus.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

jetzt muß ich doch mal fragen, woher ihr wißt, dass z.B. ein .f. als Rückgabewert bei der AEVAl() Funktion diese abbricht.
In der Doku kann ich dazu nix finden.
Mit Müh und not kann man unten aus einem Beispiel den 2. Parameter erkennen :?
Gruß
Hubert
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hi Manred,

wenn du die For-Next Schleife durchläufst kannst du die Schleife mit Exit beenden. Dann wird das Programm weiter verarbeitet mit dem nächsten Befehl nach Next.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Antworten