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:

Array auf anderes Array zeigen lassen???

 
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
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 15.09.2009, 21:07    Titel: Array auf anderes Array zeigen lassen??? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


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

BeitragVerfasst am: 15.09.2009, 21:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 15.09.2009, 21:29    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


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

BeitragVerfasst am: 15.09.2009, 21:33    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 16.09.2009, 09:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 16.09.2009, 13:25    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 16.09.2009, 13:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


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

BeitragVerfasst am: 16.09.2009, 15:38    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 19.09.2009, 23:03    Titel: Antworten mit Zitat

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 zwinkern
_________________
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
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