Warning: Illegal string offset 'name' in [path]/includes/functions.php on line 6439
C++
+
1 2 3

thread: C++

  1. #1
    Senior Member
    Nov 2009
    Jēkabpils
    2,046

    C++

    Sveiciens tiem nedaudzajiem, kas vēl šeit ganās!

    Sekojošs kods:
    :
    #include <avr/io.h>
    
    class ds
    {
      public:
        uint8_t* ds_addr()
        {
          return addr;
        }
      protected:
        uint8_t addr[8];
    };
    
    int main(void)
    {
      ds *sensor1;
      sensor1 = new ds;
    
      while(1)
      {
        
      }
      delete sensor1;
    }
    Arduino 1.6.12 vidē kompilējas. Atmel Studio bļauj, ka:

    Error undefined reference to `operator new(unsigned int)'

    Ja klases objektu taisa ne dinamiski, tad nebļauj. Vai kāda bibliotēka jāpievieno vai kas cits?

  2. #2
    Senior Member
    Apr 2007
    2,087

    Oi, šitais ir dziļi jārok. Pamēģini vienkārši rakstīt "new ds()". Iemesli ir te: http://stackoverflow.com/questions/6...rence-with-new

  3. #3
    Senior Member
    Nov 2009
    Jēkabpils
    2,046

    Jā, vakar vakarā jau izmēģināju visu ko...i ar iekavām , i bez, i konstruktorus, destruktorus rakstīt un nerakstīt. Gūgles tanti arī ņēmu priekšā ilgi un fundamentāli, bet skaidrībā netiku. Tiku līdz tam, ka funkciju new un delete nav bibliotēkā, jo avr c++ neesot paredzēti exception (par kuriem man nojausma gaužām miglaina pagaidām). Gan jau, ka es lienu par dziļu un par ātru, un mierīgi var iztikt bez tās dinamiskās objektu veidošanas. Bet jocīgi, ka arduino nebļauj.

  4. #4
    Senior Member
    Apr 2007
    2,087

    Ah, tikai tagad pieleca, tu taču grasies izmantot heap objektus. Stipri neiesaku. Heap un embedded sistēmas - ļoooooti uzmanīgi. Vai nu tad raksta paši savu, ļoti striktu atmiņas menedžera implementāciju, vai neizmanto nemaz. Vai tad tev tiešām viss tur tik dinamiski, ka nekādi neiztikt? Neparedzams skaits objektu?

  5. #5
    Senior Member
    Nov 2009
    Jēkabpils
    2,046

    Man gandrīz pirmie soļi c++, bet jau navarotus man vajag . Zinu, ka 1wire bibleņu pilna pakaļa, bet gribējās pamēģināt kā ir, ja nerezervē atmiņu kaut kādam maksimālajam sensoru skaitam, bet cik atrod, tik objektus izveido.

    Brīžiem jau pašam liekas, ka sāku kā "raimonds" uzvesties tikai tālāk no teorijas un tuvāk praksei.

    edit: laikam ar malloc varētu mēģināt kaut ko darīt.

  6. #6
    Senior Member
    Apr 2007
    2,087

    Var ar malloc, bet tāpat tos 1024 baitus tik ātri aizd*sīsi, ka maz neliksies. Vēl var vienkārši pats nodefinēt new() un delete(), bet nu... ne jau bez iemesla viņi ir izņemti no avr-g++.

    :
    // replacement of a minimal set of functions: 
    void* operator new(std::size_t sz) 
    {
         return std::malloc(sz);
     } 
    void operator delete(void* ptr) noexcept {
         std::free(ptr);
     }

  7. #7
    Senior Member
    Nov 2009
    Jēkabpils
    2,046

    Tā jau laikam ir. Ar to c++ iesāku dēļ tā, ka iepirkās e-līcī 32 bitu STM pa tādām pašām naudām kā arduino nano.
    Paldies par to kodu. Vakarā pie alus c++ būs pašā laikā .

  8. #8
    Senior Member
    Apr 2007
    2,087

    Nevajag nemaz e-līci - tepat farnelī godīgi var labu STM Nucleo platīti dabūt par 10-15 naudiņām, kurai jau ir >40 MHz, padaudz RAM utml. Silti iesaku pamēģināt, pēc tam negribēsies vairs ķēpāties ar sīkumiem Programmējas eleganti vienkārši, kods ir lasāms, debugojams pa soļiem ar JTAG, platītes ir mehāniski savietojamas ar Arduino, n-tie seriāļi un citi periferāļi, utml gardumi.

  9. #9
    Senior Member
    Nov 2009
    Jēkabpils
    2,046

    Ja tomēr runājam par dinamisku objektu veidošanu. Kas slikts varētu notikt ar atmiņu, ja šie objekti pastāv visu laiku:
    :
    class OW
    {
        ...
    };
    
    int main(void)
    {
        OW *owOne;
        owOne = (OW*)malloc(sizeof(OW));
        owOne->OW_init(&PORTB, PB4);
        sensor_count = owOne->OW_search_rom();
        for(uint8_t i = 0; i < sensor_count; i++)
        {
            owOne->OW_match_rom(sensor_id);
            ...
        }
        ...
        free((void*)owOne);
    }
    Cits jautājums, vai to vajag, iztiekam ar statiski izveidotiem objektiem. Bet nu šoreiz par pašu principu gribētos saprast, kas slikts varētu notikt. Mans piemērs gan nav īpaši veiksmīgs. Man te tikai viena klase un viens šīs klases objekts.
    Doma varētu būt tāda, ka ir OneWire klase un pēc tam objektu klases - temperatūras sensori, i-buttoni, elektroniskie potenciometri u.t.t. Tas OW_search_rom ir OneWire klases funkcija, kuru palaižot tad tiek izveidoti šie objekti tik, cik ir uz līnijas un kādi. Pēc tam šie objekti pastāv visu laiku līdz nākošajam resetam.

  10. #10
    Senior Member
    Apr 2007
    2,087

    Ok, ja alokācijas notiek tādā globālā līmenī un nevis kaut kādās eventu cilpās (un diespas hw pārtraukumos), tad tas ir nesāpīgs variants, protams. Jo galu galā neviens taču neliedz tev uzrakstīt jurkins_alloc un jurkins_free funkcijas, kas pašas izdomās, kur paņemt atmiņu un atgriezīs norādi uz to. Tas kopumā arī ir visieteicamākais variants - programmā statiski rezervēt baitu masīvu (memory pool), pa kuru tad tavi alloc/free dzīvosies un paši veiks grāmatvedību, kurš gabaliņš ir brīvs un kurš nav. It sevišķi, ja ir tik mierīgs atmiņas režīms, kā apraksti, nu neko jau tur nevajag, var iztikt ar vienu pointeri grāmatvedībai - tādu, kurš sākumā norāda uz pool sākumu, bet pēc katras alokācijas pavirzās uz priekšu. Free() savukārt neko nedara, un tā atmiņa vairs nekad nevarēs tikt otrreiz izmantota. Jā, muļķīgi, bet toties tupa vienkārši un prognozējama uzvedība. Viss jāskatās pēc vajadzībām. Labu memory manageri rakstīt ir liels darbs.

    Nedaudz advancētāks ir atmiņas pārvaldnieks, kurš uztur saistīto sarakstu ar atmiņas blokiem. Pašu sarakstu arī var glabāt tā paša memory pool ietvaros. Tad reiz atbrīvotiem gabaliem ir cerība tikt atkalizmantotiem, bet jāsāk domāt par fragmentācijas menedžēšanu. Gan jau pilns internets ar dažādiem risinājumiem, cilvēki par to ir domājuši kopš Tūringa laikiem

    Standarta malloc() Arduino ir pasmags, bet lietojams, un tavā piemērā tiešām neko sliktu nedarīs.

+