Pagina 1 di 1

Funzione int con return multipli[C]

Inviato: sabato 12 aprile 2014, 9:17
da gila75
Ciao a tutti, nel corso di un programma, mi sono imbattuto in una cosa un po' particolare.
Ora, non ricordo bene, ma sarebbe stato comodo che la funzione int tal dei tali :D ritornasse più valori.
Logicamente direte voi, fai due funzioni, oppure dalla funziona a, passi alla funzione b ecc...
Ma supponiamo che per qualsiasi motivo possa essere scomodo, avevo pensato una cosa del genere
é solo una curiosità,non dico sia una pratica corretta

Codice: Seleziona tutto

#include <stdio.h>
#include <stdlib.h>
int *ret_multiplo(int *v,int *a,int *b)
{
    
    v[0]=(*a)+(*b);
    v[1]=(*a)-(*b);
    v[2]=(*a)*(*b);
    
    return v;
}


int main (void)
{
    int v[3];
    int a=15;
    int b=10;
    int *res;
    res=ret_multiplo(v,&a,&b);
    printf ("somma di a+b %d\n",            res[0]);
    printf ("sottrazione di a-b %d\n",      res[1]);
    printf ("Moltiplicazione di a*b %d\n",  res[2]);
    return 0;

}
Se io passo un array, e memorizzo le varie elaborazioni nell'array, e so a priori che array[0] conterrà il risultato x, array [1] y ecc...
Quindi ritorno l'indirizzo della partenza della 'array (quindi userò una funzione che ritorna un puntatore)

Codice: Seleziona tutto

int *ret_multiplo(int *v,int *a,int *b)
Non potrebbe essere comodo?
Ripeto, è solo una mia curiosità, non dico sia corretto

Re: Funzione int con return multipli[C]

Inviato: sabato 12 aprile 2014, 10:37
da matteovid
Ciao Gila

per me si, si può fare

una cosa che hai deciso è che usi i pointer per le variabili intere a e b nel tuo esempio... a che servono i pointer per quelle variabili?

io di solito uso una struttura se ho neccessità di ritornare tanti valori, poi che siano int, char, stringhe...
es.

Codice: Seleziona tutto

#include<stdio.h>

typedef struct{
  int a1, a2, a3, a4;
}Multi_Return_Int;

typedef struct{
  int a_Int;
  float a_Decimale;
  char Un_Carattere;
  char Stringa[100];
  double b_double;
}Composite;

Multi_Return_Int esempio (void)
{
  Multi_Return_Int C = {456, 345, 345, 2};
  return C;
}

Composite esempio_A()
{
  Composite M = {1, 2.3, 'a', "Ciao ... ", 45.678};
  return M;
}


int main()
{
  Multi_Return_Int C = esempio ();

  Composite M = esempio_A();

  printf("Valori ritornati Int { %d, %d, %d, %d}\n", C.a1, C.a2, C.a3, C.a4);
  printf("Valori ritornati da una struttura : { %d, %f, %c, %s, %f}\n", M.a_Int, M.a_Decimale, M.Un_Carattere, M.Stringa, M.b_double);

  return 0;
}
Matteo

Re: Funzione int con return multipli[C]

Inviato: sabato 12 aprile 2014, 11:47
da gila75
una cosa che hai deciso è che usi i pointer per le variabili intere a e b nel tuo esempio... a che servono i pointer per quelle variabili?
Infatti dovevo correggere, non serve, essendo la funzione di tipo int e non void.
è che è così comodo passare per puntatori...non ti devi preoccupare se la funzione è void o int...ha sempre e comunque le modifiche.
Ma è errato. Mi hai battuto sul tempo :)
Comunque dici che potrebbe essere un'idea?
Sul fatto della struttura, non ci avevo pensato.
Adesso non sono a casa, ma appena posso guardo bene il tuo esempio, grazie
Versione correta:

Codice: Seleziona tutto

    #include <stdio.h>
    #include <stdlib.h>
    int *ret_multiplo(int *v,int a,int b)
    {
       
        v[0]=(a)+(b);
        v[1]=(a)-(b);
        v[2]=(a)*(b);
       
        return v;
    }


    int main (void)
    {
        int v[3];
        int a=15;
        int b=10;
        int *res;
        res=ret_multiplo(v,a,b);
        printf ("somma di a+b %d\n",            res[0]);
        printf ("sottrazione di a-b %d\n",      res[1]);
        printf ("Moltiplicazione di a*b %d\n",  res[2]);
       
        return 0;

    }

Re: Funzione int con return multipli[C]

Inviato: sabato 12 aprile 2014, 19:11
da ienaplinsky
dato che passi il vettore v stai già modificando i suoi elementi, quindi se passi tra i parametri v è ridondante ritornare il suo indirizzo

Codice: Seleziona tutto

#include <stdio.h>
    #include <stdlib.h>
    void ret_multiplo(int *v,int a,int b)
    {
       
        v[0]=(a)+(b);
        v[1]=(a)-(b);
        v[2]=(a)*(b);
    }


    int main (void)
    {
        int v[3];
        int a=15;
        int b=10;
        ret_multiplo(v,a,b);
        printf ("somma di a+b %d\n",            v[0]);
        printf ("sottrazione di a-b %d\n",      v[1]);
        printf ("Moltiplicazione di a*b %d\n",  v[2]);
       
        return 0;

    }
potresti anche modificarla cosi

Codice: Seleziona tutto

int *ret_multiplo(int a,int b)
    {
        int *ret = malloc(sizeof(int) * 3);
        ret[0]=(a)+(b);
        ret[1]=(a)-(b);
        ret[2]=(a)*(b);
        
       return ret;
    }
e nel main non hai più bisogno di v

Re: Funzione int con return multipli[C]

Inviato: sabato 12 aprile 2014, 19:24
da matteovid
Ciao Gila

penso che possa essere un idea si :)

come anche i pointer, non è del tutto sbagliato, anzi, dipende cosa poi ci fai da quella funzione che ritorni tanti valori... io penso che se non si deve modificare un valore la si passa normalmente, poi come hai fatto tu si salva in un array progressivo.


io uso le struct perchè se ho tanti dati sono comode, e appena ritorno salvo le trutture su un file temporaneo, sai non sempre si ha tanta memoria a disposizione, fai conto che hai una cpu 8 bit e con la bellezza di 64k, devi centillinare ogni bit, mentre al contrario hai a disposizione chiavette da 16Gb o più o hard disk usb da 500Gb e allora si "allarga la memoria" con le periferiche USB che sono economiche e sicure.... intendo si salva in file temporanei la memoria a un certo punto, si continua l'eleborazione e poi se si ha bisogno dei dati salvati si rilegge il file temporane salvato col nome appropriato progressivo

Matteo

Re: Funzione int con return multipli[C]

Inviato: sabato 12 aprile 2014, 20:47
da gila75
dato che passi il vettore v stai già modificando i suoi elementi, quindi se passi tra i parametri v è ridondante ritornare il suo indirizzo
é vero...quando si passa un array, si sta già passando il puntatore al suo primo elemento enon si passa una copia, quindi anche una funzione
void ha effetto sui cambiamenti.
fai conto che hai una cpu 8 bit e con la bellezza di 64k, devi centillinare ogni bit,
Stai parlando di microcontrollori giusto?
Bhè, li tutto è diverso, devi ottimizzare al massimo ecc...
Io "smanettavo" coi pic serie 16f... e devi essere parsimonioso la massimo.
Se non ricordo male la profondità di stack, è appena di 8....non so un processore da pc, ma il paragone sarebbe improprio.
Oppure 8 bit 64k, potrebbe essere tipo uno Z80, giusto?
Con la sbalorditiva velocità di clock...udite udite ... 4Mhz :D
Ma non sono sicuro che stai parlado di uc, visto che dici che salvi su file temporaneo...presumo un txt, roba del genere, no?

Re: Funzione int con return multipli[C]

Inviato: domenica 13 aprile 2014, 12:59
da M_A_W_ 1968
Ti sarà senz'altro utile leggere con attenzione questo thread. Il caso base è sempre il medesimo: dispatching di puntatori a funzione, che peraltro nella didattica e nella pratica di sviluppo dei SO embedded (ma non solo) riveste un ruolo assolutamente regale. Come gradito cadeau, le strategie ivi elencate si applicano splendidamente anche alla modifica/restituzione di valori con molteplicità superiore all'unità.
gila75 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4562174#p4562174][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Se non ricordo male la profondità di stack, è appena di 8....non so un processore da pc, ma il paragone sarebbe improprio.
Oppure 8 bit 64k, potrebbe essere tipo uno Z80, giusto?
Con la sbalorditiva velocità di clock...udite udite ... 4Mhz :D
Lo stack dei PIC midrange è un call stack puro, del tutto inaccessibile (con buona pace del signor Aleph One :lol:) e non ha molto più della mera onomastica in comune con lo stack segment gestito (via ISA e registri dedicati) dai processori x86 e consimili.
Avrei molto altro da dire in proposito, ma ahimé il tempo e lo spazio sono tiranni. C'è da riempire più volumi con le verità controintuitive sul mondo embedded, che regolarmente sbalordiscono chi frequenta solo il piccolo mondo dei PC ma anche molti "operatori del settore" - i quali in realtà restano ai margini dell'embedded propriamente detto (sì, esiste una definizione accettata dalla larga maggioranza degli addetti ai lavori, anche se strapazzata dai media "specialistici").

Re: Funzione int con return multipli[C]

Inviato: domenica 13 aprile 2014, 14:35
da gila75
Geazie M_A_W, leggerò bene il 3d, che per altro sembra posto da vbextreme, non so se è lo stesso utente che c'è qui, magari è solo una
combinazione.
Per i sistemi embadded...certo che ci sarebbe da riempre volumi.
Io combinavo qualcosa, ma ho lasciato in favore del C,ma mi affascina molto quel mondo.
Mi mancano prarecchio...forse danno più soddisfazioni che la programmazione pura...
Hai a che fare con programmazione, elettronica, leggi della fisica ecc...

Re: Funzione int con return multipli[C]

Inviato: lunedì 14 aprile 2014, 13:31
da vbextreme
Si sono io.
è leggendaria la mia bravura nell'estrapolare grosse nozioni dall'enciclopedico M.A.W.
Riguardante sempre quel thread,ora mi sono riuscito a creare un vettore di puntatori a funzioni generico, ovvero può contenere qualsiasi tipo di funzione.Scritto quasi tutto in assembly e facendo largo uso di stdarg.h.Usato solo per non impazzire nel riscrivere un software, nel restante dei casi la soluzione canonica di MAW è sicuramente la migliore.

Re: Funzione int con return multipli[C]

Inviato: martedì 15 aprile 2014, 6:49
da gila75
Non ho avuto molto tempo per leggere accuratamente quel thread, essendo anche un po' complesso quello che dite...
Ma credo che sia una cosa un po' avanzata per me.
Per il momento mi sto soffermando a cose un po' più terra terra, ma fondamentali per Il C.