IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

A quelle calcul du langage C correspond cette valeur d'un type non conforme ?


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 10
    Points : 6
    Points
    6
    Par défaut A quelle calcul du langage C correspond cette valeur d'un type non conforme ?
    Un petit exemple sera sûrement plus clair.
    Je tente -volontairement- d'écrire une chaîne de caractères dans un tableau. Le compilateur râle mais le programme s'exécute.
    Je ne comprends pas d'où sortent les valeurs de tab[3] et de tab[4] : ce n'est pas une adresse mémoire convertie en décimal ni une tentative de lecture sur 4 octets des codes ASCII des 4 premiers caractères.
    Le résultat est-il aléatoire ?
    J'ai toutefois remarqué qu'il y a bien un décalage de 7 entre tab[3] et tab[4] ce qui correspond(rait ?) au nombres de caractères de "coucou" + le \0. Si je change de chaîne, cela fonctionne aussi par rapport au nombre de lettres. Donc j'imagine bien une histoire d'adresse mémoire ?

    Nom : test.png
Affichages : 146
Taille : 96,0 Ko

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par bigkaktus Voir le message
    Un petit exemple sera sûrement plus clair.
    Sûrement, mais comme mentionné dans les règles, directement écrit ici qu'on puisse copier/coller histoire que ce soit aussi plus facile pour nous de tester !!!

    Citation Envoyé par bigkaktus Voir le message
    Je tente -volontairement- d'écrire une chaîne de caractères dans un tableau. Le compilateur râle mais le programme s'exécute.
    Quand il râle c'est que c'est pas logique pour lui. Faisable mais pas logique. Donc il fait ce qu'il peut mais aux risques du programmeur.

    Citation Envoyé par bigkaktus Voir le message
    Je ne comprends pas d'où sortent les valeurs de tab[3] et de tab[4] : ce n'est pas une adresse mémoire convertie en décimal ni une tentative de lecture sur 4 octets des codes ASCII des 4 premiers caractères.
    Et pourquoi cela ne serait-il pas une adresse mémoire??? Etant donné qu'en C une string c'est "un tableau de caractères terminé par un '\0'" ; et étant donné aussi que les cases d'un tableau sont toujours contiguës en mémoire, on en arrive à la conclusion que pour "tenir" une chaine il suffit de tenir l'adresse de son premier caractère, les autres suivent derrière.
    Donc écrire var="string" va stocker l'adresse mémoire de "string" dans la variable "var". Et si cette variable n'est pas du type adéquat pour çette opération (récupérer une adresse) alors le compilateur râle (et probable que l'adresse récupérée est dégradée comme quand on copie un float dans un int).

    Citation Envoyé par bigkaktus Voir le message
    Le résultat est-il aléatoire ?
    J'aurai tendance à penser que non, les strings en dur étant stockées dans un endroit précis de l'exécutablen normalement plusieurs exécutions différentes donneront les mêmes valeurs. Ensuite si tu recompiles peut-être que... Mais de toute façon personne ne se préoccupe de ça vu que personne ne s'embête à regarder où sont stockées les chaines. L'important c'est que celui qui veut stocker une chaine la stocke dans une variable appropriée (un tableau s'il veut la modifier ou si elle provient de l'extérieur/un pointeur si elle est interne et qu'ele n'a pas besoin d'être modifiée).

    Citation Envoyé par bigkaktus Voir le message
    J'ai toutefois remarqué qu'il y a bien un décalage de 7 entre tab[3] et tab[4] ce qui correspond(rait ?) au nombres de caractères de "coucou" + le \0. Si je change de chaîne, cela fonctionne aussi par rapport au nombre de lettres. Donc j'imagine bien une histoire d'adresse mémoire ?
    Ben voilà.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci pour la réponse, je pense ne pas avoir été assez précis dans ma question toutefois.

    Comme un tableau est contigu en mémoire, pourquoi ce n’est pas le cas avec tab[3] et tab[4] par rapport à tab[0] (C’est pour cela que j’ai affiché l’adresse mémoire de tab[0] qui n’a rien à voir avec celle de tab[3] et tab[4]) ? Je m’attendais à un décalage de 12, pas vraiment.

    En effet, si je recompile ou que je change la chaîne de caractères, elle semble stockée toujours au même endroit, merci pour l’information

    C’est noté pour le copier-coller !

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bigkaktus Voir le message
    Comme un tableau est contigu en mémoire, pourquoi ce n’est pas le cas avec tab[3] et tab[4] par rapport à tab[0]
    Les cases sont contiguës, donc sont stockées à des adresses qui se suivent. Mais les valeurs stockées dans les cases, elles, sont libres.
    C'est un peu comme dans une rue. Tu as des maisons au numéro 1, 3, 5, 7 donc contiguës dans les impairs mais dans les maisons il y a de tout. Et pour aller à la maison 17 il suffit d'aller au début de la rue et suivre le trottoir.
    Et si tu ne le vois pas c'est parce que tu affiches le contenu des cases tab[x] et non les adresses de ces cases.

    Citation Envoyé par bigkaktus Voir le message
    (C’est pour cela que j’ai affiché l’adresse mémoire de tab[0] qui n’a rien à voir avec celle de tab[3] et tab[4]) ? Je m’attendais à un décalage de 12, pas vraiment.
    Tu as effectivement affiché l'adresse de tab[0]. Affiche donc aussi celle de tab[1]...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci pour toutes ces informations Et en effet, le programme semble bien donner l'emplacement en RAM des constantes de chaînes de caractères par défaut.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. QUIZZ ! A quel langage correspond cette ligne ?
    Par Necco100 dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 23/05/2012, 18h15
  2. [W3C] Quelle est l'utilité réelle de cette ligne de code ?
    Par unreal2me dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 20/12/2006, 15h59
  3. Quel langage choisir pour cette appli ?
    Par spoke dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 04/08/2006, 10h12
  4. quelle est cette valeur
    Par b4mail dans le forum C
    Réponses: 13
    Dernier message: 14/05/2006, 23h39
  5. graph, automate d'état finit, algo de calcul du langage .
    Par Clad3 dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 13/04/2005, 17h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo