Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[Programmation] Problème en C (résolu)
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index French
View previous topic :: View next topic  
Author Message
Tsukusa
Tux's lil' helper
Tux's lil' helper


Joined: 01 Aug 2004
Posts: 133

PostPosted: Tue Oct 26, 2004 2:09 pm    Post subject: [Programmation] Problème en C (résolu) Reply with quote

Voilà je vous donne toute de suite ma code source:

Code:

#include<stdio.h>
#include<stdlib.h>

typedef struct s_noeud{
   float nombre;
   struct s_noeud* p_suivant;
} Noeud;


void afficher(Noeud *n)
 {
    if(n!=NULL)
   {
      printf("%f %d\n",(*n).nombre,n);
      afficher((*n).p_suivant);
   }
 }

void empiler(Noeud** tete,float info)
{
   Noeud* temp;
   temp=(Noeud*)malloc(sizeof(Noeud));
   //printf("info empilée = %f\n",info);
   temp->nombre=info;
   //printf("info empilée = %f\n",(*temp).nombre);
   temp->p_suivant=(*tete);
   (*tete)=temp;
}

float depiler(Noeud** tete)
{
   Noeud* temp;
   float info;
   
   //printf("FREE AVT\n");
   temp=(*tete);
   info=temp->nombre;
   //printf("info = %f\n",info);
   (*tete)=(*tete)->p_suivant;
   free(temp);
   //printf("FREE APRES\n");
   return info;
}

void main()
{
   Noeud* tete;
   tete=NULL;
   char c;
   int nb_operande=0;
   do
   { 
      //printf("\n\n");afficher(tete);printf("\n\n");
      c='\0';
      scanf("%1s",&c);
      if(c>='0' && c<='9')
      {
             //printf("Premier if\n");
         nb_operande += 1;
         empiler(&tete,(float)(c-'0'));
      }
      else
      {
              //printf("Premier else\n");
         if((c=='+' || c=='-' || c=='*' || c=='/') && nb_operande>=2)
         {
                      //printf("deuxieme if\n");
            float a=0,b=0; //l'erreur est ici
            float resultat=0; //il faut les déclarer en début de fonction en C contrairement au C++ où on a le droit de faire ca
            //printf("depiler A\n");
            a=depiler(&tete);//printf("a=%f\n",a);
            //printf("depiler B\n");
            b=depiler(&tete);//printf("b=%f\n",b);
            //printf("fin depiler \n");
            switch(c){
               case '+':resultat=a+b;
                  break;
               case '-':resultat=a-b;
                  break;
               case '*':resultat=a*b;
                  break;
               case '/':resultat=a/b;
                  break;
            }
            nb_operande -= 1;
            empiler(&tete,resultat);
         }
         else if(c!='=')
         {
                      //printf("deuxieme else\n");
            printf("Saisie incorrecte\n");
         }
      }
      //printf("\n\n");afficher(tete);printf("\n\n");
   }while(c!='=');
   printf("%f",depiler(&tete));
}



Maintenant j'en viens à mon problème. Il faut savoir que ce programme marche sous windows. Maintenant quand je l'exécute sous linux il ne fonctionne pas. J'ai une erreur de segmentation.
Celle-ci se situe au niveau d'un pointeur qui se "transforme". Ce que je veux dire c'est qu'un adresse au lieu d'être l'adresse voulue est cette adresse voulue + 12. Forcément après j'ai un problème puisque que je vais essayer d'accéder à une zone mémoire qui n'existe pas. Maintenant je ne comprend pas pourquoi j'ai ce problème puisque que mon code à l'air bon.

PS: les zones commentées dans le texte sont mes affichages de test pour situer l'erreur.


Last edited by Tsukusa on Tue Oct 26, 2004 5:15 pm; edited 1 time in total
Back to top
View user's profile Send private message
Tsukusa
Tux's lil' helper
Tux's lil' helper


Joined: 01 Aug 2004
Posts: 133

PostPosted: Tue Oct 26, 2004 4:55 pm    Post subject: Reply with quote

Personne n'a d'idée sur le pourquoi mes pointeurs déraillent? C'est pas que j'ai envie de développer sur Visual studio mais ... En fait si je n'ai pas envie de développer sur Visual Studio.

Il y a des jours comme ca ....
Back to top
View user's profile Send private message
Trevoke
Advocate
Advocate


Joined: 04 Sep 2004
Posts: 4099
Location: NY, NY

PostPosted: Tue Oct 26, 2004 4:59 pm    Post subject: Reply with quote

J'ai un peu beaucoup oublie le C, mais .. Pourquoi tu as
oid empiler(Noeud** tete,float info)

avec deux * ?
_________________
Votre moment detente
What is the nature of conflict?
Back to top
View user's profile Send private message
Tsukusa
Tux's lil' helper
Tux's lil' helper


Joined: 01 Aug 2004
Posts: 133

PostPosted: Tue Oct 26, 2004 5:14 pm    Post subject: Reply with quote

Trevoke wrote:
J'ai un peu beaucoup oublie le C, mais .. Pourquoi tu as
oid empiler(Noeud** tete,float info)

avec deux * ?


Mon programme est une calculette polonise et fonctionne grâce à une pile. En gros j'ai besoin de pouvoir modifier mon pointeur de tête de listes.

Sinon j'ai enfin trouvé mon erreur.

Je fais une déclaration de variables dans une boucle si, ce n'est pas bon. On remet la déclaration au début et cela fonctionne (en C++ cela doit marcher par contre ...).

Bon un piège a éviter. La bonne nouvelle c'est que: PAS DE VISUAL STUDIO .NET youpiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii

bon là je ne sais pas si je dois mais je sors :arrow:
Back to top
View user's profile Send private message
kernelsensei
Bodhisattva
Bodhisattva


Joined: 22 Feb 2004
Posts: 5619
Location: Woustviller/Moselle/FRANCE (49.07°N;7.02°E)

PostPosted: Tue Oct 26, 2004 5:15 pm    Post subject: Reply with quote

Trevoke wrote:
J'ai un peu beaucoup oublie le C, mais .. Pourquoi tu as
oid empiler(Noeud** tete,float info)

avec deux * ?


c'est equivalent a un tableau de pointeurs il me semble !
_________________
$ ruby -e'puts " .:@BFegiklnorst".unpack("x4ax7aaX6ax5aX15ax4aax6aaX7ax2aX5aX8 \
axaX3ax8aX4ax6aX3aX6ax3ax3aX9ax4ax2aX9axaX6ax3aX2ax4ax3aX4aXaX12ax10aaX7a").join'
Back to top
View user's profile Send private message
fafounet
l33t
l33t


Joined: 03 Apr 2004
Posts: 703
Location: Meuves, France

PostPosted: Tue Oct 26, 2004 5:18 pm    Post subject: Reply with quote

En effet les déclarations de variable sont à faire au tout début de chaque fonction sinon caca boudin. Bizzare que tu n'es pas eu de msg explicite
_________________
Prout ?
Back to top
View user's profile Send private message
Tsukusa
Tux's lil' helper
Tux's lil' helper


Joined: 01 Aug 2004
Posts: 133

PostPosted: Tue Oct 26, 2004 5:21 pm    Post subject: Reply with quote

kernel_sensei wrote:
c'est equivalent a un tableau de pointeurs il me semble !


Dans la déclaration seulement ...
Après avoir déclarer un tableau de pointeur on doit allouer la mémoire style

Code:

int** p_tab;
int i,nb_ligne,nb_colonne;
p_tab=(int**)malloc(nb_ligne*sizeof(int*));
for(i=0;i<nb_ligne;i++){
          p_tab[i]=(int*)malloc(nb_colonne*sizeof(int));
}
Back to top
View user's profile Send private message
Trevoke
Advocate
Advocate


Joined: 04 Sep 2004
Posts: 4099
Location: NY, NY

PostPosted: Tue Oct 26, 2004 6:16 pm    Post subject: Reply with quote

Comment c'est prise de tetes le langage de programmeurs en francais .... :)
_________________
Votre moment detente
What is the nature of conflict?
Back to top
View user's profile Send private message
Sleeper
l33t
l33t


Joined: 12 Nov 2002
Posts: 667

PostPosted: Tue Oct 26, 2004 6:43 pm    Post subject: Reply with quote

Tsukusa wrote:

Code:

int** p_tab;
int i,nb_ligne,nb_colonne;
p_tab=(int**)malloc(nb_ligne*sizeof(int*));
for(i=0;i<nb_ligne;i++){
          p_tab[i]=(int*)malloc(nb_colonne*sizeof(int));
}


Tu peux aussi eviter d'enquiller les appels a malloc et n'allouer qu'une fois un gros bloc, et ensuite repointer dedans .. Ca permet de n'avoir aussi a faire qu'un seul free ...
Back to top
View user's profile Send private message
dju`
Retired Dev
Retired Dev


Joined: 11 Feb 2003
Posts: 370

PostPosted: Wed Oct 27, 2004 8:38 am    Post subject: Reply with quote

Sleeper wrote:
Tu peux aussi eviter d'enquiller les appels a malloc et n'allouer qu'une fois un gros bloc, et ensuite repointer dedans .. Ca permet de n'avoir aussi a faire qu'un seul free ...


oui, c'est quand même plus simple :)
Back to top
View user's profile Send private message
Tsukusa
Tux's lil' helper
Tux's lil' helper


Joined: 01 Aug 2004
Posts: 133

PostPosted: Wed Oct 27, 2004 11:16 am    Post subject: Reply with quote

J'aime bien la difficulté moi ... :oops:

entre nous le C c'est bien pour faire de la programmation système mais sinon il y a mieux tout de même .... :roll:
Back to top
View user's profile Send private message
Sleeper
l33t
l33t


Joined: 12 Nov 2002
Posts: 667

PostPosted: Wed Oct 27, 2004 11:45 am    Post subject: Reply with quote

Tsukusa wrote:
J'aime bien la difficulté moi ... :oops:


C'est pas qu'une question de difficulte .. si ton code est execute en boucle ca va etre moins "efficient" q'un seul malloc, et un set des pointers associes ...

Quote:
entre nous le C c'est bien pour faire de la programmation système mais sinon il y a mieux tout de même .... :roll:


Tout a fait d'accord ... Ruby rulezzzz ;)
Back to top
View user's profile Send private message
scout
Veteran
Veteran


Joined: 08 Mar 2003
Posts: 1991
Location: France, Paris en Semaine / Metz le W-E

PostPosted: Wed Oct 27, 2004 11:52 am    Post subject: Reply with quote

Sleeper wrote:
Tout a fait d'accord ... Ruby rulezzzz ;)

+1
Merci infiniment Sleeper d'avoir parlé de ruby dans le thread su perl ou python ... çela m'a convaincu d'apprendre et maintenant je suis devenu un méga fan moi aussi ! Ce langage est excellentissime. Je suis en train d'écrire une sorte de gentoolkit avec pour me faire la main. Pour l'instant j'ai fait comme un emerge search (mais nettement plus rapide). Des que le tout est prêt je le posterait.
_________________
http://petition.eurolinux.org/ - Petition against ePatents
L'essence de la finesse
Back to top
View user's profile Send private message
Sleeper
l33t
l33t


Joined: 12 Nov 2002
Posts: 667

PostPosted: Wed Oct 27, 2004 12:38 pm    Post subject: Reply with quote

scout wrote:

+1
Merci infiniment Sleeper d'avoir parlé de ruby dans le thread su perl ou python ... çela m'a convaincu d'apprendre et maintenant je suis devenu un méga fan moi aussi ! Ce langage est excellentissime. Je suis en train d'écrire une sorte de gentoolkit avec pour me faire la main. Pour l'instant j'ai fait comme un emerge search (mais nettement plus rapide). Des que le tout est prêt je le posterait.


De rien .. je serais assez interesse par ton code .. J'aime bien regarder le code des autres, ca permet d'avoir de nouvelles idees :)
Pour le moment j'ai pas commis (en fait diffuse) grand chose en Ruby a part ce petit truc ... Mais par contre au boulot, j'y vais a donf .. je noyaute jusqu'a ce que Ruby soit officiellement adopte (pour le moment c'est plutot : "Y'a que toi qui connait" meme si ce n'est pas vrai.. mais apres avoir fait 2 versions du meme programme l'une en Perl et l'autre en Ruby, certains sont restes sur le cul ..)
Back to top
View user's profile Send private message
kwenspc
Advocate
Advocate


Joined: 21 Sep 2003
Posts: 4954

PostPosted: Wed Oct 27, 2004 1:15 pm    Post subject: Reply with quote

Ce qui est bien avec Perl c'est que c'est très complet en modules et il y a un très bon echange de code entre les programmeurs Perl. C'est en effet assez facile de trouver un exemple, un module qu'on va pouvoir utiliser, etc...
la communauté perl est vraiment motivante.

qu'en est il de ruby?

autre chopse encore, je suis d'accord sur le point que perl peut très vite devenir "brouillon" si on se fait pas violence pour adopter une disciplibne très strict. Là dessus, à ce que j'ai pu voir, ruby est plus propre. Et entre ruby et python à ce sujet lequel est plus "propre"?
Back to top
View user's profile Send private message
Sleeper
l33t
l33t


Joined: 12 Nov 2002
Posts: 667

PostPosted: Wed Oct 27, 2004 3:07 pm    Post subject: Reply with quote

kwenspc wrote:
Ce qui est bien avec Perl c'est que c'est très complet en modules et il y a un très bon echange de code entre les programmeurs Perl. C'est en effet assez facile de trouver un exemple, un module qu'on va pouvoir utiliser, etc...
la communauté perl est vraiment motivante.

qu'en est il de ruby?

autre chopse encore, je suis d'accord sur le point que perl peut très vite devenir "brouillon" si on se fait pas violence pour adopter une disciplibne très strict. Là dessus, à ce que j'ai pu voir, ruby est plus propre. Et entre ruby et python à ce sujet lequel est plus "propre"?


Je suis "oblige" (pour le moment ;) de faire du Perl... Bien que je trouve ce langage tres sympa pour les petits scripts, je trouve qu'il passe difficilement a l'echelle pour les projets un peu plus fournis .. Je dis ca mais je dois en faire depuis 1997, donc ca commence a faire un paquet de projet "un peu plus fournis" ...

Neanmoins meme en se faisant violence c'est pas excessivement propre .. et je ne parles meme pas d'un prog OO, ou la c'est le cauchemard ...


Certes de nobreux packages existent sur CPAN .. Pour Ruby, beaucoup de package existent dans la distrib par defaut, comme:

  • cgi (devine a quoi il sert ;)
  • complex
  • base64
  • drb (distributed ruby: une machine exporte un/des objets, d'autres machines les utilisent)
  • erb (template, un peu equivalent a JSP pour ce que j'en connais)
  • expect (pour faire comme Expect ou Perl::Expect)
  • tous les "petits" trucs reseaux (Net::FTP/ Net::HTTP) ...
  • rss (gestion/creation de flux RSS)
  • shell (session shell like)
  • threading
  • tk
  • webrick (un serveur http)
  • xmlrpc
  • wsdl
  • yaml (un langage de description de donnees pour langages "agiles", beaucoup plus leger que XML)
  • ...

Ensuite tu peux recuperer des packages sur l'equivalent du CPAN .. Tu les installes soit a la main, soit grace a Gem, soit grace a rpa. Y'a beaucoup de truc sympas (genre Net:SSH) ...

Maintenant, quant a le comparer a Python, ca va partir en flame war ... Bien que je pense que Python a l'air tres bien, je n'ai jamais reussi a m'y faire .. Je n'aime pas cette idee de block "introduit" par l'indentation, de meme que je ne comprends pas pourquoi chaque methode d'un objet doit commencer par self .. Je sais que c'est explique dans la FAQ, mais je trouve les explications un peu .. tirees par les cheveux ...

Pour moi le choix est fait: j'essaie de faire le max. de chose avec Ruby. Mon systeme de redirection de mail s'appuie maintenant sur gurgitate-mail, qui me permet d'ecrire mes regles de redicrection en Ruby, mon systeme anti-spam, utilise bogofilter + un script en Ruby, qui se charge de donner tous les mails marques comme spam effectif a bogofilter (pour son apprentissage), de meme que tous les faux-positifs (idem), mon blog est genere par un hobix, mon fichiers TODO sont geres par mon script Ruby .. etc ...

Finalement je n'utilise Python que pour Portage ;) quoique si je passais a RubyX ...

Encore une fois c'est pas un troll, chacun fait ce qui lui plait, et Perl et Python sont indeniablement de bons langages .. apres les gouts et les couleurs ...


Last edited by Sleeper on Wed Oct 27, 2004 3:34 pm; edited 1 time in total
Back to top
View user's profile Send private message
sireyessire
Advocate
Advocate


Joined: 20 Mar 2003
Posts: 2991
Location: back in Paris, France

PostPosted: Wed Oct 27, 2004 3:26 pm    Post subject: Reply with quote

Sleeper wrote:

Finalement je n'utilise Python que pour Portage ;) quoique si je passais a RubyX ...

Encore une fois c'est pas un troll, chacun fait ce qui lui plait, et Perl et Python sont indeniablement de bons langages .. apres les gouts et les couleurs ...

il manque un t dans ton lien:
RubyX doit être mieux :wink:
_________________
I never think of the future. It comes soon enough.
Albert Einstein

Try simpler first
Shockley
Back to top
View user's profile Send private message
Sleeper
l33t
l33t


Joined: 12 Nov 2002
Posts: 667

PostPosted: Wed Oct 27, 2004 3:35 pm    Post subject: Reply with quote

sireyessire wrote:
il manque un t dans ton lien:
RubyX doit être mieux :wink:


Oups .. merci .. corrige.
Back to top
View user's profile Send private message
kwenspc
Advocate
Advocate


Joined: 21 Sep 2003
Posts: 4954

PostPosted: Wed Oct 27, 2004 5:51 pm    Post subject: Reply with quote

Eh bien!
je suis conquis! :)

je vais essayer ce langage dès que j'en aurais fini avec mon projet en Perl. (qui d'ailleurs n'est pas codé du tout en orienté objet)
Back to top
View user's profile Send private message
Sleeper
l33t
l33t


Joined: 12 Nov 2002
Posts: 667

PostPosted: Thu Oct 28, 2004 6:21 am    Post subject: Reply with quote

kwenspc wrote:
Eh bien!
je suis conquis! :)

je vais essayer ce langage dès que j'en aurais fini avec mon projet en Perl. (qui d'ailleurs n'est pas codé du tout en orienté objet)


:)

Je te donne qq liens:

  • Why's (poignant) guide to Ruby : decale et genial ..
  • Programming Ruby : la version online du livre (existe aussi en tarball).. A noter: la 2nde edition est en vente depuis 1 mois (pas de version online) .. et semble extraordinaire (j'attends ma commande :) [url=http://www.pragmaticprogrammer.com/titles/ruby/index.html Programming Ruby (2nd. Ed.)[/url]
  • ruby-doc pour la doc sur le langage et les librairies standards (que tu peux avoir en ligne de commande grace a ri)
  • ruby wiki Ben le wiki
  • Ruby FAQ .. ecrite en Ruby


Voilou:)
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index French All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum