Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 16 su 16
  1. #11
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    @BigBoss.
    No. Il const serve perché qui:
    codice:
     
    const char scritta[] = { "Saluda Andonio!" }
    stai assegnando una stringa literal e pertanto non più modificabile. La versione senza const è un residuo di retro compatibilità col C che può dare errori se tenti di modificare la stringa successivamente. Il fatto che un array decada in un puntatore quando lo passi a funzione avviene a prescindere dal const (succede dai tempi del C).

    @Gardo.
    Per il primo quesito. Passare lo stesso buffer a CharToOemBuff() può dare problemi in caso la stringa sia di wchar_t invece che char.
    https://msdn.microsoft.com/it-it/lib...(v=vs.85).aspx
    ReturnValue.
    In caso si espliciti l'uso dei char con CharToOemBuffA() questo non avviene (almeno la documentazione non lo riporta), ma se si vuole adattare lo stesso codice usando i wchar_t e CharToOemBuffW() la funzione da errore.
    Personalmente non amo i casi border line, per cui uso un secondo adeguato buffer.

    Per il secondo quesito.
    Si ma io passo grandezza che è la dimensione in byte dell'array
    Significa poco. In un contesto generale la dimensione dell'array può essere molto più grande dei caratteri effettivamente contenuti. Per quello usare sizeof() su un buffer di char usati come ASCIIZ string stile C è sbagliato.
    Se si stanno usando array di char volendoli pensare come ASCIIZ string C si devono usare le apposite funzioni. Diversamente è solo un array di char che può contenere qualsiasi cosa.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  2. #12
    Utente di HTML.it
    Registrato dal
    Aug 2016
    Messaggi
    16
    Ok grazie mille !! Mi piace molto il forum perché si può veramente imparare tantissimo da utenti molto più esperti di me

  3. #13
    @shodan, ne sai un bel po' direi! In pratica devo fare molta attenzione al fatto che, in C++, ogni volta che chiamo una funzione e le fornisco un certo input, la funzione agisce un realtà su una copia dell'argomento: di conseguenza, è molto comodo dichiarare una variabile dentro la stessa routine stampa_converti, dentro cui memorizzare la stringa convertita e stamparla. Ora volevo chiedere, come mai questo codice funziona:

    codice:
    #include <iostream>
    #include <Windows.h>
    
    void stampa_converti(char strano[]);
    
    using namespace std;
    
    int main() {
        const char scritta[] = { "Saluda Andonio!" }; //creo il mio array inizzializzandolo con la tua frase
        char strano[] = { "èéàòù perchééé" };
        stampa_converti(strano);
        system("pause");
        
    }
    
    void stampa_converti(char strano[]) {
        char res1[4096] = { 0 }; // buffer di conversione grande 4096 byte
        CharToOemBuffA(strano, res1, sizeof(res1)); //conversione totale dalla stringa a res1, con dimensioni di res1
        cout << res1 << endl; //stampa correttamente con la codifica OEM
    }
    Mentre questo NON funziona:

    codice:
    #include <iostream>
    #include <Windows.h>
    
    void stampa_converti(char strano[]);
    
    using namespace std;
    
    int main() {
        const char scritta[] = { "Saluda Andonio!" }; //creo il mio array inizzializzandolo con la tua frase
        char strano[] = { "èéàòù perchééé" };
        stampa_converti(strano);
        system("pause");
        
    }
    
    void stampa_converti(char strano[]) {
        char res1[4096] = { 0 }; // buffer di conversione grande 4096 byte
        CharToOemBuffA(strano, strano, sizeof(strano)); //conversione totale dalla stringa da strano a strano, con dimensioni di strano
        cout << strano << endl; //stampa errata
    }
    ?

    Inoltre, l'utilizzo delle parentesi graffe nella dichiarazione const char è obbligatorio?

  4. #14
    @Gardo, quoto e ringrazio anche te, da solo non sarei riuscito facilmente a risolvere quel simpatico codice =D

  5. #15
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Mentre questo NON funziona:
    L'ho spiegato prima.
    Prova a modificare così:
    codice:
    void stampa_converti(char strano[]) {
        char res1[4096] = { 0 }; // buffer di conversione grande 4096 byte
        CharToOemBuffA(strano, strano, sizeof(strano)); //conversione totale dalla stringa da strano a strano, con dimensioni di strano
        cout << sizeof(strano) << endl;
        cout << strano << endl; //stampa errata
    }
    e vedi se i caratteri derivanti da sizeof(strano) coincidono con quelli che vuoi convertire.
    Il sizeof(res1) funziona perché res1 non è un puntatore, ma un vero array.

    codice:
    Inoltre, l'utilizzo delle parentesi graffe nella dichiarazione const char è obbligatorio?
    Si, dal momento che stai assegnando un literal (che non è modificabile successivamente).
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  6. #16
    La riga con sizeof(strano) stampa "4" nella shell, appunto la dimensione del puntatore, e ci sono. Il codice che mi hai consigliato di provare in effetti stampa caratteri sbagliati rispetto al precedente. Perciò quando vorrei stampare la stringa intera strano, in realtà stampo solo il contenuto del puntatore (che dipende dalla dimensione di questo). Le prime quattro lettere accentate sono giuste, quindi, se per ipotesi potessi scegliermi la dimensione del puntatore e imporla pari a 5, otterrei "èéàòù" nella shell. Aggiungendo una riga con cout << sizeof(res1) appare invece 4096, appunto la dimensione in byte del buffer res1. La cosa interessante è che adesso, provando a modificare ad esempio a 6, 7, 8 ecc il numero di byte di res1, ottengo via via più lettere della stringa (con caratteri corretti) stampati a console!

Tag per questa discussione

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.