Массивы,указатели

mal333
Offline
Зарегистрирован: 23.04.2014

Что я делаю не так? Ниже dummy код, но не понятно, почему не компилируется. Покажите пальцем, пожалуйста.

byte buf1[200],buf2[200];
bool flag=true;
byte ptr1,ptr2;
void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:
byte *ptr_buf;
byte *ptr_ptr;

if (flag) {
ptr_buf=buf2;
  ptr_ptr=ptr2;
  !flag;
}
else {
  ptr_buf=buf2;
  ptr_ptr=ptr2;
  !flag;
}

}

 

mal333
Offline
Зарегистрирован: 23.04.2014

Пардон, есть ошибки, вот исправленный вариант:

byte buf1[200],buf2[200];
bool flag=true;
byte ptr1,ptr2;
void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:
byte *ptr_buf;
byte *ptr_ptr;

if (flag) {
ptr_buf=buf1;
  ptr_ptr=ptr1;
  !flag;
  byte a=ptr_buf[ptr_ptr]++;
}
else {
  ptr_buf=buf2;
  ptr_ptr=ptr2;
  !flag;
  byte a=ptr_buf[ptr_ptr]++;
}

}

 

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

mal333 пишет:

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

Компилятор сказал Вам почему он не захотел компилировать. Вы от нас это скрыли! Хотите, чтобы мы сами компилировали? А оно нам надо? Может всё же покажете сообщение-то?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Не стоит указателю присваивать значение переменной (строки 16, 22). Ищи как присвоить указателю адрес переменной, это пишется несколько по-другому. Строки 17 и 23 можете спойкойно удалить, значение выражения не присваивается, потому будет выброшено компилятором. Представь себе, что ты взял в магазине товар, но подошел платить не на кассу, а к стенке, протягиваешь деньги, а их никто не берет, потому что некому брать. Так же и здесь, инвертировал значение, но никуда это не записал. В строках 18, 24 определись, что нужно инкрементировать значение байта или значение указателя. Срочно читать, как увеличить/уменьшить указатель. Кроме того в этих же строках ты берешь значение указателя и индексом берешь другой указатель. Другими словами: массив[указатель]. В массиве обращение к элементам производится по индексу, т.е. указывать в квадратных скобках указатель - некорректно, потому что индекс выйдет за пределы массива. Нужно просто: массив[индекс], где индекс - обычная переменная с типом int, byte, но не как не byte *. Да, простой совет, не называй переменную именем ptr и т.п. потому что всё-таки ptr === pointer (указатель), потому что это введет того, кто будет смотреть этот исходник в удивление. Это я про переменные ptr1, ptr2. Еще, ptr_ptr звучит неоднозначно. Указатель на указатель? Тогда неправильно описано, а если это не указатель на указатель, то неправильно названо. Название переменных должно быть читабельным, чтобы через полгода посмотрел исходник и не нужно вспоминать, что за переменная "a" или переменная "b". Исключением могут быть переменные, используемые в цикле for.

И таки да, нужно смотреть сообщения компилятора. Потому что оно (сообщение) говорит о том, какая ошибка. Текст ошибки гуглится и ошибка исправляется, так что вперед и с песней.

PS ЕвгенийП, sorry, если что, я тут размялся красненьким.

 

mal333
Offline
Зарегистрирован: 23.04.2014

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

sketch_jun16a.ino: In function 'void loop()':

sketch_jun16a.ino:16:10: error: invalid conversion from 'byte {aka unsigned char}' to 'byte* {aka unsigned char*}' [-fpermissive]

sketch_jun16a.ino:21:10: error: invalid conversion from 'byte {aka unsigned char}' to 'byte* {aka unsigned char*}' [-fpermissive]
Ошибка компиляции.
Kisoft, я про указатели и переменные абстрактно представляю как и что, но не могу понять, как объявить переменную-указатель на массив. Через гугл- очень просто, но вот при реализации в Arduino как-то не компилится.
Относительно строк 17,23 мысль была инвертировать значение и подумалось про унарное(или логическое,тут без разницы) NOT, м.б. правильно !!flag ? Или вот прям обязательно flag=!flag ?
Название переменных, конечно, неалле, но это не сам проект, это попытка  разобраться, что не так. А так да, ptr_ptr- это указатель на указатель. Суть кода должна состоять в следующем: в зависимости от переменной flag идет работа с буфером по 200 байт либо с 1, либо с 2. Указатели на текущую позицию(а-ля курсор) в буферах-ptr1 и ptr2 соответственно. Нужно чтобы функция loop могла работать с любым из буферов, в зависимости от состояния flag, но не писать же 2 ветки программы на каждый случай. Поэтому нужны некие локальные переменные (ptr_buf, ptr_ptr), через которые и будет вестись работа с содержимым буферов вне зависимости от того, какой из буферов имеется в виду(для этого, собственно и весь if..else) Надеюсь, мысль понятна? А вот в реализации я что-то не могу взять в толк, что не так.
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

mal333 пишет:

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

А-а-а, так это было тестирование нашей квалификации? А не пойти Вам НА? Решайте свои проблемы сами, экзаменатор, мля.

kisoft
надеюсь на Вашу солидарность. Мальчик больно много на себя берёт. Пусть сам со своим компилятором воюет.

mal333
Offline
Зарегистрирован: 23.04.2014

Нет, я же объяснил, зачем так сделал. За путевку благодарить не буду, верну ее вам, пожалуй. Заметьте, как точно метод работает :) и не обижайтесь на СВОИ домыслы относительно меня.

Kisoft по существу ответил, за что ему спасибо.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

mal333, в последнее время очень часто стали появляться люди, которые задают вопрос, но после ответа начинают хамить, а мне это неприятно. Лучше я сразу честно покину эту тему, пока не началось. Удачи.

 

mal333
Offline
Зарегистрирован: 23.04.2014

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

OlegM
Offline
Зарегистрирован: 14.06.2016

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

OlegM
Offline
Зарегистрирован: 14.06.2016

да и это !flag интересное решение...

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

О, очередной малолетний гамна прилез, с понтами выше крыши, веселуха! Почитать про синтаксис языка - не, не знаем! Выложить говноскетч и с гонором "экзаменовать" - это да, мы можем!

Честно сказать, я хотел написать и указать на ошибки, но решил выждать время, и, о чудо! - чуйка не подвела (ттт). Теперь всякое желание отпало как класс.

Вьюнош - откройте книжку по С++ и читайте, там всё есть.

mal333
Offline
Зарегистрирован: 23.04.2014

Да уж, голова вечером лучше варит, чем ночью :)

byte buf1[200],buf2[200];
bool flag=true;
byte ptr1,ptr2;
void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:
byte *ptr_buf;
byte *ptr_ptr;

if (flag) {
  ptr_buf=&buf1[0];
  ptr_ptr=&ptr1;
  flag=!flag;
  ptr_buf[*ptr_ptr]=56;//присваеваем значение по адресу ptr_buf[ptr_ptr] =56
}
else {
  ptr_buf=&buf2[0];
  ptr_ptr=&ptr2;
  flag=!flag;
  ptr_buf[*ptr_ptr]=58
}

}

Всем спасибо за каменты, ярлыки и путевки. Надеюсь, это улучшит вашу жизнь. DIYMan- берегите себя, когда желание как класс отпадает- опасный признак ;)

OlegM
Offline
Зарегистрирован: 14.06.2016

так тебя же не кинули совсем, просто проверяли компетентность ))) обращайся еше ))