Array in Type als Pointer für Funktion

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

hamztata

Betreff: Array in Type als Pointer für Funktion

BeitragSo, Apr 05, 2009 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
folgendes beispiel geht natürlich nicht, aber so in der art würde ich das gern lösen.
Also im type ist Array ein pointer und in der function wird dann ein array[256] zugeordnet.
Weiß jemand wie das syntaktisch richtig heißen müsste?


Code: [AUSKLAPPEN]
Type TBeispiel
   Field Array:byte Ptr
end type
global Beispiel:TBeispiel = New TBeispiel

Function Irgendwas:int(x,x,x)

TBeispiel.Array = Array[256]
For...to...next...
  return
End Function

Geeecko

BeitragSo, Apr 05, 2009 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Type TBeispiel
   Field Array:Int[]
End Type

Global Beispiel:TBeispiel = New TBeispiel

Function Irgendwas:Int()
   Beispiel.Array = New Int[256]
   
   For Local i:Int = 0 To Len(Beispiel.Array) - 1
      Beispiel.Array[i] = i
   Next

   return 1
End Function


Und wenn du es "global" haben möchtest so:

Code: [AUSKLAPPEN]
Type TBeispiel
   Global Array:Int[]
End Type



Function Irgendwas:Int()
   TBeispiel.Array = New Int[256]
   
   For Local i:Int = 0 To Len(TBeispiel.Array) - 1
      TBeispiel.Array[i] = i
   Next

   Return 1
End Function


Da kann man glaub ich nicht viel erklären... Versteht sich von selbst, oder?

lg MD
....
 

hamztata

BeitragSo, Apr 05, 2009 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
japp, mir so ein code auchtausendmal lieber um die funktionsweise zu verstehen...
danke dir

eine frage aber noch bei dem global beispiel.
wird ja das field sozusagen direkt globalisiert.
was aber wenn da noch andere member im type sind, und ich den ganzen type dennoch immer noch global haben möchte.

kann ich das zusätzlich auch machen?

HackerBoyZ

BeitragSo, Apr 05, 2009 23:43
Antworten mit Zitat
Benutzer-Profile anzeigen
EDIT:

ist wie eine global, nur das sie nur über den type aufgerufen werden kann.
  • Zuletzt bearbeitet von HackerBoyZ am Mo, Apr 06, 2009 15:09, insgesamt einmal bearbeitet

Geeecko

BeitragSo, Apr 05, 2009 23:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja...
Stell dir Globale im Type eher so vor, wie ganz normale Globale.
Du musst nur schereiben: TypeName.VariablenName

Probier einfach mal ein wenig.
....
 

hamztata

BeitragMo, Apr 06, 2009 0:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab ich, haut aber net hin....

da...

Code: [AUSKLAPPEN]
Type FI_SurfacesType
   Field Count:Int
   Global Array:Int[]
   Field Texture:Int
End Type

Global FI_Surfaces:FI_SurfacesType = New FI_SurfacesType

Function xCreateImageEx:Int(texture:Int, width:Int, height:Int, imageFlags:Int = FI_AUTOFLAGS)
   If texture <> 0 Then
      
       FI_Surfaces.Array = New Int[256]
      FI_Surfaces.Texture = texture
      FI_Surfaces.Count = xGetTextureFrames(texture)
      If FI_Surfaces.Count>0 Then
         If FI_Surfaces.Count>256 Then FI_Surfaces.Count=256
         For i=0 To FI_Surfaces.Count-1
            FI_Surfaces.Array[i] = xGetTextureSurface(texture, i)
         Next
          Return xCreateImageEx_(FI_Surfaces, width, height, imageFlags)
      EndIf
   EndIf
   Return
End Function


und egal was ich probier, ich hab seit neuestem auch ein "duplicate identifier" an dieser Stelle: FI_Surfaces.Array[i] = xGetTextureSurface(texture, i)

Geeecko

BeitragMo, Apr 06, 2009 12:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
FI_Surfaces.Array = New Int[256]


Array ist Global...
Was hab ich gesagt? immer mit TypeNamen Wink

also
Code: [AUSKLAPPEN]
FI_SurfacesType.Array = New Int[256]


Wink
....
 

hamztata

BeitragMo, Apr 06, 2009 17:23
Antworten mit Zitat
Benutzer-Profile anzeigen
menno, glatt übersehen....lol.
aber was ist da mit anderen typ-members?
muss ich die jetzt alle so aufrufen?
also alle member global und dann eben immer den type.member so wie beim array.

DaysShadow

BeitragMo, Apr 06, 2009 17:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Du rufst nur Variablen mit dem Type auf, wenn du Globale oder Konstanten im Type deklariert hast, normale Member die mit Field deklariert werden, rufst du ganz normal mit einer Instanz auf.
Aufrufe bzw. Veränderungen einer Globalen eines Types über eine Instanz bewirken die Veränderung der Globalen im Type, nicht in der Instanz!

Code: [AUSKLAPPEN]
Type Test

  Global globale:int
  Constant konstante:int = 50
  Field normaler_member:int
 
EndType

Test.globale = 100 'Aufruf mit Type
Print Test.konstante ' Hier das gleiche

Local _test:Test = new Test 'Instanz _test des Types Test
_test.normaler_member = 30 'Aufruf über die Instanz

_test.globale = 50 'Ändert die Globale des Types und nicht etwa die der Instanz _test, Test.globale ist jetzt 50


Ich hoffe verständlich und richtig Wink

MfG DaysShadow
Blessed is the mind too small for doubt
  • Zuletzt bearbeitet von DaysShadow am Mo, Apr 06, 2009 17:38, insgesamt 2-mal bearbeitet
 

hamztata

BeitragMo, Apr 06, 2009 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
werd ich heut abend gleich mal probieren, häng grad noch an einem anderen hybrid, also 2 sprachen projekt.
wenn ich aber den type dann komplett übergebe, wird dann der mit global versehene auch mit übergeben?
eigentlich schon, oder?

nunja habs erstmal probiert, wird compiliert ohne probleme.


wenn jemand weiß wie ich es anstellen kann, eine funktion so umzubiegen.....wenn rückgabetyp der funktion :int ist, aber in der funktion eine dll funktion mit pointerrückgabe ist, und diese returnt wird.

in c++ geht das nur hier nicht.


da muss ich nicht extra nen neuen thread aufmachen hier mal der code.es hakt schon beim global array:int[] dann komplett bei dem type.

dazu gibt es nur zu sagen, "xCreateImageEx_" hat als Return einen pointer.also byte ptr deklariert bekommen.

Code: [AUSKLAPPEN]
Type FI_SurfacesType
   Field Count:Int
   Global Array:Int[]
   Field Texture:Int
End Type

Global FI_Surfaces:FI_SurfacesType = New FI_SurfacesType

Function xCreateImageEx:Int(texture:Int, width:Int, height:Int, imageFlags:Int = FI_AUTOFLAGS)
   If texture <> 0 Then
      
       FI_SurfacesType.Array = New Int[256]
      FI_Surfaces.Texture = texture
      FI_Surfaces.Count = xGetTextureFrames(texture)
      If FI_Surfaces.Count>0 Then
         If FI_Surfaces.Count>256 Then FI_Surfaces.Count=256
         For i=0 To FI_Surfaces.Count-1
            FI_SurfacesType.Array[i] = xGetTextureSurface(texture, i)
         Next
          Return xCreateImageEx_(FI_Surfaces:FI_SurfacesType, width, height, imageFlags)
      EndIf
   EndIf
   Return
End Function

Function xLoadImageEx:Int (fileName:String, textureFlags:Int = 0, imageFlags:Int = 0)
   If ImageInfo_ReadFile (fileName) Then
      Return xCreateImageEx ( xLoadTexture (fileName, textureFlags), ImageInfo_Width, ImageInfo_Height, imageFlags)
   EndIf
   Return
End Function


hat aber auch wieder mit dem type zu tun, oder aber ich hab nen fehler übersehen.

DaysShadow

BeitragMo, Apr 06, 2009 19:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Pointer gibt es nur beschränkt in BlitzMax, aber es gibt Pointer für Byte, Int, Float und Double, allerdings auch nur die.
Pointer auf eigene Types o.ä. wie in C++ gibt es meines Wissens nach nicht, kann mich aber auch irren, wie so oft Wink

Wenn ich dein Problem richtig verstanden habe, was ich glaube nicht richtig habe...

Code: [AUSKLAPPEN]
Function BlitzMaxFunction:Int Ptr() 'Funktion die einen Pointer auf einen Int zurückgibt

  Return DLLFunktion(...) 'Gibt Pointer der Funktion in der DLL zurück

EndFunction
Blessed is the mind too small for doubt

Geeecko

BeitragMo, Apr 06, 2009 20:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine Instanz ist doch schon ein Pointer.
Ein Byte Ptr.
Oder? xD
....
 

hamztata

BeitragMo, Apr 06, 2009 20:42
Antworten mit Zitat
Benutzer-Profile anzeigen
im c++ äquivalent gibt die funktion ein int zurück, jedoch innerhalb der funktion ists ein pointer.

hab eben noch mal die c++ sourcen durchgeschaut...es ist so.in bb3d geht das, dort ists einfach immer ein %.
so ein mist mist.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group