Conversion simple C++ => C

Résolu/Fermé
Berbère - 26 avril 2010 à 16:09
Kuku007 Messages postés 183 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 7 septembre 2011 - 26 avril 2010 à 17:41
Bonjour,

Je souhaiterai utiliser un équivalent de la fonction new (utilisé en C++) afin de gérer une liste de structure en C, mais j'ai un peu de mal avec la conversion...

Il me suffit de remplacer les "nouveau=new TPersonne();" par des "nouveau=(TPersonne*)malloc(1*sizeof(TPersonne));"?

J'ai placé l'intégralité de la procédure pour plus de lisibilité, mis à part l'allocation mémoire tout est ok...

//Déclaration du pointeur "debut" de type TPersonne en tant que variable globale
TPersonne *debut;

//Procedure de recuperation des donnees contenues dans le fichier texte
/*TPersonne* */
void recupFileData()
{
	//Declaration des variables

	int x;

	TPersonne *TContact = new TPersonne();
	TPersonne *courant;
	TPersonne *nouveau;

	//Lecture du fichier texte
	ifstream fichlec("repertoire.txt");	//Ouverture du fichier en lecture

	fichlec.seekg( -1, ios_base::end );		//Place le curseur à la fin du fichier texte
	x=fichlec.tellg();				//Sauvegarde le nombre de caracteres presents
	fichlec.seekg( 0, ios_base::beg );		//Place le curseur au debut du fichier texte
	
        if(fichlec)	//Si l'ouverture à réussi
        {       
		if(x==0)	//Si le fichier est vide
		{
			cout<<"\n\n"<<"Aucun element recupere: fichier vide!"<<endl;
		}
		else	//Sinon
		{
			fichlec>>TContact->nom>>TContact->prenom>>TContact->tel>>TContact->dateNaiss;	//Récupération des données
			debut=TContact;					//Récupération de l'adresse de stockage du premier contact
			x=1;						//Nombre de données récupérées

			nouveau=new TPersonne();			//Création d'un nouvel emplacement pour le pointeur "nouveau" de type TPersonne
			fichlec>>nouveau->nom>>nouveau->prenom>>nouveau->tel>>nouveau->dateNaiss;	//Récupération des données
			(*debut).suivant=nouveau;

			while (!fichlec.eof())	//Tant que le fichier n'est pas terminé
			{
				courant=nouveau;			//Libération du pointeur "nouveau" et sauvegarde dans "courant"
				x=x+1;					//Incrémentation du nombre de données récupérées

				nouveau=new TPersonne();							//Création d'un nouvel emplacement
				fichlec>>nouveau->nom>>nouveau->prenom>>nouveau->tel>>nouveau->dateNaiss;	//Récupération des données
				(*courant).suivant=nouveau;							//Ajout de "nouveau" à la suite de "courant"

			}

			fichlec.close();	//Fermeture du fichier

			if (x==1) cout<<"\n\n"<<x<<" element recupere!"<<"\n\n";	//Affichage si un element est recupere
			else cout<<"\n\n"<<x<<" elements recuperes!"<<"\n\n";		//Affichage si plusieurs elements sont recuperes

       		}
	}	
        else cout<<"Impossible d'ouvrir le fichier !"<<endl;
}


A voir également:

6 réponses

Kuku007 Messages postés 183 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 7 septembre 2011 23
26 avril 2010 à 16:11
Oula non !
Les 2 langages n'ont rien à voir !!!
Le C++ est un langage objet et le langage C un langage de "bas niveau".
De plus C inclut dans C++ mais pas réciproquement !
0
Neliel Messages postés 6146 Date d'inscription jeudi 9 juillet 2009 Statut Contributeur Dernière intervention 20 mars 2017 1 688
26 avril 2010 à 16:17
Bonjour,

A mon avis, c'est tout le programme qui est à revoir si tu espère le convertir en C... si j'ai bien compris ta requête.
Déjà tu dois virer tous les objets... a la rigueur les transformer en structure pour ceux que tu peux.
Ensuite la technique pour ouvrir/lire/écrire dans un fichier en C est différente qu'en C++ puisque dans ce dernier, on utilise des méthodes et non des fonctions.

Après, il y a les cout à remplacé par des printf (bon ça à la rigueur, ça va)

Donc tu dois bien modifier 95% de ce code pour qu'il soit compatible avec la norme du langage C.
0
Merci de ta réponse,

Je sais que les deux sont bien différents, mais tout ce qui est faisable en C++ est faisable en C normalement :p

Je cherche simplement a allouer de la mémoire pour ma variable de type structure sans passer par la programmation objet!
0
Neliel Messages postés 6146 Date d'inscription jeudi 9 juillet 2009 Statut Contributeur Dernière intervention 20 mars 2017 1 688
26 avril 2010 à 16:18
Non... Tout ce qui est faisable en C est faisable en C++, pas l'inverse!

En C: pas d'objet! Or ton programme en use massivement!
0
Kuku007 Messages postés 183 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 7 septembre 2011 23
26 avril 2010 à 16:21
"mais tout ce qui est faisable en C++ est faisable en C normalement :p "

A ce niveau là on pourrait même dire que n'importe quel langage peut en implémenter un autre !
Par exemple avec de l'assembleur je peux te faire ce que ta fonction C++ fait !
Simplement tu galères au point de te suicider !

Comme je l'ai dis, le C est viable dans du C++, en d'autres termes tu peux faire du C avec du C++ (ce qui est bien évidemment pas très utile). En revanche il n'est pas possible de faire du C++ dans du C
0
Kuku007 Messages postés 183 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 7 septembre 2011 23
26 avril 2010 à 16:18
Normalement tout tes appels de méthodes type fichlec.close() ne sont pas valides en C.

La fonction système de la librairie C standard est fclose() par exemple.
Il en va de même pour tes appels à "seekg()", je ne sais même pas si cette fonction existe dans la librairie C, cela m'étonnerait même. Il te faudra très certainement développer une implémentation de cette fonction.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
J'ai déjà réglé les autres problèmes en utilisant les librairies standard (seek => fseek, fclose, printf et autres...)

Le code que j'ai écrit dans mon premier message est une partie d'un vieil exercice en C++, il est présent seulement pour expliquer ce que je souhaite faire étant donné que la partie correspondante de mon nouveau programme en c (qui ici insère dans une liste à rupture le contenu d'un fichier texte préalablement rempli par ce même programme)

//Définition de la sous-structure TTable
typedef struct _TTable {
	int num;
	int reservation_O_N;
	struct _TTable *suivant;
} TTable;

//Définition de la structure TPlace
typedef struct _TPlace {
	int places;
	struct _TPlace *suivant;
	TTable *ssliste;
} TPlace;


Je souhaite seulement utiliser des malloc pour allouer proprement de la mémoire pour les éléments de ma liste chainée, il n'y a pas d'objet ici.

Un simple remplacement de mes new() par des malloc suffit dans ce cas?
0
Kuku007 Messages postés 183 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 7 septembre 2011 23
26 avril 2010 à 17:08
Je dirais que oui si toutes les fonctions ont effectivement été remplacées.
Alors il ne resterait plus en gros qu'à changer la création de tes objets en effet.

Ensuite en C le type du pointeur on s'en tamponne complet (héhé j'adore cette expression) du coup ta ligne se traduirait par :
nouveau=malloc(1*sizeof(TPersonne));

Ensuite et c'est là que je ne suis pas certain, je ne sais pas si le compilateur calculera la taille en octets nécessaire pour allouer l'espace à ta structure.
En somme il faudra que tu essayes pour voir quelle taille est allouée à ton appel malloc sauf si quelqu'un sait répondre à cette question ;-)

Autrement dit pour la structure TPlace un truc du genre:
nouveau = malloc(3 * sizeof(int)) puisqu'un pointeur devrait être stocké en 32 bits comme les int.

Par contre je me suis toujours demandé si en 64 bits les int étaient codées en 64 ? Je ne pense pas puisque cela doit être à la charge du compilateur qui ne doit pas faire la différence.
0
Neliel Messages postés 6146 Date d'inscription jeudi 9 juillet 2009 Statut Contributeur Dernière intervention 20 mars 2017 1 688
26 avril 2010 à 17:10
Remplace aussi l'entête... tu as dû mettre iostream... en C, c'est stdio.h.
Remplace tout tes cout par des printf... en C, cout n'existe pas.
Déclare TOUTES tes variables, TOUTES tes structures, TOUTES tes constantes en début de programme ou de fonction... en C, les déclaration en plein milieu d'un programme n'est pas supporté.
0
Ok, c'est noté !

Merci beaucoup à vous deux pour vos réponses! J'avais déjà fait les autres modifications Neliel j'ai quand même des connaissances en C, c'est surtout l'allocation qui me posait problème :s

Sinon pour la taille d'un int il me semble que c'est 2 octets, quel que soit le compilateur et la taille du registre du processeur, mais pas sûr à 100% :p

Bonne fin de journée !
0
Kuku007 Messages postés 183 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 7 septembre 2011 23
26 avril 2010 à 17:41
Non, les int peuvent être codés sur 32 bits sur des processeurs 32b, d'ailleurs généralement le cas me semble-t-il.
0