слишком большой сегмент данных при компиляции

Здесь я передаю массив битов какой-то другой функции.
Поскольку размер массива слишком велик, при компиляции выдается сообщение об ошибке «сегмент данных слишком большой».

Я недавно отредактировал код. Но ошибка: слишком большой сегмент данных все еще существует

Это код:

char TxBits[]={0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,
0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,0,0,1,0,1,0,1,1,0,1,1,0,1,1,1,0,
0,0,0,1,1,0,0,0,1,0,0,1,0,0,1,1,1,1,1,1,0,1,0,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0};

int nTxBits = sizeof(TxBits)/sizeof(char);

void data(char *TxBits,int nTxBits, int loopcount)
{

int i;

for (i = 0;i < nTxBits;i++)
{

gpio=TxBits[i];
wait(loopcount);
}

}

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

0

Решение

Из вашего кода я считаю, что вы работаете с каким-то микроконтроллером, поэтому я не уверен, серьезно ли вы относитесь к тегу C ++ или нет. Если да, то это решение в стиле C ++, которое использует std::bitset (специализированный контейнер для работы с битами, который будет занимать меньше места):

std::bitset<134> foo (std::string("01010101010101010101010100101010101010101010101010010101010101010101010101001010101010101010101010100101010101010101010101010100000000"));

void data(const std::bitset& bitset, int loopcount) {
// if C++11
for (auto& bit : foo) {
gpio = bit;
wait(loopcount);
}

// if C++98
// for (int i = 0; i<bitset.size(); i++) {
//   gpio = foo[i];
//   wait(loopcount);
// }
}
2

Другие решения

Вам, вероятно, нужно это:

void data(char *TxBits, int size)  // size of the number of elements of your table
{
int i;

for (i = 0;i < size; i++)
{
gpio=TxBits[i];
wait(loopcount);
}
}

Вызов функции

data(TxBits, sizeof(TxBits) / sizeof(TxBits[0]);

Чтобы получить количество элементов массива мы используем sizeof(TxBits) / sizeof(TxBits[0] где sizeof(TxBits) количество байтов, которое массив занимает в памяти и sizeof(TxBits[0] это размер одного элемента массива.

1

Я передаю массив битов в другую функцию

Нет, вы передаете массив байтов, каждый байт имеет двоичное значение 00000000 или 00000001.

Чтобы сэкономить память, вы должны хранить битовые значения как фактические биты, а не как байты:

uint8_t TxBits[]=
{  0x55, // 0,1,0,1,0,1,0,1,
0x55, // 0,1,0,1,0,1,0,1,
0x55, // 0,1,0,1,0,1,0,1,
0x00, // 0,0,0,0,0,0,0,0,
0x20, // 0,0,1,0,0,0,0,0,
...
};

size_t nTxBits = sizeof(TxBits) / 8;

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

Также, если это небольшая микроконтроллерная система, вы должны по возможности распределять данные в ПЗУ, а не в ОЗУ. То есть: const uint8_t TxBits[],

1

Ваш параметр не объявлен правильно. Заменить это:

void data(char TxBits)

этим

void data(char [] TxBits)
0

Ваша функция

void data(char TxBits)

Должно быть

void data(char *TxBits, size_t nTxBits)
{
int i;

for (i = 0;i < nTxBits;i++)
{
gpio=TxBits[i];
wait(loopcount);
}
}

Вы можете позвонить по этому адресу:

data ( TxBits, sizeof(TxBits)/sizeof(TxBits[0]) );

В этом конкретном случае у вас есть char массив, и вы также можете написать:

data (TxBits, sizeof(TxBits));
0