Ayuda novato en C con una struct

Buenas, estoy practicando con structs en C y no me aclaro muy bien (vengo de Java y C#), el caso es que tengo lo siguiente:

#define Max 300
typedef struct linea {
         int numero;
         char nombre [100];
         int nota;
} Persona [Max];


y lo que quiero hacer es acceder a los datos, para operar con ellos según necesite.
Por ejemplo si creo funciones donde le pase los datos de forma similar a esta:

void funcion(Persona p){

}


Para hacer diferentes cosas con esta struct, se me ocurren funciones para calcular la nota media, la más frecuente y cosas así pero mi problema es como accedo a los datos en un array de struct. :-|
Suponiendo que dentro de main(), por ejemplo, defines un array de tipo Persona:

Persona personas[300];


simplemente le pasas un "persona" a la funcion "funcion()":

personas[0].numero = 77;

funcion(personas[0]);



P.D.- si te gusta trabajar con objetos, mejor C++, a no ser que quieras C por algo concreto.
int main()
{
     int notaMedia = 0; // o float
     for( int i=0; i < (sizeof(Persona)/sizeof(Persona[0])); i++ )
     {
          notaMedia += Persona[i].nota;
     }
     notaMedia /= (sizeof(Persona)/sizeof(Persona[0]));

     printf("%i",notaMedia);
}


Consejos:
1) Separa las definiciones (.h) de la instancias (.c,.cpp).
2) Usa tipos de tamaño "indefinido" como listas y [clases] strings. Por ejemplo la librería STD.
3) Para trabajar con datos mejor c++
Lo de trabajar con C++ no tiene razon alguna, se te simplifican un poco las cosas: pero son dos lenguajes distintos.
Es un typedef struct, por lo que simplemente se crea un tipo que en este caso es un array de estructuras.
En algún sitio del programa ha de crearse la 'variable'
....
Persona varPersona;
.....


Un ejemplo probado:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//Declaro un tipo de estructura
#define Max 300
typedef struct linea {
         int numero;
         char nombre [100];
         int nota;
} Persona [Max];


//declaro y defino función
void funcion(Persona p){
printf("%s\n",p[200].nombre);
strcpy(p[200].nombre,"nombre 200 corregido");
}


main()
{
Persona varPersona;//declaro y defino variable tipo Persona que es un array de estructuras

strcpy(varPersona[200].nombre,"nombre 200");

funcion(varPersona);// llamo a la función pasando la variable

printf("%s\n",varPersona[200].nombre);
}

waldeska escribió:
Un ejemplo probado:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//Declaro un tipo de estructura
#define Max 300
typedef struct linea {
         int numero;
         char nombre [100];
         int nota;
} Persona [Max];


//declaro y defino función
void funcion(Persona p){
printf("%s\n",p[200].nombre);
strcpy(p[200].nombre,"nombre 200 corregido");
}


main()
{
Persona varPersona;//declaro y defino variable tipo Persona que es un array de estructuras

strcpy(varPersona[200].nombre,"nombre 200");

funcion(varPersona);// llamo a la función pasando la variable

printf("%s\n",varPersona[200].nombre);
}



¿No te falta el prototipo de la función? Sino recuerdo mal mis años de C jaja
er_gallar escribió:
¿No te falta el prototipo de la función? Sino recuerdo mal mis años de C jaja

Lo que llamas prototipo yo lo llamo declaración(mas o menos).
Si defines una función antes de su uso, esta te sirve como declaración/prototipo.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//Declaro un tipo de estructura
#define Max 300
typedef struct linea {
         int numero;
         char nombre [100];
         int nota;
} Persona [Max];


//declaro  función
void funcion(Persona p);


main()
{
Persona varPersona;//declaro y defino variable tipo Persona que es un array de estructuras

strcpy(varPersona[200].nombre,"nombre 200");

funcion(varPersona);// llamo a la función pasando la variable

printf("%s\n",varPersona[200].nombre);
}

//Defino función
void funcion(Persona p){
printf("%s\n",p[200].nombre);
strcpy(p[200].nombre,"nombre 200 corregido");
}



Fe de Erratas
Utilizo erroneamente los comentarios de C++ '//' como comentarios de C (/* ... */). Ya lo sé.
waldeska escribió:
er_gallar escribió:
¿No te falta el prototipo de la función? Sino recuerdo mal mis años de C jaja

Lo que llamas prototipo yo lo llamo declaración(mas o menos).
Si defines una función antes de su uso, esta te sirve como declaración/prototipo.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//Declaro un tipo de estructura
#define Max 300
typedef struct linea {
         int numero;
         char nombre [100];
         int nota;
} Persona [Max];


//declaro  función
void funcion(Persona p);


main()
{
Persona varPersona;//declaro y defino variable tipo Persona que es un array de estructuras

strcpy(varPersona[200].nombre,"nombre 200");

funcion(varPersona);// llamo a la función pasando la variable

printf("%s\n",varPersona[200].nombre);
}

//Defino función
void funcion(Persona p){
printf("%s\n",p[200].nombre);
strcpy(p[200].nombre,"nombre 200 corregido");
}



Fe de Erratas
Utilizo erroneamente los comentarios de C++ '//' como comentarios de C (/* ... */). Ya lo sé.


Cierto es la costumbre que tengo de poner los prototipos después de los define y las definiciones de las funciónes después del main.
er_gallar escribió:Cierto es la costumbre que tengo de poner los prototipos después de los define y las definiciones de las funciónes después del main.


Y así debería ser, pero siempre hay(y habrá) vagos como yo dispuestos a enredarlo todo con tal de escribir un par de lineas menos. [sonrisa]
dysoco escribió:Lo de trabajar con C++ no tiene razon alguna, se te simplifican un poco las cosas: pero son dos lenguajes distintos.

C es un subconjunto estricto de C++. La OO se adecua más a la forma de pensar humana, por eso se trabaja mejor.
Eteream escribió:
dysoco escribió:Lo de trabajar con C++ no tiene razon alguna, se te simplifican un poco las cosas: pero son dos lenguajes distintos.

C es un subconjunto estricto de C++. La OO se adecua más a la forma de pensar humana, por eso se trabaja mejor.

Ni subconjunto ni nada, C es igual de poderoso que C++, despues de todo son Turing Complete.
C++ no es un "C con clases", es un C + OO + RAII + STD + Lambdas + SFINAE + 20.000 cosas mas.

C sigue teniendo ventajas frente a C++, como Rendimiento, tiempo en compilación, portabilidad, etc.
Y yo, al menos, prefiero usar C para pequeños programas o "pruebas" que C++.
10 respuestas