Передача строки в функцию
- Войдите на сайт для отправки комментариев
Ср, 25/12/2019 - 17:41
Люди добрые! Вы простите, что я к вас обращаюсь. Сами мы не местные, паспорт украли..... ну и т.д. :)
допустим, есть функция
void foo ( char * arg){
// чего-то там
}
когда я к ней обращаюсь foo("argument"); - все ок. Когда делаю так
char s[] = "argument"; foo(s);
программа крашится, проц уходит в ребут.В чем разница, подскажите плз.
нада объявить const
char
*s =
"argument"
;
нада объявить const
char
*s =
"argument"
;
В мониторе :
огласите весь нерабочий код. минимальную программу, которая крашыца.
Полный код. Всегда. Полный. Код.
Ну, мужики, держитесь! :)
типа main:
Файл header.h
файл с функциями functions.ino - самый треш :)
Там еще два файла с библиотекой myESP32_FTPClient, но она не причина краша.
Вот в этом варианте программа добросовестно крашится при обращении к ф-ии void download_file(char* file_name , char* folder_name)
в файле functions.
В мониторе:
URLы запикал - не мой сервак, сорри.
Вот такая картина. Ссылка на библиотеку http клиента, где реализована ф-ия udh.download(url, wdataf, progressf);
Ну как минимум, навскидку, вижу. что в listlDir не закрывается дескриптор. open мы делаем, а close - нет. А надо бы. Далее, строка 80 - там ошибка:
Маркер конца итерации - неправильный, это НЕ количество элементов list, а просто его размер. Надо так:
Далее - чем strcmp не устроил, зачем самописные compareStr?
Короче, в коде ошибки есть, памяти оно жрёт, наскидку, не меньше 12 килобайт, жость :)
теперь строку 35 в файле functions я тупо меняю на:
udh.download("***/shortSample.mp3", wdataf, progressf);
И файл shortSample.mp3 три раза успешно скачиваются и сохраняется под разными именами на карте.
Ну как тут матом не заругацца!
Очень много сделано через зад и без знания языка. Склеивают строки так:
char url[80] = "";
strcat(url, folder_name);
strcat(url, file_name);
Ну и директория не может называться "***".
Очень много сделано через зад и без знания языка. Склеивают строки так:
char url[80] = "";
strcat(url, folder_name);
strcat(url, file_name);
Ну и директория не может называться "***".
", и пришлось написать так как написано. Эта проблема встречалась и у других, и в инете описана. Отнесем ее к багу. По началу многое было написано не так. Это вариант, который получился в следствии попыток избавиться от проблемы. Хотя да, я еще ток писака.
Директории запикал, сорри.
Ну то есть мы не будем править ошибки в коде, да и вообще код, чтобы не рушить стек, да? Вместо этого будем стрелять себе в ногу до тех пор, пока это кажется безопасным. Ведь если зажмуриться - то и не видно, правда?
Один тот факт, что было сообщение о краше стека - должен был навести на мысль, что стек - не резиновый, и надо бы переписать код, чтобы стек не рушился. Это не считая ошибок, о которых я писал выше.
Ну как минимум, навскидку, вижу. что в listlDir не закрывается дескриптор. open мы делаем, а close - нет.
Проц ESP32, памяти вроде достаточно.
Люди добрые! Вы простите, что я к вас обращаюсь. Сами мы не местные, паспорт украли..... ну и т.д. :)
допустим, есть функция
void foo ( char * arg){
// чего-то там
}
когда я к ней обращаюсь foo("argument"); - все ок. Когда делаю так
программа крашится, проц уходит в ребут.В чем разница, подскажите плз.
тут разница тока что во втором случае на стеке выделяется память для строки и она копируется туда а в первом просто ссылка на строку лежащую где в памяти с самого начала загрузки программы
со стеком у вас скорей всего намучено что то где то портится в другом месте
Правда разницы не увидел.
По прежнему в мониторе порта не видно разницы? Объясняю: sizeof одного экземпляра класса String - 6 байт, емнип. У вас в массиве таких экземпляров 20 штук. В ошибочном коде - вы пройдёте 120 (6*20) раз хрен знает по каким местам памяти, потому что, очевидно - вы вылазите за границы массива.
Во втором случае - получите размерность массива, потому что 120/6 = 20.
Рекомендую полистать книжку по С++, всё-таки.
Один тот факт, что было сообщение о краше стека - должен был навести на мысль, что стек - не резиновый, и надо бы переписать код, чтобы стек не рушился.
Во втором случае - получите размерность массива, потому что 120/6 = 20.
именно в мониторе и не увидел, а смысл понятен.
Рекомендую полистать книжку по С++, всё-таки.
Один тот факт, что было сообщение о краше стека - должен был навести на мысль, что стек - не резиновый, и надо бы переписать код, чтобы стек не рушился.
С++ - он такой. Опасная базука, которой можно себе бошку снести. То, что кажется, что ошибки нет - это только кажется.
Ещё раз: код - переписывать, ошибки - править, занятость стека - уменьшать, от самописных функций сравнения строк - избавляться, не гнать на strcpy и strcat - и постепенно всё получится.
Сейчас же ситуация следующая: вроде бы должно работать - но будет работать по фазам Луны. Надо проводить анализ кода на ошибки, плотный. А ошибки - есть, это точно.
тут разница тока что во втором случае на стеке выделяется память для строки и она копируется туда а в первом просто ссылка на строку лежащую где в памяти с самого начала загрузки программы
со стеком у вас скорей всего намучено что то где то портится в другом месте
сейчас проблема:
LoadProhibited, StoreProhibited
This CPU exception happens when application attempts to read from or write to an invalid memory location. The address which was written/read is found in
EXCVADDR
register in the register dump. If this address is zero, it usually means that application attempted to dereference a NULL pointer. If this address is close to zero, it usually means that application attempted to access member of a structure, but the pointer to the structure was NULL. If this address is something else (garbage value, not in0x3fxxxxxx
-0x6xxxxxxx
range), it likely means that the pointer used to access the data was either not initialized or was corrupted.А именно вот эта: it usually means that application attempted to dereference a NULL pointer. еще бы понять чего это означает.... :/
я помню когда был молодой и зеленый писал большую программу на чистом Си, где вся работа со строками была на обычных сишных массивах и функциях навроде str***, короче программа стала крашится из за повреждения стека рандомно и ошибку я так и не нашел просидев в отладчике кучу времени))
сейчас проблема:
This CPU exception happens when application attempts to read from or write to an invalid memory location.
Что непонятно в описании проблемы? Я же говорю - код полон ошибок, портим память. Может, лучше начать с примеров попроще, а не браться сразу на Уильяма нашего Шекспира?
Что непонятно в описании проблемы? Я же говорю - код полон ошибок, портим память. Может, лучше начать с примеров попроще, а не браться сразу на Уильяма нашего Шекспира?
Что непонятно в описании проблемы? Я же говорю - код полон ошибок, портим память. Может, лучше начать с примеров попроще, а не браться сразу на Уильяма нашего Шекспира?
У вас с английским не очень, да? It usually means означает, что "Обычно, это означает...". Т.е. вам просто приводят пример, который может привести к такому поведению. Это - один из use-case, не более того. У вас проблема - в каше в коде, в которой (каше) очень сложно найти ошибки. Но они - есть. Парочку - я нашёл сходу, и то - ещё не факт, что вы правильно их исправили.
ТС у вас самый сложный БАГ рандомная порча памяти, программа у вас маленькая лучше перепишите все заново а то задолбаетесь искать
еще аццки неудобно писать программу без возможности запустить программу в отладчике и интерактивно пронаблюдать за изменением памяти после исполнения каждой строки, я вапще незнаю как под эти ардуины писать - нет даже примитивных средств отладки
Как много я пропустил-то пока с е-бумагой "любовью занимался" :-(
Как много я пропустил-то пока с е-бумагой "любовью занимался" :-(
У вас с английским не очень, да? It usually means означает, что "Обычно, это означает...". Т.е. вам просто приводят пример, который может привести к такому поведению. Это - один из use-case, не более того. У вас проблема - в каше в коде, в которой (каше) очень сложно найти ошибки. Но они - есть. Парочку - я нашёл сходу, и то - ещё не факт, что вы правильно их исправили.
...я вапще незнаю как под эти ардуины писать - нет даже примитивных средств отладки
А последовательный порт на что?
Как это нет?
А последовательный порт на что?
Это наше все! :)
А последовательный порт на что?
Это уже продвинутое. Примитивное - это светодиод на 13-м пине.