π
<-

Conversion (const char *) en (char *)

C, C++, ASM...

Conversion (const char *) en (char *)

Unread postby Lepzulnag » 16 Dec 2012, 18:31

Bonjour à tous ! :)

Cette question s'adresse aux programmeurs C. Voici mon cas en simplifié :

J'ai une structure qui contient un pointeur vers une chaîne de caractères...
typedef struct MA_STRUCTURE {
---char *str;
} MaStructure;


et une fonction qui remplit la structure, qui prend en argument une chaine de caractère :
MaStructure *MaFonction(const char *s) {
---MaStrcuture *ms = malloc(sizeof(MaStrucuture));
---ms->str = (char *) s;
---return ms;
}


J'ai souvent effectué une conversion de ce genre, et jamais je n'ai eu de problème, en envoyant une chaîne de caractère écrite en dur ou non. Mais à force d'effectuer cette manipulation, je me suis demandé ce qu'il se passerait si jamais je modifiais la chaîne via la structure (chose possible car déclarée comme non-constante).
// faisons-nous plaisir !!
ms->str{2] = 'x';


Et à ma grande surprise, cela marche parfaitement, pas un bug ni de comportement bizarre. Je suis donc allé sur internet voir si des gens utilisaient cette technique, et apparemment, il ne faut surtout pas faire ce genre de chose.

Donc je me demande, pourquoi ? Comment tout cela marche-t-il ?
User avatar
Lepzulnag
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Level up: 78.5%
 
Posts: 151
Joined: 02 Aug 2012, 21:15
Location: Bretagne
Gender: Not specified
Calculator(s):
MyCalcs profile
Class: M2 Maths

Re: Conversion (const char *) en (char *)

Unread postby Levak » 16 Dec 2012, 18:37

Essaies :
Code: Select all
void set(const char *str, int pos, char c)
{
  char *s = (char *) str;
  s[pos] = c;
}

int main()
{
  char *toto = "lol";
  set(toto, 2, 'x');
  return 0;
}


Et maintenant, pleure.
Responsable design/graphique de TI-Planet
I do not get mad at people, I just want them to learn the way I learnt.
ImageTNOC [topic][DL]
nClock [topic][DL]
HideManager [topic][DL]
ZLock [topic][DL]
Theme Editor [topic][DL]
Mes programmes
User avatar
LevakAdmin
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 98.9%
 
Posts: 6414
Images: 22
Joined: 27 Nov 2008, 00:00
Location: 0x1AACC355
Gender: Male
Calculator(s):
MyCalcs profile
Class: BAC+5: Epita (ING3)

Re: Conversion (const char *) en (char *)

Unread postby Lepzulnag » 16 Dec 2012, 18:55

Bon, alors j'ai testé sur l'émulateur de Ti-nspire (parce que je ne programme que pour calculette 0:] ) et... aucune larme n'a coulée des mes yeux... :'(

Tout marche parfaitement. Si j'essaie d'afficher la chaîne de caractères, j'ai bien "lox".
User avatar
Lepzulnag
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Level up: 78.5%
 
Posts: 151
Joined: 02 Aug 2012, 21:15
Location: Bretagne
Gender: Not specified
Calculator(s):
MyCalcs profile
Class: M2 Maths

Re: Conversion (const char *) en (char *)

Unread postby Lionel Debroux » 16 Dec 2012, 18:59

C'est parce que sur l'OS standard des Nspire, la MMU n'est pas utilisée pour marquer read-only la section .rodata où sont stockées les variables constantes (ni la section .text où est stocké le code, d'ailleurs).
Sur les OS bien élevés tournant sur des plate-formes disposant d'une MMU, quand le code essaie d'écrire dans une zone marquée RO, le processeur déclenche une exception et le processus fautif est tué.
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 11.3%
 
Posts: 6869
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Class: -
GitHub: debrouxl

Re: Conversion (const char *) en (char *)

Unread postby Lepzulnag » 16 Dec 2012, 19:07

Je vois. Donc je préfère ne pas utiliser cette technique, au cas où un jour j'ai besoin de changer de plate-forme.

Et le principe même est sournois :D Passer outre la constance d'une variable pour la modifier..

Merci pour vos réponses :)
User avatar
Lepzulnag
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Level up: 78.5%
 
Posts: 151
Joined: 02 Aug 2012, 21:15
Location: Bretagne
Gender: Not specified
Calculator(s):
MyCalcs profile
Class: M2 Maths

Re: Conversion (const char *) en (char *)

Unread postby Lionel Debroux » 16 Dec 2012, 19:10

Et le principe même est sournois :D Passer outre la constance d'une variable pour la modifier..

C'est une feature (?) du C :)
En C++, en revanche, le compilo refuse qu'on enlève le const de manière aussi directe. Il faut utiliser certains opérateurs C++ de cast si on veut que le compilo C++ laisse faire.
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
User avatar
Lionel DebrouxSuper Modo
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 11.3%
 
Posts: 6869
Joined: 23 Dec 2009, 00:00
Location: France
Gender: Male
Calculator(s):
MyCalcs profile
Class: -
GitHub: debrouxl

Re: Conversion (const char *) en (char *)

Unread postby Levak » 16 Dec 2012, 19:12

Lepzulnag wrote:Bon, alors j'ai testé sur l'émulateur de Ti-nspire (parce que je ne programme que pour calculette 0:] ) et... aucune larme n'a coulée des mes yeux...

Ouai, en fait, mon "maintenant, pleure" était plus lié à ce que dit Lionel : c'est parce que ça marche sur Nspire qu'il faut pleurer.
Donc comme tu dis, ne prends pas de mauvaises habitudes =).
Responsable design/graphique de TI-Planet
I do not get mad at people, I just want them to learn the way I learnt.
ImageTNOC [topic][DL]
nClock [topic][DL]
HideManager [topic][DL]
ZLock [topic][DL]
Theme Editor [topic][DL]
Mes programmes
User avatar
LevakAdmin
Niveau 14: CI (Calculateur de l'Infini)
Niveau 14: CI (Calculateur de l'Infini)
Level up: 98.9%
 
Posts: 6414
Images: 22
Joined: 27 Nov 2008, 00:00
Location: 0x1AACC355
Gender: Male
Calculator(s):
MyCalcs profile
Class: BAC+5: Epita (ING3)

Re: Conversion (const char *) en (char *)

Unread postby Lepzulnag » 16 Dec 2012, 19:18

:'( :'( :'(
User avatar
Lepzulnag
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Level up: 78.5%
 
Posts: 151
Joined: 02 Aug 2012, 21:15
Location: Bretagne
Gender: Not specified
Calculator(s):
MyCalcs profile
Class: M2 Maths


Return to Native: Ndless, Linux, ...

Who is online

Users browsing this forum: ClaudeBot [spider] and 4 guests

-
Search
-
Social TI-Planet
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
1234
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1527 utilisateurs:
>1514 invités
>7 membres
>6 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)