Go Down

Topic: Tab Multiple (Read 10073 times) previous topic - next topic

f.schiano

Ciao a tutti,

ho un programma scritto nell´arduino ide che é diventato abbastanza grande e quindi l´ho separato in diverse tabs.

Sono a conoscenza del fatto che l´arduino IDE compila le tabs in ordine alfabetico ma ho il seguente problema :

ho il mio main in un file chiamato "Controller_v3_2" l´unico con la lettera maiuscola delle mie tabs.
In questo file ci sta setup e loop

ho altre tabs tra cui quella "controller" in cui é implementata una funzione che ha la seguente firma:
Code: [Select]
void simplecontroller(float &V, int L,float Ldot, int &flag, int &S1, int &S2, int S1_delay_up, int S1_delay_down);

Questa funzione utilizza due funzioni:

Code: [Select]
void parse_delay(String &c, int (&delay_values)[16], boolean (&rise_fall_values)[16]);
void check_voltage_divider(String c);


queste funzioni sono implementate in una tab chiamata: "parsing" .

Quindi in ordine alfabetico ho:
Controller_v3_2, controller, parsing

Quando provo a compilare mi dice che la funzione:
parse_delay(.....); é undefined.

Sono daccordo con il compilatore ma non riesco a capire perché l´errore non me lo da con l´altra funzione chiamata:
check_voltage_divider();
Mi aspetterei un errore anche per questa funzione perché anch´essa é definita in una tab che in ordine alfabetico sta dopo la tab "controller" in cui viene richiamata.

vi dico anche che nella funzione simplecontroller() implementata nella tab "controller" la funzione
check_voltage_divider();
viene richiamata prima di quella che mi da errore:
parse_delay(.....);
Quindi mi aspetterei che l´errore sia prima dato dalla check_voltage_divider() e poi da parse_delay(.....);

Qualcuno puó aiutarmi?
Grazie.

astrobeed


Sono a conoscenza del fatto che l´arduino IDE compila le tabs in ordine alfabetico


L'ordine di compilazione non è quello alfabetico, è determinato da come sono messi in sequenza i file nella riga di comando del compilatore e/o nel file make, l'ordine alfabetico riguarda solo come sono visualizzati i tab a partire da quello principale, che è sempre e comunque il primo.
Il tuo errore prima di tutto tocca vedere se è del compilatore o del linker, le cause sono errata scrittura del nome della funzione, basta una maiuscola al posto di una minuscola, mancato inserimento del file h con i prototipi, omissione del prototipo della funzione nel relativo file .h.
Scientia potentia est

f.schiano

#2
Dec 03, 2013, 03:10 pm Last Edit: Dec 03, 2013, 03:12 pm by f.schiano Reason: 1
io ho un file .h che contiene l´inizializzazione delle variabili ma non i prototipi delle funzioni.

Devo inserire all´interno del file .h anche i prototipi delle funzioni?

Per prototipo intendi la firma giusto?

EDIT: se quello che dici é vero riguardo l´ordine alfabetico. Perché se rinomino la tab "parsing" in "a_parsing" il tutto funziona?

astrobeed


Devo inserire all´interno del file .h anche i prototipi delle funzioni?


Si, i file .h servono principalmente per i prototipi delle funzioni.
Scientia potentia est

f.schiano

se ho un file .h é buona norma averne anche uno .cpp ? e organizzare il tutto come in una libreria? oppure posso farne a meno e lasciare solo il file .h per definire i valori iniziali delle variabili e inserirci i vari prototipi?

leo72

Puoi mettere un file .h con alcune definizioni. Ricordati solo di metterci anche un include "Arduino.h" nel tuo file header altrimenti in quel file non puoi usare le funzioni ed i comandi nonché i tipi specifici di Arduino.

astrobeed


se ho un file .h é buona norma averne anche uno .cpp ?


E' il contrario :)
Per ogni file .c o .cpp ci dovrebbe sempre essere un file .h che contiene tutti i prototipi delle funzioni e le eventuali define, questo file .h deve essere incluso in tutti i file .c o .ccp che devono utilizzare le funzioni contenute nel file c/ccp abbinato altrimenti incorri nell'errore di funzione non definita.
Attenzione a non mettere delle variabili nei file .h perché poi ti ritrovi con errori di definizioni multiple se usi il file .h più di una volta.
Nel software scritto bene solitamente c'è un file common.h che contiene tutte le include e le define comuni a tutti i file c/ccp, così includi solo questo senza ogni volta dover scrivere un poema di #include  :)
Scientia potentia est

f.schiano

ok. Grazie mille . Ste cose dovrei saperle ma purtroppo essendo MAtlab il mio ambiente di programmazione preferito le dimentico spesso.

Comunque ho aggiunto al mio file initialization.h :

Code: [Select]
#include "Arduino.h"
      // LIBRARIES /////////////////////////////////////////////////////     
      // Library for the LED Strip
      #include <LPD8806.h>
      // Library for the DAC and the SD which are both working over SPI
      #include <SPI.h>
      // Library for more mathematical functions
      #include <math.h>
      // Library for Strings
      #include <String.h>
      // Library for SD card
      #include <SD.h>     


Ma ricevo un errore:
[font=Verdana]In file included from Controller_v3_2.ino:8:
/initialization.h:6: fatal error: LPD8806.h: No such file or directory
compilation terminated[/font]

astrobeed


[font=Verdana]In file included from Controller_v3_2.ino:8:
/initialization.h:6: fatal error: LPD8806.h: No such file or directory
compilation terminated[/font]



Dove si trova il file LPD8806.h ?
Scientia potentia est

f.schiano

eh é quello che mi stavo chiedendo. Sta nelle libraries di arduino, dove ci sono tutte le altre librerie.

devo metterlo nella stessa directory del file .h ?

astrobeed


eh é quello che mi stavo chiedendo. Sta nelle libraries di arduino, dove ci sono tutte le altre librerie.


Se è li o il nome è sbagliato oppure non si trova dentro la corretta cartella.
Scientia potentia est

f.schiano

Ho appena controllato, la cartella LPD8806 si trova, con i rispettivi files all´interno nella cartella "libraries" di Arduino.

L´ho sempre inserita cosí una libreria e ha sempre funzionato.

Forse ho sbagliato a creare il file .h ? Perché per crearlo ho semplicementecreato un nuovo file e poi ho modificato l´estensione da .ino a .h .

Grazie

astrobeed


Forse ho sbagliato a creare il file .h ? Perché per crearlo ho semplicementecreato un nuovo file e poi ho modificato l´estensione da .ino a .h


Per quale motivo hai aggiunto un file h ad una libreria già esistente ?
Scientia potentia est

f.schiano

scusami mi sono spiegato male.

Mi serviva la libreria LPD8806. Ho effettuato il download della cartella completa di :
examples
LPD8806.cpp
LPD8806.h

e l´ho copiata nella cartella "libraries" dell´arduino IDE.

Cosí funziona perché se scrivo:
Code: [Select]
#include <LPD8806.h>

in un qualunque sketch arduino , la libreria viene inclusa senza problemi.

Invece dal file .h mi da quel problema.

f.schiano

il file .h a cui mi riferisco é semplicemente un file .h che ho creato tra le mie tab e richiamo con

#include <initialization.h>

Quindi alla fine la mia cartella del progetto conterrá:
controller.ino
Controller_v3_2.ino
initializazion.h
parsing.ino

Go Up