strcpy( text, "" );
text[0] = '\0';
SuperJMN escribió:Como te apuntan ahí, si tienes un puntero a char (char*), para que sea una cadena vacía se hace con:
cadena[0]='/0'
o también con
*cadena=0;
Recuerda que cuando usas cadenas, antes debes haber asignado espacio para almacenar los datos.
Si la cadena está inicializada en tiempo de compilación, el compilador hace esto por ti, pero si no, tendrás que usar funciones de gestión de memoria.
cadena[0] = NULL
Plata escribió:algo como:
text[1] = "";
salu2
ANTONIOND escribió:Plata escribió:algo como:
text[1] = "";
salu2
Y te dejas la primera letra del array sin borrar... Suponiendo que funcione, claro, porque no se yo si funcionaría...
Plata escribió:algo como:
text[1] = "";
salu2
letra = PA_CheckKeyboard();
if (letra > 31) {
text[nletra]=letra;
nletra++;
}
else if ((letra == PA_BACKSPACE)&&nletra) {
nletra--;
text[nletra]=" ";
}
letra = PA_CheckKeyboard();
if (letra > 31) {
strcpy(text[nletra],letra);
nletra++;
}
else if ((letra == PA_BACKSPACE)&&nletra) { v
nletra--;
strcpy(text[nletra]," ");
}
keda escribió:es porque el strcpy es para cadenas (string copy), y tu estas intentando copiar un char que no es una cadena (letra) a otro char que, aunque sí sea una cadena, la estás poniendo con una dirección de memoria determinada (los corchetes de text[nletra]).
m3dssimply escribió:keda escribió:es porque el strcpy es para cadenas (string copy), y tu estas intentando copiar un char que no es una cadena (letra) a otro char que, aunque sí sea una cadena, la estás poniendo con una dirección de memoria determinada (los corchetes de text[nletra]).
Entonces como lo arreglo para que me funcione?
Suikoden77 escribió:m3dssimply escribió:keda escribió:es porque el strcpy es para cadenas (string copy), y tu estas intentando copiar un char que no es una cadena (letra) a otro char que, aunque sí sea una cadena, la estás poniendo con una dirección de memoria determinada (los corchetes de text[nletra]).
Entonces como lo arreglo para que me funcione?
letra = PA_CheckKeyboard();
if (letra > 31) {
text[nletra]=letra;
nletra++;
}
else if ((letra == PA_BACKSPACE)&&nletra) { v
nletra--;
text[nletra]=" ";
}
Prueba eso, como solo asignas un caracter, no tienes que usar strcpy. Saluts
Suikoden77 escribió:tendriamos que ver mas parte del codigo, entonces
#ifndef JUEGO_H
#define JUEGO_H
void teclado(u8 num,char resp[num], u8 next);
char text[200];
s32 nletra = 0;
char letra = 0;
void teclado(u8 num,char resp[num], u8 next){
if(teclado1 == false){
PA_InitText(1, 0);
PA_InitKeyboard(2);
PA_KeyboardIn(20, 95);
teclado1 = true;
}
letra = PA_CheckKeyboard();
if (letra > 31) {
text[nletra]=letra;
nletra++;
}
else if ((letra == PA_BACKSPACE)&&nletra) {
nletra--;
text[nletra]=" ";
}
PA_OutputSimpleText(1, 8, 11, text);
if (letra == PA_ENTER && strcmp(text,resp) == 0){
switch (next)
{
case 1:
PA_OutputSimpleText(1, 7, 1, "Bien ");
juego4 = false;
juego1 = true;
PA_ClearTextBg(1);
text[0]='\0';
nivel1();
break;
case 2:
PA_OutputSimpleText(1, 7, 1, "Bien ");
juego1 = false;
juego2 = true;
PA_ClearTextBg(1);
text[0]='\0';
nivel2();
break;
case 3:
PA_OutputSimpleText(1, 7, 1, "Bien ");
juego2 = false;
juego3 = true;
PA_ClearTextBg(1);
text[0]='\0';
nivel3();
break;
case 4:
PA_OutputSimpleText(1, 7, 1, "Bien ");
juego3 = false;
juego4 = true;
PA_ClearTextBg(1);
text[0]='\0';
nivel4();
}
}
if (letra == PA_ENTER && strcmp(text,resp) != 0){
PA_OutputSimpleText(1, 7, 1, "Mal ");
}
}
#endif
#ifndef NIVEL1_H
#define NIVEL1_H
void nivel1 (void);
void nivel1 (void){
teclado(7,"platano",2);
}
#endif
#ifndef NIVEL1_H
#define NIVEL1_H
void nivel1 (void);
void nivel1 (void){
teclado(7,"platano",2);
}
#endif
Suikoden77 escribió:m3dssimply escribió:keda escribió:es porque el strcpy es para cadenas (string copy), y tu estas intentando copiar un char que no es una cadena (letra) a otro char que, aunque sí sea una cadena, la estás poniendo con una dirección de memoria determinada (los corchetes de text[nletra]).
Entonces como lo arreglo para que me funcione?
letra = PA_CheckKeyboard();
if (letra > 31) {
text[nletra]=letra;
nletra++;
}
else if ((letra == PA_BACKSPACE)&&nletra) { v
nletra--;
text[nletra]=" ";
}
Prueba eso, como solo asignas un caracter, no tienes que usar strcpy. Saluts
Sepho escribió:Suikoden77 escribió:
letra = PA_CheckKeyboard();
if (letra > 31) {
text[nletra]=letra;
nletra++;
}
else if ((letra == PA_BACKSPACE)&&nletra) { v
nletra--;
text[nletra]=" ";
}
Prueba eso, como solo asignas un caracter, no tienes que usar strcpy. Saluts
Debería ser text[nletra]=' ';
¿La v de despues de la llave pinta algo? xD
Suikoden77 escribió:Sepho escribió:Suikoden77 escribió:
letra = PA_CheckKeyboard();
if (letra > 31) {
text[nletra]=letra;
nletra++;
}
else if ((letra == PA_BACKSPACE)&&nletra) { v
nletra--;
text[nletra]=" ";
}
Prueba eso, como solo asignas un caracter, no tienes que usar strcpy. Saluts
Debería ser text[nletra]=' ';
¿La v de despues de la llave pinta algo? xD
Sip, me di cuenta justo despues de que m3dssimply pusiera el codigo de su juego, pero me tuve que ir y no lo arregle. Lo de la v no pinta nada,jeje.
En fin, contestando al autor del post. Creo que la forma de organizar tu proyecto es un poco liosa. Yo lo que haria seria tener una funcion llamada nivel, con un parametro cadena con el nombre de la palabra a acertar, y que devuelva un entero que indique si te pasaste el nivel o no.
Dentro de la funcion nivel cargaria el teclado de la palib, y crearia una cadena del tamaño de la palabra a acertar, en la que todo son espacios, o guiones bajos (puedes usar strlen para conocer el tamaño de la cadena, y luego usar un calloc para crear esta cadena). Luego esperaria a que se llene la palabra y la compararia, si acerto sale del nivel y si no le quitaria una oportunidad (tendrias varias). Al acabar el nivel (ya sea porque has perdido o te lo has pasado) eliminaria el teclado, y punto. Luego en el principal solo tienes que ir llamando a esta funcion, y si quieres entre funcion y funcion poner algun grafico indicando a que nivel quieres acceder, etc.
Ahora, solo tienes que ir cambiando los guiones por las letras, y si le das a borrar sustituirlo otra vez por guiones bajos, (o espacios).
Espero haberme semi explicado.
m3dssimply escribió:¿¿Puedes poner un ejemplo de strlen y calloc??
m3dssimply escribió:¿¿Puedes poner un ejemplo de strlen y calloc??
Suikoden77 escribió:m3dssimply escribió:¿¿Puedes poner un ejemplo de strlen y calloc??
Vamos a ver, supongamos que tienes la funcion nivel, de tipo:
int nivel( char palabra[]){
int longitud=strlen(palabra); //Con esto ya conoces la longitud de la palabra metida.
char * texto
texto = (char *) calloc (longitud, sizeof(char));//puede que sea longitud + 1
int i;
for(i=0;i<longitud;i++) texto[i]=' ';
}
ahi ya tienes creado una cadena de caracteres vacia en la que poder moverse libremente. Puede que algo este mal, ya que hace bastante que no me manejo por c y no me acuerdo como iba lo de las cadenas. chao
char* texto;
u32 nletra = 0;
char letra = 0;
int i;
if(teclado1 == false){
int longitud=strlen(palabra);
texto = (char *) calloc (longitud, sizeof(char));
for(i=0;i<longitud;i++){
texto[i]=' ';
}
PA_InitText(1, 0); // Iniciamos el texto
PA_InitKeyboard(2);// Cargamos el teclado en la capa 2...
PA_KeyboardIn(20, 95);
teclado1 = true;
}
letra = PA_CheckKeyboard();
if (nletra< i){ // esto lo hago para que no se pueda escribir nada mas hasta el tamaño de "palabra"
if (letra > 31) {
texto[nletra]=letra;
nletra++;
}
}
if (nletra >= 1){// esto lo hago para evitar que nletra pase a los numeros negativos
if (letra == PA_BACKSPACE) {
nletra--;
texto[nletra]=" ";
}
}
PA_OutputSimpleText(1, 8, 11, texto);
if (letra == PA_ENTER && strcmp(texto,palabra) == 0){
switch (next)
{
case 2:
PA_OutputSimpleText(1, 10, 1, "Bien ");
juego1 = false; // esto es por que en el main.c tengo puesto booleanos , de k si juego 1 es true pues vas al nivel 1 , si el nivel 2 es true pues vas al nivel 2 etc
juego2 = true;
PA_ClearTextBg(1);
texto[0]='\0';
teclado1 = false;
nivel2();
break;
// aqui van mas case pero son mas o menos =
void nivel( char palabra[], int next);
char* texto;
u32 nletra = 0;
char letra = 0;
int i;
void nivel( char palabra[], int next){
if(teclado1 == false){
int longitud=strlen(palabra);
texto = (char *) calloc (longitud, sizeof(char));
for(i=0;i<longitud;i++){
texto[i]=' ';
}
PA_InitText(1, 0); // Iniciamos el texto
PA_InitKeyboard(2);// Cargamos el teclado en la capa 2...
PA_KeyboardIn(20, 95);
teclado1 = true;
}
letra = PA_CheckKeyboard();
if (nletra< i){
if (letra > 31) {
texto[nletra]=letra;
nletra++;
}
}
if (nletra >= 1){
if (letra == PA_BACKSPACE) {
nletra--;
texto[nletra]=" ";
}
}
PA_OutputSimpleText(1, 8, 11, texto);
if (letra == PA_ENTER && strcmp(texto,palabra) != 0){
PA_OutputSimpleText(1, 7, 1, "Mal ");
}
if (letra == PA_ENTER && strcmp(texto,palabra) == 0){
switch (next)
{
case 1:
PA_OutputSimpleText(1, 7, 1, "Bien ");
juego4 = false;
juego1 = true;
nivel1();
break;
case 2:
PA_OutputSimpleText(1, 10, 1, "Bien ");
juego1 = false;
juego2 = true;
PA_ClearTextBg(1);
texto[0]='\0';
teclado1 = false;
nivel2();
break;
case 3:
PA_OutputSimpleText(1, 7, 1, "Bien ");
juego2 = false;
juego3 = true;
nivel3();
break;
case 4:
PA_OutputSimpleText(1, 7, 1, "Bien ");
juego3 = false;
juego4 = true;
nivel4();
}
}
}
#endif
// Includes
#include <PA9.h> // Include for PA_Lib
#include <string.h> //Es para que puedas usar funciones como strlen, strcpy. Si no lo pones, no
//funcionan!!
/*Solo te enseño como debería de ser la función nivel, el resto lo tendras que hacer tu.
pero por favor, lo que me pasaste era un caos, asi que lo mejor sera que dejes de hacer includes
sin sentido y trabajar todo en el main, que tampoco creo que vayas a tener un proyecto enorme
como para tener que dividir funcion por funcion*/
int nivel(char palabra[]);
/*Aqui antes del main declaras todas las funciones que vas a usar. El int de esta funcion
significa que devuelve un entero, que es para lo que se usa el return. En mi caso lo usaré
para ver si se paso el nivel. ¿Dónde desarrollas las funciones? Debajo del main.*/
int main(int argc, char ** argv){
PA_Init();
PA_InitVBL();
PA_InitText(1, 0);
int juego[5];//En vez de usar juego1,juego2,juego3, puedes crear un array de enteros que es mas comodo.
// Infinite loop to keep the program running
while (1){
juego[0]=nivel("zapato");
juego[1]=nivel("cardo");
juego[2]=nivel("salto");
PA_WaitForVBL();
}
return 0;
}
int nivel( char palabra[]){
int i;
int nletra=0;
int letra;
int salir=0;
int longitud=strlen(palabra);
char *texto;
texto = (char *) calloc (longitud, sizeof(char));
for(i=0;i<longitud;i++){
texto[i]=' ';
}
PA_InitKeyboard(2);// Cargamos el teclado en la capa 2...
PA_KeyboardIn(20, 95);
while(!salir){//Supongo que la condicion de salida es acertar la palabra
PA_WaitForVBL();
letra = PA_CheckKeyboard();
if (nletra< longitud && letra>31){
texto[nletra]=letra;
nletra++;
}
if (nletra >= 1 && letra==PA_BACKSPACE){
nletra--;
texto[nletra]=' ';
}
//PA_OutputSimpleText(1, 8, 11, texto);ESTO TE FUNCIONA??
PA_OutputText(1,8,11,"%s",texto);
if (letra == PA_ENTER && strcmp(texto,palabra) != 0){
PA_OutputSimpleText(1, 7, 1, "Mal ");
}
if (letra == PA_ENTER && strcmp(texto,palabra) == 0){
PA_OutputSimpleText(1, 7, 1, "Bien ");
salir=1;
}
}
free(texto);
PA_OutputText(1,8,11," ");
PA_KeyboardOut();
return salir;
}
Suikoden77 escribió:A ver, aqui te paso lo que he hecho. Hazme caso de lo que te digo en algunos puntos. Saludos// Includes
#include <PA9.h> // Include for PA_Lib
#include <string.h> //Es para que puedas usar funciones como strlen, strcpy. Si no lo pones, no
//funcionan!!
/*Solo te enseño como debería de ser la función nivel, el resto lo tendras que hacer tu.
pero por favor, lo que me pasaste era un caos, asi que lo mejor sera que dejes de hacer includes
sin sentido y trabajar todo en el main, que tampoco creo que vayas a tener un proyecto enorme
como para tener que dividir funcion por funcion*/
int nivel(char palabra[]);
/*Aqui antes del main declaras todas las funciones que vas a usar. El int de esta funcion
significa que devuelve un entero, que es para lo que se usa el return. En mi caso lo usaré
para ver si se paso el nivel. ¿Dónde desarrollas las funciones? Debajo del main.*/
int main(int argc, char ** argv){
PA_Init();
PA_InitVBL();
PA_InitText(1, 0);
int juego[5];//En vez de usar juego1,juego2,juego3, puedes crear un array de enteros que es mas comodo.
// Infinite loop to keep the program running
while (1){
juego[0]=nivel("zapato");
juego[1]=nivel("cardo");
juego[2]=nivel("salto");
PA_WaitForVBL();
}
return 0;
}
int nivel( char palabra[]){
int i;
int nletra=0;
int letra;
int salir=0;
int longitud=strlen(palabra);
char *texto;
texto = (char *) calloc (longitud, sizeof(char));
for(i=0;i<longitud;i++){
texto[i]=' ';
}
PA_InitKeyboard(2);// Cargamos el teclado en la capa 2...
PA_KeyboardIn(20, 95);
while(!salir){//Supongo que la condicion de salida es acertar la palabra
PA_WaitForVBL();
letra = PA_CheckKeyboard();
if (nletra< longitud && letra>31){
texto[nletra]=letra;
nletra++;
}
if (nletra >= 1 && letra==PA_BACKSPACE){
nletra--;
texto[nletra]=' ';
}
//PA_OutputSimpleText(1, 8, 11, texto);ESTO TE FUNCIONA??
PA_OutputText(1,8,11,"%s",texto);
if (letra == PA_ENTER && strcmp(texto,palabra) != 0){
PA_OutputSimpleText(1, 7, 1, "Mal ");
}
if (letra == PA_ENTER && strcmp(texto,palabra) == 0){
PA_OutputSimpleText(1, 7, 1, "Bien ");
salir=1;
}
}
free(texto);
PA_OutputText(1,8,11," ");
PA_KeyboardOut();
return salir;
}
Por cierto, te aconsejaría que usaras las funciones tolower o toupper porque puede que por una diferencia en el tamaño de la letra creas que la estas cagando. Quiero decir, para C Alto y alto son palabras diferentes.