Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - Funzione Nome Corto
Forum - Pascal - Funzione Nome Corto

Avatar
Riccardo4444 (Normal User)
Newbie


Messaggi: 7
Iscritto: 21/12/2010

Segnala al moderatore
Postato alle 17:21
Mercoledì, 05/01/2011
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

  1. program prova;
  2. uses strutils; (* E' una libreria integrata nel compilatore per lavorare sulle stringhe *)
  3. var percorso:string;
  4.     temporaneo:array[1..20] of string;
  5.         x:integer;
  6.  
  7. function concatena(ind:integer):string;
  8.   begin
  9.  
  10.    if ind=x then
  11.     concatena:=temporaneo[x]
  12.    else
  13.     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 *)
  14.  
  15.   end;
  16.  
  17.  function nmcrt(s:string):string;
  18.  var parte:string;
  19.  
  20.    begin
  21.  
  22.     x:=0; (* Il conto per l'indicizzazione dell'array parte da zero e poi... *)
  23.  
  24.     while s<>'' do
  25.          begin
  26.       x:=x+1; (* ad ogni tornata di ciclo while aumenta di uno, così da riempire mano mano l'array *)
  27.       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.
  28.                                            Correggetemi se sbaglio: vedete quel dalete? Serve ad eliminare dalla stringa s quello che ho appena copiato nella variabile parte.
  29.                                                                            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,
  30.                                                                            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... *)
  31.       delete(s,1,Pos(s,'\'));
  32.        if Length(parte)>9 then
  33.         begin
  34.          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
  35.  nell'indice x dell'array, chiamato temporaneo *)
  36.          temporaneo[x]:=parte+'~1\';
  37.         end
  38.        else
  39.         temporaneo[x]:=parte; (* Altrimenti, se la sua lunghezza rientra nella norma, lo manda direttamente in temporaneo *)
  40.      end; (* Qui si ripete finché non finisce la stringa s, ovvero quando il ciclo while ha finito di elaborare tutte le cartelle *)
  41.  
  42.          if x<>0 then
  43.       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
  44. o
  45. ncatena, che mette insieme tutti i pezzi
  46.                                 del percorso che gli sono stati inviati dal ciclo while *)
  47.  
  48.    end;
  49.  
  50.  begin
  51.   writeln('Inserisci un percorso: ');
  52.   readln(percorso);
  53.   writeln();
  54.   writeln('Va scritto così: ',nmcrt(percorso));
  55.   readln();
  56.  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
PM
Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 20:48
Mercoledì, 05/01/2011
scusa ma non ho ben capito cosa intendi per "nome corto"... Cioè dato un percorso come
"C:\Windows\System32\Drivers\Etc\"
Cosa "dovrebbe" restituirti il programma? "Etc\"?


PS: l'errore è il seguente:

Testo quotato

An unhandled exception occurred at $004017C7 :
ERangeError : Range check error
  $004017C7
  $00401926


PM