Discussions au sujet des autres produits NI

annuler
Affichage des résultats de 
Rechercher plutôt 
Vouliez-vous dire : 

fonction scan et problème avec une 'char'

Bonjour,

 

Actuellment en stage dans un labo j'ai besoin de coder sous LabWindows/CVI.

Je n'y ai jamais touché auparavant et je n'ai que quelques notions de C. J'ai du reprendre le code d'un logiciel déjà fait et je me retrouve confronté à ces lignes qui me pose problème lors de l'exécution : 

 

 

char *r, char[10];

 

if (fonction==fichier)

{

r=strrchr(nomwav, '\\'); if (r!=0) strncpy(chaine,r+1,8);   

r=strchr(chaine,'.'); if (r!=0) *r=0;

Scan(chaine,"%1f[z]%>%f,&R[Param][n]);

}

 

Lorsque je lance l'application j'ai cette erreur qui apparaît : 

 

FATAL RUN-TIME ERROR: "mon_de_fichier_src.c", line XXX, col 18, thread id XXXXXXX: Missing terminating null  in string argument.

 

Je sais comment est structuréé une chaîne de caractères (le \0 de fin de chaîne) du coup je me dis qu'il lui manque ce fameux terme.

J'ai rajouté deux lignes qui rajoute ce caractère à la fin de ma chaine mais ca bu toujours. Cependant, la ligne r=strchr(chaine.... ne fait elle pas cette opération en mettant la valeur de la variable sur laquelle pointe r à 0? 

 

Deuxième question:

Dans mon cas que fait la fonction scan et qu'est-ce qu'elle renvoie?

 

 

Merci d'avance!

 

0 Compliments
Message 1 sur 8
6 282 Visites

Bonjour _trent_,

 

J'imagine que l'allocation de la chaine de caractères "r" n'est jamais faite, ce qui pose problème puisqu'on essaie ici d'y insérer des données.

Il faudra au passage lui spécifier une taille avant de l'appeler dans les fonctions strrchr & consort :

 

r=malloc(taille*sizeof(char));

 

Cdt,

Eric

 

Eric M. - Senior Software Engineer
Certified LabVIEW Architect - Certified LabVIEW Embedded Systems Developer - Certified LabWindows™/CVI Developer
Neosoft Technologies inc.

0 Compliments
Message 2 sur 8
6 258 Visites

Mais r est une chaine de caractère? Je croyais que c'étaitu un pointeur type 'char'. Il est quand même nécessaire de préciser sa taille?

 

Ah et précision : la variable mise en rouge par labWindows est la variable 'chaine' à la ligne 828 (qui correspond à chaine dans strchr(chaine,'.');

 

Et sinon concernant la fonction Scan, des éléments de réponse?

0 Compliments
Message 3 sur 8
6 255 Visites

Bon il semblerait qu'en passant dans la fonction strncpy un 7 à la place de 8 ça marche. Mais là mystère. Je ne vois pas pourquoi ça ne marche pas avec 8. On a bien une chaine de longueur 10 dans laquelle on peut ranger au max 9 caractères, me trompé-je? Du coup les 8 caractères copiés à partir de r+1 ne provoquent pas de dépassement de mémoire et on n'efface pas le terme NULL de fin de chaine.

 

Bon si quelqu'un peut éclairer ma lanterne je l'en remercie d'avance 🙂

 

 

Bien cordialement

 

 

_trent_

 

 

0 Compliments
Message 4 sur 8
6 228 Visites

strncpy(chaine,r+1,8) 

 

strncpy ( char *destination, const char *source, size_t num )

 

On copie 8 caractères de la source vers la destination.

Source :       la chaine pointée par le pointeur"r+1"

Destination : la chaine pointée par le pointeur "chaine"

 

Si la fin de la chaine_source est trouvée avant que les 8 caractères ne soient copiés,

alors la chaine_destination est complètée par des 0 ... jusqu'à ce que "8 caractères" soient copiés. (la fin est signalée par un 0)

 

Aucun "0" de fin de chaine n'est ajouté "d'office" au bout de la chaine_destination.

La chaine_destination sera "null-terminated" seulement si la longueur de la chaine_source est inférieure au nombre de caractères copiés (ici 8).

(Ce, en vertu du "padding" repris ci-dessus)

 

Donc ...

 

ton erreur n'a rien avoir avec le fait que chr[10] contient bien 10 caractères ... et qu'il y a la place pour ... etc, etc ...

La chaine contenue dans char[10] est la Source, pas la destination.

Par contre strncpy ne place pas de 0 en fin de copie (sauf si ... padding)

Si tu places un "zéro" toi même, il faut le placer à la fin de la chaine pointée par "chaine".

 

EDIT

 

J'ai un doute. Pas sur le fond (concernant le fonctionnement de strncpy)

mais sur la forme ... quoi est quoi ...

Sans un code qui "tourne", pas possible de t'aider à 100%, et avec certitude.

Place ton code sur le forum.

 

 

0 Compliments
Message 5 sur 8
6 224 Visites

Le truc c'est que déjà je me suis trompé. La chaine de caractère définie dans cette partie du code est chaine[15] et non char[10]. 

 

Ensuite chaine est bien la destination. De plus,si j'ai bien compris ce que tu veux me dire, lorsque j'écris strncpy(chaine,r+1,13) ça bug mais (chaine,r+1,10) fonctionne, comme si pour la valeur 13 tous les caractères de la chaine étaient non nuls (a fortiori le dernier) d'où l'erreur "misssing null ter in string...". 

 

Cependant, ce que je ne comprends pas c'est que lorsque je définie une chaine : char chaine[10], l'espace mémoire alloué à ce tableau n'est pas automatiquement terminé par un \0? Il faut le rajouté manuellement???

 

Je ne suis pas convaincu par ce code non plus, je le trouve trop "brouillon". Cependant, je ne peux en mettre plus vu que c'est un logiciel en cours de développement par le labo dans lequel je suis en stage et qu'on m'en a interdit la diffusion. (Déjà que partiellement c'était limite apparament 😞 )

 

Mais en tout merci pour ces infos.

 

 

P.S: et concernant le "%1f[z]%f" de la fonction Scan on peut me traduire s'il vous plait????? 🙂

0 Compliments
Message 6 sur 8
6 212 Visites

Pour le Scan(chaine,"%1f[z]%>%f,&R[Param][n]);

La fonction scan: Scan (source, formatString, target1, target2, …);

Le format du formatString est: "source_spec > target_specs and literals"

Par contre il me semble qu'il manque les deuxièmes "

Ensuite les spec ont ce format:

% repetitions formatcode [modifiers]

Ici 1 répétition, le format f est pour les réels, le modifier z indique que tu traites ta chaine comme un tableau d'entier (d'ou l'affectation à un tableau après)

 

Pour le % avant le > il est tout seul et doit renvoyer une erreur (comme les " manquants) Smiley frustré

Cordialement,

Simon D.
CLA | Certified LabVIEW Architect
CTA | Certified TestStand Architect
0 Compliments
Message 7 sur 8
6 193 Visites

J'ai effectivement oublié de reporter les guillemets mais pour le signe > il ne renvoie pas d'erreur .... 😕

Enfin en tout cas merci pour l'explication j'ai à peu près compris :s

0 Compliments
Message 8 sur 8
6 188 Visites