Pochopeni C# pro preklad do VB – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pochopeni C# pro preklad do VB – .NET – Fórum – Programujte.comPochopeni C# pro preklad do VB – .NET – Fórum – Programujte.com

 

Adrian
~ Anonymní uživatel
12 příspěvků
14. 5. 2016   #1
-
0
-

Ahoj,


jsem vb.net vyvojar, vetsinou s pochoponim jednodusich veci v C# problem nemam, ale ted jsem na nej narazil,

chtem bych proto Vas, co v C# delate pozadat o vysvetleni kodu:

public float GetTemperature()
{
    // Start conevrt command (0x51)
    i2cBus.Write(_slaveConfig, new byte[1] { START_CONVERT }, I2C_TIMEOUT);
    
    // Wait to conversion end
    Thread.Sleep(750);
    
    // Read temperature command (0xAA)
    i2cBus.Write(_slaveConfig, new byte[1] { READ_TEMPERATURE }, I2C_TIMEOUT);

    // Read MSB and LSB of the temperature
    byte[] readBuffer = new byte[2];
    i2cBus.Write(_slaveConfig, readBuffer, I2C_TIMEOUT);

    // Get MSB and LSB together
    int temp = readBuffer[0];
    temp <<= 8;
    temp |= readBuffer[1];

    // Negative value test (subzero temperature)
    temp -= (readBuffer[0] >= 0x80) ? 65536 : 0;

    // Get the temperature in Celsius
    return (float)((temp >> 4) * 0.0625);
}

jde mi o radky:

temp <<= 8;   // predpokladam, ze se jedna o temp je vetsi, nebo rovne 8, ma tento radek ale vliv na dalsi? pokud ne, tak radek nema funkcni vyznam, ne?

temp |= readBuffer[1]; // jaka je funkce znamenka |= ?

temp -= (readBuffer[0] >= 0x80) ? 65536 : 0; // tu jsem bezradny

return (float)((temp >> 4) * 0.0625); // zde kdyz to dobre chapu, zustane v nejvnorenejsi zavorce boolean?

pri strojovem prekladu me vyslo tohle


Public Function GetTemperature() As Single
	' Start conevrt command (0x51)
	i2cBus.Write(_slaveConfig, New Byte(0) {START_CONVERT}, I2C_TIMEOUT)

	' Wait to conversion end
	Thread.Sleep(750)

	' Read temperature command (0xAA)
	i2cBus.Write(_slaveConfig, New Byte(0) {READ_TEMPERATURE}, I2C_TIMEOUT)

	' Read MSB and LSB of the temperature
	Dim readBuffer As Byte() = New Byte(1) {}
	i2cBus.Write(_slaveConfig, readBuffer, I2C_TIMEOUT)

	' Get MSB and LSB together
	Dim temp As Integer = readBuffer(0)
	temp <<= 8                    ' zde je chyba, melo by byt <=
	temp = temp Or readBuffer(1)  ' smysl tohoto nechapu

	' Negative value test (subzero temperature)
	temp -= If((readBuffer(0) >= &H80), 65536, 0)  'tohle taky nechapu

	' Get the temperature in Celsius
	Return CSng((temp >> 4) * 0.0625) 'a zde je podle toho c# spravne, ze z nejvnorenejsi zavorky vyjde boolean, vynasobi se 0.0625 a prevede na single?
End Function

Dekuji za vysvetleni a objasneni

Adrian

Nahlásit jako SPAM
IP: 82.144.139.–
BDS+3
Věrný člen
14. 5. 2016   #2
-
0
-

#1 Adrian

temp <<= 8; je zkrácený zápis:

temp = (temp << 8); jde o bitový posuv o 8

temp |= readBuffer[1] je zkrácený zápis:

temp = (temp | readBuffer[1]) jde o bitový součet

viz. Bitové operace

temp -= (readBuffer[0] >= 0x80) ? 65536 : 0;
od hodnoty temp bude odečteno 65536 pokud readBuffer[0] je větší nebo roven 0x80, jinak 0
viz: Ternární operátor (pozor nezaměnit s nullable nebo ?? )

return (float)((temp >> 4) * 0.0625);

vrací výsledek posunu (temp >> 4) a vynásobený 0.0625, přetypovaný na float

Nahlásit jako SPAM
IP: 185.69.69.–
W10 :)
NeregistrovanyHookyns
~ Anonymní uživatel
62 příspěvků
14. 5. 2016   #3
-
0
-

To jsou bitwise operátory. << a >> jsou posuny binárních hodnot. Př. 255 (binárně 11111111) posunuté o jedno místo doprava tj 255 >> 1 je binárně 01111111, což je 127.

V tvém případě  

temp <<= 8;

 je ekvivalent

temp = temp << 8;

temp je Int32 a readBuffer je byte[], První si do temp uložíš byte z readBuffer na pozici 0 a posuneš jej o 8 míst, tzn. posuneš ho na místo druhého bajtu v Int32. | je binární operátor pro OR.

Takže máš např. readBuffer[] { 127, 64 }. Prvním řádkem uložíš do temp hodnotu 127 (binárně 01111111) a posuneš ji o 8 míst, takže dostaneš 32512 (binárně 111111100000000). Binární operací OR

temp = temp | readBuffer[1];

Dostaneš logický součet čísel 111111100000000 a 1000000, což je 111111101000000, což je 32576.

temp -= (readBuffer[0] >= 0x80) ? 65536 : 0;

(Boolean) ? x : y je ternární operátor. Pokud je hodnota v podmínce na začátku true, vrátí první hodnotu (x), pokud false, tak hodnotu druhou (y). Ten řádek tedy odečítá od temp buď 65536 nebo 0 podle výsledku podmínky, jestli je nultý byte v readBuffer větší než 0x80 (hexadecimální číslo).

return (float)((temp >> 4) * 0.0625);

Tento řádek první posune temp o 4 bity doprava, tzn. odstraní 4 pozice a z dvoubytové hodnoty (16 bitů) udělá hodnotu 12 bitovou. Tu vynásobí nějakým koeficientem. Výsledek převádí na float.

Nahlásit jako SPAM
IP: 77.95.192.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 7 hostů

Podobná vlákna

PHP a pochopení OOP — založil šnek

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý