Pasar una matriz de estructuras en C

1 minuto de lectura

avatar de usuario
emir

Tengo problemas para pasar una matriz de estructuras a una función en C.

He creado la estructura como esta en main:

int main()
{
    struct Items
    {
        char code[10];
        char description[30];
        int stock;
    };

    struct Items MyItems[10];
}

Luego accedo a él como: MyItems[0].stock = 10; etc

Quiero pasarlo a una función como esta:

 ReadFile(MyItems);

La función debe leer la matriz y poder editarla. Entonces debería poder acceder a la misma matriz desde otras funciones.

He intentado montones de declaraciones, pero ninguno de ellos funciona. p.ej

void ReadFile(struct Items[10])

He buscado otras preguntas, pero la cuestión es que todas están hechas de manera diferente, con typedefs y asteriscos. Mi maestro aún no nos ha enseñado punteros, así que me gustaría hacerlo con lo que sé.

¿Algunas ideas? :S

EDITAR: la respuesta de Salvatore funciona después de que arreglé mi prototipo para:

void ReadFile(struct Items[10]);

  • Es “código real”. Lo estoy usando con Visual Studio 2010 y funciona. :S

    – Emir

    21 de noviembre de 2011 a las 0:30

  • “Visual Studio” y “funciona” no deben usarse en una oración en una conversación educada. Debe decir explícitamente si está hablando de plataformas específicas no estándar; de lo contrario, la gente asumirá que está hablando de la estándar idioma.

    – KerrekSB

    21 de noviembre de 2011 a las 0:32

  • Bien, lo arreglé. Espero que sea lo suficientemente real >.<

    – Emir

    21 de noviembre de 2011 a las 0:33

struct Items
{
    char code[10];
    char description[30];
    int stock;
};

void ReadFile(struct Items items[10])
{
    ...
}

void xxx()
{
    struct Items MyItems[10];
    ReadFile(MyItems);
}

Esto en mi compilador funciona bien. Qué compilador estas usando? ¿Qué error tienes?

Recuerde declarar su estructura antes de sus funciones o nunca funcionará.

  • Gracias, funcionó, después de que arreglé mi prototipo para anular ReadFile(struct Items[10]);

    – Emir

    21 de noviembre de 2011 a las 1:34


Definir struct Items fuera de la principal. Al pasar una matriz a una función en C, también debe pasar la longitud de la matriz, ya que no hay forma de que la función sepa cuántos elementos hay en esa matriz (a menos que se garantice que es un valor fijo).

Como mencionó Salvatore, también debe declarar (no necesariamente definir) cualquier estructura, función, etc. antes de poder usarlas. Por lo general, tendría sus estructuras y prototipos de funciones en un archivo de encabezado en un proyecto más grande.

La siguiente es una modificación de trabajo de su ejemplo:

#include <stdio.h>

struct Items
{
    char code[10];
    char description[30];
    int stock;
};

void ReadFile(struct Items items[], size_t len)
{
    /* Do the reading... eg. */
    items[0].stock = 10;
}

int main(void)
{
    struct Items MyItems[10];

    ReadFile(MyItems, sizeof(MyItems) / sizeof(*MyItems));

    return 0;
}

avatar de usuario
Kerrek SB

La función no sabrá que el tipo struct Items existe si lo declara solo localmente dentro del main alcance del cuerpo de la función. Así que deberías definir la estructura exterior:

struct Item { /* ... */ };

void ReadFile(struct Items[]);   /* or "struct Item *", same difference */

int main(void)
{
  struct Item my_items[10];
  ReadFile(my_items);
}

Esto es peligroso, por supuesto, ya que ReadFile no tiene idea de cuán grande es la matriz (las matrices son siempre pasado por decay-to-pointer). Por lo tanto, normalmente agregaría esta información:

void ReadFile(struct Items * arr, size_t len);

ReadFile(my_items, 10);

  • Su código ha solucionado los errores subrayados, pero aún no se está construyendo. Obtengo esto: pastebin.com/HxPTcPmL

    – Emir

    21 de noviembre de 2011 a las 0:59


  • A) los errores no tienen nada que ver con esta parte del código, B) ahora estamos otra vez confundidos acerca del lenguaje — ¿de repente es C++?

    – KerrekSB

    21 de noviembre de 2011 a las 1:01

  • lol, lo siento, me equivoqué de código, inténtalo de nuevo. Eso es por probar tu código.

    – Emir

    21 de noviembre de 2011 a las 1:01

  • ¿Intentar qué de nuevo? Pastebin no te permite cambiar el contenido; obtienes una nueva identificación en su lugar.

    – KerrekSB

    21 de noviembre de 2011 a las 1:02

  • Aquí está mi código completo que estoy usando en caso de que tengas curiosidad: pastebin.com/YAXHdLtM

    – Emir

    21 de noviembre de 2011 a las 1:03

En lugar de su declaración, declare de esa manera:

typedef struct {
        char code[10];
        char description[30];
        int stock;
}Items;

y la funcion asi:

void ReadFile(Items *items);

Con typedef, define un nuevo tipo, por lo que no necesita usar la palabra “estructura” cada vez.

Prácticamente tienes que usar punteros para esto. Tu función se vería así:

void ReadFile(Items * myItems, int numberOfItems) {
}

avatar de usuario
nikola-miljkovic

Debe usar el puntero a la matriz, después de eso es fácil acceder a sus miembros

void ReadFile(Artículos * artículos);

Deberia trabajar.

avatar de usuario
Kaisar

Bueno, cuando pasas una estructura como lo hiciste, en realidad crea una copia local de ella en la función. Por lo tanto, no tendrá ningún efecto en su estructura original, sin importar cómo la modifique en ReadFile.

No estoy seguro de un enfoque diferente y es posible que esto no responda a su pregunta, pero le recomiendo que pruebe los punteros. Definitivamente los usará mucho en C/C++. Y pueden ser realmente poderosos una vez que los dominas.

  • No es cierto, puede probar eso, C pasa la matriz siempre por puntero, puede modificarla en ReadFile, la copia no está involucrada aquí.

    – Salvatore Previti

    21 de noviembre de 2011 a las 0:44

  • @SalvatorePreviti ¡Tienes toda la razón! Por alguna extraña razón entendí que quería usar la estructura en su método, no la matriz. -_-

    – Kaisar

    25 de noviembre de 2011 a las 9:00

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad