Seite 1 von 1
Problem mit Console und PrintN()
Verfasst: 22.09.2004 19:50
von blbltheworm
Hallo zusammen,
ich hab ein kleines Programm mit der PureBasic Demo geschrieben.
Dieses Programm soll alle Primzahlen zwischen 0 und einem bestimmten Wert errechnen.
Das macht er dann auch, aber bei der Ausgabe der Zahlen stoße ich auf ein Problem.
Ich Schreib alle Zahlen in eine Liste und möchte diese mit folgendem Code dann auf den Bildschirm bringen:
Code: Alles auswählen
ResetList(Prims())
j=0
ClearConsole()
PrintN("Alle Primzahlen von 0 bis " + Str(Upper) + ":")
PrintN("2")
Repeat
NextElement(Prims())
PrintN(Str(Prims()))
j=j+1
Until j= CountList(Prims())
Wenn ich das jedoch mache, dann kann ich in der Console nicht hochscrollen, sondern nur runter.
Das heißt, dass ich gar nicht alle Primzahlen einsehen kann, sondern nur die letzten 20, oder so.
Kann mir wer sagen, wie ich es hinbekomme, dass der User nacher durch die Zahlen scrollen kann??
Verfasst: 22.09.2004 20:05
von wichtel
Nur über API calls.
Da hatte ich mal was im alten Forum.
Code: Alles auswählen
Global stdout.l, stdin.l, nl$
nl$=Chr(13)+Chr(10)
Procedure myPrintN(text$)
text$+nl$
size.l=Len(text$)
bWritten.l
writeconsole_(stdout,@text$,size, @bWritten, #Null)
EndProcedure
Procedure myPrint(text$)
size.l=Len(text$)
bWritten.l
writeconsole_(stdout,@text$,size, @bWritten, #Null)
EndProcedure
Procedure.s myInkey() ; geht nur richtig wenn SetConsoleMode benutzt wurde
input$=Space(256)
size.l=1
bRead.l
readconsole_(stdin,@input$,size, @bRead, #Null)
ProcedureReturn input$
EndProcedure
allocconsole_()
stdout=GetStdHandle_(#STD_OUTPUT_HANDLE)
stdin=GetStdHandle_(#STD_INPUT_HANDLE)
oldmode.l
GetConsoleMode_(stdin,@oldmode) ; alten mode merken
SetConsoleMode_(stdin,oldmode | #ENABLE_PROCESSED_INPUT) ; neuen mode setzen, damit readconsole wie Inkey arbeitet
For i=1 To 100
myPrintN("Hallo "+Str(i))
Next i
Repeat
a$=myInkey()
Until a$<>""
SetConsoleMode_(stdin,oldmode) ; neuen mode setzen, damit readconsole wie Inkey arbeitet
freeconsole_()
Verfasst: 22.09.2004 20:07
von NicTheQuick
Das geht nicht.
Öffne dazu ein Fenster und bspw. ein [c]ListViewGadget()[/c] und schreibe die Zahlen dort rein.
Aber noch was anderes. Diese Schleife
Code: Alles auswählen
Repeat
NextElement(Prims())
PrintN(Str(Prims()))
j=j+1
Until j= CountList(Prims())
ist ultralangsam.
Du musst wissen, dass [c]CountList()[/c] zum Zählen der Listenelemente jedesmal alle Listenelemente durchzählt, was bei einer hohen Anzahl an Elementen schnell auffällt.
Hast du also 100 Elemente, machst du insgesamt 100 * 100 = 10.000 Durchläufe durch die Liste.
Benutze also lieber die Schleife aus der Hilfe oder eine der folgenden:
Code: Alles auswählen
ResetList(Prims())
While NextElement(Prims())
PrintN(Str(Prims()))
Wend
Oder:
Letztere Methode ist am einfachsten.
///Edit:
@Wichtel: Klar, mit API gehts, aber nicht mit der Demo.
Verfasst: 22.09.2004 20:17
von Franky
Äh, Wichtel, Apis mit der Demo?

Verfasst: 22.09.2004 20:27
von wichtel
Ömpf...
Man sollte lesen.
Aber warum DEMO, das Geld ist gut investiert <grins><Kopf rett>
Verfasst: 22.09.2004 23:11
von blbltheworm
Danke für den Tipp im Bezug auf CountList(), das hat spürbar was gebracht.
Eine Frage, befindet sich hier jemand im Forum, der abwiegen kann, wo die Vor/Nachteile zwischen Pure, Power und Visual Basic liegen??
Oder sind hier alle voreingenommen??
Verfasst: 23.09.2004 02:03
von redacid
blbltheworm hat geschrieben:Oder sind hier alle voreingenommen??
...natürlich sind hier (fast) alle voreingenommen...

Aber warte es ab, es kommen sicherlich noch einige wirklich gute Antworten.
Ich persönlich habe nur kurz mit VB "gespielt" und es nie wirklich erlernt. Somit kann ich dazu eigentlich nicht viel sagen. Was mir da missfällt ist die Tatsache, dass immer diese Runtime-DLLs vorhanden/mitgeliefert sein müssen und auch dewegen die Programme im Vergleich zu PureBasic-Executables einfach riesig sind. Bei 200 GB-Festplatten heutzutage mag dies zu verschmerzen sein, aber ich finde es doch schöner, wenn alles kompakt ist.
PowerBasic habe ich nie benutzt.
Verfasst: 23.09.2004 02:08
von Falko
Unterschiede gibt es bei jeder Programmiersprache.
Als erstes wäre schon mal der preisliche Unterschied incl.
weiterer Updates.
Ich selbst habe noch GFABasic-GB32 (16 u. 32 Bit-Version), GFADOS,
Powerbasic DOS 3.5, und von Powerbasic DLL-COMPILER.
Als ich mir damals wegen dem Untergang von GFA-Basic bei Conradelektronik mal die Purebasic (TOPO-Version) zum Testen gekauft hatte, merkte ich doch sehr schnell wie leicht man damit Progs erstellen konnte und das, was es gegenüber GFA oder auch VBasic hervorhebt, sind die kleinen fertigen EXE-Programme. Man kann zwar jetzt nicht groß Vergleiche ziehen, aber es läßt sich fast alles damit programmieren, was sonst auch ein teuerer Compiler kann.
Ich kann nicht darüber klagen und warte gespannt auf das nächste
Update.
Wenn man dann noch die Vollversion besitzt, dann weiß man schon
einen sehr großen Unterschied gegenüber der Demoversion von PB.
MfG Falko
Verfasst: 23.09.2004 08:55
von wichtel
@blbltheworm:
voreingenommen oder einfach überzeugt?
Es kommt darauf an was du vor hast. Wenn du schnell und einfach kleine Programme bauen willst die viel hermachen kommst du an PB nicht vorbei.
Wenn die Wert darauf legst Schnittstellen zu allen OfficeProdukten eingebaut zu haben, dann eher VB. Nur in VB tippst du eine Seite um ein Fenster zu öffnen und dein Programm braucht hinterher noch runtime libs.
Mit PB machen 30 Zeilen bereits ein nettes GUI und es kommt eine sehr klein exe heraus.
Ich habe in der Steinzeit mit Omikron Basic auf dem Atari 1040STF gabastelt. Dazwischen mal mit TurboPascal auf dem 286er. In PB fühlte ich mich dann sofort wie zu Hause.