Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-01-2025
CrazySoft CrazySoft is offline
Miembro
 
Registrado: abr 2005
Posts: 100
Poder: 21
CrazySoft Va por buen camino
Error paso de parametro mediante direccion de memoria en D7

Buen día, una favor como puedo modificar este código para usar en Delphi 7, da el siguiente error "Operator not applicable to this operand type" al asignar un valor a (pB + 1)^=1; el Delphi 10XE compila correctamente



Gracias por su colaboración



Código Delphi [-]
function THidRlyForm.SendCmd(Relay, Mode: Byte): String; 
var   pB,pB1,pB2,pB0,pB8: pByte;   
Dev:  TJvHidDevice;   
Status: Boolean; 
begin   
Dev := TJvHidDevice(lbBoards.Items.Objects[lbBoards.ItemIndex]);  
 try
     pB := AllocMem(10);
       pB^      := 0;    
 (pB + 1)^ := Mode;  // Error Operator not applicable to this operand type     
(pB + 2)^ := Relay;
      Status := Dev.SetFeature(pB^, 9);
      if Status then       Result := Format('%2.2x %2.2x %2.2x', [(pB + 0)^, (pB + 1)^, (pB + 2)^])
     else 
      Result := 'Command not sent';
      Status := Dev.GetFeature(Pb^, 9);
     if Status then       Result := Format('%s - %2.2x', [Result, (pB + 8)^]);
   finally
     FreeMem(pB);
   end;
 end;

Última edición por CrazySoft fecha: 08-01-2025 a las 17:09:47.
Responder Con Cita
  #2  
Antiguo 08-01-2025
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.405
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
El error ocurre porque en las versiones más recientes de Delphi, los punteros ya no se pueden manipular aritméticamente de forma directa, como en versiones más antiguas. Esto está relacionado con los cambios en la administración de punteros y tipos de datos en el compilador.
Para resolver el problema, necesitas convertir el puntero a un tipo entero adecuado para realizar la aritmética, y luego volver a convertirlo a un puntero. Aquí tienes una forma de hacerlo:


Código Delphi [-]
function THidRlyForm.SendCmd(Relay, Mode: Byte): String;
var
  pB: PByte;
  Dev: TJvHidDevice;
  Status: Boolean;
begin
  Dev := TJvHidDevice(lbBoards.Items.Objects[lbBoards.ItemIndex]);
  try
    pB := AllocMem(10);
    try
      pB^ := 0; // Primer byte
      (PByte(NativeUInt(pB) + 1))^ := Mode;  // Segundo byte
      (PByte(NativeUInt(pB) + 2))^ := Relay; // Tercer byte

      Status := Dev.SetFeature(pB^, 9);
      if Status then
        Result := Format('%2.2x %2.2x %2.2x', [pB^, (PByte(NativeUInt(pB) + 1))^, (PByte(NativeUInt(pB) + 2))^])
      else
        Result := 'Command not sent';

      Status := Dev.GetFeature(pB^, 9);
      if Status then
        Result := Format('%s - %2.2x', [Result, (PByte(NativeUInt(pB) + 8))^]);
    finally
      FreeMem(pB);
    end;
  end;
end;


Cita:
Cambios explicados:
  1. NativeUInt: Se usa para convertir el puntero pB en un entero sin signo que permite realizar la aritmética de punteros de manera segura.
  2. PByte: Se utiliza para volver a convertir el entero a un puntero de tipo PByte, de forma que se pueda acceder al valor de la dirección de memoria correcta.
  3. Manejo de memoria: La asignación y liberación de memoria (AllocMem y FreeMem) permanece igual.
Detalles adicionales:
  • La función NativeUInt es compatible con Delphi moderno y asegura que la manipulación de punteros sea válida tanto en plataformas de 32 bits como de 64 bits.
  • Asegúrate de que Dev.SetFeature y Dev.GetFeature manejen correctamente los datos, especialmente si dependen de buffers de longitud fija.
Lo he copiado del chatgpt.
Responder Con Cita
  #3  
Antiguo 08-01-2025
CrazySoft CrazySoft is offline
Miembro
 
Registrado: abr 2005
Posts: 100
Poder: 21
CrazySoft Va por buen camino
Muchas gracias Casimiro, funciono bien, no sabia eso lo de los punteros
Responder Con Cita
  #4  
Antiguo 08-01-2025
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.405
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Yo tampoco lo sabía, todavía sigo con versiones obsoletas de delphi.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Error paso de fecha por parametro en ADO javi.donvito SQL 16 17-12-2008 21:18:24
violacion de direccion de memoria anubis Varios 3 09-05-2007 00:48:38
Obtener DirecciÓn De Memoria Juan Carlos API de Windows 3 20-04-2005 14:38:42
Direccion de memoria de una funcion camambrini Varios 0 30-07-2004 18:20:05
Leer direccion de memoria brandolin Varios 8 25-09-2003 16:29:22


La franja horaria es GMT +2. Ahora son las 16:09:57.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi