Nekromanti [C++]Vektorer och gojs

Fienden

Hero
Joined
11 Oct 2008
Messages
1,655
Location
Någonstans i ödemarken
Kort sagt: Varför fungerar inte det här? Jag försöker lagra alla icke-primtal i notPrimes och alla primtal i Primes, sedan mata ut primes. Men, programmet låser sig efter användaren skrivit in ett nummer.

<div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre" ><pre>#include <iostream>
#include <vector>
using namespace std;

bool checkForNoPrime(int, vector<int>);

int main()
{
int max = 0;
int prime = 0;
vector<int> notPrimes;
vector<int> primes;
cout << "Enter a number, and I will tell you all prime numbers between 2 and that number." << endl;
cin >> max;
for (int c=2; c<max; c++)
{
if (checkForNoPrime(c, notPrimes))
{
for (int notPrime = c; notPrime <= max; notPrime*2)
{
notPrimes.push_back(notPrime);
}
primes.push_back(c);
}
}
cout << endl;
for (int c=0; c<primes.size(); c++)
{
cout << primes[c] << " ";
}
}

bool checkForNoPrime(int number, vector<int> check)
{
bool rBool = true;
for (int c=0; c < check.size() && rBool == true; c++)
{
if (number==check[c])
{
rBool = false;
}
}
return rBool;
}</pre></div></div>
 

Tony.Meijer

Ärketeknomantiker
Joined
14 Sep 2009
Messages
1,887
Location
Uppsala
Utan att ha grävt mer i det så gissar jag på att du konstant expanderar notPrimes listan och därigenom hänger sig programmet.
 

Fienden

Hero
Joined
11 Oct 2008
Messages
1,655
Location
Någonstans i ödemarken
Spider Jerusalem said:
Fråga 1: är det här en läx uppgift?
Nej! Valfri uppgift vi gör för att träna. Jag KAN inte hitta felet med det och läraren är upptagen.

Tony.M.Meijer said:
Utan att ha grävt mer i det så gissar jag på att du konstant expanderar notPrimes listan och därigenom hänger sig programmet.
Kan vara det. notPrimes är ju dock en vektor så den SKA ju kunna expanderas. Expansionen slutar ju även när
notPrime >= max. Programmet hänger sig även för väldigt små värden (typ 10), så jag vet inte om det är problemet?
 

Spider Jerusalem_UBBT

Swashbuckler
Joined
13 May 2011
Messages
2,245
Location
The City
Tony.M.Meijer said:
Utan att ha grävt mer i det så gissar jag på att du konstant expanderar notPrimes listan och därigenom hänger sig programmet.
Ja det stämmer samt att det är ett minnes problem, gjorde ett test och den allokerade 200,000 kb minne.
 

Tony.Meijer

Ärketeknomantiker
Joined
14 Sep 2009
Messages
1,887
Location
Uppsala
Du har missat en length eller size tror jag, för notPrimes.

En vector är inte längden, det är en pekare, ergo du får en, gissningsvis 64 bitars address som svar, vilket alltid kommer att vara mindre än en int...
 

Fienden

Hero
Joined
11 Oct 2008
Messages
1,655
Location
Någonstans i ödemarken
Spider Jerusalem said:
Tony.M.Meijer said:
Utan att ha grävt mer i det så gissar jag på att du konstant expanderar notPrimes listan och därigenom hänger sig programmet.
Ja det stämmer samt att det är ett minnes problem, gjorde ett test och den allokerade 200,000 kb minne.
Oh herre jävlar. Kanske måste sätta ett startvärde på vektorn? :gremtongue: Det var INTE så det var tänkt.
 

Spider Jerusalem_UBBT

Swashbuckler
Joined
13 May 2011
Messages
2,245
Location
The City
Kraetyz said:
Spider Jerusalem said:
Tony.M.Meijer said:
Utan att ha grävt mer i det så gissar jag på att du konstant expanderar notPrimes listan och därigenom hänger sig programmet.
Ja det stämmer samt att det är ett minnes problem, gjorde ett test och den allokerade 200,000 kb minne.
Oh herre jävlar. Kanske måste sätta ett startvärde på vektorn? :gremtongue: Det var INTE så det var tänkt.
Kan ta en ordentlig titt senare. Men jag har skrivit ett liknadne program förut och jag tycker du gör det lite onödigt krongligt för dig själv :gremtongue:
 

Übereil

Swashbuckler
Joined
10 Jun 2010
Messages
1,877
Location
Örebro
Utan att ha grävt ner mig heller så låter det där rimligt. Ett annat (kanske väldigt uppenbart) tips är att under debuggingen skriva ut en massa tracetext på skärmen. T ex skriva ut c och stoppvillkoret för varje iteration (då kan du se om stoppvillkoret hela tiden ökas och därmed aldrig uppfylls).

Übereil, om du inte tänkt på det är det här ett jättebra tips
 

Spider Jerusalem_UBBT

Swashbuckler
Joined
13 May 2011
Messages
2,245
Location
The City
Übereil said:
Utan att ha grävt ner mig heller så låter det där rimligt. Ett annat (kanske väldigt uppenbart) tips är att under debuggingen skriva ut en massa tracetext på skärmen. T ex skriva ut c och stoppvillkoret för varje iteration (då kan du se om stoppvillkoret hela tiden ökas och därmed aldrig uppfylls).

Übereil, om du inte tänkt på det är det här ett jättebra tips
Skit bra tips. Sånt man gör utan att tänka på :gremtongue:
 

Übereil

Swashbuckler
Joined
10 Jun 2010
Messages
1,877
Location
Örebro
Ska man ta andra bra men kanske uppenbara tips så är "googla" också något man kan göra för att få hjälp.

Übereil, som insåg det tre år in i sin utbildning och plötsligt blev en mycket bättre utvecklare
 

Übereil

Swashbuckler
Joined
10 Jun 2010
Messages
1,877
Location
Örebro
<div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre" ><pre>
[snip]
for (int c=2; c<max; c++)
{
if (checkForNoPrime(c, notPrimes))
{
for (int notPrime = c; notPrime.Size() <= max; notPrime*2)
{
notPrimes.push_back(notPrime);
}
primes.push_back(c);
}
}
[snip]</pre></div></div>

I den innersta for-loopen (bold funkade visst inte i kodblock).

Übereil, tror det var det Tony menade
 

Fienden

Hero
Joined
11 Oct 2008
Messages
1,655
Location
Någonstans i ödemarken
Übereil said:
[snip]
for (int c=2; c<max; c++)
{
if (checkForNoPrime(c, notPrimes))
{
for (int notPrime = c; notPrime.Size() <= max; notPrime*2)
{
notPrimes.push_back(notPrime);
}
primes.push_back(c);
}
}
[snip]

Übereil, tror det var det Tony menade
Men det där går ju inte. notPrime är ju en integer som jämställs till c.

//Kraetyz ursäktar för dålig namngivning :gremfrown:
 

Übereil

Swashbuckler
Joined
10 Jun 2010
Messages
1,877
Location
Örebro
Kraetyz said:
Men det där går ju inte. notPrime är ju en integer som jämställs till c.

//Kraetyz ursäktar för dålig namngivning :gremfrown:
Ah, jag som läste slarvigt.

Übereil, vi får vänta på Tony helt enkelt
 

Spider Jerusalem_UBBT

Swashbuckler
Joined
13 May 2011
Messages
2,245
Location
The City
Kraetyz said:
Übereil said:
[snip]
for (int c=2; c<max; c++)
{
if (checkForNoPrime(c, notPrimes))
{
for (int notPrime = c; notPrime.Size() <= max; notPrime*2)
{
notPrimes.push_back(notPrime);
}
primes.push_back(c);
}
}
[snip]

Übereil, tror det var det Tony menade
Men det där går ju inte. notPrime är ju en integer som jämställs till c.

//Kraetyz ursäktar för dålig namngivning :gremfrown:
Tänkte säga samma sak och jag kan inte se vart Tony menar att man ska göra en size.
 

Tony.Meijer

Ärketeknomantiker
Joined
14 Sep 2009
Messages
1,887
Location
Uppsala
Opps, jag hackade visst lite för långt, jag kastade in ett s i slutet på notPrime av bara farten (och gjorde lite annat) och fick den att avsluta utan att verifiera något. Sorry, my bad.
 

Tony.Meijer

Ärketeknomantiker
Joined
14 Sep 2009
Messages
1,887
Location
Uppsala
Här är en möjlig lösning:

<div class="ubbcode-block"><div class="ubbcode-header">Code:</div><div class="ubbcode-body ubbcode-pre" ><pre>
#include <iostream>
#include <vector>
using namespace std;

bool checkForNoPrime(int, vector<int>);

int main()
{
int max = 0;
int prime = 0;
vector<int> notPrimes;
vector<int> primes;
cout << "Enter a number, and I will tell you all prime numbers between 2 and that number." << endl;
cin >> max;
for (int c=2; c<max; c++)
{
if (checkForNoPrime(c, notPrimes))
{
for (int notPrime = c; notPrime <= max; notPrime = notPrime*2)
{
notPrimes.push_back(notPrime);
}
primes.push_back(c);
}
}
cout << endl;
for (int c=0; c<primes.size(); c++)
{
cout << primes[c] << " ";
}
}

bool checkForNoPrime(int number, vector<int> check)
{
bool rBool = true;
for (int c=0; c < check.size() && rBool == true; c++)
{
if (number==check[c])
{
rBool = false;
}
}
return rBool;
}
</pre></div></div>
 

Übereil

Swashbuckler
Joined
10 Jun 2010
Messages
1,877
Location
Örebro
Ja, notPrime*2 ökar ju inte prime! Men går det inte att skriva notPrime*=2 i C++?

Übereil, minns inte riktigt
 
Top