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 - Problema conversione tra tipi non
Forum - Pascal - Problema conversione tra tipi non "comuni"

Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
Ciao a tutti, scrivo questo messaggio perché ho un problema con un programma in Pascal.

[spoiler]
Già so che molti di voi diranno: usa C!
Io già lo uso, ma voglio fare qualcosa di grande anche col filosofo francese :D
[/spoiler]

In questo programma ho la necessità di convertire alcuni bytes tratti da un file in una stringa di testo.

Sapendo che le stringhe sono dei piccoli vettori, mi sono ingegnato e ho trovato una mia soluzione, che ovviamente non funziona: il programma si pianta proprio in quel punto (l'ho scoperto inserendo dei messaggi di conferma (checkpoint) in certi punti e non ottengo quello di questa funzione).

Se quello che ho fatto è una cavolata vi prego di essere pazienti, non sono ancora un esperto.

Vorrei chiedervi che modifiche devo fare a questo pezzo di codice o cosa devo fare se è tutto sbagliato, per convertire un array (o dei bytes letti singolarmente) in una stringa.

oltre ai commenti ho inserito delle note, indicate con un numero tra parentesi, riportate dopo il codice.

Codice sorgente - presumibilmente Delphi

  1. Var     ini: file of char;   (*file di configurazione*)
  2.         bytes: char;    (1)  (*un singolo byte letto dalla rom o da ini*)
  3.         bytescamotage: byte; (*mi serve per fregare quello stupido compilatore*)
  4.         percorso: String;    (*percorso del file da leggere*)
  5.  
  6. [ . . . ]
  7.  
  8.  seek (ini, 76); (*legge il nome del file da aprire in seguito*)
  9.  i:=0;
  10.  if autoload=true then (2)
  11.  begin
  12.   repeat
  13.    read (ini, bytes); (*legge il byte*)
  14.    if not ((bytes=#13) or (bytes=#10)) then (3)
  15.     begin
  16.      percorso[i]:=bytes  (*è qui che ho fatto la cavolata, vero?:rotfl:*)
  17.     end;
  18.    i:=i+1;
  19.   until eof; (4)
  20.  end;



NOTE:

1 - sono stato costretto a cambiare da byte a char perchè mi dava vari errori. poi ho dovuto fare un
     impiego massivo di # e ord()  :D
2 - una funzione del programma che non vi deve influenzare: sul file settings.ini un byte è 0 o 1 se il
     programma deve caricare automaticamente il file segnato all'offset 76 del file settings.ini stesso.
     devo convertire tale nome su file in stringa da assegnare a percorso che poi userò per aprire il file
3 - se non è file di linea scrivi in percorso il carattere letto in precedenza dal file.
4 - non posso mettere eol perchè è nella unità "system" che il compilatore mi dice non esistere :-?

---


grazie e buonasera.


Ultima modifica effettuata da il 29/07/2014 alle 20:51
PM Quote
Avatar
Goblin (Member)
Expert


Messaggi: 375
Iscritto: 02/02/2011

Segnala al moderatore
Postato alle 23:37
Martedì, 29/07/2014
Premetto che non  ho capito niente :d:d
comunque dato che giochi con char e stringhe io la linea incriminata la sostituirei con un semplice :
percorso := Percorso + bytes;
e lascio al compilatore incrementare lo spazio.
Se proprio vuoi usare gli indici allora le stringhe in pascal non sono 0 based ma partono da 1 e di volta in volta devi alloccare spazio dunque il tuo pezzo di codice diventa qualcosa del genere
Codice sorgente - presumibilmente Plain Text

  1. i := 1;
  2. ....
  3. setlength(percorso, i);
  4. percorso[i]:=bytes;
  5. ...



a meno che tu non usi il compilatore XE6 di Embarcadero allora puoi settare la direttiva {$ZEROBASEDSTRINGS ON}, ma per questo ti rimando alla pagina:  http://docwiki.embarcadero.com/RADStudio/XE6/en/Zero-based ...;


Ultima modifica effettuata da Goblin il 29/07/2014 alle 23:39


Ibis redibis non morieris in bello
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 12:14
Mercoledì, 30/07/2014
che bello trovare gente disponibile ad aiutarti!

giuro che se funziona appendo in camera un quadro col tuo profilo! ahah a parte gli scherzi, non ci avevo nemmeno pensato a quella cosa che in realtà è semplicissima! -.-' :k:

Codice sorgente - presumibilmente Plain Text

  1. percorso:=percorso + bytes

!!!

cercherò di spiegarmi meglio:

ho una ROM GBA da modificare in alcune parti, ma siccome usando manualmente il semplice Hex editor diventerei scemo, data la mole di bytes da modificare (centinaia), volevo appoggiarmi ad un programma creato da me.
siccome ho anche intenzione di postare il programma su un forum esterno per farmi bello, volevo che fosse più user-friendly. così è iniziata l'odissea dell'aggiunta di features: ciò dimostra, in barba ai detrattori, che anche pascal è degno di un progetto di media grandezza (ovviamente medio rispetto alle mie attuali competenze, e considerando comunque programmi piccoli come quelli che trovi qui come grado massimo, non certo software professionali tipo micro$oft o adobe!!! :rotfl: ).

una feature è dunque "l'autocaricamento"  del file, il cui nome è contenuto nel file settings.ini. per questo dovevo leggere i byte singolarmente e metterli in una stringa.

ho risolto grazie a te e un po' di ingegno, attraverso varie peripezie, alcune addiritura inspiegabili.

ecco il codice finale:

Codice sorgente - presumibilmente Delphi

  1. if autoload=true then
  2.  begin
  3.   percorso:=''; (1)
  4.   seek (ini, 76);
  5.   repeat
  6.    read (ini, bytes);
  7.    percorso:=percorso+bytes;
  8.    writeln ('aggiunta nome percorso');
  9.    delay (100);
  10.   until eof(ini); (2)
  11.  end;




1 - non so perchè (una delle peripezie cui accennavo) ma per qualche arcano motivo mi dava l'intero path dalla
     radice del disco C, invece del percorso relativo, perciò ho tagliato corto, azzerando brutalmente la stringa.
2 - non è ottimizzato, in quanto non prevede la fine della riga ma solo quella del file. investigherò su cosa
     possa accadere in tal caso
     (è bello vedere i bug/glitch nel tuo programma se VOLONTARIAMENTE e CONTROLLATI, non è vero?)

grazie 10000:k:


edit:
l'unico errore riscontrato a causa della mancanza del controllo di fine riga è che non trova il file, semplicemente perchè i i nomi dei file non hanno i caratteri di fine riga! ;) meglio quindi non andare a complicare le cose che vanno già bene così.

Ultima modifica effettuata da il 30/07/2014 alle 13:21
PM Quote