Vytažení dat z funkce?

C,C++,C#

Moderátori: psichac, Moderátori

blazenabc
Stály člen
Stály člen
Príspevky: 102
Dátum registrácie: 16 Nov 2014, 10:41

Vytažení dat z funkce?

Príspevok od používateľa blazenabc » 22 Mar 2015, 22:35

Hoj HOj Hoj,

Tak pořád bojuju.

Nyní řeším, jak vytáhnout data, která jsou uložené ve funkci:
Mám funkci plynomer:

Kód: Vybrať všetko

uint8_t PLYNOMETR_read( uint8_t id[], int16_t *hodnota )
{
        uint8_t sp[PLYNOMETR_SP_SIZE];
        uint8_t ret;
       
        ow_reset();
        ret = read_scratchpad( id, sp, PLYNOMETR_SP_SIZE );
        return ret;
}
A ta je navazana na funkcu read_scratchpad

Kód: Vybrať všetko

/*cte sratchpad*/
static uint8_t read_scratchpad( uint8_t id[], uint8_t sp[], uint8_t n )
{
        uint8_t i;
        uint8_t ret;

        ow_command( PLYNOMETR_READ, id );
        for ( i = 0; i < n; i++ ) {
                sp[i] = ow_byte_rd();
        }
        if ( crc8( &sp[0], PLYNOMETR_SP_SIZE ) ) {
                ret = PLYNOMETR_ERROR_CRC;
        } else {
                ret = PLYNOMETR_OK;
        }

        return ret;
}
A já bych chtěl v mainu vytáhnout data, které jsou obsažené právě v tom sp.

Takže třeba by mě zajímal obsah sp[1]. Napoví někdo?
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Vytažení dat z funkce?

Príspevok od používateľa peterple » 22 Mar 2015, 22:38

to nepôjde nijako. Po opustení funkcie PLYNOMETR_read pole sp zanikne. Bud ho daj do main alebo radšej ako globálne.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

blazenabc
Stály člen
Stály člen
Príspevky: 102
Dátum registrácie: 16 Nov 2014, 10:41

Re: Vytažení dat z funkce?

Príspevok od používateľa blazenabc » 22 Mar 2015, 22:41

Takže takto??

Kód: Vybrať všetko

static uint8_t read_scratchpad( uint8_t id[], uint8_t sp[], uint8_t n )
{
        uint8_t i;
        uint8_t ret;

        ow_command( PLYNOMETR_READ, id );
        for ( i = 0; i < n; i++ ) {
                sp[i] = ow_byte_rd();
        }
        if ( crc8( &sp[0], PLYNOMETR_SP_SIZE ) ) {
                ret = PLYNOMETR_ERROR_CRC;
        } else {
                ret = PLYNOMETR_OK;
        }

        return ret;
}

uint8_t sp[PLYNOMETR_SP_SIZE];
uint8_t PLYNOMETR_read( uint8_t id[], int16_t *hodnota )
{   
        uint8_t ret;
       
        ow_reset();
        ret = read_scratchpad( id, sp, PLYNOMETR_SP_SIZE );
        return ret;
}
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Vytažení dat z funkce?

Príspevok od používateľa peterple » 22 Mar 2015, 22:43

hej
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

blazenabc
Stály člen
Stály člen
Príspevky: 102
Dátum registrácie: 16 Nov 2014, 10:41

Re: Vytažení dat z funkce?

Príspevok od používateľa blazenabc » 22 Mar 2015, 22:46

Ok. Chtělo to extern

Takže deklarace v plyny.c

Kód: Vybrať všetko

uint8_t sp[9]
Takže deklarace v plyny.

Kód: Vybrať všetko

extern uint8_ sp[9]
0

Používateľov profilový obrázok
kubo150
Ultimate člen
Ultimate člen
Príspevky: 3253
Dátum registrácie: 20 Júl 2007, 00:00
Bydlisko: Pri Bytči
Vek: 32
Kontaktovať používateľa:

Re: Vytažení dat z funkce?

Príspevok od používateľa kubo150 » 22 Mar 2015, 23:26

Alebo do returnu daj pointer na prvý prvok pola a potom by si relativne mal mať prístup k zbytku pola práve cez pointre(ukazovatele)

Pre istotu si na začiatku hneď po výstupe z funkcie hodnoty z pameti ulož do potrebného pola, lebo nevieš ako MCU naráby s pameťou a môže ich potom prepísať.... Hneď po výstupe z funkcie by ešte prepísané byť nemali, ale neviem nech povedia skúsenejší, chcelo by to nazrieť do asembleru po skompilovaní, neviem akú optimalizáciu používaš, no malo by to cez tie pointre fungovať spolahlivo.
0
Som ten ktorý to vykoná.
Moje slovo:
Neverím na náhody,
Náhoda je len jedným, alebo skupinou ľudí nepochopená realita

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Vytažení dat z funkce?

Príspevok od používateľa peterple » 22 Mar 2015, 23:35

Kubo radíš riadnu hlúposť. Lokálne premenné idú do zásobníka. Takže keď opustíš funkciu tak je tá časť zásobníka okamžite k dispozícii. To že tie data tam môžu chvíľu vydržať je veľmi neistá vec. Stačí totiž aby ti v tej dobe prišlo prerušenie a to si do zásobníka odloží minimálne návratovú adresu plus pár registrov. Takže sa takýmto štýlom dopracuješ k záhadným chybám ktoré sa budú náhodne objavovať (funguje tu generálsky efekt).

Hej chce to aspoň rozumieť ako pracuje procesor. Ale pohľad na assemblerovský kód ti neukáže žiadny problém. Je to dobre skrytá pasca pre tých čo nevedia čo je to zásobník, na čo slúži, a ako a kedy sa používa.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: Vytažení dat z funkce?

Príspevok od používateľa xmilos » 23 Mar 2015, 06:11

cistejsie je zadefinovat si strukturu a funkcii

Kód: Vybrať všetko

static uint8_t read_scratchpad( uint8_t id[], uint8_t sp[], uint8_t n )
odovzdat iba pointer na nu

Kód: Vybrať všetko

static uint8_t read_scratchpad( &moja_struktura );
vysledny kod bude kratsi.
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok