Page 186

3.5 Paso de par´ametros for (i=0; i<grupoNaufragos->cantidad ; i++) if (fila == grupoNaufragos->naufrago[i].fila && columna == grupoNaufragos->naufrago[i].columna) { ya_hay_uno_ahi = 1; break; } if (!ya_hay_uno_ahi) { grupoNaufragos->naufrago[grupoNaufragos->cantidad ].fila = fila; grupoNaufragos->naufrago[grupoNaufragos->cantidad ].columna = columna; grupoNaufragos->naufrago[grupoNaufragos->cantidad ].encontrado = 0; grupoNaufragos->cantidad ++; } } }

Nos vendr´ a bien disponer de una funci´on que muestre por pantalla la ubicaci´on y estado de cada n´ aufrago. Esta funci´ on no resulta u ´til para el juego (pues perder´ıa toda la gracia), pero s´ı para ayudarnos a depurar el programa. Podr´ıamos, por ejemplo, ayudarnos con llamadas a esa funci´ on mientras jugamos partidas de prueba y, una vez dado por bueno el programa, no llamarla m´ as. En cualquier caso, aqu´ı la tienes: void muestra_naufragos(struct GrupoNaufragos grupoNaufragos) /* Muestra por pantalla las coordenadas de cada n´ aufrago e informa de si sigue perdido. ´ para depuraci´ * Util on del programa. */ { int i; char coordenadas[3]; for (i=0; i<grupoNaufragos.cantidad ; i++) { de_fila_y_columna_a_numero_y_letra(grupoNaufragos.naufrago[i].fila, grupoNaufragos.naufrago[i].columna, coordenadas); printf ("N´ aufrago %d en coordenadas %s ", i, coordenadas); if (grupoNaufragos.naufrago[i].encontrado) printf ("ya ha sido encontrado.\n"); else printf ("sigue perdido.\n"); } }

La funci´ on est´ a bien, pero podemos mejorarla. F´ıjate en c´omo pasamos su par´ametro: por valor. ¿Por qu´e? Porque no vamos a modificar su valor en el interior de la funci´on. En principio, la decisi´on de pasarlo por valor est´ a bien fundamentada. No obstante, piensa en qu´e ocurre cada vez que llamamos a la funci´ on: como un registro de tipo struct GrupoNaufragos ocupa 64 bytes (haz cuentas y compru´ebalo), cada llamada a la funci´on obliga a copiar 64 bytes en la pila. El problema se agravar´ıa si en lugar de trabajar con un n´ umero m´aximo de 5 n´aufragos lo hici´eramos con una cantidad mayor. ¿Es realmente necesario ese esfuerzo? La verdad es que no: podemos limitarnos a copiar 4 bytes si pasamos una referencia al registro. Esta nueva versi´on de la funci´ on efect´ ua el paso por referencia: void muestra_naufragos( struct GrupoNaufragos * grupoNaufragos) /* Muestra por pantalla las coordenadas de cada n´ aufrago e informa de si sigue perdido. ´ para depuraci´ * Util on del programa. */ { int i, fila, columna; char coordenadas[3]; for (i=0; i<grupoNaufragos -> cantidad ; i++) { de_fila_y_columna_a_numero_y_letra(grupoNaufragos -> naufrago[i].fila, grupoNaufragos -> naufrago[i].columna, coordenadas); printf ("N´ aufrago %d en coordenadas %s ", i, coordenadas); if (grupoNaufragos -> naufrago[i].encontrado)

180

Introducci´ on a la Programaci´ on con C

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement