[MV-Programadores] Violacion de segmento en C

SnAk0

Buenas gente, no suelo postear mucho por aqui, pero es que tengo un problema que me esta desquiciando.
Me gustaria que le echarais un ojo a este codigo y me indiqueis donde esta la jodida violacion de segmento..
Muchas gracias de antemano.

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
int n,l, i,j ,k=0 ,s=0, g=0;
int a[600][2];

printf("introduce el numero de tiradas\n");
scanf("%d",&n);
if(n>100){
printf("Error el numero debe ser menor o igual que cien\n");
return 0;
}
srand(time(NULL)/2);
for(j=0; j<1; j++){
for(i=0; i<n; i++){
l=rand();
if(l%6==0)
l=1;
else if(l%6==1)
l=2;
else if(l%6==2)
l=3;
else if(l%6==3)
l=4;
else if(l%6==4)
l=5;
else
l=6;
s+=l;
a[s-1][1]+=1;
a[s-1][0]=s;
printf("hola\n");
}
}
}
return 0;
}

Gracias de nuevo.

mongui

Te lo muevo a donde tiene que ir :)

Desarrollo y diseño web

PirLo_21

Depura un poco amigote... Si estas en linux depura con ddd que es bastante bueno...

dagavi

Y ya que pones el código al menos usa [ code][ /code] que no hay quien lo lea sin la indentación

Edit: Sobra un "}"

Edit2: Cago en el de abajo k ya te lo ha dicho xD

_kRuStY_

mmm...solo tienes que quitar la llave que esta encima del return. Y eso en todo caso te daria un error al compilar, pero si lo quitas ejecuta bien.

PD: Que sepas que mas hecho irme a Linux y todo para miratelo y encima no era nada!! :@

SnAk0

gracias gente, me habeis sido de mucha ayuda ^^

WaYnE10

#5 jajaja hasta a linux se a ido xD

Josepanaero

Solamente por curiosidad, de dónde has sacado ese código? Pq está bastante mal programado. Pero q muy mal...

Así a bote pronto, se me ocurren estos fallos:
1.- No tiene ni un mísero comentario
2.- Los nombres de las variables no son muy intuitivos...
3.- Las variables k y g para qué la declaras si no se usan? Se supone q el código todavía está incompleto y las vas a usar luego?
4.- La variable j tb te la puedes ahorrar, pq solamente la usas para esto for(j=0; j<1; j++). Eso en mi pueblo es lo mismo que "ejecutar una única vez". En otras palabras, q sobra, puesto q la variable j no interviene en el algoritmo, solamente es una variable iterativa y punto.
5.- La parte

if(l%6==0)
l=1;
else if(l%6==1)
l=2;
else if(l%6==2)
l=3;
else if(l%6==3)
l=4;
else if(l%6==4)
l=5;
else
l=6;

queda bastante cutre, puesto que se puede resumir en una sola línea, de forma mucho más elegante:
l = (l%6)+1
6.- En a[s-1][1]+=1;
imagino q estarás asumiendo que el compilador le ha asignado ceros a la matriz a al inicializarla, puesto que tú no lo has hecho. Esto imagino q lo harás por eficiencia, pero aún así no es una buena práctica de programación.

Como ves la gran mayoría de las líneas q has escrito tienen algún tipo de error, más o menos importante, pero bueno... Espero q no te haya molestado esto y q lo uses para mejorar. Yo no es q sea un virtuoso de la programación, pero me ha llamado la atención tu código.

Saludos.

_kRuStY_

Jajajaja, pobre chaval, en un momentito las dejao tieso. xD

Orangekas

hola xD. El codigo es mio, sNAkO lo ha posteado por mi, por hacerme ese favor(Gracias ;)).Resulta que ya se que no esta comentado ni nada, pero esque eso lo hago al final, al igual que quito las variables que sobran etc.Muchas gracias por vuestra ayuda, la agradezco muchisimo, al final ya consegui que saliese, cambiando casi todo el algoritmo.Muchas Gracias a todos de nuevo ^^

Soltrac

Roma no se hizo en un día, es normal cometer ciertos errores logicos al principio.

De todas maneras toma nota de las correciones q te han suministrado, tu codigo funciona, si, pero un codigo limpio es mas facil de arreglar q uno sucio.

Orangekas

si, si por supuesto :) no caeran en saco roto.Gracias de nuevo ^^

Josepanaero

Hola Orangekas. Espero q no te haya molestado lo q puse antes. Pero es q cuando vi el código, me quedé to loco xD

Yo te recomendaría q fueses comentando mientras vas programando y no al final, pq es más sencillo y al final es posible q no recuerdes bien qué hacía cada cosa. Si lo haces mientras escribes el código, lo vas a comentar bien seguro.

Y las variables q sobren quitarlas al final... Lo ideal no es eso, lo mejor q puedes hacer es usar solamente las variables q necesites y no ponerte a declarar variables a diestro y siniestro.

Y otra cosa importante. Ponle nombres intuitivos a las variables. No les pongas letras sin más (salvo en casos puntuales, como para los iteradores). Esto es así pq si otra persona tiene q ver tu código, le será mucho más sencillo entenderlo. Es más, si tú mismo dentro de 2 años vuelves a ver tu código, te costará entenderlo si no pones buenos nombres a las variables. Esto mismo se aplica tb a los comentarios, es bueno ponerlos para ayudar a entender mejor el código.

Otra cosa más q suelo hacer yo antes de programar es dedicar un tiempo a hacerme una idea mental de cómo va a estar organizado mi código. Si es demasiado grande, hago un pseudocódigo en papel. Esto ayuda bastante más de lo q parece, y te sale el código más limpio q si te pones directamente a picar código sin pensar en nada antes.

Y para el tema de las variables q no usas en el código, si al compilador le añades la directiva "-Wall", te va a decir cuáles son esas variables q no utilizas para nada. Además te advertirá de muchas otras cosas q te pueden ayudar a depurar tu código.

Y nada, de verdad espero q esto te sirva para algo. Salu2!!

JuAn4k4

Edit : error, no vi el s+=l

Orangekas

Muchas gracias :) .Claro que sirve ^. Siempre compilo con -ansi y -Wall pero normalmente hasta que no esta bien entero el programa no quito los warnings. Lo de coemntar y las variables llevas razon, voy a intentar hacerte caso, a ver si me va mejor :). Gracias :)

Usuarios habituales

  • Orangekas
  • Josepanaero
  • Soltrac
  • _kRuStY_
  • SnAk0
  • PirLo_21
  • mongui