Control de usuario
Patrocinadores
Estadísticas
Miembros:
334.544
Online:
1.425
Hilos:
1.380.494
Mensajes:
24.874.555
Stats

Índice de foros Otras Consolas Desarrollo

[C] Structs consecutivos

Dedicado al desarrollo de software casero para videoconsolas

Moderador: jiXo

nevat
Avatar de usuario
MegaAdicto!!!
 
Mensajes: 3046
Registrado: 12 Jun 2003
Ubicación: Barcelona
Fotos: 5

[C] Structs consecutivos

Mensajepor nevat 07 Sep 2011 17:59

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 ?

iceman755
Avatar de usuario
Adicto
 
Mensajes: 277
Registrado: 25 Jul 2007

Mensajepor iceman755 07 Sep 2011 18:10

Código: Seleccionar todo
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.

nevat
Avatar de usuario
MegaAdicto!!!
 
Mensajes: 3046
Registrado: 12 Jun 2003
Ubicación: Barcelona
Fotos: 5

Mensajepor nevat 07 Sep 2011 18:33

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 ?

kbks
Avatar de usuario
MegaAdicto!!!
 
Mensajes: 2078
Registrado: 19 Nov 2005
Ubicación: Ugao

Mensajepor kbks 07 Sep 2011 22:56

Los arrays se pasan como punteros normales y corrientes. Para este tipo de dudas básicas: http://c.conclase.net/curso/index.php

Código: Seleccionar todo
void main()
{
     ...
     int array[3];
     funcion(array);
     ...
}

void funcion( int *array)
{
     array[i] = ...
}
ATHLETIC KARAJO!

bregan90
Avatar de usuario
EOLiano Lv.85
 
Mensajes: 1144
Registrado: 06 Sep 2008
Ubicación: València
Fotos: 4

Mensajepor bregan90 30 Sep 2011 23:13

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

GameZelda
Avatar de usuario
Adicto
 
Mensajes: 480
Registrado: 02 Mar 2007

Mensajepor GameZelda 20 Nov 2011 09:41

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:

Código: Seleccionar todo
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".

nazareth
Avatar de usuario
I'm Finishing
 
Mensajes: 2466
Registrado: 03 Ene 2008
Ubicación: Cartagena

Mensajepor nazareth 26 Nov 2011 13:21

Ya que son punteros, no podria hacer algo tipo esto?
Código: Seleccionar todo
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.


Volver a Desarrollo

¿Quién está conectado?

Usuarios navegando por este foro: No hay usuarios registrados visitando el foro y 0 invitados