Seite 3 von 3

Verfasst: 21.06.2006 22:29
von Stromberg
Gibt es eigentlich einen Unterschied zwischen "*" und "@"? Beide Zeichen dienen doch als Pointer, oder?

Verfasst: 21.06.2006 22:33
von AND51
Also, wenn ich Daten egal welchen typs übertragen will, dann kopiere ich einfach den Inhalt eines Buffers des Senders in den Buffer des Empfängers (und mss natürlich selbst drauf achten, welcher Datentyp da gerade empfangen wurde).

Dieses Verfahren geht am besten mit Send/ReceiveNetworkData().



Habe ich das jetzt richtig verstanden? *lieb :roll: guck*

Verfasst: 21.06.2006 22:51
von #NULL
@and51
richtig.

@stromberg
das * ist teil des variablennamens (also kein operator oder so) und ist eigentlich nur eine kennzeichung für den programmierer, um die verwendung der variablen als adressspeicher (pointer) zu identifizieren:

Code: Alles auswählen

n.b=127

*p=@n
Debug PeekB(*p)   ;=127

;es geht auch so, mit einer gewöhnlichen longvariable
p.l=@n
Debug PeekB(p)    ;=127
das @ hingegen ist der adressoperator, der, vor den namen einer variable geschrieben, ihre adresse zurückgibt.

Verfasst: 21.06.2006 23:28
von AND51
#NULL hat geschrieben:@and51
richtig.
Ja! Ja! Jaaaaaaaaaa! Jahuuuuuuuuu! :mrgreen: :D

Verfasst: 22.06.2006 00:03
von PMV
#NULL hat geschrieben:wenn du so was versendest:

Code: Alles auswählen

n.w=257
SendNetworkData(ConnectionID, @n, 4)
und so empfängst:

Code: Alles auswählen

ReceiveNetworkData(ClientID, Buffer, 1000)
MessageRequester( "sent", Str(PeekB(Buffer)), 0)
dann erhältst du "1" als ausgabe, also das zweite byte (der zahl 257). würd gern mal wissen ob die bytes schon im speicher im big-endian liegen, oder erst im big-endian versendet werden.(?)

//...liegt scheinbar am versenden
lol ... das lachen konnt ich mir jetzt nicht verkneifen :D
Du sendest vier Byte ... aber ein Word hat nur zwei Byte ;-) ... do drauf
hast du AND davor hingewießen? *grins* löl
Ansonnsten sollte nicht eine 1 zurück geleifert werden, sondern eine 2 bzw
bei deinem beispiel eine 4 ... da du ja 4 Byte versendest ;-)

Pointer:
Das was du über das Sternchen und den Klammeraffen schreibst stimmt
so nicht ganz. Das * wird bei der Deklaration benutzt und gehört bei PB
dann bei Variablen zum Namen. Bei Strukturen ist das nicht der Fall!
Beispiel:

Code: Alles auswählen

Structure Zeiger
X.l
Y.l
*Z.Zeiger
EndStructure
Test.Zeiger 
Test\Z = AllocateMemory(SizeOf(Zeiger))
Nimmst du das Sternchen weg, wird es nicht mehr klappen ;-)

Das @ Zeichen verwendest du bei bereits vorhanden Variablen, um deren
Speicheradresse raus zu bekommen. Es gibt auch ein Tutorial zu Pointern,
aber den Link kenn ich nicht auswendig. Irgend wer aus dem Forum hier
hat das mal geschrieben ... müsst nur mal nach suchen :D

MFG PMV

Verfasst: 22.06.2006 07:39
von #NULL
PMV hat geschrieben:Du sendest vier Byte ... aber ein Word hat nur zwei Byte Wink ... do drauf
hast du AND davor hingewießen? *grins* löl
das war natürlich nicht ganz korrekt, aber auch wenn du nur 2 bytes versendest erhältst du in dem beispiel "1" als ausgabe! (das höherwertige byte ist 1 im gesamten bereich von 256...511:
00000001 00000000 (256)
00000001 11111111 (511)
bei deinem beispiel eine 4 ... da du ja 4 Byte versendest :wink:
?!?!? :freak:



wenn du aber weniger bytes einer variable versendest, als ihr typ besitzt. ist das viel fataler, da ja nur eine teilmenge des wertebereichs versendet wird und du auf empfängerseite keine chance mehr hast, den inhalt der ursprünglichen variablen zu ermitteln.

bezüglich der strukturen hast du recht.

ein tut zu pointern gibt's hier. :allright: . scheint ganz gut zu sein.

Verfasst: 22.06.2006 12:51
von Stromberg
Hab' mir das Tutorial mal durchgelesen. Wirklich gut gemacht. :allright:

Verfasst: 22.06.2006 17:54
von PMV
ups ... kommt davon wenn man nur flüchtig auf den Code schaut /:-> ...
die "1" als ausgabe stimmt natürlich ... :oops:

MFG PMV