<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mad93's bloc &#187; c/c++</title>
	<atom:link href="http://bloc.majomo.com/category/prog/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://bloc.majomo.com</link>
	<description>Un bloc més a la xarxa</description>
	<lastBuildDate>Fri, 09 Apr 2010 21:32:31 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Generar i mostrar el MD5 d&#8217;un fitxer o cadena</title>
		<link>http://bloc.majomo.com/generar-i-mostrar-el-md5-dun-fitxer-o-cadena/</link>
		<comments>http://bloc.majomo.com/generar-i-mostrar-el-md5-dun-fitxer-o-cadena/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 22:26:07 +0000</pubDate>
		<dc:creator>mad93</dc:creator>
				<category><![CDATA[Programació]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[md5]]></category>

		<guid isPermaLink="false">http://bloc.majomo.com/?p=79</guid>
		<description><![CDATA[Quan volem verificar el correcte enviament d'un fitxer solem emprar algorismes que generen unes cadenes  'úniques' per tal d'assegurar-nos de que l'arxiu s'ha rebut clavat a l'original. Per a una pràctica així ho he volgut fer, i després d'un parell de dies he entés per fi com anava tot el sistema (una mica lent, [...]]]></description>
			<content:encoded><![CDATA[<p>Quan volem verificar el correcte enviament d'un fitxer solem emprar algorismes que generen unes cadenes  'úniques' per tal d'assegurar-nos de que l'arxiu s'ha rebut clavat a l'original. Per a una pràctica així ho he volgut fer, i després d'un parell de dies he entés per fi com anava tot el sistema (una mica lent, sí).</p>
<p><span id="more-79"></span>Primerament hem de carregar les capçalera per a poder emprar les funcions md5 d'openssl:</p>
<pre class="c"><span style="color: #339933;">#include &lt;openssl/md5.h&gt;</span></pre>
<p>Amb això podem cridar a les funcions MD5_Init, MD5_Update i MD5_Final. Com indica el nom MD5_Init serveix per iniciar el procés de conversió, inicialitzant una variable del tipus MD5_CTX. Per a l'exemple l'anomenarem state:</p>
<pre class="c">MD5_CTX state;</pre>
<p>MD5_Update requereix 3 paràmetres. Primerament la nostra variable state, per a seguir i actualitzar el context de les dades de les que crear-ne el MD5. Segon li hem de passar una dada de tipus unsigned char, en el nostre cas anomenada buffer. Aquesta variable el que conté són les dades de les que volem que faci el MD5. Com que el buffer és una estructura dinàmica, el tercer paràmetre és un enter indicant el nombre de caràcters que ha de llegir.</p>
<pre class="c"><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> *buffer;
<span style="color: #993333;">int</span> comptador;</pre>
<p>Cal tenir en compte que MD5_Update es pot cridar tantes vegades com faci falta fins a carregar totes les dades dessitjades.</p>
<p>Per acabar emprem la funció MD5_Final, que de primer paràmetre ens demana una cadena unsigned char, de 16 bytes, que serà el que es coneix com a digest (la variable l'anomenarem així), que és el MD5 en format binari. Com a darrer paràmetre l'hi passem la variable state, que conté el context del que s'ha de generar el MD5.</p>
<pre class="c"><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> *digest;</pre>
<p>Tot aquest procés ens dona el digest, que és un valor binari. Però el problema és que podem voler tractar el md5 de forma visual, en format de cadena, llegible per a una persona. Per fer això ens podem fer una petita funció a mà.</p>
<pre class="c"><span style="color: #993333;">char</span> *digestAMD5<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> *digest<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
  <span style="color: #993333;">static</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> HEX_DIGITS<span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #ff0000;">&quot;0123456789abcdef&quot;</span>;
  <span style="color: #993333;">char</span> *md5;
  <span style="color: #993333;">int</span> n;
&nbsp;
  md5=malloc<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">char</span><span style="color: #66cc66;">&#41;</span>*<span style="color: #cc66cc;">33</span><span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span>n = <span style="color: #cc66cc;">0</span>; n &lt; <span style="color: #cc66cc;">16</span>; n++<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#123;</span>
    md5<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">2</span>*n<span style="color: #66cc66;">&#93;</span>   = HEX_DIGITS<span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>digest<span style="color: #66cc66;">&#91;</span>n<span style="color: #66cc66;">&#93;</span> &gt;&gt; <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span> &amp; 0x0f<span style="color: #66cc66;">&#93;</span>;
    md5<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">2</span>*n<span style="color: #cc66cc;">+1</span><span style="color: #66cc66;">&#93;</span> = HEX_DIGITS<span style="color: #66cc66;">&#91;</span>digest<span style="color: #66cc66;">&#91;</span>n<span style="color: #66cc66;">&#93;</span> &amp; 0xf<span style="color: #66cc66;">&#93;</span>;
  <span style="color: #66cc66;">&#125;</span>
  md5<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">32</span><span style="color: #66cc66;">&#93;</span> = <span style="color: #cc66cc;">0</span>;
&nbsp;
  <span style="color: #b1b100;">return</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333;">char</span> *<span style="color: #66cc66;">&#41;</span> md5;
<span style="color: #66cc66;">&#125;</span></pre>
<p>Aquesta funció ens generaria un MD5 legible per a una persona. Un exemple per veure-ho funcionant tot junt:</p>
<pre class="c"><span style="color: #339933;">#include &lt;openssl/md5.h&gt;</span>
<span style="color: #993333;">int</span> main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
  <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> *buffer, *digest;
  <span style="color: #993333;">int</span> comptador;
  <span style="color: #993333;">char</span> *md5;
  MD5_CTX state;
&nbsp;
  <span style="color: #808080; font-style: italic;">//Demanem memòria per a les nostres cadenes</span>
  digest=malloc<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">char</span><span style="color: #66cc66;">&#41;</span>*<span style="color: #cc66cc;">16</span><span style="color: #66cc66;">&#41;</span>;
  md5=malloc<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333;">char</span><span style="color: #66cc66;">&#41;</span>*<span style="color: #cc66cc;">33</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">//El md5 és de 32 caràcters, en posem un més per poder-hi afegir el byte de fi de cadena.</span>
&nbsp;
  <span style="color: #808080; font-style: italic;">//Carreguem el buffer del lloc que necessitem</span>
  <span style="color: #808080; font-style: italic;">//Això ja depen d'on extrequi cadascú la informació de la que vol fer-ne el md5</span>
&nbsp;
  <span style="color: #808080; font-style: italic;">//Inicialitzem el entorn</span>
  MD5_Init<span style="color: #66cc66;">&#40;</span>&amp;state<span style="color: #66cc66;">&#41;</span>;
&nbsp;
  <span style="color: #808080; font-style: italic;">//Afegim les dades del buffer. Es pot anar cridant aquesta funció les vegades que faci falta</span>
  MD5_Update<span style="color: #66cc66;">&#40;</span>&amp;state, buffer, comptador<span style="color: #66cc66;">&#41;</span>;
&nbsp;
  <span style="color: #808080; font-style: italic;">//Genera el digest de les dades enviades. Recordem que no poden ser visualitzades per una persona</span>
  MD5_Final<span style="color: #66cc66;">&#40;</span>digest, &amp;state<span style="color: #66cc66;">&#41;</span>;
&nbsp;
  <span style="color: #808080; font-style: italic;">//Generem una cadena amb el MD5, ara sí, en format llegible per a una persona</span>
  md5=digestAMD5<span style="color: #66cc66;">&#40;</span>digest<span style="color: #66cc66;">&#41;</span>;
&nbsp;
  <span style="color: #808080; font-style: italic;">//Afegir caràcter de fi de cadena per a que el printf ens mostri correctament la nostra cadena</span>
  md5<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">32</span><span style="color: #66cc66;">&#93;</span>=<span style="color: #ff0000;">'<span style="color: #000099; font-weight: bold;">\0</span>'</span>;
  <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;El MD5 val: %s&quot;</span>, md5<span style="color: #66cc66;">&#41;</span>;
  <span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
<span style="color: #66cc66;">&#125;</span></pre>
<p>Sembla i és una tonteria, però m'hi he trencat les banyes un parell de dies per a poder-ho fer servir...</p>
]]></content:encoded>
			<wfw:commentRss>http://bloc.majomo.com/generar-i-mostrar-el-md5-dun-fitxer-o-cadena/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Autocompletació a Kdevelop per  a QT</title>
		<link>http://bloc.majomo.com/autocompletacio-a-kdevelop-per-a-qt/</link>
		<comments>http://bloc.majomo.com/autocompletacio-a-kdevelop-per-a-qt/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 13:02:52 +0000</pubDate>
		<dc:creator>mad93</dc:creator>
				<category><![CDATA[Programació]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[KDeveloper]]></category>
		<category><![CDATA[Qt4]]></category>

		<guid isPermaLink="false">http://bloc.majomo.com/?p=65</guid>
		<description><![CDATA[Aquests dies he estat remenant el Visual Studio, que es pot dir el que es vulgui, però el seu editor és molt bo. Ara que ja sé una mica com va el C# i com fer-ho rutllar tot, volia fer el mateix però amb les QT. El entorn que he triat per a desenvolupar és [...]]]></description>
			<content:encoded><![CDATA[<p>Aquests dies he estat remenant el Visual Studio, que es pot dir el que es vulgui, però el seu editor és molt bo. Ara que ja sé una mica com va el C# i com fer-ho rutllar tot, volia fer el mateix però amb les QT. El entorn que he triat per a desenvolupar és kdevelop, però hi trobava a faltar una funcionalitat molt important, l'autocompletació de codi.</p>
<p><span id="more-65"></span></p>
<p>Així que m'he posat a remenar per a trobar com dir-li que em completés el codi automàticament. Per fer-ho he anat al menú Projecte-&gt;Opcions de Projecte. Allí he anat al Suport de C++ i he marcat la casella Automatic code completion a la pestanya Code completion. Això activa la autocompletació de codi, però encara no en té idea de les llibreries de qt. Per a afegir el suport per a les QT a la mateixa pestanya busquem el quadre Base de dades per al completat de codi i premem el botó afegeix.</p>
<p>En el meu cas he triat Importador de PCS de Qt4 per a KDevelop i llavors he especificat la ruta a les meves llibreries de qt4 ( /usr/include/qt4 , en el meu cas). Ha estat una estona fent la base de dades i ja he tingut la autocompletació de codi activada!!</p>
]]></content:encoded>
			<wfw:commentRss>http://bloc.majomo.com/autocompletacio-a-kdevelop-per-a-qt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instal·lar code:blocks a Gentoo</title>
		<link>http://bloc.majomo.com/installar-codeblocks-a-gentoo/</link>
		<comments>http://bloc.majomo.com/installar-codeblocks-a-gentoo/#comments</comments>
		<pubDate>Fri, 04 Apr 2008 20:42:29 +0000</pubDate>
		<dc:creator>mad93</dc:creator>
				<category><![CDATA[Electròncia]]></category>
		<category><![CDATA[Gentoo]]></category>
		<category><![CDATA[Programació]]></category>
		<category><![CDATA[Robòtica]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[16f]]></category>
		<category><![CDATA[codeblocks]]></category>
		<category><![CDATA[pic]]></category>

		<guid isPermaLink="false">http://bloc.majomo.com/?p=47</guid>
		<description><![CDATA[Fa uns dies que miro de programar per a PIC amb una aplicació mig decent. Per a fer-ho he trobat el code:blocs, que permet compilar amb el sdcc.
El problema és que està a ~x86, però és fàcil de solucionar.
Primer és fer que ens deixi compilar aquesta versió. Obrim l'arxiu /etc/portage/package.keywords i afegim el següent:
dev-util/codeblocks
I ara [...]]]></description>
			<content:encoded><![CDATA[<p>Fa uns dies que miro de programar per a PIC amb una aplicació mig decent. Per a fer-ho he trobat el code:blocs, que permet compilar amb el sdcc.</p>
<p>El problema és que està a ~x86, però és fàcil de solucionar.<span id="more-47"></span></p>
<p>Primer és fer que ens deixi compilar aquesta versió. Obrim l'arxiu /etc/portage/package.keywords i afegim el següent:</p>
<pre class="text">dev-util/codeblocks</pre>
<p>I ara ja podem compilar el code:blocs amb:</p>
<pre class="text">emerge codeblocs</pre>
<p>També ens farà falta el sdcc:</p>
<pre class="text">emerge sdcc</pre>
<p>Ara que ja tenim tot el necessari, obrim el code:blocs, no patiu si us diu que no detecta el compilador sdcc, ja ho arreglarem.</p>
<p>Li donem a crear projecte i triem "Empty Project". Triem quin nom li volem donar al projecte i on el volem guardar. Al següent pas hem de triar quin compilador volem emprar, en aquest cas sdcc. Quan creem el projecte es queixarà de que no sap els flags d'optimització del compilador, ni cas.</p>
<p>A anem a "Settings" i triem el submenú "Compiler and Debugger". De la llista triem el sdcc i sel·leccionem la pestanya "Toolchain executables". Veurem que està definida a /usr/local/bin, quan a gentoo s'intal·la a /usr/bin, així que ho canviarem per /usr/bin. A la pestanya "Compiler Settings" buscarem "[CPU] Microchip PIC 14-bit ..." i ho marcarem.</p>
<p>Veurem que a la pestanya "Compiler Settings" hi ha una altre pestanya dintre, "Other options", la marcarem i dintre hi escriurem el xip per al que compilem, per exemple:</p>
<pre class="text">-p16f876a</pre>
<p>Ja li podrem donar a acceptar. Per a comprovar que tot funciona correctament, creem un arxiu .c al projecte i hi posem el següent:</p>
<pre class="c">&nbsp;
<span style="color: #339933;">#include</span>
&lt;pic16f876a.<span style="color: #202020;">h</span>&gt;
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;</pre>
<p>I fem un build. Si no dona cap error, ja li podem donar canya a la programació de pics <img src='http://bloc.majomo.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://bloc.majomo.com/installar-codeblocks-a-gentoo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crear un binari de gcc capaç de compilar codi per als PIC de la família 16</title>
		<link>http://bloc.majomo.com/crear-un-binari-de-gcc-capac-de-compilar-codi-per-als-pic-de-la-familia-16/</link>
		<comments>http://bloc.majomo.com/crear-un-binari-de-gcc-capac-de-compilar-codi-per-als-pic-de-la-familia-16/#comments</comments>
		<pubDate>Thu, 13 Mar 2008 23:06:16 +0000</pubDate>
		<dc:creator>mad93</dc:creator>
				<category><![CDATA[Electròncia]]></category>
		<category><![CDATA[Gentoo]]></category>
		<category><![CDATA[Programació]]></category>
		<category><![CDATA[Robòtica]]></category>
		<category><![CDATA[c/c++]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://bloc.majomo.com/2008/03/14/crear-un-binari-de-gcc-capac-de-compilar-codi-per-als-pic-de-la-familia-16/</guid>
		<description><![CDATA[Aquests dies en Cesc m'ha obligat a treballar, bé, a començar, a posar-me les piles en el tema de la robòtica. Primer vam compilar un programa en c i el vàrem compilar amb el sdcc. Per desgràcia primer vaig fer el codi en cpp i llavors al veure que no ho suportava el vaig pasar [...]]]></description>
			<content:encoded><![CDATA[<p>Aquests dies en Cesc m'ha obligat a treballar, bé, a començar, a posar-me les piles en el tema de la robòtica. Primer vam compilar un programa en c i el vàrem compilar amb el sdcc. Per desgràcia primer vaig fer el codi en cpp i llavors al veure que no ho suportava el vaig pasar a c.</p>
<p>Tot i així no l'he pogut provar ja que la PIC de proves semblava estar tarada.</p>
<p>El cas és que demanant informació a ARDE sobre el tema dels compiladors existents, sobretot un capaç de suportar codi cpp, em van recomanar fer una ullada a <a href="http://pjmicrocontroladores.wordpress.com/">Port de GCC a PIC16</a> i això vaig fer.<span id="more-45"></span>Aquí l'autor ha escrit el codi necessari per a que puguem compilar els nostres programes en c per a PICs de la família 16 amb gcc. A la espera de provar algun experiment amb cpp, direm que només suporta c, doncs l'autor m'ha dit que manquen llibreries encara per a que això sigui possible.</p>
<p>Aquí explico el procés que he seguit per a compilar el gcc sense trepitjar-ne la versió que ja en tenia.</p>
<p>Primerament ens descarregarem i instalarem el gputils disponible a la nostra distribució.  En gentoo:</p>
<pre class="text">emerge gputils</pre>
<p>Un cop instal·lat gputils crearem una nova carpeta (suposaré que la carpeta està a Documents). A dintre hi descarregarem la versió de gcc 4.0.2 i la 1.0.0 de csl-pic-gcc i els descomprimirem:</p>
<pre class="text">mkdir gccpic
cd gccpic
wget  ftp://ftp.gnu.org/gnu/gcc/gcc-4.0.2/gcc-4.0.2.tar.bz2
wget  https://forja.rediris.es/frs/download.php/324/csl-pic-gcc-16f877-1.0.0.tar.gz
tar xfvj gcc-4.0.2.tar.bz2
tar xfvz csl-pic-gcc-16f877-1.0.0.tar.gz</pre>
<p>Ara haurem de configurar el fitxer pic.h per a indicar-li correctament l'ubicació de les eines de gputils (si compilem el paquet 'oficial' en comptes del de la nostra distribució, aquest pas no fa falta).</p>
<pre class="text">vim gcc-4.0.2/gcc/config/pic/pic.h</pre>
<p>On canviarem les línies</p>
<pre class="text">#define DEFAULT_ASSEMBLER &quot;/usr/local/bin/gpasm&quot;
#define DEFAULT_LINKER &quot;/usr/local/bin/gplink&quot;</pre>
<p>per</p>
<pre class="text">#define DEFAULT_ASSEMBLER &quot;/usr/bin/gpasm&quot;
#define DEFAULT_LINKER &quot;/usr/bin/gplink&quot;</pre>
<p>Ara crearem la carpeta on anirà la nostra versió de gcc:</p>
<pre class="text">mkdir pic-gcc
cd pic-gcc</pre>
<p>I executarem el configure i en compilarem el codi:</p>
<pre class="text">../gcc-4.0.2/configure -target=pic -enable-languages=c,c++
make</pre>
<p>Ja tenim els binaris creats a la carpeta gcc, però ara volem que sigui més fàcil emprar-los, per això farem un parell d'enllaços simbòlics, com a root s'ha de fer (poso el meu directori de home com a exemple, s'ha de canviar a la ruta correcte al vostre sistema):</p>
<pre class="text">su
(introduim la clau)
cd /usr/bin
ln -s  /home/mad93/Documents/gccpic/pic-gcc/gcc/g++ picg++
ln -s /home/mad93/Documents/gccpic/pic-gcc/gcc/xgcc picgcc</pre>
<p>I ja podrem compilar els nostres programes amb picgcc i picg++. Vull recordar que cpp encara no es pot emprar per certa mancança de llibreries, però ho deixo aquí així esperant que en un futur pròxim ja sigui possible.</p>
]]></content:encoded>
			<wfw:commentRss>http://bloc.majomo.com/crear-un-binari-de-gcc-capac-de-compilar-codi-per-als-pic-de-la-familia-16/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fent un programa senzill amb SDL</title>
		<link>http://bloc.majomo.com/fent-un-programa-senzill-amb-sdl/</link>
		<comments>http://bloc.majomo.com/fent-un-programa-senzill-amb-sdl/#comments</comments>
		<pubDate>Tue, 29 Jan 2008 23:15:03 +0000</pubDate>
		<dc:creator>mad93</dc:creator>
				<category><![CDATA[Programació]]></category>
		<category><![CDATA[SDL]]></category>
		<category><![CDATA[c/c++]]></category>

		<guid isPermaLink="false">http://bloc.majomo.com/2008/01/30/fent-un-programa-senzill-amb-sdl/</guid>
		<description><![CDATA[Bé, feia dies que no feia res d'interessant, al menys per mi  
Així doncs he decidit revisar el codi d'un joc força senzill que vaig fer per la gp2x i fer el que s'anomenaria una demo, un programa que no fa res de res &#62;&#60;
En aquest programa només es carrega una imatge i una [...]]]></description>
			<content:encoded><![CDATA[<p>Bé, feia dies que no feia res d'interessant, al menys per mi <img src='http://bloc.majomo.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Així doncs he decidit revisar el codi d'un joc força senzill que vaig fer per la gp2x i fer el que s'anomenaria una demo, un programa que no fa res de res &gt;&lt;</p>
<p>En aquest programa només es carrega una imatge i una cançó i es surt amb la tecla "return". Per limitacions de coneixements i per no complicar molt la cosa, la resolució és fixa a 1024x768 (SDL_Image no té una funció per reescalar les imatges o.O).<span id="more-36"></span></p>
<p>El programa intenta explicar-se per si mateix, però bé, com que són comentaris per a mi, no sé si explica prou bé que es fa a cada pas, aquí el codi:</p>
<pre class="c"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
<span style="color: #339933;">#include &lt;SDL.h&gt;</span>
<span style="color: #339933;">#include &lt;SDL_mixer.h&gt;</span>
<span style="color: #339933;">#include &lt;SDL_image.h&gt;</span>
<span style="color: #339933;">#include &lt;time.h&gt;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">int</span> argc, <span style="color: #993333;">char</span> *argv<span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
<span style="color: #808080; font-style: italic;">//Definim la variable pantalla</span>
SDL_Surface *pantalla;
<span style="color: #993333;">int</span> sortir=<span style="color: #cc66cc;">0</span>;
<span style="color: #808080; font-style: italic;">//Inicialitzem el SDL</span>
<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>SDL_Init<span style="color: #66cc66;">&#40;</span>SDL_INIT_VIDEO|SDL_INIT_AUDIO<span style="color: #66cc66;">&#41;</span> &amp;lt; <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
<span style="color: #808080; font-style: italic;">//Entro si peta al inicialitzar el SDL</span>
fprintf<span style="color: #66cc66;">&#40;</span>stderr, <span style="color: #ff0000;">&quot;Incapaç d'inicialitzar SDL: %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, SDL_GetError<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
exit<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #808080; font-style: italic;">//Fixem la mida de la pantalla</span>
pantalla= SDL_SetVideoMode<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1024</span>,<span style="color: #cc66cc;">768</span>,<span style="color: #cc66cc;">16</span>,SDL_DOUBLEBUF | SDL_FULLSCREEN<span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>!pantalla<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
<span style="color: #808080; font-style: italic;">//Mostrem l'error</span>
fprintf<span style="color: #66cc66;">&#40;</span>stderr, <span style="color: #ff0000;">&quot;No s'ha pogut establir el mode de vídeo: %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, SDL_GetError<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
exit<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #808080; font-style: italic;">//Ara tenim el mode de vídeo activat i podem començar a fer coses</span>
&nbsp;
<span style="color: #808080; font-style: italic;">//Carreguem al buffer de pantalla una imatge</span>
SDL_Surface *imatge;
imatge=IMG_Load<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;prova.jpg&quot;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">//La passo a pantalla</span>
SDL_BlitSurface<span style="color: #66cc66;">&#40;</span>imatge, <span style="color: #000000; font-weight: bold;">NULL</span>, pantalla, <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #808080; font-style: italic;">//Mostro per pantalla la variable pantalla</span>
SDL_Flip<span style="color: #66cc66;">&#40;</span>pantalla<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">//Poso música</span>
<span style="color: #993333;">int</span> audio_rate = <span style="color: #cc66cc;">22050</span>;
Uint16 audio_format = AUDIO_S16SYS;
<span style="color: #993333;">int</span> audio_channels = <span style="color: #cc66cc;">2</span>;
<span style="color: #993333;">int</span> audio_buffers = <span style="color: #cc66cc;">4096</span>;
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>Mix_OpenAudio<span style="color: #66cc66;">&#40;</span>audio_rate, audio_format, audio_channels, audio_buffers<span style="color: #66cc66;">&#41;</span> != <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
fprintf<span style="color: #66cc66;">&#40;</span>stderr, <span style="color: #ff0000;">&quot;No s'ha pogut inicialitzar l'audio: %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, Mix_GetError<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
exit<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">//Carreguem el ogg</span>
Mix_Music *musica;
musica = Mix_LoadMUS<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;musica.ogg&quot;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>musica == <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
fprintf<span style="color: #66cc66;">&#40;</span>stderr, <span style="color: #ff0000;">&quot;Incapaç de carregar el ogg: %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, Mix_GetError<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
exit<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #808080; font-style: italic;">//Fem el bucle infinit amb -1</span>
<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>Mix_PlayMusic<span style="color: #66cc66;">&#40;</span>musica, <span style="color: #cc66cc;">-1</span><span style="color: #66cc66;">&#41;</span> == <span style="color: #cc66cc;">-1</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
fprintf<span style="color: #66cc66;">&#40;</span>stderr, <span style="color: #ff0000;">&quot;Incapaç d'obrir l'arxiu ogg: %s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, Mix_GetError<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
exit<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">//Pengem el programa fins que hi hagi un event de teclat</span>
<span style="color: #b1b100;">while</span> <span style="color: #66cc66;">&#40;</span>!sortir<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
SDL_Event event;
SDL_WaitEvent<span style="color: #66cc66;">&#40;</span>&amp;amp;event<span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>event.<span style="color: #202020;">key</span>.<span style="color: #202020;">keysym</span>.<span style="color: #202020;">sym</span>==SDLK_RETURN<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
sortir=<span style="color: #cc66cc;">1</span>;
<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
<span style="color: #808080; font-style: italic;">//Matem el SDL</span>
SDL_Quit<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre>
<p>I ja tenim un programa cutrillo que fa ús de pantalla completa i de música (està en loop).</p>
<p><a href="http://bloc.majomo.com/wp-content/uploads/2008/01/provatar.gz" title="Prova de SDL"> Aquí en teniu una versió compilada per a x86 i amb els arxius necessaris (imatge i música), així com el codi font (Del Makefile ni cas, que ara no recordo com fer-lo <img src='http://bloc.majomo.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ).</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bloc.majomo.com/fent-un-programa-senzill-amb-sdl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programació bàsica (Punters)</title>
		<link>http://bloc.majomo.com/programacio-basica-punters/</link>
		<comments>http://bloc.majomo.com/programacio-basica-punters/#comments</comments>
		<pubDate>Sun, 07 Oct 2007 15:51:41 +0000</pubDate>
		<dc:creator>mad93</dc:creator>
				<category><![CDATA[Programació]]></category>
		<category><![CDATA[c/c++]]></category>

		<guid isPermaLink="false">http://bloc.majomo.com/2007/10/07/programacio-basica-punters/</guid>
		<description><![CDATA[ Una cosa complicada d'entendre a C són els punters, així que miraré de que quedi clar que són però no sé si me'n sortiré  La primera pregunta que ens hauríem de fer és, què és un punter? Un punter és un variable que apunta a una direcció de memòria, pot ser del tipus [...]]]></description>
			<content:encoded><![CDATA[<p> Una cosa complicada d'entendre a C són els punters, així que miraré de que quedi clar que són però no sé si me'n sortiré <img src='http://bloc.majomo.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> <span id="more-24"></span>La primera pregunta que ens hauríem de fer és, què és un punter? Un punter és un variable que apunta a una direcció de memòria, pot ser del tipus que sigui la dada emmagatzemada. El punter ens dona molt de joc amb els programes que fem, doncs ens permet treballar amb variables que no pertanyen a la nostra funció i modificar-les des de la mateixa funció.</p>
<p>M'explico. En els nostres programes, com a principi, la definició de les variables la farem dintre de la funció on s'empri dita variable, i mai com a variables globals (Una variable global és una variable que pot ser accedida per qualsevol funció a sac, però això no sempre és bo i com a bona pràctica de programació es desaconsella el seu ús). Com hem vist abans els funcions només ens retornen un valor, del tipus que sigui, però només un. Això és una limitació important a quan es vol, o es necessita, que una funció modifiqui diversos canvis de variables.</p>
<p>Com he dit abans els punters són adreces de memòria. Entenem que la memòria a la que el programa accedeix és la de la màquina. Com vaig dir al tema de funcions al passar-se una variable el que realment es fa és copiar-la, pel que l'original no es veu modificada en cap moment. En canvi si emprem un punter el que farem és passar-li l'adreça de memòria on està guardada la variable original, amb el que els canvis que fem a la funció afectaran directament a l'adreça original.  Això s'anomena passar una variable per referència i es fa de la següent manera:<br />
<code><br />
resultat=funcio(var1,var2,&amp;var3);<br />
</code></p>
<p>Aquí podem veure que funció retorna un valor que és emmagatzemat a resultat, però var3 té un &amp; estrany davant. Aquest símbol el que fa és incidar que passem l'adreça de memòria on està guardada var3.</p>
<p>Ara mirem com queda la definició de la funció:</p>
<p><code><br />
int funcio (int var1, int var2, int *var3)<br />
{<br />
*var3 = var1+var2;<br />
return var1-var2;<br />
}</code></p>
<p>Com podeu veure aquesta funcio, que hem anomenat "funcio", retorna la resta de var1 menys var2, però modifica també  el valor de var3, canvi que seguirà present quan sortim de la funció. Davant de var3 ara he posat un * (punter), aquest símbol el que fa és accedir al contingut d'on apunta l'adreça de memòria. És a dir, si fèssim un "printf ("%d",var3);" el que veuríem no seria el valor de var3, sinó l'adreça de memòria on estan guardades les dades, per mostrar les dades de var3 hauríem de fer: "printf ("%d",*var3);</p>
<p>És una mica farregosa la nomenclatura, però molt potent.</p>
<p>A més es pot crear un punter directament, aquí l'empràvem com a 'eina' però podem crear un punter i llavors demanar memòria per al tipus de dada que vulguem que emmagatzemi. Penseu que fins ara només hem vist com treballar amb estructures estàtiques, és a dir, si defineixo int numeros[1000]; vol dir que números té caselles per guardar 1000 números de tipus int, però si ens passem tenim moltes possibilitats de que el programa rebenti o ens agafi 'porqueria' a la memòria que tenim més enllà de les dimensions que hem delimitat per números. En canvi si tenim una llista que volem que sigui d'"infinites" entrades haurem d'emprar punters i anar-els-hi creant la memòria a mesura que els entrem.</p>
<p>Això ho veig un xic més complex així que només posaré un parell d'exemples de demanar memòria però es veurà en més detall quan parli de tipus d'estructures d'emmagatzamament, més endevant.</p>
<p>Declarem un punter d'un tipus:</p>
<p><code>int *molts;</code></p>
<p>Ara demanem memòria per a la dada:</p>
<p><code>molts=(int *)malloc(sizeoff(int)); </code></p>
<p>Amb aquesta crida demanem espai de memòria amb malloc per a un punter de tipus int, el principi, amb la mida, això ho fem amb el sizeoff, d'int. Això ho podem fer amb qualsevol tipus de dada, siguin ja definides o estructures que creem nosaltres.</p>
]]></content:encoded>
			<wfw:commentRss>http://bloc.majomo.com/programacio-basica-punters/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programació bàsica (Funcions)</title>
		<link>http://bloc.majomo.com/programacio-basica-funcions/</link>
		<comments>http://bloc.majomo.com/programacio-basica-funcions/#comments</comments>
		<pubDate>Wed, 03 Oct 2007 13:35:06 +0000</pubDate>
		<dc:creator>mad93</dc:creator>
				<category><![CDATA[Programació]]></category>
		<category><![CDATA[c/c++]]></category>

		<guid isPermaLink="false">http://bloc.majomo.com/2007/10/03/programacio-basica-funcions/</guid>
		<description><![CDATA[En c fem us de les funcions. Un exemple de funció que ja hem vist és per exemple el main, que com vàrem veure, retorna un int (enter) mitjançant return 0; . Recordem que ho fixavem a zero perquè realment no ens importa el valor de la variable retornada, senzillament per a gcc el main, [...]]]></description>
			<content:encoded><![CDATA[<p>En c fem us de les funcions. Un exemple de funció que ja hem vist és per exemple el main, que com vàrem veure, retorna un int (enter) mitjançant return 0; . Recordem que ho fixavem a zero perquè realment no ens importa el valor de la variable retornada, senzillament per a gcc el main, per definició, és un int i per tant hem de fer que torni un valor enter.<span id="more-25"></span></p>
<p>Tal com la funció main retorna un enter, podem fer una funció que retorni un caràcter, un real, cadena o fins i tot estructures ( recordar typedef struct). Això fa que una funció pugui retornar un valor amb només return &lt;variable&gt;;</p>
<p><code><br />
float donarreal(float variable)<br />
{<br />
float variable2=0; //Això és un comentari, és ignorat per el compilador, inicialitzem a 0 la variable2<br />
variable2 = variable/40;<br />
return variable2;<br />
}</code></p>
<p>Com podem veure aquesta funció retorna un real, variable2.  Si us hi fixeu he inicialitzat variable2 amb un valor igual a 0, però realment no feia feina, ja que la primera operació que fem amb ella és assignar-li el valor de variable dividit entre 40. Tot i no ser necessari en aquest cas és una bona costum, doncs quan creem una variable, aquesta rep una posició física a la memòria, que pot tenir ja dades emprades anteriorment, pel que voldrem tenir-hi un valor vàlid per a l'aplicació i no un d'aleatori.</p>
<p>Com ja haureu les funcions tenen una limitació important per si soles, doncs només poden retornar una variable, I els valors que se l'hi passen, com ara "variable", només canvien el seu valor mentre estan dintre de la funció, un cop sortim de la funció, es perden els canvis fets. És a dir, si dintre la funció féssim "variable=0;" , al sortir de la funció aquest canvi es perdria. Perquè? Doncs perquè quan passem una variable a una funció així, el que fem és fer una còpia de la variable original en una nova posició de memòria, el que fa que tots els canvis que hi fem no afectin a la variable de la funció mare, la original. La solució per a que una variable sigui modificada des d'una funció filla és l'ús de punters, que explicaré un altre dia <img src='http://bloc.majomo.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Fins ara hem vist com fer una funció, però com la cridem? Una crida de funció és el mateix que quan escrius la seva definició però simplificada (doncs al estar definida els paràmetres ja sabem de quin tipus és cadascun). En el cas  de l'anterior funció donarreal:</p>
<p><code><br />
novavariable=donarreal(variablevella);<br />
</code></p>
<p>"novavariable" i "variablevella" són dues dades de tipus float (real) i el que fem aquí és passar-li la "variablevella" a la funció donarreal (com veiem el nom no té perquè ser igual al que hem posat a la definició de la funció). i llavors la funció ens retorna un valor real (float) que emmagatzemarem dintre de "novavariable".</p>
]]></content:encoded>
			<wfw:commentRss>http://bloc.majomo.com/programacio-basica-funcions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programació bàsica de c (Estructures de control)</title>
		<link>http://bloc.majomo.com/programacio-basica-de-c-estructures-de-control/</link>
		<comments>http://bloc.majomo.com/programacio-basica-de-c-estructures-de-control/#comments</comments>
		<pubDate>Sun, 16 Sep 2007 04:24:58 +0000</pubDate>
		<dc:creator>mad93</dc:creator>
				<category><![CDATA[Programació]]></category>
		<category><![CDATA[c/c++]]></category>

		<guid isPermaLink="false">http://bloc.majomo.com/2007/09/16/programacio-basica-de-c-estructures-de-control/</guid>
		<description><![CDATA[Per a programar decentment necessitem emprar estructures de control. Bàsicament són condicionals que executen un codi mentre la condició es compleix. N'hi ha uns quants, però veurem els més bàsics, amb el que es pot fer pràcticament tot:
if 
En anglès vol dir "si". És a dir , si la condició és compleix fes....

if(opcio==1)
{
//codi
}
En aquest cas [...]]]></description>
			<content:encoded><![CDATA[<p>Per a programar decentment necessitem emprar estructures de control. Bàsicament són condicionals que executen un codi mentre la condició es compleix. N'hi ha uns quants, però veurem els més bàsics, amb el que es pot fer pràcticament tot:<span id="more-16"></span></p>
<p><strong>if </strong></p>
<p>En anglès vol dir "si". És a dir , si la condició és compleix fes....</p>
<p><code><br />
if(opcio==1)<br />
{<br />
//codi<br />
}</code></p>
<p>En aquest cas sí opció val 1 s'executarà el codi dintre de la funció. Aquí veiem un parell de coses. Primera, quan es compara s'empra == i no pas =, = és per donar un valor, i == per comparar-lo. Segon, les funcions van delimitades amb { } si tenen més d'una línia de codi. Això ja ho havíem vist quan vàrem fer el programa hola món, on el codi del main també anava entre { }.</p>
<p>Però el if té més possibilitats, el else if, que ve a ser "sino és compleix i si", i finalment else, que és quan no es compleix res de res:</p>
<p><code><br />
if(opcio==1)<br />
{<br />
printf("Entro al if");<br />
}<br />
else if(opcio==2)<br />
{<br />
printf("Entro al else if");<br />
}<br />
else if(opcio==3)<br />
{<br />
printf("Entro al segon else if");<br />
}<br />
else<br />
{<br />
printf("Com que no puc entrar enlloc més, entro al else");<br />
}</code></p>
<p>Cal saber que ni el else if ni el else són necessaris, són opcionals.</p>
<p><strong>for</strong></p>
<p>Aquesta funció és una iteració en que es fixa el valor d'una variable, quina condició s'ha de complir i que s'ha de fer cada vegada que s'entri a la funció:</p>
<p><code><br />
for(i=0;i&gt;1000;i++)<br />
{<br />
printf("Doncs això mil vegades, de 0 a 999");<br />
}</code></p>
<p>Primer diem que i val 0, llavors que mentre i sigui més petit que 1000 executi el codi que té dintre, en aquest cas el printf. El tercer paràmetre fa que quan acabi d'executar-se el contingut de for s'augmenti i en 1, és a dir i++ és igual que posar i=i+1. Cal també dir que si poséssim ++i, la variable augmentaria de valor <strong>abans</strong> d'executar-se el contingut del for.</p>
<p><strong> while </strong></p>
<p>Aquesta funció executa un codi mentre la condició es compleixi, tant fa si no entra mai, com si s'executa un milió de vegades:</p>
<p><code><br />
while(sortir==0)<br />
{<br />
//programa<br />
}</code></p>
<p>Això pot ser, per exemple, la iteració d'un programa, que s'executa fins que li diem que volem sortir, canviant el valor de sortir per un 1 o algun altre valor.</p>
<p><strong>switch</strong></p>
<p>Aquesta funció és molt útil per a fer un menú, per exemple. És com un if un xic més complex:</p>
<p><code><br />
switch(variable)<br />
{<br />
case '1':<br />
//codi<br />
break;<br />
case '2':<br />
//codi<br />
break;<br />
case '3':<br />
//codi<br />
break;<br />
}</code></p>
<p>Veiem que analitzarem la variable "variable", i que aquesta serà un char, d'aquí les cometes entre les que va la variable. És millor fer servir un char que no pas un int, doncs si ens posen un valor que no sigui un enter, el nostre programa segurament petaria...</p>
<p>El break; serveix per a que pari d'executar codi, si per exemple entréssim al case '1' i no poséssim el break; al final, també s'executaria el codi de case '2' i així anar fent. A vegades ens pot interessar per a una determinada funció que això sigui així, però normalment no és el cas.</p>
<p>Ara ja hem vist unes quantes estructures de control bàsiques amb les que es pot fer molta cosa.</p>
]]></content:encoded>
			<wfw:commentRss>http://bloc.majomo.com/programacio-basica-de-c-estructures-de-control/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programació bàsica de c (Tipus)</title>
		<link>http://bloc.majomo.com/programacio-basica-de-c-tipus/</link>
		<comments>http://bloc.majomo.com/programacio-basica-de-c-tipus/#comments</comments>
		<pubDate>Sat, 15 Sep 2007 20:39:15 +0000</pubDate>
		<dc:creator>mad93</dc:creator>
				<category><![CDATA[Programació]]></category>
		<category><![CDATA[c/c++]]></category>

		<guid isPermaLink="false">http://bloc.majomo.com/2007/09/15/programacio-basica-de-c-tipus/</guid>
		<description><![CDATA[Els tipus en C són elements definits al llenguatge de programació per emmagatzemar dades. Aquí en llistaré uns quants d'ells, amb què guarden i quins són els seus rangs de valors.


Tipus
Descripció


char
Guarda un caràcter (%c)


int
Guarda un enter (%d)


float
Guarda un nombre decimal (%f)


double
Guarda un nombre decimal, té més capacitat que un tipus float (%f)


char
Guarda un caràcter (%c)


Com [...]]]></description>
			<content:encoded><![CDATA[<p>Els tipus en C són elements definits al llenguatge de programació per emmagatzemar dades. Aquí en llistaré uns quants d'ells, amb què guarden i quins són els seus rangs de valors.<span id="more-9"></span></p>
<table>
<tr>
<th>Tipus</th>
<th>Descripció</th>
</tr>
<tr>
<td>char</td>
<td>Guarda un caràcter (%c)</td>
</tr>
<tr>
<td>int</td>
<td>Guarda un enter (%d)</td>
</tr>
<tr>
<td>float</td>
<td>Guarda un nombre decimal (%f)</td>
</tr>
<tr>
<td>double</td>
<td>Guarda un nombre decimal, té més capacitat que un tipus float (%f)</td>
</tr>
<tr>
<td>char</td>
<td>Guarda un caràcter (%c)</td>
</tr>
</table>
<p>Com podeu veure no hi ha definit cap tipus string (cadena) ja que per a C una cadena és un array de chars. El tipus double és un tipus float de més bytes, pel que pot contenir un número més gran que no pas float.</p>
<p>Aquí ja podem veure que aquests tipus tot just cobreixen les necessitats bàsiques, i que de voler fer una cosa més complexa haurem de definir els nostres propis tipus de dades mitjançant aquests tipus explicats a dalt.</p>
<p>Per a fer-ho podem emprar el typedef, aquí un exemple de com es declararia un nou tipus, a mode d'exemple:</p>
<p>typedef  char mot[40];</p>
<p>typedef struct{<br />
mot model;<br />
int unitats;<br />
}electro;</p>
<p>Com podeu veure el primer typedef el que fa és definir un nou tipus mot, que es tracta d'un array de 40 chars, una cadena.  El segon typedef ens defineix una estructura, d'aquí el struct, on s'hi diu que hi ha un tipus mot anomenat model i un tipus int (enter) anomenat unitats. El nom del nou tipus va al final, que seria electro.</p>
]]></content:encoded>
			<wfw:commentRss>http://bloc.majomo.com/programacio-basica-de-c-tipus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programació bàsica de c (operadors i condicionals)</title>
		<link>http://bloc.majomo.com/programacio-basica-de-c-operadors-i-condicionals/</link>
		<comments>http://bloc.majomo.com/programacio-basica-de-c-operadors-i-condicionals/#comments</comments>
		<pubDate>Fri, 24 Aug 2007 21:47:52 +0000</pubDate>
		<dc:creator>mad93</dc:creator>
				<category><![CDATA[Programació]]></category>
		<category><![CDATA[c/c++]]></category>

		<guid isPermaLink="false">http://bloc.majomo.com/2007/08/24/programacio-basica-de-c-operadors-i-condicionals/</guid>
		<description><![CDATA[Faré una breu ullada als operadors i estructures condicionals, molt lleugera per fer-nos una idea de que fan, però on realment es veu és a la pràctica  
Operadors
Els operadors ens permeten fer operacions de suma, resta, lògica,... per a emprar-los als nostres condicionals i efectuar les operacions matemàtiques necessàries. Aquest només és una breu [...]]]></description>
			<content:encoded><![CDATA[<p>Faré una breu ullada als operadors i estructures condicionals, molt lleugera per fer-nos una idea de que fan, però on realment es veu és a la pràctica <img src='http://bloc.majomo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <span id="more-8"></span></p>
<p><strong>Operadors</strong></p>
<p>Els operadors ens permeten fer operacions de suma, resta, lògica,... per a emprar-los als nostres condicionals i efectuar les operacions matemàtiques necessàries. Aquest només és una breu llista, de fet n'hi ha força més, però per començar aquests seran més que suficents.</p>
<table>
<tr>
<th>Operadors</th>
<th>Descripció</th>
</tr>
<tr>
<td>++</td>
<td>Suma u a la variable, si es posa davant ho fa prèviament i si es posa darrera ho fa posteriorment</td>
</tr>
<tr>
<td>--</td>
<td>Resta u a la variable, si es posa davant ho fa prèviament i si es posa darrera ho fa posteriorment</td>
</tr>
<tr>
<td>()</td>
<td>Delimita una funció</td>
</tr>
<tr>
<td>[]</td>
<td>Delimita un array o cadena</td>
</tr>
<tr>
<td>+ -</td>
<td>Suma i resta</td>
</tr>
<tr>
<td>*</td>
<td>Producte</td>
</tr>
<tr>
<td>/ %</td>
<td>Divisió i mòdul (resta de la divisió)</td>
</tr>
<tr>
<td>&lt; &lt;=</td>
<td>Més petit que i més petit o igual que</td>
</tr>
<tr>
<td>&gt; &gt;=</td>
<td>Més gran que i més gran o igual que</td>
</tr>
<tr>
<td>&amp;&amp;</td>
<td>I lògic (and)</td>
</tr>
<tr>
<td>||</td>
<td>O lògic (or)</td>
</tr>
<tr>
<td>=</td>
<td>Assignació de valor</td>
</tr>
<tr>
<td>+= -= *= /= %=</td>
<td>La variable de la dreta es suma, resta, ... a la variable de l'esquerra</td>
</tr>
<tr>
<td>==</td>
<td>Compara dues variables</td>
</tr>
<tr>
<td>[]</td>
<td>Delimita un array o cadena</td>
</tr>
</table>
<p><strong>Estructures condicionals</strong></p>
<p>Ara que tenim operadors podem llistar les diverses estructures condicionals que podem emprar a C.</p>
<p><strong>If</strong>: Aquesta estructura fa que s'executi el codi que conté sí la condició que li donem es compleix.<br />
<code><br />
if(i==1)<br />
{<br />
}<br />
else if (i==2)<br />
{<br />
}<br />
else<br />
{<br />
}<br />
</code></p>
<p>El if sempre ha de ser la primera condició, si i val 1 llavors executaria el codi dintre dels seus {}. Si no ho fós llavors miraria el "else if", que ve a di, si no és compleix el if.... En aquest cas miraríem si i val 2. Si es complís executaríem el codi dintre dels seus claudàtors ({}). Finalment el codi de l'else s'executaria si cap dels dos complissin la codició que s'ha imposat.  Es poden posar tants else if com els vulgui però el primer ha de ser un if. El else no és necessari, només en cas que volguem que faci alguna cosa si cap de les condicions s'ha complert.</p>
<p><strong>while:</strong> Aquesta estructura s'executarà continuament fins que la condició es deixi de complir. Va molt bé per a fer bucles que no parin de repetir-se fins que vulguem.</p>
<p><code><br />
while(i&lt;100)<br />
{<br />
}<br />
</code></p>
<p><strong>for</strong>: Aquesta estructura s'executa fins que la condició es compleix. Cal dir que el for va bé quan sabem quantes iteracions volem que es produeixin</p>
<p><code><br />
for(i=0;i&lt;1000;i++)<br />
{<br />
}</code></p>
<p>El for rep tres paràmetres separats per punt i coma. El primer és la inicialització del valor de la variable, el segon la condició que mentre compleixi s'anirà executant una i altre vegada i finalment que ha de fer quan acabi una iteració. En aquest cas faria 1000 execucions, de 0 a 999, ja que quan la i valgués 1000 aquesta deixaria de ser lògicament més petita que 1000 <img src='http://bloc.majomo.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>switch</strong>: Aquesta funció és molt útil per a fer menús per exemple. El switch rep una variable i realitza una o altre acció en funció del seu valor.</p>
<p><code><br />
switch(opcio)<br />
{<br />
case: 'A':<br />
//Codi a executar-se<br />
break;<br />
case 'B':<br />
break;<br />
}<br />
</code></p>
<p>Si es complís que opció valgués A, s'executaria el codi de sota fins al break; (compte, si no es posa break continuaria executant instruccions fins a veure'n un o acabar el switch, tot i que a vegades pot interessar precisament això).</p>
<p>Amb això ja quasi podríem fer un programa, encara ens faltarà per veure els tipus de dades que empra C, a la propera ho veiem.</p>
]]></content:encoded>
			<wfw:commentRss>http://bloc.majomo.com/programacio-basica-de-c-operadors-i-condicionals/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
