Autor Tema: el tema de los punteros...  (Leído 19885 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: el tema de los punteros...
« Respuesta #30 en: 12 de Agosto de 2009, 17:50:53 »
Esto es inválido en cualquier compilador de C:

Código: [Seleccionar]
displayString("HOLA");
Debes armar el string y después pasar un puntero.

Hola Santi. Hasta donde yo se, si se puede pasar un string a una funcion de esa forma (en cualquier compilador de C estandar).
Lo q hace el compilador es generar un puntero q apunta al pedazo de codigo donde esta escrito el "HOLA" o lo que sea. El tema es q estos son punteros estaticos y no podemos cambiar su valor (el lugar a donde apuntan). Si nuestra funcion va a operar sobre ese puntero, ahi si habria q hacer una igualacion de punteros o una copia del string.
saludos!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: el tema de los punteros...
« Respuesta #31 en: 12 de Agosto de 2009, 18:50:58 »
Mmmhh... ando confundido  :D

Hace daño usar tanto C#... me confundo con los strings y chars  :oops:

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: el tema de los punteros...
« Respuesta #32 en: 12 de Agosto de 2009, 19:29:04 »
Jejeje, casi todos los productos de M$ hacen daño :P

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado Trev

  • PIC16
  • ***
  • Mensajes: 115
Re: el tema de los punteros...
« Respuesta #33 en: 27 de Agosto de 2009, 23:21:46 »
Hola tengo una duda  :(,haber si alguien me la despeja :lol: ,porque al principio de este post alguien dijo que si no se le pasaban parametros por referencia a una función esta no podia modificar el valor de variables locales a main(q quisieramos pasar a esa función)pero q esto se podia solucionar usando variables globales(o bien los punteros claro) entonces yo pienso q no hay diferencia entre estos dos programas:(uso dev c++ para probar rápido la salida)


Código: [Seleccionar]

#include <stdio.h>


int suma(int a,int b)
{
int c;
c=a+b;
a=4;
b=8;
return(c);
}
 
main()
{
                                 int var,var2,resultado;

var1=2;
var2=3;
printf("%d %d\n\n",var1,var2); //Las variables antes de llamar a suma.
resultado=suma(var1,var2);
printf("El resultado de la suma es %d\n",resultado);
printf("%d %d\n\n",var1,var2); //El valor de las variables no
//se modifica dentro de main porq pasan por valor a la función suma.
getchar();
return(0);
}
O sea en este programa con variables locales a main var1 no es =4 ni var2=8.Lo mismo
que en este otro programa en donde pongo a las variables como globales..
Código: [Seleccionar]
#include <stdio.h>
int var1,var2,resultado; //Variables globales ahora

int suma(int a,int b)
{
int c;
c=a+b;
a=4;
b=8;
return(c);
}
 
main()
{
int var1,var2; //Son locales a main.
int resultado;
var1=2;
var2=3;
printf("%d %d\n\n",var1,var2); //Las variables antes de llamar a suma.
resultado=suma(var1,var2);
printf("El resultado de la suma es %d\n",resultado);
printf("%d %d\n\n",var1,var2); //El valor de las variables tampoco
//se modifica dentro de main por mas q ahora sean globales
getchar();//espera q se pulse un caracter del teclado
return(0);
}
Solo las modificaria haciendo algo asi si uso globales(ademas de los punteros claro)

int suma(int a,int b)
{
int c;
c=a+b;
var1=4;
var2=8;
return(c);
}
lo cual no tiene sentido porq seria una función exclusiva de dos variables,entonces esa es mi duda,Gracias espero se haya entendido lo q quise decir
   

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: el tema de los punteros...
« Respuesta #34 en: 27 de Agosto de 2009, 23:37:35 »
Si vas a usar variables globales, ya no es necesario pasarselas a la funcion.
por ej:

Código: [Seleccionar]
#include <stdio.h>
int a,b;
int suma()
{
   return (a+b);
}

int main()
{
   a=4;b=2;
   printf("%d\n", suma() );  //esto deberia dar 6
}

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: el tema de los punteros...
« Respuesta #35 en: 19 de Octubre de 2009, 16:54:15 »
Que tal amigos!
Creo que llego un poco tarde a la funcion  :D
Pero de todas formas colocare mi granito de arena por si a alguien le sirve  :mrgreen:
Lo que dice migsantiago con respecto a pasar un string directamente a una funcion lo probe y es como el dice da error  :shock:
Por eso les coloco un ejemplito que lo he probado y funciona fino, de como pasar un string a una funcion utilizando punteros!.
Citar
#include <16F876a.h>
#device adc = 10
#use delay (CLOCK = 4000000)
#fuses XT,NOWDT,NOLVP

#define LCD_DB4   PIN_B4
#define LCD_DB5   PIN_B5
#define LCD_DB6   PIN_B6
#define LCD_DB7   PIN_B7

#define LCD_RS    PIN_C0
#define LCD_RW    PIN_C1
#define LCD_E     PIN_C2

#include <flex_lcd420.c>

void mostrar(char*ptr)

   while(*ptr)
   {
      printf(lcd_putc,"%c",*ptr);
      ptr++;
   }   
}


void main()
{
   char str1[21]="HOLA_TODOPIC";
   lcd_init();
   printf(lcd_putc,"Probando\n");
   mostrar(str1);
   
}

Les adjunto la foto del circuito en accion  :mrgreen:

Saludos

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: el tema de los punteros...
« Respuesta #36 en: 19 de Octubre de 2009, 17:49:42 »
Otro ejemplito mas de como pasar una variable a una funcion por referencia  :mrgreen:

Citar
//En este caso muestro como pasar una variable por referencia a una funcion ulizando el &,
//luego dentro de la funcion muestro el valor de la variable y paso seguido modifico su valor
// original('R') y lo cambio por una 'H'
//para despues dentro del main mostrar su nuevo valor!
//!Este metodo no sirve para pasar un array o string¡  ;)
#include <16F876a.h>
#device adc = 10
#use delay (CLOCK = 4000000)
#fuses XT,NOWDT,NOLVP

#define LCD_DB4   PIN_B4
#define LCD_DB5   PIN_B5
#define LCD_DB6   PIN_B6
#define LCD_DB7   PIN_B7

#define LCD_RS    PIN_C0
#define LCD_RW    PIN_C1
#define LCD_E     PIN_C2

#include <flex_lcd420.c>


void mostrar (char & ptr);

void main()
{
   char str1= 'R';
   lcd_init();
   printf(lcd_putc,"Probando\n");
   mostrar(str1);
   printf(lcd_putc,"%c",str1);
   
}

void mostrar(char & ptr)

      printf(lcd_putc,"%c\n",ptr);
      ptr='H';
}

Saludos

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: el tema de los punteros...
« Respuesta #37 en: 20 de Octubre de 2009, 16:19:11 »
buenos ejemplos RALF, ya tomé nota

y ahora viendo ello me da mucha curiosidad lo siguiente:

void mostrar (char & ptr);
void mostrar (char * ptr);

cual es la diferencia en hacerlo de una u otra forma?? yo generalmente uso la segunda

saludos.
.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: el tema de los punteros...
« Respuesta #38 en: 20 de Octubre de 2009, 16:55:42 »
buenos ejemplos RALF, ya tomé nota

y ahora viendo ello me da mucha curiosidad lo siguiente:

void mostrar (char & ptr);
void mostrar (char * ptr);

cual es la diferencia en hacerlo de una u otra forma?? yo generalmente uso la segunda

saludos.


Aquí una respuestas del maestro RICHI al respecto  ;-)

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: el tema de los punteros...
« Respuesta #39 en: 20 de Octubre de 2009, 18:22:34 »
mmm ya veo, en el fondo es lo mismo entonces, solo que hay que tener cuidao con su sintaxis entonces, para llamar a la función en el cualquier caso no hace falta colocar ni & ni * en el parámetro, no?

bien bien, no uso muchas veces punteros, y cuando los uso si que ayudan, y se me olvida rápido algunos detalles jeje

saludos, gracias por la respuesta suky

.

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: el tema de los punteros...
« Respuesta #40 en: 20 de Octubre de 2009, 22:36:51 »
Que tal amigos!
cryn hay dos detalles en los ejemplos que coloque en iuno pase un array (string) por referencia a una funcion y en el otro ejemplo pase una variable por referencia a una funcion.
Se parecen pero no son iguales  :shock:
si vas a pasar un string por referencia a una funcion debes colocar dentro de los parametros de la funcion el *. Pero si vas a pasar es una variable a una funcion puedes hacerlo de dos maneras:
Una la que te coloque usando el & como parametro de la funcion la otra es como dice richi  :mrgreen:
yo iva a colocar otro ejemplo de ello pero me imagine que no hacia falta  :mrgreen:
aplicando el metodo que usa richi y que es mas conocido.  :mrgreen:

Bueno cualquier duda estamos por aqui  ;-)
Ah y los punteros son muy utilies no los olvides te ayudan muchisimo!

Saludos

Desconectado lucaspascual

  • PIC10
  • *
  • Mensajes: 31
Re: el tema de los punteros...
« Respuesta #41 en: 02 de Mayo de 2013, 18:45:46 »
Buenas tardes, estoy haciendo un proyecto para introducir en el pic los datos de un calibre digital, el programa para tomar 8 bits de datos esta hecho, pero ahora cuando quiero visualizarlo en lcd no pasa nada, me parece q es un problema de donde inicializo el lcd(dentro de la interrupcion o fuera). y falta de uso de punteros puede ser cierto esto?
Este es el programa.
Espero q me puedan ayudar. Saludos

#include <16f877.h>
#fuses hs,nowdt,put,nowrt,nolvp,noprotect
#use delay(clock=20000000)
#use fast_io(b)
#include <lcd.c>
int8 dato;

#int_ext

ext_isr()
{
 
delay_us(496);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1)
bit_set(dato,0);
else
bit_clear(dato,0);
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1)
bit_set(dato,1);
else
bit_clear(dato,1);
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1)
bit_set(dato,2);
else
bit_clear(dato,2);
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1)
bit_set(dato,3);
else
bit_clear(dato,3);
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1)
bit_set(dato,4);
else
bit_clear(dato,4);
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1)
bit_set(dato,5);
else
bit_clear(dato,5);
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1)
bit_set(dato,6);
else
bit_clear(dato,6);
delay_us(12);
output_high(pin_b7);
output_low(pin_b7);
if (input(pin_b1)==1)
bit_set(dato,7);
else
bit_clear(dato,7);
printf(lcd_putc,"\f%u",dato);

}

void main()
{

lcd_init();
set_tris_b(0x03);
output_low(PIN_B7);
port_b_pullups(true);
enable_interrupts(int_ext);
ext_int_edge(l_to_h);
enable_interrupts(global);

while(1)
{
 
}
}


 

anything