Problemilla con paso de datos en C

resulta que estoy recoguendo unos datos en un struct de este tipo

typedef struct {
uint8_t uno[2];
}mystruct;


bueno ese struct como muestra y funcion tipo esto

void myfuncion(mystruct *ms){
ms->uno[0]=35;
ms->uno[1]=75;
}


y bueno a la funcion la llamo de esta forma

mystruct ff;

myfuncion(&ff);


el problema es que me devuelve cosas raras y la no se si lo estoy haciendo bien,pondria mi codigo pero estoy con el movil y bueno es tipo lo que he escrito.
he hecho esta prueba rápida con un compilador online de C y el código funciona perfectamente, que problema tienes concretamente? Asegurate estés accediendo correctamente a la estructura. Poco mas se te puede decir con lo que has puesto.

#include <stdio.h>
#include <stdint.h>

typedef struct {
    uint8_t uno[2];
}mystruct;

void myfuncion(mystruct *ms){
    ms->uno[0]=35;
    ms->uno[1]=75;
}

int main()
{
    mystruct ff;
    myfuncion(&ff);
    printf("%d\n", ff.uno[0]);

    return 0;
}

Bueno el caso es que hago uso de por ejemplo ms->uno[0] antes de darle un valor y como no esta inicializado por ello me fallaba, si lo inicializo a 0 antes funciona bien, he intentado creame un contructor dentro del struct pero me marca error todo el rato y no puedo.

typedef struct mystruct{
mystruct():uno(0){}
uint8_t uno;
}mystruct;
desal escribió:Bueno el caso es que hago uso de por ejemplo ms->uno[0] antes de darle un valor y como no esta inicializado por ello me fallaba, si lo inicializo a 0 antes funciona bien, he intentado creame un contructor dentro del struct pero me marca error todo el rato y no puedo.

typedef struct mystruct{
mystruct():uno(0){}
uint8_t uno;
}mystruct;

Helloooo? Es un data type.
Un data type no puede tener valores, solo sus instancias.

El ejemplo de @Thalandor es el correcto. Lo mejor es tener una función para inicializarla con los valores por defecto que sean.

A parte, imagina por un momento que eso que has puesto funcionase como si de una función recursiva se tratara. Primero deberías llamar al struct desde fuera y luego qué... eso se quedaría en bucle infinito llamándose a sí mismo?
desal escribió:Bueno el caso es que hago uso de por ejemplo ms->uno[0] antes de darle un valor y como no esta inicializado por ello me fallaba, si lo inicializo a 0 antes funciona bien, he intentado creame un contructor dentro del struct pero me marca error todo el rato y no puedo.

typedef struct mystruct{
mystruct():uno(0){}
uint8_t uno;
}mystruct;


Exacto. Si llamas a una dirección de memoria antes de inicializarla, puede contener cualquier cosa (y por pantalla puede mostrarte basura, un número cualquiera, etc).

En cuanto a un constructor, el struct es un tipo de dato y no tiene memoria asignada, ya que no es una instancia. Las instancias sí puedes inicializarlas. En C# (y creo que en C++ también) sí que hay constructores para los struct, pero en C no me suena.

Lo que puedes hacer es asignar un valor en cuanto instancies.
Por ejemplo

mystruct ff;
ff.uno[0]=0;
ff.uno[1]=0;

Si quieres, te puedes hacer una función que haga esto por ti, en caso de tener muchos parámetros a iniciar.

void InicializarMyStruct(mystruct *ff)
{
ff->uno[0]=0;
...
}
Si, al final me toco iniciarlizarlo, lo suponía pero como buscando por la red me ponía esa forma de hacerlo...bueno problema resuelto gracias
5 respuestas