Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: SPARTANVS en 27 de Abril de 2008, 04:04:11 PM

Título: estructuras a funciones
Publicado por: SPARTANVS en 27 de Abril de 2008, 04:04:11 PM
bueno, nunca habia tenido que pasar el valor de un miembro de una estructura como argumento a una funcion. Ahora, haciendo un jueguecito con SDL tengo que hacerlo, he hecho una pruba, pero para mi sorpresa me da errores. este es el codigo:


#include <stdio.h>

struct feo
{
int x;
int y;
int w;
int h;
}

struct olita
{
int estado;
feo atrib;
} ola[30];


void alejandro (int x)
{
x = x + 30;
}

void main()
{
ola[5].atrib.x = 8;

alejandro (ola[5].atrib.x);

printf ("%d", ola[5].atrib.x);
}


primero he puesto la estructura feo, despues la estructura olita, en la que uno de susu miembros es una estructura feo. tambien he creado un tabla (o matriz) de 30 estructuras olita.

para probar las funciones he creado una funcion llamada alejandro que accede a la estructura ola[5] y cambia le suma 30 a uno de sus miembros.

pero como ya dije antes me da errores.

GRACIAS, y perdon por ser tan novatillo, pero no lo encontraba en mi libro de C.
Título: estructuras a funciones
Publicado por: AK47 en 27 de Abril de 2008, 04:45:35 PM

void alejandro(int *x)
{
  *x += 30;
}


Si le pasas el parámetro por valor, que es lo que estás haciendo, no puedes modificarlo dentro de la función "alejandro". Por eso hay que pasar la dirección de la variable de la siguiente forma:


alejandro (&ola[5].atrib.x);
Título: estructuras a funciones
Publicado por: Pogacha en 27 de Abril de 2008, 05:06:22 PM
struct feo
{
  int x;
  int y;
  int w;
  int h;
}


Ojo que te falta un ; al final de la declaración de la estructura.
Título: estructuras a funciones
Publicado por: davur en 27 de Abril de 2008, 07:59:40 PM
El código completo con las correcciones necesarias para que compile sin errores y el programa funcione como cabría esperar marcadas (suponiendo un compilador de C99):

#include <stdio.h>

struct feo
{
int x;
int y;
int w;
int h;
}; // <---

struct olita
{
int estado;
struct feo atrib; // <---
} ola[30];


void alejandro(int* const x) // <---
{
*x += 30; // <---
}

int main() // <---
{
ola[5].atrib.x = 8;

alejandro(&ola[5].atrib.x); // <---

printf("%d\n", ola[5].atrib.x); // <---

return 0; // <--- (no es estrictamente necesario)
}
Título: estructuras a funciones
Publicado por: jalbam en 27 de Abril de 2008, 09:40:04 PM
Citarvoid alejandro(int* const x)

¿Para qué le has puesto const a la variable si luego modificas su valor? ¿Es porque nunca se modifica la dirección a la que apunta, a pesar de que se modifica el valor a donde apunta?
Título: estructuras a funciones
Publicado por: davur en 27 de Abril de 2008, 09:57:15 PM
Cita de: "jalbam"
Citarvoid alejandro(int* const x)

¿Para qué le has puesto const a la variable si luego modificas su valor? ¿Es porque nunca se modifica la dirección a la que apunta, a pesar de que se modifica el valor a donde apunta?

x es un puntero constante a entero, que no un puntero a constante entera.

La función en cuestión modifica el valor apuntado por el puntero, en ningún momento el valor del puntero mismo. Y qué mejor manera de reforzar nuestras intenciones al escribir código (en este caso, que intentar modificar el puntero genere un error de compilación) que hacer uso del soporte del lenguaje para ello.
Título: estructuras a funciones
Publicado por: Pogacha en 27 de Abril de 2008, 10:21:30 PM
Cita de: "jalbam"
Citarvoid alejandro(int* const x)

¿Para qué le has puesto const a la variable si luego modificas su valor? ¿Es porque nunca se modifica la dirección a la que apunta, a pesar de que se modifica el valor a donde apunta?
Si fuese
void alejandro(const int* x)
No podrias modificar el valor de lo que hay en la direccion de memoria x, pero si a donde apunta x;
x++; // valido
*x = 0; // invalido

Saludos
Título: estructuras a funciones
Publicado por: jalbam en 27 de Abril de 2008, 10:34:24 PM
Muchas grácias. Hay que ver lo que cambia la posición de dos palabras, ¿eh? :)
Título: estructuras a funciones
Publicado por: tamat en 28 de Abril de 2008, 12:28:19 AM
yo lo haría así pero no se si en C se puede:

void alejandro(int& x)
{
  x += 30; // <---
}
Título: estructuras a funciones
Publicado por: jalbam en 28 de Abril de 2008, 01:08:08 AM
¿Qué diferencia habría con & en lugar de *? Sólo había visto & para pasar la dirección a una función, no para recibirla.
Título: estructuras a funciones
Publicado por: Pogacha en 28 de Abril de 2008, 02:02:38 AM
Eso es C++.
En C++ existe lo que se llama referencia.

En C eso no se puede hacer.

http://www.mailxmail.com/curso/informatica/cplusplus/capitulo12.htm
http://arco.inf-cr.uclm.es/~david.villa/pensar_en_C++/products/vol1/ch03s04s06.html
http://www.zator.com/Cpp/E4_4_5.htm
Título: estructuras a funciones
Publicado por: Buffon en 28 de Abril de 2008, 11:20:50 AM
no dais tiempo al resto a contestar >.<

SPARTANVS mirate un buen libro de C antes de continuar haciendo juegos ^^, que cuando se complique la programación te vas a ver atascado.
Título: estructuras a funciones
Publicado por: Tei en 28 de Abril de 2008, 01:56:49 PM
algunos cambios que yo haria..



void alejandro(int*  x)  {  //mejor K&R
x[] += 30; // me mola mas [] que *, supongo que compilara
}

//de todos modos prefiero las funciones que los precedimientos

int carmencita(int x) {
 return x+ MAX_TREINTA;//no magia!. la magia atrae a tamat, y luego lloramos
}

void main()  { // mejor void, y que le follen a los OS tipo unix

ola[5].atrib.x = 8;
alejandro( &(ola[5].atrib.x)  ); // el parentesis es pedanteria

       ola[5].atrib.x = carmencita( ola[5].atrib.x ); //¿porque?, porque yo lo valgo.

printf("%d\n", ola[5].atrib.x);

}


por cierto, ¿que davur eres?, ¿no seras el davur que yo conocia, un tio que estudiaba en zaragoza, uno que tenia coleta?.
Título: estructuras a funciones
Publicado por: davur en 28 de Abril de 2008, 04:07:04 PM
Cita de: "Tei"por cierto, ¿que davur eres?, ¿no seras el davur que yo conocia, un tio que estudiaba en zaragoza, uno que tenia coleta?.

Pues la verdad es que no, Tei.
Título: estructuras a funciones
Publicado por: SPARTANVS en 28 de Abril de 2008, 04:17:53 PM
DIOS MIO que cantidad de respuesta....jja, ya me ha quedado claro y me funciona perfe. al que me ha dicho que consiga un libro, ya loo tengo y bueno pero no encontraba esto y valla ahora si lo he encontrado  :)

MUCHAS GRACIAs, este foro da gusto, preguntas algo y nosolo te la ocntesta sino que te enteras de 100 cosas mas  :D
Título: estructuras a funciones
Publicado por: jalbam en 29 de Abril de 2008, 09:45:31 PM
Muchas gracias Pogacha :) Por lo que veo es lo mismo que un puntero pero sin poder cambiar hacia donde apunta.