Functions und Parameterübergabe

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Werner

Betreff: Functions und Parameterübergabe

BeitragFr, Jul 08, 2011 17:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Zusammen

Probiere gerade wieder zu Programmieren und finde Blitzmax ganz elegant.
Ich hänge nun schon länger mit den Funcions und der Parameterübergabe. Habe mir Beispiele angeschaut, komme aber trotzdem nicht weiter. Will eine Uhr auf dem Bilschirm anzeigen lassen.

Hier ist mein Code:

SuperStrict
Graphics 800,800
Global timer:TTimer=New TTimer

While Not KeyHit( KEY_ESCAPE ) Or AppTerminate()

Cls
DebugStop()

'------ Elemente gerade
SetOrigin 0,0
SetHandle 0,0
SetTransform 0,1,1

'----- Zifferblatt

SetColor 150,150,150
DrawOval 0,0,800,800

'---- Functions

systemtime:Int(sec:Int,minu:Int,std:Int)
sekunde:Int(sec:Int)
minute:Int(minu:Int)
stunde:Int(std:Int)
datum:Int()
ziffern:Int()
mittelpunkt()

Flip
Wend
EndGraphics

Function systemtime:Int(sec:Int,minu:Int,std:Int)
Local time:String=CurrentTime()
Local p1:Int = Instr(time,":")
Local svorne:String = Left$(time, p1-1)
Local p2:Int = Instr(time,":", p1+1)
Local smitte:String = Mid$(time,p1+1,p2-p1-1)
Local shinten:String = Right$(time,Len(time)-p2)
Local std:Int = Int(svorne)
Local minu:Int = Int(smitte)
Local sec:Int = Int(shinten)
Return sec;minu;std
End Function

Function sekunde:Int(sec:Int)
SetColor 0,100,255
SetOrigin 400,400
SetHandle 1,0
SetTransform 180+sec*6,1,1
DrawRect 0,0,2,330
EndFunction

Function minute:Int(minu:Int)
SetColor 0,255,0
SetOrigin 400,400
SetHandle 4,0
SetTransform 180+minu*6,1,1
DrawRect 0,0,8,300
EndFunction

usw........

Ich möcht die Parameter in Systemtime: sec,minu,std an die Funktionen für z.B. sekunde weitergeben.
Wäre über eure Vorschläge sehr erfreut.

Vielleicht hat noch einer ein paar Tips zum Macs!!! z.B. funktioniert das Sample glcube.gmx unter MAXGUI bei mir nicht, obwohl ich maxgui.mod in den Ordner mod unter Blitzmax schon reinkopiert habe?.
Fehlermeldungen:
Can't find interface for module 'maxgui.drivers'
Identifier 'TGadget' not found

Danke für Eure Hilfe..

Xeres

Moderator

BeitragFr, Jul 08, 2011 17:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitte benutze die Code bzw. Syntax Boxen.
Du kannst nicht mehrere Variablen zurückgeben, nur eine und das über eine Zuweisung:
Code: [AUSKLAPPEN]
var = function()

Bei mehreren Variablen kannst du die Variablen Global deklarieren oder Var benutzen:
BlitzMax: [AUSKLAPPEN]
Local x:Int

Print(x)
Foo(x)
Print(x)
End

Function Foo(v:Int Var)
v = 1
End Function

Zu guter Letzt gibt es nette Möglichkeiten, Strings zu verarbeiten, von denen du gebrauch machen solltest:
BlitzMax: [AUSKLAPPEN]
Local time:String[] = CurrentTime().Split(":")

Print("Stunden: " + time[0])
Print("Minuten: " + time[1])
Print("Sekunden: " + time[2])
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Farbfinsternis

BeitragFr, Jul 08, 2011 18:24
Antworten mit Zitat
Benutzer-Profile anzeigen
...oder aber er gibt ein Array zurück.
BlitzMax: [AUSKLAPPEN]
Function machWasTolles:String[](einParameter:Int = 1337)[...]
Farbfinsternis.tv
 

Werner

BeitragFr, Jul 08, 2011 19:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit dem String.Split funktioniert sehr gut.Danke
Habe es mit globalen Variablen zum laufen gebracht. Möchte aber zur Übung die lokalen Parameter übergeben.

Code: [AUSKLAPPEN]
SuperStrict
Graphics 800,800

While Not KeyHit( KEY_ESCAPE ) Or AppTerminate()

     Cls
   'DebugStop()
      
   '------ Elemente gerade
   SetOrigin 0,0
   SetHandle 0,0
   SetTransform 0,1,1
   
   '----- Zifferblatt
   
   SetColor 150,150,150
   DrawOval 0,0,800,800
   
   '---- Functionen
   
   Fsystemtime:Int() <-Habe hier schon alle Varianten versucht. : Missing function parameter 'sekunde'
   Fsekunde:Int(sekunde)
   'Fminute:Int(m)
   'Fstunde:Int(st)
   Fdatum()
   Fziffern()
   Fmittelpunkt()

   Flip
Wend
EndGraphics

Function Fsystemtime:Int(sekunde:Int Var, minute:Int Var, stunde:Int Var)
   Local time:String[] = CurrentTime().Split(":")
   Local svorne:String = (time[0])
   Local smitte:String = (time[1])
   Local shinten:String =  (time[2])
   stunde = Int(svorne)
   minute = Int(smitte)
   sekunde = Int(shinten)
   Return
  End Function

Function Fsekunde:Int()
   'Local sec:Int
   SetColor 0,100,255
   SetOrigin 400,400
   SetHandle 1,0
   SetTransform 180+sec*6,1,1
   DrawRect 0,0,2,330   
EndFunction


Dieses Superstrict ist evtl. noch eine Ursache?

Xeres

Moderator

BeitragFr, Jul 08, 2011 20:05
Antworten mit Zitat
Benutzer-Profile anzeigen
SuperStrict kein Teil des Problems Wink - es sorgt u.a. dafür, das man Variablen deklarieren und Objekte als solche behandeln muss und verbessert die Performance ein Stück.
Wenn du Locale Variablen verwenden willst... deklariere Locale Variablen und übergib sie auch den Funktionen in der richtigen Anzahl.
Zu guter Letzt: Du könntest dir auch den Zwischenschritt sparen, und die Strings gleich zu Int casten:
Code: [AUSKLAPPEN]
stunde = Int(time[0])
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Ana

BeitragFr, Jul 08, 2011 20:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Werner,

also du rufst die Funktion
BlitzMax: [AUSKLAPPEN]
Fsystemtime:Int(sekunde:Int Var, minute:Int Var, stunde:Int Var) 
auf.

Das heißt zwangsläufig das du auch alle diese Parameter übergeben musst. Durch das var kannst du hier auch keine Konstanten also so etwas wie
BlitzMax: [AUSKLAPPEN]
Const wert:Int

oder direkte Zahlen oder Strings verwenden, da var die Referenz der Variable übergibt, sprich nicht den Wert sondern die Speicheradresse auf deinem Hauptspeicher.

Fülle mal deine Funktion mit Variablen.

Des weitern bedeutet das :Int hinter dem Funktionsnamen beim deklarieren, das du deine Funktion einen Int Wert zurückgeben lassen möchtest. Das solltest du nur nutzen wenn du das tatsächlich auch tust, sonst mag es dein Compiler völlig zu recht nicht.

Bei BlitzMax: [AUSKLAPPEN]
Fsekunde:Int(sekunde) 
übergibst du eine Variable, die du vorher nicht deklariert hast, was mit superstrict nicht erlaubt ist, da muss jede Variable vor dem ersten mal nuten mit local/Global Name:Typ vorgestellt werden.

So wäre es beispielsweise compilierbar, wenn es glaube ich auch nicht genau das macht was es sollte.
BlitzMax: [AUSKLAPPEN]
SuperStrict
Graphics 800,800

Local x:Int = 12,y:Int = 4,z:Int=30

While Not KeyHit( KEY_ESCAPE ) Or AppTerminate()

Cls
'DebugStop()

'------ Elemente gerade
SetOrigin 0,0
SetHandle 0,0
SetTransform 0,1,1

'----- Zifferblatt

SetColor 150,150,150
DrawOval 0,0,800,800

'---- Functionen

Fsystemtime:Int(x,y,z) '<-Habe hier schon alle Varianten versucht. : Missing Function parameter 'sekunde'
Fsekunde:Int()
'Fminute:Int(m)
'Fstunde:Int(st)

Flip
Wend
EndGraphics

Function Fsystemtime(sekunde:Int Var, minute:Int Var, stunde:Int Var)
Local time:String[] = CurrentTime().Split(":")
Local svorne:String = (time[0])
Local smitte:String = (time[1])
Local shinten:String = (time[2])
stunde = Int(svorne)
minute = Int(smitte)
sekunde = Int(shinten)
Return
End Function

Function Fsekunde()
Local sec:Int
SetColor 0,100,255
SetOrigin 400,400
SetHandle 1,0
SetTransform 180+sec*6,1,1
DrawRect 0,0,2,330
EndFunction



Liebe Grüße Diana
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine
 

Werner

BeitragSa, Jul 09, 2011 0:19
Antworten mit Zitat
Benutzer-Profile anzeigen
So funktionierts endlich. Das war jetzt fast eine Geburt.

Code: [AUSKLAPPEN]

SuperStrict
Graphics 800,800
Local se:Int, mi:Int, st:Int
While Not KeyHit( KEY_ESCAPE ) Or AppTerminate()

     Cls
   'DebugStop()
   Fgeraderichten()
   Fzifferblatt()
   Fziffern()
   Fsystemtime:Int(se,mi,st)
   Fsekunde:Int(se:Int)
   Fminute:Int(mi:Int)
   Fstunde:Int(st:Int)
   Fdatum()
   Fmittelpunkt()
      
   Flip
Wend
EndGraphics

Function Fsystemtime:Int(sek:Int Var, minu:Int Var, std:Int Var)
   Local time:String[] = CurrentTime().Split(":")
   sek=Int(time[2])
   minu=Int(time[1])
   std=Int(time[0])
   'Print "Sekunde"+std+":"+minu+":"+sek
End Function

Function Fsekunde:Int(se:Int)
   SetColor 0,100,255
   SetOrigin 400,400
   SetHandle 1,0
   SetTransform 180+se*6,1,1
   DrawRect 0,0,2,330   
EndFunction


Danke für eure Tips Very Happy bis bald

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group