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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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'

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