Пустой массив объявленный как arr_Value[ ] = { }; выводит значения. почему?

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

arr_Value[10]={};

все в порядке, вывожу в печать получаю нули, если вывожу

arr_Value[]={};

получаю преимущественно нули и несколько случайных чисел

0
0
52
0
91
0
0
0
0
255
0
95
0
140
0

в общем можно залить нулями или еще какие костыли, но в чем дело то? ведь объявляя с равенством “={}” по-моему объявляем с нулевыми значениями? или я ошибаюсь

а каков размер массива во втором случае?
сколько

3 лайка

А общее количество значений какое? Мильён? Больше? Меньше?)

в первом случае 10, во втором 0, но где то встречал такой способ объявления и помнится что должны быть нули. это утверждение верно или нет?

ну если я в массив данные не записываю то значений там “0”, я понимаю что я обращаюсь к пустым значениям, не понятно мне где берутся цифры. они, кстати, одни и теже

а я знаю ответ! в первом случае он зарезервировал память под значения, а во втором нет! следовательно ими пользуется кто хочет, и гадит там!
dmitriy_8 подскажите пж вам нужен код что бы знать кто там эти дела сделал ?

Сколько должно быть нулёй? Ноль? 10? 20? 100500? Сколько?

1 лайк

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

#define Value A1//читаемый пин
uint32_t data_length = 5;
float arr_Value[10]={};

void setup() {
  Serial.begin(115200);
  pinMode(Value, INPUT);
  Serial.println("Start");
  bool flag=0;
  for (uint8_t i=0; i<data_length; i++){
    if (flag==0){
      if (i<data_length){
        arr_Value[i] = analogRead(Value)*5.13/1024;
        Serial.println(arr_Value[i]);
      }
      else{flag=1;}
    }
  }
}

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

это паранноя? забить?

Нет, давайте так!

Вы утверждаете, что

Так ответьте на мой вопрос.

Сколько нулей там должно быть?

1 лайк

нисколько, там пусто. но думал, что нули создаются когда мы начинаем работать с записями массива, т.е. мы их записываем или обращаемся к ним и они объявляются как 0

Уже лучше.

А что такое “пусто”? По-вашему.

С каким записями? Вы же сами сказали, что этих самых записей там аж 0 штук! Вы с нудём записей работать собрались?

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

int *arrValue = new int[10];

Ясно, понял. И.е. правильно выделять место под необходимое количество записей

Я понял. Создаю массив под необходимое количество

Умнеешь прямо на глазах.

Я так и не понял, вот такое когда выводится то???

И зачем оно было в теме?

вы лучше это спросите у кого то еще…
иногда памяти мало, и лучше создавать массив а потом удалять, я просто это у вас узнать хотел, а то я не понимаю что вы делаете)))

#define Value A1
float* arr_Value = nullptr;
uint32_t data_length = 0;

void setup() {
  Serial.begin(115200);
  pinMode(Value, INPUT);
  Serial.println("Start");
}

void collectData(uint32_t seconds) {
  // ПЕРВЫЙ ПРОХОД: считаем, сколько сэмплов получится
  uint32_t sample_count = 0;
  uint32_t start_time = millis();
  
  while (millis() - start_time < seconds * 1000) {
    sample_count++;
    delay(10);  // Имитация времени между сэмплами
  }
  
  // ВТОРОЙ ПРОХОД: создаем массив и собираем данные
  arr_Value = new float[sample_count];
  
  start_time = millis();
  uint32_t index = 0;
  while (millis() - start_time < seconds * 1000 && index < sample_count) {
    arr_Value[index] = analogRead(Value) * 5.13 / 1024;
    index++;
    delay(10);
  }
  
  data_length = sample_count;
  
  // Используем данные
  for (uint32_t i = 0; i < data_length; i++) {
    Serial.println(arr_Value[i]);
  }
  
  // Освобождаем память
  delete[] arr_Value;
  arr_Value = nullptr;
}

void loop() {
  collectData(2);  // Собираем данные в течение 2 секунд
  delay(2000);      // Пауза перед следующим сбором
}

задачи бывают разные…

Учитесь сами искать ответы на собственные вопросы:

Serial.println(sizeof(arr_Value));

так можно

float arr_Value[10]={};

и вот так тоже можно

float arr_Value[]={1,2,3,4};

а так нельзя, это бред

1 лайк