Как передать массив в функцию, из функции

Тема в разделе "Arduino & Shields", создана пользователем arduin, 14 мар 2017.

  1. arduin

    arduin Нерд

    Доброй ночи. Застрял на таком моменте. есть код

    Код (C++):

    void menu_line(int lines2, char color_men){

     
       int  posicion[5] = {0,15, 50, 95, 135};
       tft.fillRect(10, posicion[lines2], 220, 40,  COLORS);
        int  ryad=  posicion[lines2];
    tft.println (ryad);//Выводит  нужные значения,  но необходимо в  функцию ниже вывести.
    }


     


    Необходимо при изменении значения ines2 из функции menu_line
    передать в переменной ryad нужное значение массива. и вывести на экран
    tft.println (ryad);

    Код (C++):
    void sub_menu(int submenu){

       menu_line(submenu,1);

     
       
          tft.println (ryad);  

    Подскажите как это сделать. а то что то не соображу. Спасибо.
     
  2. ostrov

    ostrov Гуру

    Раз пять прочитал, так и не понял вопроса. Попробую угадать. Объявите массив глобально и он уже будет виден из всех функций. Передайте в функцию указатель на первый член массива. Возвращать либо через переменную объявленную в функции: int sub_menu(), return x; либо через глобальные же переменные, либо через указатели.
     
    arduin нравится это.
  3. mcureenab

    mcureenab Гуру

    Код (C++):

    int menu_line(int lines2, char color_men){
    ...
      return posicion[lines2];
    }


    void sub_menu(int submenu){

        int ryad(menu_line(submenu,1));
        tft.println(ryad);
    }
     
     
    arduin нравится это.
  4. arduin

    arduin Нерд


    Спасибо сделал глобальным, он у меня раньше был глобальным.

    Я хотел его засунуть в функцию, так как мне надо сделать три одинаковых массива но с разными координатами,(думал смогу функцию сделать, но видимо пока опыта не хвает)
    Просто при изменении шрифта строка tft.fillRect(10, posicion[lines2], 220, 40, COLORS);

    Не совпадает с текстом.
     
  5. rkit

    rkit Гуру

    Массив передается по указателю. Если не освоили указатели, то не надо связываться. Очень легко сделать нестабильно работающую программу.
     
  6. arduin

    arduin Нерд

    Спасибо буду осваивать.

    Тут еще возникает вопрос, а что если в функции есть разные типы данных.
    Как их передавать.



    к примеру функция ниже на сколько она правильна.
    Код (C++):

    char conf_block(char* text_section, char textcursor, int lines, int  area_flag)
      {       tft.setCursor(12, textcursor);
            tft.setTextColor(YELLOW,BLACK);
            tft.setTextSize(size_menu_text);
            tft.println( "section\t");
            tft.println(text_section);          //SECTOR A   conf_block("SECTOR A",13, lines, area_flag);
         
            tft.setCursor(120, textcursor);
            tft.println(lines);                //Выводит   номер lines   главного меню  из функции counter_menu
         
            tft.setCursor(160, textcursor);
            tft.setTextColor(WHITE);
            tft.println(area_flag);//Выводит   номер флага    



    void loop()
    {
    conf_block("SECTOR B",33, lines2, area_flag);
    }


    }
    Наверное надо было указать void conf_block( в место char conf_block(




    И еще не понятно вот что функция
    Код (C++):
     void menu_line();

    Размещаю в другой функции
    Код (C++):
     menu_line(submenu,1);
    если убрать цифру 1 будет ошибка, как правильно передать параметры чтоб ошибок не было.
    и почему если указываю цифру 1 то ошибки нет и все работает.

    Просто хочу понять.

    Код (C++):
    void menu_line(int lines2, char color_men){

        tft.fillRect(10, posicion[lines2], 220, 40,  COLORS);
        tft.fillRect(220, posicion[lines2], 26, 40, COLORS2);
        int  ryad=  posicion[lines2];  
         tft.print(ryad);
    }
     
    Последнее редактирование: 15 мар 2017
  7. ostrov

    ostrov Гуру

    Три разных массива с разными координатами это двухмерный массив.
     
  8. mcureenab

    mcureenab Гуру

    void или char - не важно. А вот объявление функции loop внутри conf_block запрещено.
     
  9. mcureenab

    mcureenab Гуру

    У функции два обязательных аргумента: lines2 и color_men

    void menu_line(int lines2, char color_men){

    значит и параметров должно быть два.
     
  10. mcureenab

    mcureenab Гуру

    Поскольку аргумент color_men не ипользуется, его можно удалить

    void menu_line(int lines2){

    и вызывать функцию передавая только один параметр.
     
  11. mcureenab

    mcureenab Гуру

    Код (C++):
    int menu_line(int lines2){
    ...
      return posicion[lines2];
    }


    void sub_menu(int submenu){

        int ryad(menu_line(submenu));
        tft.println(ryad);
    }
     
     
  12. Unixon

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

  13. Unixon

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

    По теме: массивы - по указателю, куча параметров - 1) "в лоб" через аргументы, 2) по указателю/ссылке на структуру с ними.
     
    arkadyf нравится это.
  14. arduin

    arduin Нерд


    Спасибо за помощь.

    Раньше писал на PHP И тоже с функциями не дружил.
    Процедурным стилем писал,хотя не удобно было.
     
  15. arduin

    arduin Нерд

    Английский я знаю на 5%

    Код пишу для себя, по этому пока пишу так как проще.
    Хотя я месяц назад взял в руки книгу по ардуино и СИ
     
  16. arduin

    arduin Нерд


    Извините просто пропустил скобку, Без скобки получим сразу же ошибку.
    is not allowed here before '{' token
     
  17. arduin

    arduin Нерд

    Немного не понял.

    Вы имели ввиду 1) что массивы - по указателю = куча параметров
    2) в лоб" через аргументы

    или если по указателю то пишем 1, а через аргументы 2.? Спасибо.
     
  18. Unixon

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

    Код (C):

    // передаем массив
    void foo(float *u, int n)
    {
      for (int i=0; i<n; i++)
      {
        u[i] = i*M_PI;
      }
    }

    void bar()
    {
      const int N = 10;
      float a[N];
      foo((float*)a, N);
    }
     
    Код (C):

    // передаем массив и еще какие-то параметры
    void foo(float *u, int n, float b, float c)
    {
      for (int i=0; i<n; i++)
      {
        float x = i*M_PI;
        u[i] = 1.0+b*x+c*x*x;
      }
    }

    void bar()
    {
      const int N = 10;
      float b = 1.23, c = -4.56;
      float a[N];
      foo((float*)&a, N, b, c);
    }
     
    Код (C):

    // передаем структуру по ссылке
    struct foo_param_t
    {
      float *u; int n; float c; float b;
    }

    void foo(foo_param_t& p)
    {
      for (int i=0; i<p.n; i++)
      {
        float x = i*M_PI;
        p.u[i] = 1.0+p.b*x+p.c*x*x;
      }
    }

    void bar()
    {
      const int N = 10;
      float a[N];
      foo_param_t p = {(float*)&a, N, 1.23, -4.56};
      foo(p);
    }
     
    Код (C):

    // передаем структуру по указателю
    struct foo_param_t
    {
      float *u; int n; float b; float c;
    }

    void foo(foo_param_t *p)
    {
      for (int i=0; i<p->n; i++)
      {
        float x = i*M_PI;
        p->u[i] = 1.0+p->b*x+p->c*x*x;
      }
    }

    void bar()
    {
      const int N = 10;
      float a[N];
      foo_param_t p = {(float*)&a, N, 1.23, -4.56};
      foo(&p);
    }
     
     
    Последнее редактирование: 16 мар 2017
    ИгорьК, arduin и arkadyf нравится это.
  19. arduin

    arduin Нерд

    Unixon, Спасибо огромное. Буду теперь вникать. Вы мне дали очень много пищи для изучения.
     
  20. Unixon

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

    Эти примеры только для демонстрации некоторых способов передачи параметров, они несколько упрощены относительно "правильного" стиля написания кода.

    p.s. код писал на бегу, могут быть небольшие опечатки.
     
    arduin нравится это.