Negatives Vorzeichen bAND Berechnungen...

Previous topic - Next topic

Heiko

Ich hatte erst ein anderes Topic, aber ich hab die L?sung fast schon gefunden, darum editiere ich hier mal.
Und zwar hab ich eine Funktion, an welche auch negative Parameter ?bergeben werden sollen.
Ich seh nur grad nicht, warum das nicht geht.

Code (glbasic) Select
a=-5737356
b=24

Function bla: a, b
blub
EndFunction


der negative wert wird nicht ?bernommen, sondern 0.
habs mit % # probiert, geht nicht.
innerhalb der function kommen sonst bei float noch komischere werte raus.

wenns jemanden interessiert, hier der code.ein bb like shr.
Code (glbasic) Select
FUNCTION xShr:FA,FV

   LOCAL ICount%
   LOCAL IByte1%= bAND(FA/0x1000000, 0xFF)
   LOCAL IByte2%= bAND(FA/0x10000, 0xFF)
   LOCAL IByte3%= bAND(FA/0x100, 0xFF)
   LOCAL IByte4%= bAND(FA/0x1, 0xFF)
   LOCAL ITemp1%
   LOCAL ITemp2%
   LOCAL ITemp3%

   FOR ICount=1 TO FV
      ITemp1=bAND(IByte1, 0x1)*0x80
      ITemp2=bAND(IByte2, 0x1)*0x80
      ITemp3=bAND(IByte3, 0x1)*0x80
      IByte1=(IByte1/2)
      IByte2=(IByte2/2)+ITemp1
      IByte3=(IByte3/2)+ITemp2
      IByte4=(IByte4/2)+ITemp3
   NEXT


   RETURN  IByte1*0x1000000+IByte2*0x10000+IByte3*0x100+IByte4*0x1

ENDFUNCTION



Kitty Hello

Geht!
Nich mein Fehler.
Code (glbasic) Select

a=-5737356
b=24
bla(a,b)
bla(-a, -b)
KEYWAIT


FUNCTION bla: a, b

STDOUT "a:"+a+" b:"+b+"\n"

ENDFUNCTION


Warum machst Du als Parameter nicht % dran? Du willst ja Integer haben.

Heiko

#2
es h?ngt mit negativen zahlen und bAND zusammen, muss das wohl Inline machen...

Ich als c++ noob.

Zwei Fragen.
Eine Funktion mit standardparameter?bergabe nach inline weitergeben und noch ein anderer fehler.

hier der code, please help....

Code (glbasic) Select
FUNCTION xTestRendered: xPoint,yPoint,alphaLevel=0,loc=0

INLINE
int res;
sFI_TestType typ;
    FI_Test.Result=typ.Result;
    FI_Test.ProjectedX=typ.ProjectedX;
    FI_Test.ProjectedY=typ.ProjectedY;
    FI_Test.RectX=typ.RectX;
    FI_Test.RectY=typ.RectY;
    FI_Test.RectU=typ.RectU;
    FI_Test.RectV=typ.RectV;
    FI_Test.TextureX=typ.TextureX;
    FI_Test.TextureY=typ.TextureY;
    FI_Test.Texture=typ.Texture;
    FI_Test.Frame=typ.Frame;
    FI_Test.Reserved1=typ.Reserved1;
    if (wrap_xTestRendered(xPoint, yPoint, loc, &typ, 1)) && alphaLevel>0 && FI_Test.Texture!=0){
if ( (xReadPixel(FI_Test.TextureX, FI_Test.TextureY, xTextureBuffer(FI_Test.Texture,FI_Test.Frame))>>24)<alphaLevel ) {
FI_Test.Result = 0;
}
  }

return(FI_Test.Result);
   
ENDINLINE


ENDFUNCTION



bzwweise w?re mir das ergebnis eines signed right bitshiftung ala ASR ausreichend.
Meine werte stimmen nie.

ein einfaches A >> B; geht da ja nicht.

Schranz0r

Inline kannst du "Bitshifting" machen ... versteh das Problem nicht...
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Heiko

#4
Code (glbasic) Select
FUNCTION xTestRendered: xPoint,yPoint,alphaLevel=0,loc=0

INLINE
int res;
sFI_TestType typ;
    FI_Test.Result=typ.Result;
    FI_Test.ProjectedX=typ.ProjectedX;
    FI_Test.ProjectedY=typ.ProjectedY;
    FI_Test.RectX=typ.RectX;
    FI_Test.RectY=typ.RectY;
    FI_Test.RectU=typ.RectU;
    FI_Test.RectV=typ.RectV;
    FI_Test.TextureX=typ.TextureX;
    FI_Test.TextureY=typ.TextureY;
    FI_Test.Texture=typ.Texture;
    FI_Test.Frame=typ.Frame;
    FI_Test.Reserved1=typ.Reserved1;
    if (wrap_xTestRendered(xPoint, yPoint, loc, &typ, 1)) && (int)alphaLevel>0 && FI_Test.Texture!=0){
if ( (xReadPixel(FI_Test.TextureX, FI_Test.TextureY, xTextureBuffer(FI_Test.Texture,FI_Test.Frame))>>24)<alphaLevel ) {
FI_Test.Result = 0;
}
  }

return(FI_Test.Result);
   
ENDINLINE


ENDFUNCTION


kommt immer noch diese fehlermeldung:

IncrediBuild skips: test1.gbas, GetImageInfo.gbas, Read_Funktionen.gbas, xwrap.gbas,
C:\Users\Nutzer\AppData\Local\Temp\glbasic\gpc_temp1.cpp: In function `DGInt __GLBASIC__::xTestRendered(DGInt, DGInt, DGInt, DGInt)':
C:\Users\Nutzer\AppData\Local\Temp\glbasic\gpc_temp1.cpp:1367: error: expected identifier before '(' token
C:\Users\Nutzer\AppData\Local\Temp\glbasic\gpc_temp1.cpp:1367: error: expected `;' before '(' token

problem ist dass das SHR bei bb bei nem negativen decimalwert immer das erste bit der umgewandelten bin?rzahl als 1 kennzeichnet, dass muss das rausgefiltert werden, dessen stelle in 0 gewandelt, und hinterher 1 dazu und nen minus davor, wenn der wert negativ war.
so wurde mir das erkl?rt.

oder versuch einfach bei fastimage das TestRendered nachzubauen.

Schranz0r

#5
wo hast du FI_Test deklariert?

EDIT:

if (wrap_xTestRendered(xPoint, yPoint, loc, &typ, 1)) && (int)alphaLevel>0 && FI_Test.Texture!=0){


muss sein:

if (wrap_xTestRendered(xPoint, yPoint, loc, &typ, 1) && (int)alphaLevel>0 && !FI_Test.Texture){


Pass blo? bei C++ auf!
Mach bitte bitte erstmal das Grundlegende durch, bevor du hier wild Rumjonglierst.
Wird sehr schnell frust draus!
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Heiko

weiter oben nat?rlich:

Code (glbasic) Select
struct sFI_TestType{
   int Result,ProjectedX,ProjectedY;
   int RectX,RectY;
   float RectU,RectV;
   int TextureX,TextureY,Texture;
   int Frame,Reserved1;
};


und den normalen type nat?rlich auch

Schranz0r

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Heiko

#8
habs ge?ndert, kommt nun
C:\Users\Nutzer\AppData\Local\Temp\glbasic\gpc_temp1.cpp: In function `DGInt __GLBASIC__::xTestRendered(DGInt, DGInt, DGInt, DGInt)':
C:\Users\Nutzer\AppData\Local\Temp\glbasic\gpc_temp1.cpp:1367: error: non-lvalue in assignment
C:\Users\Nutzer\AppData\Local\Temp\glbasic\gpc_temp1.cpp:1368: error: invalid operands of types `DGInt' and `int' to binary `operator>>'

ich w?rd kein c++ machen wenns nicht sein muss.
das testrendered wenn alphalevel 0 ist, pr?ft auf kontakt mit dem image bzw. der texture, wenn man alphalevel aber als 128 angibt, dann gibts erst kontakt wenn der tats?chlich sichtbare bereich ber?hrt wird.
das normale hab ich seit tagen, nur an dem alphalevel mist sitz ich die ganze zeit, wenn das nicht w?re, h?tt ich Fastimage sicher schon allein fertig bekommen, der rest ist nicht mehr schwer, will aber erst das fertig machen.
und wu?te halt erst nicht, da? das bitshifting bei bb halt anders ist.
glb kommt da standard nicht mit negativen werten klar.

edit: das ! warum kommt das nun woanders hin, bei dem FI c++ header ists da wo es stand, grins.
       auch ne art c++ zu lernen, oder?lol