Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1095 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Pointeur de fichier en paramètre

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pointeur de fichier en paramètre

n°1918654
ProGrammeH​eure
Posté le 26-08-2009 à 18:33:06  profilanswer
 

bonjour c'est toujours moi,
je suis sous winXP,IDE devc++, toujours newbies, et je fait un programme en c.
 
voilà j'ai plusieur pointeurs qui pointe des fichier de même type:
je pointe des fichiers ou seront enregistré des chaine de TV.
je souhaite donc les regrouper dans un "tableau de pointeur de fichier", pour un usage par la suite plus aisé (zapper entre les chaines par exemple).
j'en entend déjà qui s'arrache les cheveux  :p  
donc je fait

Code :
  1. FILE* FpChaine[NombreDeChaines]= { };


le nombre de chaines étant précedement fixé avec un #define NombreDeChaines 5
 
alors ma question est la suivante:
comment passer ce "tableau de pointeur" en argument dans une fonction? :sarcastic:  
et comment ecrire le prototype de cette fonction?
(ce serait une fonction qui ne ferait qu'un fopen de chacun des fichiers correspondant au pointeur: qu'elle fasse par exemple :FpChaine[i] = fopen(cNomFichierClient, "w" ); ce qui je tiens à le signaler fonctionne très bien en le laissant dans la fonction principale  )
 


---------------
De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent.
mood
Publicité
Posté le 26-08-2009 à 18:33:06  profilanswer
 

n°1918661
Sebxoii
I've made a huge tiny mistake.
Posté le 26-08-2009 à 19:45:16  profilanswer
 

Je vois pas très bien le soucis.

 

Tu crées ta fonction avec un prototype du style :

Code :
  1. void fopen_tableau(FILE** FpChaine)


Ca devrait te permettre de faire tes fopen sans problème a priori. :)

Message cité 1 fois
Message édité par Sebxoii le 26-08-2009 à 19:45:31
n°1918672
Sve@r
Posté le 26-08-2009 à 21:03:10  profilanswer
 


On est tous passés par là
...

ProGrammeHeure a écrit :

comment passer ce "tableau de pointeur" en argument dans une fonction? :sarcastic:


Pourquoi cet emoticon "sarcastic" ???
 
Tu veux passer un tableau de n'importe quoi (exemple "nimportequoi tab[10]" ) à une fonction, ben tu passes simplement le nom de la variable à la fonction => ex: fct(tab)
La fonction sera déclarée comme recevant un pointeur sur le type en question => void fct(nimportquoi *pt)
 
Chez-toi, c'est quoi ce "nimportequoi" ? Ben c'est un "FILE*" d'où la réponse de Sebxoii => void fct(FILE* *pt)
 
Toutefois, l'équivalence tableau/pointeur ne fonctionne que pour la dernière dimension. Pour les autres dimensions, un tableau reste un tableau.
Exemple: un rectangle d'int 8x10 => int rect[8][10]
Si tu passes ce "rect" à une fonction, elle pourra être déclarée ainsi
- void fct(int rect[8][10])
- void fct(int *rect[10])
Mais ne pourra en aucun cas être déclarée void fct(int **rect). C'est dû au fait que pour adresser l'élement [x][y], le compilo a besoin de connaitre la largeur pour calculer la position. et dans "int **rect", il n'y a pas d'indication de largeur...
 

ProGrammeHeure a écrit :

par exemple :FpChaine[i] = fopen(cNomFichierClient, "w" ); ce qui je tiens à le signaler fonctionne très bien en le laissant dans la fonction principale  )


Merci de le signaler. On ne s'en doutait pas...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1918722
ProGrammeH​eure
Posté le 27-08-2009 à 08:43:38  profilanswer
 

merci breaucoup, je vais essayé ça :)

n°1918766
Taz
bisounours-codeur
Posté le 27-08-2009 à 10:32:16  profilanswer
 

Sebxoii a écrit :

Je vois pas très bien le soucis.
 
Tu crées ta fonction avec un prototype du style :

Code :
  1. void fopen_tableau(FILE** FpChaine)


Ca devrait te permettre de faire tes fopen sans problème a priori. :)


Quant tu passes un pointeur vers un tableau au sens large, il faut prendre l'habitude de passer la taille du tableau en paramètre. (size_t n)

n°1918929
ProGrammeH​eure
Posté le 27-08-2009 à 17:32:26  profilanswer
 

oui Taz, mais là je ne connais pas la taille du tableau,
ce sont des pointeurs de fichier dont je ne connais pas la taille.
en tout cas ça fonctionne, :)
je suis tenté de dire Resolu!
même si ce dernier commentaire me laisse perplexe... :/

n°1918934
masklinn
í dag viðrar vel til loftárása
Posté le 27-08-2009 à 17:36:43  profilanswer
 

ProGrammeHeure a écrit :

oui Taz, mais là je ne connais pas la taille du tableau


Si tu connais pas le nombre de fichiers dans ton tableau, comment tu fais pour les manipuler [:petrus dei]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1918935
Sebxoii
I've made a huge tiny mistake.
Posté le 27-08-2009 à 17:38:17  profilanswer
 

J'ose espérer que tu en connais la taillle...

 

J'imagine que tu fais une boucle for dans ta fonction fopen_tableau :

Code :
  1. for(i = 0; i < NombreDeChaines ; i++)
  2. FpChaine[i] = fopen(...,...);


Dans ce cas, au lieu de mettre "NombreDeChaines" en dur dans ta fonction fopen_tableau, Taz te conseille de changer le prototype ainsi :

Code :
  1. void fopen_tableau(FILE** FpChaine, size_t taile)


et de l'appeler ce cette manière :

Code :
  1. fopen_tableau(FpChaine,NombreDeChaines);


Message édité par Sebxoii le 27-08-2009 à 17:39:11
n°1918938
ProGrammeH​eure
Posté le 27-08-2009 à 17:45:54  profilanswer
 

erf si la taille je la connais (c'est le nombre de chaine fixe en variable globale), ce que je connais pas c'est la taille du type des pointeurs.
ça se fait un sizeof(FILE)???
 
heu Sebxoii, le compilo comprendra qu'il s'agit d'un tableau de fichier?
je devrais pas plutot faire un :
taille =NombreDeChaines* sizeof (FILE);
mais ça ça me fait vraiment peur quand même ^^
parceque le type FILE on ne sait pas ce qu'il prend...
 
bref, là je suis de retour en plein brouillard :(

n°1918944
Sebxoii
I've made a huge tiny mistake.
Posté le 27-08-2009 à 17:50:22  profilanswer
 

sizeof(FILE *), tu bosses avec des pointeurs sur descripteur de fichier, et non des "FILE".
 
Mais de toute façon, c'est inutile. Je te conseille de relire un peu tes cours sur les pointeurs, tu comprendras ptet mieux comment fonctionne l'adressage avec des tableaux etc... ;)

mood
Publicité
Posté le 27-08-2009 à 17:50:22  profilanswer
 

n°1918972
ProGrammeH​eure
Posté le 27-08-2009 à 18:40:00  profilanswer
 

je comprend bien la notion de pointeur, de tableau, mais dés qu'il faut manipuler des fichier je suis perdu.
et je n'ai pas vraiment de cours, mes cours c'est le site du zero, l'ipst(une univ à strasbourg qu'à un site), deux trois sites, deux trois forums, et google :)
mais c'est pas toujours évident de comprendre la bonne manip du premier coup. surtout quand on débute :)

n°1918987
Sve@r
Posté le 27-08-2009 à 19:42:00  profilanswer
 

ProGrammeHeure a écrit :

je comprend bien la notion de pointeur, de tableau, mais dés qu'il faut manipuler des fichier je suis perdu.


En fait, t'as pas besoin de te préoccuper de quoi que ce soit. Quand tu fais un fopen("fichier", ...), la fonction fopen va remplir une zone bien à elle avec tout un tas d'info pour maniper ledit fichier et te renvoie l'adresse de cette zone.
Tout ce que t'as à faire, c'est stocker cette adresse (un simple nombre quoi) dans un pointeur. Pointeur de quoi ? Pointeur sur le type "FILE" (le type décrivant ladite zone) d'où un "FILE *"
Ce qui donne FILE* fp=fopen("...", ...) => l'adresse de la zone est stockée dans la variable fp. Toute fonction recevant fp saura aller dans la zone en question trouver les outils pour lire/écrire le fichier.
Ainsi, chaque fonction de lecture/écriture/contrôle du fichier doit recevoir ce "fp" et saura s'en servir.
 
Maintenant, tu veux gérer en même temps 10 fichiers, ben soit tu le fais de façon brutos
FILE *fp1;
FILE *fp2;
FILE *fp3
...
 
soit tu le fais de façon fine => FILE *fp[10]. Ensuite quand tu voudras maniper le fichier "i", tu passeras à ta fonction l'élément fp[i] (qui reste toujours un simple nombre)...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1919093
ProGrammeH​eure
Posté le 28-08-2009 à 09:16:01  profilanswer
 

merci de vos reponse.
 
oui, la deuxième solution, c'est ce que j'ai fais.
mon programme fonctionne comme je le voulais, mais c'est un peu du charlatanisme:
je n'ai pas mi la taille du tableau, quand je passe ce dernier en paramètre à une fonction. pourquoi je ne l'ai pas fais?
par ce que cette taille est définie en variable globale:
#define tailleTableau 5
quand une fonction se voit passer en paramètre un tableau et la taille de ce dernier, elle fait une copiet du pointeur tab, par exemple et cette copie pointe sur tab[0]. la fonction (je pense) fait donc un malloc (sizeof(taille)), pour avoir la place nécéssaire pour traiter le tableau, et je pense ne pas déborder audelà, enfin seulement si j'ai bien compris.
 
donc est ce génant de ne pas mettre la taille du tableau en paramètre,
sachant qu'elle est tout de même visible dans ladite fonction car c'est une variable globale?
est ce que c'est tout à fait hors jeu ou est ce que ça marche?
si oui comment met on en paramètre une variable globale du genre
#define?
 
ps: j'ai quand même mis des securité dans la fonction pour que le tableau ne deborde pas.

n°1919098
masklinn
í dag viðrar vel til loftárása
Posté le 28-08-2009 à 09:26:05  profilanswer
 

ProGrammeHeure a écrit :

donc est ce génant de ne pas mettre la taille du tableau en paramètre, sachant qu'elle est tout de même visible dans ladite fonction car c'est une variable globale?


bah disons que si un jour tu te mets à coder correctement ou tu tentes de réutiliser ta fonction dans un autre contexte ça va être problématique.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1919116
ProGrammeH​eure
Posté le 28-08-2009 à 09:54:40  profilanswer
 

oui ça c'est vrai, mais je ne penses pas reprendre le code.
ce que je veux savoir c'est si c'est pas hors jeu, s'il y a un risque, si ça penalise la mémoire, le temps proc,etc...
 
si c'est juste mal écrit mais que ça marche nikel moi ça me va ;)

n°1919257
Joel F
Real men use unique_ptr
Posté le 28-08-2009 à 13:04:20  profilanswer
 

ProGrammeHeure a écrit :


oui ça c'est vrai, mais je ne penses pas reprendre le code.


Toujours coder une future reutilisation ...
 

ProGrammeHeure a écrit :


ce que je veux savoir c'est si c'est pas hors jeu, s'il y a un risque, si ça penalise la mémoire, le temps proc,etc...


A ton niveau, on se moque de ces considérations
 

ProGrammeHeure a écrit :


si c'est juste mal écrit mais que ça marche nikel moi ça me va ;)


Mauvaise habitude

n°1919293
ProGrammeH​eure
Posté le 28-08-2009 à 15:50:14  profilanswer
 

heu... non je m'en fou pas des ressources.
c'est vrai que je débute et que qu'il marrive de faire totalement nimp,
mais c'est pas pour ça que je dois apprendre avec des erreurs, ou des mauvaise habitude.
quand je disait que ça marche nikel, c'est justement vis à vis de ces ressources, et pas juste "ça marche".
et les nom associé au commentaires de mon code me permettent de m'y retrouver, donc à la limite si faut reprendre j'en suis capable.
mais sur ce coup ci c'est vrai que je ne pense pas le reprendre, c'est du code pour ce former, non optimiser, pour comprendre, je pense que ce serait dangereux de le reprendre par la suite. mieux vaut recommencer une fois que tout est bien integré.

n°1919483
Sve@r
Posté le 28-08-2009 à 21:59:51  profilanswer
 

ProGrammeHeure a écrit :

ps: j'ai quand même mis des securité dans la fonction pour que le tableau ne deborde pas.


T'as tout compris.
 
En fait, quand tu manipes un tableau quel qu'il soit et où que ce soit, tu peux aller où tu veux même en dehors du tableau. Exemple t'as un int tab[10], rien ne t'interdit d'aller voir tab[125] ou tab[-422]. Le compilo ne dira absolument rien. Toutefois, à l'exécution, ça produit un comportement indéterminé (c.a.d. un comportement imprévisible => ça peut planter comme ça peut marcher comme ça peut faire rebooter ton PC => imprévisible)
 
C'est pour ça que quand tu passes un tableau à une fonction, tu peux récupérer ce tableau dans un pointeur, un tableau sans taille ou un tableau avec taille, peu importe. De toute façon, la taille ne sert pas (en dimension 1 bien sûr car dans les autres dimensions, la taille sert à calculer la position).
 
Philosophie du C => tu gères ton tableau, tu dois savoir en permanence où tu te trouves dans ton tableau et c'est à toi de faire tes propres contrôles.
 

ProGrammeHeure a écrit :

sachant qu'elle est tout de même visible dans ladite fonction car c'est une variable globale?


Tu fais erreur. Dans ton source, le nb d'éléments n'est pas une variable mais un define. Quand ton code est compilé, tout le source est réécrit et tous les define sont remplacés par la valeur correspondante.  
 

ProGrammeHeure a écrit :

si oui comment met on en paramètre une variable globale


Par définition, une variable globale est connue de tout le programme donc c'est inutile de la passer en paramètre.
Par ailleurs, les variables globales sont généralement très mal considérées par les programmeurs car elles affaiblissent le code
1) n'oublie pas que tu peux travailler en collaboration. Que se passera-t-il si le projet sur lequel tu es a une globale "toto" que tu ne connais pas et que tu déclares dans ta fonction ta propre variable "toto" => ta variable masquera la globale et ta fonction ne pourra pas l'utiliser
2) si au cours des tests la globale est modifiée par erreur, on ne saura jamais où est-ce qu'elle a été modifiée et faudra passer tout le code à la loupe
3) toute info portée par la globale peut être portée par une locale qui est passée en paramètre
 
Conclusion: les globales, généralement on évite. Mais un #define ce n'est pas une globale. Cependant, pour éviter de confondre un define avec une variable, on met généralement les define en majuscule car les define amènent d'autres soucis donc les programmeurs aiment bien savoir qu'ils sont en train de maniper un define...
 

ProGrammeHeure a écrit :

mais sur ce coup ci c'est vrai que je ne pense pas le reprendre, c'est du code pour ce former, non optimiser, pour comprendre, je pense que ce serait dangereux de le reprendre par la suite. mieux vaut recommencer une fois que tout est bien integré.


C'est en forgeant qu'on devient forgeron.


Message édité par Sve@r le 28-08-2009 à 22:01:10

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1919592
ProGrammeH​eure
Posté le 29-08-2009 à 16:19:59  profilanswer
 

merci, oui je me suis trompé, je parlais bien de "define" et non de variables globales.

n°1937855
HaWaI_Fr
Posté le 04-11-2009 à 23:27:07  profilanswer
 

Bonjour, j'ai moi aussi un problème de passage de tableau bidimensionnelle de pointeur dans une fonction, j'aimerais s'il vous plait obtenir votre aide car personne dans ma prepa ne veut bien m'aider ^^
 
en déclaration j'ai
Bloc *pbloc[6][8]; // ma grille de pointeur que je souhaite transmettre à mon timer // bien sur j'ai malloc
..
..
..
..
..
timer=gtk_timeout_add(10000,fluideaction,pbloc);
 
void fluideaction(gpointer data){
        Bloc *pbloc[6][8]=(Bloc***)pbloc; // je trouver illogique de mettre pbloc mais mon prof m'y a contraint // j'ai aussi essayer en mettant data ;)
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Pointeur de fichier en paramètre

 

Sujets relatifs
initialisation d'un tableau de pointeurbatch à partir d'un fichier ip plus fichier de log
verification code chargement java appelant un fichier prolog via jplExecuter macro d'un fichier dans un autre
VB Script pour compter le nbr de fichier des dossiers ET sous dossierslinklabel ouvrir un fichier VB
Webservice SOAP - passage du contenu d'un fichier en variable[MySQL] Importation fichier txt : nom de champs?
Inserer données fichier excel dans base MysqlFichier excel généré qui a une taille anormale [RESOLU]
Plus de sujets relatifs à : Pointeur de fichier en paramètre


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR