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

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

probleme sscanf char[] et char*


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

probleme sscanf char[] et char*

jeudi 26 octobre 2006 à 19:16:49 | probleme sscanf char[] et char*

jojomillenium

Bonjour,

J'ai un mechant bug que je n arrive vraiment pas a regler!
Voila j'ai une fonction qui li un fichier
            char couchelu[50];
                sscanf(chaine, "%d %s; %f, %f, %f, %f, %f", &numlayer, &couchelu, &h, &p, &r,&g,&b);
               
                switch(numlayer)
                {
                    case 0:
                        LLayer[numlayer].SetLayer(couchelu,"Well",0,-h,p,r,g,b,1.0);
                        break;
                    case 1:
                        LLayer[numlayer].SetLayer(couchelu,"N Diff",0,-h,p,r,g,b,1.0);
                        break;
                    case 2:
                        LLayer[numlayer].SetLayer(couchelu,"P Diff",0,-h,p,r,g,b,1.0);
                        break;
                 }

et mon SetLayer est de la forme (c'est une fonction d'une classe)
SetLayer(char* _nom_cif, char* _nom_couche, float z, float h, float p, float r, float g, float b, float a)
    {
        this->nom_cif = _nom_cif;
        this->nom_couche = _nom_couche;
        this->num_quads=0;
        this->zstart = z;
        this->hauteur = h;
        this->penetration=p;
        this->h = h;
        this->color.set(r, g, b, a);
        this->visible=true;
        this->existe=true;
    }

Seulement c'est vraiment bizzare parceque d apres le debug ce qu'il lis dans le fichier texte arrive bien dans SetLayer mais il met n'importe quoi a "nom_cif" genre un truc comme "¬|/$" !!!!
Mais si par exemple apres mon sscanf je "pirate" mon couchelu en mettant un couchelu = "Coucou";
bien sur dans tous les cas ce sera coucou qui sera envoyé, mais "Coucou" est cette fois bien enregitré dans mon "nom_cif " de ma classe!

Une idée de pourquoi et comment régler mon probleme?

Merci beaucoup pour votre aide, ca fait des heures que j'essaie toutes les solutions que je trouve!


jeudi 26 octobre 2006 à 20:33:03 | Re : probleme sscanf char[] et char*

Ombitious_Developper

Salut :

Comme la variable couchelu est de type "char *" alors tu dois omettre le "&" dans la fonction sscanf.

sscanf(chaine, "%d %s; %f, %f, %f, %f, %f", &numlayer, couchelu , &h, &p, &r,&g,&b);
                              
            
                                           
jeudi 26 octobre 2006 à 20:43:06 | Re : probleme sscanf char[] et char*

jojomillenium

Je te remercie, mais j'avais deja essayé!
et ca me fait toujours n importe quoi :
En fait si je met couchelu au lieu de &couchelu et que je declare avant mon couchelu en char[50] ca me fait n importe quoi!
et si je declare mon couchelu en char* la j'ai une erreur en entrant dans le switch du type : "Unhandled exception in 3D_VISU.exe: 0XC0000005: Access Violation" !!! A chaque fois que j essaie un truc, soit ca ecrit n importe quoi, soit j'ai cette erreur!

jeudi 26 octobre 2006 à 20:55:01 | Re : probleme sscanf char[] et char*

jojomillenium

Je viens de reussir a ne pas que ca ecrive n importe quoi, mais un autre probleme se passe,  tous mes objets LLayer[] ont comme nom_cif le dernier lu dans le fichier! C extrement bizzare

jeudi 26 octobre 2006 à 20:58:53 | Re : probleme sscanf char[] et char*

Ombitious_Developper

Salut :

Fais attention à l'allocation de la mémoire.
NE JAMAIS UTILISER UN POINTEUR NON INITIALISE.

Je te conseille de changer la façon avec laquelle tu lis tes variables.
jeudi 26 octobre 2006 à 21:01:02 | Re : probleme sscanf char[] et char*

Ombitious_Developper

Salut :

peux tu fournir la structure de ton fichier.
Pour te proposer une façon plus efficace pour lire tes données.

jeudi 26 octobre 2006 à 21:04:24 | Re : probleme sscanf char[] et char*

Ombitious_Developper

Salut :

En quel mode tu ouvres ton fichier? (mode texte ou mode binaire)

Vérifie le paramètre de "fopen".

En ce qui concerne la variable couchelu elle doit être utilisée sans "&" dans la fonction "sscanf"
jeudi 26 octobre 2006 à 21:06:03 | Re : probleme sscanf char[] et char*

jojomillenium

ALors en fait le probleme est vraiment bizzare, voici mon code, tu verra que a la fin de chaque boucle de mon while j'ecris dans un fichier la valeur du LLayer qui a ete sauvé... ca me donne dans le fichier exactement ce que je veux, c'est genial... mais a la fin de ma lecture du fichier quand tout es fini, je fait une boucle passant tous mes LLayer et en ecrivant danc chaque valeur lu dans un autre fichier pour verifier et la j'ai pas ce que je veux.
Ci dessous mon code et le resultat de mes deux fichier, tu verra comme c'est bizarre!

void SetConfig(HWND hwndDlg)
{
    char nom[100];
    char* NomCharge;

    char NomCharge2[100];
    bool FoundConfig=false;
    int numlayer=-1;
    float h, r, g, b, p;
    SendMessage(GetDlgItem( hwndDlg , ID_SEL) , CB_GETLBTEXT, (WPARAM)SendMessage(GetDlgItem( hwndDlg , ID_SEL), CB_GETCURSEL, 0, 0), (LPARAM)nom);

    CString test_nom;

    test_nom = CString(nom);
    FILE *filein;
    char chaine[255];
    filein = fopen("configs.3dconf", "rt");                // File To Load World Data From
    if(filein != NULL)
    {       
        FoundConfig = false;
        while (fgets(chaine, 250, filein) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
        {
           
            if(FoundConfig==true)
            {
               
                //char* couchelu;
                sscanf(chaine, "%d %s; %f, %f, %f, %f, %f", &numlayer, couchelu, &h, &p, &r,&g,&b);
               
                switch(numlayer)
                {
                    case 0:
                        LLayer[numlayer].SetLayer(couchelu,"Well",0,-h,p,r,g,b,1.0);
                        break;
                    case 1:
                        LLayer[numlayer].SetLayer(couchelu,"N Diff",0,-h,p,r,g,b,1.0);
                        break;
                    case 2:
                        LLayer[numlayer].SetLayer(couchelu,"P Diff",0,-h,p,r,g,b,1.0);
                        break;
                    case 3:
                        LLayer[numlayer].SetLayer(couchelu,"Poly 1",0,h,p,r,g,b,1.0);
                        break;
                    case 4:
                        LLayer[numlayer].SetLayer(couchelu,"Poly 2",LLayer[3].zstart+LLayer[3].h,h,p,r,g,b,1.0);
                        break;
                    case 5:
                        LLayer[numlayer].SetLayer(couchelu,"Cont",0,h,p,r,g,b,1.0);
                        break;
                    case 6:
                        LLayer[numlayer].SetLayer(couchelu,"Metal 1",LLayer[5].zstart+LLayer[5].h,h,p,r,g,b,1.0);
                        break;
                    case 7:
                        LLayer[numlayer].SetLayer(couchelu,"Via 1",LLayer[6].zstart+LLayer[6].h,h,p,r,g,b,1.0);
                        break;
                    case 8:
                        LLayer[numlayer].SetLayer(couchelu,"Metal 2",LLayer[7].zstart+LLayer[7].h,h,p,r,g,b,1.0);
                        break;
                    case 9:
                        LLayer[numlayer].SetLayer(couchelu,"Via 2",LLayer[8].zstart+LLayer[8].h,h,p,r,g,b,1.0);
                        break;
                    case 10:
                        LLayer[numlayer].SetLayer(couchelu,"Metal 3",LLayer[9].zstart+LLayer[9].h,h,p,r,g,b,1.0);
                        break;
                    case 11:
                        LLayer[numlayer].SetLayer(couchelu,"NPLUS",0,h,p,r,g,b,1.0);
                        break;
                    case 12:
                        LLayer[numlayer].SetLayer(couchelu,"PPLUS",0,h,p,r,g,b,1.0);
                        break;
                    case 13:
                        LLayer[4].zstart=LLayer[4].zstart+h;
                        break;
                }
           
               
            }

            if(CString(3,chaine)=="nom")
            {
                sscanf(chaine, "nom %s", &nom);
                if(CString(nom).CompareNoCase(test_nom))
                {
                    FoundConfig = true;
                    NomCharge = nom;
                }
                else
                    FoundConfig = false;
            }
           
            if(numlayer!=-1)
            {
                FILE *stream;
   
                stream=fopen("tes0.3dconf","a+");
                fprintf(stream,"nom %s %s\n",LLayer[numlayer].nom_cif, LLayer[numlayer].nom_couche);
                fclose(stream);
                numlayer=-1;
            }
        }
    }
    sprintf (NomCharge2, "Config %s chargé avec succès ", NomCharge);
    SendMessage(hStatusBar, SB_SETTEXT, 0, (LONG)NomCharge2);
    ConfigLoaded = true;

    FILE *stream;
   
    stream=fopen("tes.3dconf","w");
    for(int t=0; t<12; t++)
    {
        fprintf(stream,"nom %s %s\n",LLayer[t].nom_cif, LLayer[t].nom_couche);
    }
    fclose(stream);
   
}


Fichier que je veux obtenir et que j'obtiens dans tes0.3dconf

nom NWELL; Well
nom ACTIVE; N Diff
nom ACTIVE; P Diff
nom POLY; Poly 1
nom CONT; Cont
nom METAL1; Metal 1
nom VIA1; Via 1
nom METAL2; Metal 2
nom PPLUS; PPLUS


Fichier que j'obiten dans tes.3dconf ... donc bizzarement remodifier par je ne sais pas quoi!

nom PPLUS; Well
nom PPLUS; N Diff
nom PPLUS; P Diff
nom PPLUS; Poly 1
nom ; ;
nom PPLUS; Cont
nom PPLUS; Metal 1
nom PPLUS; Via 1
nom PPLUS; Metal 2
nom ; ;
nom ; ;
nom ; ;




jeudi 26 octobre 2006 à 21:09:28 | Re : probleme sscanf char[] et char*

jojomillenium

Au fait , c'est normal que les indices 4, 9, 10 et 11 soient "vide" dans tes.3dconf

jeudi 26 octobre 2006 à 21:21:41 | Re : probleme sscanf char[] et char*

Ombitious_Developper

Salut :

Cher ami, je remarque que dans to code tu oublie de fermer la flux associé à la variable "
filein ".

Ajouter un fclose.

1 2

Cette discussion est classée dans : char, float, setlayer, couchelu, numlayer


Répondre à ce message

Sujets en rapport avec ce message

float-->char* ou double-->char* [ par tavernier ] Help !Comment puis-je faire pour transformer mon float, ou mon double en char * ?Merci d'avanceJulien (Militant 4NT! M!Cr0$0FT depuis toujours!) conversion float en char [ par laurent180 ] Bonjour a tous,J'aimerai savoir en c ou c++ comment convertir un float en char? quel sont les fonctions ou un exemple?merci a vous.s Conversion de unsigned char en float (17.6E) [ par lemenager ] Bonjour,Je dois lire un fichier binaire dans lequel il y a des float en format (17.6E). J'ai l'impression que je suis oblige de les lires en unsigned Distinguer un float et un char dans une EditBox sous Visual 6.0 [ par threepwood ] Bonjour,je suis en train de développer une application SDI dans laquelle je fais appel à une boite de dialogue où sont présents différentes EditBox.Le Conversion type float to char [ par Ricool ] Salut a tousvoila j'ai un probleme de conversion de typej'ai un prog avec client - serveur, le client envoi des chiffre au serveur, celui ci calcul un Conversion char* en float, et float en char* [ par MrAzerty ] Mon problème est simple, je souhaie pouvoir convertir une chaine de caractères contenant un réel ("78.46", par exemple), à la norme IEEE 754 (comme le Conversion de donnée [ par Johjo ] Salut tout le monde, je cherche à convertir une valeur char en valeur float et inversement de float en char. L'equivalent de Val et Str en basic.Merci conversion char to float et inversement [ par izle ] IzLe,je souhaite convertir des "float" en char afin de les afficher dans une bare d'état, existe-t-il une fonction qui fait ça? Mettre un char * dans un float. [ par kaervas ] Bonjour, J'aimerais recuperer une chaine du genre "2.16" et la mettre dans un float.. J'ai essayer de recoder la fonction mais probleme avec la precis Conversion chaîne en nombre [ par baham ] Bonjour à tous!  Je viens vous voir car je rencontre un problème ; je souhaite convertir une chaîne de caractère en un nombre à virgule (float, double


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 : 8,642 sec (3)

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