Определение структуры массива в функции

Обновить

December 2018

Просмотры

292 раз

2

Код:

int i;
struct st
{
    int m;
}st_t[2];

void foo()
{
    i = 4;
    st_t[2] = 
    {
       {10},{20}
    };  // it's wrong !!!!  but I don't know how to do.     
}
int main()
{
   foo();
   cout<<i<<endl;          // will output 4;
   cout<<st_t[0].m<<endl;  // this should output 10
   cout<<st_t[1].m<<endl;  // this should output 20

   return 0;
}

Можно ли определить массив структуры в функции? Если да, то как это сделать? Заранее спасибо.

PS: К
сожалению мой английский не очень хорошо. Я делаю игру Тетрис, это есть класс Shape, я объявил массив формы структуры в Shape.h, то я задаю в массив структуры в функции Shape конструктора в Shape.cpp. Это правильно? или как присвоить массив структуры , так что я могу использовать его в другой функции?

4 ответы

2

Вы можете инициализировать массив в том месте , где она определена. Т.е. либо переместить определение в функцию, или переместить инициализацию из функции:

struct st 
{ 
    int m; 
} 
st_t[2] = {{10},{20}};
0

Если вы хотите только переменную в области видимости функции, то

void foo() {
    struct {
        int m;
    } st_t = { {10}, {20} };
    // do something
}
0

Вместо прямого присваивания значений, вы можете инициализировать временную переменную и скопировать эту переменную к глобальной переменной:

Удалять:

 ...
 st_t[2] =  {
      {10},{20}
 };
 ...

и добавить:

 ...
 st tmp[2] = { {10}, {20} };  

 memcpy(st_t, tmp, sizeof st_t);
 ...

Приложение:

Если это не работает для вас, может быть другая ошибка в коде. Из вашего примера:

#include <iostream>
#include <memory.h>
using namespace std;

 int i;
 struct st { int m; } st_t[2];

 void foo()
{
 i = 4;
 st tmp[2] = { {10}, {20} }; 
 memcpy(st_t, tmp, sizeof st_t); // use: const_addr instead of &const_addr
}

 int main()
{
 foo();
 cout << i << endl;          // will output 4;
 cout << st_t[0].m << endl;  // this should output 10
 cout << st_t[1].m << endl;  // this should output 20
 return 0;
}

все работает отлично, как и ожидалось.

0

Если вы хотите , чтобы определить массив в функции ( в качестве заголовка вопроса и текст подразумевает), а затем добавить спецификатор типа stк определению:

st st_t[2] = 
{
   {10},{20}
};

Тем не менее, это будет отдельный массив на глобальный, и поэтому выход из main()не будет соответствовать тому , что ваши комментарии говорят , должно произойти. Если вы на самом деле хотите назначить глобальный массив, то:

st_t[0].m = 10;
st_t[1].m = 20;

или, в C ++ 11, вы можете использовать подобный синтаксис для вашего примера , если вы замените обычный массив с std::array:

std::array<st, 2> st_t;

void foo() {
    // Note the extra braces - std::array is an aggregate containing an array
    st_t = 
    {{
        {10},{20}
    }};
}