ANNEX 1: WorkSpaces en Visual C

Visual C++ permet mantenir una estructura complexa d'espais de treball, projectes i arxius. Es proposa per tot el curs que cada mòdul diferent correspongui a un nou espai de treball, i cada pràctica o exercici correspongui a un nou projecte. Tots els projectes tindran, doncs, un únic arxiu. Els projectes del Tema 1 es posaran en un espai de treball anomenat T1, els del Tema 2 a l'espai de treball T2 i així successivament.

Per tant, el primer que s'ha de fer és crear un nou espai de treball en blanc i anomenar-lo T6_Arrays, per això s'han de seguir els següents passos:

Ara que ja tenim un espai de treball nou crearem un nou projecte:

Anomeneu el projecte 10_Parells. Deixeu activat l'opció Add to current workspace i Platforms: Win32 i feu clic en OK.

Si ens fixem en la mida de l'arxiu executable veurem que és massa gran (més de 150 kb). Aquest arxiu tan gran permet la depuració o correcció d'errors (debug). El tema de la depuració serà tractat més endavant. Si ja hem comprovat que el programa funciona, podem fer una compilació optimitzada que crearà un arxiu executable més petit.

Podem comprovar que aquest és un arxiu executable de consola executant-lo en una finestra MS-DOS fora de l'entorn de Visual C++. Això es pot fer des del Windows 95/98/2000 amb inici->Programes->MSDOS. Una vegada en la finestra, podem desplaçar-nos per les diferents carpetes del disc amb el comandament MS-DOS:

Una vegada a la carpeta \...\10_Parells\release\ proveu d'escriure 10_Parells(no fa falta escriure el nom de l'extensió).

 

ANNEX 2: LA DEPURACIÓ

Abans de produir la versió definitiva d'un programa hem de procurar que aquest estigui lliure d’errors. En el moment de la compilació, el compilador ens pot avisar d’alguns errors de sintaxi, confusió de tipus, etc. Aquests errors que pot detectar el compilador s’anomenen errors de compilació, i gairebé sempre són fàcils de detectar.

Si per al compilador la sintaxi del programa és correcta, però aquest no fa exactament el que hauria de fer, pot ser degut, segurament, a un error lògic o error d’execució. Aquests tipus d'errors són els realment difícils de detectar. Per ajudar a detectar-los es fa servir un dels elements més valuosos de l’entorn Visual C++, el depurador o debuger.

Versions d’un programa

Ja hem parlat al primer mòdul, que el Visual C++ pot crear diferents versions d’un programa executable. Fonamentalment hi ha dos tipus de versions: la versió Release (preparada per a la publicació) i la versió Debug (preparada per a la depuració).

La versió Release és una versió optimitzada. Aquesta versió és ràpida i ocupa poc espai. La versió Debug conté informació necessària per tal de permetre la depuració, això sí, a costa de fer executables llargs i lents.

El procediment habitual és produir sempre programes amb la versió Debug en les fases de desenvolupament fins que ens assegurem que no hi ha errors (cosa que mai es pot assegurar 100%), una vegada que el programa s’ha provat i funciona correctament, ja es pot esborrar la versió Debug i produir la versió Release.

La selecció d’una o altra versió es fa abans de la compilació. Si la barra d’eines Build és visible, es pot observar a la part superior d’aquesta barra un quadre combinat amb la qual es pot seleccionar una o altra opció. També es pot canviar de configuració des del menú Build ->set active configuration.

Errors i advertiments de compilació

Una vegada acabada l'escriptura del codi del programa es construeix l'aplicació. Ja havíem mencionat que aquesta tasca es pot fer directament amb l'opció build (F7) o en dos passos: compile i build. En qualsevol cas, tots els errors detectats pel compilador, així com altres advertiments, es mostren a la finestra de sortida (Output), particularment a la pestanya Build d'aquesta finestra.

El compilador ens pot donar dos tipus de missatges: els errors i els advertiments (warnings).

Un error impedeix la construcció de l'executable. El compilador ens informa del tipus d'error i la línia en la qual es produeix l'error. S'ha de tenir en compte que no tots els errors són independents, això vol dir que és probable que un mateix error produeixi més d'un missatge d'error, per exemple, si no declarem una variable, el compilador detectarà un error cada vegada que aparegui en el codi aquesta variable.

Els errors més freqüents que es sol cometre i que detecta el compilador són:

A més d'aquests errors que obliguen a corregir el codi i tornar a compilar o construir l'aplicació, el compilador ens avisa d'algunes circumstàncies que, encara que no impedeixen la construcció de l'aplicació, poden ser errors que s'han de corregir. Per exemple, el compilador ens avisarà si:

Si tot a anat bé i el compilador ha fet la seva tasca sense detectar cap error, ja s'ha creat el fitxer executable, aquest fitxer, si s'ha creat amb la versió DEBUG, es pot provar amb eines que permeten detectar comportaments no desitjats.

Depuració

Per tal de fer servir el depurador o debug hem de seleccionar l'opció Go (F5).  Això permet fer que el programa s'executi fins a un punt determinat i, a partir d'aquest moment, el depurador pren el comandament de l'execució. Si premem F5 o seleccionem GO abans de compilar o construir el programa, primer es compila i es construeix l'aplicació i després s'executa.

Per forçar que el programa s'aturi en un punt determinat del codi hem de col·locar un punt de ruptura o breakpoint. Es poden col·locar tots els punts de ruptura que s'estimi necessaris. La forma més ràpida de col·locar un punt de ruptura és prement la tecla F9 quan el cursor està sobre la línia desitjada. Això farà que al començament de la línia aparegui un punt vermell. La tecla F9 actua com un commutador, és a dir, si premem F9 damunt d'una línia marcada, la marca desapareix.

Quan l'execució del codi s'atura perquè ha trobat un punt de ruptura, l'opció Buid del menú es substitueix per l'opció Debug , que conté, entre altres, opcions per poder executar el programa pas per pas.

Una aplicació usual dels punts de ruptura consisteix en comprovar si s'està executant una part determinada del codi, per exemple, la part interior d'un bucle. Si es col·loca un punt de ruptura en un punt del codi i l'execució no s'atura vol dir que el programa no arriba a passar per aquest punt.

Una vegada seleccionada l'opció GO, si es troba un punt de ruptura, l'execució s'atura. En aquest moment podem observar el valor actual de les variables, per això hi ha diverses formes:

La finestra WATCH té dues columnes, a la primera columna podem escriure el nom d'una variable o expressió. En la segona columna apareix automàticament el seu valor en aquest punt del programa. Es pot modificar els valors de les variables no constants que es mostrin en aquesta finestra.

ANNEX 3. Els nombres pseudoaleatoris

Com gairebé tots els llenguatges de programació, C incorpora en la seva llibreria estàndard una funció que genera un nombre pseudoaleatori. En el cas concret del C, aquest nombre és un enter comprès entre 0 i 32.767. El prototipus d'aquesta funció és:

int rand()

i per tal de fer-la servir s'ha d'incloure el fitxer de capçalera stdlib.h.

Altres llenguatges de programació incorporen també una funció similar. Normalment és una funció que genera un nombre real de l'interval [0, 1). Aquesta funció és més útil en molts casos.

Per tal de generar en C un nombre real entre 0 i 1 (incloent el 0 i excloent l'1) podem fer servir l'expressió:

(float) rand()/32768

Per tal de generar un nombre real entre 0 i n ( [0,n) ) es fa servir l'expressió:

(float) rand()*n/32768

De fet, aquesta expressió, com l'anterior, generarà un nombre real d'entre 32768 nombres reals compresos entre 0 i n, no seguirà estrictament, per tant, una distribució uniforme.

Per tal de generar un nombre enter entre 0 i n–1, ambdós inclosos i n<32768, es fa servir l'expressió:

rand()*n /32768

Si n>32768 aquest mètode farà que hi hagi nombres que no es generaran, per exemple, si n/32768 = 2, tots els nombres generats seran parells. Aquest problema es pot solucionar generant dos números aleatoris, per exemple:

rand()*32768+rand()

és un nombre aleatori comprès entre 0 i 1.073.741.824

L'algorisme intern que utilitza la funció rand() fa servir una llavor o valor inicial per iniciar la seqüència de nombres aleatoris. La funció srand() permet assignar un valor nou a aquesta llavor o valor inicial.

Hosted by www.Geocities.ws

1