850 строк, две колонки, текстовые значения

pridecom
Offline
Зарегистрирован: 07.07.2017

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

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

850 пар слов (что такое  клингонский - не в курсе)- это навскидку, примерно 12-15 кб. А память у Нано - всего 2 Кб. Так что либо грузить во флеш(если табличка постоянная и не должна редактироваться), либо использовать внешние ЗУ.

И, на самом деле - не ясно, зачем на ардуине... такие вещи под андроид на смартфоне делать надо.

pridecom
Offline
Зарегистрирован: 07.07.2017

b707 пишет:
грузить во флеш(если табличка постоянная и не должна редактироваться)

можно поподробнее?

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

pridecom пишет:

b707 пишет:
грузить во флеш(если табличка постоянная и не должна редактироваться)

можно поподробнее?

искать по слову PROGMEM

char str[] = "Bla-bla-bla" - строка в ОЗУ, занимает 12 байт

const char str[] PROGMEM = "Bla-bla-bla" - неизменная строка(константа) в программной памяти (progmem), в ОЗУ места не занимает

pridecom
Offline
Зарегистрирован: 07.07.2017

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

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

А чо, у вас там, в Клингонии, чтение отменили?  Ну ты б хоть для интереса, штоли, почитал про микроконтроллеры, маленька хоть.

pridecom
Offline
Зарегистрирован: 07.07.2017

))) C удовольствием, дайте пож ссылку, не могу найти на русском

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

мда.....

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

зачем на ардуине-то делать, с такими знаниями, я не понимаю. 

bwn
Offline
Зарегистрирован: 25.08.2014

Мдя, чтение в Клингонии точно не в почете. Если на русском, то поднимаем взгляд к верху экрана, ниже большой надписи ARDUINO видим синие строчки с букавками, нажимаем курсором на крайнюю левую, изучаем что внутри, возвращаемся (есть стрелочка в левом верхнем углу браузера), нажимаем на следующую и так пока снова не окажемся на форуме. Когда изучите все синенькие ссылочки, обращайтесь, расскажу как пользоваться поисковой строкой.

Ой, виноват, даже возвращаться в браузере не надо, они постоянно прилеплены.

pridecom
Offline
Зарегистрирован: 07.07.2017

32 кило, отлично у меня.

Теперь бы понять какой тип переменных использовать для получения нужной мне таблицы значений, многомерный массив строк (2:850)?

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

pridecom пишет:

))) C удовольствием, дайте пож ссылку, не могу найти на русском

клингонский знаете, а английский нет?

Тип данных - символьный массив.

pridecom
Offline
Зарегистрирован: 07.07.2017

Еще вопрос.

Место в флеш памяти будет занимать только существующие значения или пустые тоже?

Например массив 4*850 заполненный наполовину значениями будет занимать места в два раза больше чем 2*850 полностью заполненный?

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

ты подумай еще, кста, в какой кодировке клингонский хранить и в какой - русский. 

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

pridecom пишет:

Еще вопрос.

Место в флеш памяти будет занимать только существующие значения или пустые тоже?

Например массив 4*850 заполненный наполовину значениями будет занимать места в два раза больше чем 2*850 полностью заполненный?

да, под пустые ячейки отводится столько же места. как под занятые. Если экономить место - можно придумать свой формат.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Мужики, Вы тут советуете "символьный массив", "прогмем/шрогмем", а никто ведь не спросил какой алфавит в клингонском языке? Мож там иероглифы и нужен UNICODE во весь рост! Или все знают, а я один отсталый?

kalapanga
Offline
Зарегистрирован: 23.10.2016

ЕвгенийП пишет:

Или все знают, а я один отсталый?

А я аж загуглил :)) Википедия

С иероглифами практически угадал!

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

ЕвгенийП пишет:

 никто ведь не спросил какой алфавит в клингонском языке? Мож там иероглифы и нужен UNICODE во весь рост!

ну а какая разница? разве Уникод отменяет данные ответы? все одно - словарик хранить в массивах во флеше или на внешних ЗУ...

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

b707 пишет:

разница? разве Уникод отменяет данные ответы? все одно - словарик хранить в массивах во флеше или на внешних ЗУ...

Ну, как какая разница? Писать обработку клингонского языка на С/С++ - абсолютно некошерно. Есть ведь специальный язык программирования для этого - Var'aq

http://www.reocities.com/connorbd/varaq/index.html
http://www.reocities.com/connorbd/varaq/varaqspec.html

https://www.trektoday.com/news/070800_05.shtml

Так что ТС необходимо найти (сделать) реализацию Var'aq для Ардуино и писать на нём. Любое другое решение - костыль и компромисс!

pridecom
Offline
Зарегистрирован: 07.07.2017

del

pridecom
Offline
Зарегистрирован: 07.07.2017
#include "LCD_1602_RUS.h"
LCD_1602_RUS lcd(0x27, 16, 2);

// [строки] [колонки]
String masseffect [2][2] = {
  {"apple"," яблоко"},
  {"book","книга"}
  };

void setup()
{
  lcd.init();                      // initialize the lcd
  lcd.backlight();
  lcd.setCursor(0, 0);
  
  lcd.print(L"masseffect[1][1]");
  lcd.setCursor(0, 1);
  //lcd.print(L"и English");
  lcd.print(masseffect[1][2]);
}

void loop()
{
}

Этот код не работает, проблема скорее всего в библиотеке.... помогайте.

непонятно как выводить текст из переменной, а не из явного указания в кавычках?

lcd.print(L"яблоко"); выводит
lcd.print(Lmasseffect[1][2]); ошибка, какой синтаксис?
 
b707
Онлайн
Зарегистрирован: 26.05.2017

а как не работает?

pridecom
Offline
Зарегистрирован: 07.07.2017

как раз был в процессе редактирования ... см выше

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

попробуйте    lcd.print(&masseffect[1][2]);

а вообще, если у вас большой словарь, который вы собираетесь хранить в PROGMEM - избавляйтесь от класса String. храните строки в символьных массивах, иначе намучаетесь.

pridecom
Offline
Зарегистрирован: 07.07.2017

в чем еще можно хранить слова?

не работает код с & (((

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

pridecom пишет:

в чем еще можно хранить слова?

const char [][] = {

{"book", "книга"},

{"table","стол"}

};

 

БЛИИИН! - только сейчас обратил внимание!

У вас описан массив 2х2 элемента? - так какого фига вы пытаетесь читать из него элемент masseffect[1][2] - ТАКОГО ТАМ НЕТ! Индексы массива в Си начинаются с нуля!

pridecom
Offline
Зарегистрирован: 07.07.2017

Спасибо, подправил, но это не решило моей проблемы невывода русского текста из переменной.

Кстати, const char [][] = {{"book", "книга"},{"table","стол"}}; тоже не работает (((

 

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

pridecom пишет:

Спасибо, подправил, но это не решило моей проблемы невывода русского текста из переменной.

Кстати, const char [][] = {{"book", "книга"},{"table","стол"}}; тоже не работает (((

А "нерусский" текст выводит?

ИМХО, борьба с LCD уже оффтопик для данной темы - ну смешно даже задавать вопросы об этом. столько раз это все разжевано в инете.

pridecom
Offline
Зарегистрирован: 07.07.2017

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

По типу данных так и не понял,  как задействовать const char [][] = {{"book", "книга"},{"table","стол"}}; 

вываливается с ошибкой

sadman41
Offline
Зарегистрирован: 19.10.2016
const char* dictionary [][2] = {{"book", "книга"},{"table","стол"}}; 

Serial.println(dictionary[1][0]);
Имя-то переменной кто будет давать - Пушкин?
b707
Онлайн
Зарегистрирован: 26.05.2017

pridecom пишет:

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

Правильно ли я вас понял, что из массива  английские слова выводит без проблем, а русские -нет?

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

sadman41 пишет:

const char* dictionary [][2] = {{"book", "книга"},{"table","стол"}}; 

Serial.println(dictionary[1][0]);
Имя-то переменной кто будет давать - Пушкин?

sadman41. сорри, это мой косяк.

Но у вас тоже - звездочка у char* не нужна, это должен быть массив символов, а у вас получился массив ссылок на символы

pridecom
Offline
Зарегистрирован: 07.07.2017

b707 пишет:

Правильно ли я вас понял, что из массива  английские слова выводит без проблем, а русские -нет?

я не знаю как сгенерировать вывод на русском из массива, т.к. нужен синтаксис lcd.print(L"хрень");

и если я подставлю lcd.print(Lmasseffect[0][0]); будет ошибка.

Пытаюсь собрать так, но теже не получается, помогите.
wchar_t  *str;
str = Lmasseffect[0][0];
lcd.print(str);

 

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

b707 пишет:

Но у вас тоже - звездочка у char* не нужна, это должен быть массив символов, а у вас получился массив ссылок на символы

Массив указателей на символьные строки. Я это и имел в виду.

Или я опять неправильно вспоминаю, чему меня учили в церковно-приходской школе?

ТС: чт у ваз за хрень с вездесущей буквой "L" ?

pridecom
Offline
Зарегистрирован: 07.07.2017

sadman41 пишет:

Массив указателей на символьные строки. Я это и имел в виду.

Это работает, спасибо, помогите теперь по сборке строки для вывода в формате L"текст", слово текст хранится с массиве

 

pridecom
Offline
Зарегистрирован: 07.07.2017

sadman41 пишет:

ТС: чт у ваз за хрень с вездесущей буквой "L" ?

Ну эта шляпа нужна для вывода русских букв в компоненте LCD_1602_RUS

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

Чего только люди не придумают....

const wchar_t* dictionary [][2] = {{L"book", L"книга"}, {L"table", L"стол"}};
...
lcd.clear();
lcd.setCursor(0, 1);
lcd.print(dictionary[0][0]);
lcd.setCursor(0, 2);
lcd.print(dictionary[0][1]);

 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Вам же сказали - клингонские тексты надо обрабатывать на языке  Var'aq! А Вы на чём пытаетесь?

pridecom
Offline
Зарегистрирован: 07.07.2017

Гит хаб заработал, качнул свежую версию и все разаработало, спасибо!!!!!!!!!!!!!!!

const wchar_t* dictionary [][2] = {{L"book", L"книга"}, {L"table", L"стол"}};

чем вам не клингонский массив )

#include "LCD_1602_RUS.h"

// [строки] [колонки]
const char*  dictionary [][2] = {
  {"apple","яблоко"},
  {"book","книга"}
  };

LCD_1602_RUS lcd(0x27, 16, 2);

void setup()
{
  lcd.init();                      // initialize the lcd
  lcd.backlight();

  lcd.setCursor(0, 0);
  lcd.print(dictionary[1][0]);
  
  lcd.setCursor(0, 1);
  lcd.print(dictionary[1][1]);
}

void loop()
{}

Кстати, подскажите еще как узнать количество строк в этом массиве?

 

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

Я вижу в этой ситуации два варианта решения:

1) Вы хотя бы немного прилагаете усилий по поиску в гугле;

2) Обращаетесь в другой раздел форума, где те, кто знают, что делают, пишут скетчи целиком.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

pridecom пишет:

Кстати, подскажите еще как узнать количество строк в этом массиве?

Есть много способов. 

Можно например, пальцем. Ставите палец на строку 5 и говорите "один", смещаете палец на строку вниз и говорите "два" и так пока массив не кончится.

Можно ещё (хотя это и не так кошерно) с помощью операции sizeof, если учесть, что количество элементов массива равно общему размеры всего массива, поделённому на размер элемента - sizeof(dictionary) / sizeof(dictionary[0])

pridecom
Offline
Зарегистрирован: 07.07.2017

 sizeof(dictionary) / sizeof(dictionary[0]) прекрасно работает, спасибо

теперь главный вопрос, как это разместить в флеш-памяти

кетч использует 16930 байт (55%) памяти устройства. Всего доступно 30720 байт.  - это хорошо
Глобальные переменные используют 7509 байт (366%) динамической памяти, оставляя -5461 байт для локальных переменных.  - а это плохо
#include "LCD_1602_RUS.h"

LCD_1602_RUS lcd(0x27, 16, 2);

// [строки] [колонки]
//const char*  dictionary [][2] = {
#include <avr/pgmspace.h>
const static String  dictionary [][2] PROGMEM  = {
{"angle","угол, поворачивать"},
{"ant","муравей"},
{"apple","яблоко"},  
.....пока 200
{"worm","червь"}
};

char buffer[30];    // массив был достаточно велик, чтобы вместить даже самую большую строку

//int sizeDictionary =  sizeof(dictionary) / sizeof(dictionary[0]) ;
int varints = 2 ; //сколько предлагать вариантов
int randstart ;

void setup()
{
  lcd.init();                      // initialize the lcd
  lcd.backlight();

  lcd.setCursor(0, 0);
  lcd.print("Размер словаря:"); //верхняя строка
  lcd.setCursor(7, 1);
//  lcd.print(sizeDictionary) ; // размер словаря  
  delay (1400);

  lcd.clear() ;
  lcd.noBacklight();
  delay (400);
  lcd.backlight();
    
}
void loop() {  }

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

сначала каждую строчечку в PROGMEM пхаешь, а потом только - в массив.

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

a String - никак, это объект

pridecom
Offline
Зарегистрирован: 07.07.2017

DetSimen пишет:
  а потом только - в массив.

ОООО, злой котяра сегодня с утра добрый )))

т.е. каждую строку в пргмем, а потом массив сделать со ссылками на эти строки?

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Только на String. 

pridecom
Offline
Зарегистрирован: 07.07.2017
  1. const char string_0[] PROGMEM = "String 0";   
  2. const char string_1[] PROGMEM = "String 1";
  3. ...
  4. const char string_850[] PROGMEM = "String 850";
  5.  
  6. const char* const string_table[] PROGMEM = {string_0, string_1, string_2, string_3, string_4, ... string_850};
 
 
Так чтоли?
DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Примерно так.  только надо же массив двумерный, не?

в принципе и одномерным массивом можно обойтись, если жеска знать, что четный индекс - калгонский, нечётный индекс - перевод с него

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

ЕвгенийП пишет:

Только на String. 

а што на String?

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

Да, тут придется писать на перловке генератор прогмем-массива ))

pridecom
Offline
Зарегистрирован: 07.07.2017

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