Go Down

Topic: Errore con "spaccatura" programma (Read 628 times) previous topic - next topic

the_dragonlord

Ciao a tutti, sto scrivendo un programma che sta diventando parecchio lungo per cui, per ragioni di leggibilità, volevo "spaccarlo" in più file dedicati ad una specifica gestione. Nella fattispecie volevo fare un .INO che sarà il mio main che al suo interno avrà tutte le #INCLUDE agli altri vari spaccati .H i quali implementeranno i vari metodi per la gestione della grafica, delle azioni ecc. Volevo creare anche un .H per la definizione globale di tutte le variabili. Premetto che uso Sloeber per sviluppare (scusate ma l'IDE di Arduino è quanto di più inutilizzabile ci sia per fare dei programmi che non siano più del Blink.INO secondo me). Il punto è che ottengo sempre un messaggio d'errore del tipo:

Code: [Select]
int roomChartInterval[2];
     ^
In file included from ..\FermentingController1_0.ino:9:0,
                 from ..\.ino.cpp:29:
..\VariablesSetting.h:53:8: error: redefinition of 'double whatSPToDisplay'
 double whatSPToDisplay, whatPVToDisplay, roomXPVStep, roomXPV;
        ^
In file included from ..\.ino.cpp:8:0:


Cioè io la definizione delle variabili l'ho demandata ad un .H mentre l'.INO ha la relativa include:

.INO
Code: [Select]
#include "VariablesSetting.h"

.H
Code: [Select]
#include "Arduino.h"
#include <tinyFAT.h>
#include <UTFT.h>
#include <UTFT_tinyFAT.h>
#include <UTFT_Geometry.h>
#include <URTouch.h>
#include <UTFT_Buttons.h>

// Main page variables
#define TOUCH_ORIENTATION LANDSCAPE
int xScreenDim, yScreenDim, gaugeX, gaugeY, gaugeOffset, ledYDim, ledXDim,
row1ButtLenght, row1ButtHeight, row2ButtLenght, row2ButtHeight,
whatSetupWindow;
int percLEDYValue[24];
boolean mainWindow, setupWindow, chartWindow;

// Setup page variables
int setupButtLenght, setupButtHeight, roomXChartInterval, whatSettingToDo;
double roomXSP, roomXCoolTimeout, roomXCoolDZ, roomXCoolHY, roomXWarmDZ,
roomXWarmHY;
boolean roomXCreateChart, setValueWindow;
extern unsigned int checked16x16[0x100];
extern unsigned int unchecked16x16[0x100];


Da quello che capisco sembra che lui "veda" come doppia la definizione di tutte le variabili. Sicuramente sto sbagliando io ma non capisco dove....dalle mie riminescenze di C e da quanto ho letto non sembrerebbe essere sbagliato il mio concetto....

Dove sbaglio?
Grazie
Andrea


ORSO2001

ciao dragonlord,

non vorrei sparare una stupidaggine...se il problema è doppia definizione delle variabili...nel tuo .H prova:
Code: [Select]
#ifndef TOUCH_ORIENTATION LANDSCAPE
#define TOUCH_ORIENTATION LANDSCAPE

dovrebbe evitare doppioni.

uwefed

Basta che apri nella IDE piú schede. Al inizio della compilazione l' IDE li unisce in ordine alfabetico e poi vengono compilati.
Ciao Uwe

the_dragonlord

Basta che apri nella IDE piú schede. Al inizio della compilazione l' IDE li unisce in ordine alfabetico e poi vengono compilati.
Ciao Uwe
Ciao, come dicevo non uso l'IDE di Arduino

the_dragonlord

ciao dragonlord,

non vorrei sparare una stupidaggine...se il problema è doppia definizione delle variabili...nel tuo .H prova:
Code: [Select]
#ifndef TOUCH_ORIENTATION LANDSCAPE
#define TOUCH_ORIENTATION LANDSCAPE

dovrebbe evitare doppioni.
Proverò, grazie è che ripeterlo per tutte le variabili è dura.... :smiley-confuse:

the_dragonlord

Risolto! Dovevo creare i file di header usando i template di Eclipse che inserisce in automatico:

Code: [Select]
/*
 * Prova.h
 *
 *  Created on: 26 ott 2017
 *      Author: The Dragonlord
 */

#ifndef PROVA_H_
#define PROVA_H_





#endif /* PROVA_H_ */


dove Prova.h è l'header appena creato...

the_dragonlord

Salve, sto facendo un passo avanti, o meglio sto cercando di farlo, e di creare per bene gli header ed i file cpp per le varie classi. Ecco un estratto:

File .INO

Code: [Select]
// Debug variable
#define DEBUG;

#include "VariableDefinitions.h"
#include "EEPROMHandler.h"
#include "SplahScreenPage.h"
#include "MainPage.h"
#include "SetupPage.h"
#include "SetValuesPage.h"
#include "DinamicChartFrame.h"


DinamicChartFrame.h:

Code: [Select]

#ifndef DINAMICCHARTFRAME_H_
#define DINAMICCHARTFRAME_H_

//#define CHART_DEBUG

class DinChart {
public:
void drawChart(int roomIndex, double value);
void clearChartArea(int roomIndex);
void handleDinamicChart(int roomIndex);
};

#endif /* DINAMICCHARTFRAME_H_ */


Estratto del file

DinamicChartFrame.cpp:

Code: [Select]

#include "DinamicChartFrame.h"

void DinChart::handleDinamicChart(int roomIndex) {

// Checks if the maximum value for Y axis has changed
if (roomPV[roomIndex] > chartMaxY[roomIndex]) {
isAxisRefreshNeeded[roomIndex] = true;
chartMaxY[roomIndex] = round(roomPV[roomIndex]) + 1;
isChartRefreshNeeded[roomIndex] = true;
}

// Draw axes
if (isAxisRefreshNeeded[roomIndex] || isChartRefreshNeeded[roomIndex]) {
isAxisRefreshNeeded[roomIndex] = false;
isChartRefreshNeeded[roomIndex] = false;
// display.setColor(VGA_AQUA);
display.drawHLine(CHART_FRAME_X1 + CHART_FRAME_OFFSET * (roomIndex),


Il problema sorge nel momento in cui nel file .INO dichiaro l'oggetto di tipo DinChart e poi tento di istanziarlo:

Code: [Select]

DinChart newChart;
.
.
.
.
.
// Draws chart if requested
if (mainWindow)
for (int chartIndex = 0; chartIndex <= 1; chartIndex++) {
if (isRoomActive[chartIndex] && roomCreateChart[chartIndex])
newChart.handleDinamicChart(chartIndex);
}



Ottengo il seguente errore in compiazione:

Code: [Select]

"D:\GoogleDrive\sloeber\/arduinoPlugin/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.4-arduino2/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=10802 -DARDUINO_AVR_MEGA2560 -DARDUINO_ARCH_AVR   -I"D:\GoogleDrive\sloeber\arduinoPlugin\packages\arduino\hardware\avr\1.6.20\cores\arduino" -I"D:\GoogleDrive\sloeber\arduinoPlugin\packages\arduino\hardware\avr\1.6.20\variants\mega" -I"D:\GoogleDrive\sloeber\arduinoPlugin\libraries\tinyFAT\tinyFAT" -I"D:\GoogleDrive\sloeber\arduinoPlugin\libraries\URTouch\URTouch" -I"D:\GoogleDrive\sloeber\arduinoPlugin\libraries\UTFT\UTFT" -I"D:\GoogleDrive\sloeber\arduinoPlugin\libraries\UTFT_Buttons\UTFT_Buttons" -I"D:\GoogleDrive\sloeber\arduinoPlugin\libraries\UTFT_tinyFAT\UTFT_tinyFAT" -I"D:\GoogleDrive\sloeber\arduinoPlugin\libraries\UTFT_Geometry\UTFT_Geometry" -I"D:\GoogleDrive\sloeber\arduinoPlugin\packages\arduino\hardware\avr\1.6.20\libraries\EEPROM" -I"D:\GoogleDrive\sloeber\arduinoPlugin\packages\arduino\hardware\avr\1.6.20\libraries\EEPROM\src" -MMD -MP -MF".ino.cpp.d" -MT".ino.cpp.o" -D__IN_ECLIPSE__=1 -x c++ "..\.ino.cpp"  -o  ".ino.cpp.o"
In file included from ..\.ino.cpp:23:0:
..\FermentingController1_0.ino: In function 'void loop()':
..\FermentingController1_0.ino:78:34: error: 'handleDinamicChart' was not declared in this scope
     handleDinamicChart(chartIndex);
                                  ^


Cioè so che ho sbagliato una scemenza ma non ci arrivo mica eh....boh, sarà l'età forse?

the_dragonlord

La notte ha portato consiglio....ho commesso il più stupido degli errori cioè quello di dichiarare l'oggetto nella setup()....come sempre il compilatore aveva ragione.....

Go Up