Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577

    [C++] differenze tra string, String, AnsiString

    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

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    C'è un motivo particolare per cui usi la versione 6? E' vecchia di 10 anni...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    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.

  4. #4

    Re: [C++] differenze tra string, String, AnsiString

    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.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    quindi scusa, ipotizzando che il codice che ho scritto direttamente qui funzioni potrei invece riscrivelo come sotto
    codice:
    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?

    codice:
    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?

  6. #6
    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
    codice:
    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:
    codice:
    Buffer += Socket->ReceiveText();

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    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?

  8. #8
    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.

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    // 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?

  10. #10
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.