Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





estructuras a funciones

Iniciado por SPARTANVS, 27 de Abril de 2008, 04:04:11 PM

« anterior - próximo »

SPARTANVS

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.

AK47


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);

Pogacha

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


Ojo que te falta un ; al final de la declaración de la estructura.

davur

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)
}

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?
-----
Juan Alba Maldonado

davur

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.

Pogacha

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

jalbam

Muchas grácias. Hay que ver lo que cambia la posición de dos palabras, ¿eh? :)
-----
Juan Alba Maldonado

tamat

yo lo haría así pero no se si en C se puede:

void alejandro(int& x)
{
  x += 30; // <---
}
Por un stratos menos tenso

jalbam

¿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.
-----
Juan Alba Maldonado


Buffon

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.

Tei

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?.

davur

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.

SPARTANVS

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






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.