C Überprüfung von Variablen und logische Abfragen: Unterschied zwischen den Versionen

Aus ITP
Zur Navigation springen Zur Suche springen
 
(13 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 43: Zeile 43:
Man kann mit txa auch auf Felder zugreifen.
Man kann mit txa auch auf Felder zugreifen.


== Protokollieren mit prt ==
let#p_i(31:54)  0                  $ Feld p_i definiert und alle Felder mit 0 belegt
loop#1  6*4
        let#p_i(31+#1)  31+#1      $ ab Index 31 die Ziffern 31,32,33... eintragen
        txa    index  = #(#1+31,2.0)  Ziffer      = #(#p_i(31+#1),4.0)
endloop
 
 
== Protokollieren mit prt oder dbg==


Bei der Variante mit TXA erfolgt die Kontrollausgabe in den Report Browser.
Bei der Variante mit TXA erfolgt die Kontrollausgabe in den Report Browser.
Zeile 57: Zeile 64:


Alternativ kann man auch den ganzzahligen Anteile mit let#variable_neu div(#variable_alt,1) ermitteln.
Alternativ kann man auch den ganzzahligen Anteile mit let#variable_neu div(#variable_alt,1) ermitteln.
Auch ganze Felder kann derart protokollieren.
Mit einer Eingabe dbg#2 bekommt man evtl. hilfreiche Hinweise bei schwer zu erkennenden Fehlern.
== Schleifen mit logischen Abfragen testen ==
=== Allgemeines ===
& - UND
| - ODER
Bei logischen Abfragen ist es sehr wichtig, ganz streng zu "klammern"!!!
'''elseif  ((#x<#l) & (#x>=(2*#a+#c)))'''
Das Programm liefert keine brauchbaren Fehlermeldungen, sonder macht irgendetwas.
Es kann recht hilfreich sein, sich die Grenzwerte "i" in Variablen zu speichern. z. Bsp.:
* #i1: #a
* #i2: #a+#c
* #i3: 2*#a+#c
* #i4: #l
* #i5: #l+#a
* #i6: #l+#a+#c
* #i7: #l+2*#a+#c
Wenn man sich in der jeweiligen Abfrage mit:
txa Fall 4: x>=l+2a+c & x<l
txa lf #(#lf,4.0)
txa x #(#x,7.3) 
den jeweiligen Status ausgeben lässt, so kommt man recht fix zu einer guten Kontrolle.😂
=== Klammersetzung ===
Hier ein weiteres Beispiel für die Notwendigkeit zu '''klammer'''!
Ohne diese Klammersetzung passiert nix, und es kommt auch keine Fehlermeldung.
Wenn #1=0 ODER #1=8 ODER #1=9...dann:
    if (((#1==0)|(#1==8))|(#1==9))
=== Geradzahligkeit ===
Gelegentlich braucht man eine gerade ganze Zahl.
Das geht beispielsweise so:
$ Längsrichtung #ny
if (mod(div(#y/#hmin),2))>0
    sto#ny  div(#y/#hmin)+1
else
    sto#ny  div(#y/#hmin)
endif
* #ny ist unabhängibg von den Werten #y und #hmin immer eine gerade Ganzzahl.
== Winkel ==
Gelegentlich möchte man z.Bsp. mit GON oder auch RAD als Winkeleinheit rechnen: geht ganz einfach!
let#xyz 0.5/sin(gon,67.21)
txa ergebnis #(#xyz,8.3)


== Fehlermöglichkeiten ==
== Fehlermöglichkeiten ==
Zeile 66: Zeile 132:
Ich definiere im '''Template''' die globalen Variablen
Ich definiere im '''Template''' die globalen Variablen
   
   
'''sto#yl -1,07/2'''
'''sto#yl -1,07/2''' $y_links


'''sto#yr -#yl'''.
'''sto#yr -#yl'''.
Zeile 73: Zeile 139:


'''let#yr'''  1.85 😆
'''let#yr'''  1.85 😆
'''let#yl'''  -#yr
'''let#yl'''  -#yr
lar nr 1 grp1 1 grp2 2 grp3 - m #hmin n #hmin t 1 x1 #x1 #yl 0 x2 #x8 #yl 0 x3 #x8  #yr 0 x4 #x1 #yr 0
lar nr 1 grp1 1 grp2 2 grp3 - m #hmin n #hmin t 1 x1 #x1 #yl 0 x2 #x8 #yl 0 x3 #x8  #yr 0 x4 #x1 #yr 0


Da die erneute lokale Definition der Variablen die globale überschreibt...ist die LAR viel zu breit. 🙄
Da die erneute lokale Definition ('''let''') der Variablen die globale ('''sto''') überschreibt...ist die LAR viel zu breit. 🙄 '''KONTROLLE, KONTROLLE, KONTROLLE'''
 
Ein weitere Fehlerquelle könnte die Verwendung einer veralteten STO - Variable sein. Man kann z.Bsp. sto#var1 definieren (oder aus einem Vorlageprojekt übernehmen) und dann doch die Variable sto#var2 defineren und benutzen.
 
Im alten Eingabesatz wird aber immernoch #var1 verwendet. Dieses verhindert man dadurch, dass man regelmäßig die Datenbank aufräumt.
 
[[Kategorie:Allgemeines zu CADINP]]
[[Kategorie:Allgemeines zu CADINP]]

Aktuelle Version vom 1. März 2023, 08:53 Uhr

der Befehl txa

Für die Kontrollausgabe benutze ich gern:

       txa     Kontrollausgabe
       txa Linien Knickpunkt Gradiente
       let#lnnr  #sln1+#i
       let#np_1  #f3(#i)
       let#np_2  #f3(#i+1)
       txa     Linie Nr.       = #(#lnnr,10.0)
       txa     Knoten Nr. 1    = #(#np_1,10.0)
       txa     Knoten Nr. 2    = #(#np_2,10.0)

10.0 bedeutet: insgesamt 10 Stellen, davon 0 nach dem Komma.

In Schleifen mit Abfragen von Bedingungen kann man so eine Zwischenkontrolle durchführen:

let#knr 3000

let#knrref 1000

let#y 1.3

let#dx0 0

let#dx1 -0.191

loop#i 37

       if (#i==0)
           let#dx  #dx1
       elseif (#i==19-1)
           let#dx  #dx1
       elseif (#i==37-1)
           let#dx  #dx1
       else
           let#dx  #dx0
       endif
       txa     dx  = #(#dx,6.3)
       spt     nr #knr+1+#i    x #x_a_n(#i+1)+#dx  y #y z 0
       sptp    typ kf  ref #knrref+1+#i    grp 99

endloop

Man kann mit txa auch auf Felder zugreifen.

let#p_i(31:54) 0 $ Feld p_i definiert und alle Felder mit 0 belegt loop#1 6*4

       let#p_i(31+#1)  31+#1       $ ab Index 31 die Ziffern 31,32,33... eintragen
       txa     index  = #(#1+31,2.0)   Ziffer       = #(#p_i(31+#1),4.0)

endloop


Protokollieren mit prt oder dbg

Bei der Variante mit TXA erfolgt die Kontrollausgabe in den Report Browser.

Alternativ dazu kann man auch die Variante mit PRT nutzen:

prt#qnr_st(1)

Hierbei erfolgt die Ausgabe unter "Echo der Eingabe" und es werden evtl. unerwünschte Nachkommastellen angezeigt. Falls eine Variable eine ganzzahlige Zahl sein muss, so gibt man diese mit z.Bps. zwischen zwei Hochkomma ein:

sto#qnr_nt '0' '301' '201' '201' '101' '101' $ Querschnittsnummer

Alternativ kann man auch den ganzzahligen Anteile mit let#variable_neu div(#variable_alt,1) ermitteln. Auch ganze Felder kann derart protokollieren.

Mit einer Eingabe dbg#2 bekommt man evtl. hilfreiche Hinweise bei schwer zu erkennenden Fehlern.

Schleifen mit logischen Abfragen testen

Allgemeines

& - UND | - ODER

Bei logischen Abfragen ist es sehr wichtig, ganz streng zu "klammern"!!!

elseif ((#x<#l) & (#x>=(2*#a+#c)))

Das Programm liefert keine brauchbaren Fehlermeldungen, sonder macht irgendetwas. Es kann recht hilfreich sein, sich die Grenzwerte "i" in Variablen zu speichern. z. Bsp.:

  • #i1: #a
  • #i2: #a+#c
  • #i3: 2*#a+#c
  • #i4: #l
  • #i5: #l+#a
  • #i6: #l+#a+#c
  • #i7: #l+2*#a+#c

Wenn man sich in der jeweiligen Abfrage mit: txa Fall 4: x>=l+2a+c & x<l txa lf #(#lf,4.0) txa x #(#x,7.3) den jeweiligen Status ausgeben lässt, so kommt man recht fix zu einer guten Kontrolle.😂

Klammersetzung

Hier ein weiteres Beispiel für die Notwendigkeit zu klammer! Ohne diese Klammersetzung passiert nix, und es kommt auch keine Fehlermeldung. Wenn #1=0 ODER #1=8 ODER #1=9...dann:

   if (((#1==0)|(#1==8))|(#1==9))

Geradzahligkeit

Gelegentlich braucht man eine gerade ganze Zahl.

Das geht beispielsweise so:

$ Längsrichtung #ny

if (mod(div(#y/#hmin),2))>0

   sto#ny  div(#y/#hmin)+1

else

   sto#ny  div(#y/#hmin)

endif

  • #ny ist unabhängibg von den Werten #y und #hmin immer eine gerade Ganzzahl.

Winkel

Gelegentlich möchte man z.Bsp. mit GON oder auch RAD als Winkeleinheit rechnen: geht ganz einfach!

let#xyz 0.5/sin(gon,67.21)

txa ergebnis #(#xyz,8.3)

Fehlermöglichkeiten

Das mit den Variablen hat so seine Tücken.

aktueller Fall:

Ich definiere im Template die globalen Variablen

sto#yl -1,07/2 $y_links

sto#yr -#yl.

Im Zuge der Projektbearbeitung möchte ich eine LAR definieren. Also gehe ich in einen entsprechenden älteren Datensatz und hole mir von dort mal fix die entsprechenden Eingabezeilen in's SOFiLOAD:

let#yr 1.85 😆

let#yl -#yr

lar nr 1 grp1 1 grp2 2 grp3 - m #hmin n #hmin t 1 x1 #x1 #yl 0 x2 #x8 #yl 0 x3 #x8 #yr 0 x4 #x1 #yr 0

Da die erneute lokale Definition (let) der Variablen die globale (sto) überschreibt...ist die LAR viel zu breit. 🙄 KONTROLLE, KONTROLLE, KONTROLLE

Ein weitere Fehlerquelle könnte die Verwendung einer veralteten STO - Variable sein. Man kann z.Bsp. sto#var1 definieren (oder aus einem Vorlageprojekt übernehmen) und dann doch die Variable sto#var2 defineren und benutzen.

Im alten Eingabesatz wird aber immernoch #var1 verwendet. Dieses verhindert man dadurch, dass man regelmäßig die Datenbank aufräumt.