генератор для модуля AD9851 под другой дисплей

sam117
Offline
Зарегистрирован: 29.11.2016

Ребята всем привет, пытаюсь перевести скетч генератора для модуля AD9851 под дисплей

https://www.youtube.com/watch?v=oWazLlxFJ1Y



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

exit status 1
'setincrement' was not declared in this scope


Хотя эта функция описана в скетче.



Исходник в пост не влез, выложил тут http://pastebin.com/6TRHkacF

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

Перенесите эту функцию выше функции loop.

Если появятся подобные сообщения про другие функции, переносите и их.

Общее правило: функция должна быть объявлена ВЫШЕ первого использования.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

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

Перенесите эту функцию выше функции loop.

Если появятся подобные сообщения про другие функции, переносите и их.

Общее правило: функция должна быть объявлена ВЫШЕ первого использования.

я как бы дико извиняюсь ... объяснял тут тоже одному товарищу, но  наткнулся на то, что

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  flash();
}

void flash() {
  digitalWrite(LED_BUILTIN, HIGH);   
  delay(1000);                       
  digitalWrite(LED_BUILTIN, LOW);    
  delay(1000);   
}

прекрасно компилируется и работает. В голове сидит, что если функцию не объявил и ее вызов выше нее - ошибка! Но что то там в консерватории подправили, с какой версии непонятно. 

add: IDE 1.8.0, но и в более раних помоему уже работает.

 

 

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

xDriver пишет:

я как бы дико извиняюсь ... объяснял тут тоже одному товарищу, но  наткнулся на то, что

add: IDE 1.8.0, но и в более раних помоему уже работает.

Ну, Вы в курсе, что там где работает - это шаловливые ручки разработчиков IDE, которые за нас предобъявления в начало файла собирают (и много чего этим портят).

Это работало до 1.6.5 вкл. Потом перестало (например в 1.6.12 не работает точно). Судя по Вашим словам, в 1.8 заработало снова. Т.е. опять они грязными руками в наш код лезут.

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

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

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

DetSimen пишет:

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

Какое раздолье для тех, у кого мешанина в голове )))

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

DetSimen пишет:

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

Причём тут вообще линкер? Если функция не обявлена, то компилятор сообщает об ошибке и до какого линкера дело вообще не доходит.

В IDE работает просто потому, что их (IDE'шный) препроцессор вставляет предобъвления. Просто посмотрите на файл xxx.ino.cpp созданный той версией IDE, где это работает и всё поймёте.

Сто раз ведь уже обсуждалось. И обсуждалось чем это плохо. Сколько можно-то?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

я их IDE, к счастью, не использую.  У меня Visual Studio, а там всё по стандартам С++. 

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

DetSimen пишет:

я их IDE, к счастью, не использую.  У меня Visual Studio, а там всё по стандартам С++. 

Ну, а раз так, то у Вас не может работать программа в которой функция не объявлена до использования. Что ж Вы тогда говорите "работает благодаря линкеру" и людей в заблуждение вводите? 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Вы путаете.  В стандартном С функцию нельзя было использовать до объявления.  В С++ такого ограничения нет, а Визуальная Студия, с ее precompiled headers позволяет даже видеть обьявленную где-то там, далеко, функцию в Intellisence.  

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

DetSimen пишет:

Вы путаете.  В стандартном С функцию нельзя было использовать до объявления.  В С++ такого ограничения нет, а Визуальная Студия, с ее precompiled headers позволяет даже видеть обьявленную где-то там, далеко, функцию в Intellisence.  

Да, нет, это Вы путаете. Функция в С++ должна быть объявлена до использования (Вам пункт стандарта указать?). А уж прекомпилированы у Вас хеадеры или нет, какая разница. Если функция в них объявлена, то её можно использовать, если нет - хренушки.

Запустите в своей студии вот такой код - узнаете много интересного.

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[]) {
	kaka();
}

void kaka(void) {
	printf ("This is kaka\n");
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

вставил прям в рабочий проект.  скомпилировалось, только типы поправил. 

кста, функция ChangeStatus() тоже вызывается в setup(), а обьявлена ниже. 

мышь стоит над кака() в _tmain();

 

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

Не, ну Вы ардуиновским плагином обрабатываете, который заточен под правила IDE специально, чтобы в нём IDE'шные какашки работали. Нет, Вы без ардуиновских штучек, создайте нормальный, обычный  С++ проект. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Я спорить не буду, С++ для меня не родной.  Возможно, Вы и правы.  Не буду тогда обманывать доверчивых форумчан. 

Да, почитал.  Скорее всего, IDE скрытно вставляет прототип куда-то. 

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

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