begin process at 2012 05 29 15:02:17
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Débutant(e)

 > 

passage de valeurs de fonction a fonction


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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.

1 2

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


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,452 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales