If (nullptr == buf) { printf(“error”); }
Ну да, пишет error. Т.е. буфер не очистился?
Смотря куда вы это добавили ! Надо проверять после попытки выделения.
Сорри, не в тему. Del.
В общем код данный вообще работать не хочет. Если все убрать и оставить только суть. Есть число допустим 220 . Я хочу перебрать его по частям - 2 раза по 100 и последний раз остаток 20. В итоге все равно крешится. Что не так в коде не пойму?
Вот полный код если убрать лишнее.
void setup() {
Serial.begin( 115200 );
}
void loop() {
long ost = 220, bufsize=100, next_pozic=0,tek=0,sled=0,mnog=0, i;
while(ost>0){
if (ost>bufsize) {mnog=bufsize;}
else {mnog=ost;}
Serial.print("mnog= ");
Serial.println(mnog);
tek=sled;
sled=tek+mnog;
unsigned char *buf = new unsigned char[mnog];
if (nullptr == buf) { Serial.print("error"); }
for(i=tek;i<sled;i++){
buf[i]=random(1, 100); //Забиваем массив чем попало
}
ost=ost-mnog;
delete [] buf;
buf = nullptr;
Serial.print("ost= ");
Serial.println(ost);
}
delay(500);
}
Ориентируйся на то что успело выстрелить в Serial и сужай диапазон отладки
Если буфер не выделился, то зачем дальше пытаться его заполнять ???
Вот тут не понятно - на втором проходе i будет вне границ буфера !!! Если это указатель на позицию в файле, то понятно. Но при чем тут i для буфера - i должно пробегать от 0 до mnog или как там оно у вас зовется …
Тогда как минимум так заполнять надо:
buf[i-tek]=random(1, 100)
@dimonram1978
ваша главная ошибка - вы выделяете буфер внутри цикла while, многократно.
Надо выделить буфер один раз ДО ЦИКЛА, а внутри цикла только перезаписывать его
Никто не запрещает выделять и освобождать.
Но вот писать в массив[100] по адресам > 100 ЧРЕВАТО !
а зачем?
Ну мы как бы не знаем что у него творится в глобальном масштабе - может там есть и другие претенденты на место в куче…
По какой то причине он же не хочет сразу задать массив нужного размера в шапке программы - ему подавай выкрутасы с кучей …
Понял.
Ну освобождать, конечно, надо, но только после завершения копирования.
Если он хочет скопировать файл 3К кусками по 100байт - то однозначно правильнее выделить один раз буфер в 100 байт и тридцать раз его перезаписать, чем выделять и освобождать 30 раз…
Не хочет в шапке - не надо. Тогда выделять динамически, как у него и сделано, но только не внутри while, а до.
Я же спорю что хороший код или г… Я просто говорю что выделение и освобождение внутри цикла не должно рушить программу… Ошибка в чем то другом !
На самом деле всем спасибо. Ошибка была в цикле. Добавил еще одну переиенную на позицию в текущем цикле
for(i=tek, j=0;i<sled, j<mnog;i++,j++){
buf[j]=file2.read();
}
И вроде бы все записалось. Надо теперь попробовать на совсем большом файле (это не нужно но вдруг) и передать так в цикле по ftp
Отметьте сообщение, которое вам помогло- как Решение вопроса…
Т.е. в nullptr продолжаешь писать…
Т.е. в nullptr продолжаешь писать…
Тут я лох вообще не понимаю зачем эта строка. Динамический массив должен уничтожаться строкой delete buf;
Мы про другую строку - ESP-32-CAM работа с jpeg файлом - #27 от пользователя Komandir
Если вам не выделили память - уходите из цикла без попыток писать в то чего НЕТ !