• Miércoles 20 de Noviembre de 2024, 18:33

Autor Tema:  Punteros Y Direcciones  (Leído 4320 veces)

Zirrosis

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Punteros Y Direcciones
« en: Miércoles 20 de Junio de 2007, 22:29 »
0
Bien, mi proposito es llamar a un messagebox a través de la direccion a una string, por ejemplo (en pseudocodigo):

Código: Text
  1. variable var = "Hola mundo"
  2. puntero Punt apunta a la direccion [B]en memoria[/B] de var
  3. llamamos a la API messagebox y le pasamos Punt
  4.  

Tienen alguna idea???

En la MSDN vi que con el simbolo & se apunta a la dirección de lo que se esta apuntando, pero no me funciona, hago esto:

Código: Text
  1. uint t;
  2.  
  3. t = &a;
  4.  

Pero no me funciona, me dice que no se puede obtener la direccion de una string... <_<  :(

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Re: Punteros Y Direcciones
« Respuesta #1 en: Miércoles 20 de Junio de 2007, 23:03 »
0
Para colocar un puntero a un string es necesario que apuntes al primer caracter del arrelgo.

Código: Text
  1.  uint i = &a[0];
  2.  

O sea apuntar a la posición cero del string.

Suerte.
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

lalo_soft

  • Miembro MUY activo
  • ***
  • Mensajes: 469
    • Ver Perfil
Re: Punteros Y Direcciones
« Respuesta #2 en: Miércoles 20 de Junio de 2007, 23:22 »
0
No que en C# no existen los punteros (no de la forma como es en C o C++)

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Re: Punteros Y Direcciones
« Respuesta #3 en: Jueves 21 de Junio de 2007, 00:05 »
0
Existen, pero no los comprueba, para eso debes declararlos como "unsafe" y permitir el uso de codigo no seguro.

O sea el codigo con puntero debe ir asi :

Código: Text
  1. unsafe{
  2. ....
  3. }
  4.  
  5.  
  6.  

Y ademas debes habilitar el permitir el trabajo con codigo no seguro en las propiedades del proyecto, generar.

Eso es muy util cuando llamas a DLL desde el metodo DLLImport las cuales usan punteros como en C++ y ahi es necesario en algunos casos pasar parámetros con las palabras reservadas ref y out.
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

Zirrosis

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: Punteros Y Direcciones
« Respuesta #4 en: Jueves 21 de Junio de 2007, 00:09 »
0
Coloco esto y no me funciona:

Código: Text
  1. unsafe static void WriteLocations()
  2.     {
  3.         string addr = "Holamundo";
  4.  
  5.         uint t = &addr[0];
  6.  
  7.         Console.WriteLine(addr);
  8.         Console.WriteLine(Convert.ToString(t));
  9.  
  10.     }
  11.  

Gracias por responder.  :)

lalo_soft

  • Miembro MUY activo
  • ***
  • Mensajes: 469
    • Ver Perfil
Re: Punteros Y Direcciones
« Respuesta #5 en: Jueves 21 de Junio de 2007, 16:27 »
0
Cita de: "Zirrosis"
Coloco esto y no me funciona:

Código: Text
  1. unsafe static void WriteLocations()
  2.     {
  3.         string addr = "Holamundo";
  4.  
  5.         uint t = &addr[0];
  6.  
  7.         Console.WriteLine(addr);
  8.         Console.WriteLine(Convert.ToString(t));
  9.  
  10.     }
  11.  

Gracias por responder.  :)

el problema es que uint t no esta declarado como  un puntero  sino como un entero.


 uint *t; // esto le dice al compilador que t apunta a un unit
            // ojo con esto ya que en la aritmetica de punteros se considera el tipo de                  vaolr al que se apunta para calcular la direccion final.
 
 en tu caso deveria ser :

 char *t;  o byte *t; // ya que quires apuntar a un arreglo tipo string
                             

 

 t = addr[0];  o t = addr;

Zirrosis

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: Punteros Y Direcciones
« Respuesta #6 en: Jueves 21 de Junio de 2007, 21:00 »
0
Otra vez gracias, pero me sigue fallando... :(  :(

Esta vez me dice que no se puede pasar de 'char' a 'char*'.... :(  :(

Este es el codigo:

Código: Text
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace ConsoleApplication1
  6. {
  7.     class Program
  8.     {
  9.         unsafe static void WriteLocations()
  10.         {
  11.             string addr = "Holamundo";
  12.             char* t;
  13.  
  14.             t = addr[0];
  15.  
  16.             Console.WriteLine(addr);
  17.             Console.WriteLine(Convert.ToString(t));
  18.             Console.Read();
  19.  
  20.         }
  21.  
  22.         static void Main(string[] args)
  23.         {
  24.             unsafe
  25.             {
  26.                 WriteLocations();
  27.             }
  28.         }
  29.     }
  30. }
  31.  

Lo que pretendo hacer es que me printee por pantalla la posición de memoria donde se encuentra la primera letra de addr.

Por ejemplo, la intencion es que en ese codigo salga por pantalla esto:

Citar
Holamundo
0045b7c

por ejemplo....

Muchas Gracias.  :)

lalo_soft

  • Miembro MUY activo
  • ***
  • Mensajes: 469
    • Ver Perfil
Re: Punteros Y Direcciones
« Respuesta #7 en: Viernes 22 de Junio de 2007, 01:25 »
0
ya entendi prueba esto

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
   class Program
   {
       unsafe static void WriteLocations()
       {
           char mensaje[] = {"Holamundo"};
           char add[20];
           char *t;

           t = mensaje;
           itoa(add,t,16);          


       


           Console.WriteLine(mensaje);
           Console.WriteLine(add);
           Console.Read();

       }

       static void Main(string[] args)
       {
           unsafe
           {
               WriteLocations();
           }
       }
   }
}

Zirrosis

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: Punteros Y Direcciones
« Respuesta #8 en: Viernes 22 de Junio de 2007, 14:02 »
0
E depuado un poco el codigo, pero me sigue sin funcionar.... :(  :(

Zirrosis

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: Punteros Y Direcciones
« Respuesta #9 en: Viernes 22 de Junio de 2007, 14:57 »
0
Lo consegui!!!

Código: Text
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace ConsoleApplication1
  6. {
  7.     class Program
  8.     {
  9.         unsafe static void WriteLocations()
  10.         {
  11.             char c = 'A';
  12.             char* pc = &c;
  13.             void* pv = pc;
  14.             int i = (int)pv;
  15.             string hex = i.ToString("X");
  16.             Console.WriteLine(hex.ToLower());
  17.             Console.Read();
  18.  
  19. }
  20.  
  21.         static void Main(string[] args)
  22.         {
  23.             unsafe
  24.             {
  25.                 WriteLocations();
  26.             }
  27.         }
  28.     }
  29. }
  30.  

Esta pagina me ayudo:

http://www.devjoker.com/contenidos/Tutoria...e-punteros.aspx

Saludos y gracias  :kicking:

Zirrosis

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: Punteros Y Direcciones
« Respuesta #10 en: Viernes 22 de Junio de 2007, 15:07 »
0
Al parecer no me sirve de nada....ya que mi intencion no es hacerlo con un caracter (char), sino con una string.....y el C# no me deja poner punteros hacia una string....


Si ago lo sigueinte:

Código: Text
  1. string a = "hola";
  2. char p = a.Substring(1,1);
  3.  

Eso evidentemente no sirve, ya que se coloca la primera letra de a dentro de otra dirección de memoria, no??? :S  :(

Editado:

Ya lo e conseguido, otra vez esa pagina me a vuelto a salvar...xDDD

Código: Text
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace ConsoleApplication2
  6. {
  7.     class CadenaInsegura
  8.     {
  9.         public unsafe static void Main()
  10.         {
  11.             string s = "Hola";
  12.             Console.WriteLine("Cadena inicial: {0}", s);
  13.             fixed (char* ps = s)
  14.             {
  15.                 void* pv = ps;
  16.                 int i = (int)pv;
  17.                 string hex = i.ToString("X");
  18.                 Console.WriteLine(hex.ToLower());
  19.                 Console.Read();
  20.             }
  21.             Console.WriteLine("Cadena final: {0}", s);
  22.  
  23.             Console.Read();
  24.         }
  25.     }
  26. }
  27.  

Saludo.  :kicking:

Neopro

  • Miembro MUY activo
  • ***
  • Mensajes: 316
    • Ver Perfil
Re: Punteros Y Direcciones
« Respuesta #11 en: Viernes 22 de Junio de 2007, 15:58 »
0
Cita de: "Zirrosis"
Al parecer no me sirve de nada....ya que mi intencion no es hacerlo con un caracter (char), sino con una string.....y el C# no me deja poner punteros hacia una string....


Si ago lo sigueinte:

Código: Text
  1. string a = "hola";
  2. char p = a.Substring(1,1);
  3.  

Eso evidentemente no sirve, ya que se coloca la primera letra de a dentro de otra dirección de memoria, no??? :S  :(

Editado:

Ya lo e conseguido, otra vez esa pagina me a vuelto a salvar...xDDD

Código: Text
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4.  
  5. namespace ConsoleApplication2
  6. {
  7.     class CadenaInsegura
  8.     {
  9.         public unsafe static void Main()
  10.         {
  11.             string s = "Hola";
  12.             Console.WriteLine("Cadena inicial: {0}", s);
  13.             fixed (char* ps = s)
  14.             {
  15.                 void* pv = ps;
  16.                 int i = (int)pv;
  17.                 string hex = i.ToString("X");
  18.                 Console.WriteLine(hex.ToLower());
  19.                 Console.Read();
  20.             }
  21.             Console.WriteLine("Cadena final: {0}", s);
  22.  
  23.             Console.Read();
  24.         }
  25.     }
  26. }
  27.  

Saludo.  :kicking:
Se me había olvidado el detalle de fixed, que es con lo cual fijas una variable y direccion dentro de la funcion trabajando con código no seguro y llamadas a memoria.

No siempre es necesario utilizarlo, dependiendo de lo que quieres obtener.

Gracias por postear la respuesta acá.
              [size=109]"Has lo que digo y no hagas lo que hago"[/size]

Zirrosis

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: Punteros Y Direcciones
« Respuesta #12 en: Viernes 22 de Junio de 2007, 16:30 »
0
Ahora ya se terminó la fiesta...xDDDD

lo que queria hacer era llamar a la API messagebox al igual que lo hace el Ensamblador...es decir, le pasa la dirección donde hay la cadena almacenada en memoria....pero me temo que para eso...tendre que usar ensamblador dentro del mismo C# y eso ya es irse por las nubles.....

En fin, al final todo esto no me ha servido para nada....pero almenos e aprendido algo... :D

Un Saludo.  :)

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Punteros Y Direcciones
« Respuesta #13 en: Sábado 23 de Junio de 2007, 17:02 »
0
El problema esta que desde un comienzo no sabias bien lo que quieres.

Para que llamar a la api desde message box desde c# si puedes usar
System.Forms.MessageBox ???

Si aun asi insistieras en eso entonces para llamarlos como tu dices 'colo se hace desde asm'  tendrias que llamar a la api desde user32.dll sino estoy mal.

Entonces usas DLLImport para ahcer referencia a esa libreria de la API y luego a travez de la clase IntPtr puedes usar el puntero a la cadena que mencionas incluso imagino que hay sobrecargas para hacerlo con punteros tradicionales directamente.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Zirrosis

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: Punteros Y Direcciones
« Respuesta #14 en: Domingo 24 de Junio de 2007, 00:10 »
0
Si, se perfectamente el procedimiento....pero no se como llamarlo, lo e intentado con CreateThread y no me funciona, ya que tengo punteros, no handles.... :(  :(

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Punteros Y Direcciones
« Respuesta #15 en: Domingo 24 de Junio de 2007, 03:49 »
0
Pero C# te permite convertir punteros a handles, de hecho uno de los métodos de IntPtr o incluso creo que el constructor te permite crearlo de esa forma.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Zirrosis

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: Punteros Y Direcciones
« Respuesta #16 en: Domingo 24 de Junio de 2007, 19:34 »
0
Me puedes poner un ejemplo??? ya que yo no logro convertirlo... :(  :(

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Punteros Y Direcciones
« Respuesta #17 en: Domingo 24 de Junio de 2007, 20:51 »
0
:smartass:
Le ahces al punytero un cast a void y s elo pasas por parametro al constructor del objeto IntPtr
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Zirrosis

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: Punteros Y Direcciones
« Respuesta #18 en: Domingo 24 de Junio de 2007, 21:57 »
0
xDDD no me acordaba de esto.....

Gracias.  :lol:  :kicking: