Go Down

Topic: Problema a me incomprensibile di programmazione (Read 1 time) previous topic - next topic

uwefed



Mit globalen Variablen hast Du das Problem nicht.
Grüße Uwe

Cosa vuol dire? Buona notte a domani?  XD

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

mechrekt

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: [Select]
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"


mechrekt

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

mechrekt

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

struct tasto TastoDX, TastoSX, TastoDec;


e mettendo l'assegnazione di questa roba all'interno del setup():
Code: [Select]
  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: [Select]
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'

superlol

#19
Apr 23, 2011, 11:15 am Last Edit: Apr 23, 2011, 11:16 am by superlol Reason: 1
no uwe è alto atesino, io sono più a sud ;)
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: [Select]
boolean LeggiTasto(int Tasto) { }
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

mechrekt

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: [Select]
boolean LeggiTasto(struct tasto Tasto)

mechrekt

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

superlol

io non capisco perchè queste assegnazioni.
una volta che dichiari la variabile che problema c'è?
intendo
Code: [Select]
#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
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

mechrekt

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.

mechrekt

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: [Select]
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.

superlol

ma usare un'array per la comodità no eh? :D
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

lesto

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
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

mechrekt

Data la mia ignoranza in materia non posso che affidarmi ai tuoi consigli e dato che è a causa tua  :P 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!

mechrekt

Per favore non mi abbandonate sul più bello!!  :(

lesto

rieccomi :)

la dichiarazione di array di struttura sarebbe (esempio con 4 tasti):
Code: [Select]

#define NUMERO_TASTI 4
struct info{
   unsigned long time;
   int pinTasto;
}
struct info arrayInfoTasti[NUMERO_TASTI];

la funzione diventerebbe (per esempio setto time):
Code: [Select]

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 :P
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up