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 :

char* FinLigne = strchr(Nom,'\n'); est-ce un tableau de char ?


Sujet :

C

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut char* FinLigne = strchr(Nom,'\n'); est-ce un tableau de char ?
    Bonjour tout le monde,

    Je ne suis pas sûr d'avoir compris une ligne de code :

    char* FinLigne = strchr(Nom,'\n');

    FinLigne est une nouvelle variable de type char pointer.

    Est-ce un tableau de caractère ou une simple variable de type char ?

    Nom est un tableau contenant "Patte Louise 847..."

    Dans FinLigne, on peut voir cette adresse :

    0x00bea678
    Est-ce l'adresse de l'endroit où se trouve le retour à la ligne trouvé (\n) ?

    voici la représentation de FinLigne :

    voir miniature.

    Merci d'avance pour votre aide.

    beegees

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    man strchr

    http://man.developpez.com/man3/strchr.3.php

    ça te renvoie l'adresse du caractère dans la chaine (adresse absolue : adresse du début de chaine + distance à laquelle se trouve le caractère)
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par beegees Voir le message
    Bonjour tout le monde,

    Je ne suis pas sûr d'avoir compris une ligne de code :

    char* FinLigne = strchr(Nom,'\n');

    FinLigne est une nouvelle variable de type char pointer.

    Est-ce un tableau de caractère ou une simple variable de type char ?

    Nom est un tableau contenant "Patte Louise 847..."

    Dans FinLigne, on peut voir cette adresse :



    Est-ce l'adresse de l'endroit où se trouve le retour à la ligne trouvé (\n) ?

    voici la représentation de FinLigne :

    voir miniature.

    Merci d'avance pour votre aide.

    beegees
    Tu entres dans le domaine délicat des pointeurs et des tableaux.
    Un tableau c'est une suite de cases mémoires qui se suivent. Exemple
    Tu as la variable nom[0] en adresse 1000 qui contient 't', nom[1] en adresse 1001 qui contient 'o', nom[2] en adresse 1002 qui contient 'p', nom[3] en adresse 1003 qui contient 'i' et nom[4] en adresse 1004 qui contient 'c'.
    Tu as en plus la variable "nom" qui contient 1000 (l'adresse de "nom[0]")

    A partir de là, quand tu as saisi le principe, tu peux jongler. La fonction strchr() te renvoie l'adresse de l'élément contenant ton caractère. Donc si je demande strchr(nom, 'p'), je récupère 1002 que je peux stocker dans n'importe quelle variable du bon type (un char*)
    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *res=strchr(nom, 'p')
    Donc res contient 1002 et si je prends "nom" (1000) et que j'y ajoute 2, j'obtiens 1002. Donc en final il n'y a aucune différence entre nom + 2 et res. Et si je demande "*res" ou "*(nom + 2)" je me déplace dans les 2 cas sur la case mémoire 1002 (qui est unique) pour voir ce qu'il y a ('p').

    Donc pour répondre à ta question, FinLigne n'est qu'un simple pointeur. Mais si je pars de cette adresse et que je boucle sur les suivantes (ou les précédentes), j'obtiendrais en final exactement comme si j'avais un tableau (en faisant bien entendu attention à ne pas boucler trop loin sinon je risque d'atteindre des zones mémoires qui n'appartiennent plus à la zone couverte par "Nom")...
    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]

  4. #4
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonsoir Souviron,

    Merci pour ta réponse.

    Je suis désolé mais j'ai encore des doutes.

    FinLigne est une variable pointeur, elle pointe vers Nom ?

    Le contenu de FinLigne est 0x00bea678 et l'adresse de Nom est 0x00bea678 je présûme donc que c'est ça ?

    C'est grâce à que FinLigne peut pointer sur Nom ?

    ça te renvoie l'adresse du caractère dans la chaine (adresse absolue : adresse du début de chaine + distance à laquelle se trouve le caractère)
    Sous quel forme est une variable absolue ?

    ça te renvoie l'adresse du caractère dans la chaine
    Je change la miniature (pdf) qui te montre bien maintenant le résultat de FinLigne, pourrais-tu me dire à quoi correspond 0x00bea678 ?

    Est-il possible de voir ce qu'il se trouve à cette adresse ?

    Merci pour tout et désolé pour le dérangement.

    beegees

  5. #5
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonsoir Sve@r,

    Merci pour cette réponse très claire.

    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* FinLigne = strchr(Nom,'\t');
    Cherche le premier '\t' et renvoie l'adresse dans la variable FinLigne ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (FinLigne != NULL) *FinLigne = 0;
    Si FinLigne est différent de NULL, donc si FinLigne contient l'adresse de la première tabulation du tableau Nom, on remplace cette adresse par 0 ?

    Dans le débogueur de VS C++ 6 j'ai l'adresse 0x00bea678 (tu pourras voir le pdf dans mon post ci-dessus).

    Saurais-tu stp m'expliquer cette adresse ?

    Merci pour tout.

    beegees

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par beegees Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* FinLigne = strchr(Nom,'\t');
    Cherche le premier '\t' et renvoie l'adresse dans la variable FinLigne ?
    Oui, comme l'indique la doc de la fonction... (enfin si on a trouvé un '\t'...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (FinLigne != NULL) *FinLigne = 0;
    Si FinLigne est différent de NULL, donc si FinLigne contient l'adresse de la première tabulation du tableau Nom, on remplace cette adresse par 0 ?
    Non. On remplace la valeur pointée (le '*', OK ?) par 0.

    Ca s'écrit plus clairement comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       if (FinLigne != NULL) 
       {
          *FinLigne = 0;
       }
    Dans le débogueur de VS C++ 6 j'ai l'adresse 0x00bea678 (tu pourras voir le pdf dans mon post ci-dessus).

    Saurais-tu stp m'expliquer cette adresse ?
    Il n'y a rien à expliquer avec les adresses... Ce sont des valeurs abstraites (entiers), qui, de nos jours, n'ont rien à voir avec des adresses physiques, gérées par le système. Tout ce qu'on peut dire, c'est que dans un tableau, les adresses des éléments sont croissantes (en partant de l'indice [0]) et séparées d'une valeur égale (la taille de l'élément).
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonsoir Ed,

    Merci pour tes explications claires et précises.

    Il n'y a rien à expliquer avec les adresses... Ce sont des valeurs abstraites (entiers), qui, de nos jours, n'ont rien à voir avec des adresses physiques, gérées par le système. Tout ce qu'on peut dire, c'est que dans un tableau, les adresses des éléments sont croissantes (en partant de l'indice [0]) et séparées d'une valeur égale (la taille de l'élément).
    Concernant les adresses, j'ai cette adresse :

    0x00bea679
    Quand je tape cette adresse dans un watch (dans le débogueur), j'obitens ceci 12494457

    à quoi correspond ce nombre ?

    *0x00bea679 ne fonctionne pas, c'est normal ?

    Merci et bonne soirée.

    beegees

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par beegees Voir le message
    Si FinLigne est différent de NULL, donc si FinLigne contient l'adresse de la première tabulation du tableau Nom, on remplace cette adresse par 0 ?
    Emmanuel a parfaitement répondu. On cherche à partir de la case mémoire commençant à "Nom" le caractère '\t' et on récupère l'adresse mémoire de la case contenant ce caractère. Et si cette adresse existe (le caractère y est), alors on va y mettre la valeur 0.
    Maintenant, pourquoi ? Tout simplement pour tronquer la chaîne "Nom" au premier '\t'.
    En effet, une chaîne en C est un tableau de caractères contenant quelque part le caractère de valeur 0 (ou caractère '\0' à ne pas confondre avec le caractère '0' de valeur ascii 48).
    Il s'ensuit qu'une fois cette convention établie, toute fonction destinée à manipuler un chaîne cherchera ce 0 et s'arrêtera au premier qu'elle trouvera.
    Donc mettre arbitrairement un 0 (ou '\0') au mileu d'une chaîne est le moyen le plus simple et le plus rapide de la tronquer...

    Citation Envoyé par beegees Voir le message
    Quand je tape cette adresse dans un watch (dans le débogueur), j'obitens ceci 12494457

    à quoi correspond ce nombre ?

    *0x00bea679 ne fonctionne pas, c'est normal ?
    Le nombre 12494457 en base 10 correspond au nombre bea679 en base 16. Quand j'ai parlé de 1000, 1001, 1002, c'était à titre d'exemple. En fait, quand on a compris le principe, on ne se préoccupe plus de la valeur réelle des adresses. On sait que "Nom" couvre un espace d'adressage totalement contigü et on fait avec...
    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]

  9. #9
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Un super grand merci à vous tous pour vos réponses claires et précises, et merci aussi pour les cours et tutoriels C et la FAQ C.

    J'ai bien compris maintenant cette notion d'adresse qui va dans une variable de type pointeur et qu'on peut incrémenter de 1 ou décremnter de 1 pour voir les autres éléménts.

    C'est super pour un Dimanche matin.

    Merci encore à tous et surtout à Ed pour son dévouement sans limite pour le forum C du site.

    @ bientôt
    beegees

  10. #10
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Tu entres dans le domaine délicat des pointeurs et des tableaux.
    Exact. La preuve:
    [quote]Un tableau c'est une suite de cases mémoires qui se suivent. Exemple
    Tu as la variable nom[0] en adresse 1000 qui contient 't', nom[1] en adresse 1001 qui contient 'o', nom[2] en adresse 1002 qui contient 'p', nom[3] en adresse 1003 qui contient 'i' et nom[4] en adresse 1004 qui contient 'c'.[quote]
    nom[5] qui contient \0.

    Tu as en plus la variable "nom" qui contient 1000 (l'adresse de "nom[0]")
    NON. nom est une variable tableau de 6 caractères qui contient { 't', 'o', 'p', 'i', 'c', '\0' }.
    La source de ta confusion est que dans la plupart des contextes (les exceptions sont comme argument de & et de sizeof) un tableau est converti implicitement en un pointeur vers son premier élément. Voir les très nombreuses fois où le problème a été abordé.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  11. #11
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour Jean-Marc,

    Merci beaucoup pour ces explications hyper importantes.

    NON. nom est une variable tableau de 6 caractères qui contient { 't', 'o', 'p', 'i', 'c', '\0' }.
    La source de ta confusion est que dans la plupart des contextes (les exceptions sont comme argument de & et de sizeof) un tableau est converti implicitement en un pointeur vers son premier élément. Voir les très nombreuses fois où le problème a été abordé.
    donc j'ai un tableau qui s'appelle Nom, si je fais :

    char* DebutNom = Nom j'affecte à DebutNom l'adresse du premier élémernt de mon tableau Nom ?

    J'espère que ta réponse sera OUI car ça voudra dire que j'aurais compris

    Merci à tous pour votre dévouement.

    Bon Dimanche.

    beegees

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par beegees Voir le message
    J'espère que ta réponse sera OUI car ça voudra dire que j'aurais compris
    Hum... peut-être...

    Citation Envoyé par beegees Voir le message
    donc j'ai un tableau qui s'appelle Nom, si je fais :

    char* DebutNom = Nom j'affecte à DebutNom l'adresse du premier élémernt de mon tableau Nom ?
    Exact. Et tu peux aussi t'amuser à y mettre "Nom + 1" ou "Nom + 2" pour y mettre d'autres adresses.
    C'est autorisé d'y mettre aussi "Nom - 1" ou "Nom - 2" mais ces adresses là ne sont pas forcément à toi donc t'as pas forcément le droit de t'en servir => danger du C => c'est à toi d savoir ce que tu fais car il ne vérifie rien pour toi !!!
    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]

  13. #13
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Hum... peut-être...


    Exact. Et tu peux aussi t'amuser à y mettre "Nom + 1" ou "Nom + 2" pour y mettre d'autres adresses.
    C'est autorisé d'y mettre aussi "Nom - 1" ou "Nom - 2" mais ces adresses là ne sont pas forcément à toi donc t'as pas forcément le droit de t'en servir => danger du C => c'est à toi d savoir ce que tu fais car il ne vérifie rien pour toi !!!

    Re,

    Je suis tout à fait d'accord avec toi sur ta réponse.

    Surtout sur le passage :

    C'est autorisé d'y mettre aussi "Nom - 1" ou "Nom - 2" mais ces adresses là ne sont pas forcément à toi donc t'as pas forcément le droit de t'en servir
    Je dois au moins une fois par jour redémarrer mon PC manuellement car tout devient hyper lent, je ne maîtrise plus rien, j'ai donc l'impression que j'ai eu accès à une mémoire à laquelle je n'ai pas le droit de toucher.

    merci pour tout.

    beegees

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    C'est autorisé d'y mettre aussi "Nom - 1" ou "Nom - 2"
    Euh, non. C'est techniquement possible, mais pas du tout autorisé (comportement indéfini).
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Euh, non. C'est techniquement possible, mais pas du tout autorisé (comportement indéfini).
    Ah certain ? J'étais persuadé que tant que je touchais pas inconsidérément à "*DebutNom" ben je pouvais faire ce que je veux avec "DebutNom".
    C'est d'ailleurs un petit peu mon attitude générale avec le C. Je frôle sans-cesse le précipice tout en me faisant un petit point d'honneur à n'y jamais plonger...
    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]

  16. #16
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ah certain ? J'étais persuadé que tant que je touchais pas inconsidérément à "*DebutNom" ben je pouvais faire ce que je veux avec "DebutNom" ???
    Non. Dans un tableau A de dimension N :
    • Les adresses valides vont de A (ou A+0) à A + N
    • Les adresses déréférencables vont de A à A + N - 1

    La simple présence d'une adresse invalide dans une variable de type pointeur invoque un comportement indéfini.

    Par exemple, sur une machine 68k, si c'est un registre d'adresse (A0-A7) 32-bit qui accepte des adresses 24-bit, et qu'un des bits 24 à 31 est a un, ça peut trapper...
    Pas de Wi-Fi à la maison : CPL

  17. #17
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Non. Dans un tableau A de dimension N :
    • Les adresses valides vont de A (ou A+0) à a + N
    • Les adresses déréférencables vont de A à A + N - 1

    La simple présence d'une adresse invalide dans une variable de type pointeur peut provoquer un comportement indéfini (surtout si c'est un registre d'adresse...).
    Super ! J'ai plongé
    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]

  18. #18
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    là, je vous suis plus les gars

    Aller, à bientôt et merci pour votre dévouement et pour votre compétence.

    beegees

  19. #19
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par beegees Voir le message
    là, je vous suis plus les gars
    Ben en fait, j'ai dit plus avant qu'on pouvait mettre ce qu'on veut dans "DebutNom" (aussi bien Nom que Nom + 1 que Nom - 1)
    Ben il s'avère qu'on peut pas y mettre "Nom - 1" (même si c'est accepté par le compilo) car on provoque un comportement indéfini ce qui est la pire des choses qui puisse t'arriver car la notion de "comportement indéfini" inclu le mécanisme de "ça marche pendant 10 ans puis un jour je rajoute une ligne et ça marche plus" => va donc retrouver le bug après ça (surtout que tu le chercheras dans la ligne que tu viens de rajouter et tu peux chercher longtemps)...

    Par ailleurs, et après réflexion, ce fait m'embête beaucoup plus qu'il n'y parait. Parce qu'il me semble que j'ai dû au-moins une fois écrire l'algo suivant (qui permet de balayer une chaîne de la fin vers le début):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (DebutNom=Nom + strlen(Nom) - 1; DebutNom >= Nom; DebutNom--)
    {
        ...<traitement *DebutNom...>
    }
    Ou un algo ressemblant. Et que jusqu'à maintenant, je pensais ce type de code "sûr" (puisque je ne touchais à "*DebutNom" que s'il était dans la plage autorisée)...
    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]

  20. #20
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    C'est bien la preuve qu'on en apprend tous les jours, mêmes les meilleurs

    Merci pour ton dévouement, sincèrement, sans vous, je n'y arriverai pas !

    beegees

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

Discussions similaires

  1. Erreur 21776 : [SQL-DMO]Le nom "monuser" est introuvable
    Par chauchs dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 03/09/2008, 17h35
  2. [DOM] appeler une fonction via son nom (qui est une string)
    Par elekis dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 15/07/2008, 13h06
  3. Réponses: 8
    Dernier message: 11/11/2007, 00h53
  4. Réponses: 2
    Dernier message: 13/04/2007, 18h20
  5. Réponses: 4
    Dernier message: 10/10/2003, 18h04

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