Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Desafiando leyes de la programacion

Estas en el tema de Desafiando leyes de la programacion en el foro de C/C++ en Foros del Web. Mirar lo que me ocurre: Tengo un array de 3 elementos. 1º Pinto el array for (i=0;i<num_elementos;i++){fprintf(fichero,"%d ", sistema[i]);} fprintf(fichero,"\n"); 2º Ejecuto línea que no ...
  #1 (permalink)  
Antiguo 25/10/2010, 04:31
 
Fecha de Ingreso: julio-2010
Mensajes: 216
Antigüedad: 14 años, 3 meses
Puntos: 0
Desafiando leyes de la programacion

Mirar lo que me ocurre:

Tengo un array de 3 elementos.
1º Pinto el array
for (i=0;i<num_elementos;i++){fprintf(fichero,"%d ", sistema[i]);} fprintf(fichero,"\n");
2º Ejecuto línea que no tiene nada que ver con ese array
posicion = colocar_componente(sistema_reparacion, que_elemento);
3º Vuelvo a pintar array
for (i=0;i<num_elementos;i++){fprintf(fichero,"%d ", sistema[i]);} fprintf(fichero,"\n");

Resultado:
000
100

Muchas veces cambia!! cómo es posible si no toco el array!!
  #2 (permalink)  
Antiguo 25/10/2010, 04:33
 
Fecha de Ingreso: julio-2010
Mensajes: 216
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: Desafiando leyes de la programacion

Por si sirve de algo y para demostrar que la función no toca el array, la pego aquí:


int colocar_componente(int sistema_reparacion[tamanio_sistema_reparacion], int que_elemento)
{ /* funcion que coloca al componente llegado en el sistema de reparacion */ /*hay sitio forzoso, sino no habria llegado */
int colocado, i;

colocado = 0;i = 0;
while(colocado == 0) /* mientras que no se coloque el componente */
{
if (sistema_reparacion[i] == 0) /* si esta vacía la posicion */
{ sistema_reparacion[i] = que_elemento;
colocado = 1;
}
else {i++;}
}
return(i); /* devuelve la posicion donde ha sido colocado */
}
  #3 (permalink)  
Antiguo 25/10/2010, 08:22
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Desafiando leyes de la programacion

Si el arreglo sistema_reparacion estuviera lleno de 1s, el ciclo aumentaria a i hasta dejarlo fuera de los limites de ese arreglo, y luego cambiariias un elemento fuera de el.

Para confirmar esto, escribe que valor tiene i cuando haces la asignacion

sistema_reparacion[i] = que_elemento;

y verifica que ese i no este fuera de los limites del arreglo.
Si lo está, ya tienes al culpable.
  #4 (permalink)  
Antiguo 26/10/2010, 02:06
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 14 años, 5 meses
Puntos: 73
Respuesta: Desafiando leyes de la programacion

En C, cuando pasas un array como parámetro a una función, realmente estás pasando un puntero a su primer elemento. Por lo tanto, se puede modificar el contenido de cualquier elemento del array. Es lo que está ocurriendo cuando haces

sistema_reparacion[i] = que_elemento;

Por eso te cambia, tú crees que no toca el array pero sí que lo hace.
  #5 (permalink)  
Antiguo 26/10/2010, 08:16
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Desafiando leyes de la programacion

Fijete que casualmente el contador sube hasta que encuentra un cero. Y los mas comun es que el cero que encuentre sea el del otro array.
  #6 (permalink)  
Antiguo 26/10/2010, 08:34
 
Fecha de Ingreso: enero-2008
Mensajes: 229
Antigüedad: 16 años, 9 meses
Puntos: 1
Respuesta: Desafiando leyes de la programacion

podrias poner el codigo de colocar_componente, para ver lo que hace
  #7 (permalink)  
Antiguo 26/10/2010, 08:55
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Desafiando leyes de la programacion

Cita:
Iniciado por Zunri Ver Mensaje
Por si sirve de algo y para demostrar que la función no toca el array, la pego aquí:


int colocar_componente(int sistema_reparacion[tamanio_sistema_reparacion], int que_elemento)
{ /* funcion que coloca al componente llegado en el sistema de reparacion */ /*hay sitio forzoso, sino no habria llegado */
int colocado, i;

colocado = 0;i = 0;
while(colocado == 0) /* mientras que no se coloque el componente */
{
if (sistema_reparacion[i] == 0) /* si esta vacía la posicion */
{ sistema_reparacion[i] = que_elemento;
colocado = 1;
}
else {i++;}
}
return(i); /* devuelve la posicion donde ha sido colocado */
}
Ya lo habia puesto!

Etiquetas: leyes, programacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:30.