Salamander 2 15 апреля, 2015 Опубликовано 15 апреля, 2015 (изменено) · Жалоба Господа, что я делаю не так? 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). Изменено 15 апреля, 2015 пользователем Salamander Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CrimsonPig 0 15 апреля, 2015 Опубликовано 15 апреля, 2015 · Жалоба Господа, что я делаю не так? Очень хороший вопрос! Почему при масиве в размере 100 элементов доступ идет к 640 ? Это какой-то тайный смысл ? Вот поэтому все умные книжки говорят, чтобы не использовали "magic numbers", типа 100 и 640, потому что ошибиться очень легко. const uint KBufSize = 100; uint8_t Buffer[KBufSize]; for(uint i=0; i<KBufSize; ++i) { Buffer[i] = 55; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 15 апреля, 2015 Опубликовано 15 апреля, 2015 (изменено) · Жалоба пардон, опечатка, должно быть 64. и с 64 не работает. За код конечно спасибо, но полученный массив нужно обрабаотывать функцией, принимающей указатель. int8_t WriteBuffer (const uint8_t *buff, int32_t len); Ну допустим я заполню этот массив традиционным способом. Но как только я попытаюсь присвоить его адрес указателю через pBuffer=Buffer, возникнет вылет в ошибку. Изменено 15 апреля, 2015 пользователем Salamander Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 15 апреля, 2015 Опубликовано 15 апреля, 2015 · Жалоба что я делаю не так? 640 > 100 пардон, опечатка, должно быть 64. и с 64 не работает.Тогда есть подозрение, что не хватает стека. Массив залезает на глобальные переменные и портит их. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CrimsonPig 0 15 апреля, 2015 Опубликовано 15 апреля, 2015 (изменено) · Жалоба пардон, опечатка, должно быть 64. и с 64 не работает. За код конечно спасибо, но полученный массив нужно обрабаотывать функцией, принимающей указатель. int8_t WriteBuffer (const uint8_t *buff, int32_t len); :) А вы знаете, зачем человечество выдумало константные указатели ? Правильно, затем, чтобы данные по этим указателям нельзя было менять. Попытка записи по константному указателю - это undefined behaviour, т.е. результатом может быть что угодно, в лучшем случае segment fault или как его там. У вас массив передается через указатель "const uint8_t *buff" писать в этот буфер нельзя, даже если очень хочется. Хотя с другой стороны, вы не сказали, что функция WriteBuffer() должна делать... пытается она изменить данные в буфере или нет ? Изменено 15 апреля, 2015 пользователем CrimsonPig Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 43 15 апреля, 2015 Опубликовано 15 апреля, 2015 · Жалоба 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" компилятор должен был выдать ошибку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CrimsonPig 0 15 апреля, 2015 Опубликовано 15 апреля, 2015 (изменено) · Жалоба Еще как можно! Функции, у которых параметр объявлен, как const-указатель, способны принимать оба типа указателей, как "постоянный", так и "переменный". Принимать-то способны, кто спорит. Вот, вполне себе жизненная ситуация: Передаем const char* указатель в функцию. Один раз вызываем эту функцию с указателем на константные данные (которые добрый компилятор разместил в RО сегменте данных или вообще в ROM) а в другом случае вызываем эту функцию с указателем на неконстантные данные, которые в оказались в RAM. Рукосуй-программист путем хитрых манипуляций (например, кастингом указателя) в вызываемой функции пытается записать что-то по данному указателю. Ну, и что получится в итоге ? Длинная и плодотворная дискуссия об аспектах undefined behaviour ? Кстати, ТС в самом первом примере привел абсолютно не относящийся к проблеме код и не сказал, что его WriteBuf() делает Изменено 15 апреля, 2015 пользователем CrimsonPig Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 43 15 апреля, 2015 Опубликовано 15 апреля, 2015 · Жалоба Кстати, ТС в самом первом примере привел абсолютно не относящийся к проблеме код и не сказал, что его WriteBuf() делает. Но можно догадаться. :) Скорее всего, WriteBuffer() выводит содержимое буфера на какое-то внешнее устройство типа диска, монитора и прочие типа интерфейсов. Оттого-то там const и прописано, чтобы можно было выводить константные строки (чаще всего это возвраты каретки, переводы на новую строку, управляющие модемом кодовые последовательности и т.п.). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CrimsonPig 0 15 апреля, 2015 Опубликовано 15 апреля, 2015 · Жалоба Но можно догадаться. :) Скорее всего, WriteBuffer() выводит содержимое буфера на какое-то внешнее устройство типа диска, монитора и прочие типа интерфейсов. Оттого-то там const и прописано, чтобы можно было выводить константные строки (чаще всего это возвраты каретки, переводы на новую строку, управляющие модемом кодовые последовательности и т.п.). 1. заниматься телепатией вредно для здоровья :) 2. Догадаться можно до чего угодно, например, до того, что он в этой функции открывает вордовский документ, берет из него картинку и пришет ее в массив, переданный как const int* Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MicroDiP 1 17 апреля, 2015 Опубликовано 17 апреля, 2015 · Жалоба При запуске программы на строке pBuffer=Buffer; улетает в ошибку Попробуйте адрес явно указать pBuffer=&Buffer[0]. Хотя для стандартного Си это один хрен, но мало ли. :blink: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 17 апреля, 2015 Опубликовано 17 апреля, 2015 · Жалоба А буфер в функции объявлен? Попробуйте его объявить как static или вынести за пределы функции Такое ощущение, что он в стеке передается. Тоже сталкивался с подобным Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться