C struct массивы - PullRequest
       4

C struct массивы

6 голосов
/ 29 августа 2010

У меня есть структура C (не C ++), которая выглядит следующим образом

typedef struct mystruct{
float a,b;
int x, y;
} mystruct;

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

mystruct List[MAX];
ListNumber = 0;

for(i = 0; i < MAX; i++)
{
 if(conditions_meet)
 {
  List[ListNumber].a = masterlist[i].a;

... и т.д.

ListNumber++;
 }
}

затем я отправляю массив в функцию

 DoStuff(static int max, mystruct array[max]){
  Stuff
 }

Это работает, но когда я пытаюсь сделать это так ....

mystruct setter(int i)
{
mystruct TEMP;
TEMP.a = masterlist[i].a;
 //......etc
return TEMP;
}


mystruct List[MAX];
ListNumber = 0;

for(i = 0; i < MAX; i++)
{
 if(conditions_meet)
 {
  List[ListNumber] = setter(i);
  ListNumber++;
 }
}

Этовызывает много прикольных ошибок.Почему это происходит?edit: @ tommieb75 Я не могу дать много подробностей, результаты, кажется, не имеют закономерности.Список используется в качестве обобщенного способа отрисовки материала на экране, а наличие функции вместо прямой установки создает странные проблемы при рендеринге - и случайных -, но не вызывает ошибок компилятора вообще.GDB показывает, что некоторые целые числа больше целого, это единственный шаблон, который я нахожу.masterlist - это глобальный массив другой структуры.Данные должны быть преобразованы в структуру в этом примере.Никаких предупреждений или ошибок компилятора.Я могу включить более чувствительные предупреждения, но я всегда получаю сообщение о любой общей ошибке, которую могу думать.Я собираюсь попробовать выбранное решение, которого должно хватить.В любом случае, в моем коде используются похожие функции, возвращающие структуры, и все они работают отлично, за исключением этого случая с массивом структур.

Ответы [ 4 ]

1 голос
/ 29 августа 2010

Для простой установки члена структуры вам нужна копия всего структурного элемента?

mystruct List[MAX];
ListNumber = 0;

for(i = 0; i < MAX; i++)
{
 if(conditions_meet)
 {
  List[ListNumber].a = masterlist[i].a;
  ListNumber++;
 }
}

Если вам действительно нужна функция, используйте целевую память в качестве параметра, например:

void setter(mystruct *dest,const mystruct *src)
{
  dest->a = src->a; 
}
for(i = 0; i < MAX; i++)
{
 if(conditions_meet)
 {
  setter( &List[ListNumber], &masterlist[i] );
  ListNumber++;
 }
}
1 голос
/ 29 августа 2010

что такое

mystruct setter(i)
{
mystruct TEMP;
TEMP.a = masterlist[i].a;

«Я» имеет какой-либо тип?

// Если вы получаете ошибки с неинициализированными членами в структуре, это может помочь http://ideone.com/WRLVG

0 голосов
/ 29 августа 2010

Проблема в том, что внутри функции setter у вас есть переменная, выделенная в стеке TEMP, которая выходит из области видимости после возврата из функции ... возможно, вам лучше было бы выделить указатель на my_struct в куче вернуть его адрес обратно в вызывающую подпрограмму ...

Edit:

mystruct *setter(int i){
    mystruct *ptr_myStruct;
    ptr_myStruct = malloc(sizeof(mystruct));
    if (ptr_myStruct != NULL){
        ptr_myStruct->a = masterlist[i].a
        // etc...
        return &ptr_myStruct;
    }
    return NULL;
}

mystruct List[MAX];
ListNumber = 0;

for(i = 0; i < MAX; i++)
{
 if(conditions_meet)
 {
  List[ListNumber] = setter(i);
  ListNumber++;
 }
}

Это то, что необходимо, чтобы вернуть значения, когда подпрограмма выходит из области видимости. Это называется возврат по ссылке

0 голосов
/ 29 августа 2010

Первая проблема в том, что ваше определение сеттера не является подписью легальной функции. Параметр i должен иметь тип

mystruct setter(int i) {
  ...
}

Также используется переменная masterlist, которая не определена в функции. Это может быть юридически объявлено в другом месте как статический. Если нет, то это должно быть как-то доступно для функции

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