PDA

Visualizza la versione completa : [C] Segmentation fault in esecuzione programma per quadro magico


yeppa
07-05-2012, 17:40
Buongiorno

Mi sono appena iscritto in questo forum :) E studio il c da non tanto tempo. Nel cercare di creare un codi per il quadro magico con dei vettori moleplici, 90 righe e 90 colonne, ho riscontrato l'errore nell'avvio: Segmentation fault.
Volevo chiedere se qualcuno e' disposto ad aiutarmi a trovare l'errore nel codice, ringrazio anticipatamente :)

Codice:

#include <stdio.h>
int main(void)
{

int riga, colonna, numero = 1;

int tavola[90][90] = {0};

colonna = 45;
riga = 0;

tavola[0][45] = 1;

while (1)

yep: for (riga; 90>=riga<=0; --riga)
{ for (colonna; 90>=colonna<=0; ++colonna)
if (tavola[riga][colonna] != 0)
tavola[riga][colonna]=(++numero); else tavola[++riga +1][--colonna-1]=( ++numero)}
if (riga>90) {riga=0; goto yep ; if (riga<0) {riga=90; goto yep};
if (colonna>90) {colonna=0; goto yep ; if (colonna<0) {colonna=90; goto yep} ;


return 0; }

shodan
07-05-2012, 17:55
A parte il goto e la mancanza di indentazione, consiglierei di rivedere la sintassi del ciclo for: è completamente sbagliata.

Scara95
07-05-2012, 17:58
Premessa: Non ho analizzato il codice, gli ho solo dato un'occhiata...
Conclusione: prima o dopo l'indice arriverà a 90 dandoti un'errore in quanto l'indice va da 0 a 89.

Consiglio: cancella il codice e scrivilo ssenza l'utilizzo di goto: non è più in uso per problemi di sicurezza (chiusura file, de-allocazione memoria, ...) e rende incomprensibile il codice, specialmente visto che l'hai inserito all'interno di un loop, inoltre a te basta un continue o break...

yeppa
07-05-2012, 18:41
Ho riscritto il codice, pero' non ho saputo fare a meno di goto, per il motivo che e' fuori dal ciclo.
Comunque adesso il problema e' di non dare input.

codice:
#include <stdio.h>
int main(void)
{

int riga, colonna, numero = 1;

int tavola[90][90] = {0};

colonna = 44;
riga = 0;

tavola[0][44] = 1;

while (1)

yep: for (riga; 89>=riga<=0;)
{ for (colonna; 89>=colonna<=0;)
{if (tavola[riga-1][colonna+1]==0 || tavola[riga+1][colonna]==0)
{if (tavola[riga-1][colonna+1]==0) tavola[--riga][++colonna]=++numero; else tavola[++riga][colonna]=++numero;} else return 0;}}
if (riga>89) {riga=0; goto yep;} if (riga<0) {riga=89; goto yep;}
if (colonna>89) {colonna=0; goto yep;} if (colonna<0) {colonna=89; goto yep;}
printf("%d", tavola[90][90]);


return 0; }

Scara95
07-05-2012, 18:53
Spiegati meglio...
Comunque prima o dopo l'indice assumerà valore 89 cui tu poi aggiungi 1: risultato 90: stesso errore di prima...
In ogni caso ti consiglio di riprovare finché non giungi ad una soluzione che non preveda l'uso di goto...

Ah, utilizza il tag code per favore...

yeppa
07-05-2012, 22:49
Prima di tutto voglio rigraziare tutti coloro che hanno risposto.
Poi devo dire il mio problema dovrebbe essere risolto in parte, perche' ho ottenuto la stampa anche se sono impossibilitato a certificare la validita' della tavola, ora il problema ma e' come allinearli.


#include <stdio.h>
int main(void)
{

int riga, colonna, numero = 1;

int tavola[90][90] = {0};

colonna = 44;
riga = 0;

tavola[0][44] = 1;



while (1)
{
if (riga == 0) riga = 89; else if (riga == 89) riga = 0; if (colonna == 89) colonna = 0;
if (tavola[riga-1][colonna+1] == 0 || tavola[riga+1][colonna] == 0)
{
if (tavola[riga-1][colonna+1] == 0) tavola[--riga][++colonna] = ++numero;
else tavola[++riga][colonna] = ++numero;
printf (" %d", tavola[riga][colonna]);
}
else break;
}

return 0; }

yeppa
07-05-2012, 23:18
Per ordinarli ho provato sia con un ciclo for che con questo codice


if (riga == 89 && colonna == 89) break;
if (colonna == 89) {colonna = 0; riga++;}
colonna++;
printf("%d", tavola[riga][colonna]);
}

che alla fine ha la stessa funzione ma appare errore Segmentation fault.

LeleFT
08-05-2012, 09:08
Benvenuto sul forum.
Ti invito a prendere visione del Regolamento interno (http://forum.html.it/forum/showthread.php?s=&threadid=973887), in particolare per quanto riguarda l'assegnazione del titolo alla discussione. Il titolo è una parte fondamentale di una discussione all'interno del forum.
Nel titolo devi indicare:

1) Il linguaggio di programmazione che usi (fra parentesi quadre)
2) Una sintetica descrizione del problema

Considerando che questo è il forum "Programmazione", dare alla discussione un titolo come "Problema nella programmazione" non aiuta nessuno, in quanto il 100% delle discussioni presenti in questo forum riguarda problemi nella programmazione... sarebbero Off-Topic, altrimenti. Per questo è importante che il titolo dia una descrizione del problema... altrimenti tutte le discussioni si potrebbero chiamare come la tua e nessuno saprebbe più a quale discussione far riferimento.

Vi sono altre scritte nel regolamento che ti ho linkato da tenere presente, come l'uso dei tag CODE per il codice.


Ciao. :ciauz:

yeppa
08-05-2012, 12:26
ok, chiedo scusa

yeppa
08-05-2012, 13:53
Ciao a tutti, ho sistemato il codice, ma ora presenta il problema di bloccarsi al numero 23 e non fa piu' gli altri calcoli .-. sapete il perche?



#include <stdio.h>
int main(void)
{


int riga, colonna, numero = 1;

int tavola[6][6] = {0};

colonna = 2;
riga = 0;

tavola[0][2] = 1;



while (1)
{
if (riga == 0) {riga = 5; tavola[riga][++colonna] = ++numero;} else if (riga == 5){riga = 0; tavola[riga][colonna] = ++numero;} else if (colonna == 5) {colonna = 0; tavola[--riga][colonna]=++numero;}
if (tavola[riga-1][colonna+1] == 0 || tavola[riga+1][colonna] == 0)
{
if (tavola[riga-1][colonna+1] == 0) tavola[--riga][++colonna] = ++numero;
else tavola[++riga][colonna] = ++numero;
}
else break;
}

for (riga = 0; riga <6; riga++)
{printf ("\n\n");
for (colonna = 0; colonna <6; colonna++) printf(" %2d", tavola[riga][colonna]);
}
printf ("\n\n");
return 0; }

Loading