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 :

Tableaux et variables écrasées


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    chercheur
    Inscrit en
    Février 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : chercheur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2011
    Messages : 78
    Points : 109
    Points
    109
    Par défaut Tableaux et variables écrasées
    Salut,

    voilà je vous explique mon problème. J'ai deux ressources, chacune contient un ensemble de taches. Exemple dans ce qui suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ressource 0 : 19 tasks 
    16	0	10	4	8	6	9	15	5	14	17	18	11	19	7	12	2	3	13	
    ressource 1 : 18 tasks 
    2	4	12	1	17	19	8	14	18	7	3	13	10	6	15	11	0	9
    Le nombre de taches est stocké dans un tableau 1D : .
    Chaque tache est stocké dans un tableau à 2D : .
    Chaque tache a un attribue binaire soit la valeu 1 ou 0 : .

    Ce que je cherche, c'est de créer un nouveau tableau qui contient uniquement les taches qui ont des attribues "1" pour chaque ressource.

    Voici le bout de code que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for(r=0;r<nr;r++) // ressources
    	 {
    		 for(i=0; i<npr[r]; i++) // nombre de taches par ressources
    		 {
    			 cerr << " r " << r << " i " << i << " task " << pr[r][i] << " type " << type[i] <<endl;
    			 if (type[pr[r][i]] == 1)
    			 {
    				for (k=0; k<nt; k++)
    					dt[r][k] = pr[r][i];
    			 }
    		 }
    		 ntd[r]++;
    	 }
    tableau qui stocke la tache sélectionné.
    tableau pour calculer le nombre de taches.
    Le résultat est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ressource 0 : 1 tasks 
    13	
    ressource 1 : 1 tasks 
    9
    Si vous constatez, le tableau stocke uniquement la dernière variable et écrase celles d'avant.

    Pourriez-vous svp m'aider à corriger ce problème.
    En vous remerciant.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Te revoilà

    Le précédent fil de discussion tu l'a mis en résolu sans donner "ton approche finale"

    Sinon selon toi, quelle action fait cette ligne ntd[r]++;?

    Enfin tu t'y prends mal selon moi
    Avec tes noms de variables minimalistes c'est difficile à suivre

    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
    for(res = 0, max_task = 0; res < max_res; res++) {
        max_task = npr[res];
     
        for(int task = 0, pos = 0, value = 0 ; task < max_task;  task++) {
            value = pr[res][task] ;
            cerr << " res: " << res << " task: " << task << " value: " << value << " type: " << type[task] << endl;
     
            if (type[value] == 1) {
                dt[res][pos] = value;
                ntd[res] = value;
                pos++;
     
    //          assert(pos < max_task);
            }
        }
    }

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Et dieu inventa le std::vector
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre régulier
    Homme Profil pro
    chercheur
    Inscrit en
    Février 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : chercheur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2011
    Messages : 78
    Points : 109
    Points
    109
    Par défaut réponse
    Le précédent fil de discussion tu l'a mis en résolu sans donner "ton approche finale"
    C'est fait
    Merci pour ta proposition mais il ne donne pas le bon résultat !

    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
     int res, task, pos, value;
    	 int max_task = nt; // max of tasks
    	 int max_res = nr; // max of resources
    	 for(res = 0, max_task = 0; res < max_res; res++) 
    	 {
    		 max_task = npr[res];
    		 for(task = 0, pos = 0, value = 0 ; task < max_task;  task++) 
    		 {
    			 value = pr[res][task] ;
    			 cerr << " res: " << res << " task: " << task << " value: " << value << " type: " << type[task] << endl;
    			 if (type[value] == 1) 
    			 {
    				 dt[res][pos] = value;
    				 ntd[res] = value;
    				 pos++;
    				// assert(pos < max_task);
    			 }
    		 }
    	 }
    Entrée :

    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
     type tache 0 1
     type tache 1 1
     type tache 2 1
     type tache 3 1
     type tache 4 0
     type tache 5 0
     type tache 6 1
     type tache 7 1
     type tache 8 0
     type tache 9 1
     type tache 10 0
     type tache 11 1
     type tache 12 1
     type tache 13 0
     type tache 14 1
     type tache 15 1
     type tache 16 1
     type tache 17 0
     type tache 18 0
     type tache 19 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ressource 0 : 19 tasks 
    18	9	13	14	10	17	19	0	11	3	8	15	2	1	16	6	12	7	4	
    ressource 1 : 18 tasks 
    16	4	19	0	2	8	13	5	15	6	18	11	17	3	10	7	9	14
    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ressource 0 : 7 tasks 
    9	14	19	0	11	3	15	
    ressource 1 : 14 tasks 
    16	19	0	2	15	6	11	3	7	9	14	0	0	0

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Rien que cette explication est suspecte:
    Citation Envoyé par Student_Master Voir le message
    Le nombre de taches est stocké dans un tableau 1D : .
    Chaque tache est stocké dans un tableau à 2D : .
    Chaque tache a un attribue binaire soit la valeu 1 ou 0 : .
    Tu as deux tableaux donc chaque case est censée avoir une relation 1-1 avec "Chaque tâche", et pourtant les deux tableaux n'ont pas le même nombre de dimensions.
    Donc, soit tu t'es mal expliqué, soit l'un de tes tableaux (pr ou type) n'a pas le bon nombre de dimensions.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre régulier
    Homme Profil pro
    chercheur
    Inscrit en
    Février 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : chercheur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2011
    Messages : 78
    Points : 109
    Points
    109
    Par défaut réponse
    Citation Envoyé par Médinoc Voir le message
    Rien que cette explication est suspecte:

    Tu as deux tableaux donc chaque case est censée avoir une relation 1-1 avec "Chaque tâche", et pourtant les deux tableaux n'ont pas le même nombre de dimensions.
    Donc, soit tu t'es mal expliqué, soit l'un de tes tableaux (pr ou type) n'a pas le bon nombre de dimensions.
    voici le détail de mes données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const int maxR=30;	/**< max of ressource */
    const int maxA=500;		/**< max of tasks */
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int     npr[maxR];		/**<  [R] nombre des taches pouvant être effectuées par chaque ressource r */
    int     pr[maxR][maxA];			/**<  [R][npr[r]] ensemble des taches pouvant être effectuées par chaque ressource r */
     
    int 	ntd[maxR];				/**<  [R] nombre des taches difficiles pouvant être effectuées par chaque ressource r */
    int    dt[maxR][maxD];			/**<  [R][npd[r]] ensemble des taches difficiles pouvant être effectuées par chaque ressource r */
    int	type[maxA];			/**<  types de taches : normales (0) ou difficiles (1) */
    npr[maxR] contient le nombre de tâches total pour chaque ressource. Par contre, le pr[maxR][maxA] te donne l'ensemble des tâches. Le type désigne uniquement le type de la tâche qui vaut 1 ou 0. Donc forcément la dimension du tableau type doit être maxA.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si j'ai bien compris, pr n'est pas un ensemble de tâches, mais un ensemble de couples tâche/ressource. Je comprends mieux.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre régulier
    Homme Profil pro
    chercheur
    Inscrit en
    Février 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : chercheur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2011
    Messages : 78
    Points : 109
    Points
    109
    Par défaut réponse
    Citation Envoyé par Médinoc Voir le message
    Si j'ai bien compris, pr n'est pas un ensemble de tâches, mais un ensemble de couples tâche/ressource. Je comprends mieux.
    C'est simple avec un petit exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Task sets
     
    ressource 0 : 19 tasks 
    18	1	0	5	3	14	8	6	10	16	19	2	13	4	9	11	12	15	17	
    ressource 1 : 18 tasks 
    2	19	3	9	7	17	12	14	11	6	16	0	13	4	18	8	15	5
    Exp 1: pr[0][0]=18 cela signifie, que la ressource 0 peut faire la tâche 18 (cette tache se trouve dans la 1ière position).
    d'ou pr contient l'ensemble des tâches qui peuvent être faites par chaque ressource.
    Exp 2: pr[1][3]=9 cela signifie, que la ressource 1 peut faire la tâche 9 (cette tache se trouve dans la 3ième position).

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Quel est le rapport entre la choucroute et ton tableau type qui a chaque tache attribue un binaire?



    Parce que tu dis que mon code ne fonctionne pas, mais personne ne peux évaluer type[pr[r][i]].

    Édit: j'ai lu trop rapidement. Tu le donnes en entrée

  10. #10
    Membre régulier
    Homme Profil pro
    chercheur
    Inscrit en
    Février 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : chercheur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2011
    Messages : 78
    Points : 109
    Points
    109
    Par défaut
    Citation Envoyé par foetus Voir le message
    Quel est le rapport entre la choucroute et ton tableau type qui a chaque tache attribue un binaire?



    Parce que tu dis que mon code ne fonctionne pas, mais personne ne peux évaluer type[pr[r][i]].
    J'ai attribué des attribues binaires pour chacune des tâches pour distinguer deux types de tâches :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // types de taches
    	 for(i=0; i<nt; i++) 
    	 {
    		 if(rand()%nt<=ratio_normale*nt)
    			type[i]=0; //taches normales
    		else
    			type[i]=1; // taches difficiles
    	 }
    // affichage taches
    	 for(i=0; i<nt; i++) 
    	 {
    		 cerr << " type tache " << i << " " << type[i] << endl;
    	 }
    J'obtiens :
    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
    type tache 0 0
     type tache 1 1
     type tache 2 0
     type tache 3 0
     type tache 4 0
     type tache 5 1
     type tache 6 1
     type tache 7 0
     type tache 8 1
     type tache 9 0
     type tache 10 1
     type tache 11 0
     type tache 12 0
     type tache 13 1
     type tache 14 0
     type tache 15 1
     type tache 16 1
     type tache 17 1
     type tache 18 0
     type tache 19 0
    Par conséquent, je pourrais identifier les tâches qui ont des attribues 1 et les stocker dans le tableau ntd[maxR] (qui compte le nombre de taches trouvées pour chaque ressource.

  11. #11
    Membre régulier
    Homme Profil pro
    chercheur
    Inscrit en
    Février 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : chercheur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2011
    Messages : 78
    Points : 109
    Points
    109
    Par défaut Résolu
    voilà la solution :

    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
    int res, task, pos, value;
    	 int max_task= nt; // max of tasks
    	 int max_res = nr; // max of resources
    	 for(res = 0, max_task = 0; res < max_res; res++) 
    	 {
    		 max_task = npr[res];
    		 for(task = 0, pos = 0, value = 0 ; task < max_task;  task++) 
    		 {
    			 value = pr[res][task] ;
    			 cerr << " res: " << res << " task: " << task << " value: " << value << " type: " << type[task] << endl;
    			 if (type[value] == 1) 
    			 {
    				 dt[res][pos] = value;
    				 ntd[res] +=1; // value; // il fallait incrémenter le tableau à chaque itération car ce tableau compte le nombre de tâches
    				 pos++;
    				// assert(pos < max_task);
    			 }
    		 }
    	 }

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    J'avais mal compris ton message: j'avais lu ntd tableau qui stocke la tache sélectionnée ou
    Donc tu avais raison avec ton ntd[r]++;

    Sinon c'était pour un peu t’embêter que j'avais renommé toutes les variables
    Mais les variables max_task et max_res tu peux les supprimer

    Mais c'est vrai qu'un tableau C avec un nombre de tâches non fixe c'est moche: si tu as une ressource avec 1 tâche et une autre avec 100 ou
    Il faudrait coder [une idée ] un vector de classe Resource qui elle-même contient un vector de classe Task.

    Tu es dans la section C++, non pas C

  13. #13
    Membre régulier
    Homme Profil pro
    chercheur
    Inscrit en
    Février 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : chercheur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2011
    Messages : 78
    Points : 109
    Points
    109
    Par défaut
    Effectivement, je vais y penser prochainement à tes remarques. merci à vous tous.

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

Discussions similaires

  1. [Tableaux] définition variable PHP
    Par jeremy_chauvel dans le forum Langage
    Réponses: 22
    Dernier message: 23/11/2006, 22h51
  2. [Tableaux] Probleme variable statique dans une classe
    Par Joe Le Mort dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2006, 11h35
  3. Les tableaux et variables
    Par nemesys971 dans le forum C
    Réponses: 11
    Dernier message: 25/05/2006, 22h46
  4. Réponses: 12
    Dernier message: 03/04/2006, 19h08
  5. [Tableaux] Récuperer variable dans une fonction
    Par amarcil dans le forum Langage
    Réponses: 12
    Dernier message: 12/02/2006, 10h56

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