NI Home > Community > NI Discussion Forums

Discussions au sujet des autres produits NI

Répondre
Member
_trent_
Envois : 37
0 Compliments

fonction scan et problème avec une 'char'

[ modifié ]

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!

 

Active Participant
Eric.M
Envois : 704
0 Compliments

Re : fonction scan et problème avec une 'char'

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. - Application Engineer Specialist
Certified LabVIEW Architect
National Instruments France


Été de LabVIEW 2014

12 présentations en ligne, du 30 juin au 18 juillet


Member
_trent_
Envois : 37
0 Compliments

Re : fonction scan et problème avec une 'char'

[ modifié ]

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?

Member
_trent_
Envois : 37
0 Compliments

Re : fonction scan et problème avec une 'char'

[ modifié ]

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 :smileyhappy:

 

 

Bien cordialement

 

 

_trent_

 

 

Trusted Enthusiast
ouadji
Envois : 2 065
0 Compliments

Re : fonction scan et problème avec une 'char'

[ modifié ]

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.

 

 

Member
_trent_
Envois : 37
0 Compliments

Re : fonction scan et problème avec une 'char'

[ modifié ]

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 :smileysad: )

 

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????? :smileyhappy:

Active Participant
SimonD
Envois : 467
0 Compliments

Re : fonction scan et problème avec une 'char'

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) :smileyfrustrated:

Cordialement,

Simon D.
CLA | Certified LabVIEW Architect
CTA | Certified TestStand Architect
Member
_trent_
Envois : 37
0 Compliments

Re : fonction scan et problème avec une 'char'

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