Pointeurs, adresses mémoires

Résolu
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007 - 31 oct. 2006 à 14:29
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013 - 31 oct. 2006 à 15:12
Bonjour a tous,  désolé pour la question tellement récursive que je m'apprete a émettre. je cherche a lire dans un fichier, j'utilise scanf pour chercher mes champs ( pour l'instant je n'en ai qu'un de la forme path  =  chemin_d'accès. Je crée donc des chaines de caractères (pathName, pathValue, etc). Ce que j'ai écrit en dessous fonctionne, mais je n'aime pas du tout l'écriture, je la trouve brouillon. Je me perds un peu entre les pointeurs, les adresses mémoires et comment réaffecter un pointeur vers l'adresse d'un autre pointeur (c'est ce que j'essaye de faire à la ligne
( *pathName =  (char*)&testName ). Merci

     char *pathName[lineMaxSize];
    char *testName[lineMaxSize];
    char *pathValue[lineMaxSize];
    char *testValue[lineMaxSize];
    
    char equal;
    
    FILE * settings ;
        if( (settings fopen(param, "r")) NULL){
        fprintf(stdout, "fichier settings.ini manquant\n");
        exit(-1);
        }//end if
    else{
         settings = fopen(param, "r");
         fscanf(settings, "%s %c %s", &testName, &equal, &testValue);
         if (strcmp((char*)&testName, "path\n")){
            printf((char*)&testName);
            *pathName =  (char*)&testName ;
            *pathValue = (char*)&testValue ;
            }
         fclose(settings);
    }// end else

6 réponses

julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
31 oct. 2006 à 14:46
    char pathName[lineMaxSize];
    char testName[lineMaxSize];
    char pathValue[lineMaxSize];
    char testValue[lineMaxSize];

    char equal;
    
    FILE * settings ;
        if( (settings fopen(param, "r")) NULL)
    {
            fprintf(stdout, "fichier settings.ini manquant\n");
            exit(-1);
    }//end if
    else
    {
             settings = fopen(param, "r");
             fscanf(settings, "%s %c %s", testName, &equal, testValue);
             if (strcmp(testName, "path\n"))
            {
                 printf((char*)&testName); //printf("%s\n", testName); Non?
                 strcpy(pathname, testName);
                 strcpy(pathValue, testValue);
            }
            fclose(settings);
    }// end else

En rouge ce que j'ai corrigé, en rose, ce que je ne comprend pas.
Vive le C
Savon
3
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
31 oct. 2006 à 14:46
Pourquoi ouvres tu 2 fois le fichier (fopen), c'est pas la peine.
Ensuite,
Attention dans scanf : 
char* testName[max]; // c'est testName ou &testName[0] le pointeur, pas &testName !
Attention strcmp renvoi 0 pour macth ! donc if( !strcmp(..., ...) )
Enfin, pas d'affectation de pointeur puisque tu alloues les chaines !!!
Donc :
strcpy(pathName, testName); et pas *pathName= (char*)&testName; !

Sinon, si tu travailles en Win32, Regardes a :
GetPrivateProfileString() // recup chaine dans ini
GetPrivateProfileInt() // recup int dans ini
ect... pour ecrire aussi, SetPrivateProfileString()
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
31 oct. 2006 à 14:48
Eh ben ... En effet c'est du brouillon tu t'es bien mélangé!

1°) Pour affecter un pointeur tu dois faire comme suit :

char *pszSrouce = new char[1024];
char *pszDestination = new char[1024];

pszDestination = pszSource;

2°)  Pour la déclaration de tes pointeurs tu dois faire :

char pathName[lineMaxSize];
char testName[lineMaxSize];
char pathValue[lineMaxSize];
char testValue[lineMaxSize];

fscanf(settings, "%s %c %s", testName, &equal, testValue);

Voila, n'oublie pas que tes tableau sont en fait des pointeurs.
Des pointeurs qui indiquent l'adresse du premier element de chaque tableau.
C'est pourquoi tu peux te passer des & dans fscanf() pour tes variables testName et testValue.

Shell
0
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007
31 oct. 2006 à 14:54
Ok merci a tous pour ces réponse,

Alors juste pour répondre aux questions diverses, déjà pour scanf j'avais lu dans une page qu'on était obligé de passer l'adresse mémoire du tableau. Ensuite pour l'ouverture du fichier, j'ai vu un type dire que lorsqu'on faisait :   
 if( (settings fopen(param, "r")) NULL){
        fprintf(stdout, "fichier settings.ini manquant\n");
        exit(-1);

il regardait juste si le fichier pouvait etre ouvert mais ne l'ouvrait pas, d'ou la deuxième ouverture a l'extérieure du if

Enfin merci a tous :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Kurpeus1 Messages postés 42 Date d'inscription lundi 16 octobre 2006 Statut Membre Dernière intervention 21 mars 2007
31 oct. 2006 à 14:56
arff on peut pazs éditer ses réponses, c'est un peu dommage, bon juste pour dire que j'écris en C, donc il ne me semble pas que je puisse faire de new (cf la dernière réponse)
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
31 oct. 2006 à 15:12
En C le new n'existe pas en effet. Il faut utiliser les primitives de type malloc(...).
Sans oublier de liberer les pointeurs en fin d'utilisation en appellant free(...).

Shell
0
Rejoignez-nous