Newsgroup: it.comp.lang.vo-clipper
Titolo: convertire una stringa in un array

Ciao a tutti,
secondo voi è possibile convertire una stringa in un array?
Esempio
Local aMioArray as array
Local cMiaStringa as string
cMiaStringa := "{1,2,3,4}"
aMioArray:= FunzioneCheConverteStringaInArray(cMiaStringa)
come posso fare?
Grazie a tutti
Roberto

Roberto,
uso Fab Tools o VO25Lib.
http://www.fabtoys.net/
VOForum Library: 
http://www.knowvo.com/
Là ritrovamento qualcosa gradite:
FUNCTION String2Array( sString , sSep  ) AS ARRAY
/*
Convert a delimited string to an array, using a separator.
 String2Array( "One, Two,, Four", "," )
 --> { "One", "Two", "", "Four" }
*/
 LOCAL aRetVal   AS ARRAY
 LOCAL wPos    AS WORD
 LOCAL sVal    AS STRING
 //
 Default(@sSep,",")
 aRetVal := {}
 //
 IF ( SLen( sString ) > 0 )
  WHILE .T.
   wPos := At2( sSep, sString )
   IF ( wPos > 0 )
    sVal := SubStr3( sString, 1, wPos - 1 )
    sString := SubStr2( sString, wPos + 1 )
    AAdd( aRetVal, AllTrim(sVal) )
   ELSE
    AAdd( aRetVal, AllTrim(sString) )
    EXIT
   ENDIF
  ENDDO
 ENDIF
RETURN aRetVal
Markus Feser

 ha scritto nel messaggio
news:aki0jc$1j3f3p$1...@ID-101553.news.dfncis.de...


 ha scritto nel messaggio
news:fm4b9.21348$ub2.3...@news1.tin.it...


 aMioArray:= MExec(MCompile( cMiaStringa ) )
questa soluzione mi fa pensare che si puo' 
semplicemente compilare un codeblock:
cMiaStringa := [{1,2,3,4,"danilo","pippo"}]
aMioArray := eval( &("{||"+cMiaStringa+"}") )
questa funzione anche con Clipper.
Ciao...
Claudio Driussi
http://www.swit.net/csoft
mailto:
cldr...@swit.net

 questa funzione anche con Clipper.
Giusto. Quindi sembra che le funzioni VO MExec() e MCompile() siano
equivalenti, rispettivamente, alla funzione Eval() e all'operatore macro
(&) del Clipper? Potete confermarlo? O le prime fanno qualcosa in più?
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg




 oServer := MExec(MCompile("MyServer{}"))
Scusa, non riesco a capire la sintassi
MyServer{}
In Clipper, se non vado errato, sarebbe un errore di sintassi. O no?...


 Clipper? Dai tuoi esempi non mi č chiaro.


 avessi scritto esplicitamente, a volte č molto comodo.
Ho capito. Sembra sia proprio come in Clipper con Eval() e operatore
macro (&). Anche qui, per quale motivo hanno preferito cambiare i nomi?



Anche qui non č proprio la stessa cosa, anche se la differenza č piů
sottile, le due funzioni aggiungono potenza il risultato puň essere
ulteriormente eseguito, guarda questo esempio:
cString := [oServer:MyMethod("]+cPara+[")]
Eval( MExec( MCompile( [{|oServer|] + cString + [}] )),SELF)
Non saprei come altro scrivere una cosa complessa come questa.


 Non saprei come altro scrivere una cosa complessa come questa.
Non vorrei correrci dentro, ma anche con clipper si fa.
con gli operatori macro si possono nidificare i codeblock finche si vuole,
ho visto cose simili lavorando con dbsetfilter e indexkey, dai un occhiata a
std.ch



std.ch
Effettivamente sono rimasto piacevolmente sorpreso dal fato che
Clipper supporti la ricorsione nei codeblock.  Purtroppo per le
"classi", mi riferisco a quelle definibili con le funzioni
__ClassXXX() ci sono delle limitazioni.  Personalmente,  ho potuto
constatare che la ascan() non funziona con oggetti referenziati
all'interno di un codeblock, costringendomi a scrivere ben 7 righe di
codice al posto di una.  Ok, forse era chiedere troppo !!!  ;-)
ciao, acc.   
a...@libero.it

 Non saprei come altro scrivere una cosa complessa come questa.
Credo sia fattibile anche in Clipper.


 codice al posto di una.  Ok, forse era chiedere troppo !!!  ;-)
Un piccolo esempio di questo problema?


Un piccolo esempio di questo problema?
Ecco qua, __WN_Close() e' ovviamente un metodo della classe Window:
// Elimina finestra e ripristina lo schermo
func __WN_Close()
  local n, i
  // ripristina schermo
  restscreen(WINSAVE[3],WINSAVE[4],WINSAVE[5],WINSAVE[6],WINSAVE[1])
  setcolor(WINSAVE[2])			// colore
  setpos(WINSAVE[7],WINSAVE[8])	// posizione cursore
  setcursor(WINSAVE[9])			// stato cursore
  WINSAVE := NIL
// trova posizione dell'oggetto nella lista
//  i := ascan(_Wstk,,,{|w| w:Id == WINID })	// trova posizione
dell'oggetto nella lista
// !!! ASCAN() NON FUNZIA CON OGGETTI REFERENZIATI IN UN CODEBLOCK !!!
  i := len(_Wstk)	
  while (i > 0)
    if (_Wstk[i]:Id == WINID)
      exit
    end
    i--
  enddo
  if (i > 0)
    n := len(_Wstk)
    adel(_Wstk,i)		// rimuove l'oggetto dalla lista
    asize(_Wstk,--n)	// shrink
  end
return qself()
ciao, acc.   
a...@libero.it

 //  i := ascan(_Wstk,,,{|w| w:Id == WINID })
Hai sbagliato la sintassi della funzione ASCAN(). Eccoti un esempio
analogo perfettamente funzionante:
FUNCTION MAIN()
    LOCAL aGet := { GetNew( , , , "Var1" ),;
                    GetNew( , , , "Var2" ),;
                    GetNew( , , , "Var3" ),;
                    GetNew( , , , "Var4" ) }
    LOCAL cId := "Var3"
    LOCAL i
    FOR i = 1 TO LEN( aGet )
        IF aGet[ i ]:Name == cId; EXIT; ENDIF
    NEXT
    ? aGet[ i ]:Name
    i = ASCAN( aGet, { | oGet | oGet:Name == cId } )
    ? aGet[ i ]:Name
    RETURN NIL


    RETURN NIL
Non esattamente...
WINID e' #definito come: qself()[8], il problema e' che non e'
possibile usare questa forma, ma assegnare l'oggetto ad una variabile.
Cioe' bastava semplicemente scrivere:
o := qself()
 i := ascan(_Wstk,,,{|w| w:Id == o:Id })
Id e' una funzione di tipo get/set per la classe.
Forse e' anche possibile risolvere forzando la compilazione del
codeblock in fase di runtime, ma la soluzione precedente e'
preferibile.
ciao, acc.   
a...@libero.it

 i := ascan(_Wstk,,,{|w| w:Id == o:Id })
Non capisco perché continui ad utilizzare una sintassi sbagliata per la
funzione ASCAN(). Dalla Norton Guide del Clipper:
Syntax
    ASCAN(<aTarget>, <expSearch>,
       [<nStart>], [<nCount>]) --> nStoppedAt
Il codeblock deve, quindi, essere il secondo parametro, non il quarto
come nel tuo esempio.


come nel tuo esempio.
Aaarghhh...  Scusa Enrico, ma non me n'ero accorto, in pratica ho
usato il formato della ASORT() !!!   Che pollo ...
Va beh, se con quel formato la ASCAN() non trovava gli oggetti posso
anche capire, ma poteva almeno, che so' ... ordinarli no ?!?
A proposito delle API di win32 per la gestione dei files, ho fatto un
semplice esperimento, che prima scrive un file e successivamente lo
legge. Il file viene letto e scritto in modo sequenziale, utilizzando
la FileWrite() con blocchi di 4KB.  Stranamente e' piu' veloce la
scrittura rispetto alla lettura, ti risulta ?
Tanto per rimanere OT, sai se esiste il modo di disattivare la cache
del disco, o meglio, per invalidarla ?
ciao, acc.   
a...@libero.it

 del disco, o meglio, per invalidarla ?
Non saprei. Non ti basta qualcosa tipo la FlushFileBuffers()?


Non saprei. Non ti basta qualcosa tipo la FlushFileBuffers()?
No, quello effettua una "dbcommit()" ;-) o una sync per chi usa altri
sistemi.  A me servirebbe una funzione per resettare la cache del
filesystem, da interporre all'inizio di ogni test, per far in modo che
alla partenza ci siano sempre pari condizioni.
ciao, acc.   
a...@libero.it