PDA

Ver la Versión Completa : Evitar este Warning


aguml
15-04-2015, 19:27:40
Hola amigos, tengo este condicional:
if((Offset & 0x00FFFFFF) == a)

Tanto "Offset" como "a" son del tipo unsigned long.
Y el compilador me dice esto:
[C++ Warning] TBruteForce.cpp(101): W8060 Possibly incorrect assignment

Funcionar funciona como yo quiero ya que solo entra cuando esa condicion se cumple pero queria saber porque me da ese Warning y como evitarlo.
Gracias.

ecfisa
15-04-2015, 20:24:13
Hola aguml.

¿ Será ese el código causante ?, en el contexto que describes no me genera ninguna advertencia:

http://s3.postimg.org/wy21hl68j/aguml.png

Saludos :)

aguml
15-04-2015, 23:07:44
Ya di con el problema, era justo en otro condicional anterior. ¿No se puede hacer que builder muestre los numeros de linea?

aguml
16-04-2015, 14:40:19
Ahora tengo otro Warning:
[C++ Warning] Unit1.h(96): W8027 Functions containing switch are not expanded inline

Si miro a que se refiere veo que es a esto que tengo en el .h de la clase TForm1:
protected:
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_SYSCOMMAND, TWMSysCommand, OnWMSysCommand)
END_MESSAGE_MAP(TForm)

¿se puede evitar o no pasa nada?

ecfisa
16-04-2015, 15:39:24
Hola aguml.

Esa declaración tampoco me genera advertencia, pero no es realmente importante, no funcionará mál.

Sin embargo podrías probar si de este modo te la elimina:

protected:
#pragma option push -w-inl
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_SYSCOMMAND, TWMSysCommand, OnWMSysCommand)
END_MESSAGE_MAP(TForm)
#pragma option pop


Saludos :)

aguml
16-04-2015, 16:34:21
Con eso se quita el warning ¿que hace eso exactamente? yo es que ni siquiera se para que es pragma :confused:

AgustinOrtu
16-04-2015, 16:55:01
Revisa estos links

Error is " functions containing switch are not expanded inline (http://bytes.com/topic/c/answers/887417-error-functions-containing-switch-not-expanded-inline)

W8027: Functions containing 'statement' are not expanded inline (http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/EN/html/devwin32/wrnnoinlexp_xml.html)

http://www.borlandtalk.com/w8027-functions-containing-switch-are-not-expanded-inline-vt108082.html

Basicamente el compilador te esta diciendo que no puede expandir la funcion, esto es, aprovechar cierta caracteristica que permite que una funcion, en lugar de compilarla una sola vez y cada vez que llamas a esa funcion, ir a ese unico lugar de todo tu programa en donde va a estar, se reemplazan las llamadas a la funcion esparcidas por tu codigo por la rutina de la funcion en si

No se entendio nada no?


unit FooUnit;

interface

function Foo(x: integer): boolean; inline;

implementation
function Foo(x: integer): boolean;
begin
Result := x > 10;
end;



unit Unit1;

interface

uses FooUnit;

interface
function Bar: boolean;
function Bar2: boolean;

implemetantion

function Bar: boolean;
begin
Result := Foo(Random(5));
end;

function Bar2: boolean;
begin
Result := Foo(Random(8));
end;


Al compilarlo esto se traduce en:


implemetantion

function Bar: boolean;
begin
Result := Random(5) > 10;
end;

function Bar: boolean;
begin
Result := Random(8) > 10;
end;



Esto evidentemente genera mas lineas de codigo, pero se gana performance ya que se evita el cambio de contexto que llamar a una funcion/procedimiento supone. Pero no siempre es posible, si la funcion es compleja o por ejemplo en un caso como el tuyo. Es una "sugerencia" al compilador (Ref (http://docwiki.embarcadero.com/RADStudio/XE7/en/Calling_Procedures_and_Functions#Using_the_inline_Directive))

ecfisa
16-04-2015, 17:11:53
Hola aguml.
Con eso se quita el warning ¿que hace eso exactamente? yo es que ni siquiera se para que es pragma :confused:
En la primer línea desactivo las advertencias sobre inline y en la última las restauro.

#pragma Directives Overview Index (http://docwiki.embarcadero.com/RADStudio/XE6/en/Pragma_Directives_Overview_Index)


Saludos :)

aguml
17-04-2015, 07:06:12
Pues sigo sin enterarme de mucho pero tendré que intentar entenderlo porque parece algo importante. Sobre desactivar y activar las advertencias del inline, lo hago aquí porque me dices que está todo correcto pero no como estoy pez en temas de inline no lo haré en futuros códigos por motivos de integridad (no quiero que me explote el pc jajaja) ya que supongo que si desactivo eso y hago alguna barbaridad en esa zona, muy posible que pase cuando no se sabe bien lo que se hace, a saber que podría pasar jajaja.

AgustinOrtu
17-04-2015, 07:43:28
El inlining es una optimizacion, nada mas