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:

Type identifiers As identifiers

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Make-Grafik



Anmeldungsdatum: 08.10.2012
Beiträge: 29

BeitragVerfasst am: 28.12.2013, 03:54    Titel: Type identifiers As identifiers Antworten mit Zitat

Guten Abend Community! grinsen
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 lächeln
_________________
Hmn :/ Mal schaun was es bringt...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 28.12.2013, 11:00    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 08.10.2012
Beiträge: 29

BeitragVerfasst am: 28.12.2013, 14:57    Titel: Antworten mit Zitat

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 lächeln
_________________
Hmn :/ Mal schaun was es bringt...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 28.12.2013, 16:47    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 28.12.2013, 21:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 28.12.2013, 23:48    Titel: Antworten mit Zitat

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
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 -> Allgemeine Fragen zu FreeBASIC. 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