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>
 
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.
 
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?
 
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.
 
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...
 
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.
 
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:
 
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
 
Ü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:
 
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
 
<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
 
Ü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:
 
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
 
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.
 
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.
 
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>
 
Ja, notPrime*2 ökar ju inte prime! Men går det inte att skriva notPrime*=2 i C++?

Übereil, minns inte riktigt
 
Back
Top