850 строк, две колонки, текстовые значения
- Войдите на сайт для отправки комментариев
Пнд, 20/11/2017 - 20:35
Нужно сделать небольшой словарик, это таблица строковых значений, две колонки, слово на клингонском, слово на русском. Подскажите, как мне правильно организовать такую табличку для хранения и работы с ней в ардуино наночина. По номеру строки надо будет получать и значение и перевод.
850 пар слов (что такое клингонский - не в курсе)- это навскидку, примерно 12-15 кб. А память у Нано - всего 2 Кб. Так что либо грузить во флеш(если табличка постоянная и не должна редактироваться), либо использовать внешние ЗУ.
И, на самом деле - не ясно, зачем на ардуине... такие вещи под андроид на смартфоне делать надо.
можно поподробнее?
можно поподробнее?
искать по слову PROGMEM
char str[] = "Bla-bla-bla" - строка в ОЗУ, занимает 12 байт
const char str[] PROGMEM = "Bla-bla-bla" - неизменная строка(константа) в программной памяти (progmem), в ОЗУ места не занимает
первый раз слышу про эту память, а какой у меня ее объем в китайской нано, мне ее точно хватит?
А чо, у вас там, в Клингонии, чтение отменили? Ну ты б хоть для интереса, штоли, почитал про микроконтроллеры, маленька хоть.
))) C удовольствием, дайте пож ссылку, не могу найти на русском
мда.....
зачем на ардуине-то делать, с такими знаниями, я не понимаю.
Мдя, чтение в Клингонии точно не в почете. Если на русском, то поднимаем взгляд к верху экрана, ниже большой надписи ARDUINO видим синие строчки с букавками, нажимаем курсором на крайнюю левую, изучаем что внутри, возвращаемся (есть стрелочка в левом верхнем углу браузера), нажимаем на следующую и так пока снова не окажемся на форуме. Когда изучите все синенькие ссылочки, обращайтесь, расскажу как пользоваться поисковой строкой.
Ой, виноват, даже возвращаться в браузере не надо, они постоянно прилеплены.
32 кило, отлично у меня.
Теперь бы понять какой тип переменных использовать для получения нужной мне таблицы значений, многомерный массив строк (2:850)?
))) C удовольствием, дайте пож ссылку, не могу найти на русском
клингонский знаете, а английский нет?
Тип данных - символьный массив.
Еще вопрос.
Место в флеш памяти будет занимать только существующие значения или пустые тоже?
Например массив 4*850 заполненный наполовину значениями будет занимать места в два раза больше чем 2*850 полностью заполненный?
ты подумай еще, кста, в какой кодировке клингонский хранить и в какой - русский.
Еще вопрос.
Место в флеш памяти будет занимать только существующие значения или пустые тоже?
Например массив 4*850 заполненный наполовину значениями будет занимать места в два раза больше чем 2*850 полностью заполненный?
да, под пустые ячейки отводится столько же места. как под занятые. Если экономить место - можно придумать свой формат.
Мужики, Вы тут советуете "символьный массив", "прогмем/шрогмем", а никто ведь не спросил какой алфавит в клингонском языке? Мож там иероглифы и нужен UNICODE во весь рост! Или все знают, а я один отсталый?
Или все знают, а я один отсталый?
А я аж загуглил :)) Википедия
С иероглифами практически угадал!
никто ведь не спросил какой алфавит в клингонском языке? Мож там иероглифы и нужен UNICODE во весь рост!
ну а какая разница? разве Уникод отменяет данные ответы? все одно - словарик хранить в массивах во флеше или на внешних ЗУ...
разница? разве Уникод отменяет данные ответы? все одно - словарик хранить в массивах во флеше или на внешних ЗУ...
Ну, как какая разница? Писать обработку клингонского языка на С/С++ - абсолютно некошерно. Есть ведь специальный язык программирования для этого - 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 для Ардуино и писать на нём. Любое другое решение - костыль и компромисс!
del
#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(&masseffect[1][2]);
а вообще, если у вас большой словарь, который вы собираетесь хранить в PROGMEM - избавляйтесь от класса String. храните строки в символьных массивах, иначе намучаетесь.
в чем еще можно хранить слова?
не работает код с & (((
в чем еще можно хранить слова?
const char [][] = {
{"book", "книга"},
{"table","стол"}
};
БЛИИИН! - только сейчас обратил внимание!
У вас описан массив 2х2 элемента? - так какого фига вы пытаетесь читать из него элемент masseffect[1][2] - ТАКОГО ТАМ НЕТ! Индексы массива в Си начинаются с нуля!
Спасибо, подправил, но это не решило моей проблемы невывода русского текста из переменной.
Кстати, const char [][] = {{"book", "книга"},{"table","стол"}}; тоже не работает (((
Спасибо, подправил, но это не решило моей проблемы невывода русского текста из переменной.
Кстати, const char [][] = {{"book", "книга"},{"table","стол"}}; тоже не работает (((
А "нерусский" текст выводит?
ИМХО, борьба с LCD уже оффтопик для данной темы - ну смешно даже задавать вопросы об этом. столько раз это все разжевано в инете.
выводит, и русский выводит, но не из переменной, перереыл все что нашел, так и не понял как из переменной сделать русский.
По типу данных так и не понял, как задействовать const char [][] = {{"book", "книга"},{"table","стол"}};
вываливается с ошибкой
const char* dictionary [][2] = {{"book", "книга"},{"table","стол"}}; Serial.println(dictionary[1][0]);выводит, и русский выводит, но не из переменной, перереыл все что нашел, так и не понял как из переменной сделать русский.
Правильно ли я вас понял, что из массива английские слова выводит без проблем, а русские -нет?
const char* dictionary [][2] = {{"book", "книга"},{"table","стол"}}; Serial.println(dictionary[1][0]);sadman41. сорри, это мой косяк.
Но у вас тоже - звездочка у char* не нужна, это должен быть массив символов, а у вас получился массив ссылок на символы
Правильно ли я вас понял, что из массива английские слова выводит без проблем, а русские -нет?
я не знаю как сгенерировать вывод на русском из массива, т.к. нужен синтаксис lcd.print(L"хрень");
и если я подставлю lcd.print(Lmasseffect[0][0]); будет ошибка.
Но у вас тоже - звездочка у char* не нужна, это должен быть массив символов, а у вас получился массив ссылок на символы
Массив указателей на символьные строки. Я это и имел в виду.
Или я опять неправильно вспоминаю, чему меня учили в церковно-приходской школе?
ТС: чт у ваз за хрень с вездесущей буквой "L" ?
Массив указателей на символьные строки. Я это и имел в виду.
Это работает, спасибо, помогите теперь по сборке строки для вывода в формате L"текст", слово текст хранится с массиве
ТС: чт у ваз за хрень с вездесущей буквой "L" ?
Ну эта шляпа нужна для вывода русских букв в компоненте LCD_1602_RUS
Чего только люди не придумают....
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]);Вам же сказали - клингонские тексты надо обрабатывать на языке Var'aq! А Вы на чём пытаетесь?
Гит хаб заработал, качнул свежую версию и все разаработало, спасибо!!!!!!!!!!!!!!!
constwchar_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() {}Кстати, подскажите еще как узнать количество строк в этом массиве?
Я вижу в этой ситуации два варианта решения:
1) Вы хотя бы немного прилагаете усилий по поиску в гугле;
2) Обращаетесь в другой раздел форума, где те, кто знают, что делают, пишут скетчи целиком.
Кстати, подскажите еще как узнать количество строк в этом массиве?
Есть много способов.
Можно например, пальцем. Ставите палец на строку 5 и говорите "один", смещаете палец на строку вниз и говорите "два" и так пока массив не кончится.
Можно ещё (хотя это и не так кошерно) с помощью операции sizeof, если учесть, что количество элементов массива равно общему размеры всего массива, поделённому на размер элемента - sizeof(dictionary) / sizeof(dictionary[0])
sizeof(dictionary) / sizeof(dictionary[0]) прекрасно работает, спасибо
теперь главный вопрос, как это разместить в флеш-памяти
#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() { }сначала каждую строчечку в PROGMEM пхаешь, а потом только - в массив.
a String - никак, это объект
ОООО, злой котяра сегодня с утра добрый )))
т.е. каждую строку в пргмем, а потом массив сделать со ссылками на эти строки?
Только на String.
Примерно так. только надо же массив двумерный, не?
в принципе и одномерным массивом можно обойтись, если жеска знать, что четный индекс - калгонский, нечётный индекс - перевод с него
Только на String.
а што на String?
Да, тут придется писать на перловке генератор прогмем-массива ))
проще сделать одномерный массив с текстом, разделенным знаком, чем возиться с этими многомерными массивами )