Funzione int con return multipli[C]

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Funzione int con return multipli[C]

Messaggio 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
Avatar utente
matteovid
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 368
Iscrizione: mercoledì 9 dicembre 2009, 9:09
Desktop: Openbox, XFCE, XMonad
Distribuzione: GNU/Linux Arch - openSUSE Leap
Sesso: Maschile
Località: Parma

Re: Funzione int con return multipli[C]

Messaggio 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
miglia da percorrere, prima di dormire
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: Funzione int con return multipli[C]

Messaggio 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;

    }
Avatar utente
ienaplinsky
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 954
Iscrizione: giovedì 21 gennaio 2010, 9:56
Località: Napoli

Re: Funzione int con return multipli[C]

Messaggio 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
Avatar utente
matteovid
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 368
Iscrizione: mercoledì 9 dicembre 2009, 9:09
Desktop: Openbox, XFCE, XMonad
Distribuzione: GNU/Linux Arch - openSUSE Leap
Sesso: Maschile
Località: Parma

Re: Funzione int con return multipli[C]

Messaggio 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
miglia da percorrere, prima di dormire
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: Funzione int con return multipli[C]

Messaggio 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?
Avatar utente
M_A_W_ 1968
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 856
Iscrizione: venerdì 15 febbraio 2013, 3:57
Desktop: KDE
Distribuzione: SuSE
Sesso: Maschile
Località: Un luogo geometrico
Contatti:

Re: Funzione int con return multipli[C]

Messaggio 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").
Sì, un blog ce l'ho perfino io: gli è che mi manca il tempo...

"...in una società che sembra sempre più spaventata dai problemi troppo articolati e che rigetta come un corpo estraneo ogni elemento di complessità, sapremo ancora come utilizzare il parere degli esperti?"
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: Funzione int con return multipli[C]

Messaggio 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...
Avatar utente
vbextreme
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1214
Iscrizione: domenica 12 gennaio 2014, 14:06
Desktop: lxde
Distribuzione: xubuntu 14.10

Re: Funzione int con return multipli[C]

Messaggio 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.
Easy framework per il linguaggio C.
vbextreme hack your life
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: Funzione int con return multipli[C]

Messaggio 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.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti