#define ---- errore "incomprensibile"

Salve a tutti ....
vi sottopongo due spezzoni di sketch apparentemente simili

/* Questo è il primo */

#define A 1
#define F 5

int led_0 = A;
int led_1 = F;

/* Questo è il secondo */

#define K 1
#define D 5

int led_0 = K;
int led_1 = D;

La differenza è che il primo NON funziona !

error: 'F' was not declared in this scope

E' come se non esistesse l'istruzione #define F 5
Per ora ho provato con diverse versioni di IDE e su tutte il difetto persiste.
Vi è mai capitato qualcosa di simile o qualche altra stravaganza?
Saluti.

La funzione F() è già definita nel core di Arduino, non puoi usarla per altre cose. :wink:

Indipendentemente da questo uso della keyword "F" é opportuno non usare per variabili dei nomi cosí astratti. Se usi A, D, F, K come nomi non ha senso che usi #define. Usa dei nomi che descrivono il significato della variabile come lo hai fatto con led_1 per esempio pin_led_1.

Ciao Uwe

PaoloP:
La funzione F() è già definita nel core di Arduino, non puoi usarla per altre cose. :wink:

Vero, però F() è una funzione e non un nome generico, ovvero puoi tranquillamente creare una variabile denominata F, o un alias F, non puoi creare una funzione F().
Il problema è che o ha scritto "F5" invece di "F 5" oppure non ha definito led_0 e led_1 come variabili globali, pertanto possono risultare non disponibili in tutto lo sketch in accordo con l'errore riportato.

Grazie a tutti per le risposte ....

il codice l'ho trovato su

e fa parte di un esempio semplice semplice pubblicato dalla rivista Make.

http://makeprojects.com/Project/Drive+a+7-Segment+LED+with+an+Arduino/645/1#.UOAZWazpuSp

Probabilmente non l'hanno provato prima, ma solo scritto e pubblicato .....
ora però mi sovviene la domanda .... ma F() che funzione è ??? dove si usa, cosa fa ???
Non trovo riferimenti attendibili a tal riguardo.
Grazie ancora a tutti, saluti.

F non è una funzione ma un #define definito nel file WString.h:
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

e come tale viene a crearsi il problema che nella porzione di codice in cui ridefinisci F tutto funziona, ma non nelle funzioni successive, essendo la ridefinizione di F al di fuori dello spazio di visibilità della funzione stessa.
Ho visto lo sketch che è stato pubblicato.
Affinché esso... funzioni dovresti inserire un #define F 5 in ogni funzione

Il seguente codice compila.

/*
Make Projects: How to Drive a 7 Segment LED
 URL:
 By: Riley Porter
 This is an introduction on how to drive a 7 Segment LED using only a Arduino.  This is 
 not the best way to do this.  This is meant to be a learning excercise.  In later tutorials
 I will show you how to use an dedicated IC using SPI or a Shift Register.  Enjoy.
 
 
 digitalWrite(A, HIGH) = turn off the "A" segment in the LED display
 digitalWrite(B, LOW)  = turn on the "B" segment in the LED display
 
 */


#define A 8
#define B 9
#define C 2
#define D 3
#define E 4
#define F 5
#define G 6




void clr()
{
    #define F 5
  //Clears the LED
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);

}


void char_A()
{
    #define F 5
  digitalWrite(D, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
}

void char_B()
{
    #define F 5
  //Displays B
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, LOW);
}

void char_C()
{
    #define F 5
  //Displays C
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, HIGH);
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
}

void char_D()
{
    #define F 5
  //Displays D
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, HIGH);
  digitalWrite(G, LOW);
  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
}

void char_E()
{
    #define F 5
  //Displays E
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
}

void char_F()
{
    #define F 5
  //Displays F
  digitalWrite(D, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
}


void one()
{
    #define F 5
  //Displays 1
  digitalWrite(D, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, HIGH);
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
}

void two()
{
    #define F 5
  //Displays 2
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, HIGH);
  digitalWrite(G, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, HIGH);
}

void three()
{
    #define F 5
  //Displays 3
  digitalWrite(D, LOW);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
}

void four()
{
    #define F 5
  //Displays 4
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
}

void five()
{
    #define F 5
  //Displays 5
  digitalWrite(D, LOW);
  digitalWrite(E, HIGH);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, LOW);
}

void six()
{
    #define F 5
  //Displays 6
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, LOW);
}

void seven()
{
    #define F 5
  //Displays 7
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
}

void eight()
{
    #define F 5
  //Displays 8
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
}

void nine()
{
    #define F 5
  //Displays 9
  digitalWrite(D, LOW);
  digitalWrite(E, HIGH);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
}

void zero()
{
    #define F 5
  //Displays 0
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, HIGH);
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
}

void LoopDisplay()
{
  //Loop through all Chars and Numbers
  char_A();
  delay(1000);
  char_B();
  delay(1000);
  char_C();
  delay(1000);
  char_D();
  delay(1000);
  char_E();
  delay(1000);
  char_F();
  delay(1000);
  one();
  delay(1000);
  two();
  delay(1000);
  three();
  delay(1000);
  four();
  delay(1000);
  five();
  delay(1000);
  six();
  delay(1000);
  seven();
  delay(1000);
  eight();
  delay(1000);
  nine();
  delay(1000);
  zero();
  delay(1000);
}

void setup()
{
    #define F 5
  //Setup our pins
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);
  Serial.begin(9600);  //Begin serial communcation

}

void loop()
{
  Serial.println("Starting\n");
  LoopDisplay();

}

Quel codice è stato scritto per le vecchie versioni dell'IDE, la 0022/0023. Lo si capisce dall'estensione del file, .pde, che era usata dalla vecchia IDE. Dall'IDE 1.0 in poi l'estensione è diventata .ino ed è stata introdotta la funzione F, che permette di scrivere su monitor seriale o su un lcd una stringa recuperandola direttamente dalla Flash, per risparmiare RAM.

Se avessero scritto seg_A, seg_B ecc non sarebbe sucesso.
Ciao Uwe

leo72:
F non è una funzione ma un #define definito nel file WString.h:
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

Hai ragione, non mi ricordavo che F() è una #define.

astrobeed:
Hai ragione, non mi ricordavo che F() è una #define.

E' che siamo così abituati ad indicare F() come funzione che alla fine poi sbagliamo senza accorgercene :wink:

leo72:
E' che siamo così abituati ad indicare F() come funzione che alla fine poi sbagliamo senza accorgercene :wink:

Più che altro è impossibile ricordarsi tutto a memoria :slight_smile:
Non mi ricordo se è già stato segnalato questo utile sketch che fornisce informazioni dettagliate su Arduino ed esegue un test prestazioni, mi ci sono imbattuto per caso stamattina mentre stavo cercando una libreria.

astrobeed:

leo72:
E' che siamo così abituati ad indicare F() come funzione che alla fine poi sbagliamo senza accorgercene :wink:

Più che altro è impossibile ricordarsi tutto a memoria :slight_smile:

+1 :wink:

Non mi ricordo se è già stato segnalato questo utile sketch che fornisce informazioni dettagliate su Arduino ed esegue un test prestazioni, mi ci sono imbattuto per caso stamattina mentre stavo cercando una libreria.

Non lo conoscevo. Mi sembra utile.

leo72:
Non lo conoscevo. Mi sembra utile.

Se non lo conoscevi tu allora vuol dire che nessuno l'ha mai linkato sul forum italiano :slight_smile:
L'ho già provato e ti confermo che funziona molto bene.

Il mio Arduino è più veloce del vostro. ]:smiley: ]:smiley:

Speed test

F_CPU = 16000000 Hz
1/F_CPU = 0.0625 us
The next tests are runtime compensated for overhead
nop : 0.063 us
avr gcc I/O : 0.125 us
Arduino digitalRead : 3.653 us
Arduino digitalWrite : 3.903 us
pinMode : 4.623 us
multiply volatile byte : 0.632 us
divide volatile byte : 12.888 us
multiply volatile integer : 1.449 us
divide volatile integer : 15.223 us
multiply volatile long : 4.530 us
multiply single float : 7.110 us
multiply double float : 7.108 us
divide double float : 79.978 us
itoa() : 16.488 us
ltoa() : 239.478 us
dtostrf() : 79.303 us
random() : 94.253 us
y |= (1<<x) with volatile : 0.569 us
bitSet() with volatile : 0.569 us
analogReference() : 0.694 us
analogRead() : 111.928 us
analogWrite() PWM : 11.608 us
delay(1) : 1003.978 us
delay(100) : 100024.976 us
delayMicroseconds(1) : 0.883 us
delayMicroseconds(5) : 4.655 us
delayMicroseconds(100) : 100.228 us

PaoloP:
Il mio Arduino è più veloce del vostro. ]:smiley: ]:smiley:

La mia Luigino 328 Evo turbo, che non arriverà mai sul mercato, è ancora più veloce perché è overcloccata a 24 MHz :grin:

Questi sono i dati del mio Arduino UNO R1:

Speed test
----------
F_CPU = 16000000 Hz
1/F_CPU = 0.0625 us
The next tests are runtime compensated for overhead
  nop                       : 0.063 us
  avr gcc I/O               : 0.125 us
  Arduino digitalRead       : 3.964 us
  Arduino digitalWrite      : 5.162 us
  pinMode                   : 4.030 us
  multiply volatile byte    : 0.632 us
  divide volatile byte      : 5.407 us
  multiply volatile integer : 1.386 us
  divide volatile integer   : 15.217 us
  multiply volatile long    : 4.655 us
  multiply single float     : 7.237 us
  multiply double float     : 7.237 us
  divide double float       : 80.112 us
  itoa()                    : 16.602 us
  ltoa()                    : 239.787 us
  dtostrf()                 : 79.662 us
  random()                  : 55.212 us
  y |= (1<<x) with volatile : 0.569 us
  bitSet() with volatile    : 0.569 us
  analogReference()         : 0.695 us
  analogRead()              : 111.987 us
  analogWrite() PWM         : 12.357 us
  delay(1)                  : 1007.487 us
  delay(100)                : 99999.984 us
  delayMicroseconds(1)      : 0.883 us
  delayMicroseconds(5)      : 4.656 us
  delayMicroseconds(100)    : 100.237 us
-----------

PaoloP:
Il mio Arduino è più veloce del vostro. ]:smiley: ]:smiley:

cosa gli hai dato da mangiare perché debba essere piú veloce deglia ltri?
Ciao Uwe

Lo alimento con la 380. :grin: :grin:

uwefed:

PaoloP:
Il mio Arduino è più veloce del vostro. ]:smiley: ]:smiley:

cosa gli hai dato da mangiare perché debba essere piú veloce deglia ltri?
Ciao Uwe

Secondo me gli ha messo accanto l'arduino DUE che ha ARM a bordo, allora la UNO si e detta cazzz, c'è la DUE qui "oooo ragazi fasciamo bella figura ehe, mi stiamo a contare i bit durante la programmazione ISP, andiamo."

Ciao.

Il tasso di caxxxeggio sulla sezione italiana è impressionante :smiley:

tuxduino:
Il tasso di caxxxeggio sulla sezione italiana è impressionante :smiley:

+1 :grin: