Vous n'êtes pas identifié(e).
Pages : 1
L'erreur :
Je n'arrive pas a deviner ce qui ne marche pas. Les variables m'ont l'air correctement allouées.
Dernière modification par Clem (15-02-2020 04:21:04)
Moi, je suis PC (x86_64) et formater windows, c'était MON idée
Le sommeil de la raison ...
Hors ligne
char* chaine = malloc(sizeof (A->justification+1));
...
tmp = malloc(sizeof(chaine));
...
chaine = malloc(sizeof(i+j+1));
"chaine" est un pointeur et non un tableau, donc sizeof(chaine) renvoie la taille d'un pointeur et non la taille de la mémoire allouée par le premier malloc().
Quant à sizeof(i+j+1), ça n'a pas de sens. Le résultat est la taille d'un int alors que je suppose que tu veux allouer une taille égale à la somme.
Dernière modification par raleur (15-02-2020 10:57:28)
Il vaut mieux montrer que raconter.
Hors ligne
etc...
maintenant le compilateur me renvoit des erreurs que je ne comprends pas:
Dernière modification par Clem (15-02-2020 18:51:39)
Moi, je suis PC (x86_64) et formater windows, c'était MON idée
Le sommeil de la raison ...
Hors ligne
est incorrect. sizeof attend soit un type, soit le résultat d'une expression pour déterminer sa taille. Or
n'est ni un type, ni une expression valide. Ça ne veut rien dire.
Que veux-tu obtenir exactement ? Si tu veux la taille d'un tableau de (i+j) caractères, tu peux écrire
ou plus simplement
Il vaut mieux montrer que raconter.
Hors ligne
Que veux-tu obtenir exactement ? Si tu veux la taille d'un tableau de (i+j) caractères,
Oui ç'est ça.
Là, le compilateur ne me renvoit plus d'erreur.
Je ne suis pas sur d'avoir compris toute la subtilité de la chose...
Par contre a l'execution j'ai le droit à :
L'erreur se situe en dehors de la fonction j'ai l'impresssion:
Moi, je suis PC (x86_64) et formater windows, c'était MON idée
Le sommeil de la raison ...
Hors ligne
Dernière modification par raleur (16-02-2020 11:05:54)
Il vaut mieux montrer que raconter.
Hors ligne
Dernière modification par Clem (16-02-2020 11:10:41)
Moi, je suis PC (x86_64) et formater windows, c'était MON idée
Le sommeil de la raison ...
Hors ligne
Il vaut mieux montrer que raconter.
Hors ligne
Il me semble que ce serait plus efficace de calculer et maintenir la taille de la chaîne dans une variable plutôt que de la réévaluer avec strlen() à chaque itération.
Tu fais au moins une allocation et une copie inutile : chaine -> tmp puis tmp -> chaine alors qu'il suffirait d'allouer directement la nouvelle taille.
J'ai aussi intégré la première itération dans la boucle.
D'ailleurs, pourquoi ne pas agrandir la zone mémoire avec realloc() plutôt que d'en allouer une nouvelle ?
Au passage j'ai remplacé les strcat() par strcpy() puisque les tailles sont connues, ça évite de chercher la fin de la chaîne destination.
PS : ne pas oublier d'appeler free() avec le pointeur retourné par la fonction une fois que le contenu a été utilisé.
Dernière modification par raleur (16-02-2020 15:40:03)
Il vaut mieux montrer que raconter.
Hors ligne
Dernière modification par Clem (16-02-2020 17:50:46)
Moi, je suis PC (x86_64) et formater windows, c'était MON idée
Le sommeil de la raison ...
Hors ligne
strcpy(chaine+l, A->justification);
Le résultat de l'addition d'un pointeur et d'un entier n est un pointeur qui pointe vers le n-ième élément. En C, les pointeurs et tableaux étant interchangeables dans ce genre d'expression, *(chaine+l) est équivalent à chaine[l]. Ici, chaine+l pointe vers le l-ième caractère de la chaîne pointée par chaine. Si l est la longueur de la chaîne, chaine+l pointe vers la fin de la chaîne.
strcpy(chaine+l++, "\n");
Même principe, mais combiné avec l'opérateur de post-incrémentation ++ qui incrémente la variable l après l'avoir utilisée pour ajouter un caractère de saut de ligne à la fin. C'est équivalent à
Il faut faire attention lorsqu'on utilise ce type d'opérateur dans une expression un peu compliquée (ce n'est pas le cas ici), cela peut produire des résultats inattendus.
Et la fonction strcpy n'est pas censée écraser le contenu de la chaine receptrice?
Oui, mais ici on décale le début de la chaîne destinataire à la fin de la chaîne actuelle (dont on connaît la taille, donc la position de la fin).
C'est une vieille habitude de ma part de chercher à écrire du code C efficace (sans nuire à la lisibilité) car à l'époque fort lointaine où je programmais en C, c'était pour des micro-contrôleurs qui avaient très peu de puissance et de mémoire (genre un CPU 8 bits à 8 MHz et 32 Kio de RAM, pas de coprocesseur mathématique...). La fonction strcat() doit parcourir toute la chaîne destination pour trouver où elle se termine (ou faire appel à la fonction strlen() qui fait la même chose) afin d'y copier la chaîne source, ce qui prend du temps alors qu'on peut savoir à l'avance où est cette position et y copier directement la chaîne source.
Dernière modification par raleur (16-02-2020 18:55:04)
Il vaut mieux montrer que raconter.
Hors ligne
Moi, je suis PC (x86_64) et formater windows, c'était MON idée
Le sommeil de la raison ...
Hors ligne
Et que tu veux y placer un chaîne plus grande tu risques d'avoir un problème
Dépasser de 1 suffit à faire un segfault je pense.
Selon le contexte il peut être intéressant de prévoir large à l'avance :
Cela prend un peu plus de place, mais évitera de faire un delete puis nouveau malloc à chaque changement de taille.
A toi de voir.
Hors ligne
char text[5] ="Petit";
Marche pas. Cette chaîne occupe 6 caractères en comptant le caractère nul final.
text = "GrandeChaine";
On peut faire ça en C ? Littéralement, cette expression signifie "affecter au pointeur 'text' l'adresse de la chaîne constante", ce qui me semble incorrect car 'text' n'est pas une variable pointeur sur données constantes (const char *) mais un tableau de données variables, on ne peut donc pas lui affecter une adresse comme valeur, et encore moins l'adresse d'une chaîne constante. A moins que le compilateur traite cette affectation comme un memcpy()/strcpy(), mais ça m'étonne. Faudra que je teste.
Dernière modification par raleur (24-02-2020 14:56:25)
Il vaut mieux montrer que raconter.
Hors ligne
Par contre gcc ne proteste pas contre l'affectation de l'adresse d'une constante chaîne à un pointeur sur char non const, mais le programme segfaulte s'il essaie de modifier le contenu de la chaîne.
Dernière modification par raleur (25-02-2020 20:25:06)
Il vaut mieux montrer que raconter.
Hors ligne
kao a écrit :text = "GrandeChaine";
On peut faire ça en C ?
Oups ! Tu as raison, on ne peut pas...
Il faut passer par strcpy : http://www.cplusplus.com/reference/cstring/strcpy/
C'était une des grosses raisons qui m'ont fait migrer vers le C++.
La gestion des chaînes de caractères est vraiment beaucoup plus simple. (+ les containers + les objets + les booléens etc... ).
Pour GTK il faut peut-être passer par leurs string a eux : https://developer.gnome.org/glib/stable … tions.html
Hors ligne
Pages : 1