#c #exception #pointers
#c #исключение #указатели
Вопрос:
У меня есть API для чтения данных:
ROM_READ_PAGE(BLOCK_NO, PAGE_NO, *READ_BUFFER);
Размер страницы равен 2048, и вы можете прочитать ТОЛЬКО ВСЮ страницу за раз.
Я знаю, что речь идет только об использовании C, но моя система не запускается ни одним из методов, которые я пробовал.
Например:
char *readPtr;
char readBuff[128]; //(Can not use 2048 due to stack overflow)
readPtr = readBuff;
ROM_READ_PAGE(BLOCK_NO, PAGE_NO, readPtr); // SMX doesn't like this and shows some exception
Любая другая идея или я упускаю что-то важное.
Комментарии:
1. Рекомендуется добавить исключение к вашему сообщению.
2. Можете ли вы вместо этого выделить память в куче (с помощью
malloc
)? Вы сами сказали, что размер страницы равен 2048, и вам нужно прочитать всю страницу сразу.3. @pmg // SMX это не нравится, и он показывает какое-то исключение., не забудьте прокрутить вправо 🙂
4. При написанном коде C не гарантирует, что вы получите какой-либо хороший результат ошибки. У ROM_READ_PAGE нет возможности узнать, что readPtr не указывает на достаточное количество памяти — он скопирует кучу байтов по всему вашему стеку (и, по-видимому, мимо него).
5. @Joe: Ах! Я вижу 🙂 @Punit:
C
не имеет исключений. Возможно, SMX скомпилирован с помощьюC
компилятора?
Ответ №1:
Если ваш стек не может быть 2048, это не означает, что вы освобождены от предоставления блока размером 2048 байт
char *readPtr = malloc(2048);
ROM_READ_PAGE(BLOCK_NO, PAGE_NO, readPtr);
// do whatever you need
free(readPtr);
Комментарии:
1. Не приводите возвращаемое значение malloc() в C.
2. Итак, я никак не могу избежать чтения меньше 2048? Это встроенная система, поэтому хотелось избежать динамической памяти. Тем не менее, это работает.
3. @размотка завершена. Сначала я делал это таким образом, затем изменил его. Вы можете редактировать ответы, чтобы сделать их лучше.
4. @Punit — Ваше описание ROM_READ_PAGE и его параметры не допускают частичного чтения. Есть ли в документации другие вызовы API, которые выполняют частичное чтение? Поиск в Google по запросу ROM_READ_PAGE ничего не дает, и я никогда об этом не слышал.
Ответ №2:
Вы можете динамически распределять буфер и избегать переполнения стека. вам также нужно будет освободить буфер
char *readBuff;
readBuff = (char *) malloc(2048);
free(readBuff);
Комментарии:
1. Не приводите возвращаемое значение malloc() в C.
Ответ №3:
Не используйте стек. Если ваш компилятор использует стек для автоматических переменных, вы можете либо изменить способ работы вашего компилятора с автоматическими переменными (маловероятно), либо использовать какой-либо другой тип переменной.
Обычно компиляторы помещают статические переменные хранилища в область, отличную от автоматических переменных. Возможно, вы захотите попробовать это.
Или попробуйте динамическое выделение памяти.