Jump to content
Jurkins

C++ kļūda

Recommended Posts

AndrisBB

Tādiem mērķiem instalēt Visual Studio ir pilnīgs overkill, plus uz Linux tāpat nedarbojas.

Es darbam un arī izklaidei izmantoju VS Code, priekš C++, Pythona, Javascripta, draiveriem, kerneļa un jebkā cita kas ienāk prātā. 

Ja gribas debugot mikrocontrolieri, tad pieslēgt openOCD nav problēmas. Un neparko nav jāmaksā.

https://www.justinmklam.com/posts/2017/10/vscode-debugger-setup/

https://micro-ros.github.io/docs/tutorials/advanced/debugging_vscode/

https://developer.toradex.com/software/freertos/developing-m4-applications-using-visual-studio-code

Edited by AndrisBB

Share this post


Link to post
Share on other sites
Jurkins

@AndrisBB, varētu Tev piekrist, bet tam VS  Code pieslēgt visu cilvēkam, kurš pusnopietni darbojas ar arduino... savukārt tas visual mikro ir kosmoss salīdzinot ar arduino defaulto vidi.

Krietni sen pamēģināju to VS Code un , godīgi sakot, apnika ņemties ar pluginiem, setingiem u.t.t.

Edited by Jurkins

Share this post


Link to post
Share on other sites
AndrisBB

Nu viss jau ir relatīvi.

Ja sanāk manuāli pašam mainīt openOCD configurāciju, dabūt GDB darbojas, tad pēc tā visa pāris klikški iekš VS Code, lai viņu pievienotu pie GDB ir sīkums.  

 

Jāuztaisa laikam būs kādu dienu video, kā setupot STM32 projektu izmantojot CubeMAx, tad importēt iekš VS Code un debuggot ar openOCD.

Edited by AndrisBB
  • Patīk 1

Share this post


Link to post
Share on other sites
Jurkins

Netaisīšu jaunu tēmu...

 uint8_t u8arr[] = { 1, 2, 3, 4 };
    uint8_t* u8ptr = u8arr;
    std::cout << static_cast<uint32_t>(*u8ptr++) 
        << static_cast<uint32_t>(*u8ptr++) 
        << static_cast<uint32_t>(*u8ptr++) 
        << static_cast<uint32_t>(*u8ptr++) << "\n\n";

    u8ptr = u8arr;
    std::cout << static_cast<uint32_t>(*u8ptr++);
    std::cout << static_cast<uint32_t>(*u8ptr++);
    std::cout << static_cast<uint32_t>(*u8ptr++);
    std::cout << static_cast<uint32_t>(*u8ptr++) << "\n\n";

rezultāts:

2020-02-20 22_46_12-Microsoft Visual Studio Debug Console.png

 

WTF?

Edited by Jurkins

Share this post


Link to post
Share on other sites
AndrisBB

Šinī gadijuma viss darbojas no otra gala 

std::cout << static_cast<uint32_t>(*u8ptr++)  // (1)
        << static_cast<uint32_t>(*u8ptr++)    // (2)
        << static_cast<uint32_t>(*u8ptr++)    // (3)
        << static_cast<uint32_t>(*u8ptr++)    // (4)
  		<< "\n\n";  		      // (5)

 

Seciba

       (4) << (5) = a                    jeb  1\n\n

tad (3) << a = b                       jeb   21\n\n

tad (2) << b = c                       jeb   321\n\n 

tad (1) << c = d                       jeb   4321\n\n

d = 4321

 

 

btw: vari aizstat \n\n ar std::endl 

Edited by AndrisBB

Share this post


Link to post
Share on other sites
AndrisBB

Vari pārbaudīt šādi:

	std::cout 	<< printf("cetutrais ")
        		<< printf("treshais ")
				<< printf("otrais ")
				<< printf("pirmais ") 
				<< std::endl;

andris@precision ~/Documents/Demo $ ./a.out 
pirmais otrais treshais cetutrais 10978

Edited by AndrisBB

Share this post


Link to post
Share on other sites
Jurkins

Jā, to es sapratu, ka (nezin kāpēc) darbojas no otra gala, jo sākumā (4) rindiņā nepieliku pointerim "++" (it kā loģiski), bet kaut kā nepadomāju, ka tā tas operators strādā un tā tam jābūt.

Paldies!

Un tad izrādījās, ka

 u8ptr = u8arr;
 printf("%d%d%d%d\n\n", *u8ptr++, *u8ptr++, *u8ptr++, *u8ptr++);

dara to pašu.

Share this post


Link to post
Share on other sites
Jurkins
pirms 7 stundām , AndrisBB teica:

kompilators var izvēlēties secību kādu vien vēlas

Velns?! Es reiz pudu sāls izēdu, nevarēju saprast, kāpēc pārītis SI4432 visu dara pareizi, bet konsolē uztvērējs raksta muļķības.

Share this post


Link to post
Share on other sites
AndrisBB

Nav jau arī skaidrs ko tu vēlies panākt ar tiem pointeriem. Vienkarši izprintejot masīva elementus, sanāks ka kompilators sakompilēs būtiski mazāk koda, plus vieglāk lasāms C kods.

printf("%d%d%d%d\n\n", u8arr[0], u8arr[1], u8arr[2], u8arr[3]);

vai pat

printf("%d%d%d%d\n\n", *(u8arr+0), *(u8arr+1), *(u8arr+2), *(u8arr+3));
 

 

Droši vien ka nav jau arī tā ka kompilātors izvēlētos random secību, kādā to visu izpildīt. Ganjau izvēlas tādu secību kura būs ātrāka vai rezultāts aizņems mazāk atmiņas utt.

 

Edited by AndrisBB

Share this post


Link to post
Share on other sites
Jurkins

Nu jā, nav jau tas vajadzīgs. Gribēju saprast, kāpēc tā. Tagad skaidrs. Paldies.?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...