# Piastrelle - Segmentation fault (core dumped)

**URL:** <https://forum.olinfo.it/t/piastrelle-segmentation-fault-core-dumped/3793>\
**Category:** Aiuto\
**Created:** [25 Aprile 2014, 7:51pm UTC](https://forum.olinfo.it/t/piastrelle-segmentation-fault-core-dumped/3793 "2014-04-25T19:51:39Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![Degiac](https://forum.olinfo.it/user_avatar/forum.olinfo.it/degiac/32/9_2.png) [@Degiac](https://forum.olinfo.it/u/Degiac)\
**Post date:** [25 Aprile 2014, 7:51pm UTC](https://forum.olinfo.it/t/piastrelle-segmentation-fault-core-dumped/3793/1 "2014-04-25T19:51:39Z")

</div>

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;

```

}
```

---

<div class="post-metadata">

**Author:** ![Degiac](https://forum.olinfo.it/user_avatar/forum.olinfo.it/degiac/32/9_2.png) [@Degiac](https://forum.olinfo.it/u/Degiac)\
**Post date:** [25 Aprile 2014, 8:32pm UTC](https://forum.olinfo.it/t/piastrelle-segmentation-fault-core-dumped/3793/2 "2014-04-25T20:32:36Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Lawliet](https://forum.olinfo.it/user_avatar/forum.olinfo.it/lawliet/32/28_2.png) [@Lawliet](https://forum.olinfo.it/u/Lawliet)\
**Post date:** [25 Aprile 2014, 9:28pm UTC](https://forum.olinfo.it/t/piastrelle-segmentation-fault-core-dumped/3793/3 "2014-04-25T21:28:20Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Lawliet](https://forum.olinfo.it/user_avatar/forum.olinfo.it/lawliet/32/28_2.png) [@Lawliet](https://forum.olinfo.it/u/Lawliet)\
**Post date:** [25 Aprile 2014, 9:32pm UTC](https://forum.olinfo.it/t/piastrelle-segmentation-fault-core-dumped/3793/4 "2014-04-25T21:32:35Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Lawliet](https://forum.olinfo.it/user_avatar/forum.olinfo.it/lawliet/32/28_2.png) [@Lawliet](https://forum.olinfo.it/u/Lawliet)\
**Post date:** [25 Aprile 2014, 9:33pm UTC](https://forum.olinfo.it/t/piastrelle-segmentation-fault-core-dumped/3793/5 "2014-04-25T21:33:22Z")

</div>

Quindi prova a cambiare l’if mettendo j\<=0

---

<div class="post-metadata">

**Author:** ![wil93](https://forum.olinfo.it/user_avatar/forum.olinfo.it/wil93/32/2862_2.png) [@wil93](https://forum.olinfo.it/u/wil93)\
**Post date:** [25 Aprile 2014, 9:45pm UTC](https://forum.olinfo.it/t/piastrelle-segmentation-fault-core-dumped/3793/6 "2014-04-25T21:45:09Z")

</div>

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:

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

---

<div class="post-metadata">

**Author:** ![Lawliet](https://forum.olinfo.it/user_avatar/forum.olinfo.it/lawliet/32/28_2.png) [@Lawliet](https://forum.olinfo.it/u/Lawliet)\
**Post date:** [25 Aprile 2014, 10:01pm UTC](https://forum.olinfo.it/t/piastrelle-segmentation-fault-core-dumped/3793/7 "2014-04-25T22:01:52Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![Degiac](https://forum.olinfo.it/user_avatar/forum.olinfo.it/degiac/32/9_2.png) [@Degiac](https://forum.olinfo.it/u/Degiac)\
**Post date:** [25 Aprile 2014, 10:12pm UTC](https://forum.olinfo.it/t/piastrelle-segmentation-fault-core-dumped/3793/8 "2014-04-25T22:12:55Z")

</div>

> 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&nbsp;

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

---

<div class="post-metadata">

**Author:** ![Degiac](https://forum.olinfo.it/user_avatar/forum.olinfo.it/degiac/32/9_2.png) [@Degiac](https://forum.olinfo.it/u/Degiac)\
**Post date:** [25 Aprile 2014, 10:17pm UTC](https://forum.olinfo.it/t/piastrelle-segmentation-fault-core-dumped/3793/9 "2014-04-25T22:17:05Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![mark03](https://forum.olinfo.it/letter_avatar_proxy/v4/letter/m/439d5e/32.png) [@mark03](https://forum.olinfo.it/u/mark03)\
**Post date:** [25 Aprile 2014, 10:19pm UTC](https://forum.olinfo.it/t/piastrelle-segmentation-fault-core-dumped/3793/10 "2014-04-25T22:19:32Z")

</div>

> (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

---

<div class="post-metadata">

**Author:** ![Degiac](https://forum.olinfo.it/user_avatar/forum.olinfo.it/degiac/32/9_2.png) [@Degiac](https://forum.olinfo.it/u/Degiac)\
**Post date:** [25 Aprile 2014, 10:21pm UTC](https://forum.olinfo.it/t/piastrelle-segmentation-fault-core-dumped/3793/11 "2014-04-25T22:21:00Z")

</div>

Alla fine sempre con next\_permutation l’ho fatto eh
