noch ne Type Macke...

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

EPS

Betreff: noch ne Type Macke...

BeitragDi, Nov 23, 2004 11:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi zusammen...

also so langsam fange ich an die Types zu hassen Wink

Nein, nur Spaß eigentlich sind sie recht praktisch, aber ihre Eigenheiten finde ich schon etwas merkwürdig. Neuestes Beispiel:

Ich habe zwei Type Felder. Bisher war ich der Annahme das es nur auf den Namen des Types und seine "Field Eigenschaften" ankommt wenn man mit dem Type arbeiten möchte, aber das war/ist ein Irrtum. Ebenso wichtig ist die Variable die man vorne anstellt.

Zum besseren Verständnis hier mal ein kleines Beispiel:

Code: [AUSKLAPPEN]
Type Helmut
   Field Zahl
End Type

Type Wolfgang
   Field Wert
End Type

Name.Helmut = New Helmut
Name\Zahl = 100

Feld.Wolfgang = New Wolfgang
Feld\Wert = 200

For Bsp.Helmut = Each Helmut
   Print Bsp\zahl
Next

For Bsp.Wolfgang = Each Wolfgang
   Print Bsp\wert
Next

;For So.Wolfgang = Each Wolfgang
;   Print So\Wert
;Next


Wenn man das Beispiel so startet bekommt man den Fehler Variable type mismatch. Stattdessen sollte man die REM vor der letzten Routine wegnehmen und REM bei der vorhergehenden setzen damit es funzt.

Wohl kaum ein Bug, weil nach ein wenig Nachdenken doch einleuchtend, aber für mich (und vielleicht auch andere) im ersten Moment etwas unverständlich, schließlich arbeitet man ja mit dem Feld und nicht der "Arbeitsvariablen" die man für die FOR NEXT vorne anstellt.

Warum ich das überhaut erwähne? Weil ich in einem ähnlichen Fall auch einmal keinen Fehler bekam, sondern scheinbar alles funktionierte, jedoch der ausgelesene Wert des Types nicht aus dem zweiten, sondern aus dem ersten Type Feld stammte...und das ist ein Fehler den ich niemandem Wünsche...danach sucht man sich nämlich dumm und dusselig Wink

Jan_

Ehemaliger Admin

BeitragDi, Nov 23, 2004 11:48
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, ist aber klar, du kannst ja nciht den Variablentype life ändern, wer das macht, gehört bestraft!

Type Person
Field Name$
EndType

Type Wert
Field Owner.Person
Field Zahl
End Type

Ist ne Möglichkeit, womit du verschiedenen Personen verscheidenes Zuweißen kannst.
between angels and insects
 

Dreamora

BeitragDi, Nov 23, 2004 13:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Bsp wird beim ersten aufruf von einem Type Deklariert. Danach kann dieser Type leider nicht mehr geändert werden ( nein das ist weder ein intelligentes verhalten noch wirklich akzeptabel aber man gewöhnt sich dran ).

Allerdings hat bei mir der Compiler noch jedes Mal gemotzt, auch wenn es mir lieber wäre, wenn er dieses non-redifinition kindergehabe endlich mal verlernen würde ...


Das schlimme ist vor allem, dass dieses Verhalten nicht für eine Funktion oder so abgeschlossen ist, sondern dass sich das über eine gesammte Sourcefile so blockt.
Ist etwa gleich hohl wie das er nicht in der Lage ist GoSub richtig zu verarbeiten. Sprich wenn die Sub unterhalb des Mainsources steht wirst du massenhaft variablenfehler und deklarationsfehler davontragen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Edlothiol

BeitragDi, Nov 23, 2004 13:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora hat Folgendes geschrieben:
Das schlimme ist vor allem, dass dieses Verhalten nicht für eine Funktion oder so abgeschlossen ist, sondern dass sich das über eine gesammte Sourcefile so blockt.
Wie meinst du das?Code: [AUSKLAPPEN]
Type test
End Type

Type test2
End Type

Function t1()
   bla.test = New test
End Function

Function t2()
   bla.test2 = New test2
End Function
klappt doch, verstehe ich dich falsch?

@EPS: Ist doch normal, Code: [AUSKLAPPEN]
For i% = 0 To 10
  Print i
Next

For i# = 0 To 10
  Print i
Next
klappt doch genauso wenig...
 

David

BeitragDi, Nov 23, 2004 13:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Zitat:

Code: [AUSKLAPPEN]

Type test
 End Type
 
 Type test2
 End Type
 
 Function t1()
    bla.test = New test
 End Function
 
 Function t2()
    bla.test2 = New test2
 End Function



Es gibt einen Unterschied zwischen lokal und global...

Edit: Sorry, das war ein Mistverständniss. Wink

grüße
 

Edlothiol

BeitragDi, Nov 23, 2004 13:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Dass es bei globalen Variablen nicht funktioniert, hatte ich eigentlich für noch logischer gehalten...
 

Jake

BeitragDi, Nov 23, 2004 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist auch ganz sinnvoll, Variablen innerhalb der Funktion mit local zu definieren. Damit kriegt man auch Fehlermeldungen, wenn es zufällig eine global gleichen Namens geben sollte. Macht man das nicht, kann das zu sehr komischem Programmverhalten führen.

Ist mir schon öfters passiert! Und das sind so Fehler, die sucht man Tagelang Wink
bittrap-software. Jetzt neu und mit noch mehr Kalorien: CandyFactory 2 !
 

Apocalyptic

BeitragDi, Nov 23, 2004 17:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Jake hat Folgendes geschrieben:
Es ist auch ganz sinnvoll, Variablen innerhalb der Funktion mit local zu definieren. Damit kriegt man auch Fehlermeldungen, wenn es zufällig eine global gleichen Namens geben sollte.


Bei mir kam da noch nie ne Fehlermeldung...

Code: [AUSKLAPPEN]
Global Blubb=10

Print Bla()

WaitKey()

Function Bla()
Local Blubb=5
Return Blubb
End Function
Suum cuique

[ www.ffs-net.de.vu ] [ Raycaster ]

Jolinah

BeitragDi, Nov 23, 2004 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich halte das für ganz normal. Geht doch auch in jeder anderen Sprache nicht, oder?

Wäre ja ungefähr das selbe wie

Code: [AUSKLAPPEN]

struct bla
{
  int a;
}

struct bla2
{
  int a;
}

struct bla Objekt;

struct bla2 Objekt;  //Gleicher name "Objekt" 2 mal


Da die beiden Strukturen den selben Aufbau haben wäre es kein Problem einem bla ein bla2 zuzuordnen und umgekehrt in dem man einen cast macht. Aber ich kann doch die Variable selber die von diesem Typ ist nicht einfach redefinieren, oder ist das in c++ doch möglich? Ich glaube nicht.
 

Dreamora

BeitragDi, Nov 23, 2004 19:10
Antworten mit Zitat
Benutzer-Profile anzeigen
In C gehts net.
In Basic und anderen Sprachen gehts aber.

In C kannst du auch Arrays net redimen, von daher hinkt der vergleich Wink

Das Problem an diesem Dim / Redim ist das der Compiler linear arbeitet.

Wenn du also ganz oben ein Gosub hast auf eine Sub die alle deklarationen hat und ganz unten steht, dann geht zb garnix, weil der compiler nicht fähig ist den code vor dem compilen entsprechend zusammenzubauen.

In solchen Fällen bin ich jeweils relativ froh darüber das ich Protean besitze.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Jolinah

BeitragDi, Nov 23, 2004 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Geht das in Basic mit jeder Variable, mal abgesehen von Blitz jetzt?

Wenn ja, dann hab ich wieder was dazu gelernt Wink

Bei Arrays war es mir bekannt, aber das ist ja im Grunde nicht redefinieren nur redimensionieren.

Obwohl das natürlich intern auch einer Art redefinition gleich kommt Wink

VirtualDreams

BeitragFr, Nov 26, 2004 1:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, nun ja. ich finde diesen compiler schon das letzte für die tolle detailierte fehlermeldung: memory access violation. aber nun zum eigentlichen: Ich finde es schwach - wie von jeder basic sprache - das man variablen nicht explizit deklarieren muß, sowas ist viel zu fehleranfällig. nur mal so als beispiel: a% = "b" - und das akzeptiert er ohne maulen, schon bei sowas müßte der compiler dir ins gesicht springen. und so geht das mit vielen anderen kleinigkeiten weiter. zudem vermisse ich variable arrays, die ich per index ansprechen kann.

aber wie dem auch sei, ändern wird sich das nie - leider - und es ist unnütz sich darüber aufzuregen...

Hubsi

BeitragFr, Nov 26, 2004 1:03
Antworten mit Zitat
Benutzer-Profile anzeigen
VirtualDreams hat Folgendes geschrieben:
Hmm, nun ja. ich finde diesen compiler schon das letzte für die tolle detailierte fehlermeldung: memory access violation.
Wie wärs wenn Du den Debugger anstellst? Damit gibts auch vernünftige Meldungen Wink
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

VirtualDreams

BeitragFr, Nov 26, 2004 1:08
Antworten mit Zitat
Benutzer-Profile anzeigen
naja, so detailliert sind diese nun dort auch wieder nicht. ich vermisse tunlichst ein step by step debugger...

Hubsi

BeitragFr, Nov 26, 2004 1:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist es das was Du willst:Code: [AUSKLAPPEN]
Stop
Print "Test"
a=3
TileImage bla,100,10000000
Starten und mit dem Pfeil nachg rechts im Debuggerfenster Zeile für Zeile durchgehen. Step by step Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

VirtualDreams

BeitragFr, Nov 26, 2004 1:29
Antworten mit Zitat
Benutzer-Profile anzeigen
ich weiß ja nicht ob die effiktiverweise nach jedem befehl ein stop einfügen willst, und das bei vlt noch mehr als tausend codezeilen... Shocked naja, ist step by step, gibt aber mehrere methoden für step by step, schau dir mal dafür qbasic an, schon dort gab es das, hier nicht mehr - leider.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group