problemilla con C

432 7
 #1
Escrito   0  0  
Hola!

mañana tengo un examen tipo test, y me estoy volviendo loco!!!!

tengo los controles del insti, y hay muchas cosas q el profesor dice, y que el programa no hace!!

uno de los ejemplos es este:

int main()
{ int *p1 , *p2 ,*p3 , i ;
p1 = “hola” ;
p2 = “adios” ;
p3 = p2 = p1 ;
for ( i = 4 ; i > 0 ; i – – ) printf ( "%c", *( p3++ ) ) ;
}


A mi el compilador me dice que nanai, que p1 es int, y yo lo veo lógico, debería ser char para que funcionara...

pero el dice q funciona igual, y que la consecuencia de que sean int es que el puntero se mueve de dos en dos caracteres, devilviendome algo así como "hl"


Alguien lo entiende?

Gracias!

Saludos!

Una vez me dijeron que si tenés una vida complicada y difícil quiere decir que existís... Creo que yo existo demasiado...
 #2
Escrito   0  0  
Es cierto lo que dice el profesor en cuanto al avance de dos bytes en dos bytes... el problema de ese código es que cuando haces p1 = "hola", estás efectivamente usando p1 como char* y no int*. Dependiendo del compilador (e incluso de las opciones de compilación en uso) esto puede darte el error que dices o no. Para que funcione, necesitas hacer un cast del tipo ((char*)p1) = "hola" (y aún así puede que algún compilador no trague).

De todas formas, el código me parece absolutamente HORRENDO... hace daño a la vista.

Saludos.
 #3
Escrito   0  0  
gracias por contestar!

bueno, el examen ya fue, lo parobé, supongo q me saco un 7 o un 7 con algo...


gracias de todos modos!

Una vez me dijeron que si tenés una vida complicada y difícil quiere decir que existís... Creo que yo existo demasiado...
 #4
Escrito   0  0  
Una cosa, aunque aprobases el tema y es que me ha picado la curiosidad porque de la programación que yo se (aunque no es C sino C++) no entiendo muy bien ese código...

¿Cómo asignas valores de texto a un puntero? ¿No tendrás que crear primero el campo al que apunta?

Yo interpreto que el código a usar sería:

p1= new string;
p1= "hola";

Por ejemplo, claro que para eso habría que declarar el puntero p1 como string, no como int.

La otra opción que se me ocurre pero que nunca jamás había visto antes es que la instrucción:

p3 = p2 = p1 ;

haga que p3 apunte a p2 que a su vez apunta a p1 (cosa que no tiene ningún sentido si estos están apuntando a un contenido de texto) de forma que el bucle al hacer *(p3++) señale al siguiente puntero.

Si alguien entiende lo suficiente por favor que me lo aclare porque o ese código está fatal o estoy descubriendo cosas muy nuevas emoticon sonrisa

«Es precisamente el derecho de expresar libremente las ideas más espantosas el que debe ser defendido con mayor vigor; es demasiado fácil defender la libertad de expresión de quienes no necesitan ser defendidos»

- Noam Chomsky en referencia a un negador del Holocausto judío
 #5
Escrito   0  0  
(Usuario baneado)
 #6
Escrito   0  0  
Ese codigo no se si te lo ha dado tu profesor o alguien pero esta muy muy mal.

Para empezar, int *p1 con esto estas declarando un tipo dinamico, que es ENTERO, utilizada para enteros, no caracteres. Pero bueno, de todos modos, se puede declarar como Entero, pero luego a la hora de insertar un texto, hacer un casting, como proponia sabredan.

Otra cosa, p3 = p2 = p1 eso no tengo ni idea de lo que has intentado hacer, porque si tu intencion es sobreescribirlo y quedarte con que en p3, p2 y p1 valgan HOLA, deberias de hacerlo medianet una copia por referencia, ya que tratando con punteros le tienes que pasar la dierccion. Yo pondria &p3 = &p2 = &p1.

Si lo que querias hacer es concatenar las 2 palabras y guardarlas en p3, tendrias que utilizar la operacion strconcat o strcat ( no recuerdo ). Y tb utilizar la direccion de memoria donde lo guardas, porque si no vas copiando basura.

Ebaristo no necesitas hacer un NEW para crear el vector de caracteres. Es mas facil utilizar o el tipo STRING o directamente la libreria STL. Yo pondria:

char *cadena = "HOLA";
o tb,
string cadena= "HOLA";

Pero no hace falta hacer NEW ni cosas asi.
Lo otro como dije antes trabajando con memoria dinamica, necesitas utilizar la direccion fisica. O sea hay que poner &.

Luego, lo de p3++ es utilizar aritmetica de punteros, es de lo mas eficiente que hay. Pero para que utilizar el bucle, cuando se puede escribir todo de un tiron...
En C++ : cout << p3;
En C : printf("%s",p3);









ANDRES desde GRANADA Ahora tb MADRID
_______________________________________

Art. 14: "Los españoles son iguales ante la ley,sin que pueda prevalecer discriminación alguna por razón de nacimiento, raza, sexo, religión, opinión o cualquier otra condición o circunstancia personal o social".
_______________________________________

Ult. Actualizacion: 6/10/06
 #7
Escrito   0  0  
El código desde luego ya digo que es horrendo... pero según el compilador que se use, puede funcionar sin problemas, ya que los punteros de C son en sí horrendos también emoticon guiño

Saludos.
 #8
Escrito   0  0  
no sé, la verdad es q ya me da exactamente igual!
he sacado un 7,36 en ese examen y pienso no volver a tocar c en mi p*t* vida!!

gracias por las respuestas!

saludos!

Una vez me dijeron que si tenés una vida complicada y difícil quiere decir que existís... Creo que yo existo demasiado...
Volver a Informática