Newsgroup: it.comp.lang.delphi
Titolo: aiuto funzione pos

ciao a tutti...ho un problema (forse banale)
io devo trovare in una stringa il carattere "," e deve restituirmi l'indice.
Quindi la funzione pos va benissimo.
Ma la cosa non funziona se nella stringa in questione contiene piu' di una
virgola.
Infatti se la funzione pos la metto dentro un ciclo mi riporta sempre
l'indice della prima virgola trovata.
io ho fatto:
while pos(',', exprStringa) > 0 do
         fineExpr[conta] := pos(',', Exprstringa);
dove :
- ExprStringa e' una stringa
- fineExpr[conta] e' un array che tiene la posizione finale della stringa
- conta e' un contatore.
Esiste una funzione che mi trova le virgole successive virgola nella
stringa, restituendomi sempre l'indice...Altrimenti come posso fare?!?
Grazie 1000

 stringa, restituendomi sempre l'indice...Altrimenti come posso fare?!?
Se quelo che cerchi è l'ultima virgola della stringa , puoi fare qualcosa
del tipo :
fineExpr[conta] = -1;    // Se in uscita non è cambiato, non c'erano
virgole....
for i:=length(exprStringa) downto 1 do
    if exprStringa[i] = ',' then begin
        fineExpr[conta] = i;
        break;
    end;
che significa partire dall'ultimo carattere della stringa e risalire
all'indietro fino a che non incontri la prima virgola (nel qual caso esci
dal ciclo con il break) o fino a che arrivi all'inizio della stringa.
Okkio che nelle stringhe delphi il primo byte ne indica la lunghezza.
Quindi se le vuoi utilizzare come un array, il primo carattere è l'elemento
1, e non lo 0.
Da questo consegue anche che il loop partirà (o finirà) sull'elemento
length(stringa), e non length(stringa)-1.
Spero sia utile.

 ha scritto nel messaggio
news:3c7d...@news.omniway.sm...

Se ti serve la posizione di tutte le virgole nella stringa potresti fare uno
scan della stringa qualcosa del tipo
for x:= 1 to length(ExprStringa) do
begin
  if ExprStringa[x] in ',' then
  begin
     fineExpr[conta] := x;
     inc(conta);
  end;
end;
se invece ti serve l'ultima virgola nella stringa come non detto ti hanno
già risposto
Saluti NEA

 Okkio che nelle stringhe delphi il primo byte ne indica la lunghezza.
Ehm... solo in quelle non dinamiche stile TP... nelle stringhe dinamiche
(espandibili fino a 4 Gb...o 2??) al carattere 0 non è possibile accedere...
consigliabile fare un Length(s) piuttosto che giocherellare con gli indici
negativi per ricavare la lunghezza.
Ciao
Matteo

Ciao
Se cerchi l'ultima virgola e basta puņ esserti d'aiuto la funzione
function LastDelimiter(const Delimiters, S: string): Integer;
Se guardi il codice della funzione potrebbe essere interessante per prendere
spunti sul come implementere il ciclo di analisi...
Ciao
Matteo

 negativi per ricavare la lunghezza.
Se leggi bene il post iniziale, fineExpr è un array di interi che memorizza
le posizioni dell'ultima virgola in (presumo) una lista di stringhe.
Il presettarlo a -1 è solo un sistema per testare, una volta usciti dal
ciclo, se sono state trovate virgole o meno, per non aggiungere l'utilizzo
di un valore bool (il classico Found) da settare sempre a false e poi a true
subito prima del break.
Nessun giocherello con gli indici negativi, che oltretutto avrebbe ben poco
senso.
Ciao.

 function LastDelimiter(const Delimiters, S: string): Integer;
oopps.... ma da quant'è che c'è..?
non si finisce mai di imparare.....
:-)