Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DanielPy en 19 Diciembre 2013, 23:53 pm



Título: Array de punteros en lenguaje C.
Publicado por: DanielPy en 19 Diciembre 2013, 23:53 pm
Citar
Hago esta aclaración porque en muchos casos suponen que tengo 15 o 20 años(es lo lógico) y en realidad tengo 61, como comprenderán no voy a la facultad y la gente que conozco no tiene la más mínima idea lo que es la computadora y menos programar.-

Hola a todos.
Aclaro que hace menos de una semana que llegué al capítulo “punteros” en el libro que estoy aprendiendo  C.-
Lo que debería hacer el programa es ordenar el arreglo de punteros para que se muestre Abeja – abeja y no abeja – Abeja, el gran problema que tengo es como declarar temp para que contenga la dirección de memoria de uno de los punteros.-
Espero se entienda de lo contrario por favor consúltenme necesito esto para poder seguir.-

Código:
#include <stdio.h>
#include <string.h>

int main(void){

char *frase[] = {"abeja", "Abeja"};
int i;
i = strcmp( *frase, *(frase+1));
if(i > 0){
temp = frase;
frase = frase+1;
frase+1 = temp;
}
for(i=0; i<2; i++){
printf("%s", *(frase+i));
}


return 0;
}

Saludos.
Daniel
(http://i41.tinypic.com/2mhamg9.jpg)


Título: Re: Array de punteros en lenguaje C.
Publicado por: rir3760 en 20 Diciembre 2013, 02:59 am
Deberias eliminar esto:
Hago esta aclaración porque en muchos casos suponen que tengo 15 o 20 años(es lo lógico) y en realidad tengo 61, como comprenderán no voy a la facultad y la gente que conozco no tiene la más mínima idea lo que es la computadora y menos programar.-
Ya que mientras no infrinjas las reglas de los foros no hay problema.

----

el gran problema que tengo es como declarar temp para que contenga la dirección de memoria de uno de los punteros
La variable temporal debe ser del mismo tipo que los elementos del array "frase": "char *".

Ademas en el intercambio debes aplicar indirección con el operador "*" o "[]". El programa con los cambios:
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(void)
  5. {
  6.   char *frase[] = {
  7.      "abeja",
  8.      "Abeja"
  9.   };
  10.   int i;
  11.  
  12.   if(strcmp(*frase, *(frase + 1)) > 0){
  13.      char *temp = frase[0];
  14.      frase[0] = frase[1];
  15.      frase[1] = temp;
  16.   }
  17.  
  18.   for (i = 0; i < 2; i++)
  19.      printf(" %s", frase[i]);
  20.   putchar('\n');
  21.  
  22.   return 0;
  23. }

Un saludo


Título: Re: Array de punteros en lenguaje C.
Publicado por: DanielPy en 20 Diciembre 2013, 03:19 am
Hola rir3760.
Citar
Comparar dos líneas usando la función de la biblioteca estándar strcmp().
Si dos líneas están desacomodadas -- intercambiar (swap) los apuntadores (no el texto).
Discúlpame por la ignorancia, tú código cumple con el enunciado del libro?.
En cuanto a la aclaración de mi edad, obtengo mucha comprensión y no es lo mismo tener 20 que 61, son otras las posibilidades.-

Saludos.
Daniel
(http://i41.tinypic.com/2mhamg9.jpg)



Título: Re: Array de punteros en lenguaje C.
Publicado por: DanielPy en 20 Diciembre 2013, 18:31 pm
Hola a todos.-
Con esta imagen seguramente les quedara clara la idea.-

(http://i43.tinypic.com/14jz0xv.jpg)

Saludos.
Daniel
(http://i41.tinypic.com/2mhamg9.jpg)



Título: Re: Array de punteros en lenguaje C.
Publicado por: rir3760 en 21 Diciembre 2013, 00:50 am
Discúlpame por la ignorancia, tú código cumple con el enunciado del libro?
Si. Un ejemplo similar se encuentra en el tema Consulta argumentos (http://foro.elhacker.net/programacion_cc/consulta_argumentos-t405279.0.html).

Un saludo


Título: Re: Array de punteros en lenguaje C.
Publicado por: DanielPy en 21 Diciembre 2013, 01:36 am
Hola rir3760.
Me parece que sigo sin explicarme lo suficiente, te dejo otra imagen que puede que quede más claro.-

(http://i40.tinypic.com/b5mkaq.jpg)

En cuanto al enlace te soy sincero no lo probé porque es muy avanzado para mis conocimientos.-

Saludos.
Daniel
(http://i41.tinypic.com/2mhamg9.jpg)


Título: Re: Array de punteros en lenguaje C.
Publicado por: rir3760 en 21 Diciembre 2013, 15:30 pm
Me parece que estas confundiendo la dirección de un elemento con la dirección almacenada en el elemento. Las cadenas "abeja" y "Abeja" no pueden almacenarse en las direcciones 4c69c y 4c6a0 porque cada una consta (incluyendo el '\0') de seis caracteres.

Si modificamos el programa un poco:
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(void)
  5. {
  6.   char *frase[] = {
  7.      "abeja",
  8.      "Abeja"
  9.   };
  10.   int i;
  11.  
  12.   for (i = 0; i < 2; i++)
  13.      printf("frase[%d]: %p --> %s\n", i, (void *) frase[i], frase[i]);
  14.  
  15.   if(strcmp(*frase, *(frase + 1)) > 0){
  16.      char *temp = frase[0];
  17.      frase[0] = frase[1];
  18.      frase[1] = temp;
  19.   }
  20.   puts("----");
  21.  
  22.   for (i = 0; i < 2; i++)
  23.      printf("frase[%d]: %p --> %s\n", i, (void *) frase[i], frase[i]);
  24.  
  25.   return 0;
  26. }

Su salida (en mi caso) es:
Código:
frase[0]: 0x004090bd --> abeja
frase[1]: 0x004090b7 --> Abeja
----
frase[0]: 0x004090b7 --> Abeja
frase[1]: 0x004090bd --> abeja

Un saludo


Título: Re: Array de punteros en lenguaje C.
Publicado por: DanielPy en 24 Diciembre 2013, 00:19 am
Hola a todos.
Por fin puedo demostrar con este programita lo que pretendía hacer, sólo que todavía no pude hacerlo con array de puntero a char, seguramente alguien me pondrá algún ejemplo.-

Código
  1. #include<stdio.h>
  2.  
  3. //funcion para cambiar las posiciones de memoria
  4. void cambiar_punteros(int **x, int **y) {
  5. void *t = *x;
  6. *x = *y;
  7. *y = t;
  8. }
  9.  
  10. int main(int argc,char *argv[]){
  11.  
  12. int a1 = 15, a2 = 29, *ptr1=&a1, *ptr2=&a2;
  13.  
  14. printf("\n\n int a1 = 15, a2 = 29, *ptr1=&a1, *ptr2=&a2;");
  15. printf("\n\n Posiciones y valores iniciales de *ptr1 --->  Valor = %d Direccion = %p",*ptr1, ptr1);
  16. printf("\n Posiciones y valores iniciales de *ptr2 --->  Valor = %d Direccion = %p\n",*ptr2, ptr2);
  17.  
  18. printf("\n\n Ahora quiero que p1 tenga la posicion de memoria de p2 y a la inversa.\n");
  19. cambiar_punteros(&ptr1,&ptr2);
  20. printf("\n\n Posiciones de memoria cambiados de *ptr1 --->  Valor = %d Direccion = %p",*ptr1, ptr1);
  21. printf("\n Posiciones de memoria cambiados de *ptr2 --->  Valor = %d Direccion = %p\n",*ptr2, ptr2);
  22.  
  23. return 0;
  24. }

       (http://i44.tinypic.com/3305ra8.jpg)

Saludos.
Daniel
(http://i41.tinypic.com/2mhamg9.jpg)


Título: Re: Array de punteros en lenguaje C.
Publicado por: rir3760 en 25 Diciembre 2013, 15:56 pm
Por fin puedo demostrar con este programita lo que pretendía hacer, sólo que todavía no pude hacerlo con array de puntero a char
Sin animo de ofender pero en este tema desde mi primera respuesta tienes un ejemplo sobre como intercambiar el valor de dos punteros (por supuesto elementos de un array):
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(void)
  5. {
  6.   char *frase[] = {
  7.      "abeja",
  8.      "Abeja"
  9.   };
  10.   int i;
  11.  
  12.   if(strcmp(*frase, *(frase + 1)) > 0){
  13.      char *temp = frase[0];
  14.      frase[0] = frase[1];
  15.      frase[1] = temp;
  16.   }
  17.  
  18.   for (i = 0; i < 2; i++)
  19.      printf(" %s", frase[i]);
  20.   putchar('\n');
  21.  
  22.   return 0;
  23. }

Para que sea casi igual a tu ultimo programa solo hay que realizar algunos cambios:
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(void)
  5. {
  6.   char *p = "abeja";
  7.   char *q = "Abeja";
  8.  
  9.   if(strcmp(p, q) > 0){
  10.      char *temp = p;
  11.      p = q;
  12.      q = temp;
  13.   }
  14.  
  15.   printf("%s %s\n", p, q); /* Abeja abeja */
  16.  
  17.   return 0;
  18. }

Un saludo


Título: Re: Array de punteros en lenguaje C.
Publicado por: DanielPy en 25 Diciembre 2013, 16:41 pm
Hola rir3760.
Me culpo por no hacerme entender desde el principio, el último programa es el que necesitaba.-

(http://i44.tinypic.com/29fy2s1.jpg)

Feliz navidad para todos y saludos.
Daniel
(http://i41.tinypic.com/2mhamg9.jpg)


Título: Re: Array de punteros en lenguaje C.
Publicado por: DanielPy en 26 Diciembre 2013, 16:16 pm
Hola rir3760.
Una pregunta más, tu ultimo código se puede aplicar de esta manera.-
char *frase[] = {“aveja”, “Aveja”};
Si te parece tedioso para este post sólo decime si es posible y me las rebusco.-

Saludos.
Daniel


Título: Re: Array de punteros en lenguaje C.
Publicado por: amchacon en 26 Diciembre 2013, 16:37 pm
Hola rir3760.
Una pregunta más, tu ultimo código se puede aplicar de esta manera.-
char *frase[] = {“aveja”, “Aveja”};
Si te parece tedioso para este post sólo decime si es posible y me las rebusco.-
Sí, de hecho lo hace justo en el código anterior.


Título: Re: Array de punteros en lenguaje C.
Publicado por: rir3760 en 26 Diciembre 2013, 16:49 pm
Una pregunta más, tu ultimo código se puede aplicar de esta manera.
char *frase[] = {“aveja”, “Aveja”};
Primero tienes que explicar de una forma clara a que te refieres con "aplicar de esta manera", si te refieres a la comillas estas deben ser "comillas planas sin chiste".

Un saludo


Título: Re: Array de punteros en lenguaje C.
Publicado por: DanielPy en 26 Diciembre 2013, 17:38 pm
Hola amchacon.
Esta es la diferencia.-
Código:
char *frase[] = {"abeja", "Abeja"};

Código:
char *p = "abeja";
char *q = "Abeja";



Título: Re: Array de punteros en lenguaje C.
Publicado por: amchacon en 26 Diciembre 2013, 17:43 pm
Hola amchacon.
Esta es la diferencia.-
Código:
char *frase[] = {"abeja", "Abeja"};

Código:
char *p = "abeja";
char *q = "Abeja";
¿Y no es eso lo que preguntabas?


Título: Re: Array de punteros en lenguaje C.
Publicado por: DanielPy en 26 Diciembre 2013, 21:30 pm
Hola.
Me parece que mi problema es más facil de entender que respirar.-

Codigo de rir3760
Código:
char *p = "abeja";
char *q = "Abeja";

¿Puedo hacer lo mismo de esta manera?

Código:
char *frase[] = {"abeja", "Abeja"};

Saludos.
Daniel


Título: Re: Array de punteros en lenguaje C.
Publicado por: leosansan en 26 Diciembre 2013, 22:04 pm
Hola.
Me parece que mi problema es más facil de entender que respirar.-

Codigo de rir3760
Código:
char *p = "abeja";
char *q = "Abeja";

¿Puedo hacer lo mismo de esta manera?

Código:
char *frase[] = {"abeja", "Abeja"};

Saludos.
Daniel

Creo que rir3760 ya ha respondido a ambos. Por si no te has dado cuenta te dejo la combinación de los dos:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(void)
  5. {
  6.    char *p = "abeja";
  7.    char *q = "Abeja";
  8.    printf(" %p --> %s\n",(void*)p, p);
  9.    printf(" %p --> %s\n",(void*)q, q);
  10.    if(strcmp(p, q) > 0){
  11.        char *temp = p;
  12.        p = q;
  13.        q = temp;
  14.    }
  15.    puts("----");
  16.    printf(" %p --> %s\n",(void*)p, p);
  17.    printf(" %p --> %s\n",(void*)q, q);
  18.  
  19.    char *frase[] = {"abeja","Abeja"};
  20.    int i;
  21.    putchar ('\n');
  22.    for (i = 0; i < 2; i++)
  23.      printf("frase[%d]: %p --> %s\n", i, (void *) frase[i], frase[i]);
  24.    if(strcmp(*frase, *(frase + 1)) > 0){
  25.        char *temp = frase[0];
  26.        rase[0] = frase[1];
  27.        frase[1] = temp;
  28.    }
  29.    puts("----");
  30.    for (i = 0; i < 2; i++)
  31.        printf("frase[%d]: %p --> %s\n", i, (void *) frase[i], frase[i]);
  32.   return 0;
  33. }
  34.  

;-)  ;-) Felices Navidades y Próspero Año Nuevo.  ;-)  ;-)


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)