Jump to content

C++ kļūda


Jurkins
 Share

Recommended Posts

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?

Labots - Jurkins
Link to comment
Share on other sites

Š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 

Labots - AndrisBB
Link to comment
Share on other sites

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

Labots - AndrisBB
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

 

Labots - AndrisBB
Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...