Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510

    [C]Dubbi su sizeof e cast implicito, miti da sfatare

    Consideriamo questa linea di codice:

    codice:
    char* buffer=(char*)malloc(100*sizeof(char));
    Ho due dubbi:

    1) Il cast implicito l' ho sempre usato per non avere warning dal compilatore.Ma so che c'è compatibilità di tipo per cui non è strettamente necessario.Ma può essere considerato un errore fare il cast pur essendo "inutile"?

    2)Il mio professore all' università ha sempre insistito perché usassimo sizeof(char), che potrebbe anche ritornare 2 su certe macchine.Ma da quel che vedo ritorna sempre 1, è necessario specificare sizeof(char)? Può comunque essere fatto per correttezza?

    Volendo riscrivere questa linea di codice come la riscrivereste nella maniera più corretta possibile?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462

    Re: [C]Dubbi su sizeof e cast implicito, miti da sfatare

    Originariamente inviato da Who am I
    1) Il cast implicito l' ho sempre usato per non avere warning dal compilatore.
    Probabilmente intendi il cast esplicito ...

    Originariamente inviato da Who am I
    Ma so che c'è compatibilità di tipo per cui non è strettamente necessario.Ma può essere considerato un errore fare il cast pur essendo "inutile"?
    No, non può essere considerato un errore.

    2)Il mio professore all' università ha sempre insistito perché usassimo sizeof(char), che potrebbe anche ritornare 2 su certe macchine.Ma da quel che vedo ritorna sempre 1, è necessario specificare sizeof(char)? Può comunque essere fatto per correttezza?
    Proprio perché *teoricamente* non sai quanto può essere grande un char, è corretto usare *sempre* il sizeof(char) come dice il tuo professore.

    Volendo riscrivere questa linea di codice come la riscrivereste nella maniera più corretta possibile?
    Non mi pare ci siano problemi con quella linea di codice.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3

    Re: [C]Dubbi su sizeof e cast implicito, miti da sfatare

    1) Quello è un cast esplicito. In C non è strettamente necessario (dato che void * ha una conversione implicita a qualunque tipo di puntatore), in C++ invece se non lo metti è un errore (non è un cast implicito ammesso, in linea con una maggiore type safety). In C in fin dei conti quindi è questione di stile - chi non lo mette ti dirà che non è necessario ed è inutilmente verboso, chi lo mette in genere pensa che in ogni caso stai facendo una conversione tra tipi incompatibili, metterlo non costa nulla e ti evita di doverlo aggiungere in seguito se poi ricicli quel codice in un progetto C++.

    2) "Quel che vedo" non è un buon metodo per verificare la portabilità del codice, dato il C viene usato anche su tante piattaforme "strane" (dai microcontrollori ai supercomputer passando per i DSP), dove tante assunzioni date per scontate sui PC "normali" possono non essere valide; inoltre, una sperimentazione immediata va bene (anzi, è fondamentale) per farsi una prima idea, ma bisogna stare attenti sulle questioni di portabilità. Il rischio è sempre di cadere nei classici casi di undefined behavior senza saperlo; tra l'altro spesso l'UB in casi "strani" è sfruttato dall'ottimizzatore per generare codice veloce, per cui con certi idiomi solo apparentemente ben definiti ci si ritrova dei bug solo nelle build di release. A tal proposito ti consiglio vivamente di leggere i post di questa serie, in particolare il secondo.

    Ciò detto, sizeof(char) è 1 dovunque, indipendentemente da quanto possa effettivamente essere grande un char a livello di bit, per il semplice fatto che sizeof riporta le dimensioni dei tipi usando il char come unità di misura.
    The sizeof operator yields the size (in bytes) of its operand [...]
    When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1.
    [C99, §6.5.3.4, ¶2,3]

    Su alcune piattaforme si può piuttosto non avere un char di 8 bit (ad esempio alcuni DSP); l'informazione sulle dimensioni del char in bit comunque sta nella macro CHAR_BIT (di <limits.h>).

    Ovviamente, invece, nell'allocare array di qualunque altro tipo non bisogna dimenticarsi assolutamente il sizeof(tipo).
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462

    Re: Re: [C]Dubbi su sizeof e cast implicito, miti da sfatare

    Originariamente inviato da MItaly
    Ciò detto, sizeof(char) è 1 dovunque, indipendentemente da quanto possa effettivamente essere grande un char a livello di bit<limits.h>).
    Ripensandoci, concordo.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510

    Re: Re: [C]Dubbi su sizeof e cast implicito, miti da sfatare

    Originariamente inviato da oregon
    Probabilmente intendi il cast esplicito ...
    Si, intendevo quello esplicito.

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613

    Re: Re: [C]Dubbi su sizeof e cast implicito, miti da sfatare

    Originariamente inviato da MItaly
    1) Quello è un cast esplicito. In C non è strettamente necessario (dato che void * ha una conversione implicita a qualunque tipo di puntatore), in C++ invece se non lo metti è un errore (non è un cast implicito ammesso, in linea con una maggiore type safety). In C in fin dei conti quindi è questione di stile - chi non lo mette ti dirà che non è necessario ed è inutilmente verboso, chi lo mette in genere pensa che in ogni caso stai facendo una conversione tra tipi incompatibili, metterlo non costa nulla e ti evita di doverlo aggiungere in seguito se poi ricicli quel codice in un progetto C++.

    2) "Quel che vedo" non è un buon metodo per verificare la portabilità del codice, dato il C viene usato anche su tante piattaforme "strane" (dai microcontrollori ai supercomputer passando per i DSP), dove tante assunzioni date per scontate sui PC "normali" possono non essere valide; inoltre, una sperimentazione immediata va bene (anzi, è fondamentale) per farsi una prima idea, ma bisogna stare attenti sulle questioni di portabilità. Il rischio è sempre di cadere nei classici casi di undefined behavior senza saperlo; tra l'altro spesso l'UB in casi "strani" è sfruttato dall'ottimizzatore per generare codice veloce, per cui con certi idiomi solo apparentemente ben definiti ci si ritrova dei bug solo nelle build di release. A tal proposito ti consiglio vivamente di leggere i post di questa serie, in particolare il secondo.

    Ciò detto, sizeof(char) è 1 dovunque, indipendentemente da quanto possa effettivamente essere grande un char a livello di bit, per il semplice fatto che sizeof riporta le dimensioni dei tipi usando il char come unità di misura.

    [C99, §6.5.3.4, ¶2,3]

    Su alcune piattaforme si può piuttosto non avere un char di 8 bit (ad esempio alcuni DSP); l'informazione sulle dimensioni del char in bit comunque sta nella macro CHAR_BIT (di <limits.h>).

    Ovviamente, invece, nell'allocare array di qualunque altro tipo non bisogna dimenticarsi assolutamente il sizeof(tipo).
    Non ho capito, se sizeof ritorna la dimensione in bytes e sizeof(char) ritorna sempre 1, come fa a non essere 8 bit?

    Per il casting, ora non posso provare ma tempo fa avevo letto qualcosa online a riguardo dove veniva detto che il cast poteva addirittura essere deleterio, nascondendo una mancata inclusione di stdlib.h, dichiarazione implicita, ritorno di default a int, conversione implicita, crash... però beh potrebbe dipendere anche dalle pignolerie di ogni versione dello standard, e soprattutto si spera che tutti compilino con un livello di warning sufficiente da rendersene conto.

  7. #7
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Intende dire che sizeof(tipo)= dim(tipo) / dim(char).

  8. #8

    Re: Re: Re: [C]Dubbi su sizeof e cast implicito, miti da sfatare

    Originariamente inviato da Kaamos
    Non ho capito, se sizeof ritorna la dimensione in bytes e sizeof(char) ritorna sempre 1, come fa a non essere 8 bit?
    "byte" nello standard non vuol dire necessariamente 8 bit
    3.5
    (1) bit
    unit of data storage in the execution environment large enough to hold an object that may have one of two values
    (2) NOTE It need not be possible to express the address of each individual bit of an object.

    3.6
    (1) byte
    addressable unit of data storage large enough to hold any member of the basic character set of the execution environment
    (2) NOTE 1 It is possible to express the address of each individual byte of an object uniquely.
    (3) NOTE 2 A byte is composed of a contiguous sequence of bits, the number of which is implementation-defined. The least significant bit is called the low-order bit; the most significant bit is called the high-order bit.
    [C99, §3.5, 3.6]
    Ovvero un byte è la più piccola unità di memoria che
    - è indirizzabile in maniera univoca (=posso avere un puntatore che punta direttamente ad esso)
    - può rappresentare tutti i caratteri "di base" (la descrizione esatta di che caratteri debba contenere il "basic character set of the execution environment" è a [C99, §5.2.1 ¶3])
    - è grande almeno 8 bit ([C99 §5.2.4.2.1 ¶1])

    ... ed effettivamente esistono piattaforme dove char è più di 8 bit... (soprattutto DSP, se si parla di piattaforme tuttora in uso)


    (giusto per riferimento: link all'ultima draft pubblica dello standard C99)
    Amaro C++, il gusto pieno dell'undefined behavior.

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.