Frust

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Sylvia
verheiratet<br>1. PureGolf-Gewinner
Beiträge: 487
Registriert: 29.08.2004 09:42
Wohnort: Old Europe

Frust

Beitrag 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!
Basic Pur = PureBasic
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Frust

Beitrag 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 ?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Sylvia
verheiratet<br>1. PureGolf-Gewinner
Beiträge: 487
Registriert: 29.08.2004 09:42
Wohnort: Old Europe

Re: Frust

Beitrag 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
Basic Pur = PureBasic
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Frust

Beitrag 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.)
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Frust

Beitrag 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)
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Sylvia
verheiratet<br>1. PureGolf-Gewinner
Beiträge: 487
Registriert: 29.08.2004 09:42
Wohnort: Old Europe

Re: Frust

Beitrag 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)
Basic Pur = PureBasic
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Frust

Beitrag 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.
Bild
Benutzeravatar
Sylvia
verheiratet<br>1. PureGolf-Gewinner
Beiträge: 487
Registriert: 29.08.2004 09:42
Wohnort: Old Europe

Re: Frust

Beitrag 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 ;-)
Basic Pur = PureBasic
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Frust

Beitrag 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:
Bild
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Frust

Beitrag 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.
Antworten