Непонятки с массивом

Тема в разделе "Arduino & Shields", создана пользователем mishgan, 12 май 2015.

  1. mishgan

    mishgan Нуб

    Делаю небольшой проект по управлению пивоварней. Рецепты хранятся на sd карте в таком виде -
    Код (Text):
    3,IPA,62,72,82,3,3,3,8,3,2,5,7;
    3,STAUT,32,43,62,10,25,30,60,3,60,90,95;
    5,BITTER,30,40,50,60,70,10,20,30,40,50,60,3,60,90,95;
    3,PORTER,32,45,72,10,25,30,30,2,10,20;
    .....
     
    А так я его заношу в массив
    Код (Text):

    char *recepies[30][30];
    void setup()
    {
      Serial.begin(9600);
    ....
    SD_recepies() ;
    //проверка №1
    for (int j=0; j <10 ; j++) {
      Serial.print(recepies[j][0]); Serial.print("-") ;Serial.print(recepies[j][1]);Serial.print("-") ;Serial.println(recepies[j][2]);
    }
    }
    void SD_recepies() {
    String stringOne = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,;";
    int q=0;
    int t=0;
    int h=0;
    char symbol2 = 0;
    char array[10];
    File configFile = SD.open("recepies.txt");
    if (configFile) {
          while  (configFile.available())  {
           symbol2 = configFile.read();
        if (stringOne.indexOf(symbol2)!=-1) {
          if (symbol2==';' ) {t++; recepies[q][t]=array;  q++; t=0; h=0 ; kol_receptov++;  memset (array, 0, sizeof(array));  }
          else {
            if (symbol2==',') {recepies[q][t]=array; h=0; t++;  memset (array, 0, sizeof(array)); }
            else  {array[h]=symbol2; h++;}
          }
        }
     
          delay(1);
        }
        configFile.close();
    }
    //проверка №2
      for (int j=0; j <10 ; j++) {
      Serial.print(recepies[j][0]); Serial.print("-") ;Serial.print(recepies[j][1]);Serial.print("-") ;Serial.println(recepies[j][2]);
    }
    }
    Делаю 2 проверки. Проверка №1 выдает иероглифы, 2-я выдает только знаки "-". Всю голову вчера себе сломал..... Подскажите где я не то делаю...
     
    Последнее редактирование: 12 май 2015
  2. mishgan

    mishgan Нуб

    А если добавить в строчки
    Код (Text):
     if (symbol2==';' ) {t++; recepies[q][t]=array;  q++; t=0; h=0 ; kol_receptov++;  memset (array, 0, sizeof(array));  } ...
    if (symbol2==',') {recepies[q][t]=array; h=0; t++;  memset (array, 0, sizeof(array)); }
    после recepies[q][t]=array; следующее Serial.println(recepies[q][t]); то выводит все как надо.
     
  3. Unixon

    Unixon Оракул Модератор

    Вы совершенно неправильно работаете со строками. Присваивание одной переменной типа char* другой всего лишь копирует указатель на массив символов, оно не копирует содержимое строки. А уж распихивать указатель на локальную статическую переменную array, находящуюся в стеке во все элементы recepies - это изощренный способ обкладывание себя граблями со всех сторон.
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Сделайте класс для хранения рецепта и программа станет гораздо проще и понятней.
     
  5. mishgan

    mishgan Нуб

    Хорошие люди с соседнего форума подсказали
    Код (Text):
    char recname[30][15];
    int recpara[30][20];


    void Load_recepies() {
      File configFile = SD.open("recepies.txt");
      if (configFile)
      {
        char buff[15];
        byte rec = 0, par = 0, c = 0;
        while(configFile.available())
        {
          char symb = configFile.read();
          if(symb >= 32)
          {
            if(symb == ',' || symb == ';')
            {
              buff[c] = '\0';
              c = 0;
              if(par == 0) strcpy(recname[rec], buff);
              else recpara[rec][par-1] = atoi(buff);
              par++;

              if(symb == ';')
              {
                par = 0;
                rec++;
              }
            }
            else buff[c++] = symb;
          }
        }
      }
    }
     
     
  6. Unixon

    Unixon Оракул Модератор

    Только еще добавьте проверки для c, par, rec, чтобы не выйти за границы массива.