| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
xtremecopy
Registrado: 05 Oct 2007 Mensajes: 28
| Publicado: 18/11/2007 5:02 pm | | | Título: Que imprime esto?.. |
| Gente , se ve que tengo algun problema con mis compiladores de C en general proque , me esta tirando errores inexistentes.. o que son muy "bobos" como para que me de cuenta.., o las horas que hace que toy compilando ya no me doy cuenta..pero alguien me podria hacer el favor de decirme que imprime , esto..
Lenguaje C. Compilador DevC++
| Código: | #include<stdio.h> #include<conio.h> #include <stdlib.h> #define PR(formato,valor)printf("valor=%"formato"\t",(valor)) #define NL printf("\n") #define PRINT1 (f,x1)PR(f,x1);NL #define PRINT2 (f,x1,x2)PR(f,x1);PRINT1(f,x2) #define PRINT3 (f,x1,x2,x3)PR(f,x1);PRINT2(f,x2,x3) #define PRINT4 (f,x1,x2,x3,x4)PR(f,x1);PRINT3(f,x2,x3,x4) #define PRINT5 (f,x1,x2,x3,x4,x5)PR(f,x1);PRINT4(f,x2,x3,x4,x5)
int a[]={0,1,2,3,4}; int *p[]={a,a+1,a+2,a+3,a+4}; int **pp=p;
main() {clrscr(); PRINT2("d",a,*a); PRINT3("d",p,*p,**p); PRINT3("d",pp,*pp,**pp); NL; pp++; PRINT3("d",pp-p,*pp-a,**pp);
*pp++; PRINT3("d",pp-p,*pp-a,**pp);
*++pp; PRINT3("d",pp-p,*pp-a,**pp);
++*pp; PRINT3("d",pp-p,*pp-a,**pp); NL;
pp=p; **pp++; PRINT3("d",pp-p,*pp-a,**pp);
*++*pp; PRINT3("d",pp-p,*pp-a,**pp);
++**pp; PRINT3("d",pp-p,*pp-a,**pp); NL;
PRINT5("d",a[0],a[1],a[2],a[3],a[4]); NL; system("PAUSE"); return EXIT_SUCCESS; } |
Abrazooo |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 3943 Ubicación: Mexico
| Publicado: 18/11/2007 8:02 pm | | | Título: |
| El error principal es el espacio entre el nombre de esas macros y su lista de argumentos ("PRINT1" y "(f,x1)" en la primera):
| Código: | #define PRINT1 (f,x1)PR(f,x1);NL #define PRINT2 (f,x1,x2)PR(f,x1);PRINT1(f,x2) #define PRINT3 (f,x1,x2,x3)PR(f,x1);PRINT2(f,x2,x3) #define PRINT4 (f,x1,x2,x3,x4)PR(f,x1);PRINT3(f,x2,x3,x4) #define PRINT5 (f,x1,x2,x3,x4,x5)PR(f,x1);PRINT4(f,x2,x3,x4,x5) |
Deberia ser:
| Código: | #define PRINT1(f,x1)PR(f,x1);NL #define PRINT2(f,x1,x2)PR(f,x1);PRINT1(f,x2) #define PRINT3(f,x1,x2,x3)PR(f,x1);PRINT2(f,x2,x3) #define PRINT4(f,x1,x2,x3,x4)PR(f,x1);PRINT3(f,x2,x3,x4) #define PRINT5(f,x1,x2,x3,x4,x5)PR(f,x1);PRINT4(f,x2,x3,x4,x5) |
Los demas errores se generan al tratar de imprimir el valor de un puntero con el indicador de formato "%d", para los punteros el indicador debe ser "%p" y el puntero se debe convertir explicitamente al tipo "void *". Por ejemplo:
| Código: | int a[] = {1, 2, 3};
/* ... */
printf("a == %p\n", (void *) a); |
Lo mas sencillo para corregir esos errores es eliminar todas esas macros y en su lugar utilizar directamente printf con (segun se requiera) los indicadores "%d" y "%p".
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | xtremecopy
Registrado: 05 Oct 2007 Mensajes: 28
| Publicado: 19/11/2007 2:36 am | | | Título: |
| | Código: | #include <stdio.h> #include <conio.h> #include <stdlib.h> #define PR(formato,valor)printf("valor=%"formato"\t",(valor)) #define NL printf("\n") #define PRINT1(f,x1)PR(f,x1);NL #define PRINT2(f,x1,x2)PR(f,x1);PRINT1(f,x2) #define PRINT3(f,x1,x2,x3)PR(f,x1);PRINT2(f,x2,x3) #define PRINT4(f,x1,x2,x3,x4)PR(f,x1);PRINT3(f,x2,x3,x4) #define PRINT5(f,x1,x2,x3,x4,x5)PR(f,x1);PRINT4(f,x2,x3,x4,x5)
int a[]={0,1,2,3,4}; int *p[]={a,a+1,a+2,a+3,a+4}; int **pp=p;
main()
{ PRINT2("d",a,*a); PRINT3("d",p,*p,**p); PRINT3("d",pp,*pp,**pp); NL;
pp++; PRINT3("d",pp-p,*pp-a,**pp);
*pp++; PRINT3("d",pp-p,*pp-a,**pp);
*++pp; PRINT3("d",pp-p,*pp-a,**pp);
++*pp; PRINT3("d",pp-p,*pp-a,**pp); NL;
pp=p; **pp++; PRINT3("d",pp-p,*pp-a,**pp);
*++*pp; PRINT3("d",pp-p,*pp-a,**pp);
++**pp; PRINT3("d",pp-p,*pp-a,**pp); NL;
PRINT5("d",a[0],a[1],a[2],a[3],a[4]); NL; system("PAUSE"); return EXIT_SUCCESS; } |
Quite el "Clrscr()", porque me tiraba un error , y corregi el tema de las macros , compila y corre bien , gracias pero me podrias decir , que es eso? , tiene sentido.. :S ? |
| | Volver arriba | |  | | rir3760

Registrado: 01 Oct 2004 Mensajes: 3943 Ubicación: Mexico
| Publicado: 19/11/2007 7:08 am | | | Título: |
| Tiene sentido porque es un programa para (al menos en teoria) practicar el uso de punteros.
No es correcto porque, como ya te comente, no se puede utilizar el mismo indicador de tipo "%d" para imprimir tanto enteros de tipo "int" como punteros.
Por ultimo es un muy buen ejemplo de como no utilizar las macros ya que de la forma en que son utilizadas no clarifican el codigo, por el contrario el codigo termina casi como uno de esos ejemplos de codigo ofuscado.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | david_celta
Registrado: 02 Jun 2005 Mensajes: 161
| Publicado: 19/11/2007 1:11 pm | | | Título: |
| | Cita: | Por ultimo es un muy buen ejemplo de como no utilizar las macros |
Cierto, pero asi es la permisibilidad de C/C++ _________________ In all your fantasies, you always knew that man and mystery...
...were both in you... |
| | Volver arriba | |  | xtremecopy
Registrado: 05 Oct 2007 Mensajes: 28
| Publicado: 19/11/2007 1:46 pm | | | Título: |
| Muchas gracias amigos , me quedo todo mas claro..
Mil gracias.. |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|