Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 15.09.2009, 21:07 Titel: Array auf anderes Array zeigen lassen??? |
|
|
Hallo zusammen, ich drück mich grad mal wieder etwas unglücklich aus - ich weis. Ich versuche mein Problem mal einfach zu beschreiben.
Mit normalen Variablen kann ich ja sowas machen:
A=1
B=A
wenn ich mir nun B anzeigen lasse ist es 1.
wie kann ich das mit Arrays machen? Also so in der Art:
Dim Shared A(0 to 4) As Integer
.
.
.
Dim B() as Integer
B() = A()
geht sowas? _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 15.09.2009, 21:23 Titel: |
|
|
Da ich Pointer und memcpy liebe...
Code: | #include "crt.bi"
Dim a(1 To 99) As Integer
Dim b(1 To 99) As Integer
memcpy(@a(0), @b(0), SizeOf(a)) |
_________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
E-P-S

Anmeldungsdatum: 16.09.2004 Beiträge: 500 Wohnort: Neuruppin
|
Verfasst am: 15.09.2009, 21:29 Titel: |
|
|
ok, ist einleuchtend, aber kann man das auch realisieren OHNE zu wissen wie man B indizieren muß? Also wenn die größe von B variabel sein soll:
Code: | DIM A(1 to 99) as integer
Dim B(1 to 50) as integer
Dim c() as integer ????
memcopy(@c(), @a(0), sizeof(a)) |
so in der Art? _________________ Man kann sich öfter als zweimal im Leben halb tot lachen. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 15.09.2009, 21:33 Titel: |
|
|
dann nimmste eben das kleinere SIZEOF von beiden. Ist die zu kopierende Speichermenge größer als der Quellpuffer, gibt's nen Lesefehler... Ist sie größer als der Zielpuffer, gibt's nen Schreibfehler... Also immer das kleinste nehmen. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 16.09.2009, 09:55 Titel: |
|
|
Hallo, EPS
Sowas hab ich auch schon gesucht... leider gibts das in FB nur für eindimensionale Arrays:
Code: |
dim liste(1 to 100) as integer
dim lpointer as integer ptr
liste(1) = 111
liste(2) = 222
liste(3) = 333
liste(4) = 444
lpointer = @liste(0)
'VORSICHT: im weiteren darf man nur auf indizes zwischen 1 und 100 zugreifen!
print lpointer[1]
print lpointer[2]
print lpointer[3]
print lpointer[4]
sleep
|
Hoffe das hilft ein bischen.. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 16.09.2009, 13:25 Titel: |
|
|
das ist aber keine kopie im sinne von "A = B"... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 16.09.2009, 13:31 Titel: |
|
|
ach ok.. sorry, eine kopie ists dann natürlich nich das is richtig.. Hab nur im Titel "zeigen" gelesen und hab direkt an pointer gedacht... aber selbst mit memcopy wird man spätestens bei einem String-array gegen die wand laufen.. ich glaub, da bleibt nix anderes übrig als das array ein mal abzulaufen :-/ |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 16.09.2009, 15:38 Titel: |
|
|
Jo, Strings sind da ne andere sache, aber hat ja auch in seinem Beispiel mit Integers hantiert. Bei festen Längen geht das prima mit memcpy. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 19.09.2009, 23:03 Titel: |
|
|
Muss denn das Ergebnis ein klassisches Array sein?
Immer wenn ich ein B() = A() gebraucht habe, hab ich das über ReAllocate gelöst. Dann kannst du über UBOUND(A) rausfinden, wie groß du B gestalten musst, und kannst vor das Copy ein entsprechendes B = ReAllocate( UBound(A) ) setzen.
Oder, man macht's gleich Professionell:
Code: | Type CopyArray
Public:
Declare Property Element(Index As Integer) As Integer
Declare Property Element(Index As Integer, Value As Integer)
Declare Function UBd () As Integer ' keyword UBound is reserved...
Declare Sub ReSize (newSize As Integer, keepValues As Integer = -1)
Declare Sub Assign (Source As CopyArray)
Declare Constructor
Declare Destructor
Private:
eCount As Integer
ePtr As Integer Ptr
End Type
'.............................................................................'
Constructor CopyArray
With This
.eCount = 1
.ePtr = Allocate( .eCount * SizeOf(Integer) )
End With
End Constructor
'.............................................................................'
Destructor CopyArray
DeAllocate This.ePtr
End Destructor
'.............................................................................'
Function CopyArray.UBd () As Integer
Return This.eCount
End Function
'.............................................................................'
Property CopyArray.Element (Index As Integer) As Integer
With This
If Index < 0 Or Index >= .eCount Then Return 0
Return .ePtr[Index]
End With
End Property
'.............................................................................'
Property CopyArray.Element (Index As Integer, Value As Integer)
With This
If Index < 0 Or Index >= .eCount Then Exit Property
.ePtr[Index] = Value
End With
End Property
'.............................................................................'
Sub CopyArray.ReSize (newSize As Integer, keepValues As Integer = -1)
Dim As Integer Ptr buffer
Dim As Integer i, oldSize
With This
If newSize <= 0 Then Return
If keepValues Then
oldSize = .eCount
buffer = Allocate( .eCount * SizeOf(Integer) )
For i = 0 To .eCount - 1
buffer[i] = .ePtr[i]
Next
End If
.eCount = newSize
DeAllocate .ePtr
.ePtr = Allocate( .eCount * SizeOf(Integer) )
If keepValues Then
For i = 0 To oldSize - 1
If i >= .eCount Then Exit For
.ePtr[i] = buffer[i]
Next
DeAllocate buffer
EndIf
End With
End Sub
'.............................................................................'
Sub CopyArray.Assign (Source As CopyArray)
With This
Dim As Integer i
DeAllocate .ePtr
.eCount = Source.UBd()
.ePtr = Allocate( .eCount * SizeOf(Integer) )
For i = 0 To .eCount - 1
.ePtr[i] = Source.Element(i)
Next
End With
End Sub
'============================================================================='
Dim As CopyArray A, B
Dim As Integer i
A.ReSize 20
For i = 0 To 19
A.Element(i) = 20 - i
Next
B.Assign A
Print , "A", "B"
For i = 0 To 19
Print i, A.Element(i), B.Element(i)
Next
GetKey |
Kann man natürlich noch beliebig um die Klassiker AddItem, DelItem, ... ausschmücken, aber für die Aufgabenstellung sollts schon mal reichen.
Have a nice day
Ciao
Dusky_Joe
//EDIT #1:
Wenn der Umgang mit STRINGs gewünscht ist, muss natürlich noch gefeilt werden. Aber Grundsätzlich würd's funktionieren. Und wie auch schon hier in der INTEGEr-Variante kann man den Komfort erhalten, dass B nicht initialisiert werden muss, bzw. die Initialisierung von A automatisch übernommen wird. Und durch wenige Zeilen mehr lässt sich das ganze dann für mehrere Records im UDT auch ausweiten.
D'accord?
//EDIT #2:
Hab das noch nicht ausprobiert, aber u. U. kann man anstelle des DECLARE SUB Assign auch ein DECLARE OPERATOR LET einbauen. Der Code wäre fast identisch, aber die Anwendung eben nochmal einen Tick näher an dem, was gewollt ist. ==> Die Fleißaufgabe für Perfektionisten  _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
|