Не передается структура в качестве параметра в функцию?

Тема в разделе "Arduino & Shields", создана пользователем DrProg, 8 июл 2015.

  1. geher

    geher Гуру

    Это обрывки кода; объявление массива, функция (тут ошибка, надо либо возврат целого организовать, ибо если тип возвращаемого значения не указан, то он int, либо void поставить).
    А под занавес вызов функции.
     
  2. DrProg

    DrProg Вечный нерд

    Если в структурах могут быть написаны функции, значит ли это что они будут работать с только с данными той переменной, которая вызвана? Иначе говоря, можно не передавать структуру во внешнюю функцию, а вызывать внутреннюю функцию в структуре?
     
  3. DrProg

    DrProg Вечный нерд

    Сахар вреден!
     
    ИгорьК нравится это.
  4. ИгорьК

    ИгорьК Гуру

    Я об этом неоднократно говорил здесь! :)
     
  5. DrProg

    DrProg Вечный нерд

    Нет, вы говорили, что чужакам тут не место, им надо вернуться обратно в лес и на ветки.
     
  6. ИгорьК

    ИгорьК Гуру

    О прописке я ничего не знал, но имел в виду это:

     
  7. ИгорьК

    ИгорьК Гуру

    И еще Мегакотейка всякую пургу несет :) Спросили - отвечай!
     
  8. DrProg

    DrProg Вечный нерд

    Вы то здесь зачем? Отвечать не хотите, другим не даете, спрашивающих лажаете. Может вам эти самые книги и писать? Пользы будет больше, вреда не будет вовсе.
     
  9. ИгорьК

    ИгорьК Гуру

    Да, в общем, я написал "Сахар..." Мне просто понравилось :) Я кое-что новое узнал :) А Вы - вреден, вреден... И с этим я тоже согласился, а Вы сразу в бочку. То есть на дерево...
     
  10. DrProg

    DrProg Вечный нерд

    Я вчера узнал немного нового и интересного, в том числе благодаря ответам, хотя сам нашел ответ (см тему). И скетч сделал рабочий достаточно быстро и легко. А сейчас опять начался флейм и флуд.

    Кстати, где там ветка про программирование? Пора бы уже все в одном месте собирать.
     
  11. Megakoteyka

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

    А че сразу пургу-то? Ученье - свет!
     
    ИгорьК нравится это.
  12. DrProg

    DrProg Вечный нерд

    Это такой сарказм у кого то. :eek:
     
    ИгорьК нравится это.
  13. Megakoteyka

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

    Спасибо, кэп!
     
  14. DrProg

    DrProg Вечный нерд

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

    Для того кто изучает подобный вопрос и не считает, что спрашивать об этом неприлично, выложу или перешлю код с пояснениями. Остальным спасибо за помощь, она очень пригодилась.
     
  15. Megakoteyka

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

    Выкладывайте код, приведем его в порядок, заодно расскажу еще кой-чего интересное.
     
  16. DrProg

    DrProg Вечный нерд

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

    Код (Text):
    #include "FastIO.h"

    #define DATA_PIN    13
    #define LATCH_PIN  12
    #define CLOCK_PIN  11

    #define DDD false        // отладка и печать в ком порт

    byte masRG [8][8] = {    // поле
      0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0,
      0, 0, 0, 0, 0, 0, 0, 0,
    };


    struct runBall {        //--------------------- структура шарика
      byte posX = 0;              // позиция X
      byte posY = 0;              // -!!- Y
      byte runX = 0;              // вектор по X (1 - влево, 0 - на месте, 2 - вправо)
      byte runY = 0;              // -!!- Y
      byte color = 0;            // цвет
      int MS = 0;                // время задержки между шагом (мс)
      long unsigned int TS;      // таймер
      void setBall () {                    // функция шага
        masRG[posY][posX] = 0;             // тушим прошлую позицию
        posX = posX + runX - 1;            // сдвигаем по X
        if ((posX > 7) or (posX < 0)) {    // определяем пределы поля
          runX = abs(runX - 2);            // если вышли то возвращаемся и меняем направление на "отскок"
          posX = posX + (runX - 1);
          posY = posY - (runY - 1);
        }
        posY = posY + (runY - 1);          // то же самое Y
        if ((posY > 7) or (posY < 0)) {
          runY = abs(runY - 2);
          posY = posY + (runY - 1);
          posX = posX - (runX - 1);
        }
        masRG[posY][posX] = color;          // зажигаем в новом месте
      }
    };



    #if DDD==true            // для подсчета fps
    unsigned long int ttt;
    unsigned int fps = 0;
    #endif

    runBall mBall[3];        // определяем три шарика
    void setup() {    
      mBall[0].posX = 1;      // красный
      mBall[0].posY = 2;
      mBall[0].runX = 0;
      mBall[0].runY = 2;
      mBall[0].color = 1;
      mBall[0].MS = 100;

      mBall[1].posX = 6;      // зеленый
      mBall[1].posY = 6;
      mBall[1].runX = 0;
      mBall[1].runY = 2;
      mBall[1].color = 2;
      mBall[1].MS = 50;

      mBall[2].posX = 1;      // желтый
      mBall[2].posY = 7;
      mBall[2].runX = 2;
      mBall[2].runY = 2;
      mBall[2].color = 3;
      mBall[2].MS = 150;

      MC_SET_PIN_OUTPUT(DATA_PIN);
      MC_SET_PIN_OUTPUT(CLOCK_PIN);
      MC_SET_PIN_OUTPUT(LATCH_PIN);

      for (byte i = 0; i < 3; i++) {  // запускаем таймеры
        mBall[i].TS  = millis();
      }

    #if DDD==true
      Serial.begin(9600);
    #endif
    }

    void loop() {
      for (byte i = 0; i < 3; i++) {                    // проверяем таймеры на время шага
        if ((millis() - mBall[i].TS) >= mBall[i].MS) {
          mBall[i].setBall();                          // которому пора, тот сдвигаем
          mBall[i].TS = millis();                      // и обнуляем ему таймер
        }
      }
      setKadr_RG();                                    // рисуем поле с шарами

      // подсчет fps
    #if DDD==true
      fps++;
      if ((millis() - ttt) > 2000) {
        Serial.println(fps);
        while (true);
      }
    #endif
    }



    void setKadr_RG () {                                  // отрисовка кадра
      byte bytSTR;
      byte mR;
      byte mG;
      for (byte s = 0; s <= 7; s++) {
        bytSTR = 0;
        bitSet(bytSTR, s);
        for (byte i = 0; i <= 7; i++) {
          bitWrite(mR, i, !(bitRead(masRG[s][i], 0)));
          bitWrite(mG, i, !(bitRead(masRG[s][i], 1)));
        }
        MC_WRITE_PIN(LATCH_PIN, LOW);
        writeByte(bytSTR);
        writeByte(mR);
        writeByte(mG);
        MC_WRITE_PIN(LATCH_PIN, HIGH);
      }
    }

    void writeByte(byte byteW) {                          // аналог shiftOut, работает чуть быстрее
      for (int i = 7; i >= 0; i--)
      {
        MC_WRITE_PIN(DATA_PIN, (bitRead(byteW, i)));
        MC_WRITE_PIN(CLOCK_PIN, HIGH);
        MC_WRITE_PIN(CLOCK_PIN, LOW);
      }
    }
     
    Камера несколько инертна, на самом деле хвостов не видно.

     
  17. Alex19

    Alex19 Гуру

    Сам потихоньку изучаю указатели, но я пошел по книгам и справочникам.
    Очень сильно не хватает передачи аргументов по ссылке и еще мелкие нюансы, которые хочу понять. Удачи в изучении!

    В Вашем коде, сделал бы несколько иначе объявление #define DDD false, заменил на
    Код (Text):
    #define DDD
    А вместо такой проверки
    Код (Text):
    #if DDD==true            // для подсчета fps
    unsigned long int ttt;
    unsigned int fps = 0;
    #endif
     
    проверку сделал бы так
    Код (Text):
    #if defined(DDD)
    unsigned long int ttt;
    unsigned int fps = 0;
    #endif
    или так
    Код (Text):
    #ifdef DDD
    unsigned long int ttt;
    unsigned int fps = 0;
    #endif
    Данный код, просто проверяет объявлена ли DDD и если да, включает код в #if. Чтобы #if не был выполнен, просто комментируем DDD
    Код (Text):
    //#define DDD
     
    DrProg нравится это.
  18. DrProg

    DrProg Вечный нерд

    А в чем принципиальная разница? Так или иначе часть кода не попадает в HEX.
     
  19. Alex19

    Alex19 Гуру

    Да Вы правы не попадет, просто не видел смысла давать какое-то значение. Лично мне так удобнее, просто закомментировать строку, а не менять значения. Особенно, когда в коде много настраиваемых блоков, поэтому и написал
     
  20. DrProg

    DrProg Вечный нерд

    А если нужно включать и отключать разные блоки? Тогда можно сделать 0, 1, 2, 3 и тд.
    Но кроме этого хотелось бы комментариев по самому коду. )