Go Down

Topic: Problema dichiarazione Variabili Globali/Locali nel progetto e nelle Librerie  (Read 451 times) previous topic - next topic

paolo311

Partiamo dall'inizio, tu hai questo problema: devi dichiarare un array quando non sai ancora la sua dimensione.

Una delle soluzioni disponibili è quella che ti ho mostrato: dichiari un puntatore e poi quando conosci la dimensione dell'array, lo inizializzi con il numero di valori che ti serve.

La classe è un "fiorellino" in più perchè permette di definire con precisione lo scope dell'array, e di aggiungere metodi specifici per manipolarlo.

Sempre per Paolo311 il tuo codice sembra proprio letto velocemente a quello che pensavo con le corrispettive funzioni di writer e read ma non capisco da dove sia stato tirato fuori il nome "mdaob"
"mdaob" è arbitrario, è il nome di una variabile di tipo MyDumbArrayOfBytes

e poi il codice è tutto intero o è diviso uno nel file.h e le funzioni nel file.ccp ?
Le best pratices c++ credo che indichino di creare per ogni classe un file *.h con le dichiarazioni e un file *.cpp con l'implementazione, io però sono pigro (estremamente pigro..) quindi, sacrifico una regola "da manuale" a favore di una maggiore leggibilità e minore dispersione.

P.

MizzardNet

non credo che tu abbia letto le mie risposte, per due ragioni:
1) non hai nemmeno capito quando scrivo a te e quando no
2) ci sono scritte, nelle mie risposte, tutte e due le "sole" due soluzioni possibili, di una poi ti è stata anche indicata la versione c++
inoltre:
3) tu hai già trovato e letto le librerie che fanno quello che cerchi, hai esattamente trovato quello che ti indicavo io, ma non ne hai fatto niente
e quindi? cosa aspetti adesso a prenderti un buon libro e a studiare quello che ti abbiamo detto?
credimi: è escluso che, ad esempio, io ti scriva la tua "funzione magica", fai molto prima a studiare
per il resto: buon viaggio
Senti in poche parole le tue risposte non sono state esaustive come quelle di paolo311 ed non serve alzare la cresta approfittando del fatto di aver sbagliato a rispondere ad una tua risposta riferita ad qualcun'altro, non hai messo i "quote" e dalla mia visione sembrava fosse riferita a me tutto qui.

Poi non ho trovato affatto librerie che fanno al caso mio e l'unica che ha quello che cerco l'ho postata in file .zip e l'ho fatto se qualcuno è in grado di spiegarmi con funziona il codice per poi così utilizzarlo nelle mie librerie personali.

Io vedo solo una tua versione, io vedo dalla seconda risposta un codice esempio che non ho capito e non riesco ad implementarlo rispetto a quello di paolo311 che ok sarà simile al tuo come hai detto tu in un'altra risposta dove però hai usato un alloc()...

E così  ricadiamo nella mia prima risposta, dove però  io usavo una alloc () non conoscendo io bene il c++
Si, in effetti le soluzioni quelle sono...
E poi è facile dire "studia c" e fine... non so... qualche suggerimento di libri su C buoni ?
Tranquillo che non mi aspetto il "codice magico" da te... mi bastano avanzano le tue risposte inconcludenti.

Paolo 311 mi ha fatto capire meglio.

MizzardNet

Partiamo dall'inizio, tu hai questo problema: devi dichiarare un array quando non sai ancora la sua dimensione.

Una delle soluzioni disponibili è quella che ti ho mostrato: dichiari un puntatore e poi quando conosci la dimensione dell'array, lo inizializzi con il numero di valori che ti serve.

La classe è un "fiorellino" in più perchè permette di definire con precisione lo scope dell'array, e di aggiungere metodi specifici per manipolarlo.

"mdaob" è arbitrario, è il nome di una variabile di tipo MyDumbArrayOfBytes

Le best pratices c++ credo che indichino di creare per ogni classe un file *.h con le dichiarazioni e un file *.cpp con l'implementazione, io però sono pigro (estremamente pigro..) quindi, sacrifico una regola "da manuale" a favore di una maggiore leggibilità e minore dispersione.

P.
Ahh si vero il nome mdaob è il nome dell'istanza MyDumbArrayOfBytes usata nel progretto vero.
Quindi il codice con le funzioni lo metto tutto interno in un file  con un determianto nome ? con l'estensione .h ?

Ho provato a mettere il codice .h in un file e l'altro nel progetto principale e mi fa errore di compilazione.
I file sono tutti e due nella stessa cartella.
Il nome del file è MyDumbArrayOfBytes.h

Codice erorre:

Arduino:1.8.5 (Windows 10), Scheda:"Arduino/Genuino Uno"

C:\++++++++++++\AppData\Local\Temp\cc2zQSTq.ltrans0.ltrans.o: In function `main':

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/main.cpp:46: undefined reference to `loop'

collect2.exe: error: ld returned 1 exit status

exit status 1
Errore durante la compilazione per la scheda Arduino/Genuino Uno.

Questo report potrebbe essere più ricco di informazioni abilitando l'opzione
"Mostra un output dettagliato durante la compilazione"
in "File -> Impostazioni"

Chiedo subito perchè so' che c'è qualcosa che mi sfugge.




Standardoil

.......serve alzare la cresta approfittando del fatto di aver sbagliato a rispondere ad una tua risposta riferita ad qualcun'altro, non hai messo i "quote" e dalla mia visione sembrava fosse riferita a me tutto qui.

Poi non ho trovato affatto librerie che fanno al caso mio e l'unica che ha quello che cerco l'ho postata in file .zip e l'ho fatto se qualcuno è in grado di spiegarmi con funziona il codice per poi così utilizzarlo nelle mie librerie personali.

Io vedo solo una tua versione, io vedo dalla seconda risposta un codice esempio che non ho capito e non riesco ad implementarlo rispetto a quello di paolo311 che ok sarà simile al tuo come hai detto tu in un'altra risposta dove però hai usato un alloc()...

E poi è facile dire "studia c" e fine... non so... qualche suggerimento di libri su C buoni ?
Tranquillo che non mi aspetto il "codice magico" da te... mi bastano avanzano le tue risposte inconcludenti.

chiedo scusa alla moderazione per la citazione quasi completa, ma ci sono talemtnte tanti spunti che non potevo evitare
per lo OP
1) non sono io che alzo la cresta, se misurassimo la "lunghezza" delle risposte, sarebbe evidente chi sta "alzando" qualcosa... e non serve nemmeno accusarmi di non aver messo i tag, sei TU che non hai capito, non io che ho sbagliato, infatti altri hanno capito benissimo
2) che tu non abbia trovato librerie che fanno al caso tu ci credo, non le sai "capire", nemmeno quando te le spiegano
Code: [Select]

    _digitalValues = (uint8_t *)malloc(numberOfShiftRegisters * sizeof(uint8_t));

questa riga viene esattamente dalla libreria che hai allegato tu
e funziona esattamente come ti ho spiegato io nel mio post #1 (il primo che hai letto)
la riga si legge:
assegni a puntatore il risultato di un cast a tipo specifico del puntatore restituito da una malloc che alloca la memoria calcolata con la sizeof
prova a dirmi che non è quello che ti ho scritto al post #1; se non sei capace non lamentarti e non accusare gli altri. Per tua norma, se mi accusi ancora una volta di un fatto non vero ti segnalo alla moderazione
3) che tu non abbia capito il codice esempio non mi stupisce, anche perchè nella mia altra risposta io ho usato una malloc(), non sei nemmeno andato a vedere, hai solo copincollato risposte a casaccio
4)è facile dire studia il 'C', però io non solo lo ho detto, ho anche fatto: ho un intero trhead "aiutateci ad aiutarvi" che tu non hai nemmeno cercato, sei venuto qui, hai chiesto e adesso aspetti che ti diano la "pappa fatta" (che è un mio altro trehad al riguardo)
se tu, non dico avessi cercato, ma solo ti fossi minimamente guardato intorno, avresti trovato TUTTE le info che ti servono, invece aspetti solo la "soluzione", che oltretutto deve essere anche facile da capire per te, altrimenti non la riconosci e ti metti a accusare

quindi non mi rimane da dirti che:
buon viaggio

PS spero che tutto questo rimanga qui, a futura memoria........
Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

gpb01

... se mi accusi ancora una volta di un fatto non vero ti segnalo alla moderazione ...
... io leggo e vedo TUTTO, anche se non intervengo ... ora prego entrambi di abbassare i toni e riportare il tutto ad una normale discussione tecnica. Grazie.

Guglielmo
Search is Your friend ... or I am Your enemy !

MizzardNet

chiedo scusa alla moderazione per la citazione quasi completa, ma ci sono talemtnte tanti spunti che non potevo evitare
per lo OP
1) non sono io che alzo la cresta, se misurassimo la "lunghezza" delle risposte, sarebbe evidente chi sta "alzando" qualcosa... e non serve nemmeno accusarmi di non aver messo i tag, sei TU che non hai capito, non io che ho sbagliato, infatti altri hanno capito benissimo
2) che tu non abbia trovato librerie che fanno al caso tu ci credo, non le sai "capire", nemmeno quando te le spiegano
Code: [Select]

    _digitalValues = (uint8_t *)malloc(numberOfShiftRegisters * sizeof(uint8_t));

questa riga viene esattamente dalla libreria che hai allegato tu
e funziona esattamente come ti ho spiegato io nel mio post #1 (il primo che hai letto)
la riga si legge:
assegni a puntatore il risultato di un cast a tipo specifico del puntatore restituito da una malloc che alloca la memoria calcolata con la sizeof
prova a dirmi che non è quello che ti ho scritto al post #1; se non sei capace non lamentarti e non accusare gli altri. Per tua norma, se mi accusi ancora una volta di un fatto non vero ti segnalo alla moderazione
3) che tu non abbia capito il codice esempio non mi stupisce, anche perchè nella mia altra risposta io ho usato una malloc(), non sei nemmeno andato a vedere, hai solo copincollato risposte a casaccio
4)è facile dire studia il 'C', però io non solo lo ho detto, ho anche fatto: ho un intero trhead "aiutateci ad aiutarvi" che tu non hai nemmeno cercato, sei venuto qui, hai chiesto e adesso aspetti che ti diano la "pappa fatta" (che è un mio altro trehad al riguardo)
se tu, non dico avessi cercato, ma solo ti fossi minimamente guardato intorno, avresti trovato TUTTE le info che ti servono, invece aspetti solo la "soluzione", che oltretutto deve essere anche facile da capire per te, altrimenti non la riconosci e ti metti a accusare

quindi non mi rimane da dirti che:
buon viaggio

PS spero che tutto questo rimanga qui, a futura memoria........
AHHH perfetto adesso ho capito ! Ti sei spiegato bene XD

Comunque tranquillo io non ti accuso di niente ho solo detto che dalle tue risposte non ho capito bene e quindi per me inconcludenti.
Una buona risposta equivale a fare capire l'argomento ad uno che non sa niente su tale.

Per quanto riguarda la risposta non riferita a me mi son sentito sminuito per il fatto che hai usato il mio errore e lo hai sottolineato come per il resto del fatto che non leggo, non cerco, accuso ecc ma stai tranquillo che l'ho fatto prima di scrivere questa discussione ed per adesso non ho visto altri utenti citare il mio stesso problema su altri post e ho dedotto forse che è un argomento mai citato prima.

Sicuramente ci sono post dove parlano ti tale discussione sotto altre voci e quindi ho pensato che sia più efficace scrivere direttamente un post specifico per aprire una nuovo argomento che può aiutare altri che s'imbattono in questo problema.

E non voglio essere preso per quello che vuole la pappa in bocca. Semplicemente non ho capito le tue risposte che sicuramente per un'altro saranno perfette ma per me no, quindi non volevo offenderti se ritengo le tue risposte incomplete.

Ma adesso avendolo rispiegato con il codice sotto mano tutto torna e ti RINGRAZIO ! XD

E mi scuso di tutto, Pace a Amore!


MizzardNet

Adesso ho fatto un esempio con l'utilizzo di quel pezzo di codice che Standaroil mi ha fatto capire.

File Memoria_Dinamica.h
-------------------------------------------------------------------------------------------------------------
Code: [Select]


#ifndef Memoria_Dinamica_h
#define Memoria_Dinamica_h
#include "Arduino.h"

class Memoria_Dinamica {

  public:

    uint8_t * _digitalValues;

    Memoria_Dinamica(int Buffer);

  private:

};

#endif




Memoria_Dinamica.cpp
-------------------------------------------------------------------------------------------------------------
Code: [Select]


#include "Memoria_Dinamica.h"
#include "Arduino.h"

Memoria_Dinamica::Memoria_Dinamica(int Buffer) {

  // allocates the specified number of bytes and initializes them to zero
  _digitalValues = (uint8_t *)malloc(Buffer * sizeof(uint8_t));

  //memset(_digitalValues, 0, Buffer * sizeof(uint8_t));
}



Memoria_Dinamica.ino
-------------------------------------------------------------------------------------------------------------
Code: [Select]


//19/08/2019
//by MizzardNet
//Arduino Forum > Problema dichiarazione Variabili Globali/Locali nel progetto e nelle Librerie
//Link          > https://forum.arduino.cc/index.php?topic=631143.0

#include "Memoria_Dinamica.h"

//Pin I/O
#define I1 2
#define I2 3
#define I3 4
#define I4 5
#define I5 6
#define I6 7
#define I7 8
#define I8 9
#define Q1 A0
#define Q2 A1
#define Q3 A2
#define Q4 A3
#define Q5 A4
#define Q6 A5

//Il parametro numerico è il valore della dimensione dell'array della variabile _digitalValues[]

//PROBLEMA
//Se s'imposta come valore di dimensione 6, e si utilizzano indici superiori
//a 6, funziona comunque O.O

Memoria_Dinamica Memoria_1(6);

void setup() {

  //Serial.begin(115200);

  //Mappatura I/O
  pinMode(I1, INPUT);
  pinMode(I2, INPUT);
  pinMode(I3, INPUT);
  pinMode(I4, INPUT);
  pinMode(I5, INPUT);
  pinMode(I6, INPUT);
  pinMode(I7, INPUT);
  pinMode(I8, INPUT);
  pinMode(Q1, OUTPUT);
  pinMode(Q2, OUTPUT);
  pinMode(Q3, OUTPUT);
  pinMode(Q4, OUTPUT);
  pinMode(Q5, OUTPUT);
  pinMode(Q6, OUTPUT);

}

void loop() {

  //Lettura degli ingressi e scrittura dei valori sulle variabili _digitalValues[]
  Memoria_1._digitalValues[0] = digitalRead(I1);
  Memoria_1._digitalValues[1] = digitalRead(I2);
  Memoria_1._digitalValues[2] = digitalRead(I3);

  //Lettura delle variabili _digitalValues[] e scrittura del valore sui pin d'uscita
  digitalWrite(Q1, Memoria_1._digitalValues[0]);
  digitalWrite(Q2, Memoria_1._digitalValues[1]);
  digitalWrite(Q3, Memoria_1._digitalValues[2]);

}



Come scritto anche nel progetto funziona praticamente tutto ma c'è un problema per quanto riguarda la dimensione effettiva dell'array della variabile pubblica interna alla libreria _digitalValues[].

Nell'esempio se imposto se le variabili ad indici elevati come 100, 101, 102 funziona comunque sempre con il parametro impostato a 6 ovvero un array di 6 variabili da 0 a 5

Code: [Select]

Memoria_Dinamica Memoria_1(6);


Code: [Select]


void loop() {

  //Lettura degli ingressi e scrittura dei valori sulle variabili _digitalValues[]
  Memoria_1._digitalValues[100] = digitalRead(I1);
  Memoria_1._digitalValues[101] = digitalRead(I2);
  Memoria_1._digitalValues[102] = digitalRead(I3);

  //Lettura delle variabili _digitalValues[] e scrittura del valore sui pin d'uscita
  digitalWrite(Q1, Memoria_1._digitalValues[100]);
  digitalWrite(Q2, Memoria_1._digitalValues[101]);
  digitalWrite(Q3, Memoria_1._digitalValues[102]);

}



C'è qualcosa di losco in tutto questo ? E stabile come funzione se usata in un progetto complesso o fa disastri ?

Perchè per funzionare funziona ma sono sicuro che qualcosa mi sfugge...

PS: ho allegato qua il progetto in .zip d'esempio intero fresco fresco :)

Standardoil

OK, OK
come esempio potrebbe anche andare, lasciamo stare che crei una classe per allocare un array di byte dei quali usi un solo bit, ma la memoria è tua, usala come preferisci
cosa non ti è chiaro?
io ho capito una cosa: che tu hai dimensionato un array di 6 elementi e ti stai stupendo che se tenti di usare ad esempio il 101 va lo stesso
è questo che ti domandi?
Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

MizzardNet

OK, OK
come esempio potrebbe anche andare, lasciamo stare che crei una classe per allocare un array di byte dei quali usi un solo bit, ma la memoria è tua, usala come preferisci
cosa non ti è chiaro?
io ho capito una cosa: che tu hai dimensionato un array di 6 elementi e ti stai stupendo che se tenti di usare ad esempio il 101 va lo stesso
è questo che ti domandi?
Sì perfettamente, mi sto stupendo del fatto che posso usare più byte di quanti "dichiarati".

L'esempio è solo di prova per testare velocemente la funzione dopo farò in modo che mi legge i singoli bit nei byte ovviamente.

Noto anche che nella compilazione la memoria dinamica non cambia dice che usa 21 byte l'1% della memoria dinamica ecc ecc e se cambia, cambia di poco...

Cioè alla fine è una cosa normale ?
Non capisco cosa serve il parametro per settare la dimensione se poi posso usare tutta la memoria che desidero.

So come mi è capitato mille volte di andare in overflow negli array ed il compilatore questo non lo rileva come errore con tremendi problemi sulla funzione del codice invece in tale esempio va tutto quando mi aspettavo il macello.

Silente

E perché dovrebbe essere un macello? Il problema dell'overflow dell'array si ha se lo spazio dove si sta andando a scrivere/leggere risulta già occupato da altre variabili. Nel tuo esempio, che io possa vedere, le uniche variabili presenti sono l'array di 6 bytes che hai creato. Di co seguenza al 100 esimo byte dal l'inizio dell'array non ci va nulla, e più essere usato come stai facendo. Il problema nascerebbe se avessi qualcosa che scrive/legge in quel punto, di diverso dall'array
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

Standardoil

Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

MizzardNet

E perché dovrebbe essere un macello? Il problema dell'overflow dell'array si ha se lo spazio dove si sta andando a scrivere/leggere risulta già occupato da altre variabili. Nel tuo esempio, che io possa vedere, le uniche variabili presenti sono l'array di 6 bytes che hai creato. Di co seguenza al 100 esimo byte dal l'inizio dell'array non ci va nulla, e più essere usato come stai facendo. Il problema nascerebbe se avessi qualcosa che scrive/legge in quel punto, di diverso dall'array
Cioè non so se ho capito: se utilizzo i byte al di fuori dal valore che ho dichiarato posso riscontrare problemi poichè possono essere usati per altre locazioni di memoria ?

Di diverso dall'array intendi singole variabili con un loro singolo nome per esempio ?

Allo OP serve assolutamente leggere il k&r
E bene
Scusa la mia IGNORANZA, cosa intendi per OP ? Leggere il K&r ? Cos'è ? XD

Secondo voi se uso le variabili entro la dimensione impostata posso stare tranquillo ?

Cioè problemi come l'overflow, come mi ha spiegato Silente, che succede solo se lo spazio in avanti partendo dall'indice zero dell'array è usato per altre variabili giusto ?

Silente

Il problema del superamento dei confini dell'array chiaramente non si pone se non superi tali confini (es: se dichiaro un array di cinque elementi posso usare tutti quelli compresi tra gli indici 0 e 4 inclusi). Come "di diverso dall'array" intendo qualsiasi cosa non sia quell'array, ovvero una qualsiasi variabile, array, oggetto o puntatore che scriva o legga in quella data area di memoria (che sia locale o globale)

OP (Original Poster) sei tu, MizzardNet
K&R é la sigla, dei nomi degli autori, che indica IL manuale di C (Cristianesimo:bibbia='C':K&R)
Dove va un numero va una variabile, una funzione e/o  un test.
Per ottenere devi spiegare

Strumenti/Formattazione automatica fino alla morte!
Cristianesimo:bibbia='C':K&R

MizzardNet

Il problema del superamento dei confini dell'array chiaramente non si pone se non superi tali confini (es: se dichiaro un array di cinque elementi posso usare tutti quelli compresi tra gli indici 0 e 4 inclusi). Come "di diverso dall'array" intendo qualsiasi cosa non sia quell'array, ovvero una qualsiasi variabile, array, oggetto o puntatore che scriva o legga in quella data area di memoria (che sia locale o globale)

OP (Original Poster) sei tu, MizzardNet
K&R é la sigla, dei nomi degli autori, che indica IL manuale di C (Cristianesimo:bibbia='C':K&R)
CAPITO TUTTO ! :D

Go Up