FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
pasar contenido de pchar a string
hola a todos.
Despues de ejecutar un funcion y obeter un puntero pchar de un determinao array, tengo que pasar estos datos a un string para poder tratarlos. ¿alguien sabe como hacer ésto? muchas gracias. |
#3
|
|||
|
|||
max?
ok, con esto paso los datos de mi variable:
datos: pchar; final :string; paso los datos de "datos" a final d eesta foram. ¿y el max seria el numero de caracters contenidos en el puntero datos? gracias |
#4
|
|||
|
|||
Si, max es la cantidad de caracteres.
Suerte. |
#5
|
|||
|
|||
Hombre, la forma normal es simplemente asignarlos y listo, hacer un bucle aunque valido (el del ejemplo habria que corregirlo ya que no se fija el tamaño del string asi que dara error) es un poco matar moscas a cañonazos ademas de mas lento.
Código:
var datos: pchar; final :string; begin final:= datos; end; |
#7
|
|||
|
|||
Hacer un cast a PChar(datos) es una redundancia debido a que datos YA es de tipo PChar, luego le estamos diciendo al compilador algo que ya sabe (que interpreta la variable datos como de tipo PChar cuando ya es de ese tipo).
El resultado final del codigo compilado se haga el cast o no es identico, simplemente el codigo fuente ocupara un pelin mas. Saludos |
#8
|
|||
|
|||
Mick prueba lo que dices desarrollando una DLL que tenga compatibilidad con "C", prueba luego hablamos
|
#9
|
|||
|
|||
sudamericano,es ese mi problema
Hola,
Ese es mi problema, trabajo con una dll externa, en c+ y el tipo de datos del pchar es el que me da problemas en delphi al pasarlo o recogerlo en una variable y pasarlo a un string. ¿como podria solucionarlo? |
#11
|
|||
|
|||
coletaun mandame tu dll a mi correo y te ayudo mandandote un ejemplo en delphi con fuentes para que puedas solucionar tu problema
Última edición por Sudamericano fecha: 08-08-2006 a las 20:36:39. |
#12
|
|||
|
|||
STrPas es una funcion que existe solo por mantener compatibilidad hacia atras con programas antiguos y que estos no dejen de funcionar, pero borland no recomienda su uso, ya que podria ser eliminada en el futuro. La propia ayuda de delphi sobre la funcion StrPas dice:
"This function is provided for backwards compatiblity only. To convert a null terminated string to an AnsiString or native Delphi languag string, use a typecast or a assignment" Que viene a decir: Esta funcion existe solo por compatibilidad con programas antiguos. Para convertir una cadena terminada en nulo a un AnsiString o a un string nativo de delphi, use un typecast o una asignacion. Saludos PD: No importa que la funcion que devuelve el puntero a char este en una DDL igualmente no hace falta usar el typecast. Solo haria falta si lo que devuelve la funcion no fuese exactamente de tipo PChar sino de otro tipo compatible. |
#13
|
|||
|
|||
sudamericano
Te mando la dll y la configuración de la dll para ver si es posible que me puedas echar una mano.
Muchas gracias. |
#14
|
|||
|
|||
Mick
De todas formas lo que devuelve la función en c, está definido asi:
BOOL WINAPI captura_pantalla(HCLIENT hclient, char *pantalla, int *longitud, int tout); ¿que tipo de variable seria para capturar en delphi pantalla? Gracias |
#15
|
|||
|
|||
En el caso en particular que mencionas no importa el tipo de la variable, la funcion funcionaria igual poniendo cualquier tipo al puntero:
Código:
char *pantalla; pointer pantalla; PByteArray pantalla; Código:
final:= pchar(datos); final:= datos; Las variables string de delphi no tienen ese problema debido a que al principio de los datos guardan un contador con el tamaño de la cadena, lo que permite que la cadena de caracteres o bytes pueda contener cualquier valor incluido el cero. En cambio los PChar conceptualmente son iguales que los char * equivalentes de C, y el caracter 0 se utiliza como fin de cadena y no puede formar parte de los propios datos. En ese caso hay que definir el tamaño del string primero y despues asignarlo con un bucle o mejor con una funcion que copie bloques de bytes ya que es mucho mas rapido. Por ejemplo: Código:
SetLength(final,Longitud^); Move( datos^, final[1] , Longitud); Código:
SetLength(final, TAMANO_MAXIMO_CAPTURA_PANTALLA); captura_pantalla(hclient, @final[1], longitud, tout); SetLength(final,longitud^); Código:
uses Sysutils; ... var longitud: integer; buffer:PByteArray; begin GetMem(buffer, TAMANO_MAXIMO_CAPTURA_PANTALLA); captura_pantalla(hclient, buffer, @longitud, tout); ReallocMem(buffer,longitud); .. .. // Hacemos lo que sea con buffer, // podemos acceder a los datos con buffer[indice] .. .. FreeMem(buffer); end; Última edición por Mick fecha: 25-07-2006 a las 17:51:47. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Compatibilidad entre PChar y String | vick | Conexión con bases de datos | 5 | 24-10-2005 21:50:35 |
¿como pasar de String dentro de un PChar? | Moises22 | Varios | 6 | 27-09-2005 15:43:47 |
Pasar contenido fichero a un campo memo | Jose Manuel | Impresión | 2 | 15-03-2005 16:39:59 |
Pchar y String | superhopi | Varios | 8 | 19-08-2004 09:54:06 |
problemas de compatibilidad de tipos pchar y string | VRO | Varios | 2 | 13-05-2004 10:29:34 |
|