Pages: 1 [2] 3   Go Down
Author Topic: Problema a me incomprensibile di programmazione  (Read 1185 times)
0 Members and 1 Guest are viewing this topic.
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20221
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mit globalen Variablen hast Du das Problem nicht.
Grüße Uwe
Cosa vuol dire? Buona notte a domani?  smiley-lol
Questo succede perché scrivo anche sul Forum tedesco;
Scusami, volevo dire:
Se usi variabili globali non hai problemi.
Il comando return restituisce un valore a ogni chiamata di una funzione, ma quello non vuol dire che la funzione non possa usare delle variabili globali o modificarle.

risultato = funzione(parametri);
Visto che puoi usare solo una variabile dove memorizzare il risultato non puoi rendere piú di un valore.

Ciao Uwe
Logged

Livorno
Offline Offline
Jr. Member
**
Karma: 0
Posts: 77
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma chi sei, superman!!!

Ok, penso di aver capito.
Ho provato ad applicare il discorso delle strutture al mio programmino ed ho fatto questo ma ottengo un errore che non capisco, magari è di sintassi:

Code:
struct tasto
{
int piedino;
unsigned long tempo;
};

struct tasto TastoDX, TastoSX, TastoDec;
TastoDX.piedino = 1;
.
.

L'errore che ottengo dal compilatore di arduino è: "error: expected constructor, destructor, or type conversion before '.' token"

Logged

Livorno
Offline Offline
Jr. Member
**
Karma: 0
Posts: 77
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

PS: l'errore si riferisce alla riga
Code:
TastoDX.piedino = 1;
Logged

Livorno
Offline Offline
Jr. Member
**
Karma: 0
Posts: 77
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dunque, qualcosa è cambiato mantenendo questa roba globale:
Code:
struct tasto
{
  int piedino;
  unsigned long tempo;
};

struct tasto TastoDX, TastoSX, TastoDec;

e mettendo l'assegnazione di questa roba all'interno del setup():
Code:
  TastoDX.piedino = 1;
  TastoSX.piedino = 2;
  TastoDec.piedino = 4;

Fino a qua compilo senza errori, spero di aver fatto bene.

Aggiungendo la definizione della funzione (anche se la lascio vuota)
Code:
boolean LeggiTasto(tasto Tasto)
{  }
ottengo questi messaggi di errore:
Quote
Tastiera_IOExp_Func_Struct:1: error: 'tasto' was not declared in this scope
Tastiera_IOExp_Func_Struct.cpp: In function 'boolean LeggiTasto(tasto)':
Tastiera_IOExp_Func_Struct:23: error: 'boolean LeggiTasto(tasto)' redeclared as different kind of symbol
Tastiera_IOExp_Func_Struct:1: error: previous declaration of 'boolean LeggiTasto'
Logged

Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 7
Posts: 2247
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

no uwe è alto atesino, io sono più a sud smiley-wink
comunque consiglio, invece di passarlo come boolean prova a passare la funzione come void così non hai problemi sul return visto che in teoria mi ricordo che col boolean non hai problemi, oppure mettila a int e come return metti 1 o 0


perchè il valore è un int quindi dovresti fare
Code:
boolean LeggiTasto(int Tasto) { }
« Last Edit: April 23, 2011, 04:16:53 am by superlol » Logged

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

Livorno
Offline Offline
Jr. Member
**
Karma: 0
Posts: 77
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vabbè che per scritto a volte è difficile capirsi al volo, ma non ho capito davvero niente di quello che hai scritto.

Ad ogni modo ho definito la funzione in questo modo e quantomeno non ho errori di compilazione... vorrei solo capire se è corretto:
Code:
boolean LeggiTasto(struct tasto Tasto)
Logged

Livorno
Offline Offline
Jr. Member
**
Karma: 0
Posts: 77
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mi potete dire se la definizione della funzione è corretta?
Non ottengo errori di compilazione ma stranamente la stessa funzione si comporta in modo differente da prima che la usavo senza struct.
grazie
Logged

Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 7
Posts: 2247
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

io non capisco perchè queste assegnazioni.
una volta che dichiari la variabile che problema c'è?
intendo
Code:
#include <Wire.h>
#include <IOexp.h>

#define DX 1 //Tasto sul pin 4 del PCF, corrispondente a P0
#define SX 2 //Tasto sul pin 5 del PCF, corrispondente a P1
#define Dec 4 //Tasto sul pin 6 del PCF, corrispondente a P2

IOexp tastiera(0x39);
int tempo;
int LeggiTasto(byte tasto);

void setup()
{
Wire.begin();
Serial.begin(9600);
}

void loop()
{
if (LeggiTasto(SX) == 1) //Leggo il tasto già con i controlli di debounce
{ //Se la funzione ritorna true, faccio l'azione
Serial.println("Tasto sinistro");
}
if (LeggiTasto(DX) == 1) //Leggo il tasto già con i controlli di debounce
{ //Se la funzione ritorna true, faccio l'azione
Serial.println("Tasto destro");
}
if (LeggiTasto(Dec) == 1) //Leggo il tasto già con i controlli di debounce
{ //Se la funzione ritorna true, faccio l'azione
Serial.println("Tasto decremento");
}
}

int LeggiTasto(byte tasto)
{
if (tastiera.read(tasto) && (millis() >= (tempo + 300)))
{
tempo = millis();
return 1;
}
        else { return 0; }
}
sicuro così non vada?
in teoria nei controllo della funzione dovresti poter togliere gli == 1 perchè per il C mi pare che lo 0 venga definito anche come stato booleano false
Logged

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

Livorno
Offline Offline
Jr. Member
**
Karma: 0
Posts: 77
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il punto era creare una struct (come suggeritomi nei post precedenti). In questo modo nella definizione di ogni tasto avrei il piedino a cui il tasto si riferisce e la variabile tempo, una per ogni tasto, indipendente quindi dagli altri tasti.
Con il codice che hai proposto facciamo un passo indietro, così funziona sicuramente (già provato) ma non è quello il punto.
Logged

Livorno
Offline Offline
Jr. Member
**
Karma: 0
Posts: 77
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

In questo momento avrei bisogno di conferme sull'uso della struct in una funzione.
La struttura che ho menzionato nei post precedenti funziona, sia perchè la compila senza errori, sia perchè facendo delle prove posso leggere e scrivere ad es. la variabile TastoDX.piedino all'interno del setup() o del loop().

Il problema che sto avendo ora è che definendo la funzine cosi':
Code:
boolean LeggiTasto(struct tasto Tasto)
non ottengo errori di compilazione, ma questo non vuol dire che ho fatto bene.
Infatti se provo a leggere la stessa variabile TastoDX.piedino dall'interno della funzione con una serial.print ottengo "2" (che è giusto), ma se provo a modificarne il valore (banalmente con una somma) ottengo sempre 2, quindi vuol dire che qualcosa non sta funzionando.
Logged

Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 7
Posts: 2247
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ma usare un'array per la comodità no eh? smiley-grin
Logged

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

usare un array non è una comodità perchè con una struttura eviti sbattimenti di array paralleli e puoi creare liste dinamiche... isomma si tratta di fare un passo avati nella programmazione.

In teoria, come scrivi tu la struttura viene copiata, esattamente come se passassi un int.

Per fare in modo che la struttura, modificata nella funzione, rifletta le sue modifiche anche alla struttura di partenza ci sono 2 soluzioni:
1. passi l'index nell'array della struttura, e la modifichi direttamente
2. passi l'indirizzo in ram della struttura, e la funzione non si aspetterà più una variabile struttura, ma un puntatore a struttura.
Quindi la chimata diventa:
LeggiTasto( &(array) );

e la funzione diventa:
boolean Leggiasto(struct tasto *Tasto){
...
}

però al'interno della funzione poi non puoi fare
Tasto.tempo = millis();
ma dovrai fare
(*Tasto).tempo = millis();

ti consiglio il metodo 1, poi il metodo 2 è più avanzato e ti serve conoscere i puntatori
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Livorno
Offline Offline
Jr. Member
**
Karma: 0
Posts: 77
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Data la mia ignoranza in materia non posso che affidarmi ai tuoi consigli e dato che è a causa tua  smiley-razz che mi sto addentrando nelle strutture, ti chiedo per favore se puoi approfondirmi la soluzione 1, in modo da non imbattermi in problemi di sintassi ecc.
grazie!
Logged

Livorno
Offline Offline
Jr. Member
**
Karma: 0
Posts: 77
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Per favore non mi abbandonate sul più bello!!  smiley-sad
Logged

0
Online Online
Shannon Member
****
Karma: 117
Posts: 10106
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

rieccomi smiley

la dichiarazione di array di struttura sarebbe (esempio con 4 tasti):
Code:
#define NUMERO_TASTI 4
struct info{
   unsigned long time;
   int pinTasto;
}
struct info arrayInfoTasti[NUMERO_TASTI];
la funzione diventerebbe (per esempio setto time):
Code:
boolean LeggiTasto(int index){
   ...
   arrayInfoTasti[index].tempo = millis();
   ...
}

ricordati che le variabili contenute nella struttura, al pari delle variabili normali, vanno inizializzare. Ti consiglio di farlo nel setup: con un for scorri l'array e setti le variabili

ora basta che ti ho aiutato abbastanza, il resto devi farlo da te smiley-razz
Logged

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: 1 [2] 3   Go Up
Jump to: