ESP-8266/ESP32 NodeMCU Lua: азы программирования.

Тема в разделе "ESP8266, ESP32", создана пользователем ИгорьК, 25 июл 2017.

  1. Вопрос любителям Си, один из моих любимых. Что будет при компиляции следующего текста?
    Естественно, пользоваться компилятором си и гуглом нельзя.

    Код (C++):
    #include <stdio.h>

    void main()
    {
      char *p = "car";

      2[p] = 'd';

      printf("%s\n", p);
    }
     
  2. rkit

    rkit Гуру

    Это некорретная программа. Поведение такой будет непредсказуемым, и разным для разных реализаций языка.
     
  3. ИгорьК

    ИгорьК Гуру

    Вот я Звера в нескольких сообщениях рекламировал. Я ему помогаю. Я его не тролю. И очень жалею. Жывотных надо жалеть и зачищать.
     
  4. issaom

    issaom Гуру

  5. asda

    asda Нерд

    Опасно, опасно...
     
  6. SergeiL

    SergeiL Оракул Модератор

    А чего тут думать то? От перемены мест слагаемых сумма не меняется. :)

    p[2] это тоже самое, что и 2[p] тоже самое, что и *(p+2) - вопрос записи.

    В результате «cad» будет.
     
  7. Airbus

    Airbus Радиохулиган Модератор

    А я думал carcar
     
    Un_ka нравится это.
  8. b707

    b707 Гуру

    ИгорьК, первые части про Луа получились очень интересными, продолжение планируется?
     
  9. Igor68

    Igor68 Гуру

    Вот это бред.... думал такого не бывает.
    А кто такой 2[p]?
     
  10. SergeiL

    SergeiL Оракул Модератор

    Если смотреть на пример - естественно это бред,

    А с точки зрения Си:
    берем элемент массива под номером хранящимся в переменной <p>,
    При этом адрес начала массива это ячейка с адресом "0x02"

    Также, к значению этой же ячейки памяти, можно обратиться как p[2] и *(p+2)
     
  11. SergeiL

    SergeiL Оракул Модератор

    Скомпилировал кусок в Си для x86 (_asm mov ax,ax ; - как разделитель, ну и для поиска куска ):
    Код (C++):
    void main()
    {
      char *p = "123456";

      _asm     mov ax,ax ;

      2[p] = 0xA5;

      _asm     mov ax,ax ;

      p[2] = 0xA5;

      _asm     mov ax,ax ;

      *(p+2) = 0xA5;

    }
    Получил следующий код:
    Код (Text):
          mov    ax,ax
          mov    bx,[bp][-0002]
          mov    b,[bx][00002],0A5  ;"е"
          mov    ax,ax
          mov    bx,[bp][-0002]
          mov    b,[bx][00002],0A5  ;"е"
          mov    ax,ax
          mov    bx,[bp][-0002]
          mov    b,[bx][00002],0A5  ;"е"
    Код обращения к ячейке идентичен! :)
    Как и говорил!
    Накопленный опыт, за годы отладки Сишных программ в Ассемблерном отладчике, не пропьешь! ;)
     
    Последнее редактирование: 3 авг 2017
  12. Igor68

    Igor68 Гуру

    2[p] совсем не понятно, а p[2] нормально понимаю и *(p+2) нормально воспринимаю
    Но попробуйте откомпилить (хоть и было сказано не применять никаких средств) с помощью gcc. А потом запустить.
     
  13. b707

    b707 Гуру

    От *(p+2) осталось сделать всего один шаг
    p[2] = *(p+2) = *(2+p) = 2[p]

    Классическая хохма синстаксиса, давно по инету гуляет
     
  14. ИгорьК

    ИгорьК Гуру

    Будет. Вернусь из отпуска и накидаю пару заметок еще.
     
  15. b707

    b707 Гуру

    Пока ИгорьК в отпуске - пара ссылок для заинтересовавшихся.

    Базовые конструкции языка, на мой взгляд, шикарно описаны тут:
    Луа за 60 минут
    Конкретные особенности написания скриптов под ESP8266 читаем здесь
    Lua developer FAQ
    Кстати, из изучения последней ссылки становится понятно, что скрипты на Луа должны быть построены совсем иначе - т.н. событийное программирование, чем Си-скетчи для классического ардуино. По-моему, очень многие этого не понимают и продолжают писать на Луа в классической процедурном стиле, в результате проблемы с обьемом кода и памятью. Судя по многим скриптам автора темы, он тоже не избежал этой ошибки :)
     
  16. ИгорьК

    ИгорьК Гуру

    Ну а как же.
    Литературы никакой. Когда-то заботливый товарищ жалел меня за мой код и отправлял учиться на esp8266.ru
    гыыыыыыыы.... хорошо что не пошел.

    Как бы дико не был написан мой код - работает он всегда :)
     
    Последнее редактирование: 3 авг 2017
  17. Igor68

    Igor68 Гуру

    Что-то больно жестоко получается... выглядит полный ХЛАМ, хоть и компилируется без проблем.
     
  18. ИгорьК

    ИгорьК Гуру

    Аттеншн! ЛУА на esp-8266 версии 5.1.
    От 5.2 есть ряд отличий. В частности, не поддерживаются механизмы _ENV, также некоторые функции работы с таблицами.

    Читать документацию рекомендую по запросу "elua". http://www.eluaproject.net/

    Что касается второй ссылки - правильная ссылка.
    Но чтобы ее понять, требуется почитать что-то по ... JavaScript :)

    И да, сейчас можно меня пинать за ранний код - но эта документация появилась через год после публикации самой NodeMCU.

    Плюс нужно время чтобы ее заметить и полностью изменить с ЛУА :)
     
    Последнее редактирование: 3 авг 2017
  19. b707

    b707 Гуру

    никто не заставляет вас этим пользоваться, в стандарт языка это попало исключительно ради сохранения коммутативности операции сложения
     
  20. b707

    b707 Гуру

    А можно уточнить. для понимания каких вещей нужен JS? Может не обязательно именно JS. мне кажется важнее понимать принципиальные особенности скриптовых языков. такие как автоматические типы данных, сборщик мусора, замыкания и тд