Riccardo4444 (Normal User)
Newbie
Messaggi: 7
Iscritto: 21/12/2010
|
Voglio cercare di capire perché le mie due funzioni per trasformare un percorso normare in uno corto non funzionano. Eppure l'algoritmo a
me sembra a posto...
Comunque vi posto un esempio di programma commentato così forse mi potrete dare qualche dritta. Eccolo:
Codice sorgente - presumibilmente Delphi |
program prova; uses strutils; (* E' una libreria integrata nel compilatore per lavorare sulle stringhe *) var percorso:string; temporaneo:array[1..20] of string; x:integer; function concatena(ind:integer):string; begin if ind=x then concatena:=temporaneo[x] else concatena:=temporaneo[ind]+concatena(ind+1); (* Sapete la ricorsione, no? In questo modo concateno tutte le stringhe all'interno dell'array senza saperne con precisione il totale *) end; function nmcrt(s:string):string; var parte:string; begin x:=0; (* Il conto per l'indicizzazione dell'array parte da zero e poi... *) while s<>'' do begin x:=x+1; (* ad ogni tornata di ciclo while aumenta di uno, così da riempire mano mano l'array *) parte:=LeftStr(s,Pos(s,'\')); (* LeftStr copia una parte di stringa partendo da sinistra fino ad una posizione precisa, in questo caso quella dello \(backslash) nella stringa s, ovvero quella originale. Correggetemi se sbaglio: vedete quel dalete? Serve ad eliminare dalla stringa s quello che ho appena copiato nella variabile parte. Io però avrei volentieri usato Copy2StrDel(s,'\') al posto di LeftStr e delete, che copia in una variabile e cancella da quella d'origine una stringa partendo dall'inizio fino ad un dichiarato carattere, ma ho letto che il backslash non me lo integra, e così ho usato quest'altro metodo, ma dato che il programma non funziona stavo pensando se veramente LeftStr mi integra il backslash... *) delete(s,1,Pos(s,'\')); if Length(parte)>9 then begin delete(parte,7,Length(parte)-7); (* Se la lunghezza della pezzo di percorso che ho appena preso (la variabile parte) supera i nove caratteri (compreso il backslash), allora riduce a 6 e aggiungendo "~1\" (con il backslash, ovviamente) manda parte nell'indice x dell'array, chiamato temporaneo *) temporaneo[x]:=parte+'~1\'; end else temporaneo[x]:=parte; (* Altrimenti, se la sua lunghezza rientra nella norma, lo manda direttamente in temporaneo *) end; (* Qui si ripete finché non finisce la stringa s, ovvero quando il ciclo while ha finito di elaborare tutte le cartelle *) if x<>0 then nmcrt:=concatena(1); (* Adesso che l'array è stato riempito abbastanza (a proposito, ho messo un massimo di 20 cartelle, poiché non penso che i percorsi sino tanto lunghi...), il volore restituito dalla funzione principale, nmcrt, dipende tutto da c o ncatena, che mette insieme tutti i pezzi del percorso che gli sono stati inviati dal ciclo while *) end; begin writeln('Inserisci un percorso: '); readln(percorso); writeln(); writeln('Va scritto così: ',nmcrt(percorso)); readln(); end.
|
L'ho provato centinaia di volte, eppure non ne vuole sapere di restituirmi la stringa formattata.
Sapete però che quando immetto una stringa non vuota un battito di ciglio prima che il programma si chiuda automaticamente,
quest'ultimo mi restituisce un messaggio di errore e io sono riuscito, dopo circa 40 apri/chiudi, a decifrarlo? Assomiglia a questo:
An unhandled exception occured at (numero preceduto da $, credo che sia esadecimale):
ERangeError : Range check error
(numero esadecimale)
(altro numero esadecimale)
Subito sotto poi appare lo spazio vuoto con il mio 'Va scritto così: ', ma senza risultato della funzione. Che significa tutto ciò? Per favore, datemi una mano.
Ultima modifica effettuata da Riccardo4444 il 05/01/2011 alle 17:24 |