|
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 |
Make-Grafik
Anmeldungsdatum: 08.10.2012 Beiträge: 29
|
Verfasst am: 28.12.2013, 03:54 Titel: Type identifiers As identifiers |
|
|
Guten Abend Community!
Ich bin jetzt schon eine weil am Grübeln weil ich folgendes in einer Headerdatei (geschrieben in C) gefunden habe: Code: | struct identifiers;
typedef struct identifiers identifiers; |
Das selbe lässt sich ja auch in FreeBASIC so umsetzen: Code: | Type identifiers As identifiers |
Ich weiß nur, dass in C Strukturen als Datentypen nicht einfach vor dem Bezeichner geschrieben werden können und deshalb diese Deklaration notwendig ist um dies zu ermöglichen. Die Struktur ist in irgendeiner C Datei hinterlegt auf die ich keinen Zugriff habe. Die Header Dateien deklarieren die Funktionen die sich in einer DLL befinden.
Genau das gleiche habe ich jetzt in FreeBASIC vor (eine Header Datei schreiben um sämtliche Funktionen aus der DLL einzubinden). Jedoch bin ich nun über den oberen genannten Code gestolpert der mich ein wenig verwirrt. Das zu dem Hintergrund.
Meine Frage ist nun:
Was macht "Type identifiers As identifiers" nun genau und welchen Sinn hat das ganze? Ich hoffe ihr könnt mir weiterhelfen.
LG. Make-Grafik _________________ Hmn :/ Mal schaun was es bringt... |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 28.12.2013, 11:00 Titel: |
|
|
Oft wird so etwas verwendet, um eine Referenz zu erzeugen, die man bei Bedarf auch schnell mal wieder ändern kann. Mal als Beispiel:
Code: | TYPE MyType AS INTEGER |
Dieses MyType wird dann ein paar Dutzend mal im eigenen Code verwendet. Sollte sich jetzt irgendwann einmal herausstellen, dass INTEGER nicht (mehr) so gut geeignet ist (wenn einmal eine 64bit-Version vom fbc zur Verfügung steht, ist dort den bisherigen Ankündigungen nach ein INTEGER 64 Bit groß und damit nicht mehr zur 32-bit-Version speicherkompatibel), lässt sich ganz einfach diese eine Zeile anpassen, ohne den gesamten Code umschreiben zu müssen.
Das ist einmal ein möglicher Grund - ein anderer könnte einfach eine bessere Verständlichkeit des Codes sein, wen man weiß, welche Datentypen wie zusammengehören. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Make-Grafik
Anmeldungsdatum: 08.10.2012 Beiträge: 29
|
Verfasst am: 28.12.2013, 14:57 Titel: |
|
|
Ach so ist das...
Da wird mir doch schon einiges klar.
Dann habe ich jetzt auch verstanden wieso man einen Bezeichner auf sich selber referenziert.
Die Struktur ist wohl absichtlich nicht in der C Headerdatei zu finden weil man nur mit den Pointer der Struktur arbeiten soll. Die Variablen in der Struktur sollen anscheinend nur intern von der DLL verändert werden und der Programmierer sollte sich da nicht dran zu schaffen machen.
Ich bedanke mich für deine Erklärung!
LG. Make-Grafik _________________ Hmn :/ Mal schaun was es bringt... |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 28.12.2013, 16:47 Titel: |
|
|
Zitat: | typedef struct identifiers identifiers; |
Das ist nur eine Syntax-Vereinfachung, da man in C zum Deklarieren einer Variablen von einem struct-Typ eigentlich immer "struct foo bar;" schreiben müsste, um ein struct vom Typ foo zu deklarieren. Mit dem typedef wird das typedef Teil des Datentyps, sodass "foo bar;" wie auch bei elementaren Datentypen ausreicht. In C++ sind solche Verrenkungen z.B. nicht nötig. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 28.12.2013, 21:00 Titel: |
|
|
Solche Aliase machen einen Code wartungsfreundlicher und wiederverwendbarer. Auf sehr primitive Art lässt sich so bereits eine Art Generics-Datentyp erstellen, in dem im betreffenden Code der typedef bewusst weggelassen wird und der Anwender des Codes in einer separaten Datei diesen typedef macht und dann den übrigen Code mit z.B. include hereinholt. Beispiel Sortierklasse:
Code: | ' Generischer Code
Sub GenSort(a() as FooType)
Dim i As Integer, j As Integer
For i=LBound(a) To UBound(a) - 1
For j=i + 1 To UBound(a)
If a(j) < a(i) Then
Swap a(i), a(j)
End If
Next j
Next i
End Sub |
Und wenn wir nun einen Fliesskommazahlen-Sortierer brauchen:
Code: | Typedef FooType As Double
#Include "FooSorter.bas"
Dim meineDaten(3) As Double => { 1.3, 7.5, -4.3, 1.7 }
Dim i As Integer
GenSort meineDaten()
For i=0 To 3
Print meineDaten(i)
Next i |
Ein eigener Datentyp mit TYPE geht natürlich auch, wenn ich für diesen einen geeigneten "<"-Operator definiere.
Aktuell wie bereits gesagt in FB erst primitv möglich, d.h. folgende wichtigen Eigenschaften fehlen noch:
- meine Sortier-SUB lässt sich nicht als separaten Objektcode übersetzen
- ich kann auch nicht klar deklarieren, was der Datentyp für ein Interface (hier ein "<"-Vergleichsoperator) unterstützen muss. Bei ausgewachsenen Sprachen sorgt dann der Compiler dafür, dass ich bei der Sortierklasse beispielsweise nicht aus Versehen noch "<=", ">" usw. verwenden kann (ausser ich verlange dies als weitere Anforderung vom Interface), umgekehrt sorgt der Compiler ebenfalls dafür, dass nur Datentypen verwendet werden können, wo die Operationen definiert sind
- Die Sortier-SUB gleichzeitig für ganz verschiedene Datentypen verwenden geht ebenfalls nicht, d.h. ich kann im selben Code nicht so etwas wie
Code: | Declare Sub IntSort = Sort(FooType As Integer)
Declare Sub StringSort = Sort(FooType As String) |
machen, d.h. dem Compiler mitteilen, zwei Sortier-SUBs daraus ableiten, vergleichbar mit einem
Code: | Sorter<Integer> intSorter = new Sorter<Integer>();
Sorter<String> stringSorter = new Sorter<String>();
intSorter.sort(myIntArray);
stringSorter.sort(myStringArray); |
aus Java.
Aber wer weiss, vielleicht bekommt FreeBasic eines Tages auch dieses Sprachfeature einmal implementiert, nachdem bereits heute schon viele grundlegenden OO-Funktionalitäten vorhanden sind. :-) _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
MOD Fleißiger Referenzredakteur
Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 28.12.2013, 23:48 Titel: |
|
|
dreael hat Folgendes geschrieben: | aus Java. |
Ich verweise nur mal auf eines meiner aktuellen Projekte: mdTypes
Da siehst du, was schon so mit FreeBASIC machbar ist. |
|
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.
|
|