SoloCodigo

CLR: .Net / Mono / Boo / Otros CLR => C# => Mensaje iniciado por: Zirrosis en Miércoles 20 de Junio de 2007, 22:29

Título: Punteros Y Direcciones
Publicado por: Zirrosis en Miércoles 20 de Junio de 2007, 22:29
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... <_<  :(
Título: Re: Punteros Y Direcciones
Publicado por: Neopro en Miércoles 20 de Junio de 2007, 23:03
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.
Título: Re: Punteros Y Direcciones
Publicado por: lalo_soft en Miércoles 20 de Junio de 2007, 23:22
No que en C# no existen los punteros (no de la forma como es en C o C++)
Título: Re: Punteros Y Direcciones
Publicado por: Neopro en Jueves 21 de Junio de 2007, 00:05
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.
Título: Re: Punteros Y Direcciones
Publicado por: Zirrosis en Jueves 21 de Junio de 2007, 00:09
Coloco esto y no me funciona:

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

Gracias por responder.  :)
Título: Re: Punteros Y Direcciones
Publicado por: lalo_soft en Jueves 21 de Junio de 2007, 16:27
Cita de: "Zirrosis"
Coloco esto y no me funciona:

Código: Text
  1. unsafe static void WriteLocations()
  2.     {
  3.         string addr = &#34;Holamundo&#34;;
  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;
Título: Re: Punteros Y Direcciones
Publicado por: Zirrosis en Jueves 21 de Junio de 2007, 21:00
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 = &#34;Holamundo&#34;;
  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.  :)
Título: Re: Punteros Y Direcciones
Publicado por: lalo_soft en Viernes 22 de Junio de 2007, 01:25
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();
           }
       }
   }
}
Título: Re: Punteros Y Direcciones
Publicado por: Zirrosis en Viernes 22 de Junio de 2007, 14:02
E depuado un poco el codigo, pero me sigue sin funcionar.... :(  :(
Título: Re: Punteros Y Direcciones
Publicado por: Zirrosis en Viernes 22 de Junio de 2007, 14:57
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(&#34;X&#34;);
  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 (http://www.devjoker.com/contenidos/Tutorial-C/180/Manipulaci%C3%B3n-de-punteros.aspx)

Saludos y gracias  :kicking:
Título: Re: Punteros Y Direcciones
Publicado por: Zirrosis en Viernes 22 de Junio de 2007, 15:07
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 = &#34;hola&#34;;
  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 = &#34;Hola&#34;;
  12.             Console.WriteLine(&#34;Cadena inicial: {0}&#34;, s);
  13.             fixed (char* ps = s)
  14.             {
  15.                 void* pv = ps;
  16.                 int i = (int)pv;
  17.                 string hex = i.ToString(&#34;X&#34;);
  18.                 Console.WriteLine(hex.ToLower());
  19.                 Console.Read();
  20.             }
  21.             Console.WriteLine(&#34;Cadena final: {0}&#34;, s);
  22.  
  23.             Console.Read();
  24.         }
  25.     }
  26. }
  27.  

Saludo.  :kicking:
Título: Re: Punteros Y Direcciones
Publicado por: Neopro en Viernes 22 de Junio de 2007, 15:58
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 = &#34;hola&#34;;
  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 = &#34;Hola&#34;;
  12.             Console.WriteLine(&#34;Cadena inicial: {0}&#34;, s);
  13.             fixed (char* ps = s)
  14.             {
  15.                 void* pv = ps;
  16.                 int i = (int)pv;
  17.                 string hex = i.ToString(&#34;X&#34;);
  18.                 Console.WriteLine(hex.ToLower());
  19.                 Console.Read();
  20.             }
  21.             Console.WriteLine(&#34;Cadena final: {0}&#34;, 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á.
Título: Re: Punteros Y Direcciones
Publicado por: Zirrosis en Viernes 22 de Junio de 2007, 16:30
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.  :)
Título: Re: Punteros Y Direcciones
Publicado por: JuanK en Sábado 23 de Junio de 2007, 17:02
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.
Título: Re: Punteros Y Direcciones
Publicado por: Zirrosis en Domingo 24 de Junio de 2007, 00:10
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.... :(  :(
Título: Re: Punteros Y Direcciones
Publicado por: JuanK en Domingo 24 de Junio de 2007, 03:49
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.
Título: Re: Punteros Y Direcciones
Publicado por: Zirrosis en Domingo 24 de Junio de 2007, 19:34
Me puedes poner un ejemplo??? ya que yo no logro convertirlo... :(  :(
Título: Re: Punteros Y Direcciones
Publicado por: JuanK en Domingo 24 de Junio de 2007, 20:51
:smartass:
Le ahces al punytero un cast a void y s elo pasas por parametro al constructor del objeto IntPtr
Título: Re: Punteros Y Direcciones
Publicado por: Zirrosis en Domingo 24 de Junio de 2007, 21:57
xDDD no me acordaba de esto.....

Gracias.  :lol:  :kicking: