Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Ayuda puntero a char dentro de una estructura

Estas en el tema de Ayuda puntero a char dentro de una estructura en el foro de C/C++ en Foros del Web. Hola mi problema es el siguiente yo tengo una estructura typedef struct{ int x; int y; } COORD; typedef struct{ COORD coord1; COORD coord2; char ...
  #1 (permalink)  
Antiguo 15/07/2006, 20:06
IEN
 
Fecha de Ingreso: julio-2006
Mensajes: 1
Antigüedad: 18 años, 5 meses
Puntos: 0
Ayuda puntero a char dentro de una estructura

Hola mi problema es el siguiente yo tengo una estructura

typedef struct{
int x;
int y;
} COORD;

typedef struct{
COORD coord1;
COORD coord2;
char *text;
} TEXTBOX;



En el main yo tengo


TEXTBOX *textbox = malloc (sizeof(TEXTBOX)*1);




y luego hago lo siguiente


textbox[0].coord1.x = 0;
textbox[0].coord1.y = 0;
textbox[0].coord2.x = 100;
textbox[0].coord2.y = 100;
textbox->text = malloc (sizeof (char) * 10); // los textbox pueden tener
hasta 9 letras sin contar el null final
memset(textbox[0].text,'\0',10);//Lo lleno de nulls para limpiar la cadena y asegurarme que las letras que ingrese tengan final

Tecnicamente estoy creando un puntero a un tipo, que es textbox, y luego reservo la memoria para tener uno solo de esos tipos...
Luego digo que el puntero a char, o sea el texto del textbox, reserver en memoria capacidad para 10 chars....

textbox apunta a un tipo TEXTBOX maloqueado en memoria y de ese tipo textbox text apunta a 10 chars maloqueados

esto
textbox[0].text[0]="a";

Me tira error :S No portable pointer conversion :S... no entiendo porque !...
ademas si utilizo el watch y pongo me va devolviendo esto...
textbox[0].text[0]='\0'
textbox[0].text[1]='\0'
textbox[0].text[2]='\0'
textbox[0].text[3]='\0'
textbox[0].text[4]='\0'

ahora bien... si yo hago esto

textbox[0].text="a"

no me tira error, pero se produce algo medio extraño quedando esto
textbox[0].text[0]='a'
textbox[0].text[1]='\0'
textbox[0].text[2]='['
textbox[0].text[3]='f'
textbox[0].text[4]='¿'
como que la memoria se llenara de basura :S...


Sinceramente no entiendo que carajo pasa :S... logicamente esta bien pensado pero algo ta fallando :S
Lo que me da bronca es que yo tambien tengo esto...



typedef struct{
COORD coord1;
COORD coord2;
int cheked;
int pressed;
} CHECK;

typedef struct{
COORD coord1;
COORD coord2;
int elementos;
int frame;
CHECK *check;
} CHECKBOX;



CHECKBOX *checkbox = malloc(sizeof(checkbox)*1);

checkbox[0].coord1.x =0;
checkbox[0].coord1.y =0;
checkbox[0].coord2.x =10;
checkbox[0].coord2.y =10;
checkbox[0].frame = 1;
checkbox[0].elementos = 4;

checkbox->check = malloc(sizeof(CHECK)* checkbox[0].elementos);
for (n=0; n<checkbox[0].elementos; n++){
checkbox[0].check[n]=;

//Aca dentro le meto todos los datos a los checks no es importante
}


Ahora bien el segundo cajo es todavia mas complejo que el primero pero no me tira error de puntero ni nada :S

no entiendo porque no puedo manejar la cadena como vector :S... lo peor es que cuando el puntero a char no esta dentro de una estructura

char *cadena;

cadena = malloc(sizeof(char)*10);
memset(cadena,'\0',10);
cadena[0]="H";
cadena[1]="O";
cadena[2]="L";
cadena[3]="A" ;


ESTO SI ES VALIDO !




PORQUEEEEEEEEEEEEEEEEEEEE

PD: El lenguaje es C :P... y el compilador que uso es el borland turbo c++ 3.0



saludos y gracias de antemano ^^
  #2 (permalink)  
Antiguo 16/07/2006, 07:23
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 10 meses
Puntos: 22
Hola IEN.
El problema esta en:
Código:
textbox[0].text[0] = "a";
Lo correcto seria:
Código:
textbox[0].text[0] = 'a';
El problema es que estas tratando de asignar un valor de tipo const char* a una variable de tipo char.
En otras palabras lo que haces es tratar de asignar una cadena a uno de los elementos de la cadena que en su caso debería ser un caracter.

La otra parte en donde haces:
Código:
textbox[0].text = "a";
es valida puesto que asignas un valor de tipo const char* a una variable de tipo char*

Solo que OJO en estos casos porque aunque el compilador lo permita hay que tener cuidado, por ejemplo:
Código:
char* micadena = "HOLA"; // char* = const char* lo permite el compilador
//micadena[0] = 'C'; // salta el error pero en tiempo de ejecución
/*si quitamos el comentario a la linea anterior tendriamos un error 
puesto que estamos intententando modificar un valor constante*/
Estos errores son difíciles de detectar porque se dan en tiempo de ejecución
por eso lo mas recomendable es tener cosas como:
Código:
const char* micadena = "HOLA";
micadena[0] = 'C'; // salta el error pero en tiempo de compilación
Por último un breve comentario creo que sería mas recomendable que utilizaras el operador "->" de manera uniforme.

Saludos.
  #3 (permalink)  
Antiguo 17/07/2006, 00:20
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 8 meses
Puntos: 2
agregar que es muy raro asignar aun char*, una cadena caracter a caracter, lo mejor es la asignacion de la cadena completa al puntero, pero ojo, con esto, ya lo hiciste y te ha sorprendido, ya que te encontraste con vasura, por que, si segun tu llenaste todo de '\0', no?.
si llenaste de '\'', la memmoria recervada pero al asignar la cadena "a" a text, estas cambiando un puntero por otro, ahi hay otro error mas, estas perdiendo memoria, la que antes recervaste.

lo que se hace es copiar la cadena en la memoria, y para eso esta strcpy

seria.:

strcpy(textbox->text, "Hola");

esto en los casos de asignar una cadena a otra, de esta forma aprovecharias la memoria recervada.

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:21.