Перейти к содержанию
    

Заполнение массива

Господа, что я делаю не так?

   uint8_t Buffer[100];
    uint8_t *pBuffer;

    pBuffer=Buffer;

........

for (i=0;i<640;i++) 
{
    *(pBuffer++)=55;
}

 

При запуске программы на строке pBuffer=Buffer; улетает в ошибку (У меня KEIL RTX, улетает в os_error, наверное это аналог Fault Hanlder).

Изменено пользователем Salamander

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Господа, что я делаю не так?

 

Очень хороший вопрос!

Почему при масиве в размере 100 элементов доступ идет к 640 ? Это какой-то тайный смысл ?

Вот поэтому все умные книжки говорят, чтобы не использовали "magic numbers", типа 100 и 640, потому что ошибиться очень легко.

 

const uint KBufSize = 100;
uint8_t Buffer[KBufSize];

for(uint i=0; i<KBufSize; ++i)
{
Buffer[i] = 55;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

За код конечно спасибо, но полученный массив нужно обрабаотывать функцией, принимающей указатель.

int8_t WriteBuffer (const uint8_t *buff, int32_t len);

 

Ну допустим я заполню этот массив традиционным способом. Но как только я попытаюсь присвоить его адрес указателю через pBuffer=Buffer, возникнет вылет в ошибку.

 

Изменено пользователем Salamander

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что я делаю не так?
640 > 100

 

пардон, опечатка, должно быть 64. и с 64 не работает.
Тогда есть подозрение, что не хватает стека. Массив залезает на глобальные переменные и портит их.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

За код конечно спасибо, но полученный массив нужно обрабаотывать функцией, принимающей указатель.

int8_t WriteBuffer (const uint8_t *buff, int32_t len);

 

:) А вы знаете, зачем человечество выдумало константные указатели ? Правильно, затем, чтобы данные по этим указателям

нельзя было менять. Попытка записи по константному указателю - это undefined behaviour, т.е. результатом может быть что угодно, в лучшем случае

segment fault или как его там.

У вас массив передается через указатель "const uint8_t *buff" писать в этот буфер нельзя, даже если очень хочется.

 

Хотя с другой стороны, вы не сказали, что функция WriteBuffer() должна делать... пытается она изменить данные в буфере или нет ?

Изменено пользователем CrimsonPig

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

int8_t WriteBuffer (const uint8_t *buff, int32_t len);

У вас массив передается через указатель "const uint8_t *buff" писать в этот буфер нельзя, даже если очень хочется.

Хотя с другой стороны, вы не сказали, что функция WriteBuffer() должна делать... пытается она изменить данные в буфере или нет ?

 

Еще как можно! Функции, у которых параметр объявлен, как const-указатель, способны принимать оба типа указателей, как "постоянный", так и "переменный".

 

Например, стандартная функция сравнения строк декларируется так:

strcmp( const char *, const char *);

что позволяет ей сравнивать и константные строки тоже:

strcmp( str, "text");

А вот если бы const у второго параметра не стояло, то на попытку подстваить "text" компилятор должен был выдать ошибку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще как можно! Функции, у которых параметр объявлен, как const-указатель, способны принимать оба типа указателей, как "постоянный", так и "переменный".

 

Принимать-то способны, кто спорит.

Вот, вполне себе жизненная ситуация: Передаем const char* указатель в функцию. Один раз вызываем эту функцию с указателем на константные данные (которые добрый компилятор разместил в RО сегменте данных или вообще в ROM) а в другом случае вызываем эту функцию с указателем на неконстантные данные, которые в оказались в RAM.

Рукосуй-программист путем хитрых манипуляций (например, кастингом указателя) в вызываемой функции пытается записать что-то по данному указателю.

Ну, и что получится в итоге ? Длинная и плодотворная дискуссия об аспектах undefined behaviour ?

 

Кстати, ТС в самом первом примере привел абсолютно не относящийся к проблеме код и не сказал, что его WriteBuf() делает

Изменено пользователем CrimsonPig

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, ТС в самом первом примере привел абсолютно не относящийся к проблеме код и не сказал, что его WriteBuf() делает.

 

Но можно догадаться. :) Скорее всего, WriteBuffer() выводит содержимое буфера на какое-то внешнее устройство типа диска, монитора и прочие типа интерфейсов. Оттого-то там const и прописано, чтобы можно было выводить константные строки (чаще всего это возвраты каретки, переводы на новую строку, управляющие модемом кодовые последовательности и т.п.).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но можно догадаться. :) Скорее всего, WriteBuffer() выводит содержимое буфера на какое-то внешнее устройство типа диска, монитора и прочие типа интерфейсов. Оттого-то там const и прописано, чтобы можно было выводить константные строки (чаще всего это возвраты каретки, переводы на новую строку, управляющие модемом кодовые последовательности и т.п.).

 

1. заниматься телепатией вредно для здоровья :)

2. Догадаться можно до чего угодно, например, до того, что он в этой функции открывает вордовский документ, берет из него картинку и пришет ее в массив, переданный как const int*

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При запуске программы на строке pBuffer=Buffer; улетает в ошибку

Попробуйте адрес явно указать pBuffer=&Buffer[0]. Хотя для стандартного Си это один хрен, но мало ли. :blink:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А буфер в функции объявлен?

Попробуйте его объявить как static или вынести за пределы функции

Такое ощущение, что он в стеке передается. Тоже сталкивался с подобным

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...