Facebook Google+


Wiki Errores comunes de programación
#1
Thumbs Up 
Guia de errores comunes de programación

1. Confundir el operador de comparación con el operador de asignación
  
  Es muy común en un bloque if() escribir por error if(a=b) en vez de if(a==b) y dependiendo del lenguaje puede no compilar o bien crear un bug dificil de encontrar en runtime:

Código:
if(a=b)
{
  // bloque
}  

Lo que sucede paso a paso es esto:

  * Se asigna b a a
  * Se evalua a y si es verdadero, entra al bloque

2. Bucle infinito

Ciclo infinito cuando la condición de salida del ciclo nunca se cumple, ejemplo: 

Código:
for (i=1; i<100;i--)
    // ..  
 

o

Código:
  int i = 5;
      while(i>0){
          putchar('*');
        //i++;
    } 

3. Falta de modularización

  "Divide y reinarás" dice un viejo probervio y aplica a la programación en cualquier lenguaje. De hecho, no hay problema (computable) que no pueda resolverse si se hace la abstracción adecuada.
  
  Hay varias metodologias de modularización como la bottom-top y la top-down pero la segunda es la más común aunque se usen ambas en ingenieria de software.  
  
4. Inconcistencia en el nombre de las variables

  Sino usas un IDE o un buen editor de textos con autocompletar te puede suceder que por error de tipeo tengas dos variables con nombres parecidos que hacen referencia al mismo concepto. Ejemplo: contadorPares y contador_pares o pares_contador, etc.
  
Otros errores comunes de programación los puedes encontrar en la guia de errores comunes en C/C++

5. Exceder los límites de un arreglo o acceder con offset equivocado

   Los arreglos tienen límites comenzado por 0 o 1 (caso Lua) segun el lenguaje y cualquier acceso por fuera de los límites generará un error en tiempo de ejecución. 
   
   
Código:
   &lt;?php

   $arr = ['a','b','c'];
   
   if ($arr[-1]=='a')
   {
       // ..
   }
   

   El programa anterior en PHP produce un "Undefined offset" porque en PHP los arrays comienzan por 0 aunque pueden ingresarse valores en cualquier índice.
   
   Lo mismo sucede con hashs o diccionarios (en PHP en realidad los arreglos son diccionarios), ejemplo en Python:
   
   
Código:
   diccionario = {'Nombre': 'Pablo', 'Edad': 40}

   # KeyError: 'Id'
   print (diccionario['Id'])
   
      
6.  Problemas aritméticos 
 
 División por cero, desbordamientos (overflow) y subdesbordamientos (underflow) son errores en tiempo de ejecución que suceden con frecuencia. 
 

 
He intentado generalizar aunque es a veces imposible, ya que hay lenguajes compilados, interpretados, fuertemente tipados, debilmente tipados,...

Los ejemplos que di salvando la forma en la que se declaran las variables, son válidos por ejemplo para PHP pero entiendo no todo sea válido para Pascal por ejemplo.
 
Reply
#2
Hola esta muy bien los ejemplos pero cabe aclarar que la mayoría de los ejemplos solo son válidos para C/C++

Primero confundir el operador de asignación con el de comparación

Código:
if(a=b)
{
  // bloque
}
Esta perfecto pero en lenguajes de la familia Pascal como Modula, Object Pascal, Ada,... el operador de comparacion SI es con el simbolo de igual (=), ejemplo:
Código:
if(a=b) then
begin
   //bloque
end;

Segundo: ejemplo ciclo infinito

Este solo se aplica en C/C++, en C no existe el tipo de dato bool asi que para simular comparaciones booleanas el lenguaje utiliza el 1 y 0 como valores para representar verdadero o falso respectivamente, en este caso el while se ejecutará hasta que i se igual a cero valor que simboliza el falso  y que le indicara al while que la instrucción debe de parar.

En la mayoría de los lenguaje esta opción no está soportada aunque C++ soporta booleanos internamente sigue trabajando igual que C representado los estados con 1 y 0 inclusive lenguajes style C como Java o C# tampoco pueden ejecutar este tipo de instrucciones.
 
Reply
#3
Amigo@ crack81,.....tus valoraciones son correctas, gracias!, estoy corrigiendo los ejemplos y por ello también cambié tu cita Wink

Sigo...

- Cerrar mal comentarios multilinea

x = 10; /* coordenada X
y = 50; /* coordenada Y */

Ya que cerré mal (se me olvidó) el comentario en la primera linea, son ignoradas todas las instrucciones siguientes hasta que el compilador encuentre el cierre de comentario multi-linea

- Comerse un break en switch-case

Si bien el break en switch-case no es obligatorio, excepto que sea para manejo de excepciones o algun otro caso muy particular, suele usarse para cada caso (case) excepto el último:
Código:
$type = "integer";
  
  switch ($type)
    {    
        case "string":                    
            print "El tipo es string";
            break;            
            
        case "integer":            
            print "El tipo es entero";
            
            
        case "object":            
            print "El tipo es object";
            break;        
            
        default:
            print "Tipo desconocido";            
    }
Al faltar el break (omitido por error) despues del case "integer", sigue ejecutando cada sentencia hasta que haya un break  o se termine el switch-case, sin importar las condiciones de los siguientes case!

El tipo es entero
El tipo es object
 
Reply
  


Salto de foro:


Browsing: 1 invitado(s)