abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 
abbrechen
Suchergebnisse werden angezeigt für 
Stattdessen suchen nach 
Meintest du: 

Wir schätzen Ihren Input!
Bitte nehmen Sie an der Umfrage zu Archicad 28 Startbildschirm und Lerninhalte/Schnell-Tutorials teil

Dokumentation
Archicads Dokumentationswerkzeuge, Ansichten, Modellfilterung, Layouts, Veröffentlichung, etc.

GDL-Bug?

Hmooslechner
Moderator
HR. Binder!

warum geht das nicht?

!!!Start
ch = OPEN ("DateTime","","%j") !!%j !!Tag des Jahres, als Dezimalzahl (001-366)
n = INPUT (ch, "","",tag)
print tag
close (ch)
dstr=ceil(tag)
print tag
!!!!Ende

in ersten print zeigt er mir brav 126 (heute)
im 2. print zeigt er mir 10???
AC5.5-AC27EduAut, PC-Win10, MacbookAirM1, MacbookM1Max, Win-I7+Nvidia
10 ANTWORTEN 10
Bernhard Binder
Graphisoft Partner
Graphisoft Partner
der Code, den Sie geschrieben haben zeigt auf jeden Fall 2 mal dasselbe Ergebnis, weil sie 2 mal dieselbe Variable ausgeben. Ich denke, der 2. Printbefehl sollte print dstr heißen.

OK: Man kann keine Text-Variable in eine Zahl-Variable umwandeln. Das wird aber in jeder Programmiersprache schwierig, denn wie sollen den Buchstaben oder gar Sonderzeichen dann interpretiert werden. Andersrum ist es natürlich leicht. Eine Zahl kann jederzeit in einen Text umbenannt werden.
Nachdem ich mir vorstellen kann worauf sie hinaus wollen, habe ich meine grauen Gehirnzellen ein bisschen aktiviert und doch eine Möglichkeit gefunden einen Text in eine Zahl umzuwandeln. Hier ist der Code für eine 3-stellige Zahl:
</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">Code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">for i=0 to 9
if strsub (tag, 1,1)=str (i,1,0) then hun=i
if strsub (tag, 2,1)=str (i,1,0) then zen=i
if strsub (tag, 3,1)=str (i,1,0) then ein=i
next i
dstr=hun*100+zen*10+ein
print dstrKurze Erklärung: die Routine holt sich die erste Stelle des Textes und vergleicht es mit dem "Zahltext" und nimmt bei Erfolg die Zahl. Auf diese Art wird alles ausser zahlen ignoriert.
Mit dstr kann dann gerechnet werden.
Alles klar?
AC4.5-AC27 AUT, GER, INT
www.a-null.com
Bernhard Binder
Graphisoft Partner
Graphisoft Partner
ich habe das Script noch etwas "verallgemeinert":
</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">Code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">tag="12345" !<- hier wird die Textvariable definiert
x=strlen(tag) !<- Anzahl der Stellen der Zahl tag
dim zahl [100] !<- ist das Array, auf wieviele Stellen max. berechnet werden kann
! leider kann man in arrays keine Variablen verwenden 😞
for i=0 to 9
for h=1 to strlen (tag)
if strsub (tag, h,1)=str (i,1,0) then
zahl[h]=i
dstr=dstr+zahl[h]*10^x/10
x=x-1
endif
next h
next i
print dstr !<- OK, gib die Zahl aus!;)
AC4.5-AC27 AUT, GER, INT
www.a-null.com
Hmooslechner
Moderator
Danke für die Programmbeispiele - wirklich sehr lehrreich und hilfreich!

Bei meinem Beispiel - da hab ich einen Fehler gemacht - natürlich hätte ich beim 2. Print-Befehl das dstr anzeigen sollen - aber darum gehts mir nicht!

Mir gehts darum, daß eine Variable vom APi übernommen keine echte Flißkommazahl zu sein scheint. Es zeigt mir eben nicht das selbe Ergebnis! - Deshalb meine Vermutung - BUG
AC5.5-AC27EduAut, PC-Win10, MacbookAirM1, MacbookM1Max, Win-I7+Nvidia
Bernhard Binder
Graphisoft Partner
Graphisoft Partner
Die Variable ist auch keine Zahl, sondern ein Text. Daher auch das Problem.
So gesehen ist es kein Bug in GDL, sondern eher ein "Bug" im GDL DateTime AddOn.
Obwohl, hier von einem Bug zu sprechen ist FALSCH. Das Datum wird halt in einem String, also einer Textvariable ausgelesen. Hat auch den Vorteil, verschiedene Formatierungen vornehmen zu können.

In der Erklärung das GDL DateTime AddOns steht übrigens auch:
Es liest einen Wert vom Typ Zeichenfolge ein, der Datum und/oder Zeit in dem, durch die ÖFFNEN-Sequenz angegebenen Format repräsentiert.
AC4.5-AC27 AUT, GER, INT
www.a-null.com
Hmooslechner
Moderator
Gut - verstanden - der Hilfetext ist da für mich einfach irreführend gewesen - Danke!
AC5.5-AC27EduAut, PC-Win10, MacbookAirM1, MacbookM1Max, Win-I7+Nvidia
Hmooslechner
Moderator
irgendwie schaff ich das einfach nicht.

Kopiert das doch einmal in ein neues GDL und probiert es aus - bei mir gehts einfach nicht.

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">Code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">

!!liest Datum aus
dstr= ""
ch = OPEN ("DateTime","","%j") !liest Tag des Jahres aus
n = INPUT (CH, "","",dstr)
Close (ch)
print dstr !!!sB - gibt er hier "128" aus


!!!!!Vorschlag Hr. Binder
tag=dstr !<- hier wird die Textvariable definiert (anstatt "123" nun dstr von oben...)
x=strlen(tag) !<- Anzahl der Stellen der Zahl tag
dim zahl [100] !<- ist das Array, auf wieviele Stellen max. berechnet werden kann

for i=0 to 9
for h=1 to strlen (tag)
if strsub (tag, h,1)=str (i,1,0) then
zahl[h]=i
dstr=dstr+zahl[h]*10^x/10
x=x-1
endif
next h
next i
print dstr !<- OK, gib die Zahl aus!
!!!!!Ende Vorschlag Hr. Binder

Das dstr nach der API-Übergabe ist bei mir weder ein String noch eine Zahl. mit print gibt er zwar heute "128" aus, aber
wenn ichs mit:
tag=str(dstr, 3, 0)
in einen String umwandeln will - Fehlermeldung , da es sich nicht um eine Zahl handelt
aber ein String ist es auch nicht, denn
bei der Prüfung des GDL meckert Archicad:
"String(Text)-Variable erforderlich bei Zeile...".
(bei strlen)
Was nun? 😮
AC5.5-AC27EduAut, PC-Win10, MacbookAirM1, MacbookM1Max, Win-I7+Nvidia
Bernhard Binder
Graphisoft Partner
Graphisoft Partner
Ich habe das Problem schon gefunden! GDL-Buch Seite 195/196:
Der Typ der Variablen nach einem Input Befehl wird während der kompilierung nicht mehr geprüft.
Dadurch "vergisst" die Funktion Script prüfen welcher Typ das nun ist. Beim Ausführen weiss es das Script aber dann.
Ich habe jetzt einen kleinen Trick eingebaut, damit die Funktion Script prüfen getäuscht wird. die Länge der Variable soll nur dann ausgelesen werden, wenn die Variable eine String-Variable ist. Das geht mit dem Befehl vartype
Hier das Script:
</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">Code:</font><hr /><pre style="font-size:x-small; font-family: monospace;">!!liest Datum aus
dstr= ""
ch = OPEN ("DateTime","","%j") !liest Tag des Jahres aus
n = INPUT (CH, "","",dstr)
Close (ch)
print dstr !!!sB - gibt er hier "128" aus


!!!!!Vorschlag Hr. Binder
tag=dstr !<- hier wird die Textvariable definiert (anstatt "123" nun dstr von oben...)
dstr=0 !<- Definiert dstr als numerischen Variablentyp
if vartype (tag)=2 then x=strlen(tag) !<- Anzahl der Stellen der Zahl tag
y=x !<- wird für die Schleife gebraucht
dim zahl [100] !<- ist das Array, auf wieviele Stellen max. berechnet werden kann
for i=0 to 9
for h=1 to y
if strsub (tag, h,1)=str (i,1,0) then
zahl[h]=i
dstr=dstr+zahl[h]*10^x/10
x=x-1
endif
next h
next i
print dstr !<- OK, gib die Zahl aus!
!!!!!Ende Vorschlag Hr. Binder
AC4.5-AC27 AUT, GER, INT
www.a-null.com
Hmooslechner
Moderator
Danke - nun flutschts! :yeah:
AC5.5-AC27EduAut, PC-Win10, MacbookAirM1, MacbookM1Max, Win-I7+Nvidia
Hmooslechner
Moderator
So - was kann man mit dem Teil tun?

Einen sanften Hinweis auf eine abgelaufene Nutzungsberechtigung zB..

</font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">Code:</font><hr /><pre style="font-size:x-small; font-family: monospace;"> circle2 0,0,2 !Dummy
!!liest Datum aus
dstr= ""
ch = OPEN ("DateTime","","%j") !liest Tag des Jahres aus
n = INPUT (CH, "","",dstr)
Close (ch)

!!!!!Vorschlag Hr. Binder
tag=dstr !<- hier wird die Textvariable definiert (anstatt "123" nun dstr von oben...)
dstr=0 !<- Definiert dstr als numerischen Variablentyp
if vartype (tag)=2 then x=strlen(tag) !<- Anzahl der Stellen der Zahl tag
y=x !<- wird für die Schleife gebraucht
dim zahl [100] !<- ist das Array, auf wieviele Stellen max. berechnet werden kann
for i=0 to 9
for h=1 to y
if strsub (tag, h,1)=str (i,1,0) then
zahl[h]=i
dstr=dstr+zahl[h]*10^x/10
x=x-1
endif
next h
next i
!!!!!Ende Vorschlag Hr. Binder

!endatum=150 !!als Beispiel

if dstr>endatum then
oberhalb=str((dstr-endatum), 3,0)
dstr=str(dstr, 3,0)
print"Sharewaredatum abgelaufen! melden Sie sich bei hmooslechner@gmx.at oder schicken Sie per Scheck 20Euro an mich!"
text2 0,0, "heute = der " + dstr + ". Tag des Jahres und die Nutzungsberechtigung ist um " + oberhalb + "überschritten" !gemein-aber wirkungsvoll.. 🙂
else
endif Bei überschreiten von "endatum" schreit das GDL.
Natürlich kann ein GDL-Nutzer diesen Teil rausschmeißen, aber so als Erinnerung nicht schlecht - oder?

mit </font><blockquote><font size="1" face="Verdana, Helvetica, sans-serif">Code:</font><hr /><pre style="font-size:x-small; font-family: monospace;"> dongl=REQ ("Serial_number") !!liest Dongelnummer aus könnte man da noch weiter gehen.

Mit Code-Scrambling wäre es für 95% der Nutzer unknackbar.. 😉
AC5.5-AC27EduAut, PC-Win10, MacbookAirM1, MacbookM1Max, Win-I7+Nvidia

Keine Antwort gefunden?

Andere Beiträge
im Board ansehen

Zurück zum Board

Neueste Lösungen durchsuchen

Akzeptierte Lösungen zeigen

Eine neue Diskussion starten!

Neues Thema erstellen