Delete single element of an array
Posted: Sun Dec 18, 2011 11:52 am
Is it possible to delete a single element of an array, as is in C++ ?
http://www.purebasic.com
https://www.purebasic.fr/english/
Code: Select all
Macro deleteArrayElement(ar, el)
For a=el To ArraySize(ar())-1
ar(a) = ar(a+1)
Next
Redim ar(ArraySize(ar())-1)
EndMacro
Macro debugArray(ar,text)
Debug text
For a=0 To ArraySize(ar())
Debug ar(a)
Next
EndMacro
Dim test.i(5)
For a=0 To 5
test(a) = a
Next
debugArray(test,"START")
deleteArrayElement(test, 2)
debugArray(test,"DELETE 2")
deleteArrayElement(test, 0)
debugArray(test,"DELETE 0")
CallDebugger
Code: Select all
Macro deleteArrayElement(ar, el)
MoveMemory(@ar(el)+@ar(1)-@ar(0), @ar(el), @ar(ArraySize(ar())) - @ar(el))
ReDim ar(ArraySize(ar())-1)
EndMacro
Code: Select all
Macro deleteArrayElement(ar, el, st)
MoveMemory(@ar(el)+SizeOf(st), @ar(el), @ar(ArraySize(ar())) - @ar(el))
ReDim ar(ArraySize(ar())-1)
EndMacro
Code: Select all
Macro arDelNthElement(ar, el, struc=ABC, Type=$)
; Defaults = String operation
; For non-String, set struc = Byte,Long,Double,etc., Type = L
If SizeOf(struc) <> SizeOf(ABC)
MoveMemory(@ar(el) + SizeOf(struc), @ar(el), @ar(ArraySize(ar())) - @ar(el))
Else ; String
; netmaestro: www.purebasic.fr/english/viewtopic.php?p=160630#p160630
ar(el) = #NUL#Type ; Free memory of deleted element
MoveMemory(ar() + 4 * el + 4, ar() + 4 * el, PeekL(ar() - 8) * 4 - 4 * el)
EndIf
ReDim ar(ArraySize(ar())-1)
EndMacro
Code: Select all
Macro ArrayInsertString(name,element,content="")
ReDim name(ArraySize(name())+1)
MoveMemory(name()+4*element-4,name()+4*element+,PeekL(name()-8)*4-4*element)
name(element)=content
EndMacro
Code: Select all
For i=1 To 10
s(i)=RSet("",i,"x")
Next i
ArrayInsertString(s,5,"Will this work?")
For i=1 To ArraySize(s())
Debug Str(i)+": "+s(i)+", "+Str(Len(s(i)))
Next i
Code: Select all
Array(ElementToDelete) = Array(ArraySize(Array))
ReDim Array(ArraySize()-1)
Code: Select all
Procedure ArrayInsertString(name,element,content="")
Protected n=ArraySize(name())+1
ReDim name(n)
name(n)=content
n=PeekL(name()+4*n)
MoveMemory(name()+4*element-4,name()+4*element,PeekL(name()-8)*4-4*element)
PokeL(name()+4*element,n)
EndProcedure
Dim s.s(10)
For i=1 To 10
s(i)=RSet("",i,"x")
Next i
ArrayInsertString(s,5,"Will this work?")
For i=1 To ArraySize(s())
Debug Str(i)+": "+s(i)+", "+Str(Len(s(i)))
Next i
Code: Select all
Procedure ArrayInsertString(name,element,content="")
Code: Select all
Procedure ArrayInsertString(Array name.s(1),element,content.s="")
Protected n=ArraySize(name())+1
ReDim name(n)
name(n)=content
n=PeekL(name()+4*n)
MoveMemory(name()+4*element-4,name()+4*element,PeekL(name()-8)*4-4*element)
PokeL(name()+4*element,n)
EndProcedure
Dim s.s(10)
For i=1 To 10
s(i)=RSet("",i,"x")
Next i
ArrayInsertString(s(),5,"Will this work?")
For i=1 To ArraySize(s())
Debug Str(i)+": "+s(i)+", "+Str(Len(s(i)))
Next i
Code: Select all
Structure type
int.i
text.s
EndStructure
Dim test.type(5)
For i=1 To 5
test(i)\int=Pow(10,i)
test(i)\text=Str(test(i)\int)
Next i
For i=1 To 5
n=test(i)-test(i-1)
Debug Str(i)+": @"+Str(test(i))+", "+Str(n)+" Byte >> "+Str(test(i)\int)+" = "+test(i)\text
;Debug Str(i)+": @"+Str(test(i))+", "+Str(n)+" Byte >> "+Str(PeekL(test(i)))+" = "+PeekS(???)
Next i
For i=1 To 5
Debug Str(i)+": "+Str(test(i)\int)+" = "+test(i)\text
Next i
Not so difficultMichael Vogel wrote:Just started, I get the feeling, that the whole thing can't be done so easy...
Code: Select all
Global.i _ArrSize_, _ArrElementSize_, _ArrElementAddr_
Macro ArrayRemoveElement(ar, el)
_ArrSize_ = ArraySize(ar())
If _ArrSize_ > 0 And el <= _ArrSize_
_ArrElementSize_ = @ar(1) - @ar(0)
_ArrElementAddr_ = @ar(el)
MoveMemory(_ArrElementAddr_ + _ArrElementSize_, _ArrElementAddr_, @ar(_ArrSize_) - _ArrElementAddr_)
PokeL(@ar() - 8, _ArrSize_); ReDim ar(_ArrSize_ - 1)
EndIf
EndMacro
Structure type
int.i
text.s
EndStructure
Dim test.type(5)
For i=1 To 5
test(i)\int=Pow(10,i)
test(i)\text=Str(test(i)\int)
Next i
For i=1 To 5
Debug Str(i)+": "+Str(test(i)\int)+" = "+test(i)\text
Next i
ArrayRemoveElement(test, 2)
For i=1 To 4
Debug Str(i)+": "+Str(test(i)\int)+" = "+test(i)\text
Next i
Strings are just stored as a pointer. The real string could be anywhere.Second point: where in the memory are the strings located?