Переведу код с c++ на javaScript и наоборот

Тема в разделе "Сделаю проект", создана пользователем Yaroslav1, 15 июл 2019.

?

Какой язык программирования вы знаете?

  1. C++

  2. JavaScript

  3. Python

  4. HTML

  5. Java

Можно выбрать сразу несколько вариантов.
Результаты будут видны только после голосования.
  1. parovoZZ

    parovoZZ Гуру

    а как же пиво ЯНДЕКС из подписи?
     
  2. parovoZZ

    parovoZZ Гуру

    А как быть со внутрисхемной отладкой на LUA?
     
  3. ИгорьК

    ИгорьК Гуру

    Я это и на JS напишу, только не на ходу, со смарта.
     
  4. NikitOS

    NikitOS Король шутов Администратор

    ТС из Новосибирска, я там и посмотрел тарифы
     
  5. ИгорьК

    ИгорьК Гуру

    А что здесь отлаживать?
    Даже если lua в глаза не видел, здесь абсолютно ясно что код делает.
     
  6. Asper Daffy

    Asper Daffy Иксперд

    Так, вроде, никто не сомневается :)

    А ваще, чё попало этот луа! Ну, вот, если нет дифференциаиции по цвету штанов операции сравнения "===" ("ещё равнее") то нафига такой язык? :)
     
  7. ИгорьК

    ИгорьК Гуру

    Да, без === фигово :-(
     
  8. parovoZZ

    parovoZZ Гуру

    Включаешь пин на LUA, а пин не включается. Что делать?
     
  9. ИгорьК

    ИгорьК Гуру

    Включаешь пин на Си, а пин не включается. Что делать?
     
    Последнее редактирование: 16 июл 2019
  10. parovoZZ

    parovoZZ Гуру

    запустить симуляцию, отладку, протеус. Нужное подчеркнуть.
     
  11. ИгорьК

    ИгорьК Гуру

    Как же программеры на сях плохо с головой дружат, коли столько для нее заплаток придумали.

    :)
     
  12. Asper Daffy

    Asper Daffy Иксперд

    Вешацца :(
     
  13. parovoZZ

    parovoZZ Гуру

    Ну вот на MSP430FR попытка включить пин со светодиодом ник чему не привела. Ни к чему не привела и отладка, а точнее прямая запись из под нее бита в регистр порта. Пришлось открывать инструкцию))
     
  14. SergeiL

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

    В сетапе все выходы в "1",
    Loop:
    Инвертируется 6-ой выход,
    задержка на 20мс,
    инвертируем 6-ой,
    инвертируем 7-ой
    Задержка 38 мс.
    ...

    Так? :)
     
  15. Asper Daffy

    Asper Daffy Иксперд

    Ну, а как ещё? Мигаем всем по очереди, у каждого своя задержка. Тока задержки не все посчитал :)

    Колись - считерствовал через файл "после препроцессора"? :) Я бы только так и делал - щас я всё брошу и кинусь в этой простыне разбираться :)

    Кстати, я обещал пояснить за этот код. Кому-то интересно?
     
  16. SergeiL

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

    Это я не стал ТС задачку портить, пускай разбирается.;)
    Естественно сгенерил. На Ардуине этого не делал, стало интересно как. :)
     
  17. SergeiL

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

    Мне интересно!
    В основном пользовался дефайнами, инклудами и ифдефами.
     
  18. Asper Daffy

    Asper Daffy Иксперд

    Вот смотри, препроцессор в Си достаточно убогий. И первое, чего в нём не хватает для полноценного «кодогенерения» - циклов. В принципе, цикл можно заменить рекурсией, но там и рекурсии в чистом виде нет. Например, вот такое вычисления факториала не прокатит.

    #define FACT(n) (n < 2 ? 1 : n * FACT(n-1))

    Собственно вся байда в том коде – это использование тонкостей работы препроцессора, чтобы обмануть его и заставить исполнять рекурсию/цикл. В итоге получился макрос repeat, а запись

    eval(repeat(8, M, ~))

    Означает «Выполнить макрос М 8 раз, передавая ему текущий счётчик в качестве параметра».

    Ну, а далее всё просто. В setup стоит вызов

    eval(repeat(8, M, ~))

    а в loop

    eval(repeat(8, S, ~))

    Ищем в коде макросы M и S и смотрим. Первый – тупо вставляет pinMode, а второй конструкцию digitalWrite/delay/digitalWrite.

    Кстати, не составляет никаких проблем написать тот же факториал, пожалуйста (всю байду с определением repeat я опускаю, она не меняется):
    Код (C++):
    #define FC(i, _) * ((i) ? i : 1)
    #define FACT(n)    1 eval(repeat(n+1, FC, ~))

    void setup(void) {
        long f = FACT(6);
        Serial.begin(57600);
        Serial.println(f);
    }

    void loop(void) {}
     
    Последнее редактирование: 16 июл 2019
    Daniil и SergeiL нравится это.
  19. Asper Daffy

    Asper Daffy Иксперд

    Хочешь с пляс-плясами, поди вон в том коде разберись чего и как делается. Например, как там сделано
    Код (C++):
    #define PERIOD  50_ms
     
  20. SergeiL

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

    Прикольно, но вопрос нужно ли так?
    Это дополнительные команды, соответственно память и время процессора.
    Чаще всего посчитать и настроить таймер нужно один раз.

    icc_1.png icc_2.png

    Нажимаем превью, и получаем код:
    Код (C++):
    //ICC-AVR application builder : 16.07.2019 17:31:33
    // Target : M32
    // Crystal: 7.3728Mhz

    #include <iom32v.h>
    #include <macros.h>

    void port_init(void)
    {
    PORTA = 0x00;
    DDRA  = 0x00;
    PORTB = 0x00;
    DDRB  = 0x00;
    PORTC = 0x00;
    DDRC  = 0x00;
    PORTD = 0x00;
    DDRD  = 0x00;
    }

    //TIMER1 initialize - prescale:256
    // WGM: 0) Normal, TOP=0xFFFF
    // desired value: 1Sec
    // actual value:  1,000Sec (0,0%)
    void timer1_init(void)
    {
    TCCR1B = 0x00; //stop
    TCNT1H = 0x8F; //setup
    TCNT1L = 0x81;
    OCR1AH = 0x70;
    OCR1AL = 0x7F;
    OCR1BH = 0x70;
    OCR1BL = 0x7F;
    ICR1H  = 0x70;
    ICR1L  = 0x7F;
    TCCR1A = 0xC0;
    TCCR1B = 0x04; //start Timer
    }

    #pragma interrupt_handler timer1_compa_isr:iv_TIM1_COMPA
    void timer1_compa_isr(void)
    {
    //compare occured TCNT1=OCR1A
    }

    #pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
    void timer1_ovf_isr(void)
    {
    //TIMER1 has overflowed
    TCNT1H = 0x8F; //reload counter high value
    TCNT1L = 0x81; //reload counter low value
    }

    //call this routine to initialize all peripherals
    void init_devices(void)
    {
    //stop errant interrupts until set up
    CLI(); //disable all interrupts
    port_init();
    timer1_init();

    MCUCR = 0x00;
    GICR  = 0x00;
    TIMSK = 0x14; //timer interrupt sources
    SEI(); //re-enable interrupts
    //all peripherals are now initialized
    }

    //
    void main(void)
    {
    init_devices();
    //insert your functional code here...
    }
     
    Конфиг сохраняется, чтобы потом можно было что то поменять.
    Код правлю и переношу куда нужно.