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 :

Problème allocation dynamique


Sujet :

C

  1. #1
    Nouveau membre du Club Avatar de ethan007
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 31
    Points
    31
    Par défaut Problème allocation dynamique
    Bonsoir à tous,
    j'ai (encore) un petit problème avec une fonction qui doit lire un tableau de char* et formater avec sscanf pour stocker les bons coefficients dans une matrice. voici le code (j'ai simplifié pour faire apparaitre juste l'érreur de segmentation)

    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
    42
    43
    44
    45
    46
     
    /*
    *NOTE:
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define NBL 10
    #define NBC 3
    /*
    *  Reads data from a file
    *  @param nom_fichier: the file's name
    *  @return the file content in a char*
    */
    int** alloc_tab_2_D(int nbre_lig, int nbre_col);
    int main(int argc, char *argv[]){
    char *var = "10 3\n1 2 3\n4 5 6\n7 8 9\n 1 2 3\n4 5 6\n7 8 9\n1 2 3\n4 5 6\n7 8 9\n1 2 3";
     int i, j;
     int **tab_2_d = alloc_tab_2_D(NBL, NBC);
     int current_offset = 5;
        for( i = 0; i < NBL; i++)
        {
            for(j = 0; j < NBC; j++)
            {
                //La valeur à recuperer se trouve toujours à un indice paire, les indices impaires sont les espaces et les \n
                /*CONTENT EX:3 3\n1 2 3\n4 5 6\n7 8 9\0
                  INDICES EX:012_3456789.............*/
     
                sscanf(&var[current_offset], "%d", &tab_2_d[i][j]);
                printf("|%d, i= %d j= %d OFF = %d\n", tab_2_d[i][j], i, j, current_offset);
     
                current_offset +=2;//skip spaces and /n
     
            }
        }
    }
    int** alloc_tab_2_D(int nbre_lig, int nbre_col){
        int i=0,j=0;
        int** tab_2_d = (int**)malloc(nbre_lig * sizeof(int));
        for(i = 0; i < nbre_lig; i++)
        {
            tab_2_d[i] = (int*)malloc(nbre_col * sizeof(int));	
        }
     
        return tab_2_d; 
    }

    Mais à chaque fois j'obtiens une erreur de segmentation quand l'indice i vaut 5 et j vaut 2 !. Quelqu'un peut -il m'aider?

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    tab_2_d c'est l'adresse de pointeurs, ce sont donc des pointeurs qu'il faut allouer d'où ligne 39
    int** tab_2_d = malloc( nbre_lig * sizeof(*int) );

  3. #3
    Nouveau membre du Club Avatar de ethan007
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 31
    Points
    31
    Par défaut
    Bonjour , merci pour la réponse, en réalité je me disait que la taille d'un pointeur est inférieure à la taille de l'entier lui même raison pour laquelle il faut les utiliser, alors que c'est tout le contraire, je viens justement d'afficher leurs tailles et la taille du pointeur fait le double (8octetcs) de la taille de l'entier! paradoxe?? les pointeurs étaient censé être moins gourmands en mémoire non?

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Citation Envoyé par ethan007 Voir le message
    les pointeurs étaient censé être moins gourmands en mémoire non?
    Moins gourmand que quoi?
    La taille d'un pointeur est directement imposée par l’architecture processeur. Sur un système 64 bits un pointeur fait 8 octets (taille d'un mot d'adresse), c'est incontournable. Un entier devrait aussi faire 8 octets sur ces processeurs (taille d'un mot de donnée), mais certains compilateurs pour économiser des octets décident d'un int sur 4 et d'un long sur 8 octets.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par ethan007 Voir le message
    en réalité je me disait que la taille d'un pointeur est inférieure à la taille de l'entier lui même raison pour laquelle il faut les utiliser...les pointeurs étaient censé être moins gourmands en mémoire non?
    Fausse idée. Ou du moins, idée mal comprise à l'origine, et ensuite transformée et enfin restituée totalement à l'ouest de sa signification première.

    En dehors de son utilisation permettant à une fonction F d'aller modifier une variable située hors de son espace de nom (la fonction F doit recevoir l'adresse de cette variable qu'elle stockera dans un pointeur), un pointeur est juste un raccourci permettant d'aller directement, lors de l'utilisation des tableaux, à une donnée D plus rapidement qu'un accès classique.

    Exemple de base
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *phrase="Hello World";
    size_t i;
    for (i=0; phrase[i] != '\0'; i++) printf("%c", phrase[i]);
    Dans cet exemple, chaque accès à phrase[i] se traduira par un placement sur le début du tableau puis un calcul de décalage de "i" positions. Ici ce calcul est donc fait deux fois mais évidemment ça peut monter dans d'autres algorithmes.

    Afin d'aller plus vite, on passe alors par un pointeur intermédiaire que l'on positionnera sur la bonne case à chaque itération.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *phrase="Hello World";
    char *pt;
    for (pt=phrase; *pt != '\0'; pt++) printf("%c", *pt);
    Ici, le pointeur "pt" évolue avec la boucle est reste toujours positionné sur le bon caractère. Il n'y a plus besoin de calculer phrase[i] puisque "pt" est positionné sur ce caractère.

    Bon, ici sur un tableau de char, la différence est minime (en réalité elle est imperceptible). Mais si tu commences à manipuler des tableaux de grosses structures dans des algorithmes un peu complexes (tris et autres conneries de ce genre), tu commenceras à sentir la différence.

    Donc des pointeurs judicieusement créés permettent à ton code d'aller plus vite mais ne sont certainement pas moins gourmands en mémoire. En fait c'est même souvent plutôt le contraire car un pointeur est une seconde variable vers une donnée déjà accessible à l'origine par une première variable. Mais aujourd'hui la mémoire on en a, ce qui compte c'est plutôt c'est la rapidité...

    Citation Envoyé par dalfab Voir le message
    sizeof(*int)
    Ce ne serait pas plutôt sizeof(int*) ???
    Mon Tutoriel sur la programmation «Python»
    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
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    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
    Citation Envoyé par ethan007 Voir le message
    je me disait que la taille d'un pointeur est inférieure à la taille de l'entier lui même [...] les pointeurs étaient censé être moins gourmands en mémoire non?
    Même si c'était vrai, le pointeur n'a d'utilité que pour pointer sur quelque chose.
    Et ce quelque chose doit bien exister quelquepart...
    Ton pointeur, c'est juste un truc en plus pour accéder à la variable, donc de la mémoire en plus nécessaire.
    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.

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

Discussions similaires

  1. problème allocation dynamique dans C++
    Par mido1951 dans le forum C++
    Réponses: 16
    Dernier message: 23/04/2013, 21h38
  2. problème allocation dynamique tableau 2d
    Par virtual_bug dans le forum C++
    Réponses: 16
    Dernier message: 17/04/2012, 11h21
  3. Réponses: 4
    Dernier message: 06/05/2008, 13h12
  4. Problème allocation dynamique ?
    Par Dark_Alex69 dans le forum C
    Réponses: 15
    Dernier message: 20/11/2007, 15h44
  5. problème allocation dynamique
    Par josef24 dans le forum Débuter
    Réponses: 6
    Dernier message: 12/11/2007, 12h31

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