Autor
		 | 
		
			Tema: Problema al obtener la ruta del fichero  (Leído 4,297 veces)
		 | 
	 
 
	
		
			
				
					
						
							ccjrocks
							
								
								  Desconectado
								Mensajes: 15
								
								
								
								
								
								  
							 
						 | 
						
							
							 
							
He diseñado este code para devolver la ruta del fichero que ejecutó la aplicación: char* GetMainExecutablePath() { 	TCHAR szEXEPath[2048]; 	int counter = 0; 	GetModuleFileName ( NULL, szEXEPath, 2048 ); 	for(int j=0; szEXEPath[j]!=0; j++) 	{ 			counter=counter+1; 	}
  	char *actualpath; 	actualpath=new char[counter];
  	for(int j=0; szEXEPath[j]!=0; j++) 	{ 			actualpath[j]=szEXEPath[j]; 		 	}
  	return actualpath; }Teóricamente no debería haber ningún problema, pero es que en el retorno se muestran algunos caracteres extraños al final de la cadena que devuelve la función, no sé por qué-   Me gustaría que me explicaran por qué sucede ésto (no quiero soluciones alternativas para obtener el ejecutable). Gracias de antemano    
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Última modificación: 17 Septiembre 2012, 20:53 pm por ccjrocks »
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							avesudra
							
								 
								
								  Desconectado
								Mensajes: 724
								
								 
								Intentando ser mejor cada día :)
								
								
								
								
								
								  
							 
						 | 
						
							
							 
							
Hola ccjrocks , bienvenido al foro , a mí la salida de tu función me da perfectamente.Lo que sí que te sobra la mitad de esa función.¿Con qué función imprimes el retorno de la función? 
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Última modificación: 17 Septiembre 2012, 21:24 pm por avesudra »
								 | 
								
									 
									En línea
								 | 
							  
							 
							Regístrate en    
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							ccjrocks
							
								
								  Desconectado
								Mensajes: 15
								
								
								
								
								
								  
							 
						 | 
						
							
							 
							
La función que imprime el char es ésta: int main(int argc, _TCHAR* argv[]) {
 
  	printf(GetMainExecutablePath()); 	char st[]=""; 	std::cin >> st;
  	return 0; } Hice la inspección de la variable y me dá también esos caracteres extraños al final (exactamente 16) así que no sé por que será    Os adjunto una captura para que veáis de lo que os hablo, el compilador es Visual C++ 2012 con librerías estándar (sin .NET) (sí, me gusta mucho IntelliSense):   Hombre, yo creo que de la función con la que imprimo el char no es, si no en la inspección no aparecerían los caracteres. He tapado el nombre del proyecto en ambas imágenes, espero que no os importe. Help, pleazee. Ah, y si tengo muchas líneas de código, ¿cómo se podría simplificarlo? Graciass     
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							avesudra
							
								 
								
								  Desconectado
								Mensajes: 724
								
								 
								Intentando ser mejor cada día :)
								
								
								
								
								
								  
							 
						 | 
						
							
							 
							
Es el printf , has tenido un despiste: printf("%s", GetMainExecutablePath ()); 
 
 En cuanto al code de la función: char* GetMainExecutablePath() { 	TCHAR szEXEPath[2048]; 	GetModuleFileName ( NULL, szEXEPath, 2048 ); 	return szEXEPath; }   
 
 No sé para que te servían los bucles    ¡Un saludo!  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							Regístrate en    
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							ccjrocks
							
								
								  Desconectado
								Mensajes: 15
								
								
								
								
								
								  
							 
						 | 
						
							
							 
							
Ok, sí, cometí un despiste en el printf, pero corregido me sigue dando el mismo resultado    Y no puedo utilizar tu code puesto que es necesario convertir de TCHAR a *char, ahí el por qué de mis bucles... Sigo sin entender por qué me dá el error, pero muchas gracias por la ayuda    A ver si alguien sabe el porqué de mi error...  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							avesudra
							
								 
								
								  Desconectado
								Mensajes: 724
								
								 
								Intentando ser mejor cada día :)
								
								
								
								
								
								  
							 
						 | 
						
							
							 
							
Puedes hacer un cast directamente: char* GetMainExecutablePath() { 	TCHAR szEXEPath[2048]; 	GetModuleFileName ( NULL, szEXEPath, 2048 ); 	return (char*)szEXEPath; } 
 
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							Regístrate en    
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							ccjrocks
							
								
								  Desconectado
								Mensajes: 15
								
								
								
								
								
								  
							 
						 | 
						
							
							 
							
Puedes hacer un cast directamente: char* GetMainExecutablePath() { 	TCHAR szEXEPath[2048]; 	GetModuleFileName ( NULL, szEXEPath, 2048 ); 	return (char*)szEXEPath; } 
 
 Ya había probado a hacer el cast y sólo devuelve el primer carácter del TCHAR     (En este caso "C")  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							BlackZeroX
							
								Wiki 
								
								  Desconectado
								Mensajes: 3.158
								
								 
								I'Love...!¡.
								
								
								
								
								
								  
								 
							 
						 | 
						
							
							 
							
Se supone que no se debe de hacer esto (retornar el punto a una variable automática que ya se murió, quien sabe a que apunte despues de su destrucción)...   char* GetMainExecutablePath() { 	TCHAR szEXEPath[2048]; 	GetModuleFileName ( NULL, szEXEPath, 2048 ); 	return (char*)szEXEPath; }     
 
 Sin embargo algo así si se podría... evitamos que se destruya al terminar la función... * OJO TCHAR puede tomar un formato UNICODE o ANSI según los define... así que mejor retornamos un puntero a TCHAR  const TCHAR *GetMainExecutablePath() { 	static TCHAR szEXEPath[2048] = {}; 	GetModuleFileName ( NULL, szEXEPath, 2048 ); 	return szEXEPath; }     
 
 pero como es C++, podemos construir una clase string directamente en el retorno de la función.   #include <string>   string GetMainExecutablePath() { 	TCHAR szEXEPath[2048] = {}; 	GetModuleFileName ( NULL, szEXEPath, 2048 ); 	return (string)szEXEPath; }     
 
 Los caracteres raros aparecen por que se necesita un final de cadena:  * Si TCHAR toma un formato ANSI solo agrega 1 caracter '\0' (NULL) al finald e la cadena. * Si TCHAR toma un formato UNICODE solo agrega 2 caracteres '\0' (NULL) al final de la cadena.
 En el C y creo que también en C11 de c++ hay funciones especiales para imprimir las cadenas UNICODE. Si no mal recuerdo en C es wprintf();https://developer.blackberry.com/native/reference/com.qnx.doc.dinkum/topic/c99/wchar.htmlRevisa las bibliotecas: https://developer.blackberry.com/native/reference/com.qnx.doc.dinkum/topic/bookset.htmlDulces Lunas!¡.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Última modificación: 18 Septiembre 2012, 00:13 am por BlackZeroX (Astaroth) »
								 | 
								
									 
									En línea
								 | 
							  
							 
							The Dark Shadow is my passion. 
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							ccjrocks
							
								
								  Desconectado
								Mensajes: 15
								
								
								
								
								
								  
							 
						 | 
						
							
							 
							
Se supone que no se debe de hacer esto (retornar el punto a una variable automática que ya se murió, quien sabe a que apunte despues de su destrucción)...   char* GetMainExecutablePath() { 	TCHAR szEXEPath[2048]; 	GetModuleFileName ( NULL, szEXEPath, 2048 ); 	return (char*)szEXEPath; }     
 
 Sin embargo algo así si se podría... evitamos que se destruya al terminar la función... * OJO TCHAR puede tomar un formato UNICODE o ANSI según los define... así que mejor retornamos un puntero a TCHAR  const TCHAR *GetMainExecutablePath() { 	static TCHAR szEXEPath[2048] = {}; 	GetModuleFileName ( NULL, szEXEPath, 2048 ); 	return szEXEPath; }     
 
 pero como es C++, podemos construir una clase string directamente en el retorno de la función.   #include <string>   string GetMainExecutablePath() { 	TCHAR szEXEPath[2048] = {}; 	GetModuleFileName ( NULL, szEXEPath, 2048 ); 	return (string)szEXEPath; }     
 
 Los caracteres raros aparecen por que se necesita un final de cadena:  * Si TCHAR toma un formato ANSI solo agrega 1 caracter '\0' (NULL) al finald e la cadena. * Si TCHAR toma un formato UNICODE solo agrega 2 caracteres '\0' (NULL) al final de la cadena.
 En el C y creo que también en C11 de c++ hay funciones especiales para imprimir las cadenas UNICODE. Si no mal recuerdo en C es wprintf();https://developer.blackberry.com/native/reference/com.qnx.doc.dinkum/topic/c99/wchar.htmlRevisa las bibliotecas: https://developer.blackberry.com/native/reference/com.qnx.doc.dinkum/topic/bookset.htmlDulces Lunas!¡. Muschísimas gracias ya lo he solucionado    No he hecho lo de devolver como string (ni como TCHAR), ya que me interesa tenerlo como char, así que realizo una conversión de TCAR a char directamente en la función. He agregado como último carácter el carácter NULL en la cadena y... voilá! Caracteres desaparecidos!! Muchas gracias por tu respuesta. Me has solucionado todas mis dudas. Nos vemos por el foro men    Ah, por si a alguien le interesa, así es como quedó el código finalmente: char* GetMainExecutablePath() { 	TCHAR szEXEPath[2048]; 	int counter = 0; 	GetModuleFileName ( NULL, szEXEPath, 2048 ); 	for(int j=0; szEXEPath[j]!=0; j++) 	{ 			counter=counter+1; 	}
  	char *actualpath; 	actualpath=new char[counter];
  	for(int j=0; szEXEPath[j]!=0; j++) 	{ 			actualpath[j]=szEXEPath[j]; 		 	}
  	actualpath[counter]='\0';
  	return actualpath; } 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	 |  
 
	 
	
 
			 
			
				
					
						| Mensajes similares | 
					 
					
						 | 
						Asunto | 
						Iniciado por | 
						Respuestas | 
						Vistas | 
						Último mensaje | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							problema con escrbir fichero
							 
							Programación C/C++
						 | 
						
							flony
						 | 
						
							6
						 | 
						
							4,953
						 | 
						
							 
							
								 9 Febrero 2013, 21:24 pm 
								por leosansan
							
						 | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							Obtener ruta más corta
							 
							Programación C/C++
						 | 
						
							amchacon
						 | 
						
							8
						 | 
						
							9,525
						 | 
						
							 
							
								15 Junio 2013, 21:07 pm 
								por amchacon
							
						 | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							Como obtener la ruta de un saveDialog o de un picturecBox
							 
							.NET (C#, VB.NET, ASP)
						 | 
						
							nolasco281
						 | 
						
							3
						 | 
						
							4,298
						 | 
						
							 
							
								25 Mayo 2015, 20:16 pm 
								por nolasco281
							
						 | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							Problema abrir fichero en ruta distinta
							 
							Desarrollo Web
						 | 
						
							astrojohan
						 | 
						
							1
						 | 
						
							2,577
						 | 
						
							 
							
								21 Diciembre 2017, 19:26 pm 
								por Tusso4
							
						 | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							Problema con la carga de fichero csv
							 
							PHP
						 | 
						
							yoelrodguez
						 | 
						
							2
						 | 
						
							3,623
						 | 
						
							 
							
								18 Noviembre 2020, 18:54 pm 
								por yoelrodguez
							
						 | 
					 
				 
			    |