Передача строки в функцию

5N62V
Offline
Зарегистрирован: 25.02.2016

Люди добрые! Вы простите, что я к вас обращаюсь. Сами мы не местные, паспорт украли..... ну и т.д.  :)

допустим, есть функция

void foo ( char * arg){

// чего-то там 

}

когда я к ней обращаюсь  foo("argument"); - все ок.  Когда делаю так

char s[] = "argument";

foo(s);

программа крашится, проц уходит в ребут.В чем разница, подскажите плз.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

нада объявить  const char *s = "argument";

5N62V
Offline
Зарегистрирован: 25.02.2016

DetSimen пишет:

нада объявить  const char *s = "argument";

Ща попробую. А пока сделал проверку:

void foo(char* t, char* tt){

  for(uint8_t i = 0; i<9; i++){
    Serial.printf("%d  %x  %x\n", i, *(t+i), *(tt+i));    
  }
Serial.printf("strlen t = %d, strlen tt = %d\n", strlen(t), strlen(tt));
}

void setup() {
  Serial.begin(115200);

  char s[] = "argument";
  foo("argument", s);
}

void loop() {}

В мониторе :

0  61  61
1  72  72
2  67  67
3  75  75
4  6d  6d
5  65  65
6  6e  6e
7  74  74
8  0  0
strlen t = 8, strlen tt = 8
 
Вот и хде тут разница?! 
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

огласите весь нерабочий код.  минимальную программу, которая крашыца. 

rkit
Онлайн
Зарегистрирован: 23.11.2016

Полный код. Всегда. Полный. Код.

5N62V
Offline
Зарегистрирован: 25.02.2016

Ну, мужики, держитесь! :)

типа main:

#define MY_CS 5
#define MAX_PLAYLIST 128
#define MAX_NAME_LEN 20
#include "header.h"

File file;

void setup() {
  Serial.begin(115200);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  Serial.print("Initializing SD card...");
  if (!SD.begin(MY_CS)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  uint64_t cardSize = SD.cardSize() / (1024 * 1024);
  Serial.printf("SD Card Size: %lluMB\n", cardSize);


  getURLcontent();// проверяем контент на FTP

  listDir(SD, "/", 0);// проверяем контент на SD
  
  checkSDcontent();//имена лишних файлов с на карте(которые не совпадают
                   //с плейлистом на серваке) - заносим в в поле process
                   // для последующего удаления
                   // имена файлов которые есть на серваке но нет на карте
                   // заносим в process для последующего скачивания
  for(uint8_t i = 0; i< filesDowmloadNumber; i++){
    if(strlen(URLplayList[i].process) > 0)
    Serial.printf("Going to download %s \n", URLplayList[i].process);
    download_file(URLplayList[i].process, folderURL); // скачиваем недостающие 
    memset(URLplayList[i].process, 0, sizeof(URLplayList[i].process));
  }

listDir(SD, "/", 0);// проверяем контент на SD
}


void loop() {
}

Файл header.h

#include <UDHttp.h>
#include <FS.h>
#include <SD.h>
#include <SPI.h>
#include <WiFiClient.h>
#include "myClient.h"


const char* ssid     = "***";
const char* password = "***";
char ftp_server[] = "***";
char ftp_user[]   = "***";
char ftp_pass[]   = "***";
char folderURL[] = "***";

const char * urlFileName = "shortSample.mp3";

struct PlayList{//структура плейлиста
  uint16_t id;
  uint16_t order;
  char name [MAX_NAME_LEN];
  char process [MAX_NAME_LEN];
  uint8_t priority;
  uint32_t fileSize;  
};

int16_t urlFileNumber = 0;//количество файлов на серваке
int16_t sdFileNumber = 0;//количество файлов на карте
int16_t filesDowmloadNumber = 0;//количество файлов кот надо скачать
PlayList SDplayList[MAX_PLAYLIST];//плейлист на карте
PlayList URLplayList[MAX_PLAYLIST];//плейлист на серваке

файл с функциями functions.ino - самый треш :)

// не используется
int responsef(uint8_t *buffer, int len) {
  Serial.printf("%s\n", buffer);
  return 0;
}

//write data callback
int wdataf(uint8_t *buffer, int len) {
  //write downloaded data to file
  return file.write(buffer, len);
}
//отображение прогресса скачивания
void progressf(int percent) {
  static int last = -1;
  if (last != percent)Serial.println(percent);
  last = percent;
}
//****************************************************** DOWNLOAD FILE VIA HTTP
void download_file(char* file_name , char* folder_name) {
  UDHttp udh;
  uint8_t _a = strlen(folder_name);
  uint8_t _b = strlen(file_name);
  char url[_a + _b + 1];
  memset(url, 0, sizeof(url));
  memcpy(url, folder_name, _a);//strcpy тут не катит, как оказалось
  memcpy(url + _a, file_name, _b);

  Serial.printf("Start Doanloading  %s\n", url);//проверяем правильность URL
  file = SD.open( file_name, FILE_WRITE);//открываем файл для записи
  if (!file) {
    Serial.println("can not open file!");
    return;
  }
  Serial.print("Memory - "); Serial.println(uxTaskGetStackHighWaterMark(NULL));
  udh.download(url, wdataf, progressf);//чтение в буфер, сбрасываем на карту, печать прогресса
  file.close();

  Serial.printf("done downloading\n");
}
//******************************************************** CD CARD DIRECTORY LIST
void listDir(fs::FS &fs, const char * dirname, uint8_t levels) {
  uint8_t i = 0;
  File root = fs.open(dirname);
  if (!root) {
    Serial.println("Failed to open directory");
    return;
  }
  if (!root.isDirectory()) {
    Serial.println("Not a directory");
    return;
  }

  File file = root.openNextFile();
  while (file) {
    if (file.isDirectory()) {
      if (levels) {
        listDir(fs, file.name(), levels - 1);
      }
    } else {
      memcpy(SDplayList[i].name, file.name(), sizeof(SDplayList[i].name));
      SDplayList[i++].fileSize = file.size();
    }
    file = root.openNextFile();
  }
  sdFileNumber = i;
  printSDList();
}
//**************************************** GET FTP CONTENT
void getURLcontent() {
  uint8_t validFileCounter = 0;
  urlFileNumber = 0;
  myESP32_FTPClient ftp (ftp_server, ftp_user, ftp_pass);
  ftp.OpenConnection();
  ftp.ChangeWorkDir("***");
  String response = "";
  String       list[MAX_PLAYLIST];
  ftp.InitFile("Type A");
  ftp.ContentList("", list);
  ftp.CloseConnection();
  for ( uint8_t i = 0; i < sizeof(list); i++)
  {
    uint8_t indexSize = 0;
    uint8_t indexMod  = 0;

    if (list[i].length() > 0)
    {
      list[i].toLowerCase();
      // нас интересуют только файлы mp3
      if ( list[i].indexOf("file") > -1  and list[i].indexOf(".mp3") > -1) {
        URLplayList[validFileCounter].name[0] = '/';
        strcpy(URLplayList[validFileCounter].name + 1, &list[i].substring(list[i].indexOf("; ") + 2)[0]);
        indexSize = list[i].indexOf("size") + 5;
        indexMod  = list[i].indexOf("modify") - 1;
        URLplayList[validFileCounter].fileSize = list[i].substring(indexSize, indexMod).toInt();
        validFileCounter++;
      }
      Serial.println(list[i]);
    }
    else
      break;
  }
  urlFileNumber = validFileCounter;
  printUrlList();
}

void   printUrlList() {
  for (uint8_t i = 0; i < urlFileNumber; i++) {
    Serial.print(i + 1); Serial.print(" "); Serial.print(URLplayList[i].name); 
    Serial.print(" "); Serial.println(URLplayList[i].fileSize);
  }
}

void   printSDList() {
  for (uint8_t i = 0; i < sdFileNumber; i++) {
    Serial.print(i + 1); Serial.print(" "); Serial.print(SDplayList[i].name); 
    Serial.print(" "); Serial.println(SDplayList[i].fileSize);
  }
}
//*******************************CHECK MATCHING FILES ON SD AND FTP
void checkSDcontent() {
  Serial.println("SD:");
  bool res = false;
  String str = "";
  for (uint8_t i = 0; i < sdFileNumber; i++) {
    res = true;
    for (uint8_t j = 0; j < urlFileNumber; j++) {
      str = String(URLplayList[j].name);
      if (compareStr(SDplayList[i].name, URLplayList[j].name, str.indexOf("mp3"))) {
        res = false;
        break;
      }
    }
    Serial.print(SDplayList[i].name); Serial.print("-"); Serial.println(!res ? "OK" : "DELETE");
    res = false;
  }
  Serial.println("URL:");
  Serial.print("urlFileNumber = "); Serial.println(urlFileNumber);
  Serial.print("sdFileNumber = "); Serial.println(sdFileNumber);
  str = "";
  for (uint8_t i = 0; i < urlFileNumber; i++) {
    res = true;
    for (uint8_t j = 0; j < sdFileNumber; j++) {
      str = String(URLplayList[i].name);
      if (compareStr(URLplayList[i].name, SDplayList[j].name, str.indexOf("mp3"))) {
        res = false;
        break;
      }
    }
    if (res) {
      Serial.println("DOWNLOAD!");
      Serial.print("i = "); Serial.println(i);
      Serial.print("file name = "); Serial.println(URLplayList[i].name);
      //download_file(URLplayList[i].name);
      memcpy(URLplayList[i].process, URLplayList[i].name, sizeof(URLplayList[i].name));
      filesDowmloadNumber++;
      res = false;
    }

  }
  Serial.printf("filesDowmloadNumber - %d \n", filesDowmloadNumber);

}
//************************* COMPARE STRING 
// возвращает true если одинаковые
// написал пока не выявил ф-цию источник краша
bool compareStr(const char* str1, const char * str2, uint8_t str1len) {
  bool res = true;
  Serial.printf("Compare %s and %s  len=%d \n", str1, str2, str1len);
  for (uint8_t i = 0; i < str1len; i++) {
    if (*(str1 + i) != *(str2 + i)) {
      res = false;
      break;
    }
  }
  Serial.println(res ? "OK" : "NOT");
  return res;
}

Там еще два файла с библиотекой myESP32_FTPClient, но она не причина краша.

Вот в этом варианте программа добросовестно крашится при обращении к ф-ии void download_file(char* file_name , char* folder_name)

в файле functions.

В мониторе:

[D][WiFiGeneric.cpp:337] _eventCallback(): Event: 0 - WIFI_READY
[D][WiFiGeneric.cpp:337] _eventCallback(): Event: 2 - STA_START
[D][WiFiGeneric.cpp:337] _eventCallback(): Event: 4 - STA_CONNECTED
[D][WiFiGeneric.cpp:337] _eventCallback(): Event: 7 - STA_GOT_IP
[D][WiFiGeneric.cpp:381] _eventCallback(): STA IP: 192.168.43.240, MASK: 255.255.255.0, GW: 192.168.43.1
.
WiFi connected
IP address: 
192.168.43.240
Initializing SD card...initialization done.
SD Card Size: 15080MB
//комментирую: ответ сервака на запрос контента
type=cdir;sizd=4096;modify=20191224063541;unix.mode=0755;unix.uid=1703;unix.gid=1701;unique=901g5000001; .

type=pdir;sizd=4096;modify=20191216091307;unix.mode=0755;unix.uid=1703;unix.gid=1701;unique=901g5002e8c; ..

type=file;size=18;modify=20191216102019;unix.mode=0644;unix.uid=1703;unix.gid=1701;unique=901g5000002; helloworld.txt

type=file;size=18;modify=20191216105752;unix.mode=0644;unix.uid=1703;unix.gid=1701;unique=901g5000008; helloworld1.txt

type=file;size=337;modify=20191221142348;unix.mode=0644;unix.uid=1703;unix.gid=1701;unique=901g500000b; index.php

type=file;size=5658112;modify=20191223131819;unix.mode=0644;unix.uid=1703;unix.gid=1701;unique=901g5000004; kn.mp3

type=file;size=6784152;modify=20191216110137;unix.mode=0644;unix.uid=1703;unix.gid=1701;unique=901g5000232; myaudio.mp3

type=file;size=127329;modify=20191224063542;unix.mode=0644;unix.uid=1703;unix.gid=1701;unique=901g5000235; shortsample.mp3
//список мп3 файлов на серваке, и размер
1 /kn.mp3
 5658112
2 /myaudio.mp3
 6784152
3 /shortsample.mp3
 127329
//список файлов на флешке
1 /foo.txt 13
2 /TEST1.MP3 166
3 /TEST2.MP3 6784152
4 /TEST7.MP3 13568304
5 /test8.mp3 127329
6 /lastTest.mp3 0
//анализируем чего удалить с карты памяти
SD:
Compare /foo.txt and /kn.mp3
  len=4 
NOT
Compare /foo.txt and /myaudio.mp3
  len=9 
NOT
Compare /foo.txt and /shortsample.mp3
  len=13 
NOT
/foo.txt-DELETE//решение удалить
Compare /TEST1.MP3 and /kn.mp3
  len=4 
NOT
Compare /TEST1.MP3 and /myaudio.mp3
  len=9 
NOT
Compare /TEST1.MP3 and /shortsample.mp3
  len=13 
NOT
/TEST1.MP3-DELETE//решение удалить
Compare /TEST2.MP3 and /kn.mp3
  len=4 
NOT
Compare /TEST2.MP3 and /myaudio.mp3
  len=9 
NOT
Compare /TEST2.MP3 and /shortsample.mp3
  len=13 
NOT
/TEST2.MP3-DELETE
Compare /TEST7.MP3 and /kn.mp3
  len=4 
NOT
Compare /TEST7.MP3 and /myaudio.mp3
  len=9 
NOT
Compare /TEST7.MP3 and /shortsample.mp3
  len=13 
NOT
/TEST7.MP3-DELETE
Compare /test8.mp3 and /kn.mp3
  len=4 
NOT
Compare /test8.mp3 and /myaudio.mp3
  len=9 
NOT
Compare /test8.mp3 and /shortsample.mp3
  len=13 
NOT
/test8.mp3-DELETE
Compare /lastTest.mp3 and /kn.mp3
  len=4 
NOT
Compare /lastTest.mp3 and /myaudio.mp3
  len=9 
NOT
Compare /lastTest.mp3 and /shortsample.mp3
  len=13 
NOT
/lastTest.mp3-DELETE
//анализ файлов на серваке, которые надо загрузить
URL:
urlFileNumber = 3
sdFileNumber = 6
Compare /kn.mp3
 and /foo.txt  len=4 
NOT
Compare /kn.mp3
 and /TEST1.MP3  len=4 
NOT
Compare /kn.mp3
 and /TEST2.MP3  len=4 
NOT
Compare /kn.mp3
 and /TEST7.MP3  len=4 
NOT
Compare /kn.mp3
 and /test8.mp3  len=4 
NOT
Compare /kn.mp3
 and /lastTest.mp3  len=4 
NOT
DOWNLOAD!//решение загрузить
i = 0
file name = /kn.mp3

Compare /myaudio.mp3
 and /foo.txt  len=9 
NOT
Compare /myaudio.mp3
 and /TEST1.MP3  len=9 
NOT
Compare /myaudio.mp3
 and /TEST2.MP3  len=9 
NOT
Compare /myaudio.mp3
 and /TEST7.MP3  len=9 
NOT
Compare /myaudio.mp3
 and /test8.mp3  len=9 
NOT
Compare /myaudio.mp3
 and /lastTest.mp3  len=9 
NOT
DOWNLOAD!
i = 1
file name = /myaudio.mp3

Compare /shortsample.mp3
 and /foo.txt  len=13 
NOT
Compare /shortsample.mp3
 and /TEST1.MP3  len=13 
NOT
Compare /shortsample.mp3
 and /TEST2.MP3  len=13 
NOT
Compare /shortsample.mp3
 and /TEST7.MP3  len=13 
NOT
Compare /shortsample.mp3
 and /test8.mp3  len=13 
NOT
Compare /shortsample.mp3
 and /lastTest.mp3  len=13 
NOT
DOWNLOAD!
i = 2
file name = /shortsample.mp3
//количесво файлов к загрузке - 3
filesDowmloadNumber - 3 
Going to download /kn.mp3
 
Start Doanloading  ***/kn.mp3
//анализ оставшейся стек памяти
// уже в функции download_file
Memory - 3364
// Усе! Кина не будет! 
Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC      : 0x4000c677  PS      : 0x00060830  A0      : 0x800d26ac  A1      : 0x3ffb1ba0  
A2      : 0x00000000  A3      : 0x3f40188b  A4      : 0x00000000  A5      : 0x00000000  
A6      : 0x00000063  A7      : 0x0000001f  A8      : 0x00000000  A9      : 0x00000043  
A10     : 0x0000000a  A11     : 0x3ffb1cd8  A12     : 0x000001f4  A13     : 0x3ffb1dfa  
A14     : 0x000000d2  A15     : 0x00000009  SAR     : 0x00000019  EXCCAUSE: 0x0000001c  
EXCVADDR: 0x00000000  LBEG    : 0x4000c2e0  LEND    : 0x4000c2f6  LCOUNT  : 0x00000000  

Backtrace: 0x4000c677:0x3ffb1ba0 0x400d26a9:0x3ffb1bc0 0x400d18ee:0x3ffb1ef0 0x400d2482:0x3ffb1f70 0x400d81b7:0x3ffb1fb0 0x40088dbd:0x3ffb1fd0

Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:9720
ho 0 tail 12 room 4
load:0x40080400,len:6352
entry 0x400806b8

URLы запикал - не мой сервак, сорри.

Вот такая картина.  Ссылка на библиотеку http клиента, где реализована ф-ия udh.download(url, wdataf, progressf);

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Ну как минимум, навскидку, вижу. что в listlDir не закрывается дескриптор. open мы делаем, а close - нет. А надо бы. Далее, строка 80 - там ошибка:

for ( uint8_t i = 0; i < sizeof(list); i++)

Маркер конца итерации - неправильный, это НЕ количество элементов list, а просто его размер. Надо так:

for ( uint8_t i = 0; i < sizeof(list)/sizeof(list[0]); i++)

Далее - чем strcmp не устроил, зачем самописные compareStr?

Короче, в коде ошибки есть, памяти оно жрёт, наскидку, не меньше 12 килобайт, жость :)

5N62V
Offline
Зарегистрирован: 25.02.2016

теперь строку 35 в файле functions я тупо меняю на:

udh.download("***/shortSample.mp3", wdataf, progressf);

И файл shortSample.mp3 три раза успешно скачиваются и сохраняется под разными именами на карте.

[D][WiFiGeneric.cpp:337] _eventCallback(): Event: 0 - WIFI_READY
[D][WiFiGeneric.cpp:337] _eventCallback(): Event: 2 - STA_START
[D][WiFiGeneric.cpp:337] _eventCallback(): Event: 4 - STA_CONNECTED
[D][WiFiGeneric.cpp:337] _eventCallback(): Event: 7 - STA_GOT_IP
[D][WiFiGeneric.cpp:381] _eventCallback(): STA IP: 192.168.43.240, MASK: 255.255.255.0, GW: 192.168.43.1
.
WiFi connected
IP address: 
192.168.43.240
Initializing SD card...initialization done.
SD Card Size: 15080MB
type=cdir;sizd=4096;modify=20191224063541;unix.mode=0755;unix.uid=1703;unix.gid=1701;unique=901g5000001; .

type=pdir;sizd=4096;modify=20191216091307;unix.mode=0755;unix.uid=1703;unix.gid=1701;unique=901g5002e8c; ..

type=file;size=18;modify=20191216102019;unix.mode=0644;unix.uid=1703;unix.gid=1701;unique=901g5000002; helloworld.txt

type=file;size=18;modify=20191216105752;unix.mode=0644;unix.uid=1703;unix.gid=1701;unique=901g5000008; helloworld1.txt

type=file;size=337;modify=20191221142348;unix.mode=0644;unix.uid=1703;unix.gid=1701;unique=901g500000b; index.php

type=file;size=5658112;modify=20191223131819;unix.mode=0644;unix.uid=1703;unix.gid=1701;unique=901g5000004; kn.mp3

type=file;size=6784152;modify=20191216110137;unix.mode=0644;unix.uid=1703;unix.gid=1701;unique=901g5000232; myaudio.mp3

type=file;size=127329;modify=20191224063542;unix.mode=0644;unix.uid=1703;unix.gid=1701;unique=901g5000235; shortsample.mp3

1 /kn.mp3
 5658112
2 /myaudio.mp3
 6784152
3 /shortsample.mp3
 127329
1 /foo.txt 13
2 /TEST1.MP3 166
3 /TEST2.MP3 6784152
4 /TEST7.MP3 13568304
5 /test8.mp3 127329
6 /lastTest.mp3 0
SD:
Compare /foo.txt and /kn.mp3
  len=4 
NOT
Compare /foo.txt and /myaudio.mp3
  len=9 
NOT
Compare /foo.txt and /shortsample.mp3
  len=13 
NOT
/foo.txt-DELETE
Compare /TEST1.MP3 and /kn.mp3
  len=4 
NOT
Compare /TEST1.MP3 and /myaudio.mp3
  len=9 
NOT
Compare /TEST1.MP3 and /shortsample.mp3
  len=13 
NOT
/TEST1.MP3-DELETE
Compare /TEST2.MP3 and /kn.mp3
  len=4 
NOT
Compare /TEST2.MP3 and /myaudio.mp3
  len=9 
NOT
Compare /TEST2.MP3 and /shortsample.mp3
  len=13 
NOT
/TEST2.MP3-DELETE
Compare /TEST7.MP3 and /kn.mp3
  len=4 
NOT
Compare /TEST7.MP3 and /myaudio.mp3
  len=9 
NOT
Compare /TEST7.MP3 and /shortsample.mp3
  len=13 
NOT
/TEST7.MP3-DELETE
Compare /test8.mp3 and /kn.mp3
  len=4 
NOT
Compare /test8.mp3 and /myaudio.mp3
  len=9 
NOT
Compare /test8.mp3 and /shortsample.mp3
  len=13 
NOT
/test8.mp3-DELETE
Compare /lastTest.mp3 and /kn.mp3
  len=4 
NOT
Compare /lastTest.mp3 and /myaudio.mp3
  len=9 
NOT
Compare /lastTest.mp3 and /shortsample.mp3
  len=13 
NOT
/lastTest.mp3-DELETE
URL:
urlFileNumber = 3
sdFileNumber = 6
Compare /kn.mp3
 and /foo.txt  len=4 
NOT
Compare /kn.mp3
 and /TEST1.MP3  len=4 
NOT
Compare /kn.mp3
 and /TEST2.MP3  len=4 
NOT
Compare /kn.mp3
 and /TEST7.MP3  len=4 
NOT
Compare /kn.mp3
 and /test8.mp3  len=4 
NOT
Compare /kn.mp3
 and /lastTest.mp3  len=4 
NOT
DOWNLOAD!
i = 0
file name = /kn.mp3

Compare /myaudio.mp3
 and /foo.txt  len=9 
NOT
Compare /myaudio.mp3
 and /TEST1.MP3  len=9 
NOT
Compare /myaudio.mp3
 and /TEST2.MP3  len=9 
NOT
Compare /myaudio.mp3
 and /TEST7.MP3  len=9 
NOT
Compare /myaudio.mp3
 and /test8.mp3  len=9 
NOT
Compare /myaudio.mp3
 and /lastTest.mp3  len=9 
NOT
DOWNLOAD!
i = 1
file name = /myaudio.mp3

Compare /shortsample.mp3
 and /foo.txt  len=13 
NOT
Compare /shortsample.mp3
 and /TEST1.MP3  len=13 
NOT
Compare /shortsample.mp3
 and /TEST2.MP3  len=13 
NOT
Compare /shortsample.mp3
 and /TEST7.MP3  len=13 
NOT
Compare /shortsample.mp3
 and /test8.mp3  len=13 
NOT
Compare /shortsample.mp3
 and /lastTest.mp3  len=13 
NOT
DOWNLOAD!
i = 2
file name = /shortsample.mp3

filesDowmloadNumber - 3 
Going to download /kn.mp3
 
Start Doanloading  ***/kn.mp3
Memory - 3364
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
done downloading
Going to download /myaudio.mp3
 
Start Doanloading  ***/myaudio.mp3
Memory - 3364
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
done downloading
Going to download /shortsample.mp3
 
Start Doanloading  ***/shortsample.mp3
Memory - 3364
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
done downloading
1 /kn.mp3 127329
2 /myaudio.mp3 127329
3 /foo.txt 13
4 /TEST1.MP3 166
5 /TEST2.MP3 6784152
6 /TEST7.MP3 13568304
7 /test8.mp3 127329
8 /lastTest.mp3 0
9 /shortsample.mp3 127329

Ну как тут матом не заругацца! 

rkit
Онлайн
Зарегистрирован: 23.11.2016

Очень много сделано через зад и без знания языка. Склеивают строки так:

char url[80] = "";
strcat(url, folder_name);
strcat(url, file_name);

 

Ну и директория не может называться "***".

5N62V
Offline
Зарегистрирован: 25.02.2016

rkit пишет:

Очень много сделано через зад и без знания языка. Склеивают строки так:

char url[80] = "";
strcat(url, folder_name);
strcat(url, file_name);

 

Ну и директория не может называться "***".

Не поверите, сначала я так и написал. :) Но полез краш "Stack Smashing protect Failure

", и пришлось написать так как написано. Эта проблема встречалась и у других, и в инете описана. Отнесем ее к багу. По началу многое было написано не так. Это вариант, который получился в следствии попыток избавиться от проблемы. Хотя да, я еще ток писака.

Директории запикал, сорри.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Ну то есть мы не будем править ошибки в коде, да и вообще код, чтобы не рушить стек, да? Вместо этого будем стрелять себе в ногу до тех пор, пока это кажется безопасным. Ведь если зажмуриться - то и не видно, правда?

Один тот факт, что было сообщение о краше стека - должен был навести на мысль, что стек - не резиновый, и надо бы переписать код, чтобы стек не рушился. Это не считая ошибок, о которых я писал выше.

5N62V
Offline
Зарегистрирован: 25.02.2016

DIYMan пишет:

Ну как минимум, навскидку, вижу. что в listlDir не закрывается дескриптор. open мы делаем, а close - нет. 

Да, согласен. Закрыл. Не помогло, но спасибо за свежий взгляд. List тоже попровил. Правда разницы не увидел.

Проц ESP32, памяти вроде достаточно. 

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

5N62V пишет:

Люди добрые! Вы простите, что я к вас обращаюсь. Сами мы не местные, паспорт украли..... ну и т.д.  :)

допустим, есть функция

void foo ( char * arg){

// чего-то там 

}

когда я к ней обращаюсь  foo("argument"); - все ок.  Когда делаю так

char s[] = "argument";

foo(s);

программа крашится, проц уходит в ребут.В чем разница, подскажите плз.

тут разница тока что во втором случае на стеке выделяется память для строки и она копируется туда а в первом просто ссылка на строку лежащую где в памяти с самого начала загрузки программы

со стеком у вас скорей всего намучено что то где то портится в другом месте

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

5N62V пишет:

Правда разницы не увидел.

Serial.println(sizeof(list));
Serial.println(sizeof(list)/sizeof(list[0]));

По прежнему в мониторе порта не видно разницы? Объясняю: sizeof одного экземпляра класса String - 6 байт, емнип. У вас в массиве таких экземпляров  20 штук. В ошибочном коде - вы пройдёте 120 (6*20) раз хрен знает по каким местам памяти, потому что, очевидно - вы вылазите за границы массива.

Во втором случае - получите размерность массива, потому что 120/6 = 20.

Рекомендую полистать книжку по С++, всё-таки.

5N62V
Offline
Зарегистрирован: 25.02.2016

DIYMan пишет:

Один тот факт, что было сообщение о краше стека - должен был навести на мысль, что стек - не резиновый, и надо бы переписать код, чтобы стек не рушился. 

Пардон, не понял. Сначала я написал так, как предложил товарищ rkit - стек рушился. Рушился он и у других, при применении strcat(). Я переписал так, чтобы не рушился. 

5N62V
Offline
Зарегистрирован: 25.02.2016

DIYMan пишет:

Во втором случае - получите размерность массива, потому что 120/6 = 20.

именно в мониторе и не увидел, а смысл понятен.

DIYMan пишет:

Рекомендую полистать книжку по С++, всё-таки.

Ваш посыл справедлив!

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

5N62V пишет:

DIYMan пишет:

Один тот факт, что было сообщение о краше стека - должен был навести на мысль, что стек - не резиновый, и надо бы переписать код, чтобы стек не рушился. 

Пардон, не понял. Сначала я написал так, как предложил товарищ rkit - стек рушился. Рушился он и у других, при применении strcat(). Я переписал так, чтобы не рушился. 

С++ - он такой. Опасная базука, которой можно себе бошку снести. То, что кажется, что ошибки нет - это только кажется.

Ещё раз: код - переписывать, ошибки - править, занятость стека - уменьшать, от самописных функций сравнения строк - избавляться, не гнать на strcpy и strcat - и постепенно всё получится.

Сейчас же ситуация следующая: вроде бы должно работать - но будет работать по фазам Луны. Надо проводить анализ кода на ошибки, плотный. А ошибки - есть, это точно.

5N62V
Offline
Зарегистрирован: 25.02.2016

baby_in_Arduino пишет:

тут разница тока что во втором случае на стеке выделяется память для строки и она копируется туда а в первом просто ссылка на строку лежащую где в памяти с самого начала загрузки программы

со стеком у вас скорей всего намучено что то где то портится в другом месте

Проблема со стеком была по другому поводу, и вроде бы я ее решил.

сейчас проблема:

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 in 0x3fxxxxxx - 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. еще бы понять чего это означает.... :/

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

я помню когда был молодой и зеленый писал большую программу на чистом Си, где вся работа со строками была на обычных сишных массивах и функциях навроде str***, короче программа стала крашится из за повреждения стека рандомно и ошибку я так и не нашел просидев в отладчике кучу времени))

 

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

5N62V пишет:

сейчас проблема:

This CPU exception happens when application attempts to read from or write to an invalid memory location. 

Что непонятно в описании проблемы?  Я же говорю - код полон ошибок, портим память. Может, лучше начать с примеров попроще, а не браться сразу на Уильяма нашего Шекспира?

5N62V
Offline
Зарегистрирован: 25.02.2016

DIYMan пишет:

Что непонятно в описании проблемы?  Я же говорю - код полон ошибок, портим память. Может, лучше начать с примеров попроще, а не браться сразу на Уильяма нашего Шекспира?

Вы видите где я разименовываю нулевой указатель? Вроде нигде....

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

5N62V пишет:

DIYMan пишет:

Что непонятно в описании проблемы?  Я же говорю - код полон ошибок, портим память. Может, лучше начать с примеров попроще, а не браться сразу на Уильяма нашего Шекспира?

Вы видите где я разименовываю нулевой указатель? Вроде нигде....

У вас с английским не очень, да? It usually means означает, что "Обычно, это означает...". Т.е. вам просто приводят пример, который может привести к такому поведению. Это - один из use-case, не более того. У вас проблема - в каше в коде, в которой (каше) очень сложно найти ошибки. Но они - есть. Парочку - я нашёл сходу, и то - ещё не факт, что вы правильно их исправили.

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

ТС у вас самый сложный БАГ рандомная порча памяти, программа у вас маленькая лучше перепишите все заново а то задолбаетесь искать

еще аццки неудобно писать программу без возможности запустить программу в отладчике и интерактивно пронаблюдать за изменением памяти после исполнения каждой строки, я вапще незнаю как под эти ардуины писать - нет даже примитивных средств отладки

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Как много я пропустил-то пока с е-бумагой "любовью занимался" :-(

5N62V
Offline
Зарегистрирован: 25.02.2016

ЕвгенийП пишет:

Как много я пропустил-то пока с е-бумагой "любовью занимался" :-(

Cамое время наверстать упущенное! :) заодно развлечетесь! 

5N62V
Offline
Зарегистрирован: 25.02.2016

DIYMan пишет:

У вас с английским не очень, да? It usually means означает, что "Обычно, это означает...". Т.е. вам просто приводят пример, который может привести к такому поведению. Это - один из use-case, не более того. У вас проблема - в каше в коде, в которой (каше) очень сложно найти ошибки. Но они - есть. Парочку - я нашёл сходу, и то - ещё не факт, что вы правильно их исправили.

Мой код работает и с исправлениями, и без. Проблема крылась именно в разыменовывании нулевого указателя. Автор, прости его Господи, библиотеки написал ее , видимо, специально, чтобы его конкретный пример работал. Любой ответ сервера, кроме ожидаемого, приводил к описанным проблемам. Переписал его библиотеку - усе работает, уря! Всем спасибо за участие!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

baby_in_Arduino пишет:

...я вапще незнаю как под эти ардуины писать - нет даже примитивных средств отладки

Как это нет?

А последовательный порт на что?

5N62V
Offline
Зарегистрирован: 25.02.2016

andriano пишет:

Как это нет?

А последовательный порт на что?

Это наше все! :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano пишет:

А последовательный порт на что?

Это уже продвинутое. Примитивное - это светодиод на 13-м пине.