Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1262 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Copie de tableau de structure de double dans un tableau char

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Copie de tableau de structure de double dans un tableau char

n°1107497
arconius
Posté le 03-06-2005 à 18:16:57  profilanswer
 

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
mood
Publicité
Posté le 03-06-2005 à 18:16:57  profilanswer
 

n°1107510
Taz
bisounours-codeur
Posté le 03-06-2005 à 18:28:08  profilanswer
 

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.

n°1107512
arconius
Posté le 03-06-2005 à 18:30:19  profilanswer
 

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

n°1107516
arconius
Posté le 03-06-2005 à 18:32:59  profilanswer
 

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

n°1107518
Taz
bisounours-codeur
Posté le 03-06-2005 à 18:35:25  profilanswer
 

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

n°1107527
arconius
Posté le 03-06-2005 à 18:40:37  profilanswer
 

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

n°1107529
Taz
bisounours-codeur
Posté le 03-06-2005 à 18:41:11  profilanswer
 

nan.

n°1107531
Taz
bisounours-codeur
Posté le 03-06-2005 à 18:41:40  profilanswer
 

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

n°1107535
arconius
Posté le 03-06-2005 à 18:44:51  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Copie de tableau de structure de double dans un tableau char

 

Sujets relatifs
Trier un tableau suivant une colonneCentrer un tableau verticlalement???
comment faire de beau tableau ?figer les entete d un tableau
css et different element d'un tableautableau css bordure
Renvoi d'un tableau[ASP] Problème de declaration de tableau [Résolu]
Conversion char --> unsigned shortConversion char ---> unsigned short
Plus de sujets relatifs à : Copie de tableau de structure de double dans un tableau char


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR