begin process at 2012 05 29 04:09:50
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Linux

 > 

GUI

 > 

intégration QT : pb avec sscanf


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

intégration QT : pb avec sscanf

lundi 30 novembre 2009 à 23:31:25 | intégration QT : pb avec sscanf

lural

Membre Club
Bonsoir à tous !

Un rapide exposé de mon travail, j'ai un projet en openGL qui tourne nickel (sous linux) et je souhaite l'intégrer dans une qglwidget pour une interface QT. Après nombreuses batailles j'arrive à compiler et tout, mais mes pièces ne s'affichent plus. Mes pièces sont des fichiers .obj que je charge dans un loader perso.
Le problème, depuis l'intégration QT, la lecture de ces fichiers ne tourne plus correctement...

Code (épurée):
float a, b, c;
char oneline[255];
while( readstr(filein,oneline) != 0)
{
printf("oneline : %s", oneline);
sscanf(oneline, "%s %f %f %f", buftmp, &a, &b, &c);
printf("scanf => %s %f %f %f\n\n", buftmp, a, b, c);
}

Et en sortie :
oneline : vn 0.831446 0.000000 -0.555559
scanf => vn 0,000000 0,000000 0,000000

Alors certes je pourrais faire un découpage différent mais vu l'avancement du projet, je préfèrerais comprendre l'erreur et patcher ça rapidement.
Je rappel que ces lignes fonctionnent sans l'interface QT, j'ai testé de passer les variables a, b, c en double (en vain).

Merci de votre attention
Je suis tout ouïe à vos suggestions

Bonne soirée à tous
mardi 1 décembre 2009 à 00:48:36 | Re : intégration QT : pb avec sscanf

CptPingu

Administrateur CodeS-SourceS
J'ai essayé ceci, en C et C++ et tout semble fonctionner. QT n'est qu'un framework, et n'a normalement pas d'incidence sur le reste.

Code C/C++ :
#include <stdio.h>

int main(void)
{
  float a, b, c;
  char oneline[256] = "vn 0.831446 0.000000 -0.555559";
  char buftmp[256] = {0};

  printf("oneline : %s", oneline);
  sscanf(oneline, "%s %f %f %f", buftmp, &a, &b, &c);
  printf("\n\nscanf => %s %f %f %f\n\n", buftmp, a, b, c);

  return 0;
}


As-tu essayé de faire du C++ au lieu de faire du C ?
Par exemple:
Code C/C++ :
#include <iostream>
#include <sstream>

int main(void)
{
  float a, b, c;
  char oneline[256] = "vn 0.831446 0.000000 -0.555559";
  std::string buftmp;

  std::cout << "oneline : " << oneline << std::endl;
  std::istringstream iss(oneline);
  iss >> buftmp >> a >> b >> c;
  std::cout << "\n\nscanf => "
	    << buftmp << " "
	    << a << " "
	    << b << " "
	    << c << std::endl;

  return 0;
}
mardi 1 décembre 2009 à 01:01:10 | Re : intégration QT : pb avec sscanf

lural

Membre Club
Merci CptPingu.

Alors oui en effet, istringstream fonctionne bien, et je sens que je vais tout re-coder avec ça... mais j'avoue que ça ne satisfait pas ma curiosité sur mon précédent résultat avec sscanf.
QT n'est qu'un framework, mais essayez de compiler un projet classique avec QT et vous risquez de voir certaines erreurs que g++ ne me signalé pas. Alors oui, je sais que le qmake ne gènerera qu'un Makefile qui utilise g++/gcc. Mais, même si je n'ai pas envie de trop fourrer mon nez dans des Makefile auto-généré, il s'avère que les résultats des compilations diffèrent...
Et selon mon exemple, le programme ne s'exécute pas de la même manière.

Donc pour résumé, merci beaucoup pour ton aide, je reste à l'écoute pour comprendre en quoi le sscanf "déconne" dans de telles circonstances.
mardi 1 décembre 2009 à 01:45:24 | Re : intégration QT : pb avec sscanf

lural

Membre Club
Après avoir repassé tout mon code avec des istringstream ... j'ai la surprise du siècle (de mon incompétence surtout)

Dans certains cas, istringstream fonctionne correctement :
ex : vn 0.831446 0.000000 -0.555559

Pour d'autre cas, il ne fonctionne pas comme je l'aurais pensé :
ex : f 191/191/191 190/190/190 222/222/222 223/223/223

La ligne suivante ne me renvoi de valeurs correcte que pour a
iss >> buftmp >> a >> b >> c >> d >> e >> f >> g >> h >> i >> j >> k >> l;

La ligne suivante fonctionne correctement :
sscanf(oneline, "%s %f/%f/%f %f/%f/%f %f/%f/%f %f/%f/%f", buftmp, &a, &b, &c, &d, &e, &f, &g, &h, &i, &j, &k, &l);

Alors soit je perd la boule, soit j'utilise mal istringstream lors du parsage où les délimiteurs donc des "/".
En espérant ne pas perdre la boule...
Merci pour votre attention
mardi 1 décembre 2009 à 10:21:16 | Re : intégration QT : pb avec sscanf

CptPingu

Administrateur CodeS-SourceS
Réponse acceptée !

mais j'avoue que ça ne satisfait pas ma curiosité sur mon précédent résultat avec sscanf.


Pour moi, tu as fait les choses correctement, et je ne vois pas pourquoi ça déconnerais. Reste que le mélange C et C++ (plus que QT), pourrait poser problème, mais je ne saurais te l'expliquer.

Pour d'autre cas, il ne fonctionne pas comme je l'aurais pensé :
ex : f 191/191/191 190/190/190 222/222/222 223/223/223

La ligne suivante ne me renvoi de valeurs correcte que pour a
iss >> buftmp >> a >> b >> c >> d >> e >> f >> g >> h >> i >> j >> k >> l;


N'oublie pas que std::istringstream prend comme délimiteur par défaut tout ce qui est dans isspace. Donc il faut que tu lui dises que "/" est délimiteur aussi.

Le même example, avec délimiteur:
Code C/C++ :
#include <iostream>
#include <sstream>

int main(void)
{
  float a, b, c;
  char oneline[256] = "vn 0.831446/0.000000/-0.555559";
  std::string buftmp;
  char delim;

  std::cout << "oneline : " << oneline << std::endl;
  std::istringstream iss(oneline);
  iss >> buftmp >> a >> delim >> b >> delim >> c;
  std::cout << "\n\nscanf => "
	    << buftmp << " "
	    << a << " "
	    << b << " "
	    << c << std::endl;

  return 0;
}
mardi 1 décembre 2009 à 18:28:08 | Re : intégration QT : pb avec sscanf

lural

Membre Club
Excellent, j'ai plus qu'a tester ça. Moi qui pensait devoir parser en partie ma chaine, je suis ravi de voir que istringstream est intelligent pour un problème comme ça :D
Merci beaucoup CptPingu
mardi 1 décembre 2009 à 18:33:54 | Re : intégration QT : pb avec sscanf

CptPingu

Administrateur CodeS-SourceS

Excellent, j'ai plus qu'a tester ça. Moi qui pensait devoir parser en partie ma chaine, je suis ravi de voir que istringstream est intelligent pour un problème comme ça :D


Attention tout de même, ce n'est pas une propriété de std::istringstream, mais un bon gros hack !
En effet, "delim" étant un caractère, std::instringstream va le remplir avec '/', comme si on le lui demandait.
Si on avait eu ça: "vn 0.831446/0.000000@-0.555559", ça aurait aussi fonctionner !

Normalement, la méthode propre pour faire cela, est en passant par un std:getline auquel on donne la liste des délimiteurs.
Vu que tu cherches juste à faire fonctionner ton truc, je t'ai donné une méthode rapide, mais ce n'est pas la plus robuste et propre :p
mardi 1 décembre 2009 à 21:27:34 | Re : intégration QT : pb avec sscanf

lural

Membre Club
Pour la robustesse, ça pourra toujours être apporter plus tard. Pour le côté propre, bien sur je pourrais tester que la caractère de séparation soit bien '/' ... mais les fichiers .obj que je charge ont une référence plutôt précise, et à laquel je souhaite coller. Donc pour ce cas là, ce sera largement suffisant.
Et par simple curiosité, pour ton explication :

Si on avait eu ça: "vn 0.831446/0.000000@-0.555559", ça aurait aussi fonctionner !


Je me demandais si j'avais eu : "vn 0.831446/0.000000-0.555559" est ce que cela aurait fonctionner ?
Je vais tester ça dessuite.
En tout cas MERCI ;)


Cette discussion est classée dans : pb, qt, intégration, sscanf, oneline


Répondre à ce message

Sujets en rapport avec ce message

Les variables globales...... [ par netman ] Bon la j'ai un petit probleme (normal sinon je poserais pas de question ....)Bon je fait un petit programme et la je suis confronte a un pb .....J'uti pb de base de donnee en C [ par tequ13 ] j'aimerais savoir comment faire pour charger des fichiers (*.txt) a l'ouverture d'un programme pour ensuite les comparer et repérer les doublons pour pb avec procedure [ par bidules ] bonjour,voila mon code(simplifier) :void affiche(int numero){cout }void main(){affiche(10);}et un message d'erreur apparait lors de la compilation Pb code source CMphSock [ par xaviou ] Salut.J'ai téléchargé le projet "CMphSock" : Utilisation de Winsock sans MFC.Je l'ai compilé en mode Debug : tout est OKJ'ai essayé en mode Release : petit pb de type string [ par bidules ] D'apres ce que g pu apprendre lorsque l'on veut declarer une variable de type string il faut faire :#include string variable;c bien ca? car qd je fais pb de grille avec visual C++ [ par cedcrow ] Salut,je cherche à rendre éditable les cellules créés dans mon objet de type flexgrid (comme un tableur excel quoi !). Je ne trouve pas la méthode app Pb avec Glut sous Visual C++ [ par Yoann ] Bonjour !Je viens de me mettre à OpenGL avec Glut, mais j'ai un petit problème. En effet, quand je compile un exemple, j'ai l'erreur suivante :TestGlu Pb avec Glut sous VC++ et Dev [ par mederic ] Je ne sais pas si ça vient de mon include ou autre chose. Mais je n'arrive pas executer un exemple simple sur plusieurs compilateurs.Sur VC++, il écri un ti pb sur les tableaux [ par Julius Caesar ] On range dans un tableau 8 entiers générés aléatoirement par l'ordi. coment faire pour être sur que chaque nombre généré soit uniquen c'est à dire qu' pb avec gluLookAt() ! [ par naugondo ] Comment ça marche !!En fait, a quoi correpondent les 3 dernières coordonnées ?


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

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 : 0,296 sec (4)

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