Использование глобально массива char*

Тема в разделе "Arduino & Shields", создана пользователем user999, 1 мар 2017.

  1. user999

    user999 Гик

    Добрый день!
    Помогите с кодом. Мне нужно в функции заполнить массив, но использовать его в других функциях, т.е. сделать его глобальным.
    Внутри одной функции все работает:
    Код (C++):
    void setup() {
      Serial.begin(9600);
    }

    void loop() {
      temp1();
      delay(1000);
    }

    void temp1() {
      char* Var[] = {};
      char v1[] = "qwerty1";
      Var[0] = v1;
      Var[1] = "qwerty2";
      Serial.print("Var1:");
      Serial.println(Var[0]);
      Serial.print("Var2:");
      Serial.println(Var[1]);
    }
    А так не работает:

    Код (C++):
    char* Var[] = {};
     
    void setup() {
      Serial.begin(9600);
    }

    void loop() {
      temp1();
     
      Serial.print("Var1:");
      Serial.println(Var[0]);
      Serial.print("Var2:");
      Serial.println(Var[1]);
     
      delay(1000);
    }

    void temp1() {
      char v1[] = "qwerty1";
      Var[0] = v1;
      Var[1] = "qwerty2";
    }
     
     
  2. rkit

    rkit Гуру

    Размер массива надо указывать сразу.
    char *Var[2]

    В первом варианте вам просто повезло, что дальше на стеке не было ничего важного.
     
  3. user999

    user999 Гик

    Да пробовал.
    Этот код
    Код (C++):
    char*  Var[2] = {};
    void setup() {
      Serial.begin(9600);
    }

    void loop() {
      temp1();
      Serial.print("Var1:");
      Serial.println(Var[0]);
      Serial.print("Var2:");
      Serial.println(Var[1]);
      delay(1000);
    }

    void temp1() {
      char v1[] = "qwerty1";
      Var[0] = v1;
      Var[1] = "qwerty2";
    }
    Выводит
    Код (C++):
    Var1:ty1
    Var2:qwerty2
     
     
  4. rkit

    rkit Гуру

    Правильно, вы туда кладете указатели на стек, который затирается при выходе из temp1().
    Почитайте про массивы и память в C. Это сложно, и я на форуме в пару сообщений не смогу это объяснить.
     
  5. user999

    user999 Гик

    Уже 3-й день читаю и разные варианты пробую.
    Может мой пример поправите, что бы понятно было. Никак у меня не получается
     
  6. rkit

    rkit Гуру

    Код (C++):
    void temp1() {
      // Освобождаем предыдущие значения.  Если этого не делать,
      // то они будут копиться в куче, пока память не переполнится и ардуино не упадет
      free(Var[0]);
      free(Var[1]);

      char v1[] = "qwerty1";
      // Копируем строку в кучу, и кладем в массив указатель на копию.
      Var[0] = strdup(v1);
      Var[1] = strdup("qwerty2");
    }
     
    user999 нравится это.
  7. user999

    user999 Гик

    Спасибо огромное за пример. Все работает.
    Но вот массивы не сравнивает почему то в цикле

    Код (C++):
    int     qwerty1;
    String  qwerty2     = "";
     
    void setup() {
      Serial.begin(9600);
      temp1();
    }

    void loop() {
      Serial.print("Var1:");
      Serial.println(qwerty1);
      Serial.print("Var2:");
      Serial.println(qwerty2);
      delay(1000);
    }

    void temp1() {
      char* varArray[2] = {"qwerty1", "qwerty2"};
      char* Var[2]      = {};
      char* Val[2]      = {};
      free(Var[0]);
      free(Var[1]);
      free(Val[0]);
      free(Val[1]);
      char v1[]         = "qwerty1";
      Var[0]            = strdup(v1);
      Var[1]            = strdup("qwerty2");
      Val[0]            = strdup("60");
      Val[1]            = strdup("QWERTYQWERTY");
      for (int i=0; i <= 1; i++){
          if (Var[i] == varArray[0]) {
            qwerty1 =  Val[i];
          }
          if (Var[i] == varArray[1]) {
            qwerty2 =  Val[i];
          }
      }
    }
     
  8. rkit

    rkit Гуру

    Потому что вы указатели сравниваете.
     
  9. user999

    user999 Гик

    Не сочтите за сложность, подскажите как поправить
     
  10. user999

    user999 Гик

    Для переменной типа String помогли звездочки. Для int нет.
    Код (C++):
          if (*Var[i] == *varArray[1]) {
            qwerty2 =  Val[i];
          }
     
  11. user999

    user999 Гик

    Звездочки тоже не работают. Как правильно сравнить значения массивов?
     
  12. user999

    user999 Гик

    Нашел вариант:
    Код (C++):
     if (strcmp(Var[i],varArray[0]) == 0)