[C] Structs consecutivos

Buenas,

Veamos tengo tres structs llamados objeto1, objeto2, objeto3, los tres con idéntico contenido.

Quiero procesar los tres de la misma manera y para no hacer mucho código lo intento meter en un for, tal que así:

for (i=1; i<4; i++)
objeto[i].x = 10;

Pero el compilador (GCC en esta caso) lee "objeto", no "objeto1". Y objeto no existe como tal.

Cual sería la forma correcta de hacerlo ?
struct tuTipoStruct objeto[3];

for (i=0; i<3; i++)
objeto[i].x = 10;


Mira que i, en el for, se inicializa con cero y termina en 2.
Perfecto, ha funcionado correctamente. Muchas gracias !

Aprovechando la ocasión, otra pregunta. Tengo una serie de arrays unidimensionales y bidimensionales que quiero pasar del main a una función y que esta las procese y devuelva el resultado de los cálculos al main.

main ()
int a[3];
int b[2][12];

funcion (&a,&b)
etc.

void funcion(int *a[3], int *b[2][12])
*a[1] ++;
etc.

GCC no da error al compilar, pero al ejecutarlo me acaba dando "violación de segmento". Como se haría ?
Los arrays se pasan como punteros normales y corrientes. Para este tipo de dudas básicas: http://c.conclase.net/curso/index.php

void main()
{
     ...
     int array[3];
     funcion(array);
     ...
}

void funcion( int *array)
{
     array[i] = ...
}
Exacto, un array no es mas que un puntero a una dirección de memoria, como cualquier puntero normal. No hace falta pasar por referencia (A no ser que vayas a modificar el valor de ese puntero, supongo).
Alerta, porque si bien a nivel práctico no hay ninguna diferencia entre pasar un "int *array" y un "int array[12345]", si estas usando arrays multidimensionales, si que hay diferencia entre "int **array" y "int array[12345][12345]" (ya que el primero es un array de punteros a arrays de enteros, y el segundo es un array de 12345*12345 enteros). Yo personalmente te recomendaría que si estas pasando arrays de tamaño fijo, si que usases el tamaño de array el las parámetros de las funciones.

El problema viene de que estás cogiendo punteros al array. Si haces esto, entonces tendrías que declarar los argumentos como "int (*b)[2][12]" (puntero a array de 2*12 ints) y no "int *b[2][12]" (array de 2*12 punteros a ints), y otras cosas.

Pero no es necesario que lo hagas, puedes pasar directamente los arrays sin pasar un puntero a ellos. e.g. tu código quedaría:

main ()
int a[3];
int b[2][12];

funcion (a,b)
etc.

void funcion(int a[3], int b[2][12])
a[1] ++;
etc.


Fíjate como he quitado los "&" de la llamada a "funcion", los "*" de la declaración de "funcion", y el "*" en la primera línea de "funcion".
Ya que son punteros, no podria hacer algo tipo esto?
main ()
int a[3];
int b[2][12];

funcion (a,b)
etc.

void funcion(int *a, int **b)
a[1] ++;
etc.

Sin poner el tamaño de los arrays en la funcion.
6 respuestas