Указатель на неопределенный класс ... ?

starcomputer
Offline
Зарегистрирован: 19.10.2021

DetSimen пишет:

У тя область видимости класса XXX скорее всего, глобальная

Да, глобальная.

starcomputer
Offline
Зарегистрирован: 19.10.2021

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

starcomputer пишет:

Весь класс целиком. Рабочий.

Я уже перестал понимать к чему это. К #42 или к #44?

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

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

starcomputer
Offline
Зарегистрирован: 19.10.2021

И как выложить скетч из 12-ти файлов ?

starcomputer
Offline
Зарегистрирован: 19.10.2021

Схема контроллера, если интересно конечно:

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

starcomputer пишет:

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

Ни хрена Вы не понимаете. Это не Ваше дело, получится у меня его запустить или нет, скетч должет быть полным.

Вот, например, Вы задали вопрос

starcomputer пишет:

class XXX {
public:
XXX();
};

XXX::XXX(){
pinMode(ppp, OUTPUT);
digitalWrite(ppp, HIGH);
}

процедуры pinMode и digitalWrite не работают, т.е. ВООБЩЕ ничего не происходит. Пин так и остается INPUT.

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

starcomputer пишет:

И как выложить скетч из 12-ти файлов ?

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

starcomputer
Offline
Зарегистрирован: 19.10.2021

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

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

Спасибо, я так далее и буду делать.

starcomputer
Offline
Зарегистрирован: 19.10.2021

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

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

Конечно создавал. Иначе откуда бы я знал, что там на пине происходит. Осцилограф и показал, что НИЧЕГО не происходит.
Но я так понял, что это из-за того, что класс глобальный.

b707
Offline
Зарегистрирован: 26.05.2017

starcomputer пишет:

это из-за того, что класс глобальный.

вы видите хоть какой-то смысл в этой фразе? :)

starcomputer
Offline
Зарегистрирован: 19.10.2021

DetSimen пишет:

У тя область видимости класса XXX скорее всего, глобальная

Мне как, верить всему, что здесь пишут, или выборочно ? Если выборочно, то по какому принципу ?

А ну да. Видимость класса глобальная, а не класс. Сорри.

b707
Offline
Зарегистрирован: 26.05.2017

starcomputer пишет:

А ну да. Видимость класса глобальная, а не класс. Сорри.

ну а вывод то из этого какой? :)

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

starcomputer пишет:

Мне как, верить всему, что здесь пишут, или выборочно ?

Верить или не верить можно в Бога. Всё остальное нужно осмысливать и, как минимум, понимать.

starcomputer пишет:

Конечно создавал. 

Вот-вот. Как создавали, когда создавали, сколько штук создавали - ответы на все эти вопросы  - ХЗ. Ну и ответ на Ваш основной вопрос - тоже ХЗ!

Так что либо маленький, но полный скетч, либо разбирайтесь сами.

b707
Offline
Зарегистрирован: 26.05.2017

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

Так что либо маленький, но полный скетч, либо разбирайтесь сами.

так для того чтоб написать "маленький, но полный скетч", демонстрирующий проблему - надо пониматьв чем проблема состоит :)

 

 

starcomputer
Offline
Зарегистрирован: 19.10.2021

Да, я Вас понял.

starcomputer
Offline
Зарегистрирован: 19.10.2021

b707 пишет:

так для того чтоб написать "маленький, но полный скетч", демонстрирующий проблему - надо пониматьв чем проблема состоит :)

Это тоже верно. Если у Вас пин порта должен аппаратно сбрасывает другой чип, а он его не сбрасывает, то вариантов несколько:

1. Неправильно написанная программа.
2. Нерабочий чип.
3. В даташите чипа неверно указаны временные задержки.
4. Временные задержки по каким-то причинам не соответствуют расчетным. Даже если в качестве задержки используется команда NOP процессора без цикла, то иногда время ее выполнения - один такт - не соответствует даташиту на процессор - я с таким сталкивался на Atmega88.

Если подумать, можно еще найти возможные причины. Так что действительно, определение проблемы это половина ее решения.
Красиво и правильно написанная программа не всегда будет правильно работать с "железом".

b707
Offline
Зарегистрирован: 26.05.2017

starcomputer пишет:

Красиво и правильно написанная программа не всегда будет правильно работать с "железом".

однако если она правильная - это сильно облегчит поиск ошибки.

Чего не скажешь про ваш код

 

В данном случае - что мешает вам написать тестовый скетсч из 15-20 строчек с вашим "глобальным классом" из пары операторов?

starcomputer
Offline
Зарегистрирован: 19.10.2021

А я этим как раз и занимался :)

#define BT_RST              8

class HC05 {
  public:
    HC05(HardwareSerial &portBT);
  private:
    HardwareSerial *port;
};

HC05::HC05(HardwareSerial &portBT){
  // сброс чипа НС-05
  pinMode(BT_RST, OUTPUT);
  digitalWrite(BT_RST,LOW);
  delay(100);
  digitalWrite(BT_RST, HIGH);
  delay(100);
  //
  port = &portBT;
}

void beep(){
  uint8_t i;
  digitalWrite(12, HIGH);
  delay(100);
  digitalWrite(12, LOW);
  delay(100);
}

void setup() {
  pinMode(12, OUTPUT);
  beep();

}

void loop() {

  while(1){}

}

В данном скетче часть, выделенная комментариями // сброс чипа НС-05 ..... // не выполняется. Хотелось бы знать почему ...
Что при создании класса нельзя выполнять какие-то процедуры ?

.............

Пищалка там, чтобы понимать, что инициализация не зависла.

b707
Offline
Зарегистрирован: 26.05.2017

starcomputer пишет:

В данном скетче часть, выделенная комментариями // сброс чипа НС-05 ..... // не выполняется. Хотелось бы знать почему ...

 

а с чего ей выполнятся?

Цитата:
Что при создании класса нельзя выполнять какие-то процедуры ?

а где в вашем коде создание экземпляра класса - укажите номер строки?

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

Смотрю вот на это:

starcomputer пишет:

#define BT_RST              8

class HC05 {
  public:
    HC05(HardwareSerial &portBT);
  private:
    HardwareSerial *port;
};

HC05::HC05(HardwareSerial &portBT){
  // сброс чипа НС-05
  pinMode(BT_RST, OUTPUT);
  digitalWrite(BT_RST,LOW);
  delay(100);
  digitalWrite(BT_RST, HIGH);
  delay(100);
  //
  port = &portBT;
}

void beep(){
  uint8_t i;
  digitalWrite(12, HIGH);
  delay(100);
  digitalWrite(12, LOW);
  delay(100);
}

void setup() {
  pinMode(12, OUTPUT);
  beep();

}

void loop() {

  while(1){}

}

и вот на это:

starcomputer пишет:

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

Вы создавали экземпляр этого класса или не создавали? 

Конечно создавал. 

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

starcomputer пишет:
Что при создании класса нельзя выполнять какие-то процедуры ?
Я не знаю что такое "создание класса". При создании экземпляра - можно. Но Вы же этого не делаете.

starcomputer
Offline
Зарегистрирован: 19.10.2021

Да, я увидел :( Только не нужно думать, что в программе он не создается (хотя ЧТО Вы еще можете подумать ...:().
Пытался воссоздать все на МАЛЕНЬКОМ скетче.

В одном файле все работает. В двух - нет.
 

// Bluetooth HC-05
#define BT_PRG              4
#define BT_RST              8
#define AT                  1
#define UART                0


void beep(){
  uint8_t i;
  digitalWrite(12, HIGH);
  delay(100);
  digitalWrite(12, LOW);
  delay(100);
}

#include "HC-05.h"

HC05 BT(Serial1);

void setup() {
  pinMode(12, OUTPUT);
  beep();

}

void loop() {

  while(1){}

}
"HC-05.h"
class HC05 {
  public:
    HC05(HardwareSerial &portBT);
   private:
    HardwareSerial *port;
};

HC05::HC05(HardwareSerial &portBT){
    pinMode(BT_RST, OUTPUT);
    digitalWrite(BT_RST,LOW);
    delay(100);
    digitalWrite(BT_RST, HIGH);
    delay(100);
    beep();
    port = &portBT;
}

Блин, ладно я дурак. И в двух работает.

Ну значит на маленьком скетче не поймешь :(

b707
Offline
Зарегистрирован: 26.05.2017

Ищите другие ошибки.

Еще раз повторю - не по горбу ношу взяли, если вы такой элементарной вещи, как создание экземпляра не понимаете - - начните с чего попроще.

starcomputer
Offline
Зарегистрирован: 19.10.2021

Потому что include с конструктором стоит ниже. стр 16.

Да работает оно. Я не могу теперь понять почему в основной программе не работает.

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

b707 пишет:

если они описаны в другом файле?

Вы недооцениваете ТС!

Посмотрите, где у него стоит include!

starcomputer,

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

Подсказка. Вы на глобальном уровне передаёте в конструктор ссылку на  Serial1 (неясно зачем, т.к. внутри Вы ссылкой не пользуетесь, а тупо берёте указатель). А Вы уверены, что к этому моменту он (Serial1) уже существует?

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

starcomputer пишет:

Ну значит на маленьком скетче не поймешь :(

Нет, это значит, что проблема совсем не том, о чём Вы думаете. Вы не ищете ошибку. Вы её уже "назначили". А её там не оказалось. Теперь у Вас размер скетча виноват. На самом деле, просто ошибка в другом.

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

Это работа, дорогой, само ничего не делается.