Newsgroup: it.comp.lang.visual-basic
Titolo: Spostare elementi in un array

Ok, devo spostare degli elementi in un array. In condizioni
normali trovo indice di partenza, trovo indice di fine, faccio
una riassegnazione.
Dato che perň ho un arrayone ho preferito usare la copymemory,
ma ho un piccolo problemino, quando il blocco di memoria
che sto copiando č piů grande della destinazione, ovvero la destinazione
viene troncata.
Ora, a parte un sistema brutale di fare un ary(i) = string(len(ary(source),
"")
esiste qualche altra cosa di decente?
Ciao
Andrea

viene troncata.
Certo, altrimenti ti salta per aria tutto ;-)
Devi allocare lo spazio di destinazione necessario prima di copiare i
dati.
-- 
ciao, hal

Si ma la domanda era un'altra :)
Se esiste un sistema più pulito di
 ary(i) = string(len(ary(source)))
Ciao
Andrea

 ary(i) = string(len(ary(source)))
Allora pubblica il codice che usi realmente, specificando che cosa
vuoi davvero ottenere perche' cosi' come e' non compila:
String Function
Returns a Variant (String) containing a repeating character string of
the length specified.
The String function syntax has these named arguments:
Part 		Description 
number 		Required; Long. Length of the returned string. 
		If number contains Null, Null is returned. 
character 	Required; Variant. Character code specifying 
		the character or string expression whose first 
		character is used to build the return string. 
		If character contains Null, Null is returned.
-- 
ciao, hal

 
Da un post all'altro si e' perso un pezzo:
ary(i) = string(len(ary(source)),"")
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

ary(i) = string(len(ary(source)),"")
Grazie, max :-)
Purtroppo non compila lo stesso:
?String(4, "")
#5: Invalid procedure call or argument
Se, invece, era inteso come:
ary(i) = string(len(ary(source))," ")	' e' uno spazio
cioe' come se fosse:
ary(i) = string(Space(len(ary(source)))
Siamo ancora fuori da una logica corretta di programmazione, ma, si
sa, visual basic permette di tutto.
Voglio dire che si dovrebbe caso mai non scrivere mai piu' di quanto
possa contenere la memoria di destinazione.
Sembra, comunque che in questo caso l'OP voglia scrivere tanti spazi
quanti sono i caratteri che compongono ary(source), quindi ary()
dovrebbe essere di tipo String (ma l'OP non lha detto).
Nel post iniziale si accennava inoltre circa l'uso di CopyMemory(), il
famoso alias di RtlMoveMemory(). Ora, usare una funzione del genere
con variabili di tipo String e' pericolosetto.
IMHO, Andrea ci deve dire cosa fa davvero.
-- 
ciao, hal

Come al solito ho sempre problemi nel postare codice,
perchè la macchina dove ho internet è staccata fisicamente
dalla rete, comunque la faccenda si riassume così:
Array di n posizioni di tipo stringa.
supponi:
ary(0) = "ciao"
ary(1) = "bau bau"
se io faccio un copy memory da ary(1) su ary(0) il risultato
perchè non ridimensiono la larghezza di ary(0) sarà
ary(0) = "bau "
Ok? bene allora io prima di fare il copymemory faccio
ary(0) = string(len(ary(1)), " ")
E a me funziona ... con tanto di array e tutto quanto ...
mi "geppeffava" prima quando usavo la varptr per beccare
gli indirizzi di memoria dell'array, ma da quanto ho sostituito
con un strptr, tutto è andato bene.
Ciao
Andrea

ary(0) = string(len(ary(1)), " ")
A questo punto mi domando se valga la pena usare la CopyMemory,
perche' devi comunque riallocare la memoria ogni volta per ogni 
item.
Hai misurato la differenza di prestazioni con e senza CopyMemory?
-- 
ciao, hal

>Hai misurato la differenza di prestazioni con e senza CopyMemory?
Veramente no ...  ed in effetti hai ragione ... se ne potrebbe fare
a meno sostituendo con un ary(0) = ary(i)
tutto sommato l'operazione l'ha faccio una volta ogni x secondi ...
e anche la zeromovememory per segare un array sarebbe poco utile
in questo caso ... perchè comunque ho notato che sega il contenuto
e non ridimensiona l'array come credevo ...
Ciao
Andrea

e non ridimensiona l'array come credevo ...
La ZeroMemory() riempie di NULL il blocco di memoria, mentre l'array
di visual basic e' un po' particolare. In realta' e' una struttura che
si chiama SAFEARRAY:
typedef struct FARSTRUCT tagSAFEARRAY {
   unsigned short cDims;       // Count of dimensions in this array.
   unsigned short fFeatures;   // Flags used by the SafeArray
                        // routines documented below.
#if defined(WIN32)
   unsigned long cbElements;   // Size of an element of the array.
                        // Does not include size of
                        // pointed-to data.
   unsigned long cLocks;      // Number of times the array has been 
                        // locked without corresponding unlock.
#else
   unsigned short cbElements;
   unsigned short cLocks;
   unsigned long handle;      // Used on Macintosh only.
#endif
   void HUGEP* pvData;             // Pointer to the data.
   SAFEARRAYBOUND rgsabound[1];      // One bound for each dimension.
} SAFEARRAY;
Se e' per scopi didattici va bene, ma se si tratta di software
commerciale eviterei giochi strani, perche' si rischia la portabilita'
da una versione di windows all'altra e l'eventuale conversione in
versioni successive del linguaggio. Vabbe' che con il vb6 siamo
arrivati al capolinea del vecchio basic...
-- 
ciao, hal

 E a me funziona ... con tanto di array e tutto quanto ...
Sì, ma non ti conviene semplicemente copiare il puntatore alla stringa 
contenuto in ary(1) anzichè l'intera stringa puntata con riallocazione 
della destinazione?
Ciao