Как добавлять в массив

if (screen_num == 2) {
      int i = 0;
      while(i <= 20) {
        potv();
        delay(500);
        lcd.home();
        lcd.print("Gradus: ");
        lcd.leftToRight();
        lcd.print(i);
        lcd.setCursor(0,1);
        lcd.print("Koef: ");
        lcd.leftToRight();
        lcd.print(koef_s);
        if (digitalRead(bv_p)) {
          koef_s = koef_s + val_v; 
        }
        if (digitalRead(bv_m)) {
          koef_s = koef_s - val_v;
        }
        if (digitalRead(bc_p)) {
          type_custom[i] = koef_s;
          i++;
        }
        if (digitalRead(bc_m)) {
          break;
        }
      }
      setup_sc = false;
      type = 3;
    }

вот как я написал массив:
float type_custom[] = {};

Не нашел в интернете, как добавлять в массив, поэтому пишу сюда. Нужно чтоб значение которое укажит пользователь(значение переменной float koef_s = 0;), переносилось в массив.

а что будет, если условия в строках 14,17,20 и 24 будут истины в момент времени?

Есть две кнопки, которые увеличивают или уменьшают значение. val_v - это значение, которое я указываю в заранее. То бишь, кнопка “plus” нажата, увеличивается значение на val_v.

24 - выходит из цикла while()

Схему подключения кнопок выложите.

Да причем тут кнопки.

const int bc_p = 4;

const int bc_m = 7;

const int bv_p = 13;

const int bv_m = 8;

Мне нужно чтоб значение koef_s закидывалось в массив type_custom, когда я нажму bc_p. Зачем вам кнопки?

Действительно, чёй-то я. ε=ε=ε=ε=┏(  ̄▽ ̄)┛

1 лайк

Так есть идеи, как мне это сделать?

есть единственная идея - учить матчасть

Спасибо, очень помогли. Как думаете, есть польза от вашего сообщения?

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

Вам нужно заранее решить, сколько элементов будет в массиве type_custom(например 10) и объявить массив с такой длиной:

 float type_custom[10] = {0};
1 лайк

ну или запрашивать память по ходу исполнения динамически

float *dynArray;
.
.
dynArray = new float[10];
1 лайк

Никак. Потому и не нашли.

Напрасно. Тут надо в “Спортлото” писать. Ну, или, таки почитать учебник по языку.

Возможно я туплю, но ведь можно так, и добавляй, сколько хочешь?

float type_custom[] = {0};

Можно. Только добавляться будет куда попало. Если повезёт, то в свободную память, а не повезёт - так в память, занятую другими переменными, попутно их засирая изменяя.

1 лайк

Спасибо за ответ, не знал этого.
Возможно ли такое явление, когда у МК ещё много свободной памяти(той, что мы видим в сообщении после компиляции)?
P.S. Или это относится к случаю, когда есть нехватка свободной памяти?

Ну ты же описываешь массив размером в одну переменную. Чего ты хочешь добиться то?

это массив в один элемент.

Размер массива в СИ при создании определяется либо цифрой в квадратных скобках:

float type_custom[5];   // array with 5 elements

либо длиной списка инициализации

float type_custom[] = {1,  2, 3);   // array with 3 elements

Надеюсь, теперь понятно, почему запись ТС:

float type_custom[] = {};

это полная бессмыслица?

Я ничего добиться не хочу, просто я , по незнанию часто так делал, и проблем не было))

Спойлер
byte mass[] = {0};
byte size = 0;
byte MAX = 55;
byte num = 0;

void setup() {
  Serial.begin(9600);
  delay(300);
}

void loop() {
  while (size < MAX) {
    Serial.println(mass[size] = num++);
    size++;
  }
}
Спойлер

Screenshot_67

просто повезло

Правила создания массивов см в #18

1 лайк