Newsgroup: it.comp.lang.delphi
Titolo: NEWBIE: Array Char -> String

Ciao!
Sono totalmente nuovo al Delphico ambiente quindi "abbiate pietà"! :)
Mettiamo che io debba usare un record di questo tipo:
Type
  TTest = record
    Numero1: integer;
    Nome1: array[1..20] of char;
    Numero2: integer;
  end;
Per accedere ad un file typed strutturato in quel modo. 
Una volta letto un record con BlockRead, come posso trasferire Nome1 
che è un array di char in una string? L'assegnazione diretta mi da un 
errore di tipo incompatibile, e posso capire. Quello che mi interessa 
sapere è se devo farmi io un paio di funzioni a mano per trasferirmi 
l'array carattere per carattere o se c'è (come penso/credo/spero!) 
qualcosa di già fatto ovvero di più elegante. 
Grazie mille, ciao!

errore di tipo incompatibile, 
a me con D5 non da problemi, pero' penso di ricordarmi dal 4
che se l'array non lo dichiari come [0..x] non lo vede come pchar (e
quindi non riesce a converstilo in strighe pascal)
prova a dichiararlo così:
Nome1: array[0..19] of char;
Ciao,
Alan Solo

 Nome1: array[0..19] of char;
Intanto grazie per la risposta! :)
Tornando al prg... Anche dichiarandolo cosi, l'assegnamento diretto 
array := string non me lo lascia fare: 
Type
  TTest = record
    Numero1: integer;
    Nome1: array[0..15] of char;
    Numero2: integer;
  end;
Var
  Test: TTest;
  ToF: file;
  NumWrit: integer;
  Stri: string;
Begin
  Stri :=    '123456789012345';
  Test.Numero1 := 42; // :'-)
  Test.Numero2 := 42;
  Test.Nome1 := Stri;
 
ne
  Test.Nome1 := PChar(Stri);
Invece posso fare:
  StrPCopy(Test.Nom1, Stri);
Pero'... Io continuo a non trovarmi troppo con la gestione delle 
stringhe del DelphI! :) Nel senso che facendo cosi in quel cambo da 
16bytes ne posso far stare solo 15, perchč StrPCopy copia anche lo Zero-
terminatore finale. Vabbe'... :) 
Bye!

terminatore finale. Vabbe'... :) 
tieni presente che se i pchar sono stringhe null terminated e usano un
carattere aggiuntivo alla fine per determinarne la fine, le string
pascal usano un carattere (byte) all'inizio per determinarne la
lunghezza...come vedi qualcosa ci deve essere.. se no come fai? ;)
Ciao,
Alan Solo

lunghezza...come vedi qualcosa ci deve essere.. se no come fai? ;)
Non e' vero.
Le ansi string (le string per default) sono null terminated (in
Delphi).
--
Walkie...@Libero.It (ICQ# 8143647)

Delphi).
puo' essere (anzi sarà, mi confondo con il pascal)
volevo dire che qualche carattere per delimitare la stringa ci deve
essere, tutto lì...
fatto sta che la funzione Length restituisce semplicemente il primo
elemento della string ovvero Stringa[0]...
ma allora mi chiedo, sono null terminated *e* nel primo carattere
inoltre mettono la lunghezza? (forse per questioni di velocità)?
Ciao,
Alan Solo

inoltre mettono la lunghezza? (forse per questioni di velocità)?
Length non funziona sempre bene per le string. Meglio usare StrLen.
--
Walkie...@Libero.It (ICQ# 8143647)

> Length non funziona sempre bene per le string. Meglio usare StrLen.
In quale caso non va bene Length? Io ho sempre usato Length e non mi e' mai
sembrato di vedere casini. Sai com'e': sapere e' sempre meglio di non
sapere!
--
Giuseppe Fraddosio
fradd...@libero.it
fradd...@supereva.it

sapere!
con le stringhe null terminated, quelle del C per intenderci (i pchar)
Ciao,
Alan solo

pchar) 
concludo dicendo che, per esperienza, SEMPRE usare le String. I PChar 
vengono gestiti in un modo abominevole in Delphi, le String invece sono 
fantastiche (ma volete mettere la comodità di ritornare una stringa 
anzichè richiedere il puntatore al PChar di destinazione come 
parametro?)

parametro?)
sì, fatto sta pero' che le (praticamente tutte) API usano i pchar...
Ciao,
Alan Solo

parametro?)
Ripeto, ci sono casi e casi.
--
Walkie...@Libero.It (ICQ# 8143647)

Ripeto, ci sono casi e casi.
no, non ci sono "casi e casi", non è una *scelta* l'uso di String al  
posto di PChar, è una cosa dettata dalla necessità, esclusivamente

sì, fatto sta pero' che le (praticamente tutte) API usano i pchar...
@Mystring[1]
e la stringa diventa magicamente PChar
altre domande?

@Mystring[1]
8) effettivamente!
pero' se si devono usare i pchar perche' non usarli da subito...
perche' dici che sono gestiti in "modo abominevole"?
Ciao,
Alan Solo

posto di PChar, è una cosa dettata dalla necessità, esclusivamente
Ripeto.  Ci sono casi e casi.  
Ci sono casi in cui e' impossibile utilizzare le String (vedi,
appunto, la scrittura di DLL o l'interfacciamento ad API di sistema).
--
Walkie...@Libero.It (ICQ# 8143647)

altre domande?
Il metodo piu' corretto e' PChar( MyString )
--
Walkie...@Libero.It (ICQ# 8143647)

Il metodo piu' corretto e' PChar( MyString )
sě, infatti, molto meglio un cast,
cmq effetivamente puntando al primo valore dell'array
si ottiene appunto un pchar...
non ho ancora capito pero' perchč le string sono "migliori"...
Ciao,
Alan Solo

non ho ancora capito pero' perchč le string sono "migliori"...
Non esiste un tipo di dati oggettivamente migliore di un altro.
Bisogna vedere in che contesto vengono utilizzati.
I PChar possono essere migliori delle String in molti contesti.
--
Walkie...@Libero.It (ICQ# 8143647)

Ottieni un bell'errore in compilazione.
gią, strano, un pchar dovrebbe essere semplicemente un pointer... un
pointer a char, pero' pur sempre un pointer...boh..
Ciao,
Alan Solo

pointer a char, pero' pur sempre un pointer...boh..
No, una cosa e' puntatore generico, una cosa e' puntatore a un tipo
particolare.  
--
Walkie...@Libero.It (ICQ# 8143647)

Il metodo piu' corretto e' PChar( MyString )
hmmm... qui FreePascal mi da' "Invalid typecast", è la tua risposta 
definitiva? la accendiamo?

sistema)
no, non sono casi, sono scelte obbligate. Non c'è un "caso" in cui i 
PChar funzionano meglio delle String, ci sono piuttosto contesti in cui 
i PChar *funzionano*, e le String no



Non mi piace. 
Molto meglio usare il tanto bistrattato typecastyng e fare
PChar(MyString).
Massimo.
-- 
"Ciao Rex, che cavolo di situazione eh? Due dentro, due fuori, puo' succedere di tutto!"


Ops... ho scritto prima di leggere la risposta di WalkieTalkie che era
uguale. Chiedo venia.


il C li gestisce meglio. Prova a negarlo e ti trombo la nonna
Dalla mia esperienza direi che i PChar sono gestiti in modo uguale: ne
meglio ne peggio. (se vuoi trombarti mia nonna: in bocca al lupo :) )
Massimo.


definitiva? la accendiamo?
Che cavolo c'entra FreePascal ?
In Delphi, il cast e' la forma corretta di conversione.
--
Walkie...@Libero.It (ICQ# 8143647)

no, non sono casi, sono scelte obbligate. 
Va bene, hai ragione.
--
Walkie...@Libero.It (ICQ# 8143647)

Va bene, hai ragione.
e vorrei anche vedere :P

Che cavolo c'entra FreePascal ?
io uso due compilatori. O usi {$ifdef} a ripetizione o programmi codice 
portabile

portabile
Qui dentro si parla di Delphi, quindi sei pregato di adeguarti.
--
Walkie...@Libero.It (ICQ# 8143647)

e vorrei anche vedere :P
Forse non hai capito il senso di quell'affermazione.......
Ciao ciao...
--
Walkie...@Libero.It (ICQ# 8143647)

Forse non hai capito il senso di quell'affermazione.......
sei sicuro che io non abbia capito? ripeto, estraiti quel piede dalla 
bocca, non puoi continuare così

Qui dentro si parla di Delphi, quindi sei pregato di adeguarti.
già. Di Delphi. Non di C
saludos

bocca, non puoi continuare così
Hyperion, non stai parlando con tua sorella, cerca di darti una
calmata e di tornare a parlare di argomenti On-Topic.
--
Walkie...@Libero.It (ICQ# 8143647)

già. Di Delphi. Non di C
SVEGLIATI !
Sei tu che hai tirato fuori il C, NON IO.
--
Walkie...@Libero.It (ICQ# 8143647)

altro.
Lascia stare..., dubito sappia di che stai parlando...
--
Walkie...@Libero.It (ICQ# 8143647)

Pascal
scusa, ti pare che io parlassi seriamente?

Sei tu che hai tirato fuori il C, NON IO.
no, non sono stato io. E' stato MSX. E tu ne hai fatto un caso

calmata e di tornare a parlare di argomenti On-Topic
se proprio ci tieni...
type
  TAndreaLaforgia = class(TObject)
    private
      m_FootInMouth: Boolean;
    public
      property FootInMouth: Boolean read m_FootInMouth;
  end;
  TWalkieTalkie = AndreaLaForgia;
var
  WalkieTalkie: TWalkieTalkie;
begin
  WalkieTalkie:= TWalkieTalkie.Create;
  WalkieTalkie.FootInMouth:= False;
[...]
acc... così non funziona...



Boh. Sai, spesso e' difficile da un messaggio capire se uno e'
serio,scherza, e' ironico, cinico, caustico o altro.
L'impressione, anche rileggendo, era quella. 
Comunque, l'ultima cosa che cerco e' di essere tirato dentro la vostra
flame :-)
Masismo.


  TAndreaLaforgia = class(TObject)
*PLONK*
--
Walkie...@Libero.It (ICQ# 8143647)

no, non sono stato io. E' stato MSX. E tu ne hai fatto un caso
*PLONK*
--
Walkie...@Libero.It (ICQ# 8143647)

*PLONK*
Andrea, non è diventato stranamente silenzioso questo newsgroup?

*PLONK*
Ah, la tauromachia

vostra flame :-)
estinta :)