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 :

Fonction somme occurence


Sujet :

C

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 20
    Par défaut Fonction somme occurence
    Bonjour
    je voudrais calculer la somme des éléments d'un tableau bidimensionnelle . Voilà mon algorithme en c
    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
     
    void calculesomme(int TabOcSeq[100][70000],int Nbvar,int Nb){
     
        int i,j,k,som;
     
    	   for(i=0;i<Nb;i++){
     
    		for(j=0;j<=Nbvar ;j++){
     
                          for(k=0,som=0;k<Nbvar;k++){
     
                                  som+=TabOcSeq[k][j];}
     
                                           }
                                           }
    Le problème que j'ai toujours un problème de segmentation au niveau de l'instruction
    en fait le but de ma fonction est de calculer pour chaque sous séquence(Nbvar) la somme de ses occurrence sur toutes les séquences (colonne) comme elle montre cette figure
    Images attachées Images attachées  

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        
    int i,j,k,som;
     
    	   for(i=0;i<Nb;i++) //à quoi ça sert ?? tu va faire Nb fois exactement la même chose.
     
    		for(j=0;j<Nbvar ;j++) //je pense que maxJ = maxK non ? Il faut donc mettre '<' et non '<='
     
                          for(k=0,som=0;k<Nbvar;k++)
                                  som+=TabOcSeq[k][j + i * Nbvar]; //simple hypothèse
    Sinon il faudrait non montrer les valeur de Nbvar et de Nb.

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Il manque un '}' à la fin de la fonction mais j'imagine que c'est un oubli lors du copié/collé

    Sinon je souscrit aux observations de Neckara (d'ailleurs le premier "for" ne sert à rien mais le paramètre "Nb" n'est pas repris par la suite, il est donc passé pour rien)

    Tu devrais essayer d'écrire ta fonction en pseudo-code avant de te lancer dans la version C, parce que là ce n'est franchement pas clair.

    Au passage pourquoi une fonction "void" et pas plus siplement une fonction "int" qui retourne ta somme?

    Par contre je ne vois pas de problème de segmentation au niveau de l'instruction que tu cite, ni même au niveau de la fonction, à part peut être la taille du tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int TabOcSeq[100][70000]
    c'est pas un peu beaucoup? Si ça correspond vraiment à tes besoins ne serait-il pas plus judicieux de faire des malloc?

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Encore une petite chose : il est assez risqué de faire des initialisations dans une boucle "for" (en dehors des itérateurs), ta variable "som" par exemple va être remise à zéro à chaque fois que tu vas rentrer dans ta boucle (donc notament à chaque fois que "j" va changer de valeur).

    Si ta première boucle n'a pas d'impact sur le calcul de "som" la deuxième est équivalente (pour ce qui concerne ce calcul) à "j=Nbvar-1"

    Sinon pour ton problème de segmentation ça peut être un dépassement si tu passes à la fonction un "Nbvar" supérieur à 99.

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 20
    Par défaut
    Bonjour,
    Merci pour vos réponses,j'ai vous montrer déjà dans la miniature détachée la structure de mon tableau avec les valeurs de Nb(nombre de séquence:ligne) et Nbvar(sous séquence:ligne).j'ai constaté que mon précédent raisonnement est faux,il faut inverser les boucle car pour chaque sous séquence je doit calculer la somme des ses occurrences en parcourant toutes les séquences(colonne).j'ai essayé ce code mais il m'affiche toujours 39!!!!!!!j'ai calculé a la main la somme mais 39 je vois pas d'ou elle arrive
    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
    int calculesomme(int TabOcSeq[100][70000],int Nbvar,int Nb){
     
        int i,j,som;
     
     
        for(j=0;j<Nbvar;j++)
        {
          f or(som=0,i=0;i<Nb;i++)
          {
                 som+=TabOcSeq[i][j];
                 printf("Somme colonne %d : %ld\n",i,som);
     
    }
      return som;
    }
    }

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Difficile de dire exactement ce qu'il se passe sans donnée mais pour commencer sors le "return" de la boucle (met le à la fin) et (tu vas dire que je radote mais j'ai raison ) initialise "som" au début de la fonction.

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    initialise "som" au début de la fonction.
    Pourquoi? Initialiser som dans le for fonctionne très bien.

    Sinon est-ce que tu veux retourner tous tes sommes ? Dans ce cas là, il faudra allouer dynamiquement un tableau d'int pour pouvoir le remplir de tes sommes et le retourner à la fin de ta fonction.

    Si tu veux retourner que la somme totale, il faudra que tu utilises une nouvelle variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int sommeTotale = 0;
    int som;
    for(...)
    {
         for(som = 0, ...)
         sommeTotale += som;
    }

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Pourquoi? Initialiser som dans le for fonctionne très bien.
    Ben, "som" est remis à 0 chaque fois que "j" change de valeur...
    Si c'est fait à dessein alors il y a un truc que j'ai pas pigé.

  9. #9
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Si j'ai bien compris ce qu'il a dit précédemment, il veut calculer une "sous-sommes" par colonne.

    Après par contre, je n'ai pas compris s'il veut retourner toutes ses sous-sommes ou sa somme totale.

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Ah j'avais pas compris ça...
    En tout cas, ça fait certainement pas ce que ça doit faire : seulle la dernière somme est retournée et les autres ne sont stockées nulle part.

  11. #11
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 20
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Pourquoi? Initialiser som dans le for fonctionne très bien.

    Sinon est-ce que tu veux retourner tous tes sommes ? Dans ce cas là, il faudra allouer dynamiquement un tableau d'int pour pouvoir le remplir de tes sommes et le retourner à la fin de ta fonction.

    Si tu veux retourner que la somme totale, il faudra que tu utilises une nouvelle variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int sommeTotale = 0;
    int som;
    for(...)
    {
         for(som = 0, ...)
         sommeTotale += som;
    }
    Je veut retourner pour chaque sous séquence la somme des ses occurrences et non pas la somme totale.j'ai alloué dynamiquement un tableau pour stocker les sommes comme vous m'avais dit:
    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
     
    int calculesomme(int TabOcSeq[100][70000],int Nbvar,int Nb){
     
        int i,j,k,som;
        int *tab;
    tab=malloc(Nbvar *sizeof(int *));
    for(j=0;j<Nbvar;j++){ 
          for(som=0,i=0;i<Nb;i++){
          som+=TabOcSeq[i][j];
                }
          }
     for(k=0;k<Nbvar;k++){
                          tab[k]=som;}
     
                          return tab;
    erreur:
    • In function `int calculesomme(int (*)[70000], int, int)':

    • invalid conversion from `void*' to `int*'

    • invalid conversion from `int*' to `int'

  12. #12
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Pour commencer ta fonction est de type int alors que tu retournes un int*

  13. #13
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    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 * calculesomme(int TabOcSeq[100][70000],int Nbvar,int Nb){ //tu retourne un tableau d'int et non un int
     
        int i,j,k,som;
        int *tab;
    tab=(int *)malloc(Nbvar *sizeof(int)); 
    /*une petite règle pour ne pas se tromper, la parenthèse de gauche est identique à celle de droite sauf que tu rajoutes une étoile. En C, la 
    parenthèse de gauche n'est pas obligatoire mais elle rend ton code plus lisible et te permet de voir tes erreurs plus facilement si tu suis ma règle
     (et ça te permettra aussi de réutiliser ce bout de code en C++)*/
    for(j=0;j<Nbvar;j++)
    {
          for(som=0,i=0;i<Nb;i++)
                 som+=TabOcSeq[i][j];
         tab[j] = som;
    }
     for(k=0;k<Nbvar;k++){
                          tab[k]=som;}//???????
     
                          return tab;
    EDIT : grillé par pythéas pour le type de retour de la fonciton

  14. #14
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 20
    Par défaut
    Merci infiniment pour vos aides mais je vois pas pourquoi cette erreur de segmentation au niveau de l'instruction

  15. #15
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Montre nous où tu déclare ton tableau, où tu appelles ta fonction ainsi que les valeur que tu lui passes.


    Ensuite, ce n'est pas forcément cette ligne qui est erronée, une erreur de segmentation peut survenir après la ligne contenant l'erreur.

  16. #16
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Pareil que Neckara, à part une éventuelle sortie des limites du tableau je vois pas trop.

    Pour localiser une erreur de segmentation "gdb" est pas mal.

  17. #17
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 20
    Par défaut
    j'ai corrigé une truc dans le nombre de séquence Nb,pas d'erreur de segmentation.vous trouvez dans la miniature détachée ce qui'il m'affiche comme résultat.mais je le trouve pas logique.
    après avoir construire mon tableau d’occurrence je l'ai copié dans fichier.dat que je vous ai montré dans de mon premier message.concernant l'appel de la fonction :
    int TabOcSeq[100][70000];
    int main(){
    int Nbvar,*tab,Nb,
    calculesomme(TabOcSeq,Nbvar,Nb);
    printf("\n la somme = %d",tab);
    Images attachées Images attachées  

  18. #18
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int TabOcSeq[100][70000];//une variable globale que tu passe en paramètre ??? Déjà que les variables globales ne sont pas très propre...
    int main(){
    int Nbvar,*tab,Nb;
    tab = calculesomme(TabOcSeq,Nbvar,Nb);//Tu initialises où Nbvar et Nb ? Ici leur valeur est indétermé.
    for(int som = 0,int i = 0;...)
    {
             printf("\n la sous-somme = %d",tab[i]);
             som += tab[i];
    }
    printf("\n la somme = %d",som);

  19. #19
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 20
    Par défaut
    Bonjour,
    enfin j'ai résolu le problème de somme,maintenant je doit comparer cette somme avec le nombre de seq(Nb)*x (entrée) pour supprimer les éléments(sous séquence) de ma liste chaînée qui qui ont une somme<Nb*x.Est ce qu'il faut ajouter a chaque noeud de ma liste cette variable somme afin de faire cette comparaison et de filtrer ma liste (rappelant que j'ai alloué un tableau d'entier afin de stocker la somme calculé de chaque sous séquence)???
    Merci d'avance

  20. #20
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Peux-tu préciser ce que tu veux faire?

    Si j'ai bien compris :
    - Tu as une liste chaînée.
    - Tu veux supprimer tous les maillons < à K (K nombre calculé).

    Dans ce cas là, un simple parcours indirect de ta liste chaînées en supprimant les éléments < à K suffit largement.

Discussions similaires

  1. EXCEL : fonction SOMME.SI avec 2 critères
    Par repié dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 17/03/2016, 17h10
  2. [Excel] fonction SOMME.SI avec une cellule pour critère
    Par repié dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/03/2006, 17h39
  3. Réponses: 6
    Dernier message: 09/02/2006, 19h00
  4. Fonction "Somme"
    Par Michel DELAVAL dans le forum Access
    Réponses: 4
    Dernier message: 13/01/2006, 13h00
  5. Réponses: 1
    Dernier message: 03/11/2005, 18h44

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