OVH Cloud OVH Cloud

cout

10 réponses
Avatar
Québec
Bonjour,

Si j'appelle cette fonction, elle n'affiche pas la ligne vers sdout.
void set(int n)
{
std::cout<< "in set " << (bits[n >> 3] |= 1 << (n & 7)) << std::endl;
bits[n >> 3] |= 1 << (n & 7);
}

10 réponses

Avatar
Laurent DELEPINE
Québec wrote:
Bonjour,

Si j'appelle cette fonction, elle n'affiche pas la ligne vers sdout.
void set(int n)
{
std::cout<< "in set " << (bits[n >> 3] |= 1 << (n & 7)) << std::endl;
bits[n >> 3] |= 1 << (n & 7);
}


Chez moi si. Peut etre un probleme avec ton shell unix.


A+

LD

Avatar
Alexandre
"Québec" a écrit dans le message de
news:WnSzb.35898$
Bonjour,

Si j'appelle cette fonction, elle n'affiche pas la ligne vers sdout.
void set(int n)
{
std::cout<< "in set " << (bits[n >> 3] |= 1 << (n & 7)) << std::endl;
bits[n >> 3] |= 1 << (n & 7);
}

Tu devrais avoir une ligne encore plus compacte, la lecture en serait encore

plus difficile ;-)
Enfin, chez moi la ligne affiche quelque chose... c'est quoi ton
compilo/système ?

Avatar
Québec
J'oubliais. int main est en dehorsde la classe.

Borland C++ Builder 5
Avatar
Le Géant Vert
"Québec" a écrit dans le message de news:
lhlAb.77976$
J'oubliais. int main est en dehorsde la classe.

Borland C++ Builder 5




es tu sûr que dans ton cas stdout est bien dirigé vers la sortie écran
console ?

Avatar
James Kanze
"Québec" writes:

|> Si j'appelle cette fonction, elle n'affiche pas la ligne vers sdout.

|> void set(int n)
|> {
|> std::cout<< "in set " << (bits[n >> 3] |= 1 << (n & 7)) << std::endl;
|> bits[n >> 3] |= 1 << (n & 7);
|> }

C'est quoi, bits ? Sans savoir le type de bits, impossible à savoir
le type de ton expression (qui est, en passant, un merveilleux exemple
de l'offuscation). Dans savoir le type de l'expression, c'est impossible
à savoir même s'il doit afficher quelque chose.

Mais j'imagine que le problème est ailleurs.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
Québec
À l'écran:
2
3
4
5
7

4 primes
0 milliseconds

0--test
10010101100--set
00010101100--reset
1 in test (n-1)/8 + 1 = 2

es tu sûr que dans ton cas stdout est bien dirigé vers la sortie écran
console ?

Oui.
Mais j'imagine que le problème est ailleurs.


-------------------- snip -------------------
#include <iostream.h>
#include <conio.h>
#include <ctime.h>
#ifndef AVOID_STANDARD_BITSET
#include <bitset.h>
#else
template<int N>

class bitset
{

using std::cout;
using std::endl;
public:
bitset() : bits(new char[(N - 1) / 8 + 1]) {}

bool test(int n)
{
return (bits[n >> 3] & (1 << (n & 7))) != 0 );
}

void set(int n){
cout << "yes?";
bits[n >> 3] |= 1 << (n & 7);
}

void reset(int n)
{
bits[n >> 3] &= ~(1 << (n & 7));
}

private:
char* bits;
};
#endif

using namespace std;
int main()
{

const int N = 10;
clock_t cstart = clock();

bitset<N + 1> b;

int count = 0;
int i;
for (i = 2; i <= N; i++)
b.set(i);
i = 2;
while (i * i <= N)
{
if (b.test(i))
{
int k = 2 * i;
while (k <= N)
{ b.reset(k);
k += i;
}
}
i++;
}
for (i = 2; i <= N; i++)
{
if (b.test(i))
{
//#ifdef PRINT
cout << i << "n";
//#endif
count++;
}
}

clock_t cend = clock();
double millis = 1000.0
* (cend - cstart) / CLOCKS_PER_SEC;

cout << "n" << count << " primesn"
<< millis << " millisecondsnn";
cout<< b.test(N) << "--testn";
cout<< b.set(N) << "--setn";
cout<< b.reset(N) << "--resetn";
int tst = ((10 - 1) / 8 + 1);
cout<< (10 - 1) / 8 << " in test (n - 1) / 8 + 1 = " << tst << endl;


getch();
return 0;
};
-------------------- snip -------------------

Avatar
Alexandre
"Québec" a écrit dans le message de
news:lhlAb.77976$
J'oubliais. int main est en dehorsde la classe.

Borland C++ Builder 5



et c'est bien une appli console (pas GUI) ?

Avatar
kanze
"Québec" wrote in message
news:<J4nAb.114969$...

À l'écran:
2
3
4
5
7

4 primes
0 milliseconds

0--test
10010101100--set
00010101100--reset
1 in test (n-1)/8 + 1 = 2


Ce qui correspond à ce que je m'attendrais avec ton programme, à une
exception près. (Ça m'étonne un peu que tu as réelement affiché le
troisième ligne.)

es tu sûr que dans ton cas stdout est bien dirigé vers la sortie
écran console ?


Oui.

Mais j'imagine que le problème est ailleurs.


-------------------- snip -------------------
#include <iostream.h>
#include <conio.h>
#include <ctime.h>
#ifndef AVOID_STANDARD_BITSET
#include <bitset.h>
#else


Pour des raisons que j'évoquerai plus tard, je suppose que
AVOID_STANDARD_BITSET n'est pas défini. Donc, le code dans le #else ne
nous intéresse pas.

template<int N>

class bitset
{

using std::cout;
using std::endl;
public:
bitset() : bits(new char[(N - 1) / 8 + 1]) {}

bool test(int n)
{
return (bits[n >> 3] & (1 << (n & 7))) != 0 );
}

void set(int n){
cout << "yes?";
bits[n >> 3] |= 1 << (n & 7);
}

void reset(int n)
{
bits[n >> 3] &= ~(1 << (n & 7));
}

private:
char* bits;
};
#endif

using namespace std;
int main()
{

const int N = 10;
clock_t cstart = clock();

bitset<N + 1> b;

int count = 0;
int i;
for (i = 2; i <= N; i++)
b.set(i);
i = 2;
while (i * i <= N)
{
if (b.test(i))
{
int k = 2 * i;
while (k <= N)
{ b.reset(k);
k += i;
}
}
i++;
}
for (i = 2; i <= N; i++)
{
if (b.test(i))
{
//#ifdef PRINT
cout << i << "n";
//#endif
count++;
}
}

clock_t cend = clock();
double millis = 1000.0
* (cend - cstart) / CLOCKS_PER_SEC;

cout << "n" << count << " primesn"
<< millis << " millisecondsnn";
cout<< b.test(N) << "--testn";
cout<< b.set(N) << "--setn";


Et voilà la preuve que AVOID_STANDARD_BITSET n'est pas défini. Parce que
dans ton bitset à toi, set renvoie void, et l'expression ci-dessus
serait illégale.

cout<< b.reset(N) << "--resetn";


Ainsi que celle-ci.

int tst = ((10 - 1) / 8 + 1);
cout<< (10 - 1) / 8 << " in test (n - 1) / 8 + 1 = " << tst << endl;

getch();
return 0;
};
-------------------- snip -------------------


--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16


Avatar
Québec
Si n'est pas défini.
#ifndef AVOID_STANDARD_BITSET
donc
#include <bitset.h>
n'est pas utilisé?

(Ça m'étonne un peu que tu aies réellement affiché le
troisième ligne.)
0--test

10010101100--set
00010101100--reset ---->pourquoi plus cele-ci que la précédente qui est
void aussi?
1 in test (n-1)/8 + 1 = 2

Alors, ce qui est affiché, vient d'où? Des trois fonctions de la classe
bitset ou de cette macro?

bitset() : bits(new char[(N - 1) / 8 + 1]) {}?

Avatar
kanze
"Québec" wrote in message
news:<XR0Bb.26743$...
Si n'est pas défini.
#ifndef AVOID_STANDARD_BITSET
donc
#include <bitset.h>
n'est pas utilisé?


Je ne connais pas les options de compilation qui t'ont servi, mais le
code que tu as écris par la suite ne doit pas se compiler avec ton
bitset à toi, mais est parfaitement légal avec le bitset standard. J'en
conclus donc que la compilation conditionnelle prenait le bitset
standard.

(Ça m'étonne un peu que tu aies réellement affiché le
troisième ligne.)



Au début, tu as affiché :

2
3
4
5
7

L'algorithme en question, c'est le crible d'Ératosthène, pour trouver
les nombres premiers. Je n'ai pas vérifié ton implémentation en détail,
mais à côté de l'affichage qui génère les nombres ci-dessus, il y avait
aussi un compteur, et tu affichais aussi qu'il y avait quatre premiers
trouvés. Or, ci-dessus, il y a cinq lignes, non quatre. Et le nombre 4
n'est pas premier. J'ai donc des doutes qu'il a été réelement affiché.

0--test
10010101100--set
00010101100--reset ---->pourquoi plus cele-ci que la précédente qui est
void aussi?


Ce sont ces deux lignes qui me convainc que tu te sers du bitset
standard, et non le tien. Dans le tien, les fonctions set et reset ont
un type de retour de void -- les expressions « cout << b.set(N) » ou
« cout << b.reset(N) » ne sont pas valides, n'importe quel compilateur
les réfusera. Avec le bitset standard, elles ne sont pas valide non
plus, mais le problème est uniquement un des bornes -- tu as un
comportement indéfini qui ne pose aucun problème pour le compilateur, et
qui risque même de marcher la plupart du temps.

1 in test (n-1)/8 + 1 = 2

Alors, ce qui est affiché, vient d'où? Des trois fonctions de la
classe bitset ou de cette macro?

bitset() : bits(new char[(N - 1) / 8 + 1]) {}?


Quel macro ?

Si je régarde le code que tu as posté, il ne se compile pas si
AVOID_STANDARD_BITSET est défini. Et s'il n'est pas défini, ce que tu
présentes comme sortie me paraît juste, à l'exception près du 4. S'il
n'est pas défini, ton bitset à toi n'est même pas compilé ; c'est donc
normal que les sorties qu'il contient ne s'effectuent.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16