Piastrelle - Segmentation fault (core dumped)

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é

#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int main(int argc, char* args[])
{
ifstream in(“input.txt”);
ofstream out(“output.txt”);

int N;
vector&lt;int&gt; sol;

in &gt;&gt; N;
for(int i = 0; i &lt; N; i++)
sol.push_back(1);

bool exit = false;
int len = N-1;

while(true)
{
for(int i = 0; i &lt;= len; i++)
    if(sol[i] == 1) out &lt;&lt; "[O]";
    else if(sol[i] == 2) out &lt;&lt; "[OOOO]";
out &lt;&lt; "\n";
    
while(next_permutation(sol.begin(), sol.begin()+len+1))
{
    for(int i = 0; i &lt;= len; i++)
	if(sol[i] == 1) out &lt;&lt; "[O]";
	else if(sol[i] == 2) out &lt;&lt; "[OOOO]";
    out &lt;&lt; "\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;

}



Si verifica soltanto con N pari, con valori di N dispari funziona

Prova a fare j=len-1; anziché j=len;

No ok ho detto una cazzata. Probabilmente quando sono pari len diventa 0 e quindi j diventa -1. Questo poi ti dà problemi

Quindi prova a cambiare l’if mettendo j<=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 :stuck_out_tongue:

Nel tuo caso accedi eccome a memoria non allocata… nella riga:

while(sol[j] != 1) j–;

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 

while(sol[j] != 1 && j > 0) j--;


(giusto per la cronaca, il codice che ho inserito nel primo post non risolve correttamente il problema, ma ho risolto anche questo :p)

(giusto per la cronaca, il codice che ho inserito nel primo post non risolve correttamente il problema, ma ho risolto anche questo :p)

Degiac

Infatti mi sembrava strano che funzionasse con il next_permutation ahahha

Alla fine sempre con next_permutation l’ho fatto eh