Autor Tema: Ayuda para armar función con puntero  (Leído 2025 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Ayuda para armar función con puntero
« en: 30 de Mayo de 2013, 17:27:35 »
Hola a todos, pues tengo un problema al intentar armar una función en c18, la verdad que el tema de los punteros no lo domino mucho, es un concepto un poco abstracto y me cuesta un poco entenderlo, sobre todo cuando intentas meter un puntero en una función y que el resultado de la ejecución de esa función lo tengas en una variable en otra función diferente.

lo que estoy intentando es:
en main.c tengo una variable llamada por ejemplo. inicio y quiero que se guarde un valor llamado fin que hay en una función llamada prueba()

de la manera que lo hago yo es:

Código: [Seleccionar]
main.c()
  {
char inicio;

prueba(inicio);

void prueba(char *fin)
     {
      fin = 0x01;
     }

El error que meda al compilar es este:
44:Error [1131] type mismatch in assignment

Si alguien me puede hechar una mano a comprender este tema...
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Ayuda para armar función con puntero
« Respuesta #1 en: 30 de Mayo de 2013, 18:01:15 »


Si en la función prueba esperas recibir una dirección para cargarla en un puntero, tendrás que enviarle también una dirección de memoria, y no un valor como has hecho tú (campo inicio).   Inténtalo con  prueba(&inicio); , de esa manera le enviarás a la función, la dirección de memoria que ocupa la variable inicio.


« Última modificación: 30 de Mayo de 2013, 18:04:23 por planeta9999 »

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Ayuda para armar función con puntero
« Respuesta #2 en: 30 de Mayo de 2013, 18:48:07 »
Me sigue dando el error de
44:Error [1131] type mismatch in assignment

no logro entender del todo el tema de los punteros en las funciones, se que el mensaje es que o coinciden las asignaciones pero haga lo que haga si pongo el puntero en la función no me funciona
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda para armar función con puntero
« Respuesta #3 en: 30 de Mayo de 2013, 18:56:48 »
Si la función es:

Código: [Seleccionar]
void funcion( char *Test){

    *Test=0x01; // Se asigna 0x01 a lo que apunta Test
}

Para llamarlo haces:

Código: [Seleccionar]
char myVar;

funcion(&myVar); // Aquí se le da la dirección de myVar y no su valor.
// Luego de ejecutar funcion, myVar debería de tener el valor 0x01


Así debería de funcionar  :undecided:


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

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Ayuda para armar función con puntero
« Respuesta #4 en: 30 de Mayo de 2013, 19:02:44 »
Es simple, te explico:

char inicio: este asigna una direccion de memoria reservada para esta variable, es decir, reservamos 8bits y lo nombramos como "inicio".

prueba(inicio): esto esta mal, estas diciendole el contenido de inicio, no la direccion de memoria, para ello se utiliza el & delante del nombre, lo que le das con el & delante es la direccion de memoria de "inicio", bien escrito seria prueba(&inicio);

void prueba(char *fin): estas diciendo que el parametro sera un puntero, nada del otro mundo.

fin=0x01: esto estaria tambien mal, lo que estas haciendo es decir que el parametro se refiera a la direccion 0x01, es decir, le asignas al puntero la direccion 0x01 no el valor, para ello tendrias que usar *fin=0x01;

*fin=0x01 (ya arreglado): con esto le estas diciendo que al contenido de la direccion de fin (en este caso contiene la direccion de "inicio") sea 0x01, es decir, al final char inicio contendria 0x01.

Tienes que tener en cuenta varias cosas, muchas veces los compiladores al optimizar el codigo trabajan con variables temporales y no con direcciones de memoria, para asignarle realmente una direccion de memoria ram lo debes poner en el global (fuera del main) o bien ponerle "static" delante de "char", asi le dices que la variable sera estatica.

Espero que te haya servido de ayuda, suele ser complicado al principio, pero una vez lo entiendes es muy sencillo. Un puntero almacena "una direccion de memoria" y ya con ella hacemos lo que queramos. Si por ejemplo inicio esta en la direccion 0x50 entonces al poner &inicio obtendras el valor 0x50. Ahora bien, "fin" contiene almacenado la direccion 0x50, al ponerle *fin=0x01 lo que le estamos diciendo que a la direccion 0x50 le ponga el valor 0x01.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Ayuda para armar función con puntero
« Respuesta #5 en: 01 de Junio de 2013, 22:59:31 »
Buenas a todos, pues si me ha servido lo que me han contado, pero cuando intento esto con arrays veo que funciona de forma diferente o eso creo ya que para que me funcione tengo que hacerlo de esta manera:

Código: [Seleccionar]
void funcion( char *Test){
Test=0x01; // Lo mismo que el ejemplo antrior pero sin *
}

Código: [Seleccionar]
char myVar;
funcion(&myVar); // Y de esta forma sería para que funcionara con array
// Luego de ejecutar funcion, myVar debería de tener el valor 0x01

corrijan me si me equivoco.

Otro problema que tengo y este no sé si será del compilador o algo me ha parecido leer, es que intento hacer lo mismo con CCS C v1.40 y me da problemas.
Al intentar pasar un puntero a una función, pero sin array si no una variable normal, ósea de la manera que me habéis explicado, me da problemas.
La primera pasada si me asigna el valor pero al cambiar el valor y pasar de nuevo por la función, esta no lo pasa y se queda con el valor anterior.

El ejemplo es el mismo del principio.

¿que puede ser?
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Ayuda para armar función con puntero
« Respuesta #6 en: 02 de Junio de 2013, 00:31:21 »
pon el codigo, los arrays tienes que tener en cuenta cuando poner los []

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Ayuda para armar función con puntero
« Respuesta #7 en: 02 de Junio de 2013, 09:10:28 »
Buenas a todos, pues si me ha servido lo que me han contado, pero cuando intento esto con arrays veo que funciona de forma diferente o eso creo ya que para que me funcione tengo que hacerlo de esta manera:

Código: [Seleccionar]
void funcion( char *Test){
Test=0x01; // Lo mismo que el ejemplo antrior pero sin *
}

Código: [Seleccionar]
char myVar;
funcion(&myVar); // Y de esta forma sería para que funcionara con array
// Luego de ejecutar funcion, myVar debería de tener el valor 0x01


Eso no debería de funcionar, estás actualizando el puntero, y no el valor almacenado en la dirección a la que apunta el puntero.



Citar
Otro problema que tengo y este no sé si será del compilador o algo me ha parecido leer, es que intento hacer lo mismo con CCS C v1.40 y me da problemas.
Al intentar pasar un puntero a una función, pero sin array si no una variable normal, ósea de la manera que me habéis explicado, me da problemas.
La primera pasada si me asigna el valor pero al cambiar el valor y pasar de nuevo por la función, esta no lo pasa y se queda con el valor anterior.


Si estás pasando el puntero a un array, creo que tienes que pasar la dirección del primer elemento del array, así lo tengo yo en mis programas y funciona perfectamente.
En tu ejemplo, sería algo así:

char myVar [ x]; // reemplaza x por el nº de elementos del array
funcion(&myVar[0]);

void funcion( char *Test)
{
   *Test=0x01;
}



Si quieres actualizar varios elementos del array, tendrás que ir incrementando el puntero, dentro de la función:

Test++;






Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Ayuda para armar función con puntero
« Respuesta #8 en: 09 de Junio de 2013, 14:36:28 »
Hola, siento la tardanza pero he estado muy liado

todo el código no lo puedo poner ya que es mucho pero si pongo lo que se refiere a la pregunta que hago.

el código que voy a poner es de la manera que leo un array contenido dentro de la memoria eeprom del chip

esto lo pondría en el main.c

Código: [Seleccionar]
//Lectura de la eeprom y la guardamos en un array
Read_Internal_Eeprom(longitud, direccion, &array_read);

y esta es la función a la que llamo.

Código: [Seleccionar]
void Read_Internal_Eeprom(char wLeng, int address_eep, char *array_read_eep)
{
unsigned char i;

for(i=0;i<wLeng;i++)  //Bucle para la lectura de la eeporm en su posición correspondiente
{
Busy_eep();    //Se espera a que el buffer esté libre
array_read_eep[i] = Read_b_eep(address_eep++);
}
array_read_eep[wLeng-1] = '\0'; //Añadimos el carácter null al final de la cadena, si la longitude
//de la cadena es 9, tendremos que restar 1 para que el carácter NULL
//coincida con el fin de la cadena
}

de esta manera funciona el puntero perfectamente, no sé si será lo correcto pero de la otra manera me da problemas
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...


 

anything