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 :

[debutant] Probleme de recuparation de donnes dans une fonct


Sujet :

C

  1. #1
    Battosaiii
    Invité(e)
    Par défaut [debutant] Probleme de recuparation de donnes dans une fonct
    J'ai une fonction dans laquelle les valeurs de t[i][j] sont corrects :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void matrix_load(char *file_name,int t[8][8]) 
    {
    ...
    t[i][j]=a[j];
    				//fprintf(fpfile2,"%d",d); // We write on the output file
    				printf(" %d\n",t[i][j]);
    ...
    }
    Le printf affiche bien les valeur de a[j]

    Dans le main en revanche auqnd j'utilise

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    matrix_load(file_name1,t);
     
    for(i=1;i<=8;i++)
    {		
    	for(j=1;j<=8;j++)
    	{
    	printf(" %d\n",t[i][j]);
    	}
    }
    il y a un probleme car dans t[i][j] affiche des valeurs differentes que j'obtenais dans la fonction. genre des valeurs 435253525 34253253.
    ca peut venir dou ?

  2. #2
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Bonjour,

    en C, quand tu passes autre chose qu'un pointeur, tu passes une "COPIE" du tableau original.

    Donc dans ton cas, tu passes une copie de ton tableau, que tu modifies; mais à la sortie de ta fonction, le tableau "original" est inchangé.
    K

  3. #3
    Battosaiii
    Invité(e)
    Par défaut
    pour pointer sur le tableau je fais :
    void matrix_load(char *file_name,int*t[8][8])
    et matrix_load(file_name1,&t);
    ca marche pas : je me souviens plus comment on fait avec un tableau t pour pointer.

  4. #4
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Nevermind, je dis des bêtises, l'erreur est ailleurs je pense, j'ai tout d'un coup un énorme doute quand aux pointeurs de tableaux, et le fait que le nom du tableau est lui même un pointeur ??
    AAAAAAAAAAAAAAH au secours

    Excuse moi si l'information est fausse...

    En fait ça me sautait aux yeux, mais maintenant après coup j'ai des gros doutes par rapport à ma réponse initiale.........
    K

  5. #5
    Battosaiii
    Invité(e)
    Par défaut
    lol t'as pas une idee comment sortir la vraie valeur de la fonction avec un tableau ?

  6. #6
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Je viens de vérifier : ma réponse initiale est une ânerie.

    En fait en C, quand tu passes le tableau à ta fonction comme ceci : ta_fonction(tontableau); tu passes bien l'addresse du tableau, et donc les modifications que tu effectues dans la fonction se font sur le tableau d'origine..

    Maintenant, pourquoi est-ce que dans ton cas ça ne marche pas ? J'imagine que le problème se situe au niveau des dimensions du tableau, mais là je préfère laisser la place à de vrais experts en la matière qui te donneront la bonne solution, je devrais retourner lire quelques cours de C avant d'affirmer des bêtises j'étais sûr de mon coup pourtant... manque de pratique
    K

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: [debutant] Probleme de recuparation de donnes dans une f
    Citation Envoyé par Battosaiii
    il y a un probleme car dans t[i][j] affiche des valeurs differentes que j'obtenais dans la fonction. genre des valeurs 435253525 34253253.
    ca peut venir dou ?
    Comportement indéfini (ici, débordement)

    C'est pas <= 8, mais < 8.
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Le problème est là :
    alors qu'en C on fait
    ce qui fait toujours bien 8 valeurs mais numérotées de 0 à 7.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  9. #9
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Ah oui, en C il n'y a pas d'ArrayIndexOutOfBounds

    Encore désolé pour la mauvaise information, j'ai honte ! Pour me rattraper, dans le cours d'informatique générale que je suis en train de faire, j'illustrerais cet exemple pour expliquer les résultats incohérents dus à un accès mémoire incorrect

    En l'occurence, j'ai quand même une question qui me vient à l'esprit : le compilateur n'est-il pas assez intelligent, dans le cas d'une boucle for simple, de detecter que l'index dépassera la taille du tableau initiale ? En fait je pose cette question, mais je connais un peu la réponse, cependant j'imagine qu'il serait "possible" d'extraire les cas "simples" pour lesquels une vérification de ce type serait faisable, après est-ce que le compilateur GNU le fait par exemple ?
    K

  10. #10
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Le compilateur ne connait pas la taille du tableau.

    C'est inherent au C il n'y a aucune verification de faite pour gerer les debordements.

    Apres on pourrait concevoir qu'un compilo soit capable de reperer les structures du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int    tab[TAB_SIZE];
     
    ...
     
    for (i = 0; i <= TAB_SIZE; i++)
      {
        ....
      }
    Mais au pire il ne pourrait que donner un avertissement, qui ne serait meme pas garanti d'etre justifie, vu qu'entre temps on aurait pu dans n'importe quelle fonction faire un realloc, et changer ainsi la taille du tableau.

    (Quoi que... la j'ai un doute. Avec une definition de ce type peut-on reallouer le tableau ??? Il me semble que oui mais...)

    En tout cas je n'ai jamais vu un compilateur qui le fasse. Apres je suis loin d'avoir tout vu.
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  11. #11
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Merci pour la réponse, tu as tout à fait raison je pense.

    En fait plus que le compilo, j'imaginerais bien un IDE capable de donner un warning : il aurait en mémoire la taille initiale du tableau pour chaque bloc de programme, quand la taille est dynamique il mettrait une inconnue, mais dans le cas présent la taille est fixe, donc l'IDE _SAIT_ que quand tu fais un for i<=8 tu balayes une plage qui dépasse les indexs autorisés du tableau, mais là je me lance dans des suppositions métaphysiques
    K

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Jack_serious
    (Quoi que... la j'ai un doute. Avec une definition de ce type peut-on reallouer le tableau ??? Il me semble que oui mais...)
    Non. On ne peut réallouer que ce qui a été alloué par *alloc().
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par Jack_serious
    (Quoi que... la j'ai un doute. Avec une definition de ce type peut-on reallouer le tableau ??? Il me semble que oui mais...)
    Non. on ne peut réalloier que ce qui a été alloué par *alloc().
    Mouais... Je me doutais qu'il y avait un truc comme ca...

    Merci pour cette precision !
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par KiLVaiDeN
    En fait plus que le compilo, j'imaginerais bien un IDE capable de donner un warning<...>
    Il y a un projet d'IDE en cours avec des gens du forum (demande à C-soldier). Si te sens le courage de mettre en pratique tes idées...
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Battosaiii
    Invité(e)
    Par défaut
    J'ai modifie mon prograqmme en fct de vos remarques mais jai tjrs la meme erreur . Voici dans le main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    matrix_load(file_name1,t);
     
     
    /** display t **/ 
    for(i=0;i<8;i++)
    {		
    	for(j=0;j<8;j++)
    	{
    	printf(" %d\n",t[i][j]);
    	}
    }
    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
     
    void matrix_load(char *file_name,int t[7][7]) 
    {
    ...
     
    	for(j=0;j<8;j++)
    				{
    				t[i][j]=a[j];
    				//fprintf(fpfile2,"%d",d); // We write on the output file
    				printf(" %d\n",t[i][j]);
    				}
    ...
    }
    J'ai la meme erreur ... CA M'ENERVE !!![/code]

  16. #16
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Battosaiii
    J'ai modifie mon prograqmme en fct de vos remarques mais jai tjrs la meme erreur . Voici dans le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void matrix_load(char *file_name,int t[7][7])
    On avait pas dit 8 au lieu de 7 ?

    8, c'est ne nombre d'élement. L'indice correspondand varie de 0 à 7...
    Pas de Wi-Fi à la maison : CPL

  17. #17
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Peut-être que ton problème est lié à une variable unsigned ?
    Si tu essaies de mettre de l'unsigned dans du signed, tu risques d'avoir des dépassements de taille, et donc des valeurs incohérentes.

    Ensuite, mets des trace de deboggage, pour savoir à tout moment dans tes boucles quelles sont les opérations que tu fais, par exemple un simple printf de tes valeurs i et j, ou mieux de l'assignation complète, ça te permettra de voir ce que tu fais vraiment sur ton tableau.
    K

  18. #18
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par Battosaiii
    J'ai modifie mon prograqmme en fct de vos remarques mais jai tjrs la meme erreur . Voici dans le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void matrix_load(char *file_name,int t[7][7])
    On avait pas dit 8 au lieu de 7 ?

    8, c'est ne nombre d'élement. L'indice correspondand varie de 0 à 7...
    Oui mais si c'est int t[7][7], il faut mettre de 0 à 6 ...
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  19. #19
    Membre habitué Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Points : 139
    Points
    139
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void matrix_load(char *file_name,int t[7][7])
    int t[7][7] ne passe t il pas que la valeur de t[7][7] et pas le tableau complet ?? ne faudrait il pas faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void matrix_load(char *file_name,int *t[7][7]) 
    ou
    void matrix_load(char *file_name,int t)

  20. #20
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par semaj_james
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void matrix_load(char *file_name,int t[7][7])
    int t[7][7] ne passe t il pas que la valeur de t[7][7] et pas le tableau complet ?? ne faudrait il pas faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void matrix_load(char *file_name,int *t[7][7])
    Ici t serait un poiteur sur un tableau a double entree, donc un pointeur sur un pointeur de pointeurs d'entiers, ou plus simplement (hahaha) un int ***

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    ou
    void matrix_load(char *file_name,int t)
    Ici en revanche t est un entier tout mimi tout simple.

    Rien a voir je suis au regret de le dire.

    La premiere ecriture aurait un sens si on voulait modifier le tableau lui meme (le reallouer en somme) ce qui serait dur vu comme il a ete defini.

    La deuxieme... euuuuh... je vois pas.
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

Discussions similaires

  1. [MySQL] Probleme d'ajout de données dans une base en PHP
    Par colapsus dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 30/05/2012, 12h31
  2. [Debutant] mise à jour de donnée dans une base access
    Par brissou #55 dans le forum Windows Forms
    Réponses: 12
    Dernier message: 25/12/2007, 21h28
  3. [debutant]inserer des données dans une table
    Par khayate dans le forum VB.NET
    Réponses: 15
    Dernier message: 06/06/2007, 09h02
  4. probleme de numerotation des données dans une table
    Par tchimou dans le forum Bases de données
    Réponses: 8
    Dernier message: 17/04/2007, 14h26
  5. [debutant]probleme de recupération de données saisies dans une JDialog
    Par melodie53 dans le forum Agents de placement/Fenêtres
    Réponses: 11
    Dernier message: 07/08/2006, 16h32

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