Online Compiler / Live code

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Online Compiler / Live code

Beitrag von STARGÅTE »

SIRprise hat geschrieben: 20.10.2021 01:47 Hmm, irgendwie mag mich PB wohl nicht mehr... es liefert nur noch Speicherfehler - vorhin gings aber noch.
Das bezweifel ich, also das es ging.
Eine DLL ist eine eigenständige Umgebung. Alle Objekte die in der Main-Application definiert wurden, wie in deinem Fall Sprite-Nummer 0 sind in der DLL überhaupt nicht bekannt. Selbes gilt aus andersrum. Das ging übrigens noch nie.
Das Sprite muss also auch in der DLL geladen werden wenn es in dieser dargestellt werden soll. Ach ja, dann muss natürlich auch der Screen in der DLL erstellt werden usw.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
SIRprise
Beiträge: 24
Registriert: 19.03.2016 20:29

Re: Online Compiler / Live code

Beitrag von SIRprise »

Darum habe ich kurz vor deinem Post meinen Post geedited... Das mit dem Sprite dachte ich auch, es kam aber zumindest kein Speicherfehler. Der Speicherfehler kam vorher und auch wenn man es die Display-Funktion in der DLL auskommentiert. Die Idee war dann ohnehin, das Sprite erst in der DLL zu generieren bzw. die Adresse im Parameter mitzugeben. Das Beispiel hätte zunächst aber dieses eine Sprite an zufällige Stellen platzieren sollen.
Vermutlich ist gerade nocj
Ich befürchte ich übersehe einfach etwas und mache einen Anfängerfehler, weil ich PB so lange nicht mehr nutzte.
Benutzeravatar
TroaX
Beiträge: 659
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: Online Compiler / Live code

Beitrag von TroaX »

Ein Live Code-Editor ist immer eine interessante Sache. Aber zumindest mit PB nicht wirklich umsetzbar. In Onlinecompilern habe ich nie wirklich einen großen Sinn gesehen. Gerade bei einer Sprache, die trotz der plattformübergreifenden Möglichkeiten einige Defizite zwischen den Betriebssystemen aufweist, taugt ein Online-Compiler nicht wirklich etwas. Zum einen muss auf dem Server die Möglichkeit gegeben werden, die Anwendung zu testen, was auf Grund des nativen Charakters sinnvoll und zuverlässig nur mit Virtualisierung und Remotezugriff funktioniert. Desweiteren müsste man den Compiler für alle Systeme anbieten können (was für die Infrastruktur schon erheblichen Aufwand bedeutet) und zuletzt würde ein Cross-Plattform-Compiling nur funktionieren, wenn die ersten 2 Eigenschaften gegeben sind. Ansonsten kann man vor allem größere Projekte überhaupt nicht vernünftig und zuverlässig testen.

Buildsysteme wie für Cordova/Phonegab oder Python sind da etwas anderes, da die Grundlage immer die selbe Laufzeitumgebung ist. Auch Java wäre möglich. Aber so etwas wie PB? Da lohnt der Kosten/Nutzenfaktor einfach nicht.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
SIRprise
Beiträge: 24
Registriert: 19.03.2016 20:29

Re: Online Compiler / Live code

Beitrag von SIRprise »

TroaX hat geschrieben: 20.10.2021 12:32 Zum einen muss auf dem Server die Möglichkeit gegeben werden, die Anwendung zu testen, was auf Grund des nativen Charakters sinnvoll und zuverlässig nur mit Virtualisierung und Remotezugriff funktioniert. Desweiteren müsste man den Compiler für alle Systeme anbieten können (was für die Infrastruktur schon erheblichen Aufwand bedeutet) und zuletzt würde ein Cross-Plattform-Compiling nur funktionieren, wenn die ersten 2 Eigenschaften gegeben sind. Ansonsten kann man vor allem größere Projekte überhaupt nicht vernünftig und zuverlässig testen.
Ok, das stimmt: Ein Remote-Deploy und vor allem Remote-Debugger gibts wohl nicht. Bliebe also eine Art Build/Test-Service, also CI quasi.
Bei dem Cross-Plattform-Compiling sah ich nun nicht so das Problem in Zeiten von VMs. Ich denke aber der CLI Compiler wird sowohl in Form des Linux Compilers auf Windows (WSL2) und Windows Compiler auf Linux (Wine) laufen. Mac weiß ich jetzt nicht.
Benutzeravatar
TroaX
Beiträge: 659
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: Online Compiler / Live code

Beitrag von TroaX »

SIRprise hat geschrieben: 20.10.2021 13:35Bei dem Cross-Plattform-Compiling sah ich nun nicht so das Problem in Zeiten von VMs.
Die technische Möglichkeit ist nicht gleichzusetzen mit der wirtschaftlichen Sinnhaftigkeit. Gerade im Bezug auf Aufbau und Unterhaltung die dafür notwendigen Systeme und Infrastruktur. Und wie gesagt. Während bei Python, JS und co. der Code in der Regel auf allen System genau das gleiche tut, ist dies bei PB nicht gegeben. Was bringt einem da die Möglichkeit, eine Anwendung für Mac kompilieren zu können, wenn man das Ergebnis selbst nicht auf einem Mac testen kann?
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
SIRprise
Beiträge: 24
Registriert: 19.03.2016 20:29

Re: Online Compiler / Live code

Beitrag von SIRprise »

So...nachdem ich mich nun lange mit irgendwelchen Bugs beim DLL-Call (Speicherfehler) und mit RunProgramm (Parameter wurden nicht durchgereicht - beides untersuche ich noch weiter...in den kleinen Beispielen die ich euch posten wollte, geht es nämlich...) verbracht habe...
Hier eine (noch etwas schäbige) Lösung für sowas wie "Live code"... mit compile-batch-skript und erstmal auf Konsole.
Ist beides sicherlich nicht der große Wurf, aber man bekommt eine Idee davon. Wenn die andern Probleme gelöst sind, dann lässt es sich auch von der Performance noch deutlich optimieren - allein schon wegen der Synchronisation, wann die DLL gerade locked ist, aber auch weil man dann nur noch recompiled, wenn der Source verändert wurde...

recompileDLL.bat

Code: Alles auswählen

@echo off
:compile
"%ProgramFiles%\PureBasic\Compilers\pbcompiler.exe" test.pb /EXE test.dll /DLL
timeout 1
goto compile
ContainerApp.pb (die Exe sollte im gleichen Ordner liegen wie die DLL)

Code: Alles auswählen

;Global *MemoryAdr = AllocateMemory(5000) ;just for testing
;-----------------------------------
Structure StructuredMemoryType
  ;control area
  SignalToDLL.i
  SignalFromDLL.i
  ;user data
  DataContainer.i[1000]
EndStructure

;Static *GlobalStructure.StructuredMemoryType
Global *GlobalStructure.StructuredMemoryType
*GlobalStructure = AllocateStructure(StructuredMemoryType) ; oder *GlobalStructure = AllocateMemory(SizeOf(StructuredMemoryType))
;------------------------------------
*GlobalStructure\SignalToDLL = 55
*GlobalStructure\Datacontainer[0] = 25 ;just for testing
*GlobalStructure\Datacontainer[999] = 42 ;just for testing

If OpenConsole("Live Coding and Loading") And (*GlobalStructure <> 0)
  EnableGraphicalConsole(1)
  Repeat
    ClearConsole()
    If OpenLibrary(0, "test.dll") <> 0      
      CallFunction(0,"Experiment",*GlobalStructure)      
      CloseLibrary(0)
      Delay(100) ;temporary here because of blocked file-handle
    Else
      ConsoleLocate(1, 24)
      Print("DLL could not be loaded")
    EndIf
    Debug("execution time of pure user code: " + Str(*GlobalStructure\SignalFromDLL) + "ms")
  Until Inkey() = Chr(27); Esc  
  FreeStructure(*GlobalStructure)
Else
  MessageRequester("Error", "Can't open Console or can't allocate Memory", #PB_MessageRequester_Ok | #PB_MessageRequester_Error)
  End
EndIf

End


; IDE Options = PureBasic 5.71 LTS (Windows - x64)
; CompileSourceDirectory
test.pb (test.dll - da wird Live dran gearbeitet - momentan noch ohne jegliches ErrorHandling. Falls jemand weiß, wie man die etwas sperrigen Struct-Bezeichner auf kleine innere Variablen umbiegt (den Pointer darauf kopiert, siehe comments im Code), dann bin ich sehr dankbar)

Code: Alles auswählen

Structure StructuredMemoryType
  ;control area
  SignalToDLL.i
  SignalFromDLL.i
  ;user data
  DataContainer.i[1000]
EndStructure

ProcedureDLL Experiment(*GlobalStructure)
  StartTime.q = ElapsedMilliseconds() 
  *myMemory.StructuredMemoryType
  *myMemory = *GlobalStructure
  If OpenConsole("Live Coding and Loading")
    EnableGraphicalConsole(1)
    ;user code----------
    
    ;     x.i
    ;     y.i
    ;     *x = @*myMemory\DataContainer[1]
    ;     *y = @*myMemory\DataContainer[2]
    
    
    ;Speed/Direction init
    If *myMemory\DataContainer[3] = 0
      ;seems to be the first start -> init speed and start position
      *myMemory\DataContainer[3] = 1
      *myMemory\DataContainer[4] = 1
      *myMemory\DataContainer[1] = 5
      *myMemory\DataContainer[2] = 5
    EndIf  
    ;Direction changing
    If (*myMemory\DataContainer[1] > 40) Or (*myMemory\DataContainer[1] < 2)
      *myMemory\DataContainer[3] = -*myMemory\DataContainer[3]
    EndIf
    If (*myMemory\DataContainer[2] > 25) Or (*myMemory\DataContainer[2] < 2)
      *myMemory\DataContainer[4] = -*myMemory\DataContainer[4]
    EndIf
    ;Set new position
    *myMemory\DataContainer[1] = *myMemory\DataContainer[1] + *myMemory\DataContainer[3] ;yep, thers a shorter way to write...
    *myMemory\DataContainer[2] = *myMemory\DataContainer[2] + *myMemory\DataContainer[4]


    ;print position
    ConsoleLocate(0, 0)
    Print("("+Str(*myMemory\DataContainer[1])+","+Str(*myMemory\DataContainer[2])+")")
    ;print 'ball'
    ConsoleLocate(*myMemory\DataContainer[1], *myMemory\DataContainer[2])
    Print("*")
    ;user code----------
    *myMemory\SignalFromDLL = ElapsedMilliseconds() - StartTime 
    ;Debug(x)
    ;Debug(y)
    ;CallDebugger
    ConsoleLocate(0, 24)
    Print("press esc to close")
    ;Delay(100)
  EndIf  
EndProcedure
; IDE Options = PureBasic 5.71 LTS (Windows - x64)
; CompileSourceDirectory
Falls sich jemand an der Bugsuche beteiligen möchte, so sind hier 2 weitere Codes:

Snippet zum Recompile:

Code: Alles auswählen

Procedure ReCompile()
  ;CompilerPath$ = #PB_Compiler_Home+"/Compilers/pbcompiler.exe"
  CompilerPath$ = GetPathPart(ProgramFilename())+"parameterChecker.exe"
  SourcePath$ = GetPathPart(ProgramFilename())+"test.pb"
  DLLPath$ = GetPathPart(ProgramFilename())+"test.dll"
  ;/EXE = "output"
  ; -> pbcompiler source.pb /EXE test.dll /DLL
  CompilerParamLine$ = ~"\"" + SourcePath$ + ~"\"" + "/EXE" + ~"\"" + DLLPath$ + ~"\"" + " /DLL"
  ;CompilerParamLine$ = "/DLL test.pb"
  Compiler = RunProgram(CompilerPath$, CompilerCmdLine$, GetPathPart(ProgramFilename()) ,#PB_Program_Open); | #PB_Program_Read)
  Output$ = ""
  If Compiler <> 0
    ;WaitProgram(Compiler,10000)
    While ProgramRunning(Compiler) <> 0
      If AvailableProgramOutput(Compiler)
        Output$ + ReadProgramString(Compiler) + Chr(13)
      EndIf
    Wend
    Output$ + Chr(13) + Chr(13)
    Output$ + "Exitcode: " + Str(ProgramExitCode(Compiler))
    Debug(Output$)
    
    CloseProgram(Compiler) ; Schließt die Verbindung zum Programm
  Else
    Debug("Error RunRpogram")
  EndIf
  ProcedureReturn 0
EndProcedure
Der parameterChecker der im Code aufgerufen wird ist hier und gibt einfach nur die empfangenen Parameter aus:

Code: Alles auswählen

;ParamChecker for RunProgram-Debugging...
OpenConsole()
NumberOfParameters = CountProgramParameters()
PrintN("Parameter-Checker")
PrintN("---------------------------------")
PrintN("Program was started with " + Str(NumberOfParameters) + " parameters:")
For i=1 To NumberOfParameters
  PrintN(ProgramParameter())
Next i
PrintN("")
PrintN("Enter Exitcode or press Enter to close")
ExitStr$ = Input()
ExitCode = 0
If ExitStr$ <> ""
  ExitCode=Int(Val(ExitStr$))
EndIf  

PrintN("Exiting with Code " + Str(ExitCode))
End ExitCode
; IDE Options = PureBasic 5.71 LTS (Windows - x64)
; CursorPosition = 9
; EnableXP
; Executable = parameterChecker.exe
; CompileSourceDirectory
Es ist auch noch etwas da fürs OnError Errorhandling, das war aber auch mehr ein dirty hack und macht den Code nur unsauberer, darum ist der Fokus erst einmal auf die andern Fehler.
Antworten