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 :

Tableau en deux dimensions et structure.


Sujet :

C

  1. #1
    Membre du Club Avatar de PKO06
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 91
    Points : 65
    Points
    65
    Par défaut Tableau en deux dimensions et structure.
    Bonjour à tous,

    Je souhaite creer un tableau en deux dimensions. Celui-ci stockera les éléments d'une table sql.

    J'ai une structure qui ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct queryResult{
    	long rows;
    	long cols;
    	char*** resultArray;
    };
    que j'initialise ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct queryResult res = {0,0,NULL};
    Une fonction "execQuery" qui prend en paramètre un pointeur sur une fonction callback.
    Ma fonction callback a comme paramètres un pointeurs sur la structure, le nombre de colonne de la table et un tableau contenant les résultats de la ligne et un autre les noms des colonnes.

    Je ne sais pas si je m'y prend bien et si ce que j'essaye de faire est possible. Je vous montre mes premiers essais de cette fonction callback :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    static int sqlite_callback(void* arg, int argc, char **argv, char **azColName){
    	struct queryResult *res = arg;
    	int i;
     
     
    	char **resultLigne = NULL;
     
    	if( ( res->resultArray = (char ***) realloc (res->resultArray, (res->rows +2) * sizeof(char**) ) ) ==NULL ){
    		fprintf (stderr, "Memoire insuffisante\n");
    		free (res->resultArray);
    		res->resultArray = NULL;
    		return 1;
    	}
    	for(i=0; i<argc; i++){
    		if( ( resultLigne[i] = (char*) malloc ( strlen(argv[i]) * sizeof(char) ) ) ==NULL){
    			fprintf (stderr, "Memoire insuffisante\n");
    			free (res->resultArray);
    			res->resultArray = NULL;
    			return 1;
    		}
    		strcpy(resultLigne[i],argv[i]);
    	}
    	res->resultArray[res->rows]=resultLigne;
    	res->rows++;
    	return 0;
    }
    Est ce que je m'y prend bien avec mon tableau (enfin qu'est ce qui coince plutôt).

    Merci de me mettre sur la piste.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Bonjour,
    Ce qui me parait bizarre, c'est :
    • Tu ajoutes deux lignes dans ton realloc(), mais tu n'en mets qu'une.
    • D'ailleurs, tu utilises mal realloc() : On n'utilise pas la même variable pour le premier paramètre et le retour de ralloc(), on passe par un temporaire (problème à cause du retour NULL).
    • Tu n'alloues pas le tableau de char* lui-même (le second niveau d'allocation).
    • Ta fonction de libération de mémoire laisse à désirer.

    Sans compter que ça fait beaucoup d'allocations, mais bon : On ne doit pas chercher à optimiser tant que ça ne marche pas tout court.

  3. #3
    Membre du Club Avatar de PKO06
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    Merci pour ta réponse. C'est vrai que ce n'est pas optimisé du tout mais je pensais faire ca en deux temps et déjà être sur de l'allure de mon tableau.

    Les deux lignes dans le realloc seront utilisées plus tard, je devrai mettre deux lignes lors du premier parcours de ma table. Pour les tests je n'ajoute qu'une ligne à présent.

    J'ai initialisé le tableau char* ainsi : (certe toujours aussi sale)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(  ( resultLigne = (char**)malloc(argc*sizeof(char*)) ) == NULL ){
    		fprintf (stderr, "Memoire insuffisante\n");
    		free (res->resultArray);
    		res->resultArray = NULL;
    		return 1;
    }
    Cette ligne est elle correcte ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res->resultArray[res->rows]=resultLigne;
    Est ce que je pourrais initialiser resultLigne de manière statique et la définir comme une ligne de resultArray comme ci-dessus en faisant ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* resultLigne[argc]
    Et dernière question, cj'accède à mes infos de cette manière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(j=0;j<argc;j++){
    	essai = *(res->resultArray[res->rows]+j);
    }
    Est ce la bonne solution.

    Merci

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Citation Envoyé par PKO06
    Cette ligne est elle correcte ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    res->resultArray[res->rows]=resultLigne;
    Vue la façon dont tu t'en sers, je pense que oui.

    Est ce que je pourrais initialiser resultLigne de manière statique et la définir comme une ligne de resultArray comme ci-dessus en faisant ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* resultLigne[argc]
    Non, puisque ce serait une variable locale.

    Et dernière question, cj'accède à mes infos de cette manière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(j=0;j<argc;j++){
    	essai = *(res->resultArray[res->rows]+j);
    }
    Est ce la bonne solution.
    Normalement tu pourrais essayer directement ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(j=0;j<argc;j++){
    	essai = res->resultArray[res->rows][j];
    }

  5. #5
    Membre du Club Avatar de PKO06
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 91
    Points : 65
    Points
    65
    Par défaut
    Merci Messire pour tous ces conseils

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/03/2006, 17h25
  2. Un string dans un tableau de deux dimensions...
    Par FinalSpirit dans le forum C++
    Réponses: 5
    Dernier message: 15/01/2006, 14h29
  3. [PERL] Trier un tableau a deux dimensions
    Par piregwan dans le forum Langage
    Réponses: 3
    Dernier message: 26/12/2005, 22h29
  4. Réponses: 6
    Dernier message: 26/11/2005, 19h55
  5. Réponses: 13
    Dernier message: 13/10/2005, 16h03

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