Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Arbeitserleichterung: CommonStatements.bi

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 29.04.2006, 23:58    Titel: Arbeitserleichterung: CommonStatements.bi Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 30.04.2006, 11:59    Titel: Antworten mit Zitat

Hi,
CopyMem mit Turbolader... grinsen
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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 30.04.2006, 19:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 01.05.2006, 10:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 01.05.2006, 10:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 01.05.2006, 14:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 01.05.2006, 14:56    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 01.05.2006, 15:55    Titel: Antworten mit Zitat

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 zwinkern
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 zwinkern

@ 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 zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 01.05.2006, 16:07    Titel: Antworten mit Zitat

neeee, so langsam ist mein copymem nicht grinsen
Ä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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 01.05.2006, 16:14    Titel: Antworten mit Zitat

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 zwinkern
Ich muß ja nicht alles einbinden, um nur "hello, world!" auszugeben lachen
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 05.05.2006, 17:18    Titel: Antworten mit Zitat

@ volta:
Hehe... noch schneller? Da muss ich mich für mein Funktiönchen fast schämen verlegen
Allerdings ist immerhin der Name Funktiönchen nett zwinkern

@ytwinky:
zwinkern Schön, dass in einem Proggerforum nicht nur der Prog- sondern auch der Sprachstil beachtung findet zwinkern However (auch ma ne schöne Variante zu den ganzen Brücken- u. Füllwörtern zwinkern ), 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 Zunge rausstrecken


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 zwinkern


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
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 05.05.2006, 17:49    Titel: Antworten mit Zitat

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 vor lachen auf dem Boden rollen
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 05.05.2006, 18:12    Titel: Antworten mit Zitat

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 zwinkern
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
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 05.05.2006, 19:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 07.05.2006, 14:38    Titel: Antworten mit Zitat

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 zwinkern

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
Code:
x = x + 1

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 zwinkern ?
_________________
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
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 07.05.2006, 16:30    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 12.05.2006, 22:41    Titel: Antworten mit Zitat

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 zwinkern

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 zwinkern


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
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 12.05.2006, 23:37    Titel: Antworten mit Zitat

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 grinsen
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 19.05.2006, 15:44    Titel: Antworten mit Zitat

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 zwinkern

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 zwinkern


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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz