|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 29.04.2006, 23:58 Titel: Arbeitserleichterung: CommonStatements.bi |
|
|
Bestimmte Aufgaben häufen sich beim Programmieren. Immer wieder muss man Zeilen wie "DIM AS INTEGER" eingeben. Und bei diesen immerhin 14 Zeichen kann man sich leicht mal vertippen. Wäre doch praktisch, wenn die häufigsten aufgaben ein bisschen schneller eintippbar wären, oder?
Oder, denkt mal an die Farben! Wer weiß denn schon wirklich auswendig, was in einem 8bpp-Modus Farbe 40 ist? Sicher, wenn man sich ein bisschen öfter damit beschäftigt, kann man wissen, dass das rot ist, aber i.d.R. muss man solche Dinge doch aus Tabellen nachsehen, nicht wahr?
However, ich hab mir mal die Mühe gemacht, und einige dieser "Programmier-Bremsen" zusammengefasst.
Ergebnis sind diese Beiden BI's hier:
http://nopaste.freebasic.de/index.php?view=334
http://nopaste.freebasic.de/index.php?view=333
(Die erste Datei ist die Basis, von ihr wird die zweite eingebunden)
Details:
CommonStatements.bi enthält folgende Segmente:
Shortwords
Wie oben beschrieben, dieses Segment enthält Kurzwörter für verschiedene Bereiche.
Als da wären...
As Datentyp: z.B. "AInt" statt "As Integer"
Dim As Datentyp: z.B. "DInt" statt "Dim As Integer"
Dim Shared As Datentyp: z.B. "DSInt" statt "Dim Shared As Integer"
Block Statements: z.B. "SelC" statt "Select Case"
...
Konstanten
Eine Reihe nützlicher Zahlenwerte
Als da wären
Farben: Für 4, 8 und 32bpp, so etwa CL32_Red und CL8_Red
Screenmodi: z.B. Scr320x240 für 14
Misc: pi, true und false
Makros
Ein paar kleine Makros, die nützlich werden können
Als da wären:
Kommastellen: Makros zum festlegen, wie viele Nachkommastellen verwendet werden dürfen
Winkel: Umrechnung von Deg nach Gra
Routinen
Ein paar immer wieder gebrauchte Funktionen.
Als da wären:
FileExists
verchiedene Varianten zum Runden von Zahlen
CopyMem (kopiert eine bestimmte Anzahl Bytes von A nach B)
...
Includes
Besonders wichtige .bi's werden sofort eingebunden
...
GfxString.bi enthält eine reihe an Prozeduren, die eine noch komfortablere Textein/ausgabe ermöglichen, als das mit FB-Boardmitteln alleine schon möglich ist.
Folgende Routinen sind enthalten:
DrawStringX (bzw. Kurzwort DWX)
Ausgabe eines Textes mit DRAW STRING, Zeilenumbruch über CHR(13), Möglichkeit, den Text Fett und/oder unterstrichen auszugeben
GfxInp (bzw. Kurzwort DWI)
Ersetzt das Textmodus-INPUT durch eine DWX-basierende Variante. Zusätzlich kann angegeben werden, wie viele Zeichen maximal eingegeben werden dürfen, wie viele Zeichen gleichzeitig sichtbar sein sollen, ein Cursor wird angeboten, fettdruck und unterstreichen sind möglich, ...
GetTextWidth
Berechnet die Breite eines Textes bei gegebener Font (bzw für die FB-Standardfont) unter Berücksichtigung der Zeilenumbrüche
GetTextHeight
Berechnet die Höhe eines Textes bei gegebener Font (bzw für die FB-Standardfont) unter Berücksichtigung der Zeilenumbrüche
GetLineCount
Gibt zurück, wie viele Zeilen ein Text hat
GetTextLine
Gibt eine bestimmte Zeile eines Textes zurück.
Diese Sammlung ist natürlich nur ein Anfang, und ich würde mich freuen, hier demnächst von Erweiterungen zu lesen.
Da das ganze ja im FBNP liegt, hat jeder Zugriff darauf. Download, Change, and have fun!
Have a nice day
Caio
Dusky_Joe _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 30.04.2006, 11:59 Titel: |
|
|
Hi,
CopyMem mit Turbolader...
Code: | Sub CopyMem (Byval Ziel AAnyPtr, Byval Quelle AAnyPtr, Byval Bytes AInt)
Asm
mov edi, dword Ptr [Ziel]
mov esi, dword Ptr [Quelle]
mov ecx, dword Ptr [Bytes]
shr ecx, 1
jnc CopyMem_word
movsb
CopyMem_word:
shr ecx, 1
jnc CopyMem_dword
movsw
CopyMem_dword:
shr ecx, 1
jnc CopyMem_qwords
movsd
CopyMem_qwords:
jecxz CopyMem_end
CopyMem_loop:
movq mm0, [esi]
movq [edi], mm0
lea esi, [esi + 8]
lea edi, [edi + 8]
dec ecx
jnz CopyMem_loop
CopyMem_end:
emms
End Asm
End Sub |
Gruß Volta _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
ytwinky
Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 30.04.2006, 19:22 Titel: |
|
|
Ich habe zwar nicht so ein schönes Programm wie volta, aber auch was: Code: | #include "crt.bi" 'Voraussetzung für ArgC, 'voraus' wird mit einem 'r' geschrieben
#Define ArgC ((*__p___argc())-1) 'Anzahl der BefehlszeilenParameter liefern
#define fbOkOnly 0 'Nur die Schaltfläche OK anzeigen
#define fbtOkCancel 1 'Schaltflächen OK und Abbrechen anzeigen
#define fbAbortRetryIgnore 2 'Abbruch, Wiederholen und Ignorieren
#define fbYesNoCancel 3 'Ja, Nein und Abbrechen
#define fbYesNo 4 'Schaltflächen Ja und Nein
#define fbRetryCancel 5 'Schaltflächen Wiederholen und Abbrechen
#define fbCritical 16 'Stop-Symbol
#define fbQuestion 32 'Fragezeichen-Symbol
#define fbExclamation 48 'Ausrufezeichen-Symbol
#define fbInformation 64 'Information-Symbol
#define fbOK 1 'Rückgabewert OK
#define fbCancel 2 'Rückgabewert Abbrechen
#define fbAbort 3 'Rückgabewert Abbruch
#define fbRepeat 4 'Rückgabewert Wiederholen
#define fbIgnore 5 'Rückgabewert Ignorieren
#define fbYes 6 'Rückgabewert Ja
#define fbNo 7 'Rückgabewert Nein
#define fbNull 0 'war mal ganz praktisch
#define fbCr Chr(13) 'Carriage-Return
#define fbLF Chr(10) 'LineFeed
#define fbCrLf Chr(13, 10) 'klassische Kombination
#define Esc Chr(27) 'Esc-Char, machmal ist ESC auch Epson Standard Code
#define fbSpc Chr(32) 'Leerzeichen
#define fbQM Chr(34) 'Quotation-Mark
#define FKey Chr(255) 'Prefix für FunktionsTasten
#define HKEY_CLASSES_ROOT &H80000000
#define HKEY_CURRENT_USER &H80000001
#define HKEY_LOCAL_MACHINE &H80000002
#define HKEY_USERS &H80000003
#define HKEY_CURRENT_CONFIG &H80000005
#define HKCR &H80000000 'Vbs-Abkürzung
#define HKCU &H80000001 'Vbs-Abkürzung
#define HKLM &H80000002 'Vbs-Abkürzung
#define HKUS &H80000003 'Meine Abkürzung
#define HKCC &H80000005 'Meine Abkürzung
#define READ_CONTROL &H20000
#define KEY_NOTIFY &H10
#define KEY_ENUMERATE_SUB_KEYS &H8
#define KEY_QUERY_STRING &H1
#define KEY_QUERY_VALUE &H1
#define SYNCHRONIZE &H100000
#define W84Msg "Eniki.." 'kk :D
Function InQM$(m$) 'liefert m$ umgeben von Chr(34)
Return fbQM+m$+fbQM
End Function
Function Strecke(byVal dy As Double, byVal dx As Double, byVal dz As Double=0) As Double
Return Sqr(dy*dy+dx*dx+dz*dz)
End Function 'bitte nicht fragen, warum keine Fehlerprüfung :rofl: | Es möge nützen..
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
|
Michael Frey
Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 01.05.2006, 10:12 Titel: |
|
|
Code: | Function InQM$(m$) 'liefert m$ umgeben von Chr(34)
Return fbQM+m$+fbQM
End Function
Function Strecke(byVal dy As Double, byVal dx As Double, byVal dz As Double=0) As Double
Return Sqr(dy*dy+dx*dx+dz*dz)
End Function 'bitte nicht fragen, warum keine Fehlerprüfung :rofl: |
Einzeilige Funktionen sollte man besser als Makro einbauen.
z.B.
Code: | #Define nQM$(m) fbQM+m+fbQM |
So kann der Compiler besser Optimieren und es gibt weniger "Sprünge" im Programm. |
|
Nach oben |
|
|
ytwinky
Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 01.05.2006, 10:26 Titel: |
|
|
Gut, bei InQM(..) sehe ich das ein, das ist sowie nur eine Schreiberleichterung..
Bei Strecke(..) ist es so, daß das mittlerweile nur noch ein Einzeiler ist..
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 01.05.2006, 14:54 Titel: |
|
|
Danke für die Ideen!
Die werd ich sofort einfügen.
Inzwischen habe ich auch selbst noch ein paar Ergänzungen vorgenommen. _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
|
ytwinky
Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 01.05.2006, 14:56 Titel: |
|
|
Hi,
Den Eintrag habe ich verschoben(naja, neu gepostet):
http://forum.qbasic.at/viewtopic.php?p=29040#29040
Obwohl ich finde, daß voltas Pi-Funktion hierher gehört..
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 01.05.2006, 15:55 Titel: |
|
|
ytwinky: (zu den Pi-Funktionen) Bei jedem Versuch ist das Ergebnis das selbe, oder? Zumindest war das auf meinem Rechner das Ergebnis.
(zu den Erweiterungen) Mir kommen übrigens einge deiner Def's aus den WinAPI-Headern bekannt vor; meinst du nicht, dass sie da schon gut aufgehoben sind?
However, ich wollte sie eigentlich trotzdem mit aufnehmen, nur leider meckert dann FBNP, dass der Code zu groß ist...
Anyway, die beiden Funcs (als Macro's) und die KeyCodes hab ich noch reinbekommen
Die neuen Short Words sind hier:
http://nopaste.freebasic.de/?view=337
Mit 14.37KB lässt sich kaum noch was adden, bevor die 15KB-Grenze voll ist.
However, danke für die Arbeit, werde das ganze mal irgendwo hochladen, wo es an keine 15KB gebunden ist
@ Volta:
Habe grade ein Benchmark deines CopyMem gegenüber meiner Version durchgeführt. Man merkt, dass ich nur Grundlagen-ASM kann, da du mich um das vierfache übertroffen hast
Dieses Programm:
Code: | #Include "CommonStatements.bi"
DProc OCopyMem (Byval Ziel AAnyPtr, Byval Quelle AAnyPtr, Byval Bytes AInt)
DInt i
DByt a(9), b(9)
DDbl t1, t2, s, e
For i = 1 To 10
a(i - 1) = i
Next
s = Timer
For i = 1 To 10000000
CopyMem @b(0), @a(0), 10
Next
e = Timer
t1 = e - s
? "Did new Version"
Getkey
s = Timer
For i = 1 To 10000000
OCopyMem @b(0), @a(0), 10
Next
e = Timer
t2 = e - s
? "Did old Version"
?
? "new:"; t1
? "old:"; t2
? "Speedup-factor:"; t2 / t1
?
For i = 0 To 9
? a(i), b(i)
Next
GetKey
Proc OCopyMem (Byval Ziel AAnyPtr, Byval Quelle AAnyPtr, Byval Bytes AInt)
' my own Version...
DInt s, t
If Bytes = 0 Then Exit Sub
Asm
mov ecx, [Bytes]
mov eax, [Ziel]
mov ebx, [Quelle]
mov [s], ebx
mov [t], eax
CopyMemCopyNextByte:
mov ebx , [ s ]
mov byte ptr %al , [ebx]
mov byte ptr %bl , %al
mov eax , [ t ]
mov byte ptr [eax], %bl
inc dword ptr [ t ]
inc dword ptr [ s ]
dec ecx
jne CopyMemCopyNextByte
EAsm
EProc |
lieferte auf meinem Rechner (PII, 400MHz) dieses Ergebnis:
Code: | Did new Version
Did old Version
new: 1.149120586800564
old: 4.25949352236421
Speedup-factor: 3.70674198277458
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10 |
Have a nice day
Ciao _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 01.05.2006, 16:07 Titel: |
|
|
neeee, so langsam ist mein copymem nicht
Ändere mal die Testbedingungen:
Code: | ...
DInt i
DByt a(1000000), b(1000000)
DDbl t1, t2, s, e
For i = 1 To 10
a(i - 1) = i
Next
s = Timer
For i = 1 To 10
CopyMem @b(0), @a(0), 1000001
Next
e = Timer
t1 = e - s
? "Did new Version"
Getkey
s = Timer
For i = 1 To 10
OCopyMem @b(0), @a(0), 1000001
Next
e = Timer
... |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
ytwinky
Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 01.05.2006, 16:14 Titel: |
|
|
Hmmm, eigentlich sollte bei voltas Funktion ein wenig mehr herauskommen.
Bei mir liefert sie 3,......31.. also 2 Stellen mehr als die Double-Funktionen.
Zu den Deklarationen:
Kann sein, daß die schon drinne sind..
Ich habe einfach nur meine Sources mal durchgestöbert nach brauchbaren
Deklarationen..
Naja, oder anyway wie du zu sagen pflegst: Es war ja nur ein Vorschlag
Ich muß ja nicht alles einbinden, um nur "hello, world!" auszugeben
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 05.05.2006, 17:18 Titel: |
|
|
@ volta:
Hehe... noch schneller? Da muss ich mich für mein Funktiönchen fast schämen
Allerdings ist immerhin der Name Funktiönchen nett
@ytwinky:
Schön, dass in einem Proggerforum nicht nur der Prog- sondern auch der Sprachstil beachtung findet However (auch ma ne schöne Variante zu den ganzen Brücken- u. Füllwörtern ), ein Befehl "HelloWorld" wäre natürlich auch irgendwie ganz cool, am besten noch mit dem Parameter "helloWorldType As HelloWorldTypeEnum", etwa in dem Stile:
Code: | DProc HelloWorld (helloWorldType As HelloWorldTypeEnum = HWTE_Console)
Enum HelloWorldTypeEnum
HWTE_Console
HWTE_Win32
HWTE_LinuxAPI
HWTE_XBox
HWTE_NASA
EEnum |
Natürlich wäre das ganze als Func besser aufgehoben, dann könnte immerhin zurückgegeben werden, ob Hello World auch ausgegeben wurde
jetzt wieder @all
Aber, mal ne Frage:
Auch wenn der ungemein notwendige HelloWorld-Befehl noch nicht eingebunden ist, wird hier irgendjemand die CommonStatements.bi aktiv verwenden, oder haltet ihr das eher für unpraktisch?
Wie man den Postings hier entnehmen kann, wissen sowiso nur 3 Leute davon, also sollte ich vllt. ein bisschen Werbung machen?
Naja, wozu gibt's denn Signaturen
Have a nice day
Ciao _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
|
ytwinky
Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 05.05.2006, 17:49 Titel: |
|
|
Hi Dusky_Joe,
na, wenn es um Spielen geht(im Sinne von Dinge unnötig zu verkomplizieren): Code: | Option Explicit
Dim WasDaWohlRauskommt(2) As ZString Ptr=>{@"Was", @"Das"}
?*WasDaWohlRauskommt(Int(Abs(Sqr(4)-(Sin(Sqr(Atn(1)))^2+Cos(Sqr(Atn(1)))^2)-1)))
Sleep
End | Ob da "Was" rauskommt?
(Und wenn ja, wieso?)
Btw:Das läßt sich übrigens auch richtig kompliziert darstellen
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 05.05.2006, 18:12 Titel: |
|
|
Cool, ich wusste gar nicht, dass man die Adressen von Konstanten im Programm verwenden darf!
Naja, hätt ich mir ja denken können, immerhin darf man ja auch
Code: | DProc foobar
Proc foobar
EProc
DA Proc Ptr a
a = @foobar |
Habs übrigens grade ausprobiert, da kommt wirklich "was" raus
Aber wehe, man versucht wo was hier:
Code: | *WasDaWohlRauskommt(0) = "1234" |
während das hier eigentlich kein Problem darstellen sollte:
[/code]*WasDaWohlRauskommt(0) = "123"[/code]
Anyway, wohin zeigt eigentlich das hier:
Code: | Type foo
b As bar Ptr
EType
Type bar
f As foo Ptr
EType
DA foobar As foo Ptr |
Ich weiß schon, momentan ist das noch ein nullpointer, aber kann man das nicht irgendwie so belegen, dass es ständig im Kreis läuft?
Moment...
Code: | ' Def's von vorhin
foobar = Alloc(4)
foobar.b = Alloc(4)
*foobar.b = foobar.b |
Denn *foobar.b ist ja ein foo Ptr, oder nicht?
Dann gilt quasi
Code: | **foobar.b = foobar.b |
The selfpointing pointer
Naja, meine Deutschlehrerin hat schon immer gesagt:
Wenn du mit dem Finger auf andere Leute deutest, dann zeigen vier auf dich zurück!
In dem Sinne
Have a nice day
Ciao _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
|
ytwinky
Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 05.05.2006, 19:36 Titel: |
|
|
Hi Dusky_Joe,
Code: | Option Explicit
Dim WasDaWohlRauskommt(2) As ZString Ptr=>{@"Was", @"Das"}
?*WasDaWohlRauskommt(Int(Abs(Sqr(16^0.5)-(Sin(Sqr(Atn(1)))^2+Cos(Sqr(Atn(1)))^2)-2^0)))
Sleep
End | Ob da "Was" rauskommt?
Da kommt immer noch 'Was' raus, ist aber ein wenig schwerer zu erkennen..
Bezgl. Pointer hast du mich auf dem falschen Fuß erwischt, denn Pointer sind für mich, naja sagen wir ma, nicht so einfach zu handhaben..
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 07.05.2006, 14:38 Titel: |
|
|
Fehlende Übung oder andere Probleme?
In den Anfangszeiten von FB hatte ich mit den Ptr auch noch ziemliche Verständnisprobleme, aber mit der Zeit habe ich recht umfangreich Gebrauch davon gemacht. Zurzeit bin ich nebenher auch noch an dem Monsterprojekt FB-API (das bei derzeitiger Entwicklungsgeschwindigkeit wohl noch Jahre dauern wird...), und da habe ich z.T. Pointer auf Pointer, und das Ziel des Ziel des Pointers ist dann ein Arrayindex
However, es ist eigentlich leichter als man denkt:
(Und wenn man die Fehler mal rausholt...)
However, der funktionierende Code (mit ein paar Erläuterungen) sähe so aus:
Code: | #Include "CommonStatements.bi"
Type fwdBar As bar ' forward referencing...
Type foo
b As fwdbar Ptr
EType
Type bar
f As foo Ptr
EType
DA foo Ptr foobar
foobar = CAlloc(4)
foobar->b = CAlloc(4)
? "foobar zeigt auf Adresse: ", foobar
? "An Adresse von foobar liegt auf Record b: ", foobar->b
? "An Adresse von Record b liegt auf Record f:", foobar->b->f
?
foobar->b->f = foobar
? "Wert von Record f geaendert: ", foobar->b->f
?
? "Record f zeigt nun auf foobar"
GetKey |
Die ersten beiden Zeilen geben irgendwelche Adressen an, die dritte zeigt 0, da die vier Bytes an b ja null-initiiert wurden.
Dann wird festgelegt, dass f auf foobar zeigen soll.
Ergebnis:
foobar zeigt auf b
b zeigt auf f
f zeigt auf foobar
Deswegen kannst du auch ein *foobar vergessen, da du damit ja immer im Kreis geleitet wirst.
Abgesehen davon hast du auch noch nen Type mismatch drin...
Wäre etwa so, als ob du sagen würdest:
Code: | Type a
b AInt
c AStr
EType
? a |
Weißt du was?
Mir fällt grade ein Gespräch mit einem Nicht-Programmierer ein, das ich vor kurzem hatte. Es sind grade ein paar Code-Notizen auf meinem Schreibtisch gelegen, die ihm aufgefallen sind. Ins Auge gestochen ist ihm dabei besonders die Zeile
Nun, ihm ist diese Zeile genau so logisch vorgekommen, wie ich grade Sinn in den obigen Zeilen sehe...
Aber egal, das Ergebnis ist an Byte 42 und vom Typ Multiplication Ptr.
In dem Sinne:
Code: | Dim Ergebnis As Any Ptr
Dim Sinn As Multiplication Ptr
Ergebnis = 42
Sinn = *Ergebnis |
Und, damit man jetzt nicht so im Regen dasteht:
Code: | Type Multiplication
Multiplikant1 As Integer
Multiplikant2 As Integer
End Type |
.Multiplikant1 ist selbstverständlich SIX, und
.Multiplikant2 nach höchstwahrscheinlicher Unwahrscheinlichkeit NINE.
Die Entsprechenden Defines sind DeepThought.bas zu entnehmen.
Noch Fragen ? _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
|
ytwinky
Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 07.05.2006, 16:30 Titel: |
|
|
Hi Dusky_Joe,
es ist nicht so, daß ich nicht weiß, was Pointer sind und wie sie
benutzt werden Code: | 'Ä=Ž , Ö=™ , Ü=š ; ä=„ , ö=”, ü=? , ß=á ,§=õ , ©=¸, °=ø
'LoadAll.Bas © 2006 by ytwinky, MD
Option Escape
Option Explicit
Declare Function LoadAll(byVal DateiName$)As String
Declare Function GetFAttr Lib "kernel32.dll" Alias "GetFileAttributesA" _
(ByVal lpFileName As String) As Long
Function LoadAll(byVal DateiName As String)As String
Dim Datei=FreeFile, Puffer As String Ptr, g=GetFAttr(DateiName) 'Variablen vorbelegen..
If Not g<0 And (g And &h10)=0 Then 'ist Datei vorhanden und kein Verzeichnis
Open DateiName For Binary As #Datei 'Datei binär öffnen
g=Lof(Datei) 'Dateigröße ermitteln
Puffer=cAllocate(g)'Puffer reservieren
*Puffer=Space$(g) 'Puffer vorbelegen
Get #Datei,, *Puffer 'gesamt Datei inPuffer ablegen
Close #Datei 'Datei schließen
Function=*Puffer 'Funktionswert zuweisen
DeAllocate Puffer 'Puffer im Speicher freigeben, besser isses..
Else 'Ooops, da war was falsch
If g<0 Then Return DateiName &" fehlt.."
If (g And &h10)<>0 Then Return DateiName &" ist ein Verzeichnis.."
Function="Oooops, mit " &DateiName &"stimmt was nich.."
End If
End Function
?LoadAll(Environ$("Tmp") &"\\Consi.Prx")
? "Fertich..";
Sleep | Manchmal habe ich einfach keine Lust, darüber nachzudenken,
wie das denn mit Pointern gehen würde..
Hast du dir mal auf ytwinky.freebasic.de mein FileList.Bas angesehen?
Das gibt nur Text aus, aber wie werden die einzelnen Elemente angesprochen?
Das geht nicht mit fester Dimensionierung. Auf einem Win95-System kommen
garantiert nicht so viel Dateien zusammen, wie auf einem W2K- oder XP-Rechner..
Eine Grenze läßt sich dort nicht setzen, aber es ging für mich nur darum
eine DateiListe zu erstellen, um mal zu schauen, wie kompliziert/einfach
das unter FB geht. Es geht, aber ich schreibe keinen DateiManager in FB,
nur um das anzuwenden, dazu gibt es genug Free- und erst recht Shareware..
Schönen Sonntag noch
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 12.05.2006, 22:41 Titel: |
|
|
Hätte mich ehrlich auch gewundert. Du bist hier ja eine der API-Größen, und da hat man ja genug mit Ptr zu tun
Dagegen habe ich bei deinem Bsp leichte verständnisprobleme; wenn ich alles richtig verstehe, müsste die Zeile
Code: | g=GetFAttr(DateiName) |
ja dafür sorgen, dass ein Index der gesamten Festplate nach [TMP]\Consi.prx geschrieben wird... oder habe ich dich falsch verstanden, und das gibt keinen Index aus? Aber immerhin müsste die Zeile dafür Zuständig sein, dass etwas in die Datei geschrieben wird, oder nicht?
Naja, momentan bin ich wohl einfach zu faul/müde, das Ding auszuprobieren
Have a nice day
Ciao _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
|
ytwinky
Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
|
Verfasst am: 12.05.2006, 23:37 Titel: |
|
|
Irrtum!
LoadAll() benutzt keine FB-Libs und kann daher eigene Variablen-Typen für API-Aufrufe verwenden. GetFAttr() liefert nichts weiter als das FileAttribut einer Datei auf deiner Platte..
Keine Attribute keine Datei
Ist (Attribut And &h10 )<>0 dann ist es ein Directory, aber das steht alles hier
Schlaf schön
ytwinky
[Edit]
Ich muß meiner Sig gerecht werden..
Ich kann den Goto/Jmp-Befehl wirklich nicht leiden!
Mit ein wenig Nachdenken ist er wirklich vermeidbar, wie dies Beispiel (wieder einmal mehr)zeigt: Code: |
Function W84Key (NumbersOnly As Integer = 0, Upper=0) As String
Dim As String Key
Do
Do
Key = Inkey
Sleep 1
Loop Until Len(Key) '=1 'Ohne das 1. "'" dieser Zeile gehen auch Fun-Tasten nicht
If Upper Then Key=UCase(Key) 'Nur Großbuchstaben zurückgeben
If NumbersOnly=0 Then Return Key 'Jedes einzelne Zeichen zurückgeben
If Instr(".0123456789", Key) Then Return Key 'Nur Ziffern zurückgeben
Loop
End Function
?"Ich mag einfach den Goto-Befehl nicht!"
?"Auch nicht in der Verkleidung als 'Jmp'"
?"Irgendein einzelnes Zeichen:";W84Key()
?"Irgendeine Ziffer oder '.':";W84Key(1)
?"Irgendeine Ziffer oder '.':";W84Key(1, 1)
?"Irgendein einzelnes Zeichen(nur Groábuchstaben):";W84Key(0, 1)
?"Habe fertig..";
Sleep | Dem geneigten Leser fällt sicher auf, daß für W84Key() ein zusätzlicher Parameter hinzugekommen ist: Upper
Wird als 2.Parameter ein True-Wert übergeben, liefert W84Key() das Zeichen als Großbuchstaben zurück, sofern möglich
Gruß
ytwinky _________________
v1ctor hat Folgendes geschrieben: | Yeah, i like INPUT$(n) as much as PRINT USING.. | ..also ungefähr so, wie ich GOTO.. |
|
Nach oben |
|
|
Dusky_Joe
Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 19.05.2006, 15:44 Titel: |
|
|
Gute Idee!
Allerdings sollte dann auch noch gleich - wie bei der INPUT-Func ein Parameter "Digits" da sein. Denn, was bringt es, wenn man ein Komma eingeben kann?
Manchmal wäre es wohl auch ganz günstig, einen String übergeben zu können, in dem die erlaubten Zeichen zu finden sind?
Man kann hier herrlich rumbasteln, aber diese beiden Erweiterungen (Numbersolny und Digits) sind wohl mindestens nötig.
Hey, warte, mir fällt was ein:
Code: | DFunc OLoad InputX (Digits AInt = 1, Upper AInt = 0) AStr
DFunc InputX (Digits AInt = 1) ADbl
Function InputX (Digits AInt = 1, Upper AInt = 0) AStr
DStr Key, Re
DInt x
For x = 1 To Digits
Do
Key = Inkey
Sleep 1
If Upper Then Key=UCase(Key) 'Nur Großbuchstaben zurückgeben
Loop Until Len(Key)
Re += Key
Next
Function = Re
EFunc
Function InputX (Digits AInt = 1) ADbl
DStr Key, Re
DInt x
For x = 1 To Digits
Do
Key = Inkey
Sleep 1
If Instr(".0123456789", Key) = 0 Then Key = ""
Loop Until Len(Key)
Re += Key
Next
Function = Val(Re)
EFunc |
Wobei ich mir nicht so sicher bin, ob das denn funktioniert. Denn beim Aufruf
a = InputX
ist noch nicht unbedingt sicher, ob nun die AInt- oder die AStr-Version aufgerufen werden soll. OK; wenn DDbl a oder DStr a, dann sollte es eigentlich klar sein, aber wird denn das vom Compiler auch geprüft?
Und vor allem, was ist bei DInt a?
Blöd ist auch, dass die eingegebenen Zeichen nicht angezeigt werden, aber wenn das nötig wird, sollte man wohl gleich auf DWI umsteigen - siehe GfxString.bi.
Auf jeden Fall finde ich es zweckmäßiger, eine Zahl gleich in einem Zahlentyp zurückzugeben, als dem User erst mal "abzuverlangen", den String selbst zu konvertieren
Andererseits müsste ich dann noch zwei OLoads für DWI schreiben, und das Flag DWI_NumbersOnly sausen lassen...
Nein, das brauchts dann doch nicht
Have a nice day
Ciao _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|