Tutorial de Apuntadores y Arreglos en C - Cimat

Tutorial de Apuntadores y Arreglos en C - Cimat Tutorial de Apuntadores y Arreglos en C - Cimat

17.05.2013 Views

void bubble(void *p, size_t width, int N) { int i, j; unsigned char buf[4]; unsigned char *bp = p; for (i = N-1; i >= 0; i--) { for (j = 1; j *n1); } Revisa que he cambiado el tipo de datos del arreglo de int a long para mostrar los cambios necesarios en la función compare(). Dentro de bubble() he construido un arreglo con la variable t (la cual hemos tenido que cambiar del tipo de datos int al tipo long). He añadido un buffer de tamaño 4 de tipo unsigned char, el cual es el tamaño requerido para almacenar un entero largo (esto cambiará en futuras modificaciones al código). El apuntador *bp de tipo unsigned char es usado para apuntar al inicio del arreglo a ordenar, es decir al primer elemento del arreglo. Tuvimos también que modificar lo que se le pasa a compare(), y el modo en que hacíamos el intercambio de elementos cuando la comparación indicaba que se hacía el intercambio. El uso de memcpy() y de la notación de punteros va en función de reducir la sensibilidad al tipo de datos. De nuevo, el hacer una revisión cuidadosa de bubble_5.c con bubble_4.c puede resultar muy provechoso para entender lo que está sucediendo y porqué. Vamos ahora con bubble_6.c donde usamos la misma función bubble() que usamos en bubble_5.c ahora para ordenar cadenas en lugar de números enteros. Por supuesto que hemos tenido que modificar la función de comparación ya que el modo de comparar cadenas es diferente del modo en que se comparan números enteros. También en bubble_6.c hemos removido las líneas que dentro de bubble() estaban como comentarios en bubble_5.c 44

ubble_6.c /* Program bubble_6.c from PTRTUT10.HTM 6/13/97 */ #include #include #define MAX_BUF 256 char arr2[5][20] = { "Mickey Mouse", "Donald Duck", "Minnie Mouse", "Goofy", "Ted Jensen" }; void bubble(void *p, int width, int N); int compare(void *m, void *n); int main(void) { int i; putchar('\n'); } for (i = 0; i < 5; i++) { printf("%s\n", arr2[i]); } bubble(arr2, 20, 5); putchar('\n\n'); for (i = 0; i < 5; i++) { printf("%s\n", arr2[i]); } return 0; void bubble(void *p, int width, int N) { int i, j, k; unsigned char buf[MAX_BUF]; unsigned char *bp = p; for (i = N-1; i >= 0; i--) { for (j = 1; j

void bubble(void *p, size_t width, int N)<br />

{<br />

int i, j;<br />

unsigned char buf[4];<br />

unsigned char *bp = p;<br />

for (i = N-1; i >= 0; i--)<br />

{<br />

for (j = 1; j *n1);<br />

}<br />

Revisa que he cambiado el tipo <strong>de</strong> datos <strong>de</strong>l arreglo <strong>de</strong> int a long para mostrar los cambios necesarios <strong>en</strong> la<br />

función compare(). D<strong>en</strong>tro <strong>de</strong> bubble() he construido un arreglo con la variable t (la cual hemos t<strong>en</strong>ido que<br />

cambiar <strong>de</strong>l tipo <strong>de</strong> datos int al tipo long). He añadido un buffer <strong>de</strong> tamaño 4 <strong>de</strong> tipo unsigned char, el cual es el<br />

tamaño requerido para almac<strong>en</strong>ar un <strong>en</strong>tero largo (esto cambiará <strong>en</strong> futuras modificaciones al código). El<br />

apuntador *bp <strong>de</strong> tipo unsigned char es usado para apuntar al inicio <strong>de</strong>l arreglo a or<strong>de</strong>nar, es <strong>de</strong>cir al primer<br />

elem<strong>en</strong>to <strong>de</strong>l arreglo.<br />

Tuvimos también que modificar lo que se le pasa a compare(), y el modo <strong>en</strong> que hacíamos el intercambio <strong>de</strong><br />

elem<strong>en</strong>tos cuando la comparación indicaba que se hacía el intercambio. El uso <strong>de</strong> memcpy() y <strong>de</strong> la notación<br />

<strong>de</strong> punteros va <strong>en</strong> función <strong>de</strong> reducir la s<strong>en</strong>sibilidad al tipo <strong>de</strong> datos.<br />

De nuevo, el hacer una revisión cuidadosa <strong>de</strong> bubble_5.c con bubble_4.c pue<strong>de</strong> resultar muy provechoso para<br />

<strong>en</strong>t<strong>en</strong><strong>de</strong>r lo que está sucedi<strong>en</strong>do y porqué.<br />

Vamos ahora con bubble_6.c don<strong>de</strong> usamos la misma función bubble() que usamos <strong>en</strong> bubble_5.c ahora para<br />

or<strong>de</strong>nar ca<strong>de</strong>nas <strong>en</strong> lugar <strong>de</strong> números <strong>en</strong>teros. Por supuesto que hemos t<strong>en</strong>ido que modificar la función <strong>de</strong><br />

comparación ya que el modo <strong>de</strong> comparar ca<strong>de</strong>nas es difer<strong>en</strong>te <strong>de</strong>l modo <strong>en</strong> que se comparan números<br />

<strong>en</strong>teros. También <strong>en</strong> bubble_6.c hemos removido las líneas que <strong>de</strong>ntro <strong>de</strong> bubble() estaban como com<strong>en</strong>tarios<br />

<strong>en</strong> bubble_5.c<br />

44

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!