Arrayspeicherweise im RAM

Für allgemeine Fragen zur Programmierung mit PureBasic.
#Ton
Beiträge: 11
Registriert: 30.03.2013 11:57

Arrayspeicherweise im RAM

Beitrag von #Ton »

Hallo,

Werden Arrays immer zusammenhängend gespeichtert?

Code: Alles auswählen

EnableExplicit

Global Dim c.l(4)

c(0) = 10
c(1) = 20
c(2) = 30
c(3) = 40

Debug PeekL(@c())
Debug PeekL(@c()+4)
Debug PeekL(@c()+8)
Debug PeekL(@c()+12)
Also kann man immer so auf die Elemente zugreifen, egal wie groß das Array ist?

__________________________________________________
Thread verschoben
Hardware & Elektronik>Allgemein
08.04.2013
RSBasic
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Arrayspeicherweise im RAM

Beitrag von Josh »

#Ton hat geschrieben:Werden Arrays immer zusammenhängend gespeichtert?
Deine Frage hat zwar überhaupt nichts mit Hardware & Elektronik zu tun, aber hier mal was die Pb Hilfe dazu sagt:
Pb Hilfe hat geschrieben:Arrays sind Strukturen zum Speichern von indizierten Elementen. Anders als bei einer verknüpften Liste oder bei einer Map werden die Elemente in einer zusammenhängenden Weise im Speicher angelegt.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Arrayspeicherweise im RAM

Beitrag von cxAlex »

Jup.

Der Wert eines Array der Dimension n Array.Type(d_1_size, d_2_size, d_3_size, ..., d_n_size), auf den du mit Array(d_1_index, d_2_index, d_3_index, ..., d_n_index)
erhältst du nach folgendem Schema: *Pointer.Type = @Array(0) + ((d_1_size * d_2_size * d_3_size * ... * d_n_size) + (d_2_size * d_3_index * ... * d_n_index) + d_n_index) * SizeOf(Type)
(Beachte: Dim Array.l(5, 6) würde d_1_size = 6, d_2_size = 7 ergeben!)

Also gesprochen: Startadresse des Array + Größe des Typs in Byte * (Summe über ($x = 1 to Dimesions) von ( d_[$x]_index * (Multiplikation über ($y = $x+1 to Dimensions) von (d_[$y]_size)))

Es gibt nach dem Kompilieren keine "Muliti-Dimensionalen" Arrays mehr in PB, der Compiler wandelt alles in 1. Single - Dimension Array um. Mulit - Dimension ist nur eine Komfort - Funktion. Das ist auch der Grund warum bei Multi Dimensionalen Arrays nur die letzte Dimension geändert werden kann, den Im Zugriffs - Code werden die Multiplikatoren (d_[n+1]_size * ... * d_[Dimensions]_size) vorberechnet und nicht bei jedem Zugriff neu, was eine Menge Zeit spart. Nur die letzte Dimension hat keinen Multiplikator da es bei einem n - Dimensionalen Array kein d_[n+1]_size mehr gibt, daher ist Sie variabel.

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
#Ton
Beiträge: 11
Registriert: 30.03.2013 11:57

Re: Arrayspeicherweise im RAM

Beitrag von #Ton »

Vielen Dank :allright:
Antworten