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

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag 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
Zuletzt geändert von brandelh am Mo, 14. Jun 2010 16:20, insgesamt 1-mal geändert.
Grund: Einarbeitung von Pablos Antwort
Gruß
Hubert
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

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

Beitrag 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
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag 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 ?
Gruß
Hubert
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

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

Beitrag 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).
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag 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 ...
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag 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
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag 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)
Zuletzt geändert von brandelh am Mi, 25. Aug 2010 15:23, insgesamt 1-mal geändert.
Grund: DEFAULT nShift TO 1 // common.ch eingefügt
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

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

Beitrag 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])
Gruß
Klaus
Antworten