Copie de tableau de structure de double dans un tableau char

Copie de tableau de structure de double dans un tableau char - C++ - Programmation

Marsh Posté le 03-06-2005 à 18:16:57    

Bonjour à tous tout d'abord :)
 
 
Je bloque actuellement sur un problème que je trouve personnellement compliquer. En gros pour vous situer le contexte, je programme un Doomlike en OpenGl. Je code actellement la partie réseau, seulement chaque personnage ou balle est caractérisée par un structure de double :
 
struct tir
{
 double x,y,z,angleTX,angleTZ;
};
 
(les angles c pour le calcul des directions)
 
chaque élement est stocké dans un tableau permetant d'être représenter sur chaque pc ensuite :
 
tir tirs[800];
tir vaiss[8];
 
maintenant mon problème :
 
Comme vous le savez pour l'envoie de packet via des sockets on utilise les fonctions send et recv.  
Or ceux ci requier un tableau de char en paramètre. Il me faut donc convertir mes tableaux de structures de double en tableau de char.
 
je vous passe le code qui me bloque : (je sais c super lourd de regarder un code comme ça alors j'ai essayer de le commenter, je n'ai aucune erreur de compilation, c juste que ça plante sur un memcpy je crois durant l'execution :s)
 

Code :
  1. #include <stdio.h>
  2. #include <winsock.h>
  3. #define TAILLE 50
  4. struct tir
  5. {
  6. double x,y,z,angleTX,angleTZ;
  7. };
  8. SOCKET sock[7],sock_attente,sockc;
  9. char buffserv[8080],buffcli[20];
  10. SOCKADDR_IN csin;
  11. SOCKADDR_IN sin1;
  12. int sinsize;
  13. unsigned long ioctl_opt =1;
  14. fd_set readfds;
  15. tir buffglob[808],buffpt[2];
  16. bool serv = false;
  17. bool jeu = false;
  18. void serveur()                               //fonction pour initialiser le mode serveur
  19. {
  20. WSADATA WSAData;                         //Nécéssaire au sockets made in Windows
  21. WSAStartup(MAKEWORD(1,1), &WSAData);
  22. FD_ZERO(&readfds);                       //fd_set sera utiliser pour rendre recv non bloquant
  23.    
  24.     sinsize = sizeof(sin1);
  25.     sin1.sin_addr.s_addr = INADDR_ANY;       //construction de mon socket  
  26.     sin1.sin_family     = AF_INET;
  27.     sin1.sin_port     = htons(200);        //le port que l'on désire ouvrir
  28. sock_attente = socket(AF_INET, SOCK_STREAM, 0);
  29. bind(sock_attente, (SOCKADDR *)&sin1, sinsize);
  30. listen(sock_attente, 7);                 //permet d'accepter jusqu'à 7 client
  31. ioctlsocket(sock_attente,FIONBIO,&ioctl_opt); //sockets en mode non bloquants
  32. }
  33. int client()                                 //initialisation du mode client
  34. {
  35. char ret[2];
  36. WSADATA WSAData;
  37. WSAStartup(MAKEWORD(1,1), &WSAData);
  38.    
  39.     FD_ZERO(&readfds);
  40.                                                    
  41. sockc = socket(AF_INET, SOCK_STREAM, 0); 
  42.  
  43.     sinsize = sizeof(sin1);
  44.    
  45.     sin1.sin_addr.s_addr = inet_addr("127.0.0.1" );
  46.     sin1.sin_family     = AF_INET;
  47.     sin1.sin_port     = htons(200);         // le port que l'on désire ouvrir
  48.    
  49.     connect(sockc, (SOCKADDR *)&sin1, sinsize);
  50. FD_SET(sockc,&readfds);                   //permet de rendre la fonction recv non bloquante
  51. select(0,&readfds,0,0,NULL);
  52. if(FD_ISSET(sockc,&readfds))
  53. recv(sockc,ret,2,0);                      //ici je reçoit mon numéro de client
  54. return atoi(ret);
  55. }
  56. void ecoute(int *i)         //fonction permetant au serveur d'accepter les connection de nouveau client
  57. {   
  58. char ret[2];
  59. FD_SET(sock_attente,&readfds);            //pour rendre accept non bloquant
  60. select(0,&readfds,0,0,NULL);
  61. if (FD_ISSET(sock_attente, &readfds))
  62. {
  63.  sock[*i] = accept(sock_attente, (SOCKADDR *)&csin, &sinsize);
  64.  FD_SET(sock[*i],&readfds);
  65.  *i++;
  66.  send(sock[*i],itoa(*i,ret,10),80,0);  //j'envoie au nouveau client son numéro
  67. }
  68. }
  69. void env_rec(int nbcli,int *nbtir,bool serv,tir tirs[800],tir vaiss[8])  //fonction d'envoie reception
  70. {
  71. int k;
  72. if(!serv)                                //reception coté client
  73. {
  74.  tir cli[2];
  75.  cli[0]=tirs[*nbtir];
  76.  cli[1]=vaiss[nbcli];
  77.  memcpy((void *)buffcli,(const void *)cli,80); //je copie les coordonnée de mon vaisseau et de mon dernier tir dans le buffer
  78.  send(sockc,buffcli,80,0);            //j'envoie
  79.  FD_ZERO(&readfds);                   //je réinitialise mon ensemble de socket
  80.  FD_SET(sockc,&readfds);              //je rend recv non bloquant   
  81.  select(0,&readfds,0,0,NULL);
  82.  if(FD_ISSET(sockc,&readfds))
  83.  {
  84.   recv(sockc,buffserv,32320,0);    //ici je reçois les coordonnées de l'ensemble des tirs et vaisseau  
  85.  }
  86.  memcpy((void*)buffglob,(const void*)buffserv,32320);
  87.  for(k=0;k<800;k++)                   //je réordonne tout ça
  88.   tirs[k]=buffglob[k];
  89.  for(k=800;k<808;k++)
  90.   vaiss[k-800]=buffglob[k];
  91. }
  92. else                                     //reception coté serveur
  93. {
  94.  int i;
  95.  for(i=0;i<800;i++)                   //copie de l'ensemble des coordonnées dans un tableau
  96.   buffglob[i]=tirs[i];
  97.  for(i=800;i<808;i++)
  98.   buffglob[i]=vaiss[i-800];
  99.  memcpy((void*)buffserv,(const void*)buffglob,32320); //copie de ce tableau dans un buffer
  100.  for(k=0;k<nbcli;k++)
  101.   send(sock[k],buffserv,32320,0);  //envoie de ces coordonnées à tous les clients
  102.  for(k=0;k<nbcli;k++)                 //reception des coordonnées de tous les clients
  103.  {
  104.   FD_SET(sock[k],&readfds);
  105.   select(0,&readfds,0,0,NULL);
  106.   if(FD_ISSET(sock[k],&readfds))
  107.    recv(sock[k],buffcli,80,0);
  108.   memcpy((void*)buffpt,(const void*)buffcli,80);
  109.   if(buffpt[0].x>-TAILLE && buffpt[0].x<TAILLE)//si les coordonnées du tir sont dans la zone de jeu je les copies
  110.   {
  111.    tirs[*nbtir]=buffpt[0];
  112.    *nbtir++;
  113.    if(*nbtir==800) *nbtir=0;
  114.   }
  115.   vaiss[k]=buffpt[1];
  116.  }
  117. }
  118. }
  119. void main()
  120. {
  121. static int i,j=0,test=0,nbcli=0,nbtirs=0,T=0;
  122. tir tirs[800];
  123. tir vaiss[8];
  124. //Menu
  125. printf("\t 1     - Mode serveur (Echap pour quitter une fois connecter)\n" );
  126. printf("\t 2     - Mode client\n\n\n" );
  127. printf("Choix :" );
  128. scanf("%d",&i);
  129. //Mode serveur
  130. while(1)
  131. {
  132. if(i==1)
  133. {
  134.  serv=true;
  135.  if(!jeu)
  136.  {
  137.   serveur();
  138.   jeu=TRUE;
  139.  }
  140.  ecoute(&nbcli);
  141.  T=nbcli;
  142. }
  143. //Mode client
  144. else if (i==2)
  145. {
  146.  if(!jeu)
  147.  {
  148.   T=client();
  149.   jeu=TRUE;
  150.   nbcli=T;
  151.  }
  152. }
  153. if(jeu)
  154.  env_rec(nbcli,&nbtirs,serv,tirs,vaiss);
  155. }
  156. }


Message édité par arconius le 03-06-2005 à 18:20:25
Reply

Marsh Posté le 03-06-2005 à 18:16:57   

Reply

Marsh Posté le 03-06-2005 à 18:28:08    

j'ai pas tout suivi, c'est du C. Je ne comprends pas ce que tu veux faire des des char*. send et recv demande des void*. pas  de basser par des buffer et des casts inutiles.

Reply

Marsh Posté le 03-06-2005 à 18:30:19    

Send et recv prenne du void *. Hum hum v voir ça lol, mais si c vrai je suis vraiment stupide d'avoir perdu autant de temps :)

Reply

Marsh Posté le 03-06-2005 à 18:32:59    

Bon ben je suis stupide, je teste sans tous mes memcpy détestable et peu fiable, si je bloque encore je repasserais ;).
 
En tout cas merci de répondre aussi vite je suis bluffer :)

Reply

Marsh Posté le 03-06-2005 à 18:35:25    

ni besoin de memcpy
 
Foo tab[N]
 
send( , tab, N * sizeof tab[0]); ...

Reply

Marsh Posté le 03-06-2005 à 18:40:37    

Bon j'ai essayer comme ça mais je bloque sur un autre turc j'ai l'impression :), v poster ça dans la section C si j'ai bien compris alors :)
 
merci encore :)

Reply

Marsh Posté le 03-06-2005 à 18:41:11    

nan.

Reply

Marsh Posté le 03-06-2005 à 18:41:40    

tu termines ton problème ici, et tu arrêtes les tartines de code imbittables

Reply

Marsh Posté le 03-06-2005 à 18:44:51    

Mince j'ai pas vue ton dernier post, v supprimer monautre message alors et je vais essayer de mieu cibler mon problème pour vous limiter la prise de tête :)


Message édité par arconius le 03-06-2005 à 18:45:10
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed