Seite 1 von 3

Frust

Verfasst: 09.12.2017 19:12
von Sylvia
Bin gerade dabei, ein älteres PB-Progrämmchen von V3.94 auf die aktuelle PB-Version umzuschreiben. Habe vor 10 min. angefangen...und bin schon wieder genervt!

War es bisher möglich, den korrekten Ausdruck

Code: Alles auswählen

"Wert = +12"
zu schreiben, wird dies jetzt als Fehler moniert! Ok...kann man leben damit, aber ist meiner Meinung nach ein BUG.

Genauso wird jetzt ein Fehler (Error: "Es wird ein Ausdruck ausschliesslich mit Ganzzahlen erwartet") ausgegeben, wenn ich schreibe:

Code: Alles auswählen

SMaterialwert+STomWert(Abs(TOM(SPL(a))))
ABS() wandelt automatisch in FP und im obigen Fall mit den Integervariablen ohne Umwandlung nach ABS() nicht mehr zu verwenden.

Habe auch 2 Include-Dateien, deren dimensionierte Arrays nicht um's verrecken anerkannt werden, trotz korrekter Initialisierung im Hauptprogramm.

Wer weiss, was noch alles kommt. Am besten, ich lasse die ganze Sache mit Umschreiben. Wäre zu schön gewesen, mal ohne Frust an das EIGENTLICHE Vorhaben heranzugehen!

Re: Frust

Verfasst: 09.12.2017 19:28
von ccode_new
Hallo Sylvia,

der PureBasic-Compiler ist halt über die Jahre hinweg gereift.

Das heißt es wurden eben Altlasten wegen Inkompatibilitäten oder Effizienzeinbußen beseitigt.

"Wert = +12"
->schreibe: Wert + 12 oder Wert = Wert + 12

und lösen bitte diese Gleichung mal genauer auf:

SMaterialwert = SMaterialwert + STomWert(Abs(TOM(SPL(a))))

Was macht STomWert ? Ist das ein Array oder eine Funktion ?
Was macht TOM ? Ist das ein Array oder eine Funktion ?
Was macht SPL ? Ist das ein Array oder eine Funktion ?
Welchen Typ hat die Variable a ?

Re: Frust

Verfasst: 09.12.2017 20:55
von Sylvia
Sorry ccode_new, du bist bei beiden Problemen auf dem Holzweg.

zu 1) Ich möchte nicht 12 aufaddieren, sondern ZUWEISEN (wie z.B. x = 12, aber eben mit (explizitem) VORZEICHEN wie bei x = -12)

zu 2) alles Array's. Aber das ist nicht das Problem! TOM(SPL(a)) kann auch negative Werte haben, die ich mit ABS() normalisieren möchte, da dieser Wert wiederum als Zeiger für STomWert() fungiert. Das Problem ist also, dass der Index auf das Array durch ABS() jetzt als FloatingPoint übergeben wird...und Array(var.f) geht eben nicht!


Aber mal grundsätzliche Frage an die Entwickler zum Nachdenken: Was wäre schlimm, das Array(var.f) zu erlauben? Eine einfache, interne Integer-Umwandlung und fertig ist die Marie

Re: Frust

Verfasst: 09.12.2017 21:25
von ccode_new
Ach Sylvia,
Sylvia hat geschrieben:Eine einfache, interne Integer-Umwandlung und fertig ist die Marie
>>> Da hast du doch schon die Lösung.

Code: Alles auswählen

Procedure.l IAbs(w.l)
  tw.f = ValF(Str(w))
  tw2.f = Abs(tw)
  ProcedureReturn Val(StrF(tw2))
EndProcedure
Das ist jetzt zwar nicht sehr effizient aber vielleicht schreibt hier ja noch Einer eine besser Funktion (z.B in Assembler).

Und was das + Zeichen betrifft: Muss den unbedingt ein + Zeichen vor dem Wert stehen ? (Das ist doch nur eine unnötige Fehlerquelle.)

Re: Frust

Verfasst: 09.12.2017 21:26
von #NULL
du kannst Abs() mit einem Macro überschreiben

Code: Alles auswählen

Procedure.f abs_proc(f.f)
  ProcedureReturn Abs(f)
EndProcedure

Macro Abs(_)
  Int(abs_proc(_))
EndMacro

Dim arr(10)
f.f = -3.7
arr(Abs(f)) = 123

Debug arr(3)
wird dann aber überall angewendet.
Vielleicht besser ein Macro für das Array

Code: Alles auswählen

Dim arr__(10)

Macro arr(_)
  arr__(Int(_))
EndMacro

f.f = -3.7
arr(Abs(f)) = 123

Debug arr(3)

Re: Frust

Verfasst: 10.12.2017 14:15
von Sylvia
@#NULL:
Ach?!...das ist ja interessant und mir neu, dass ich reservierte PB-Funktionen durch Eigene überschreiben kann! Habe gleich mal nachgesehen in der Beschreibung zu den Macros, aber leider nichts zu diesem Thema gefunden. Na gut, durch dein Beispiel ist ja klar, wie's funktioniert. Aber zeigt mal wieder, dass die PB-Hilfe -wie so oft- hinterherhinkt.

Das ist zwar cool, dass das geht und eröffnet Möglichkeiten, macht mir aber gleichzeitig Sorgen, dass ich mich in einem Fremdcode nicht darauf verlassen kann, dass etwas funktioniert wie es funktionieren soll (ohne vorherigen Check aller Macros)

Re: Frust

Verfasst: 11.12.2017 11:59
von NicTheQuick
Die meisten Leute packen ihre Codes mittlerweile in Module, die sie vom Rest des Codes abkapselt. Wenn man ein Modul eines Fremden benutzt, muss man da jedenfalls keine Sorge haben, dass ein Makro irgendwas überschreibt.
Habe auch 2 Include-Dateien, deren dimensionierte Arrays nicht um's verrecken anerkannt werden, trotz korrekter Initialisierung im Hauptprogramm.
Wie sehen die Zeilen genau aus? Hast du vielleicht Global vergessen?

Code: Alles auswählen

Global Dim meinArray(10)
Ansonsten gilt das Array nur im Hauptcode und nicht in Procedures.

Re: Frust

Verfasst: 11.12.2017 21:42
von Sylvia
Hi Nic,

habe in den vergangenen Jahren natürlich mit aktuelleren PB-Versionen als mit V3.94 gearbeitet und weiss um solche Sachen wie "Global" usw. Das interessante an der Sache ist, dass ich bereits "Global DIM" in diesem alten Programm verwende. D.h, dass ich es schonmal auf eine "aktuellere" Version angepasst habe (kann jetzt aber nicht sagen, wann "Global" eingeführt wurde). Im Programm-Header habe ich die Umstellung leider nicht vermerkt.

Hab's aber aufgegeben, dass anpassen. Es ist wie es ist.

Da schau her, bist ja inzwischen Admin! :allright:

Wie geht's deinem Studium? Müsstest ja inzwischen schon promoviert und deinen Doktor-Titel haben ;-)

Re: Frust

Verfasst: 12.12.2017 11:08
von NicTheQuick
Sylvia hat geschrieben:Da schau her, bist ja inzwischen Admin! :allright:

Wie geht's deinem Studium? Müsstest ja inzwischen schon promoviert und deinen Doktor-Titel haben ;-)
Ich habe meinen Bachelor gemacht und dann hatte ich keine Lust mehr auf diesen Unikram. Arbeiten macht doch viel mehr Spaß als die olle Theorie. Ich mache jetzt eh Dinge, die ich an der Uni so eigentlich gar nicht gelernt habe. :lol:

Re: Frust

Verfasst: 16.12.2017 00:48
von Nino
ccode_new hat geschrieben:Und was das + Zeichen betrifft: Muss den unbedingt ein + Zeichen vor dem Wert stehen ? (Das ist doch nur eine unnötige Fehlerquelle.)
Nein, das ist überhaupt keine Fehlerquelle.
Manche Leute möchten das gerne an best. Stellen schreiben wegen besserer Lesbarkeit des Codes. Es gibt keinen vernünftigen Grund das nicht zu erlauben. Andere Programmiersprachen erlauben das auch.
Sylvia hat geschrieben:Das ist zwar cool, dass das geht und eröffnet Möglichkeiten, macht mir aber gleichzeitig Sorgen, dass ich mich in einem Fremdcode nicht darauf verlassen kann, dass etwas funktioniert wie es funktionieren soll (ohne vorherigen Check aller Macros)
Ja, sicherer und übersichtlicher ist es wohl, wenn Du eine spezielle Abs()-Funktion für ganze Zahlen benutzt, z.B.:

Code: Alles auswählen

Procedure.q AbsQ (x.q)
   If x < 0
      x = -x
   EndIf
   ProcedureReturn x
EndProcedure
Dass sowas nicht in PB eingebaut ist, ist etwas eigenartig.