Seite 1 von 1

C/C++ Code lesen, Fragen ...

Verfasst: Mo, 14. Jun 2010 9:58
von brandelh
Hallo,

ab und zu muss man sich durch C/C++ Quellcode kämpfen um zu verstehen was jemand macht.
Ich schreibe mal hier was ich zu Wissen glaube und am Schluß, mit was ich nichst anfangen kann.
Bitte verbessert mich, falls ich falsch liege und hoffentlich weiß jemand mit dem Rest etwas anzufangen ;-)

logische Operatoren

&& -> .AND.
|| -> .OR.

++, --, -=, etc. sind gleich in der Bedeutung

binäre Operatoren

& -> BAnd()
| -> BOr()
^ -> BXOr()

Schleifen

for( int i = 0; i < 10; i++ ) -> FOR i = 0 to 9

for( int i = 40; i ; i--) -> i bedeuted i <> 0 Thanks to Pablo ;-)

Code: Alles auswählen

i := 40
do while i <> 0 
    ...
    i--
enddo
also grundsätzlich
for( Initialisierung der Zählvariable; Abbruchbedingung ; Operationen )

nun habe ich ein FOR() Konstrukt gesehen, was mich verwirrt hat ;-)

for( int i = 0x40; i ; i >>= 1 ) -> Keine Endlos Variable, sondern Bitverarbeitung ... siehe unten

Re: C/C++ Code lesen, Fragen ...

Verfasst: Mo, 14. Jun 2010 10:51
von Herbert
Wo und wie du einen Loop anfängst ist eigentlich egal. Du entscheidest ja innerhalb des Loops alles Weitere. In C ist aber oft die Null wichtig. Z.B ist das erste Element einer Listboxabfrage stets der Indikator 0 und nicht die 1...

0x40 ist ein hexadezimaler Wert. Entspricht also 64.

syntax:

Code: Alles auswählen

for(Inizialwert Variabe; Bedingung; Inkrement)
{
  //code
}
Schau mal da: http://www.cprogramming.com

Re: C/C++ Code lesen, Fragen ...

Verfasst: Mo, 14. Jun 2010 11:10
von brandelh
Hi,

ich sollte die wichtigen Fragen genauer herausstellen ;-)

Code: Alles auswählen

for( int i = 0; i < 10; i++ ) 
entspricht das

Code: Alles auswählen

FOR i = 0 to 10   ODER   0 to 9 ?

Code: Alles auswählen

for( int i = 0x40; i ; i >>= 1 )
Was macht i >>= 1 ?

Re: C/C++ Code lesen, Fragen ...

Verfasst: Mo, 14. Jun 2010 12:00
von Herbert
Die Bedingung lautet i<10, also läufts bis 9

>>= heisst "Right shift/assignment
The >>= operator shifts the bits of result right by the number of bits specified in expression. The sign bit of result is used to fill the digits from the left. Digits shifted off the right are discarded.

i >>= 1
ist identisch zu
i = i >> 1

>> alleine heisst "Right shift"

Beispiel:
temp = -14;
temp >>= 2;
Temp wird von 14 (11110010 in binary) 2 Stellen nach rechts geshiftet und ergibt -4 (11111100 in binary).

Re: C/C++ Code lesen, Fragen ...

Verfasst: Mo, 14. Jun 2010 14:04
von brandelh
Hallo Herbert,
i >>= 1
ist identisch zu
i = i >> 1
>> alleine heisst "Right shift"
danke, diese Erklärung habe ich gesucht ;-)

allerdings hätte ich bei deinem Beispiel mit einem anderen Ergebnis gerechnet ...
Beispiel:
temp = -14;
temp >>= 2;
Temp wird von -14 (11110010 in binary) 2 Stellen nach rechts geshiftet und ergibt -4 (11111100 in binary).
dass von links das Vorzeichen zum Auffüllen benutzt wird, damit hätte ich nicht gerechnet ...

Re: C/C++ Code lesen, Fragen ...

Verfasst: Mo, 14. Jun 2010 16:25
von brandelh
ich habe von Pablo hierzu Infos bekommen. Die einfachen habe ich oben eingearbeitet, der Rest kommt hier:

Code: Alles auswählen

for( int i = 0x40; i ; i >>= 1 )
entspricht ...

Code: Alles auswählen

i := 0x40 // 1000000 in binary
while ( i != 0  )
   do something ....
   i := nRShift( i , 1) // aus ot4xb von www.xb.com
end
// here i == 0
The value of i will be :
0x40 // 1000000 binary  // first time entering the loop
0x20 // 0100000 binary
0x10 // 0010000 binary
0x08 // 0001000 binary
0x04 // 0000100 binary
0x02 // 0000010 binary
0x01 // 0000001 binary // last time entering the loop
0x00 // 0000000 binary // after exit the loop
so sieht es ja ganz einfach aus :D

Re: C/C++ Code lesen, Fragen ...

Verfasst: Mi, 25. Aug 2010 10:10
von brandelh
Hi,

ab und zu muss man BITs SHIFTen ... Xbase++ hat dazu keine eigenen Befehle, daher stelle ich mal meine Funktionen ein:

*--------------------------------------------------------------------------
function BitShiftLeft(nInt1,nShift) // shift left => * 2^nShift
DEFAULT nShift TO 1 // common.ch
return int(nInt1)*(2^nShift)
*--------------------------------------------------------------------------
function BitShiftRight(nInt1,nShift) // shift right => / 2^nShift
DEFAULT nShift TO 1 // common.ch
return int(nInt1)/(2^nShift)

Re: C/C++ Code lesen, Fragen ...

Verfasst: Mi, 25. Aug 2010 13:52
von Koverhage
oder so

function BINSHL(nIntWert,nAnzahl)
Local aShiftTab := {2, 4, 8, 16, 32, 54, 128, 256}
Default nAnzahl to 0
return (nIntwert * aShiftTab[nAnzahl])