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 :

Remplir matrice à partir d'un tableau


Sujet :

C

  1. #1
    Membre averti Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Points : 333
    Points
    333
    Par défaut Remplir matrice à partir d'un tableau
    Bonsoir à tous ,
    j'essaye de remplir une matrice [500][500] à partir d'un fichier de 500 ligne de 500 caractères
    Ça fonctionne bien jusqu'à la fin ou j'ai n'importe quoi .
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1861712514 32613 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1572864 0 1571268 0 1571268 0 0 0 5 0 3670016 0 3690496 0 3689912 0 3709016 0 1572864 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1863906464 32613 47 0 1861729621 32613 0 0 1863907632 32613 32 0 0 1 0 0 0 0 -899310880 32767 1861728729 32613 1863918024 32613 1863906496 32613 -899310880 32767 1861712140 32613 0 0 0 0 0 0 1861744717 32613 0 0 1858063843 32613 0 0 1861716034 32613 1861664768 32613 1861683288 32613 1861664184 32613 0 0 -899311232 32767 1863906464 32613 4195568 0 1863917984 32613 3 1 -899310712 0 6 0 3709016 0 2049 0 24248339 0 1 0 33261 0 0 0 0 0 1595408 0 4096 0 3120 0 1377863958 0 136018242 0 1356881761 0 0 0 1373250333 0 968359423 0 0 0 0 0 0 0 0 0 4195568 0 1863918024 32613 1863913536 32613 0 0 1863918960 32613 0 0 1861716314 32613
    0 0 -899309880 32767 0 0 0 0 0 0 1863888331 32613 0 0 3 0 0 1 16777216 0 10 0 0 32613 -899310720 32767 -899309872 32767 0 0 -899309857 32767 0 0 0 0 832 0 1179403647 65794 0 0 4063235 1 126912 0 64 0 1593168 0 0 3670080 4194314 2228259 6 5 64 0 64 0 64 0 560 0 560 0 8 0 3 4 1398064 0 1398064 0 1398064 0 28 0 28 0 16 0 1 5 0 0 0 0 0 0 1571268 0 1571268 0 2097152 0 1 6 1574712 0 3671864 0 3671864 0 18048 0 37152 0 2097152 0 2 6 1588032 0 3685184 0 3685184 0 480 0 480 0 8 0 4 4 624 0 624 0 624 0 68 0 68 0 4 0 7 4 1574712 0 3671864 0 3671864 0 16 0 104 0 8 0 1685382480 4 1398092 0 1398092 0 1398092 0 26652 0 26652 0 4 0 1685382481 6 0 0 0 0 0 0 0 0 0 0 -899309248 32767 -899309136 32767 1863906496 32613 0 0 1858063843 32613 -899309776 32767 1861739026 32613 0 0 1861741526 32613 1863917592 32613 -899309208 32767 -899309200 32767 -899309185 32767 1861738976 32613 -899309248 32767 2 6 0 0 1011 9 1861659456 32613 1130364928 -27445 1863906496 32613 0 0 1861722378 32613 -899309776 32767 -899309824 32767 -680132608 -20259345 -899309824 32767 1863907784 32613 3 0 2090266759 0 1861724179 32613 4331536 8405024 0 0 7 269549568 32660418 0 1857989680 32613 -899309456 32767 1857989728 32613 0 0 1858041568 32613 1861738478 32613 0 0 1863908520 32613 1863906496 32613 1861687100 32613 1858041856 32613 1861686288 32613 0 1 2160 1 -899309200 32767 1863918880 32613 -899309376 32767 1863908520 32613 -899309192 32767 1863915992 32613 2090266759 0 1861725186 32613 0 0 1863908520 32613 1 0 0 0 1 0 1863915992 32613 -680132608 -20259345 0 0 0 0 1861747369 32613 0 0 1863918880 32613 -899309456 32767 -899309432 32767 0 1 0 0 0 0 1861687100 32613 0 0 0 0 0 0 0 0 1 0 1858069072 32613 1863915992 32613 1861722378 32613 20 0 -899309344 32767 -899309264 32767 -899309344 32767 1863919488 32613 1 0 1910330751 0 1861724305 32613 1863913264 32613 1863915992 32613 63 32613 29848917 0 0 0 1861722378 32613 -898743968 32767 -899309232 32767 -898743920 32767 -899309232 32767 1863907784 32613 3 0 -163754450 0 1861724179 32613 -898743704 32767 0 0 46 0 64550200 0 1857989228 32613 -899308864 32767 1857989728 32613 -899308816 32767 1858038856 32613 1863919448 32613 0 0 1863907848 32613 1863906496 32613 4195681 0 1858041856 32613 4195264 0 0 1 2047 1 -1376220355 0 1863918880 32613 -899308784 32767 1863907848 32613 -899308744 32767 1863918024 32613 -163754450 0 1861725186 32613 0 0 1863907848 32613 1 0 0 0 1 0 1863918024 32613 0 0 0 0 1863919472 32613 1858193504 32613 0 0 1863918880 32613 -899308864 32767 -899308840 32767 9 1 -899308834 32767 194 0 4195681 0 -899308834 32767 1858563548 32613 221 0 2 0 -899308560 32767 15774429 0 194 0 -899308834 32767 -899308833 32767 4196225 0 1 0 4197437 0
    Je n'ai aucune idée d'où cela peut il venir ... Voici la fonction qui rempli ma matrice :
    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
     
     
    FILE* fichierentree = fopen(argv[optind],"r");
    int grille[500][500];
     
     
    void remplirgrille(int grille[500][500],FILE* fichier)
    {
    	int i,j;
     
    	for(i=0;i<500;i++)
    	{
    		for(j=0;j<500;j++)
    		{
    			fscanf(fichier,"%d ",&grille[i][j]);
    		}
    	}
    }

    Merci pour avoir lui et merci d'avance pour toute aide ...


    EDIT : j'ai remplacé fscanf(fichier,"%d ",&grille[i][j]) par fscanf(fichier,"%1d",&grille[i][j])je crois que le problème est résolu ....

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 25
    Points : 27
    Points
    27
    Par défaut
    Bonjour,

    C'est bien que tu aies trouvé la réponse tout seul. Je n'ai toutefois pas testé mais je veux bien t'accorder les félicitations du jury. Toutefois, en langage C, lorsqu'un tableau est passé en paramètre à une fonction, ce dernier est converti en un pointeur vers son premier élément. Il convient donc, plutôt que de passer le tableau lui-même en paramètre, de passer un pointeur (tel que je l'avais décrit) et la taille du tableau.

    De peur que tu ne comprennes, je te file le lien suivant : http://c.developpez.com/faq/?page=tableaux. Tu pourras lire la réponse à la question 9 même si les autres sont toutes instructives aussi. Courage et bonne journée !

  3. #3
    Membre averti Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Points : 333
    Points
    333
    Par défaut
    Merci pour cette réponse , je m'en vais de ce pas lire ceci ... Pourquoi ne pas le passer directement en paramétre ? par convention , soucis de performances ?

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Il y a deux raisons à cela :

    1. Si ton pointeur pointe sur une zone allouée avec une fonction telle que malloc() (ce qu'on appelle des fois un "tableau dynamique"), il n'est pas possible de retrouver sa taille.
    2. Si tu passes un tableau (un vrai, déclaré avec des crochets) en paramètre à une fonction, tu passes en fait de manière implicite un pointeur vers son premier élément. Ainsi, tu ne peux pas retrouver la taille du tableau dans la fonction.

    Ainsi, pour faire des fonctions capables de travailler avec des "tableaux" (des vrais ou des zones obtenues avec malloc()), il faut une fonction prenant en paramètres un pointeur et la taille de la zone.

    Petite remarque également sur les nombres magiques. Ton code contient plusieurs fois la valeur 500. Et si maintenant il fallait mettre 200 ? Tu comptes changer partout, en espérant ne pas te tromper ? Ce n'est pas la meilleure stratégie bien sûr. Il vaut mieux passer par une constante, soit avec une macro soit avec une variable correctement typée. Ex :
    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
    #define NB_LIGNES	500
    static const size_t NB_COLONNES = NB_LIGNES;
     
    void remplirgrille(int grille[NB_LIGNES][NB_COLONNES],FILE* fichier)
    {
    	int i,j;
     
    	for(i=0;i<NB_LIGNES;i++)
    	{
    		for(j=0;j<NB_COLONNES;j++)
    		{
    			fscanf(fichier,"%d ",&grille[i][j]);
    		}
    	}
    }

  5. #5
    Membre averti Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Points : 333
    Points
    333
    Par défaut
    Merci pour la réponse je comprends mieux !

    Effectivement pour le 500 , j'aurais du y penser , je modifie mon code de ce pas.

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

Discussions similaires

  1. Remplir une matrice 3D à partir d'un tableau 2D
    Par DJEcalcul dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 10/02/2015, 17h29
  2. Remplir une matrice à partir d'un vecteur (Suite)
    Par amarion dans le forum MATLAB
    Réponses: 5
    Dernier message: 17/03/2008, 08h23
  3. Remplir une matrice à partir d'un vecteur
    Par amarion dans le forum MATLAB
    Réponses: 2
    Dernier message: 10/03/2008, 12h17
  4. [SQL] Remplir une base SQL à partir d'un tableau à plusieurs lignes et colonnes
    Par Yagami_Raito dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 13/08/2007, 08h56
  5. Remplir une plage à partir d'un tableau
    Par roudy78 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/05/2007, 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