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 ne marchant pas


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    août 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : août 2020
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Fonction ne marchant pas
    Bonjour,

    je début en programmation est j'ai quelque difficulté, je suis arrive a la parti de l'allocation dynamique de mémoire. Et je voudrais parvenir a faire l'addition des valeur d'un tableau a plusieurs dimension. Pour cela j'ai crée une fonction mais quand je fait appel à celle-ci, je ne parvient pas a affiche le résultat. Alors que si j'utilise le même code sans l'aide de la fonction, j’obtiens le résultat voulu. Voici mon code de la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int Addition(int **tab, int lo,int la)
    {
        int som;
     
        for(size_t i = 0;i < lo;++i)
        {
            for(size_t j = 0;j < la;++j)
            {
                som += tab[i][j];
            }
        }
        return som;
    }
    et voici le code pour faire appel a la fonction:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    int main(
    {
    int lo,la, menu, som;
     
    printf("Entre la longeur et la largeur du tableau:");
     
       if(scanf("%d %d",&lo, &la)!=2)
       {
            printf("\nErreur lors de la fixation de la taille du tableau!");
            return EXIT_FAILURE;
       }
     
       int (*tab)[la] = malloc (sizeof(int [lo][la]));
     
           if(tab==NULL)
           {
              printf("\nErreur lors de l allocation!!");
              return EXIT_FAILURE;
           }
     
           printf("Entre les valeurs du tableau: ");
     
           for(size_t i=0;i<lo;++i)
           {
               for(size_t j=0;j<la;++j)
               {
                    if(scanf("%d", &tab[i][j]) != 1)
               {
                    printf("\nErreur!!");
                    return EXIT_FAILURE;
                }
     
                printf("tab[%zu][%zu] = %d\n", i,j, tab[i][j]);
            }
       }
     
     
     
    printf("Que voulez-vous faire: 1.Addition\n");
    scanf("%d", &menu);
     
    switch(menu)
    case 1:
        {
            som = Addition(tab,lo,la);
            printf("la somme des valeurs du tableau est : %d", som);
     
        }
     
    free(tab);
    }
    J’espère que vous pourrez m'aide, Merci.

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 1 259
    Points : 6 106
    Points
    6 106
    Par défaut
    Bonjour,

    Quant tu écris : int** tab tu indiques un pointeur sur un pointeur d'entiers. Il te faut donc allouer un tableau et chacun des éléments de ce tableau est un tableau d'entiers.. Il te faut allouer tout cela (et tout désallouer à la fin.)

    Il faut les allouer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        int  **tab;
        tab = malloc( sizeof(*tab) * lo);
        for ( int i = 0 ; i < lo ; ++i )
            tab[i] = malloc( sizeof(*tab[i]) * la );
    Et le free(tab); sera bien sûr insuffisant.

    Et ligne 3, ta som n'est pas initialisée. Il faut y mettre quelque chose avant d'y additionner.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    8 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 8 965
    Points : 24 571
    Points
    24 571
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par louli20 Voir le message
    je suis arrive a la parti de l'allocation dynamique de mémoire.
    Comme le dit dalfab, chaque dimension doit explicitement être allouée. Tu veux allouer "lo" lignes de "la" cases, il te faut allouer d'abord les "lo" lignes, puis pour chaque ligne, allouer les "la" cases. Et pour la libération c'est dans l'autre sens. Avec en plus un test sur chaque allocation et si l'une d'elle échoue, il faut alors tout arrêter en libérant ce qui a été alloué avant l'échec.

    Il y a toutefois une autre façon de faire : si tu pars du principe qu'un tableau 2D ce ne sont que des lignes et que tu les mets bout à bout, alors cela devient un tableau 1D (une seule énorme ligne). Donc une simple et unique allocation suffit.
    Ensuite il faut juste convertir les coordonnées 2D en coordonnée 1D mais c'est pas très compliqué car tab[i][j] en 2D devient tab[i*la+j] en 1D et dans l'autre sens, tab[x] en 1D devient tab[x/la][x%la] en 2D.
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    août 2020
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : août 2020
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    bonjour,

    Merci pour ton conseil ça a marche encore merci. J'ai l'impression que de faire ce que je voulais avec une allocation dynamique en un bloc ça n'est pas possible ou c plus compliquer.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    8 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 8 965
    Points : 24 571
    Points
    24 571
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par louli20 Voir le message
    J'ai l'impression que de faire ce que je voulais avec une allocation dynamique en un bloc ça n'est pas possible ou c plus compliquer.
    Compliqué ?
    Code c : 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #include <stdio.h>
    #include <stdlib.h>
     
    // tableau 2D
    void demo1() {
    	int **tab;
    	size_t i, j;
    	tab=malloc(2 * sizeof(*tab));
    	for (i=0; i < 2; i++) tab[i]=malloc(3 * sizeof(**tab));
     
    	for (i=0; i < 2; i++) {
    		for (j=0; j < 3; j++) tab[i][j]=i*3+j+1;
    	}
    	for (i=0; i < 2; i++) {
    		for (j=0; j < 3; j++) printf("tab[%hu][%hu]=%d\n", i, j, tab[i][j]);
    	}
    	for (i=0; i < 2; i++) free(tab[i]);
    	free(tab);
    	fputc('\n', stdout);
    }
     
    // tableau 1D
    void demo2() {
    	int *tab;
    	size_t i,j;
    	tab=malloc(2*3 * sizeof(*tab));
     
    	for (i=0; i < 2; i++) {
    		for (j=0; j < 3; j++) tab[i*3+j]=i*3+j+1;
    	}
    	for (i=0; i < 6; i++) {
    		printf("tab[%hu][%hu]=%d\n", i/3, i%3, tab[i]);
    	}
    	free(tab);
    	fputc('\n', stdout);
    }
     
    int main() {
    	demo1();
    	demo2();
    }
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  6. #6
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 1 259
    Points : 6 106
    Points
    6 106
    Par défaut
    Bonjour,

    Faire un unique malloc() qui contient tout ce qui est nécessaire est possible (on doit allouer un zone contenant des choses hétérogènes : des pointeurs et des int), mais comme tu le dis c'est effectivement compliqué. La solution avec plusieurs malloc() est la plus simple.

  7. #7
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2013
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : novembre 2013
    Messages : 188
    Points : 359
    Points
    359
    Billets dans le blog
    2
    Par défaut Avantages du dimensionnement de tableaux 2D par des tableaux de tableaux (tous langages)
    Citation Envoyé par dalfab Voir le message
    Bonjour,

    Faire un unique malloc() qui contient tout ce qui est nécessaire est possible (on doit allouer un zone contenant des choses hétérogènes : des pointeurs et des int), mais comme tu le dis c'est effectivement compliqué. La solution avec plusieurs malloc() est la plus simple.
    Pour tout ce qui est tableaux 2D, la meilleure approche est de dimensionner un vecteur (tableau 1D) de pointeurs sur d'autres tableaux 1D:
    Avantages:
    - La zone contenant le tableau 2D peut ne pas être monobloc. Seuls la liste principale (sauf si liste chaînée) et les sous-tableaux doivent l'être:
    [[
    A[0]-> [X X X X X]
    A[1]-> [X X X ... X X X X X]
    ...
    A[n]-> [X .. X]
    ]]
    - Les sous tableaux peuvent être de longueur différente
    - La notation Tableau[i][j] est préférable à la notation Tableau[i, j]

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

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 27 194
    Points : 40 763
    Points
    40 763
    Par défaut
    On peut aussi se limiter à une allocation par dimension, si on alloue un tableau bidimensionnel de valeurs et un tableau de pointeurs qui pointe dedans:
    https://www.developpez.net/forums/d2...e/#post1803870
    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.

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

Discussions similaires

  1. Fonction avec variable ne marchant pas
    Par EvaMa dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 12/06/2017, 15h53
  2. Fonction echo ne marchant pas
    Par aygouin dans le forum Langage
    Réponses: 2
    Dernier message: 03/01/2007, 21h38
  3. Fonction ne marchant pas avec FomShow
    Par PadawanDuDelphi dans le forum Delphi
    Réponses: 3
    Dernier message: 02/10/2006, 14h59
  4. Open et opener => Ma fonction ne... fonctionne pas...
    Par romulus dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 17/03/2006, 11h40
  5. Feuille de style avec Hover ne marchant pas avec IE
    Par ouioui2000 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 06/03/2006, 16h10

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