IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Cr�er un flux de floats


Sujet :

C++

  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    117
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 117
    Par d�faut Cr�er un flux de floats
    Salut !

    J'ai un peu regard� la faq concernant les flots ...

    Je voudrais envoyer un tableau de floats (g�n�r�s al�atoirement) par socket, en envoyant d'abord le tableau dans un flux puis envoyer ce flux par socket ...
    La seule chose que je trouve est de transformer le nombre en binaire ou en hexa pour l'envoyer puis de faire la conversion � la r�cup�ration du flux.

    Je me demandais s'il n'�tait pas possible de directement �crire les floats dans le flux en tant que binaire (�crire automatiquement les bits) plut�t que de passer par une string ou un caract�re serait 0 ou 1 dans mon cas.

    En gros je voudrais pouvoir faire comme pour la lecture dans un fichier en binaire ...

    Quelqu'un aurait une solution ?

  2. #2
    Membre �prouv�
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    90
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Par d�faut
    en envoyant d'abord le tableau dans un flux puis envoyer ce flux par socket
    Pourquoi vouloir passer par un flux ? C'est trop simple d'utiliser directement le tableau ?

    Mais bon, si tu veux cr�er un istream qui sorte des float non format�s, voil� quelques pistes :
    • la lecture de donn�es binaires depuis un stream se fait avec des m�thodes du type read()
    • pour utiliser l'op�rateur >> il va falloir le surcharger
    • 'last but not least', comment cr�er un istream � partir d'un tableau ? La seule solution que je connaisse est d�river stringbuf en Stringbuf (par exemple ; on peut aussi d�river basic_streambuf mais c'est plus compliqu�) pour initialiser le tampon avec le tableau, puis initialiser un istream avec Stringbuf. J'ai propos� le code dans ce forum, mais je trouve que ce n'est pas tr�s pratique. Si quelqu'un a mieux...

  3. #3
    Membre �prouv�
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    90
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Par d�faut
    Si quelqu'un a mieux...
    J'ai mieux :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     vector<float> v;
     
     /* ... */ // initialisation de v
     
     stringbuf sb(ios_base::in | ios_base::out | ios_base::binary);
     iostream io(&sb);
     io.write((char *)&v[0],v.size()*sizeof(float));
     
     // le flux io est prêt pour la lecture avec read()

  4. #4
    Membre confirm�
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    117
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 117
    Par d�faut
    Ben je veux bien envoyer le tableau directement mais tu fais comment ? Ou alors dans ce cas tu transforme ton tableau en une chaine de caract�res ...

    Ce que je voudrais moi c'est l'envoyer en binaire ...

    Boromir73 : Je suppose que ton code marche aussi avec un tableau au lieu d'un vector en faisant :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    float tab[SIZE];
     
     /* ... */ // initialisation de tab
     
     stringbuf sb(ios_base::in | ios_base::out | ios_base::binary);
     iostream io(&sb);
     io.write((char *)&tab[0],SIZE*sizeof(float));

  5. #5
    Membre �prouv�
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    90
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Par d�faut
    Je ne saisis pas bien ce que tu veux dire par "envoyer en binaire" :
    1 float (32bits) => 4 octets ?
    1 float (32bits) => 32 octets ?

    Quelle syntaxe utilises-tu pour l'instant avec ton socket ?

    Et oui, le code que je propose devrait marcher avec un tableau (mais �a fait 1 float (32bits) => 4 octets).

  6. #6
    Membre confirm�
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    117
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 117
    Par d�faut
    Oui c'est envoyer 4 octexct que je veux.

    En gros je veux lire un float en lisant un bloc de taille sizeof(float)

    Mai sje ne veux pas lire une s�quence de 1 et de 0 � la main ...

  7. #7
    Membre �prouv�
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    90
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Par d�faut
    Ok.
    Quelle syntaxe utilises-tu pour l'instant avec ton socket ?

  8. #8
    Membre confirm�
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    117
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 117
    Par d�faut
    Pour le moment pour envoyer mes donn�es je fais :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    std::ostringstream oss;
    for(int i=0; i < nbChannels; i++){
    	oss << (float)(-15 + ((double)rand() / ((double)RAND_MAX + 1) * 30)) << ";";
    }
    oss << std::endl;
    std::string result = oss.str();
    send(AcquisitionServeur::acceptation, result.c_str(), result.size(), 0);
    Et pour les lire :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    int lire = recv(sock, tampon, sizeof(tampon), 0);
    	if(lire != SOCKET_ERROR){
    		for(int i =0; i < lire; ++i){
    			if(tampon[i] == ';'){
    				sampleList.push_back((float)atof(tmp));
    				if (sampleList.size() == nbCol){
    					sendValuedEvent(_destination, eeg_eventId, sampleList);
    					sampleList.clear();
    				}
    				for(k=0; k<256; k++) tmp[k] = '\0'; 
    				k = 0;
    			} else {
    				tmp[k++] = tampon[i];
    			}
    		}
    	}
    }
    En gros je parse m�a chaine d'arriv�e ...

    par contre je vois bien ce que tu veux dire pour �crire en binaire dans le flot, mais tu le passe comment le flot apr�s au socket ?

    Tu fais comme �a ?
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    stringbuf sb(ios_base::in | ios_base::out | ios_base::binary);
    iostream io(&sb);
    float t;
    for(int i=0; i < nbChannels; i++){
    	t = -15 + ((double)rand() / ((double)RAND_MAX + 1) * 30);
    	io.write((char *)&t,sizeof(float));
    }
    send(AcquisitionServeur::acceptation,io , nbChannels*sizeof(float), 0);

  9. #9
    Membre confirm�
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    117
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 117
    Par d�faut
    Et pour savoir tu inclu quel header pour pouvoir utiliser les ios_base ?

  10. #10
    Membre �prouv�
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    90
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Par d�faut
    Pour �crire dans ton socket (mais sans les ';') :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
     vector<float> v;
     
     /* initialisation de v */
     
     send(AcquisitionServeur::acceptation, (char *)&v[0], v.size()*sizeof(float), 0);
    Pour �crire dans ton socket (avec les ';') :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
     ostringstream oss;
     
     /* remplissage de oss (en utilisant write pour les floats) */
     
     string result(oss.str());
     send(AcquisitionServeur::acceptation, result.c_str(), result.size(), 0);
    quel header pour pouvoir utiliser les ios_base
    #include <ios>

  11. #11
    Membre confirm�
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    117
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 117
    Par d�faut
    Ok onm'a expliqu� un truc que j'avais pas compris sur les sockets ...

    Quan j'�crivais ma chaine je n'avais pas fait le lien avec le fait que j'�cris � partir d'une adresse et sur une taille donn�e ...

    Donc en �crivant directement les floats (� partir de leur adresse) sur leur taille dans le socket �a fera excatement ce que je veux ...

    je sais je suis un boulet

  12. #12
    Membre confirm�
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    117
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 117
    Par d�faut
    Du coup voil� mon code pour envoyer, il semble bon ...

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    for(int i=0; i < nbChannels; i++){
    	tab[i] = (float)(-15 + ((double)rand() / ((double)RAND_MAX + 1) * 30));
    }
    send(AcquisitionServeur::acceptation, (char*)&tab, nbChannels*sizeof(float), 0);
    Par contre � la r�ception j'ai un pb ...

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    float* tampon = new float[nbCol];
    int lire = recv(sock, (char*)tampon, sizeof(float)*nbCol, 0);
    if(lire != SOCKET_ERROR){
    	/* lecture du tableau */
    }
    et l� il trouve des r�sultats incoh�rents dans le tableau ...

    Le client et le serveur s'ex�cute pour le moment sur la m�me machine, mais comment passer les donn�es par un mode r�seau (comme htons htonl pour les int) avec des floats.

    J'ai entendu parler de XDR et RPM il me semble ...

  13. #13
    Membre �prouv�
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    90
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Par d�faut
    Ce n'est pas "(char *)&tab" mais "(char *)tab".

  14. #14
    Membre confirm�
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    117
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 117
    Par d�faut
    En effet merci !

    Ca � l'air mieux d'un coup

    Faut que je v�rifie plus en d�tail maintenant

  15. #15
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2003
    Messages
    3 549
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 3 549
    Par d�faut
    T'es au courant que c'est pas portable du tout j'esp�re ?

  16. #16
    Membre confirm�
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    117
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 117
    Par d�faut
    Le c�t� envoi de donn�es �a m'importe peu �a utilise une machine d'acquisition dont le driver n'a �t� fait pou windows ...

    Par contre je ne vois pas pourquoi le code ne serait pas portable pour la r�cup�ration des donn�es (au #ifdef pr�s en fonction de si on est sous windows ou sous linux ...)

    Donc a part les sockets je ne vois pas ce qui ne serait pas portable (et encore les sockets �a m'a demand� un copier cooler sur le net pour le rendre portable)

  17. #17
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2003
    Messages
    3 549
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 3 549
    Par d�faut
    je ne vois pas pourquoi le code ne serait pas portable pour la r�cup�ration des donn�es
    Tout simplement parce toutes les machines n'utilisent pas la m�me repr�sentation binaire des nombres flottants.

  18. #18
    Membre confirm�
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    117
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 117
    Par d�faut
    Ah oui �a aussi ...

    C'est pour �a que je demandais s'il y avait l'�quivalent des htons/l pour les flottants ...

  19. #19
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    C'est pire que �a. Je ne suis m�me pas s�r que toutes les machines utilisent la m�me convention IEEE pour les flottants -- on n'a d�j� pas de garantie de taille...
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Cr�er un flux RSS
    Par okoweb dans le forum Langage
    R�ponses: 16
    Dernier message: 26/10/2011, 12h55
  2. Cr�er un flux XML dans un dataHandler
    Par flethiel dans le forum Format d'�change (XML, JSON...)
    R�ponses: 1
    Dernier message: 25/09/2007, 12h03
  3. [FLASH MX2004] Cr�er un flux xml
    Par j0hnmerrick dans le forum Flash
    R�ponses: 3
    Dernier message: 23/02/2005, 12h02
  4. [DOM] Comment cr�er des flux XML en java ?
    Par nean_j dans le forum Format d'�change (XML, JSON...)
    R�ponses: 3
    Dernier message: 27/04/2004, 12h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo