Pages: [1]   Go Down
Author Topic: Funzioni che returnano array  (Read 817 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho un paio di dubbi in proposito, visto che l' ide di arduino lavora in c++ e in c++ gli array nn sono altro che puntatori al primo elemento è corretto scrivere in questo modo:

funzione che processa un array di bytes e restituisce  un altro array

Code:
byte* myfunz (byte array []){
  
  byte buffer[sizeof(array)];
    
      ..... un bel po di roba

    return buffer;
}

oppure

Code:
byte myfunz (byte array []){
  
  byte buffer[sizeof(array)];
    
      ..... un bel po di roba

    return *buffer;
}

o ancora

Code:
byte myfunz (byte array []){
  
  byte buffer[sizeof(array)];
    
      ..... un bel po di roba

    return buffer;
}

Secondo me la prima ma mi da errore oppure l'ultima ma da sempre errore di conversione; dopo di che

Code:
void Send (byte query[]){
  byte aa = myfunz(query);
  Serial3.write(aa,sizeof(aa));  
}

pero pure li da errore "invalid conversion from 'byte*' to 'byte'   e  'invalid conversion from 'byte' to 'const uint8_t*' "

mentre se faccio

Code:
void Send (byte quer[]){
  byte aa = myfunz(quer);
  int num = sizeof(aa);
  Serial3.write(&aa,num);  
}

che nn ha senso perchè mi invierebbe l'indirizzo di aa e nn il valore...........

Visto che l'array e creato all interno della funzione quando essa finisce anche l'array viene distrutto quindi ci si ritrova con nulla puntato!! smiley-sad
Non penso tocchi ogni volta lavorare su un buffer esterno oppure si??

Girovagando ho trovato  un po di roba ma nn è applicabile qui.

Quella volta i tizzi che hanno pensato ste robe che hanno bevuto??



« Last Edit: August 09, 2011, 08:00:17 pm by MarioMas » Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 136
Posts: 9708
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Visto che l'array e creato all interno della funzione quando essa finisce anche l'array viene distrutto quindi ci si ritrova con nulla puntato!! smiley-sad
Non penso tocchi ogni volta lavorare su un buffer esterno oppure si??

Se devi passare un array tra funzioni, o semplicemente ritornare la relativa elaborazione, questo deve essere dichiarato esternamente alla funzione per poi passargli il relativo puntatore, non serve ritornare il puntatore perché la funzione chiamante ne è già in possesso.
La soluzione migliore, in termini di efficienza del programma, è dichiarare come global gli array che devono essere utilizzati da più funzioni.

Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sì, le variabili globali tolgono tanti grattacapi  smiley-cool

PS: "ritornare" è una traduzione di RETURN che suona malissimo smiley-sweat
Sarebbe da dire "restituire"  smiley-razz
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 136
Posts: 9708
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

PS: "ritornare" è una traduzione di RETURN che suona malissimo smiley-sweat
Sarebbe da dire "restituire"  smiley-razz

E' vero che suona male, però nel gergo informatico è prassi usare "ritorna" o "ritornare" invece di "restituire".
Logged

Roma / Benevento
Offline Offline
Full Member
***
Karma: 0
Posts: 183
Guardava al futuro con l'inguaribile ottimismo di un dodo...
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

È uno degli argomenti più ostici della programmazione in C... vediamo un po'
Code:
byte* myfunz (byte array []){
 
  byte buffer[sizeof(array)];
   
      ..... un bel po di roba

    return buffer;
}
Sbagliato, sizeof non restituisce la grandezza dell'array in ingresso, restituisce la grandezza dell puntatore all'array.
"sizeof" è un operatore che viene sostituito in tempo di compilazione, non è una funzione come "count()" del php o il ".length" del javascript.
In C gli array(escludendo le stringhe) non hanno nessun delimitatore,  quindi stabilirne la dimensione è compito del programmatore.
Se dichiari buffer in quel modo non puoi restituirlo... in C tutte le variabili dichiarate in un blocco "{}", vengono distrutte alla fine del blocco.
Il modo corretto per restituire un array è un po' più complicato, ti faccio un esempio:
Code:
byte* myfunz (byte *array, int size) {
byte *buffer = malloc(siezeof(byte) * size);

memcpy(buffer, array, size);

/* ...operazioni sull'array buffer... */

return buffer;
}
Così facendo allochi l'array nella memoria heap e restituisci un puntatore che dice solo DOVE si trovano i dati, e i dati rimarranno lì finché non li punterai con un puntatore e farai:
Code:
free(punt);

Non hanno bevuto niente di preoccupante, anzi è un meccanismo geniale che tiene in piedi tutta l'informatica moderna... studia e lo capirai...
Ciao

Logged

Linux User #503422 | Linux Machine #414597-8 | Ubuntu User #30132

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10498
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

approvo in pieno la spiegazione di MGuruDC, ed aggiungo: http://programmazione.html.it/guide/lezione/1105/i-puntatori/
leggiti i 3 capitoli successivi sui puntatori e i 2 successivi sull'allocazione dinamica della memoria (la malloc & co.), benvenuto nel "bello" della programmazione smiley
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie dell'ottima spiegazione ragazzi, in 4 ore non avevo trovato nulla di cosi chiaro.

Un altra cosa:

Io uso molti array dinamici nel mio piccolo progettino, c'è una maniera per stabilirne le dimensioni senza troppe macchinazioni?

Ho pensato di inserire un carattere di fine come x i char e andarlo poi a cercare ma mi sembra faccia parte delle machinazioni smiley
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non puoi tenere una semplice variabile contatore che incrementi ogni volta che aggiungi un elemento?
Logged


0
Online Online
Shannon Member
****
Karma: 132
Posts: 10498
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

oppure se proprio vuoi fare il figo, una struttura che contiene puntatore all'array e dimensione. quando cambi la dimensione riallochi anche l'array(il puntatore).
(e già ci avviciniamo alla programmazione ad oggetti)
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Già sto litigando con il c++ va be proverò e poi posto se funzia smiley

Non posso usare una variabile esterna perchè in pratica queste funzioni che uso sono sparse in giro a livelli differenti e richiamate su array differenti quindi diventerebbe un casino,
Vada per la struct cosi almeno lo faccio JavaLike, nn si sa mai che ne emerga una nuova libreria x arduino
Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10498
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

se usi il c++ puoi fare una classe che oltre a memorizzare l'array gestisca anche la sua allocazione etc...
cosa che con una struct non verrebbe "pulita" allo stesso modo.

la struct usala se vuoi rimanere nell'ambito C
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho trovato questa classe che sembra funzionare benino

http://www.anyexample.com/programming/cplusplus/cplusplus_dynamic_array_template_class.xml

Per farla andare però bisogna rimuovere
Code:
if (array == NULL)
throw MEMFAIL;

in 4 posizioni perché il compilatore non accetta le eccezioni, per provare non succede nulla smiley

finalmente posso fare

Code:
Serial.write((byte*)array.getptr(),array.GetSize());
« Last Edit: August 11, 2011, 07:51:04 pm by MarioMas » Logged

Pages: [1]   Go Up
Jump to: