/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Que imprime esto?..

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
xtremecopy



Registrado: 05 Oct 2007
Mensajes: 28

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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 Smile , gracias pero me podrias decir , que es eso? , tiene sentido.. :S ?
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3943
Ubicación: Mexico

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 19/11/2007 1:46 pm
Título:

Muchas gracias amigos Smile , me quedo todo mas claro..

Mil gracias..
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com