Accueil > Forum > > > > passage de valeurs de fonction a fonction
passage de valeurs de fonction a fonction
jeudi 21 juin 2007 à 15:28:13 |
passage de valeurs de fonction a fonction

binoua
|
salut à tous, Je débute en c++ et je n'arrive pas à faire le truc de base. En fait dans ma fonction principale je rentre le nom d'un fichier puis je dis d'appliquer la fonction read (fonction perso) à ce fichier. Dans cette fonction read les données sont stockées sous forme de tableau. Question : Comment réutiliser ce tableau dans la fonction principale ?? Merci de votre aide. Ci-dessous le code en question. #include <cstdio> #include <iostream> #include <fstream>
using namespace std;
char read (ifstream & f);
int main () { ifstream file("test.txt", ios::binary); //flux d'entrée read(file); system ("PAUSE"); return EXIT_SUCCESS; }
char read (ifstream & f) { //taille du fichier d'entrée f.seekg(0, ios::end); int sizeOfArray = f.tellg(); f.seekg(0, ios::beg); char array[sizeOfArray]; //tableau de la taille du fichier //lecture for (int position = 0; position < sizeOfArray; position++) { char valeur = f.get(); array[position] = valeur; cout << position << " : " << array[position] << endl; } }
|
|
jeudi 21 juin 2007 à 15:35:39 |
Re : passage de valeurs de fonction a fonction

THEwarrior333
|
Tu peux allouer ton tableau array dans la fonction read:
array = new char[sizeOfArray];
Tu le retournes à la fin de read() par return array. Du coup read() a pour type char * un non char.
Dans main: char * main_array = read(file);
Tu peux aussi déclarer ou allouer ton tableau dans main et le passer par référence à read().
|
|
jeudi 21 juin 2007 à 15:50:57 |
Re : passage de valeurs de fonction a fonction

binoua
|
J'ai un plantage au moment de la compilation sur la commande array = new char[sizeOfArray] à savoir que array n'est pas déclaré. Je comprend pas bien étant donné que cette ligne est une déclaration non ?
Pour déclarer mon tableau dans main et le passer à read j'ai un pb : pour déclarer un tableau il faut avoir sa taille. Or ici la taille du tableau est définie dans read. Est-ce que je suis obligé de faire une fonction "taille" séparée ?
|
|
jeudi 21 juin 2007 à 16:24:44 |
Re : passage de valeurs de fonction a fonction

THEwarrior333
|
Non ce nest pas une déclaration mais une allocation.
Tu dois d'abord écrire char * array;
Effectivement, la taille est définie dans read, donc seule la premiere
solution marche à savoir une allocation dans read et main récupère le
pointeur sur le tableau:
main()
{
...
char * array;
array = read(file);
...
}
|
|
jeudi 21 juin 2007 à 16:34:40 |
Re : passage de valeurs de fonction a fonction

darunia
|
THEwarrior333, tu pourrais au moins lui dire que le pointeur renvoyé par la fonction doit etre liberé quand on en a plus besoin, sinon je t'explique pas les fuites mémoires !
Il vaut mieux allouer le tableau de le main et le passer à read, l'appelant doit maitriser la mémoire.
Le problème ici est que la lecture du fichier n'est pas appropriée. Imagine que le fichier passé à read fait 2Go ??? La mémoire explose !
Une meilleure solution est de garder le fichier ouvert et de naviguer à l'interieur selon les besoins ... Enfin tour ça depend de ce que tu veux faire.
D@runia
|
|
jeudi 21 juin 2007 à 16:39:14 |
Re : passage de valeurs de fonction a fonction

binoua
|
A priori je n'aurais pas ces problème de mémoire. Autrement, mon code a cette tête maintenant :
#include <cstdio>
#include <iostream>
#include <fstream>
using namespace std;
char read (ifstream & f);
int main ()
{
ifstream file("test.txt", ios::binary); //flux d'entrée
char * array;
array = read(file);
system ("PAUSE");
return EXIT_SUCCESS;
}
char read (ifstream & f)
{
//taille du fichier d'entrée
f.seekg(0, ios::end);
int sizeOfArray = f.tellg();
f.seekg(0, ios::beg);
//lecture
array = new char[sizeOfArray];
for (int position = 0; position < sizeOfArray; position++)
{
int valeur = f.get();
array[position] = valeur;
cout << position << " : " << array[position] << endl;
}
return array;
}
J'ai 2 erreurs de compilation :
- invalid conversion from 'char' to 'char*' à la ligne array = read(file)
- 'array' undeclared à la ligne array = new char[sizeOfArray]
|
|
jeudi 21 juin 2007 à 16:53:33 |
Re : passage de valeurs de fonction a fonction

THEwarrior333
|
C'est vrai je n'ai pas dit qu'il fallait libérer la mémoire après,
toutes mes excuses J'imaginais que binoua connaissait l'allocation et
que sa question ne concernait que la maniere de passer un tableau en
parametre:
delete [] array dans le main permet de détruire le tableau. N'oublies
pas les [] qui correspondent à la désallocation d'un tableau d'objets
et non d'un seul objet.
Sinon l'allocation peut tres bien se faire dans read, je ne vois pas le
probleme. Il y a des tas de fonctions qui effectuent l'allocation
elles-mêmes et c'est au programmeur de faire gaffe à bien gérer la
mémoire. (cf DirectX par exemple.)
binoua: ta fonction read ne doit plus etre du type char mais char * car elle renvoie un char *.
char * read(ifstream & f);
et tu as oublié encore de déclarer array dans read():
char * array;
array = new char[sizeOfArray]];
|
|
jeudi 21 juin 2007 à 16:57:52 |
Re : passage de valeurs de fonction a fonction

binoua
|
youpi ça marche !!!
Oui en fait je savais pour les histoires de mémoire mais comme vous avez pu le constater, je débute avec les pointeurs !
Encore merci ++
|
|
jeudi 21 juin 2007 à 17:10:45 |
Re : passage de valeurs de fonction a fonction

THEwarrior333
|
De rien.
Une question que je me posais (peut-être le sais-tu Darunia):
est-ce une bonne idée d'effectuer la boucle de remplissage du tableau
avec comme critère d'arrêt la taille du fichier déterminée en début de
fonction?
Car si le fichier est modifié pendant la lecture, ca risque de planter.
Alors que si la boucle est effectuée tant que le curseur n'est pas en
fin de fichier on n'a pas ce problème:
position = 0;
int valeur;
while( f.good() ) {
valeur = f.get() array[position] = valeur; cout << position << " : " << array[position] << endl;
position++; }
|
|
jeudi 21 juin 2007 à 17:16:41 |
Re : passage de valeurs de fonction a fonction

binoua
|
oui ce que tu dis est vrai mais d'un autre côté si il faut rajouter
if (position > taille) {break}
parce que sinon tu risques de rentrer trop de données par rapport à la capacité du tableau. Donc dans un soucis de simplicité je suis partis du principe que le fichier ne serait pas modifié pendant la lecture et j'ai donc fait la boucle que l'on connait.
|
|
Cette discussion est classée dans : fichier, fonction, tableau, char, read
Répondre à ce message
Sujets en rapport avec ce message
tableau [ par zeratul67 ]
J'ai une fonction qui doit me renvoyer un tableau à deux dimensions, mais la taille de l'une des ces 2 dimensions est inconue. (tableau: char cp[x][25
PROBLEME pour retourner un char* a partir d'un fichier [ par kobee12 ]
Voici ma fonction. Elle prend en argument un caractere. A partir de ce caractere, elle renvoie la chaine qui lui est associe.Par exemple:"fichier_lang
PROBLEME pour retourner un char* apres recuperation d'une chaine(sscanf) d'un fichier [ par kobee12 ]
Voici ma fonction. Elle prend en argument un caractere. A partir de ce caractere, elle renvoie la chaine qui lui est associe.Par exemple:"fichier_lang
renvoie d'un tableau en char ds une fonction [ par TheBabyCool ]
Comment peut on renvoyer un tableau de char du type :char i[][] dans une fonction ?Merci
fonction strlen [ par ToToL ]
Voici mon probleme :je voudrai dans un tableau a deux dimetion savoir combien il reste de place dans les colone donc j'ai pensé a la fonction strlen c
REcuperer des donnée d'un fichier binaire vers une tableau de hachage [ par whiteknight ]
Slt j'ai des problemes avec ma fonction load qui me permet de recuperer les données d'un fichier binaire et de les transférer vers un tableau de hacha
fonction char -> bool [ par destroy2k4 ]
salut a tous je suis debutant en programmation et j'ai un petit problemevoila en fait j'ai besoin d'une fonction C qui prend en parametre un tableau d
Fonction *char [ par moustachu ]
Bonjour,Je suis en train de faire évoluer une appli qui a pas de paramétrage à sortir de l'appli. Tout est codé en dir et ça craint assez (ex : strcpy
Lecture d'un fichier et probleme divers [ par lacharlottinne ]
Bonjour , je vous explique vite fait ce que je dois faire : J'ai un fichier texte, dans le quel on doit trier des mots .. la premier étape est => o
manipulation LPCWSTR et char[] [ par ebooserge ]
salut a tous,je suis en train de realiser un petit prog avec directshow et j'ai quelques diffcultées.je dois utiliser une fonction qui prend en parama
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|