Работа с глобальным массивом внутри функции

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

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

#define addr 0x20

bool key0[8]; - глобальный массив

bool request_from_wire(int addr, bool *key)
{
    Wire.requestFrom(addr,1);

    byte recive_byte = Wire.read();  //получаю данные в виде одного байта

    byte mov=1;  //шаг сдвига

  for(int i=0; i<8;i++) //цикл заполнения массива
    {
      key[i]=!(recive_byte & mov);
      mov=mov<<1;
      return key[i];
    }
}

Serial.print(request_from_wire(addr, key0[7])); // читаю восьмой элемент массива

Но вместо конкретного элемента массива передается только первый элемент. Что я не так делаю?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Что, по вашему мнению, делает строка №17 ?

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

В идеале хотелось бы в цикле крутить 

request_from_wire(addr, key0);

И постоянно иметь массив с актуальной ниформацией.

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

sadman41 пишет:

Что, по вашему мнению, делает строка №17 ?

возвращает значение итого элемент

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Clampo пишет:

sadman41 пишет:

Что, по вашему мнению, делает строка №17 ?

возвращает значение итого элемент

А на котором обороте цикла она возвращает "итого элемент"?

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

sadman41 пишет:

Clampo пишет:

sadman41 пишет:

Что, по вашему мнению, делает строка №17 ?

возвращает значение итого элемент

А на котором обороте цикла она возвращает "итого элемент"?

по мере заполнения. я вот и понимаю, что надо возвращать заполненный массив, а не конкретное значение. 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Clampo пишет:

sadman41 пишет:

Clampo пишет:

sadman41 пишет:

Что, по вашему мнению, делает строка №17 ?

возвращает значение итого элемент

А на котором обороте цикла она возвращает "итого элемент"?

по мере заполнения. я вот и понимаю, что надо возвращать заполненный массив, а не конкретное значение. 

А нахрена его возвращать, он и так всем ветрам открыт и всем шпионам виден, он же глобальный

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

DetSimen пишет:

Clampo пишет:

sadman41 пишет:

Clampo пишет:

sadman41 пишет:

Что, по вашему мнению, делает строка №17 ?

возвращает значение итого элемент

А на котором обороте цикла она возвращает "итого элемент"?

по мере заполнения. я вот и понимаю, что надо возвращать заполненный массив, а не конкретное значение. 

А нахрена его возвращать, он и так всем ветрам открыт и всем шпионам виден, он же глобальный

даже если так, данные в массиве все равно не меняются.

 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Не. Я седня не помогальщик. Щас ктонить паттянеца еще.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Если Serial.println(i) после строки 15 не поможет понять, в чём дело, то я тоже сливаюсь. Потому что эта тема для "песочницы".

strarbit
Offline
Зарегистрирован: 12.06.2016

i'm sorry i can't now. This is only as example of what can be done.
https://playground.arduino.cc/Code/I2CEEPROM/

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Ребята, Вас разводят на написание кода.

Эта байда и не подумает компилироваться. Я уж не говорю про комментарий в строке №3, но использование продефайненного как число addr в качестве имени параметра ...

Clampo,

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

 

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

ЕвгенийП если не хотите помочь - зачем грубить!?

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

По поводу программы -  она прекрасно компилируется, но передает только 1-е значение массива.

Вот вся программа целиком:

#include <Wire.h>

#define ADDR 0x20

bool *key0[8]; // глобальный массив

int beginTransmission(int addr)
{
  Wire.beginTransmission(addr);
  Wire.write(B11111111); 
  Wire.endTransmission();
}

bool request_from_wire(int addr, bool *key)
{
    Wire.requestFrom(addr,1);

    byte recive_byte = Wire.read();  //получаю данные в виде одного байта

    byte mov=1;  //шаг сдвига

  for(int i=0; i<8;i++) //цикл заполнения массива
    {
      key[i]=!(recive_byte & mov);
      mov=mov<<1;
      return key[i];
    }
}

void setup()
{

 Serial.begin(9600);
  
  Wire.begin();

beginTransmission(ADDR);
}

void loop()
{

Serial.println(request_from_wire(ADDR, key0[7])); // читаю восьмой элемент массива
  
delay(10);   
}

 

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

sadman41 пишет:

Если Serial.println(i) после строки 15 не поможет понять, в чём дело, то я тоже сливаюсь. Потому что эта тема для "песочницы".

если так сделать досчитывает до 7 и больше ничего не выдает.

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

ua6em пишет:

del

эта переменная только внутри функции

mixail844
Offline
Зарегистрирован: 30.04.2012

вы понимаете что key0 обьявлен как массив указателей( т.е. массив массивов) ? 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Clampo пишет:

ua6em пишет:

del

эта переменная только внутри функции

я конечно совершенно нулевой, но мне не нравиться название функции, кажется пересекается с названием функции в библиотеке

__Alexander
Offline
Зарегистрирован: 24.10.2012

Clampo пишет:

По поводу программы -  она прекрасно компилируется, но передает только 1-е значение массива.

Вам же во втором посте дали ответ с намеком, что делает строчка return key[i];

Она возвращает нулевой элемент вместе с выходом из функции request_from_wire.

Так понятнее?

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

Понятнее.
Еще думаю, что указатель на массив должен быть только в параметрах функции. Верно?

__Alexander
Offline
Зарегистрирован: 24.10.2012

Clampo пишет:
Понятнее. Еще думаю, что указатель на массив должен быть только в параметрах функции. Верно?

Нет. Не только. Где угодно, но правильнее да, в качестве аргумента функции.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Clampo пишет:

ЕвгенийП если не хотите помочь - зачем грубить!?

Почему не хочу? Я скопировал Ваш код в IDE, и стал пытаться его запустить с целью досконально разобраться и помочь Вам. Т.е. я очень хотел Вам помочь, даже попытался запустить Ваш код, а не просто глазами посмотреть. Вы это называете "не хотите"? 

А когда я обнаружил, что он элементарно не компилируется, но при этом Вы утверждаете, что он там что-то делает, возникли некоторые эмоции. Вас это удивляет? 

Хотите помощи, выкладывайте реальный код, а не издевайтесь над людьми.

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

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

ЕвгенийП пишет:

Clampo пишет:

ЕвгенийП если не хотите помочь - зачем грубить!?

Почему не хочу? Я скопировал Ваш код в IDE, и стал пытаться его запустить с целью досконально разобраться и помочь Вам. Т.е. я очень хотел Вам помочь, даже попытался запустить Ваш код, а не просто глазами посмотреть. Вы это называете "не хотите"? 

А когда я обнаружил, что он элементарно не компилируется, но при этом Вы утверждаете, что он там что-то делает, возникли некоторые эмоции. Вас это удивляет? 

Хотите помощи, выкладывайте реальный код, а не издевайтесь над людьми.

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


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

MaksVV
Offline
Зарегистрирован: 06.08.2015

и все таки

DetSimen пишет:
А нахрена его возвращать, он и так всем ветрам открыт и всем шпионам виден, он же глобальный

#include <Wire.h>

#define ADDR 0x20

bool key[8]; // глобальный массив

int beginTransmission(int addr)
{
  Wire.beginTransmission(addr);
  Wire.write(B11111111); 
  Wire.endTransmission();
}

void request_from_wire(int addr)
{
    Wire.requestFrom(addr,1);

    byte recive_byte = Wire.read();  //получаю данные в виде одного байта

    byte mov=1;  //шаг сдвига

  for(int i=0; i<8;i++) //цикл заполнения массива
    {
      key[i]=!(recive_byte & mov);
      mov=mov<<1;
    }
}

void setup()
{

 Serial.begin(9600);
  
  Wire.begin();

beginTransmission(ADDR);
}

void loop()
{

request_from_wire(ADDR); // обновляю массив
Serial.println(key[7]);  // печатаю восьмой элемент массива
delay(100);   
}

 

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

MaksVV пишет:

и все таки

DetSimen пишет:
А нахрена его возвращать, он и так всем ветрам открыт и всем шпионам виден, он же глобальный

#include <Wire.h>

#define ADDR 0x20

bool key[8]; // глобальный массив

int beginTransmission(int addr)
{
  Wire.beginTransmission(addr);
  Wire.write(B11111111); 
  Wire.endTransmission();
}

void request_from_wire(int addr)
{
    Wire.requestFrom(addr,1);

    byte recive_byte = Wire.read();  //получаю данные в виде одного байта

    byte mov=1;  //шаг сдвига

  for(int i=0; i<8;i++) //цикл заполнения массива
    {
      key[i]=!(recive_byte & mov);
      mov=mov<<1;
    }
}

void setup()
{

 Serial.begin(9600);
  
  Wire.begin();

beginTransmission(ADDR);
}

void loop()
{

request_from_wire(ADDR); // обновляю массив
Serial.println(key[7]);  // печатаю восьмой элемент массива
delay(100);   
}

 


Согласен, так работать будет. Только смысл в том, что в программе несколько адресов и массивов.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

ну дак ты тогда более подробно опиши задачу, что ты делаешь, и что хочешь получить. И что не выходит. 

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

DetSimen пишет:

ну дак ты тогда более подробно опиши задачу, что ты делаешь, и что хочешь получить. И что не выходит. 


Так в самом первом посте все и описал.
Clampo пишет:

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

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

лично с меня - хватит, в хитросплетеньях чужой логики я разбираца не имею желания

Clampo пишет:

 Есть глобальный массив, с которым я работаю 

Clampo пишет:
смысл в том, что в программе несколько адресов и массивов.

разбирайся сам, чотыхошь. 

Пока я вижу, что там, где ты используешь массив, хватит и одного байта, разбитого по битовым полям.  А уж 1 байт отдавать не в пример легше. 

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

DetSimen пишет:

лично с меня - хватит, в хитросплетеньях чужой логики я разбираца не имею желания

Clampo пишет:

 Есть глобальный массив, с которым я работаю 

Clampo пишет:
смысл в том, что в программе несколько адресов и массивов.

разбирайся сам, чотыхошь. 

Пока я вижу, что там, где ты используешь массив, хватит и одного байта, разбитого по битовым полям.  А уж 1 байт отдавать не в пример легше. 


Создается впечатление, что вы меня троллите. Я пытаюсь разобраться с указалелями на массив, а не то что мне использовать в моей программе. Если эта такая легкая тема, может скажите где почитать про это? Пока я только нагуглил разъяснение обратного действия - загрузка массива в функцию. Сразу еще вопрос про бит - ардуино адекватно воспринимает, байт у которого первый бит 0?

mixail844
Offline
Зарегистрирован: 30.04.2012
что значит "адекватно" ? 
 
в знаковых переменных компилятор воспринимает первый ( "страший" )бит как знак (положительный или отрицательный ) ,а в безнаковых переменных , старший бит это часть числа
DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Clampo пишет:
Создается впечатление, что вы меня троллите.

а у меня даже не впечатление стойкое, а убеждение, что ситуация обратна. 

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

DetSimen пишет:

Clampo пишет:
Создается впечатление, что вы меня троллите.

а у меня даже не впечатление стойкое, а убеждение, что ситуация обратна. 


Я обратился на форум, с просьбой о помощи в конкретном вопросе. В итоге вместо помощи, меня обвинили в том что я ничего не знаю и над всеми издеваюсь. Это же очевидно, что я не знаю, для этого я и прошу помочь. Если бы я сам знал - зачем мне спрашивать!? К тому же, по некоторым участникам четко видно, что особым знанием они и сами не обладают, что подтверждают в виде своих нападок на новичков, обвиняя их в некомпетентности, вместо ответов по теме.

b707
Онлайн
Зарегистрирован: 26.05.2017

Clampo пишет:
Пока я только нагуглил разъяснение обратного действия - загрузка массива в функцию.

а вам-то что нужно? Передав указатель на массив в функцию - вы получаете внутри полный доступ к массиву. Хотите "загружаете", хотите - "выгружаете".

Что тут обсуждать-то вообще?

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

b707 пишет:

Clampo пишет:
Пока я только нагуглил разъяснение обратного действия - загрузка массива в функцию.

а вам-то что нужно? Передав указатель на массив в функцию - вы получаете внутри полный доступ к массиву. Хотите "загружаете", хотите - "выгружаете".

Что тут обсуждать-то вообще?


Не знаю как правильно это сделать.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Clampo пишет:
К тому же, по некоторым участникам четко видно, что особым знанием они и сами не обладают, что подтверждают в виде своих нападок на новичков, обвиняя их в некомпетентности, вместо ответов по теме.

Абсолютно с тобой согласен. О моей некомпетентности ходют легенды, но нападать на неофитов - этта моё призвание.  :) 

Особенно, када неофит за 6 лет регистрации с массивами не разобрался 

b707
Онлайн
Зарегистрирован: 26.05.2017

Clampo пишет:
Не знаю как правильно это сделать.

А книжку почитать про массивы и указатели?

Если тупо ответить "как сделать" - возьмите свой код из первого поста, выкиньте строчку номер 17 - и все будет работать.

Только именно код из заглавного поста, потому что то, что вы потом постили как "полный код" - это не код, а чушь

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

DetSimen пишет:

Clampo пишет:
К тому же, по некоторым участникам четко видно, что особым знанием они и сами не обладают, что подтверждают в виде своих нападок на новичков, обвиняя их в некомпетентности, вместо ответов по теме.

Абсолютно с тобой согласен. О моей некомпетентности ходют легенды, но нападать на неофитов - этта моё призвание.  :) 

Особенно, када неофит за 6 лет регистрации с массивами не разобрался 

Тут все отвечают, с учетом даты регистрации? 

DetSimen пишет:

Особенно, када неофит за 6 лет регистрации с массивами не разобрался

Я обязан был? Я может 6 лет постигал как светодиодом без delay моргать.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

b707 пишет:
возьмите свой код из первого поста, выкиньте строчку номер 17 - и все будет работать. Только именно код из заглавного поста

Не будет. Я точно не пошутил в #11 - он даже не скомпилируется.

b707
Онлайн
Зарегистрирован: 26.05.2017

Clampo пишет:

Я обязан был? Я может 6 лет постигал как светодиодом без delay моргать.

не обязан. Но с такими способностями обьяснять вам еще 12 лет, как пользоватся массивами - мы тоже не обязаны.

b707
Онлайн
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

b707 пишет:
возьмите свой код из первого поста, выкиньте строчку номер 17 - и все будет работать. Только именно код из заглавного поста

Не будет. Я точно не пошутил в #11 - он даже не скомпилируется.

будет, после необходимой правки, естесственно. То что код неполный, я вижу. Писать полный код за ТС никто не подряжался.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

b707 пишет:
после необходимой правки
:-)))

https://www.youtube.com/watch?v=2H9StVnc6xc&feature=youtu.be

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

b707 пишет:

Clampo пишет:
Не знаю как правильно это сделать.

А книжку почитать про массивы и указатели?

Если тупо ответить "как сделать" - возьмите свой код из первого поста, выкиньте строчку номер 17 - и все будет работать.

Только именно код из заглавного поста, потому что то, что вы потом постили как "полный код" - это не код, а чушь

В общем, спасибо за наводки и подсказки. Оказалось я почти дошел до искомого, но в конце свернул не туда.

Вот правильно работающая функция:

#define addr 0x20

bool key0[8]; // глобальный массив

bool request_from_wire(int addr, bool *key)
{
    Wire.requestFrom(addr,1);

    byte recive_byte = Wire.read();  //получаю данные в виде одного байта

    byte mov=1;  //шаг сдвига

  for(int i=0; i<8;i++) //цикл заполнения массива
    {
      key[i]=!(recive_byte & mov);
      mov=mov<<1;
    }
}

void setup()
{

  Serial.begin(9600);

  Wire.begin();

void loop()
{

request_from_wire(addr, key0); //обновляю данные в массиве

Serial.print(key0[7]); // читаю восьмой элемент массива
}

 

b707
Онлайн
Зарегистрирован: 26.05.2017

Clampo пишет:

Оказалось я почти дошел до искомого, но в конце свернул не туда.

программируем методом тыка?  Не сработало key - поставим *key или key[0] ? :)

И так шесть лет

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

b707 пишет:

Clampo пишет:

Оказалось я почти дошел до искомого, но в конце свернул не туда.

программируем методом тыка?  Не сработало key - поставим *key или key[0] ? :)

И так шесть лет

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

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

Вот вы мне скажите, господа, вы на этом форуме для чего - помогать, отвечать на вопросы или оскорблять и говорить какие вы умные!? Это форум Ардуино, Ардуино априори предполагает новичков и их незнание. Но, вы, гуру программирования, почему то здесь, а не на проф. форумах, где люди имеют базу. Да потому что у самих знаний не хватает и среди профессионалов вам нечего сказать. Когда люди тешат свое эго за счет других это уже психическое расстройство из-за фобий или угнетений, или ограниченности в ином плане ранее. И будут ли вас после этого воспринимать авторитетными, знающими людьми, к совету которых можно прислушаться большой вопрос. Так, очередные выскочки, на глупые вопросы которых кто-то ответил ранее. Очень не солидно, господа.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Clampo пишет:

Ардуино априори предполагает новичков и их незнание. 

Это кто такое придумал? Arduino - это ускоритель разработки сложных микроконтроллерных устройств, а не группа для всех детей, которых родители не смогли устроить в другие кружки.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

а вот щас прям совсем стыдно стало.  

наданапица. 

Clampo
Clampo аватар
Offline
Зарегистрирован: 03.08.2013

sadman41 пишет:

Clampo пишет:

Ардуино априори предполагает новичков и их незнание. 

Это кто такое придумал? Arduino - это ускоритель разработки сложных микроконтроллерных устройств, а не группа для всех детей, которых родители не смогли устроить в другие кружки.

Сложных восьмибитных, забыли добавить.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Clampo пишет:

Сложных восьмибитных, забыли добавить.

Для МК писать не в пример сложнее, чем лабать на php, например. Так что меньшая битность - больший геморрой.

b707
Онлайн
Зарегистрирован: 26.05.2017

Clampo пишет:

Ардуино априори предполагает новичков и их незнание.

Это распространенная ошибка. Да, ардуино - это игрушка, но это игрушка для программистов, а не для "каждой кухарки".

Знания Си тут нужны не менее серьезные, чем для какого-нить болього десктопного проекта.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Clampo пишет:

Вот вы мне скажите, господа, вы на этом форуме для чего - помогать, отвечать на вопросы 

Скажите, только честно, Вы правда считаете, что люди приходят на форум исключительно для того, чтобы отвечать на Ваши вопросы и реализовывать Ваши хотелки?

Что Все мы здесь находимся (ну, или должны находиться) исключительно с целью избавить ленивые задницы от необходимости учиться самостоятельно, немедленно предоставляя ответы на все их идиотские вопросы, которые они не могут толком сформулировать и, уж тем более, не могут понять ответ, даже если его получат?

Вы действительно полагаете, что Вам здесь все должны?

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

DetSimen пишет:

а вот щас прям совсем стыдно стало.  

наданапица. 

ТС не мог два дня подождать - среда ведь только :)