begin process at 2012 05 30 19:19:55
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Truc de fou : Pointeurs qui ne comprennent pas les cases vides


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Truc de fou : Pointeurs qui ne comprennent pas les cases vides

samedi 11 juin 2005 à 16:01:36 | Truc de fou : Pointeurs qui ne comprennent pas les cases vides

toddis

Bonjour,


Voilà je suis en train de faire un driver modbus et pour cela j'ai crée une fonction qui calcule le lrc ( controle de validité du message).

Le programme doit fonctionner sous Labwindows cvi.


Concretement la fonction lrc pointe successivement sur tous les élements d'un tableau.  Le problème et que si il y a un 0 dans la chaine de caractere la fonctions plante.

Ce qui est vraiment étrange c'est que ce meme code compilé sous Visual fonctionne parfaitement ( je viens d'essayer parcequ'apres avoir cherché longtemps je n'ai pas trouvé d'erreur propre a la sytaxe du C.

Dc si qqun pouvait m'indiquer si il se passe qq chose au niveau du compilateur.   merci d'avance

voilà mon code:

// modbus.cpp : Defines the entry point for the console application.
//

#include "stdafx.h" /* sous visual*/
#include <ansi_c.h>/* sous cvi*/


unsigned char Exemple[8]={0x01,0x08,0x00,0x00,0x61,0x62,0x00,0x00} ;


void Num_to_ASCII(unsigned char *Nombre)
{
if (*Nombre<=9)   // 0 -> 9  Le code ASCII est donné par un décalage de 30
 {*Nombre=*Nombre+0x30;}
else   // A -> F  Il faut indiquer le code
 { switch (*Nombre)
    {
    case 10:
    *Nombre = 0x41; 
    break;
   
    case 11:
    *Nombre = 0x42;
    break;
   
    case 12:
    *Nombre = 0x43;
    break;
   
    case 13:
    *Nombre = 0x44;
    break;
   
    case 14:
    *Nombre = 0x45;
    break;
   
    case 15:
    *Nombre = 0x46;
    break;
   
    default:
    break;
    }
  } 
}

 

 

unsigned short int calculate_lrc(unsigned char *z_p, unsigned short int z_message_length)
/* Fait tourner l'algorithme de longitudinal de redondance cyclique sur l'entrée z_p
(On donne l'adresse de départ dans l'appel à la fonction)*/
/* Renvoie une valeur de 16 bits LRC après achèvement et ajoute toujours 2 octets LRC au message */
 

{
unsigned char somme=0;
unsigned char next; // octet sur lequel on travaille
unsigned short int n, LRC=0;
unsigned short int Longueur_Message=z_message_length;
unsigned char lrch, lrcl,lrchA=0,lrclA=0;

 

/* Calcul de la somme */
while (z_message_length--) {
  next = (unsigned char)*z_p;
  somme+=next;// On utilise 1 octet pour faire modulo 256
  z_p++;// c sur le pointeur que ca merde
  }
  
/* Complément à 2 */
somme = (0xFF-somme)+1;

/* Conversion en ASCII */
lrch=((somme & 0xf0)>>4);
lrcl=(somme & 0x0f);

Num_to_ASCII(&lrch);
Num_to_ASCII(&lrcl);


LRC = (lrchA<<8) | (lrclA);

z_p=z_p-Longueur_Message;

/*On place le lrc en fin de trame*/
z_p[Longueur_Message+1] = lrcl;
z_p[Longueur_Message] = lrch;

 

//z_p[Longueur_Message+1] = 0xFF;
//z_p[Longueur_Message] = 0xFF;

 

return LRC;
}  
  
  
  

 

int main(int argc, char* argv[])
{
 calculate_lrc (Exemple,6);
 printf("Hello World!\n");
 
 return 0;
}

samedi 11 juin 2005 à 16:16:40 | Re : Truc de fou : Pointeurs qui ne comprennent pas les cases vides

toddis

oui aussi j'ai oublié d'ajouter que si il n'y avait aucun 0 dans la trame la fonction lrc fait bien son travail
samedi 11 juin 2005 à 18:09:36 | Re : Truc de fou : Pointeurs qui ne comprennent pas les cases vides

AlexMAN

Membre Club
Comment passes tu la taille de la chaine de caracteres a la fonction calculate_lrc() ? Si tu passes cette taille avec un strlen(), la taille ne sera pas correct car le 'calcul' s'arretera au premier 0 rencontré.

+2(p - n)
samedi 11 juin 2005 à 19:31:02 | Re : Truc de fou : Pointeurs qui ne comprennent pas les cases vides

toddis

La taille je la passe directement en numérique ou par une variable (enfin c pour plus tard quand j'aurais des trame de longueur variable) et jusqu'a présent je n'ai jamais utilisé de fonction pour ca.  dc je comprend pas qu'en changeant de compilateur ca marche!  y a peut etre des compilateurs qui croient que les cases avec 0 ne correspondent pas à une variable déclarée non?

samedi 11 juin 2005 à 20:04:27 | Re : Truc de fou : Pointeurs qui ne comprennent pas les cases vides

mezaya

Moi je trouve ça très bizarre parceque le code a l'air d'être bon. tu as essayer de debugger ligne a ligne et en vérifiant toutes les sorties.

Voili,Voilou
dimanche 12 juin 2005 à 09:49:01 | Re : Truc de fou : Pointeurs qui ne comprennent pas les cases vides

toddis

Merci , je commencais a me poser des questions sur mes compétences ;-)

oui j'ai vérifié le prog ac le debugger et en surveillant l'adresse pointée a chaque itération=>
sur visual c  : tout se passe bien
sur cvi  :  Le pointeur n'avance plus si il trouve 0x00 



Cette discussion est classée dans : message, nombre, char, unsigned, lrc


Répondre à ce message

Sujets en rapport avec ce message

pb avec conio je cher cherche l'erreur( j'ai merde sur le mess precedent) [ par kin ] portpia.cpp#include"PortPiaPc.h"void main(){ PortPiaPc inst; inst(0x320,0x0f);}PortPiaPc.cpp#include "PortPiaPc.h"#include "conio.h"PortPiaPc::PortPia Comment concertir Ansistring en unsigned char*????? [ par asik38 ] Ansistring x;unsigned char str[100];str[100]=x;??????Merci!!! Tableau de char* [ par alex1er ] Salut a tousJ'aimerais faire la déclaration suivante dans mon code : char * swSurface[]; //Tableau de char * doncSeulement, le compilo me jete car le char* to unsigned char* [ par rodrigos ] comment peut-on convertir un char* en unsigned char*?à quoi correspond un unsigned char*?Merci pour votre aide!! pb avec variable [ par jeffise57 ] Please aidez moiJe reçoit comme arugument du fonction des variables unsigned char* et je doit passer dans une deuxième fonction les même arguments mai PROBLEME NETSEND [ par zzzzzz ] En fait j'essaye d'envoyer un message par la fonction net send via internet a ordi qui posssede xp. Si je mjet mon ip ca marche et si je met l'ip de q Sniffing - raw socket [ par krum ] J'ai essayé de coder un programme capable de me donner la description de l'en tete IP et TCP des packets que je reçois d'une certaine IP,mais lorsque struct [ par ready4 ] Je ne sais pas comment initialiser mes moteurs //intialisation moteursM1 = {2, 1, 1, 2, 0, 0, 120};M2 = {8, 4, 4, 8, 0, 0, 80};M3 = {32, 16, 16, 32, 0 vecteur avec int et char [ par Tyroflan ] int **boursemain(){...cin >> nombre;for (unsigned int i=0;i bourse[i] = new int [5];donc je crée autant de vecteurs bourse que l'indique la variable vecteur avec int et char [ par Tyroflan ] int **boursemain(){...cin >> nombre;for (unsigned int i=0;i bourse[i] = new int [5];donc je crée autant de vecteurs bourse que l'indique la variable


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,108 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales