Ogni volta che eseguo il mio codice relativo al problema “piastrelle” mi da come errore “Segmentation fault (core dumped)”. Il problema è che (come si può notare dal codice) non provo ad accedere a nessuna area di memoria inesistente o qualcosa del genere, anzi, se uso solo uno dei due comandi ( sol[j] = 2; o sol[j-1] = 2;) non mi da nessun errore, mentre se li uso entrambi ecco l’errore. Non riesco a capire il perché
int main(int argc, char* args[])
{
ifstream in(“input.txt”);
ofstream out(“output.txt”);
int N;
vector<int> sol;
in >> N;
for(int i = 0; i < N; i++)
sol.push_back(1);
bool exit = false;
int len = N-1;
while(true)
{
for(int i = 0; i <= len; i++)
if(sol[i] == 1) out << "[O]";
else if(sol[i] == 2) out << "[OOOO]";
out << "\n";
while(next_permutation(sol.begin(), sol.begin()+len+1))
{
for(int i = 0; i <= len; i++)
if(sol[i] == 1) out << "[O]";
else if(sol[i] == 2) out << "[OOOO]";
out << "\n";
}
int j = len;
while(sol[j] != 1) j--;
if(j == 0) break;
sol[j] = 2; // se uso uno solo di questi due esegue
sol[j-1] = 2; // se li uso tutti e due da Segmentation fault
len--;
}
return 0;
Il discorso “se faccio solo A o solo B non fallisce, ma se faccio entrambi fallisce” dovrebbe farti pensare ad un undefined behavior (che si verifica in casi tipo: divisioni per zero, letture/scritture in memoria non allocata al tuo processo…).
Ho assistito a casi in cui aggiungere una riga di debug tipo: printf(“i=%d\n”, i) sembrava prevenire un runtime error.
Quando c’è un undefined behavior, in generale, tutto può succedere
Nel tuo caso accedi eccome a memoria non allocata… nella riga:
Ah ecco qual è il problema. Il fatto è che se N è pari l’ultima sequenza avrà tutti 2, quindi non troverà mai l’1, quindi accedi a memoria non allocata.
Il discorso "se faccio solo A o solo B non fallisce, ma se faccio entrambi fallisce" dovrebbe farti pensare ad un undefined behavior (che si verifica in casi tipo: divisioni per zero, letture/scritture in memoria non allocata al tuo processo...).
Ho assistito a casi in cui aggiungere una riga di debug tipo: printf("i=%d\n", i) sembrava prevenire un runtime error.
Quando c'è un undefined behavior, in generale, tutto può succedere :P
Nel tuo caso accedi eccome a memoria non allocata... nella riga:
while(sol[j] != 1) j--;
wil93
Era proprio questo, grazie :D Ho risolto modificando con