Wenn man den Typ auf denselben stellt wie im Array geht es natürlich. Hatte das .b ganz überlesen (weil es bisher auch ging...). Das .b stammt noch aus ner Zeit, als ich der Meinung war "von -100 bis 100 reicht!"....
Und ich muß mal wieder feststellen, daß das unter TP nicht vorgekommen wäre, da er das als Typenverletzung erkannt hätte!
Ich frage mich nur, warum es unter 3.94 lief (siehe letzer Code-Teil im letzten Post von mir...).
Wenn man den Return Typ auf denselben Typ stellt wie im Array, funktioniert es natürlich auch in PB4. Aber warum tritt die Typenverletzung erst da (PB4) als Fehler auf?
Naja, Hauptsache funzt wieder....
Da ist eine Sprungmarke zu der Variable, die man ändern muß, damit in der .b-Variante der Fehler auftritt... (hier korrigiert...)
Code: Alles auswählen
;- Grundlegende Variablen für das Fenster unten; Ein/Aus-Variablen u.a.
; Abbruch=0; unbenutzt=-9999 und sowas...
unbenutzt=-9999
Errorname.s=ProgramFilename()
If Errorname<>""
Errorname=Left(Errorname,Len(Errorname)-4)
For a=1 To Len(Errorname)
If a=1
temp.s=UCase(Mid(Errorname,a,1))
Else
temp.s+LCase(Mid(Errorname,a,1))
EndIf
Next a
EndIf
Errorname=temp.s
Errorname+"_error"
If CreateFile(0,Errorname.s+".txt")
Error=1
WriteStringN(0,"Error.txt Datei erfolgreich erstellt! (wenn nicht, läsen Sie das hier jetzt nicht...)")
EndIf
If InitSprite()=0
MessageRequester("Fehler","Sprite Engine konnte nicht initialisiert werden!",0)
If Error
WriteStringN(0,"Sprite Engine Start fehlgeschlagen!")
EndIf
End
EndIf
If InitKeyboard()=0
MessageRequester("Fehler","Keyboard konnte nicht initialisiert werden!",0)
If Error
WriteStringN(0,"Keyboard Start fehlgeschlagen!")
EndIf
End
EndIf
If InitSprite3D()=0
MessageRequester("Fehler","Sprite 3D Engine konnte nicht initialisiert werden!",0)
If Error
WriteStringN(0,"Sprite 3D Engine Start fehlgeschlagen!")
EndIf
End
EndIf
If InitMouse()=0
MessageRequester("Fehler","Mouse lib konnte nicht initialisiert werden!",0)
If Error
WriteStringN(0,"Mouse lib Start fehlgeschlagen!")
EndIf
End
EndIf
Verstecken=0
Autostretch=1
Zeigen=1
Abbruch=0
Global WindowWidth
Global WindowHeight
WindowWidth=800
WindowHeight=600-20
Options=#PB_Window_MinimizeGadget
Procedure Pset(a,b,c)
If (a>=0)
If (a<WindowWidth)
If (b>=0)
If (b<WindowHeight)
Plot(a,b,c)
EndIf
EndIf
EndIf
EndIf
EndProcedure
;- die Procedure für die FPS-Anzeige
Global Bremsen
Global Wartezeit
Global WunschFPS
Global Blinken
Global Analysieren
Procedure GetFPS()
Static GetFPS_Count,GetFPS_FPS,GetFPS_Start,BlaCount
GetFPS_Count+1
If GetTickCount_()-GetFPS_Start>=1000
Blinken=1-Blinken
GetFPS_FPS=GetFPS_Count
GetFPS_Count=0
Analysieren=1
GetFPS_Start=GetTickCount_();+1000 ; neu ermitteln besser! Ansonsten geht man davon aus daß zwischen Abfrage und hier keine Zeit vergeht!
Else
If Bremsen=1
Repeat
GetFPS_Count+1
Until GetTickCount_()-GetFPS_Start>=Wartezeit
BlaCount+1
If BlaCount>=WunschFPS
Blinken=1-Blinken
Analysieren=1
BlaCount=0
EndIf
GetFPS_FPS=WunschFPS ; Wir gehen mal davon aus, daß er das
GetFPS_Count=WunschFPS ; Richtige tut, da das Messen nicht mehr funktioniert...
GetFPS_Start=GetTickCount_()
EndIf
EndIf
ProcedureReturn GetFPS_FPS
EndProcedure
Global cSinCosFaktor
;- Fehler tritt auf, wenn man hier 300 statt 100 eingibt:
cSinCosFaktor=300
Global Dim Sinustabelle.w(360)
f.f=(3.141593/180)
For a=0 To 359
Sinustabelle(a)=Round(Sin(a*f.f)*cSinCosFaktor,0)
Next
Procedure.b NSin(Grad)
;Shared Sinustabelle
While Grad>=360
Grad-360
Wend
While Grad<0
Grad+360
Wend
ProcedureReturn Sinustabelle(Grad)
EndProcedure
Procedure.b NCos(Grad)
;Shared Sinustabelle
ProcedureReturn NSin(Grad+90)
EndProcedure
;- Hauptprogramm
If OpenWindow(0,0,0,WindowWidth,WindowHeight,"Programm",Options)
If OpenWindowedScreen(WindowID(0),0,0,WindowWidth,WindowHeight,Autostretch,0,0)
ShowWindow_(WindowID(0),#SW_MAXIMIZE) ;- Bild maximieren!
Repeat
;- Grundlegende Inputs u.a.
FlipBuffers()
ClearScreen(RGB(0,0,0))
ExamineKeyboard()
gedruecktesZeichen.s=KeyboardInkey()
x=WindowMouseX(0)
y=WindowMouseY(0)
Event=WindowEvent()
If Event
Select Event
Case 513 : Button1=1
Case 514 : Button1=0
Case 516 : Button2=1
Case 517 : Button2=0
Case 519 : Button3=1 ;: Button1=1 : Button2=1
Case 520 : Button3=0
;Case #PB_Event_Gadget
;Select EventGadgetID()
;EndSelect
EndSelect
Else
Delay(1)
EndIf
;- Abfrage zum Verstecken des Cursors, falls im Zeichenbereich
; (benutzt die Variable "Verstecken" aus "InitsUndVars")
If Verstecken=1
If (x<>-1) And (y<>-1)
If (x>-1) And (y>-1) And (x+ScreenX<WindowWidth(0)-RightOffset) And (y+ScreenY<WindowHeight(0)-BottomOffset)
If Zeigen=1
ShowCursor_(0)
Zeigen=0
EndIf
Else
If Zeigen=0
Zeigen=1
ShowCursor_(1)
EndIf
EndIf
Else
If Zeigen=0
Zeigen=1
ShowCursor_(1)
EndIf
EndIf
EndIf
If (button1=1) Or (button2=1)
MouseDeltaX=x-letztesx
MouseDeltaY=y-letztesy
letztesx=x
letztesy=y
If button2=1
Dreh+MouseDeltaX
Dreh2-MouseDeltaY
EndIf
If 0=1
If dreh2<0 : dreh2=0 : EndIf
If dreh2>90 : dreh2=90 : EndIf
EndIf
Else
MouseDeltaX=x-letztesx
MouseDeltaY=y-letztesy
letztesx=x
letztesy=y
EndIf
obenx=(NSin(Dreh)*NCos(Dreh2))/cSinCosFaktor
obeny=NSin(Dreh2)
obenz=(NCos(Dreh)*NCos(Dreh2))/cSinCosFaktor
seitex=NCos(Dreh)
seitey=0
seitez=-NSin(Dreh)
vornex=-(NSin(Dreh)*NSin(Dreh2))/cSinCosFaktor
vorney=NCos(Dreh2)
vornez=-(NCos(Dreh)*NSin(Dreh2))/cSinCosFaktor
;- StartDrawing
StartDrawing(ScreenOutput())
FrontColor(RGB(255,255,255))
BackColor(RGB(0,0,0))
DrawingMode(1)
DrawText(0,0,Str(Dreh))
DrawText(0,20,Str(nsin(Dreh)))
DrawText(0,40,Str(ncos(Dreh)))
For a=0 To 360
PSet(a,300-NSin(a),RGB(0,255,0))
PSet(a,300-NCos(a),RGB(255,0,0))
Next a
LineXY(100,500,100+vornex,500+vornez,RGB(0,0,255))
LineXY(100,500,100+seitex,500+seitez,RGB(255,0,0))
LineXY(100,500,100+obenx,500+obenz,RGB(0,255,0))
DrawText(0,400,"Oben")
LineXY(400,500,400+vornex,500-vorney,RGB(0,0,255))
LineXY(400,500,400+seitex,500-seitey,RGB(255,0,0))
LineXY(400,500,400+obenx,500-obeny,RGB(0,255,0))
DrawText(300,400,"Von Vorne")
LineXY(700,500,700-vornez,500-vorney,RGB(0,0,255))
LineXY(700,500,700-seitez,500-seitey,RGB(255,0,0))
LineXY(700,500,700-obenz,500-obeny,RGB(0,255,0))
DrawText(700,400,"Rechte Seite")
DrawText(750,0,Str(GetFPS()))
StopDrawing()
If KeyboardPushed(#PB_Key_Escape) :Abbruch=1 : EndIf
Until (Event=#PB_Event_CloseWindow) Or (Abbruch=1) ; Nur Abbruch=1! ; Close Window per Sicher?-Abfrage absichern!
Else
MessageRequester("Fehler","Windowed Screen konnte nicht initialisiert werden!",0)
End
EndIf
Else
MessageRequester("Fehler","Window konnte nicht initialisiert werden!",0)
End
EndIf
End
Danke nochmal! Manchmal braucht man einfach einen 2ten der es liest, weil man genau "weiß" 'ich habe in Zeile X habe ich das letzte mal was verändert; jetzt taucht ein Fehler auf, also muß er in Zeile x sein....' und nicht an näherliegendes Sachen denkt!