ESP-32-CAM работа с jpeg файлом

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 ЧРЕВАТО !

1 лайк

а зачем?

Ну мы как бы не знаем что у него творится в глобальном масштабе - может там есть и другие претенденты на место в куче…
По какой то причине он же не хочет сразу задать массив нужного размера в шапке программы - ему подавай выкрутасы с кучей …

Понял.
Ну освобождать, конечно, надо, но только после завершения копирования.

Если он хочет скопировать файл 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
Если вам не выделили память - уходите из цикла без попыток писать в то чего НЕТ !