La era de la informatica

Saturday, March 17, 2007

Solucion Problema 3

Hola de nuevo. Esta es la solución al problema 3, que trataba sobre ANSI C. La pregunta era, sobre este cógido ¿Que numero minimo de cambios hay que hacer para que compile con codigo ANSI, que funcione y la salida por pantalla sea logica?

#include <stdio.h>

void main(); {
int *p, x=5, y; // init
y = *(p = &x) +10;
int z;
flip-sign(p);
printf("x=%d,y=%d,p=%d\n",x,y,p);
}
flip-sign(int *n) {*n = -(*n)}

Empezemos linea por linea a ver los errores que encontramos y al final os pondre el codigo definitivo.

En la primera linea no hay errores, se trata de incluir la libreria estandar de entrada y salida.
En la segunda linea encontramos el primer error.
void main(); {
El ; sobra, por tanto deberia ser
void main() {
la tercera linea contiene un error en los comentarios:
int *p,x=5,y; // init
// no es la forma correcta de comentar codigo en ANSI, los comentarios deben ir entre los simbolos /* y */ Por tanto quedaria asi:
int *p,x=5,y; /* init */
La cuarta linea no contiene errores, al puntero p se le hace apuntar a la variable x, y luego se suma 10 con la "dereferencia" (el valor donde apunta) de p y el resultado se almacena en y.
La quinta linea es erronea, ya que solo se pueden declarar variables al principio del bloque de la funcion. Por tanto esta linea la deberiamos pasar arriba, y pasaria a ser la cuarta linea del codigo y la cuarta pasara a ser la quinta. Si nos fijamos bien, la variable z no se usa nunca en el codigo, por lo que esta linea de codigo puede ser eliminada, es otra opcion.
La sexta linea contiene un error en en nombre de la funcion:
flip-sign(p);
Ya que el simbolo - indica resta, por tanto esta linea lo que hace es restar de la variable flip el resultado de la funcion sign, esto es incorrecto ya que ni la variable flip ni la funcion sign estan declaradas, para corregir esto hay que cambiar el nombre de la funcion, por ejemplo podriamos poner:
flip_sign(p);
La septima linea no contiene errores, pero hace algo que no tiene sentido, esto es, imprimir en pantalla el valor de un puntero, es algo que no nos interesa por lo que cambiariamos la linea por esta otra:
printf("x=%d,y=%d,p=%d\n",x,y,*p);
La octava linea es correcta.
La novena linea de codigo tiene 2 errores, una es el nombre de la funcion como se ha explicado antes, y otra es la sentencia dentro de la funcion debe terminarse en ; por tanto la linea correcta seria:
flip_sign(int *n) {*n = -(*n);}

Por tanto contando los cambios, son 7 los cambios minimos para que el codigo sea ANSI y semanticamente correcto. El codigo final sera:

#include <stdio.h>

void main() {
int *p, x=5, y; /* init */
int z;
y = *(p = &x) +10;
flip_sign(p);
printf("x=%d,y=%d,p=%d\n",x,y,*p);
}
flip_sign(int *n) {*n = -(*n);}

Para comprobarlo podeis usar el gcc con las opciones "-ansi -pedantic" que hacen que se compile el codigo teniendo en cuenta el estandar ANSI mas estricto.

Hasta la proxima.

0 Comments:

Post a Comment

<< Home