PDA

Visualizza la versione completa : [C++] differenze tra string, String, AnsiString


misterx
09-03-2013, 20:51
ho letto un po qua e la il manuale di Borland Builder 6.0 ma ancora non ho trovato dove spiega le deffierenze ed eventuali pro e contro nell'uso di tali tipi di dati, sempre se così si può definirli.

String str;
ad esempio se lo si dichiara, non si capisce se è un puntatore e pensa automaticamente la VCL ad allocare tutta la memoria necessaria a contenere ad esempio un testo di dimensioni infinite e, successivamente, se la sua deallocazione avviene solo dopo la chiusura del programma che l'ha allocata.

Insomma, se qualcuno ha esperienza di tali tipi e ha voglia di raccontarmi qualcosa lo ringrazio sin da subito, nel frattempo continuo a leggere il manuale :)

Alex'87
09-03-2013, 21:13
C'è un motivo particolare per cui usi la versione 6? E' vecchia di 10 anni...

misterx
09-03-2013, 21:22
l'ho installato per impararci qualcosa e con esso ho sviluppato molti programmi ma usando più che altro le funzioni del C, malloc() realloc() et similia; uso BCB6 più che altro per una abitudine.

So che ora si chiama embarcadero e credo sia compatibile con tutti i miei progetti, almeno spero, ma sinceramente sino a quando non trovo limiti non mi dispiace usarlo.

ESSE-EFFE
10-03-2013, 16:29
Originariamente inviato da misterx
String str;
ad esempio se lo si dichiara, non si capisce se è un puntatore
Non è un puntatore.


Originariamente inviato da misterx
e pensa automaticamente la VCL ad allocare tutta la memoria necessaria a contenere ad esempio un testo di dimensioni infinite
Certo, anche se la dimensione non può essere infinita ovviamente.


Originariamente inviato da misterx
e, successivamente, se la sua deallocazione avviene solo dopo la chiusura del programma che l'ha allocata.
Avviene nel caso in cui la variabile esca dallo scope o quando le condizioni lo richiedono/consentono.

misterx
10-03-2013, 18:11
quindi scusa, ipotizzando che il codice che ho scritto direttamente qui funzioni potrei invece riscrivelo come sotto


int Size = Socket->ReceiveLength();
char *Buf = (char *)malloc(Size * sizeof(char *));
int ByteRecived = Socket->ReceiveBuf(Buf, Size);
Buf[Size] = '\0';

if(Size > 0)
{
Buffer = (char *)realloc(Buffer,strlen(Buffer) + Size );
strcat(Buffer,Buf);
free(Buf);
}



senza occuparmi dell'allocazione di memoria?



int Size = Socket->ReceiveLength();
String Buf;
int ByteRecived = Socket->ReceiveBuf(Buf, Size);

if(Size > 0)
{
String Buffer;
Buffer=Buffer+Buf;
}


Il Buffer poi lo si eliminerebbe con un delete [] Buffer; pur non avendo usato loperatore new oppure è sufficiente il riutilizzo (richiamo della stessa funzione) per deallocare automaticamente il Buffer?

ESSE-EFFE
10-03-2013, 21:49
Originariamente inviato da misterx
quindi scusa, ipotizzando che il codice che ho scritto direttamente qui funzioni potrei invece riscrivelo come sotto
Trascurando errori e controlli mancanti, direi di sì.


Originariamente inviato da misterx
senza occuparmi dell'allocazione di memoria?
Certo, il vantaggio di avere un classe stringa è anche quello.


Originariamente inviato da misterx
Il Buffer poi lo si eliminerebbe con un delete [] Buffer; pur non avendo usato loperatore new oppure è sufficiente il riutilizzo (richiamo della stessa funzione) per deallocare automaticamente il Buffer?
Già spiegato nel messaggio precedente. Si dealloca quando la variabile esce dallo scope di validità.


Originariamente inviato da misterx


int Size = Socket->ReceiveLength();
String Buf;
int ByteRecived = Socket->ReceiveBuf(Buf, Size);

if(Size > 0)
{
String Buffer;
Buffer=Buffer+Buf;
}


La ReceiveBuf vuole un void * come primo parametro, quindi questo codice non è compilabile. Ad ogni modo, in questo caso particolare, penso ti basti una riga:


Buffer += Socket->ReceiveText();

misterx
11-03-2013, 09:28
sto provando a ristrutturare il mio programma misto C/C++ visto che non ho quasi mai sfruttato le potenzialità della VCL.

Il programma che sto scrivendo è semore in ascolto su una particolare porta ed usando tale funzione:

Buffer += Socket->ReceiveText();
alla quale ho aggiunto la seguente riga per comprendere cosa accade:
Label1->Caption=Buffer.Length();

La dimensione di Buffer continua a crescere: c'è un modo per liberare lo spazio occupato da Buffer per un successivo utilizzo?

ESSE-EFFE
11-03-2013, 10:35
Originariamente inviato da misterx
La dimensione di Buffer continua a crescere:
Ovvio, stai accodando di volta in volta i byte ricevuti.


Originariamente inviato da misterx
c'è un modo per liberare lo spazio occupato da Buffer per un successivo utilizzo?
Senza vedere del codice è difficile dare una risposta, ma se ho capito cosa intendi puoi riutilizzare Buffer senza preoccuparti dello spazio occupato precedentemente.

misterx
11-03-2013, 10:42
// dichiarato globale
String Buffer;


void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
Buffer+=Socket->ReceiveText();
Label2->Caption=Buffer.Length();


if (strstr(Buffer.c_str(), ",ENDMESSAGE;")
Memo1->Text=Buffer;
}

purtroppo eseguendo n avvi di messaggi al server il Memo ogni volta presenta il testo troncato nel senso che manca la parte finale ,ENDMESSAGE;.

Forse sbaglio a dichiarare il Buffer come globale?

ESSE-EFFE
11-03-2013, 11:11
Originariamente inviato da misterx
Forse sbaglio a dichiarare il Buffer come globale?
Dipende da cosa deve fare il programma. Il codice che hai postato non è compilabile, ma ad ogni modo mi pare che stiamo andando OT rispetto al discorso String/AnsiString.

Loading