Pointeurs, adresses mémoires [Résolu]

Signaler
Messages postés
42
Date d'inscription
lundi 16 octobre 2006
Statut
Membre
Dernière intervention
21 mars 2007
-
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
-
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

Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
10
    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
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
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()
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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
Messages postés
42
Date d'inscription
lundi 16 octobre 2006
Statut
Membre
Dernière intervention
21 mars 2007

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 :)
Messages postés
42
Date d'inscription
lundi 16 octobre 2006
Statut
Membre
Dernière intervention
21 mars 2007

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)
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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