Заполнить массив

kinsei
Offline
Зарегистрирован: 11.03.2019

Добрый день,
помогите пожалуйста с такой задачей - нужно заполнить массив [10000,4] от 0000 до 9999 таким образом, чтобы каждому элементу массива соответствоавала только одна цифра, при этом там где нет цифр, оставить 0.
Например, цифре 0 надо вписать 0,0,0,0. Цифре 10 - 0,0,1,0. Цифре 200 - 0,2,0,0.

То есть нужно получить вот такой массив:
{0,0,0,0},
{0,0,0,1},
{0,0,0,2},
...
{9,9,9,8},
{9,9,9,9}
Всю голову сломал, вроде как это делать надо через перевод в String и затем используя оператор Char?

 

b707
Онлайн
Зарегистрирован: 26.05.2017

kinsei пишет:

Всю голову сломал, вроде как это делать надо через перевод в String и затем используя оператор Char?

На ардуино задача вообще не имеет решения, так как очевидно, что для такого массива нужно как минимум 40 тыс байт - а на ардуинке ОЗУ всего 2К и даже флеша только 32К

Что касается метода решения - никаких String  там и близко быть не должно. Подход зависит от того, что вы хотите иметь элементами массива. Если цифры - нужно делить число на разряды операцией целочисленного деления и взятия остатка. Если символы - процедура itoa() вам в помощь

Но повторюсь - ни для такого количества цифр ни для символов в ардуине места не хватит.

Добавка - а вообще, самое правильное - это не готовить заранее огромный массив со всеми возможными числами - а вместо этого "на ходу" создавать нужный элемент массива из текущего числа.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Угу, где собссенно Вы собираетесь ентот массив разместить до заполнения и куда запулитьь после оного.

Например в меге оперативы 8 к

может быть считать текущее число и преобразовывать 'на лету' по мере необходимости?

Если бы Вы озвучили конечную задачу, возможно нашлись бы нетривиальные ответы.

 

kinsei
Offline
Зарегистрирован: 11.03.2019

Я купил авто с сигналкой, от которой был утерян код аварийного снятия. В техподдержке мне сказали что код этот из 4 цифр и его можно подобрать методом перебора, защиты от брутфорса у неё нет. Поначалу я пытался руками перебрать рандомно, но устал на третий день, решил собрать на ардуино переборщик. С паяльником дружу, с программированием - нет :( Понимаю, что можно сделать на циклах, но не могу придумать как в цикле указать что если цифра 1, то надо отсылать на реле 4 цифры - 0001, при этом 0 это 10 "нажиманий". Если код например 0234, то нужно отослать 10 нажиманий, 2 нажимания, 3 нажимания, 4 нажимания. С синтаксисом худо бедно разобрался, научился мигать светодиодом и даже надергал из примеров вот это (ногами не пинать, синтаксис из школьного курса паскаля двадцатилетней давности):

int led1 = 8; int i1 = 0; int i0 = 0; int j1 = 0;
void setup() {

  Serial.begin(9600);
  pinMode(led1, OUTPUT);
      
  while (j1 <= 9) {
    Serial.println(j1);
    if (j1 < 1) {
      while(i0 <= 9) { 
        digitalWrite(led1, HIGH);
        delay(500);
        digitalWrite(led1, LOW);
        delay(500);
        i0++;
      }
    }
    else {          
      while(i1 < j1) { 
        digitalWrite(led1, HIGH);
        delay(500);
        digitalWrite(led1, LOW);
        delay(500);
        i1++;
      }
    }
    delay (1500);
    j1++; i1=0; 
  }
}

void loop() {
}
Помогите, пожалуйста, решить эту задачку :)
b707
Онлайн
Зарегистрирован: 26.05.2017

kinsei - массив из 10 тыс чисел вам в этом коде совершенно не нужен.

Но дальше я пас - взлом сигналок без меня.

sadman41
Offline
Зарегистрирован: 19.10.2016

В духе паскаля:

Берете 4 цикла от 0 до 9 (скажем, переменные названы так: n1000, n100, n10, n1) вставляете их друг в друга. Таким таким образом внутри самого "дальнего" получаете четыре переменные, которые перебираются от 0 до 9 - тысячи, сотни, десятки, единицы. Далее - "нажимаете" тем, что подбирает в соответствии с этими переменными.

kinsei
Offline
Зарегистрирован: 11.03.2019

b707 пишет:

Но дальше я пас - взлом сигналок без меня.

Это не взлом! Сигналка снята и лежит на столе, брелок работает, но что если я его потеряю? Поэтому есть такое понятие как аварийное снятие через код. Этот код подбирается брутфорсом, даже если это автоматизировать, то надо 3-4 дня на подбор, что совершенно не относится ко взлому!

kinsei
Offline
Зарегистрирован: 11.03.2019

Это я понимаю, вложенные циклы я пробовал, но проблема в следующем - нужно, например, из цифры 0234 сделать последовательно 10 нажиманий, 2, 3, 4 нажимания, между ними полсекунды задержки. То есть как перевести цифру 234 в матрицу 0,2,3,4 ? Я почему-то сразу и подумал про массивы...

b707
Онлайн
Зарегистрирован: 26.05.2017

kinsei пишет:

Это я понимаю, вложенные циклы я пробовал, но проблема в следующем - нужно, например, из цифры 0234 сделать последовательно 10 нажиманий, 2, 3, 4 нажимания, между ними полсекунды задержки. То есть как перевести цифру 234 в матрицу 0,2,3,4 ? Я почему-то сразу и подумал про массивы...

Блин, ну подумайте чуть-чуть. Если надо - перечитайте ответ Садмана два. три раза, если не поймете - десять раз. Вложенные циклы как раз и дают вам эту "матрицу"...

sadman41
Offline
Зарегистрирован: 19.10.2016

Внутри четырёх вложенных циклов нет цифры 0234, а есть: n1000=0, n100=2, n10=3,  n1=4. Далее придумаете, наверное, как с ними управиться.

nik182
Онлайн
Зарегистрирован: 04.05.2015

На неделе кто то уже подбирал код по станок... 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Думаешь, одна бригада "три гада"?

kinsei
Offline
Зарегистрирован: 11.03.2019

DetSimen пишет:

Думаешь, одна бригада "три гада"?

Как мне кажется, те кто специализируется на этом не стали бы спрашивать, спецов бы за деньги взяли. Да и кстати я уже натыкался на скетчи и схемы кодграбберов, когда искал все что может помочь - на эту тему есть всё готовое. А моя проблема вообще из другой плоскости.

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

kinsei
Offline
Зарегистрирован: 11.03.2019
Ребят, получилось, но ещё 1 затык, вот код:
int led1 = 8; 
int n1000 = 0; 
int n100 = 0; 
int n10 = 0; 
int n1 = 0; 

void setup() {
  Serial.begin(9600);
  pinMode(led1, OUTPUT);
  
  for (n1000; n1000<=9; n1000++) {
    for (n100; n100<=9; n100++) {
      for (n10; n10<=9; n10++) {
        for (n1; n1<=9; n1++) {
          Serial.print(n1000);
          Serial.print(n100);
          Serial.print(n10);
          Serial.print(n1);
          Serial.println("  ");
        }    
      }  
    }      
  }    
    
}
  
void loop() {
}

Результат:
0000 
0001 
0002 
0003 
0004 
0005 
0006 
0007 
0008 
0009  

! Почему-то отрабатывает нормально только последний цикл, остальные - 1 раз.

 

kinsei
Offline
Зарегистрирован: 11.03.2019

While - тоже самое :(
b707
Онлайн
Зарегистрирован: 26.05.2017

Два замечания.

Главное! - прочитайте правила форума и вставляйте код правильно. Если этого не сделаете, дальше никакого обсуждения не будет

Второе - посмотрите справку по синтаксису цикла for - у вас в нем ошибка

kinsei
Offline
Зарегистрирован: 11.03.2019

Понял, исправил.

b707
Онлайн
Зарегистрирован: 26.05.2017

kinsei пишет:

Понял, исправил.

а справку по for посмотрели? похоже нет

kinsei
Offline
Зарегистрирован: 11.03.2019

b707 пишет:

kinsei пишет:

Понял, исправил.

а справку по for посмотрели? похоже нет

Да, я нашел свой косяк, огромное вам спасибо!

Вот рабочий код :)

int led1=8; 

void setup() {
  Serial.begin(9600);
  pinMode(led1, OUTPUT);
  for (int n1000=0; n1000<=9; n1000++) {
    for (int n100=0; n100<=9; n100++) {
      for (int n10=0; n10<=9; n10++) {
        for (int n1=0; n1<=9; n1++) {
          Serial.print(n1000);
          Serial.print(n100);
          Serial.print(n10);
          Serial.print(n1);
		  Serial.println("  ");
        }    
      }  
    }
  }
}
  
void loop() {
}