Кроме того, насколько большой по отношению друг к другу?
Я пытаюсь сделать переводчика для Arduino. Я знаю, что это было сделано раньше, но я добавляю такие вещи, как Adafruit Display и способность писать код.
Из-за этого код довольно длинный, особенно потому, что я храню код и ленту в массивах:
char code[] = {};
byte tape[] = {};
Память должна состоять не менее чем из 30000 ячеек, некоторым существующим программам для мозговых операций действительно нужно больше, так что это должно быть настраиваемым или неограниченным.
Я знаю, что никогда не собираюсь встраивать 30000 ячеек в Uno, но похоже, что динамическая память — это способ извлечь из этого максимум пространства. Любой способ сделать это ценится.
В настоящее время, char code[512] = {};
а также byte tape[1024] = {};
использует «1807 байтов (88%) динамической памяти», но это всего лишь эскиз интерпретатора. Мне нужно добавить еще немного кода. Код Вот для тех, кто заинтересован.
Перед тем, как понизить голос, пожалуйста, спросите меня, хотите ли вы узнать больше … Я всего лишь нуб!
Вы можете реализовать это с помощью map
объект, вместо создания ограниченного массива. Используйте индексы как ключи и значение в этой ячейке как значение (удалите его, если он равен нулю, и создайте новую запись на карте, если значение этой ячейки теперь увеличивается до 1 или более или уменьшается до менее нуля.
Таким образом, вы храните только те значения, которые не 0 (экономит память и вопросы распределения), и у вас есть теоретически неограниченная лента (более чистая реализация).
operation map
----------------------------
#code_start <>
+ <0 : 1>
+ <0 : 2>
- <0 : 1>
- <>
- <0 : -1>
>+ <0 : -1, 1 : 1>
<<- <-1 : -1, 0 : -1, 1 : 1>
Карты могут быть использованы путем включения #include <map>
и создан std::map<int, int> map_name
или любые типы, которые вы хотите использовать.
Смотрите документацию здесь: http://www.cplusplus.com/reference/map/map/
Других решений пока нет …