Dudas varias con allegro

Resuelve tus dudas sobre emulación y reconstrucción
User avatar
Chacal
Usuario habitual
Posts: 20
Joined: Sun Dec 31, 2006 2:15 pm
Location: Los Barrios

Dudas varias con allegro

Postby Chacal » Fri Jan 05, 2007 6:07 pm

Muy buenas. :)

Necesito saber si hay sustituto para la funcion de itoa (me parece que es asi) que cambia de int a char ,en la biblioteca allegro, ya que cuando uso la funcion de stdlib, esta me bloquea el programa (solo cuando uso allegro).

Tambien necesito que me ayuden a como usar la funcion de ustrcpy que es para copiar strings, pero yo hacia cosas con la de string.h que no puedo hacer aqui, se me bloquea, como por ejemplo:
char *str1
ustrcpy(str1, "qwerty");
para meter el valor a str1.

Espero me puedan ayudar, un saludo!
1488

Postby 1488 » Fri Jan 05, 2007 9:52 pm

yo hacia cosas con la de string.h que no puedo hacer aqui, se me bloquea, como por ejemplo:
char *str1
ustrcpy(str1, "qwerty");
para meter el valor a str1.
Primero tienes que reservar la memoria, prueba algo así:

// Pon en este define el tamaño máximo de la cadena
#define STRING_LEN 100
#define ERROR_CODE -1
char *str;
str=(char *)malloc(sizeof(char)*STRING_LEN);
if (str==NULL) exit(ERROR_CODE); else strcpy(str,"qwerty");

Libera la memoria cuando ya no la uses:
free(str);

Bueno, esto mas o menos, sobre lo de un sustituto de itoa puedes probar con la función sprintf, aunque no tiene ningún sentido que falle itoa, seguramente estarás haciendo algo mal. :? Postea el código a ver si te podemos echar una mano.

Saludos.
User avatar
Chacal
Usuario habitual
Posts: 20
Joined: Sun Dec 31, 2006 2:15 pm
Location: Los Barrios

Postby Chacal » Sat Jan 06, 2007 1:55 am

Entocnes por lo que veo, ¿cada vez que uso una funcion que le tengo k meter un puntero vacio tengo que asignarle memoria siempre?, es que esto antes no me ha hecho falta en la libreria la estandar, pero ya me ha pasado con alguna otra funcion tambien de las 2 librerias.

Un Saludo y gracias, probare a asignarle memoria.
User avatar
Chacal
Usuario habitual
Posts: 20
Joined: Sun Dec 31, 2006 2:15 pm
Location: Los Barrios

Postby Chacal » Sat Jan 06, 2007 10:19 pm

ya si me funciona lo de los strings,aunque me falla otra cosa, este era el codigo en cuestion, este cargara una imagen que sera una lista de tiles y lo devolvera, para construir un mapa para el juego luego, y se mostrara entera la lista tambien mediante otra funcion.

Code: Select all

BITMAP cargar_tileset(int nivel){
     BITMAP *tileset;
     PALETTE tilesetpal;
     char *archivo;
     archivo =(char*)malloc(sizeof(char)*STRING_LEN);
     switch(nivel)
     {
           case 1:
                ustrcpy(archivo, "niveles\\1nivel.bmp");
                break;
           case 2:
                ustrcpy(archivo, "niveles2nivel.bmp");
                break;
     }

     
     
     if((tileset = load_bitmap(archivo,tilesetpal)) == NULL){
         //para comprobar
          allegro_message("No se pudo cargar el nivel");
          allegro_message(archivo);
     }
     else
     {
         allegro_message("Se cargo el nivel");
     }
     return *tileset;
}
El problema es que esto deberia de devolverme el bitmap ya cargado, entonces, fuera dodne uso esta funcion, creo un bitmap y lo asigno a lo que devielve la funcion asi:

Code: Select all

BITMAP *tileset;
tileset = cargar_tileset(1);
Y nada no funciona no entiendo por que no, ¿alguien sabe como puedo hacerlo? y que me explique por favor por que no funcionaba, el c este me toca las narices... ¬¬ si no fuera por que en el instituto es c lo que me estan dando, ya estaba probando otras cosas...

Un Saludo!
User avatar
traperic
Usuario avanzado
Posts: 75
Joined: Sun Apr 10, 2005 3:06 pm
Contact:

Postby traperic » Sun Jan 07, 2007 9:33 am

Prueba con esto:

Code: Select all

BITMAP * cargar_tileset(int nivel)
{
BITMAP * tileset; 
PALETTE tilesetpal; 
char *archivo; 

	archivo =(char*)malloc(sizeof(char)*STRING_LEN); 
	switch(nivel) 
	{
		case 1:
			ustrcpy(archivo, "niveles1nivel.bmp"); 
			break;
		case 2:
			ustrcpy(archivo, "niveles2nivel.bmp");
			break; 
	}

	if((tileset = load_bitmap(archivo,tilesetpal)) == NULL)
	{
		//para comprobar 
		allegro_message("No se pudo cargar el nivel");
		allegro_message(archivo);
	}
	else
	{
		allegro_message("Se cargo el nivel");
	}
	return tileset;
}
Si todavía falla mira bien la ruta donde tienes los .bmp. De todos modos, procura poner también el fallo que te da el compilador para que en el futuro nos sea más sencillo echarte una mano. :wink:

No desesperes, poco a poco irás cogiendo el truco al C... antes de que lo haga Benway :P, te voy a remitir a esta página web: http://c.conclase.net
El curso que tienen de C/C++ es bastante bueno, mírate con especial atención los capítulos sobre los punteros y la asignación de memoria.

Un saludo y suerte.
User avatar
R Granado
Usuario avanzado
Posts: 124
Joined: Fri Jul 25, 2003 10:39 am

implmentación de itoa()

Postby R Granado » Sun Jan 07, 2007 12:19 pm

Hola,

Yo también he tenido problemas con la función itoa() de vez en cuando, por ejemplo, no la encontraba en Linux :?:

Te paso una implementación de itoa(), seguramente es mejorable (la acabo de hacer en un ratito recordando otra que hice tiempo atrás y que no recuerdo donde guarde).

Code: Select all

#include <stdio.h>
#include <stdlib.h>	// Para malloc
 
/// Representa un entero en una cadena dada una base
/// @param value	Entero a representar
/// @param base		Base numerica en la que se representara el numero
/// @return	Puntero a un nuevo string (se ha de liberar posteriormente con free())
char * itoaReplacement(int value, int base)
{
	int tmp_value = value;
	int length = 0, i;
	char digits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};   
	char *string;
	
	// Calcula el tamaño de cadena que se necesitara y reserva memoria
	if(value == 0)
	{
		length = 1;
	}
	else
	{
		while(tmp_value > 0)
		{
			tmp_value /= base;
			length++;
		}
	}

	string = (char *) malloc((length + 1) * sizeof(char));
	
	// Escribimos el numero en la caden
	for(i = length; i != 0; i--, value /= base)
	{
		string[i - 1] = (digits[value % base]);
	}

	// Y marcamos el final de cadena
	string[length] = 0;
	
	return string;
} 

// Ejemplo
int main(int argc, const char * argv[])
{
	char *strNumber;
	int intNumber = 652368;
	
	strNumber = itoaReplacement(intNumber, 10);
    printf("%d en decimal: %s\n", intNumber, strNumber);
	free(strNumber);
	strNumber = itoaReplacement(intNumber, 2);
	printf("%d en binario: %s\n", intNumber, strNumber);
	free(strNumber);
	strNumber = itoaReplacement(intNumber, 16);
	printf("%d en hexadecimal: %s\n", intNumber, strNumber);
	free(strNumber);
	strNumber = itoaReplacement(intNumber, 8);
	printf("%d en octal: %s\n", intNumber, strNumber);
	free(strNumber);
	
    return 0;
}
La salida que me da es:

Code: Select all

[Session started at 2007-01-07 12:09:40 +0100.]
652368 en decimal: 652368
652368 en binario: 10011111010001010000
652368 en hexadecimal: 9F450
652368 en octal: 2372120

itoa has exited with status 0.
Adaptala como quieras a tus necesidades, puedes por ejemplo hacer que no cree un nuevo string en cada llamada, sino que utilice uno que tu le des, ahorrate el calculo del tamaño de cadena y pasarselo como parametro, etc...

Un saludo y animo.
No importa cuantas veces fracase, inténtelo de nuevo
User avatar
Chacal
Usuario habitual
Posts: 20
Joined: Sun Dec 31, 2006 2:15 pm
Location: Los Barrios

Postby Chacal » Sun Jan 07, 2007 2:55 pm

Muchas gracias a los dos!
Traperic, ya me funciona, es que antes estuve probando de la otra manera que vistes en el codigo, y o bien el compilador me decia que la comparacion era entre tipos no comptibles, o bien compilaba y al llegar al sitio del codigo el programa bloqueaba y se cerraba. Claro... no tiene sentido hacer un return *tileset si estas indicando que la función va a tener una salida de Bitmap (sin puntero) lo tenia que poner ahi :? es por eso verdad?

R Granado, muchas gracias por compartir ese codigo, me servira en muchas ocasiones ;) no se que pasa con el itoa ese :S

Un Saludo y gracias!

Return to “Consultas”

Who is online

Users browsing this forum: No registered users and 2 guests