Добрый день! Помогите с кодом. Мне нужно в функции заполнить массив, но использовать его в других функциях, т.е. сделать его глобальным. Внутри одной функции все работает: Код (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"; }
Размер массива надо указывать сразу. char *Var[2] В первом варианте вам просто повезло, что дальше на стеке не было ничего важного.
Да пробовал. Этот код Код (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
Правильно, вы туда кладете указатели на стек, который затирается при выходе из temp1(). Почитайте про массивы и память в C. Это сложно, и я на форуме в пару сообщений не смогу это объяснить.
Уже 3-й день читаю и разные варианты пробую. Может мой пример поправите, что бы понятно было. Никак у меня не получается
Код (C++): void temp1() { // Освобождаем предыдущие значения. Если этого не делать, // то они будут копиться в куче, пока память не переполнится и ардуино не упадет free(Var[0]); free(Var[1]); char v1[] = "qwerty1"; // Копируем строку в кучу, и кладем в массив указатель на копию. Var[0] = strdup(v1); Var[1] = strdup("qwerty2"); }
Спасибо огромное за пример. Все работает. Но вот массивы не сравнивает почему то в цикле Код (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]; } } }
Для переменной типа String помогли звездочки. Для int нет. Код (C++): if (*Var[i] == *varArray[1]) { qwerty2 = Val[i]; }