PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Autres forums > Forum Programmation & Conception > fr.comp.lang.c++ > Difference entre C et C++ à l'exécution
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
Difference entre C et C++ à l'exécution

Réponse
 
LinkBack Outils de la discussion
Vieux 10/04/2008, 21h55   #1 (permalink)
David Fleury
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Difference entre C et C++ à l'exécution

Bonjour,
voici un programme

Si je le compile en C ou en C++, je n'obtiens pas le même
résultat. En C++ fonctionne comme attendu, en C, j'ai un seg fault
(runtime error)
Voyez-vous une raison ?
Cordialement,
David


#include <stdio.h>

int Max( int i, int j ) { return ( i > j ? i : j ); }
int Min( int i, int j ) { return ( i < j ? i : j ); }

int CycleLength( int n ) {
int cycleLength = 1;
while ( n != 1 ) {
if ( n &0x01 ) n = 3*n + 1;
else n >>= 1;
++cycleLength;
}
return cycleLength;
}

int maxCycle( int i, int j ){
int max = CycleLength( i++ );
for( ;i <= j; ++i )
max = Max( max, CycleLength( i ) );
return max;
}

int main()
{
int i, j;
while( fscanf(stdin, "%d %d\n", &i, &j ) == 2 )
fprintf(stdout, "%d %d %d\n", i, j ,
maxCycle( Min(i,j), Max(i,j) ));
}
  Réponse avec citation
Vieux 10/04/2008, 22h20   #2 (permalink)
Fabien LE LEZ
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Difference entre C et C++ à l'exécution

On Thu, 10 Apr 2008 22:55:08 +0200, David Fleury
<dfleury2@libertysurf.fr>:

>Si je le compile en C ou en C++, je n'obtiens pas le même
>résultat. En C++ fonctionne comme attendu, en C, j'ai un seg fault
>(runtime error)


Je n'arrive pas à trouver de problème dans le code. Quel compilateur
utilises-tu, et quelles options de compilation ?

> int max = CycleLength( i++ );


En théorie, max() est bien une fonction, et ça ne pose pas de
problème. Mais en pratique, il arrive que ce soit une macro, aussi je
déconseille de donner ce nom à une variable.

J'ai pour habitude d'appeler "reponse" la variable renvoyée par une
fonction :

int f()
{
int reponse= 3;
reponse+= 39;
return reponse;
}

  Réponse avec citation
Vieux 11/04/2008, 07h32   #3 (permalink)
David Fleury
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Difference entre C et C++ à l'exécution

Fabien LE LEZ a écrit :
> On Thu, 10 Apr 2008 22:55:08 +0200, David Fleury
> <dfleury2@libertysurf.fr>:
>
>> Si je le compile en C ou en C++, je n'obtiens pas le même
>> résultat. En C++ fonctionne comme attendu, en C, j'ai un seg fault
>> (runtime error)

>
> Je n'arrive pas à trouver de problème dans le code. Quel compilateur
> utilises-tu, et quelles options de compilation ?
>


gcc 4.1.2 -lm -lcrypt -O2 -pipe -ansi
et
g+++ -lm -lcrypt -O2 -pipe

en fait, ce code est censé répondre à un des problèmes d'un site
de problème d'algo. Pour le moment, je ne leur ai pas demandé
de regarder de leur côté. Je voulais d'abord un avis extérieur
n'ayant rien trouvé à redire de mon côté sur un programme aussi simple.

>> int max = CycleLength( i++ );

>
> En théorie, max() est bien une fonction, et ça ne pose pas de
> problème. Mais en pratique, il arrive que ce soit une macro, aussi je
> déconseille de donner ce nom à une variable.


oui, en effet, le nom est mal venu ici


> J'ai pour habitude d'appeler "reponse" la variable renvoyée par une
> fonction :
>
> int f()
> {
> int reponse= 3;
> reponse+= 39;
> return reponse;
> }
>

  Réponse avec citation
Vieux 11/04/2008, 07h51   #4 (permalink)
Marc Espie
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Difference entre C et C++ à l'exécution

In article <47ff05e8$0$746$426a74cc@news.free.fr>,
David Fleury <dfleury2@libertysurf.fr> wrote:
>Fabien LE LEZ a écrit :
>> On Thu, 10 Apr 2008 22:55:08 +0200, David Fleury
>> <dfleury2@libertysurf.fr>:
>>
>>> Si je le compile en C ou en C++, je n'obtiens pas le même
>>> résultat. En C++ fonctionne comme attendu, en C, j'ai un seg fault
>>> (runtime error)

>>
>> Je n'arrive pas à trouver de problème dans le code. Quel compilateur
>> utilises-tu, et quelles options de compilation ?
>>

>
>gcc 4.1.2 -lm -lcrypt -O2 -pipe -ansi
>et
>g+++ -lm -lcrypt -O2 -pipe
>
>en fait, ce code est censé répondre à un des problèmes d'un site
>de problème d'algo. Pour le moment, je ne leur ai pas demandé
>de regarder de leur côté. Je voulais d'abord un avis extérieur
>n'ayant rien trouvé à redire de mon côté sur un programme aussi simple.


Juste pour info, ca n'est pas un vrai `probleme d'algo'. La recurrence
indiquee s'appelle la `conjecture de Syracuse', et personne n'a jamais
reussi a la prouver.

La conjecture pose la recurrence suivante partant de u_0:

si u_n est pair, u_n+1 = u_n / 2
si u_n est impair, u_n+1 = u_n * 3 + 1

et postule que la suite u_n finit toujours par rejoindre
4 2 1 4 2 1 4 2 1 ...

ca a ete verifie experimentalement jusqu'a des valeurs tres importantes,
mais aucune preuve n'en est jamais sorti.

Classer les entiers selon le nombre d'etapes necessaires pour rejoindre
4 2 1 ... peut sembler une bonne premiere etape. A ma connaissance, on n'a
vraiment tres peu de renseignements la-dessus.
  Réponse avec citation
Vieux 11/04/2008, 09h41   #5 (permalink)
Pascal J. Bourguignon
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Difference entre C et C++ à l'exécution

David Fleury <dfleury2@libertysurf.fr> writes:

> Bonjour,
> voici un programme
>
> Si je le compile en C ou en C++, je n'obtiens pas le même
> résultat. En C++ fonctionne comme attendu, en C, j'ai un seg fault
> (runtime error)
> Voyez-vous une raison ?
> Cordialement,
> David
> [...]
> if ( n &0x01 ) n = 3*n + 1;
> [...]


Tu rêves mon gars, c'est pas du lisp!

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

int Max( int i, int j ) { return ( i > j ? i : j ); }
int Min( int i, int j ) { return ( i < j ? i : j ); }

int CycleLength( int n ) {
int original=n;
int cycleLength = 1;
while ( n != 1 ) {
if ( n &0x01 ){
if(n<((INT_MAX-1)/3)){
n = 3*n + 1;
}else{
fprintf(stderr,"Arithemtic overflow on %d\n",original);
exit(1);
}
}else{
n >>= 1;
}
++cycleLength;
}
return cycleLength;
}

int maxCycle( int i, int j ){
int max = CycleLength( i++ );
for( ;i <= j; ++i )
max = Max( max, CycleLength( i ) );
return max;
}

int main()
{
int i, j;
while( fscanf(stdin, "%d %d\n", &i, &j ) == 2 )
fprintf(stdout, "%d %d %d\n", i, j ,
maxCycle( Min(i,j), Max(i,j) ));
}

------------------------------------------------------------------------
Ce qui donne, en 32-bit:
echo 1 10000000|./syracuse-c
Arithemtic overflow on 113383


--
__Pascal Bourguignon__
  Réponse avec citation
Vieux 11/04/2008, 12h34   #6 (permalink)
Fabien LE LEZ
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Difference entre C et C++ à l'exécution

On Fri, 11 Apr 2008 10:41:55 +0200, pjb@informatimago.com (Pascal J.
Bourguignon):

>Ce qui donne, en 32-bit:
>echo 1 10000000|./syracuse-c
>Arithemtic overflow on 113383


Arf, effectivement, je n'y avais même pas pensé.
Par contre, je ne comprends pas pourquoi le programme plante. n*3+1
devrait donner une valeur (éventuellement fausse au sens arithmétique)
pour tout n, sans plantage, non ?

  Réponse avec citation
Vieux 11/04/2008, 13h01   #7 (permalink)
Mickaël Wolff
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Difference entre C et C++ à l'exécution

Fabien LE LEZ a écrit :
> Par contre, je ne comprends pas pourquoi le programme plante. n*3+1
> devrait donner une valeur (éventuellement fausse au sens arithmétique)
> pour tout n, sans plantage, non ?


Ce n'est pas pour rien que le compilateur et la plate-forme cible
t'ont été demandé(es ?).

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
  Réponse avec citation
Vieux 11/04/2008, 13h18   #8 (permalink)
Pascal J. Bourguignon
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Difference entre C et C++ à l'exécution

Fabien LE LEZ <gramster@gramster.com> writes:

> On Fri, 11 Apr 2008 10:41:55 +0200, pjb@informatimago.com (Pascal J.
> Bourguignon):
>
>>Ce qui donne, en 32-bit:
>>echo 1 10000000|./syracuse-c
>>Arithemtic overflow on 113383

>
> Arf, effectivement, je n'y avais même pas pensé.
> Par contre, je ne comprends pas pourquoi le programme plante. n*3+1
> devrait donner une valeur (éventuellement fausse au sens arithmétique)
> pour tout n, sans plantage, non ?


Non, les débordement peuvent produire n'importe quel résultat, comme
le déclanchement de la quatrième guerre mondiale, ou la sortie de
démons nasaux. En clair, chaque compilateur fait ce qu'il veut.

--
__Pascal Bourguignon__
  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 03h59.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 0,14465 seconds with 16 queries