Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/05/2016, à 17:00

BenjiBoy

Question très simple en C

Bonjour à tous,

en fait je cherche à faire une division d'une variable par un nombre (j'applique un facteur de correction à une valeur lu dans un registre)

En clair :

/* lecteur registre*/
Bat1 = nb_modbus_read_regs(fd, 0, 1);

/*facteur de correction*/
Bat1 = Bat1/1800;

/*affichage*/
dump(Bat1);

Sans le facteur j'ai la valeur en brut qui s'affiche correctement, avec le facteur ça me donne 0, je pense que comme il n'est sensé interpréter que les entier, des lettre ça le perturbe : comment faire ?

a+

Hors ligne

#2 Le 11/05/2016, à 17:27

jplemoine

Re : Question très simple en C

BenjiBoy a écrit :

je pense que comme il n'est sensé interpréter que les entier, des lettre ça le perturbe : comment faire ?

Ben, disons que je ne sais pas combien font JKL/1800...
Ensuite, il est possible que un entier divisé par un autre entier donne un entier (je ne me souviens plus de mes cours de C mais la langage que j'utilise tous les jours est assez proche).
si i = 1,
i/2 --> 0
i/2.0 --> 0.5
Il est donc possible qu'il faille mettre 1800.0 et non 1800 pour forcer les décimales.


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#3 Le 11/05/2016, à 17:29

BenjiBoy

Re : Question très simple en C

Pour info voilà ce que me donne le dump :


array(1): {
  [0] int: 24768
}

Et je m'aperçois qu'il s'agit d'un tableau !
Ca doit donc être le point bloquant.
Je ne sais comment récupérer uniquement la valeur 24768 pour en faire un entier utilisable.

Avez-vous des idées ?
Je vous remercie,

a+

Hors ligne

#4 Le 11/05/2016, à 17:33

BenjiBoy

Re : Question très simple en C

Ah oui très bonne idée !

J'ai une réponse mais ce n'est pas normal Je m'exprime direct via le code :

    Bat1 = nb_modbus_read_regs(fd, 0, 1);

    /*facteur de correction des valeurs*/
    Bat11 = Bat1 / 1800.0;

    /* print data*/
    dump(Bat1);
    dump(Bat11);

Et voilà le dump :

array(1): {
  [0] int: 24768
}
float: 0.0005555555556

Du coup j'ai pas suivi ...
Ah et au cas ou ça t'aurais échappé, je suis pas très bon en C... lol

Hors ligne

#5 Le 11/05/2016, à 18:04

claudius01

Re : Question très simple en C

Bonjour,

Tout d'abord BenjiBoy, travaille tu avec cette API: SDK API Manual NetModule AG ?

1 - Si oui, je lis page 11:

2.3.11 nb_modbus_read_regs

Prototype: array nb_modbus_read_regs (int fd, int addr, int len)

The nb_modbus_read_regs function reads the status of the registers from the remote device.
fd       file descriptor
addr   address of registers to read
len     length of data to read

The function returns the number of read status registers if successful, otherwise -1.

Et donc, Bat1 est bien un tableau qui divisé par un nombre entier (ou flottant) donne je ne sais pas quoi ;-)
Faudrait connaître la définition exacte dans le code de array qui, sauf erreur de ma part, n'est pas un mot clé du Langage C...

2 - Sinon, je passe mon chemin...

Dernière modification par claudius01 (Le 11/05/2016, à 18:13)

Hors ligne

#6 Le 12/05/2016, à 08:10

Bigcake

Re : Question très simple en C

Bonjour,

Tu ne donne pas beaucoup de détails sur ton code ....
Quel est le type de ta variable bat1 ? int ? int* ? autre ?

Si claudius01 a vu juste Bat1 dois être un pointeur vers un tableau de donnés
Si c'est un type simple avec une étoile (prenons int *)
Alors il faut diviser les cases de ton 'tableau' :

Bat1[0] /= 1800
Bat1[1] /= 1800
etc....

Si c'est un pointeur vers structure
Il faudra voir quel variable t’intéresse dans la structure et la diviser :

Bat1[0].value /= 1800

ou selon le 'niveau' de pointeur

Bat1[0]->value /= 1800

"Les gens" ne sont pas cons, ils ont été habitués à la facilité et à la désinformation. Le meilleur moyen de ne pas les aider, c'est de se moquer. Le meilleur moyen de les aider, c'est de les informer, encore et encore. La réflexion viendra. N'oubliez pas que vous aussi, vous êtes le con d'un autre.
Smartphone+GNU/Linux=Librem5

Hors ligne

#7 Le 12/05/2016, à 08:21

Nasman

Re : Question très simple en C

Pour info 0.0005555555556 = 1/1800, ce qui indiquerait que bat1 = 1


PC fixe sous Bionic 64 bits et portable avec Focal 64 bits

Hors ligne

#8 Le 12/05/2016, à 08:48

BenjiBoy

Re : Question très simple en C

Salut tous,

alors dans l'ordre :
@claudius01 (tiens mais tu m'avais déjà bien conseillé à propos des communication série UART en half duplex !) : tu as vu juste, c'est du SDK qui est utilisé sur un NB1600 de chez NetModule, bien joué !
Donc oui c'est ça ça donne un tableau et du coup j'essaie de diviser un tableau par un entier : impossible ou aberrant au résultat.

@Bigcake :

Bat1[0] /= 1800

Et ben c'est tout à fait ça. Là j'ai une valeur cohérente et on retombe sur un 13,8 et des pouillièmes ...
C'est nickel !
Etant un novice total en C, je n'ai aucun tips pour me sortir de ce genre de mouise, merci le forum !

@Nasman : oui je m'en rendait compte également, il doit considéré un talbeau comme 1.

Merci à vous tous, je peux clore le sujet !

Hors ligne

#9 Le 12/05/2016, à 09:04

BenjiBoy

Re : Question très simple en C

Ah, avant de clore, question subsidiaire.

Donc la fonction "dump" affiche dans l'interface du NB1600 le résultat du script, soit.

Moi j'aimerais inscrire ça dans un fichier, comme faire en C (enfin en SDK) ?
En bash on fait un truc du style ls -l machin > fichier.txt mais là ?

Hors ligne

#10 Le 12/05/2016, à 10:27

claudius01

Re : Question très simple en C

Bonjour,

BenjiBoy, tu es sous Linux en Langage C et donc: Recherche linux langage c ecriture fichier...

Cf. en autre (mais il y a moult topics ;-), comme Cours Langage C - Lecture & Écriture dans des fichiers ;-)

Hors ligne

#11 Le 12/05/2016, à 10:40

pires57

Re : Question très simple en C

FILE* fichier = NULL;
fichier = fopen("\home\anthony\ProgC\TestFic\fichier", "r+"); //on ouvre le fichier (lecture / écriture)
if (fichier != NULL){
        // On lit et on écrit dans le fichier, c'est à toi d'intégrer ton code ici, en C il existe des fonctions pour écrire dans les fichiers ( fputc / fputs / fprintf ... )
fclose(fichier); // On ferme le fichier
}
 

Utilisateur d'Archlinux, Ubuntu et Kali Linux
Administrateur système et réseau spécialisé Linux.
LinkedIn

Hors ligne

#12 Le 18/05/2016, à 10:32

BenjiBoy

Re : Question très simple en C

Hello,

Donc merci claudius01 j'ai jeté un oeil, c'est vraiment pas trivial à découvrir le C ... Loin d'être instinctif.
Mais bon une bonne occasion de se cultiver.

Pires57, j'ai intégré ton bout de code comme suit :

 FILE* fichier = NULL;
    fichier = fopen("\var\log\fichier", "r+"); //on ouvre le fichier (lecture / écriture)
    if (fichier != NULL){
        // On lit et on écrit dans le fichier, c'est à toi d'intégrer ton code ici, en C il existe des fonctions pour écrire dans les fichiers ( fputc / fputs / fprintf ... )

[b]    fprintf(Bat1);[/b]

    fclose(fichier); // On ferme le fichier
    }

avec le fprintf il devrait remplir le fichier de cette valeur, non ?
J'ai fais un essai sans que le fichier existe, il ne l'a pas créé, normal ?
Ensuite j'ai créé le fichier, il ne l'a pas rempli ?

J'ai mal syntaxé ?


a+

Hors ligne

#13 Le 18/05/2016, à 10:38

claudius01

Re : Question très simple en C

Bonjour,

BenjiBoy a écrit :

... c'est vraiment pas trivial à découvrir le C ... Loin d'être instinctif.
...
J'ai mal syntaxé ?

- C'est comme tout, faut s'investir un peu voire beaucoup ;-)
- Mauvaise syntaxe du fprintf() effectivement: cf. man printf and Co...

Hors ligne