Передать элемент массива (структуру) в функцию - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть структура, как показано ниже

typedef struct _someStruct
{
int V1;
char    V2[10];
} SomeStruct;

SomeStruct *struct;
int elemNo = FillStruct(&struct);
for (i=0; i<elemNo; i++)
    PrintElem(&struct[i]);

Функция PrintElem выглядит следующим образом:

void PrintElem(SomeStruct *s)
{
    printf("\n\tV1   : %d\n\tV2   : %s\n", s->V1, s->V2);
}

Сбой кода в цикле из 2'n или 3'го элемента.

Любое предложение о том, что не так?

EDIT: На самом деле PrintElem был (причина, по которой я это сделал, заключается в том, что в реальной структуре было около 30 полей с длинными именами, поэтому я сделал это, чтобы сделать код читаемым):

void PrintElem(SomeStruct *s)
{
    printf(
        "\n\tV1   : %d"
        "\n\tV2   : %s\n",
        s->V1, s->V2);
}

Я не думал, что это может изменить ситуацию, но это имело место (на самом деле это был ключ к проблеме - см. Мой собственный ответ ниже) Я просто публикую это, надеясь, что это поможет кому-то позже.

Спасибо всем за все предложения и за ваше время

Ответы [ 4 ]

2 голосов
/ 16 февраля 2012

У этого есть несколько проблем, но давайте попробуем разобраться с ними

    typedef struct _someStruct
    {
    int V1;
    char    V2[10];
    } SomeStruct;

    /* assuming you create an array of pointers to structures allocated from heap
       and then return the data to the struct1 double pointer */
    SomeStruct ** struct1;
    int elemNo = FillStruct(struct1);
    for (i=0; i<elemNo; i++)
        PrintElem(struct[i]);

    void PrintElem(SomeStruct *s)
    {
        printf("\n\tV1   : %d\n\tV2   : %s\n", s->V1, s->v2);
    }

Надеюсь, это поможет, если вы сможете уточнить FillStruct, это поможет.

1 голос
/ 16 февраля 2012

Из этих строк:

SomeStruct *struct;
int elemNo = FillStruct(&struct);

Я предполагаю, что вы хотите, чтобы функция FillStruct также выделяла память для этих структур.Скорее всего, ваша проблема в теле этой функции (вы выделяете слишком маленький блок памяти или возвращаете неверное значение).

FillStruct функция может выглядеть так:

int FillStruct(SomeStruct **s)
{
    *s = malloc( sizeof(SomeStruct) * 10 );
    // fill members of these structs
    return 10;
}

Также обратите внимание, что struct является ключевым словом, его нельзя использовать как имя переменной.

1 голос
/ 16 февраля 2012

Фактически SomeStruct - это имя переменной, а не тип.Я бы посоветовал вам разделить определение типов и определение переменных на две строки:

struct _someStruct
{
  int V1;
  char    V2[10];
};

_someStruct *struct;
int elemNo = FillStruct(&struct);
for (i=0; i<elemNo; i++)
  PrintElem(&struct[i]);


void PrintElem(_someStruct *s)
{
   printf("\n\tV1   : %d\n\tV2   : %s\n", s->V1, s->v2);
}

Также убедитесь, что в FillStruct вы выделяете массив типа _someStruct, а не только один элемент.В противном случае это будет совсем не странно.

0 голосов
/ 19 февраля 2012

Правильная форма PrintElem должна быть

void PrintElem(SomeStruct *s)
{
printf(
    "\n\tV1   : %d"\
    "\n\tV2   : %s\n",
    s->V1, s->V2);
}

Спасибо всем за помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...