OVH Cloud OVH Cloud

Initialisation d'un tableau de char par une chaine constante

42 réponses
Avatar
candide
Bonjour,

Les déclaration (de portée une fonction) suivantes :

char t1[100]={0};

et

char t2[100]="0";

initialisent-elles les tableaux de la même façon ?

Il est clair que la valeur de chaque élément de t1 est 0 et que la valeur du
premier élément de t2 aussi mais peut-on dire plus concernant t2 ?

De son côté la Norme dit :

An array of character type may be initialized by a character string literal,
optionally enclosed in braces. Successive characters of the character string
literal (including the terminating null character if there is room or if the
array is of unknown size) initialize the elements of the array.

et l'initialisation y est définie par :

An initializer specifies the initial value stored in an object.

(ce que je trouve assez peu précis).

Merci

10 réponses

1 2 3 4 5
Avatar
Senhon
a écrit dans le message de groupe de discussion
:


C'est un insignifiant B-A BA.



Bonjour,

Je suis d'accord c'est le b-a ba... mais ca demande du temps pour
apprendre ce chapitre même si c'est le premier. Quoiqu'il y a des
livres de programmation qui survolent de très haut ces passages...Ce
ne sont peut-être pas les ouvrages les plus exhaustifs.

Cependant, pour conduire un charriot élévateur, je ne pense pas qu'il
n'est pas nécessaire d'avoir le permis B. Je veux dire que si mon
objectif est de faire du web development ou être capable de faire
quelques macros open office ou google cloud app... en C ou dans un
autre langage (je crois qu'apprendre la rigueur du C aide pour
apprendre d'autres langages ...? ).

Je ne comprends pas alors l'utilité de savoir manipuler des valeurs
binaires. Peut-être je serais amené à apprendre ce chapitre dans le
futur mais pour l'instant ce n'est pas un besoin. Et puis il y a aussi
des professionnels qui ont étudié l'informatique et des consultants,
ça sera alors à moi de voir si dans le cadre d'un projet sérieux,
cette dépense ne serait pas plus rentable plutôt qu'acquérir une
connaissance supplémentaire que je ne considère pas simple (les maths
n'ont pas été mes meilleurs amis).
Je pense aussi que c'est une question d'orientation professionnelle.




Je pense comme toi, il n'est pas indispensable de connaitre l'hexadécimal.
Cependant, ce type de connaissance est vraiment basique, et demande peu
d'effort pour maitriser complètement.
Avatar
Éric Lévénez
Senhon a écrit :

C'est affaire de choix, suivant les circonstances, d'utiliser une base
ou une autre. je peux indifféremment écrire :

char Car = 'A' ;



Le 'A' sera codé en 0x41 uniquement si l'on est sur une machine ASCII.

char Car = 0b01000001 ;



Le "0b" n'est pas standard, c'est une extension non portable.

char Car = 0x41 ;
char Car = 65 ;



--
Éric Lévénez
FAQ de fclc : <http://www.levenez.com/lang/c/faq/>
Avatar
Mickaël Wolff
wrote:

C'est un insignifiant B-A BA.



Bonjour,

Je suis d'accord c'est le b-a ba... mais ca demande du temps pour
apprendre ce chapitre même si c'est le premier. Quoiqu'il y a des
livres de programmation qui survolent de très haut ces passages...Ce
ne sont peut-être pas les ouvrages les plus exhaustifs.



Les livre sont toujours mauvais à ce niveau.

Cependant, pour conduire un charriot élévateur, je ne pense pas qu'il
n'est pas nécessaire d'avoir le permis B.



Il faut cependant un permis carsite, à renouveler tout les 5 ans. Je
n'ai pas mon permis B, et pourtant je sais faire fonctionner une
voiture, je ne suis non plus pas mécanicien. Mais je suis certain de
devenir un danger si je conduis ou si je je bidouille un véhicule.

Je veux dire que si mon
objectif est de faire du web development ou être capable de faire
quelques macros open office ou google cloud app... en C ou dans un
autre langage (je crois qu'apprendre la rigueur du C aide pour
apprendre d'autres langages ...? ).



Meme en développement Web il faut connaitre les bases de
l'informatique. Et si le C permet d'apprendre la programmation de
manière générique, la démarche perd tout intéret dès que tu zappe les
problèmes liés à la représentation des données.

Je ne comprends pas alors l'utilité de savoir manipuler des valeurs
binaires.



Alors comment vas-tu comprendre les masques de bit, qui sont très
utilisés en C ?

Peut-être je serais amené à apprendre ce chapitre dans le
futur mais pour l'instant ce n'est pas un besoin.



Tu en as besoin, meme si tu ne le sais pas encore. Par exemple, tu
seras peut-etre étonné que (0.1 * 0.1 != 0.01). Ce genre de chose n'est
compréhensible que lorsque tu as une bonne compréhension de la
représentation binaire des données. Cette connaissance évite de choisir
les nombres flottant pour manipuler des données financière, par exemple.

> plutôt qu'acquérir une
connaissance supplémentaire que je ne considère pas simple (les maths
n'ont pas été mes meilleurs amis).



Multiplier ou diviser par 2 ou 16 ne sont pas des maths très avancés.

Mais ton problème n'est pas mathématique, il est plutot conceptuel.
Tu ne comprends pas que toutes les données que tu manipules sont
binaires, et que nous manipulons des représentations plus faciles à
retenir pour le développeur moyen.


--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
bpascal123
>    Alors comment vas-tu comprendre les masques de bit, qui sont trè s
utilisés en C ?



Quand je serais face à cette question, je me déciderais à apprendre à
convertir des 0 et des 1 ...


> Peut-être je serais amené à apprendre ce chapitre dans le
> futur mais pour l'instant ce n'est pas un besoin.

   Tu en as besoin, meme si tu ne le sais pas encore. Par exemple, tu
seras peut-etre étonné que (0.1 * 0.1 != 0.01). Ce genre de chose n 'est
compréhensible que lorsque tu as une bonne compréhension de la
représentation binaire des données. Cette connaissance évite de cho isir
les nombres flottant pour manipuler des données financière, par exemp le.




je ne suis pas sûre de voir le lien avec la manipulation de valeurs
hexa ou binaires, mais je n'étant qu'un débutant, je suis sûre que je
verrais le lien au fur et à mesure de ma progression avec
l'apprentissage du langage c.
Avatar
-ed-
On 21 août, 10:42, "Senhon" wrote:
C'est affaire de choix, suivant les circonstances, d'utiliser une base ou
une autre. je peux indifféremment écrire :

    char Car = 0b01000001 ;



N'existe pas en C standard.

    char Car = 0x41 ;
    char Car = 65 ;



Si le charset est ASCII.
Avatar
-ed-
On 21 août, 16:39, ""
wrote:
Je ne comprends pas alors l'utilité de savoir manipuler des valeurs
binaires.



C'est une question de connaissance générale. Il est fréquent que l'on
utilise des variables ayant 2 valeurs possibles. vrai ou faux. Par
exemple male/femelle, actif/inacif, présent/absent etc.

actuellement, j'utilise une base de données SQL dans laquelle le champ
numérique minimum est de 1 octet, soit 8 bits. Si j'ai besoin de 3
champs à 2 états, je peux soit créer 3 champs de 1 octet (soit une
consommation de 3 octets) soit utiliser un seul champ dont j'affecte
(soit une consommation de 1 octets) chaque bit à une fonction :

Exemple concret. Je dois gérer une liste d'élèves, et j'ai besoin de
conserver cette liste d'une année sur l'autre. Un élève peut donc ê tre

- ancien (cycle terminé)
- courant (année en cours)

ce qui donne les états possibles

- ancien (cycle terminé)
- courant nouveau (en 1ère année)
- courant ancien (en 2 ème année, par exemple)

J'ai donc à gérer 2 états indépendants :

- ancien : 0=nouveau 1=ancien
- courant : 0=pas en cours 1=en cours

J'attribue le bit 0 à ancien, soit 0 ou 1
J'attribue le bit 1 à courant, soit 0 ou 2

La combinaison de bits génère donc les valeurs binaires

00 : (0) non utilisé (pourrait désigner un élève non encore inscrit ou
'prospect')
01 : (1) élève ayant terminé son cycle d'étude
10 : (2) élève dont c'est la première année
11 : (3) élève en cours, mais dont ce n'est pas la première année

à chaque fin d'année, les flags sont remis à jour selon le cursus de
l'élève.
Avatar
Pierre Maurette
-ed-, le 22/08/2009 a écrit :
On 21 août, 16:39, ""
wrote:
Je ne comprends pas alors l'utilité de savoir manipuler des valeurs
binaires.



C'est une question de connaissance générale. Il est fréquent que l'on
utilise des variables ayant 2 valeurs possibles. vrai ou faux. Par
exemple male/femelle



hum...
<URL:http://www.lemonde.fr/sports/article/2009/08/21/mondiaux-d-athletisme-caster-semanya-ne-voulait-pas-de-sa-medaille_1230818_3242.html>

--
Pierre Maurette
Avatar
espie
In article ,
-ed- wrote:
On 20 août, 17:24, Jean-Marc Bourguet wrote:
Antoine Leca writes:
> Mais qui plus est, l'initialisation à 0 remplit l'objet de 0 binaires...
> qui ne sont pas obligatoirement identiques (pour les nombres en virgule
> flottante et les pointeurs) équivalents à la constante 0.

Heu... les objets a duree de vie statique non intialises explicitement sont
initialises a la valeur 0 pour les variables de type arithmetique et avec
un pointeur null pour les variables de type pointeur. (6.5.7 pour C90,
6.7.8/10 pour C99).



C'est ce qui me semblait aussi. Je suis un,peu surpris par la réponse
d'Antoine ...

@Antoine, tu ne confonds pas avec memset() ?



Il y a eu des bugs, donc les vieux ont tendance a initialiser explicitement,
mais c'est vrai que c'est specifie depuis un bon moment...
Avatar
espie
In article ,
wrote:
Je ne comprends pas alors l'utilité de savoir manipuler des valeurs
binaires. Peut-être je serais amené à apprendre ce chapitre dans le
futur mais pour l'instant ce n'est pas un besoin. Et puis il y a aussi
des professionnels qui ont étudié l'informatique et des consultants,
ça sera alors à moi de voir si dans le cadre d'un projet sérieux,
cette dépense ne serait pas plus rentable plutôt qu'acquérir une
connaissance supplémentaire que je ne considère pas simple (les maths
n'ont pas été mes meilleurs amis).
Je pense aussi que c'est une question d'orientation professionnelle.



Ca a des chances d'etre tot ou tard utile, sauf si on ecrit toujours
du code sans erreurs. Mais comme ca n'est pas le cas... on tombe tot
ou tard sur des bugs, dans son propre code, dans des bibliotheques, dans
le compilateur, dans le systeme. Et a ce moment, les petits details de
la representation des donnees reellement utilisee par l'implementation vont
avoir leur importance. Ils risquent d'expliquer certains bugs reproductibles
(ou au contraire rarissimes). Et il est fort possible que les outils de
debug necessitent de fouiner un peu, et de reperer certaines valeurs, qui
auront peu de sens au niveau du langage, mais qui s'explicitent en descendant
d'un cran. Qu'a de special 65536, par exemple ? pas grand chose, sauf que c'est
pile-poil 2^16, et donc que ca peut etre un 1 decale de deux octets (ou inverse
pour une raison obscure).

Bref, l'hexadecimal, ca sert a rien, mais tous les gens qui font reellement du
code (et pas juste qui l'ont appris pour leurs etudes et vite oublie) finissent
par connaitre plein de petits trucs sans meme s'en rendre compte...
Avatar
Antoine Leca
Le 20/08/2009 15:24, Jean-Marc Bourguet écrivit :
Antoine Leca writes:

Mais qui plus est, l'initialisation à 0 remplit l'objet de 0 binaires...
qui ne sont pas obligatoirement identiques (pour les nombres en virgule
flottante et les pointeurs) équivalents à la constante 0.



Heu... les objets a duree de vie statique non intialises explicitement sont
initialises a la valeur 0 pour les variables de type arithmetique et avec
un pointeur null pour les variables de type pointeur. (6.5.7 pour C90,
6.7.8/10 pour C99).



Au temps pour moi : j'ai confondu avec calloc()...
Je suis confus.


Antoine
1 2 3 4 5