<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Il blog di Pellegrino Francesco</title>
	<atom:link href="http://pellegrinofrc.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://pellegrinofrc.wordpress.com</link>
	<description>L'eco di ognuno di noi, si riflette sull'eternità della vita.</description>
	<lastBuildDate>Sun, 24 Apr 2011 20:23:32 +0000</lastBuildDate>
	<language>it</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='pellegrinofrc.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Il blog di Pellegrino Francesco</title>
		<link>http://pellegrinofrc.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://pellegrinofrc.wordpress.com/osd.xml" title="Il blog di Pellegrino Francesco" />
	<atom:link rel='hub' href='http://pellegrinofrc.wordpress.com/?pushpress=hub'/>
		<item>
		<title>La nostra prima applicazione con Qt 4</title>
		<link>http://pellegrinofrc.wordpress.com/2008/11/02/la-nostra-prima-applicazione-con-qt-4/</link>
		<comments>http://pellegrinofrc.wordpress.com/2008/11/02/la-nostra-prima-applicazione-con-qt-4/#comments</comments>
		<pubDate>Sun, 02 Nov 2008 15:04:41 +0000</pubDate>
		<dc:creator>Francesco Pellegrino</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[primo]]></category>
		<category><![CDATA[programma]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[qt4]]></category>

		<guid isPermaLink="false">http://pellegrinofrc.wordpress.com/?p=136</guid>
		<description><![CDATA[In questo post creiamo una semplice applicazione in C++ sfruttando le librerie del framework Qt. Precisiamo che le interfaccie grafiche possono essere create per mezzo dell&#8217;ausilio dell&#8217;apposito Qt Designer, fornito sempre dalla trolltech, ma noi realizziamo tutto via codice, in maniera comunque semplice e veloce. La prima cosa da fare è includere tutti i file [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pellegrinofrc.wordpress.com&amp;blog=4057675&amp;post=136&amp;subd=pellegrinofrc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In questo post creiamo una semplice applicazione in C++ sfruttando le librerie del framework Qt. Precisiamo che le interfaccie grafiche possono essere create per mezzo dell&#8217;ausilio dell&#8217;apposito Qt Designer, fornito sempre dalla trolltech, ma noi realizziamo tutto via codice, in maniera comunque semplice e veloce. La prima cosa da fare è includere tutti i file di header di cui si serve la nostra applicazione<br />
</p>
<p style="text-indent:0;margin:0;"><span style="color:#0000ff;">#include</span> <span style="color:#0000ff;">&lt;QApplication&gt;</span> <span style="color:#339966;">//Classe per l&#8217;applicazzione, necessaria in qualsiasi programma</span></p>
<p style="text-indent:0;margin:0;"><span style="color:#0000ff;">#include</span> <span style="color:#0000ff;">&lt;QPushButton&gt;</span> <span style="color:#339966;">//Classe per il bottone della finestra</span></p>
<p style="text-indent:0;margin:0;"><span style="color:#0000ff;">#include</span> <span style="color:#0000ff;">&lt;QWidget&gt;</span> <span style="color:#339966;">//Classe per la form</span></p>
<p></p>
<p style="text-indent:0;margin:0;"><span style="color:#339966;"><br />
</span></p>
<blockquote>
<p style="text-indent:0;margin:0;">
</blockquote>
<p style="text-indent:0;margin:0;">
<p style="text-indent:0;margin:0;">Dopodiché andiamo a creare la nostra funzione principale main, il classico punto di ingresso del nostro programma.</p>
<p></p>
<p style="text-indent:0;margin:0;"><strong>int</strong> main(<strong>int</strong> argc, <strong>char</strong> *argv[])</p>
<p style="text-indent:0;margin:0;">{</p>
<p></p>
<p style="text-indent:0;margin:0;">Dentro alla funziona main, creiamo un&#8217;istanza della classe QApplication, che rappresenta la nostra applicazione, e che è sempre necessaria in qualsiasi programma realizzato con Qt. Come parametri di ingresso, passiamo gli stessi parametri che riceviamo tramite la funzione main, ovvero argc e argv.</p>
<p></p>
<p style="text-indent:0;margin:0;"><span style="color:#993366;">QApplication</span> a(argc, argv);</p>
<p></p>
<p style="text-indent:0;margin:0;">A questo punto creiamo la nostra form, ovvero l&#8217;interfaccia grafica (la finestra) che rappresenta la nostra applicazione e che conterrà i vari widgets (bottoni, label, etc&#8230;). Inoltre diamo alla form una dimensione in pixel di 200&#215;200.</p>
<p></p>
<p style="text-indent:0;margin:0;"><span style="color:#993366;">QWidget </span>w;</p>
<p style="text-indent:0;margin:0;">w.resize(200, 200);</p>
<p></p>
<p style="text-indent:0;margin:0;">A tal punto, creiamo un bottone, che ci servirà come metto per chiudere la nostra applicazione. Per farlo instanziamo la classe QPushButton. Instanziando la classe, diamo come parametri al suo costruttore il nome che sarà visualizzato nel tasto (primo parametro) e l&#8217;indirizzo dell&#8217;oggetto che ospita il nostro bottone, ovvero la form (secondo parametro). Poi, diamo anche le dimensioni di larghezza e altezza del tasto (primo e secondo parametro) e la posizione sulla form (terzo e quarto parametro); il tutto grazie alla funzione setGeometry(&#8230;);</p>
<p></p>
<p style="text-indent:0;margin:0;"><span style="color:#993366;">QPushButton</span> btn(<span style="color:#ff0000;">&#8220;Esci&#8221;</span>, &amp;w);</p>
<p style="text-indent:0;margin:0;">btn.setGeometry(50, 50, 85, 85);</p>
<p></p>
<p style="text-indent:0;margin:0;">Adesso, non ci resta che rendere visibile la nostra interfaccia grafica, associare un&#8217;azione al bottone (ovvero quella di chiudere l&#8217;applicazione) e infine mandiamo in esecuzione l&#8217;applicazione, ovvero l&#8217;oggetto a, instanziato all&#8217;inizio dalla classe QApplication.</p>
<p></p>
<p style="text-indent:0;margin:0;"><span style="color:#993366;">QObject</span>::connect(&amp;btn, <span style="color:#ffcc00;">SIGNAL</span>(clicked()), &amp;a, <span style="color:#ffcc00;">SLOT</span>(quit()));</p>
<p style="text-indent:0;margin:0;"><strong>return</strong> a.exec();</p>
<p style="text-indent:0;margin:0;">}</p>
<p></p>
<p style="text-indent:0;margin:0;">L&#8217;azione al bottone, come potete vedere dal codice soprastante, viene data per mezzo l&#8217;uso dei SIGNALS e SLOTS, che per spiegarli in maniera efficiente avremmo bisogno di un altro articolo abbastanza lungo. In poche parole vi basta sapere che in quel caso, il segnale è mandato dal bottone, e lo slot ricevente è l&#8217;applicazione, che è proprio colei che riceve il segnale di chiusura.</p>
<p style="text-indent:0;margin:0;">
<p style="text-indent:0;margin:0;">Provate quindi a unire tutte le righe di codice in un unico file .cpp ed eseguirlo tramite con Ctrl+R se state usando QT Creator IDE, oppure lanciate i seguenti comandi una volta posizionati dentro la cartella del progetto:</p>
<p></p>
<p style="text-indent:0;margin:0;"><strong><em>qmake -project</em></strong></p>
<p style="text-indent:0;margin:0;"><strong><em>qmake</em></strong></p>
<p style="text-indent:0;margin:0;"><strong><em>make</em></strong></p>
<p></p>
<p style="text-indent:0;margin:0;"><strong><em><br />
</em></strong></p>
<p style="text-indent:0;margin:0;">
<p style="text-indent:0;margin:0;">Quindi, lanciate l&#8217;applicazione, e notate l&#8217;effetto finale <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p></p>
<p style="text-indent:0;margin:0;"><img class="alignnone" title="Qt Software 1" src="http://galaxy.helloweb.eu/blogcache/Qt_soft1.JPG" alt="" width="218" height="236" /></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pellegrinofrc.wordpress.com/136/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pellegrinofrc.wordpress.com/136/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pellegrinofrc.wordpress.com/136/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pellegrinofrc.wordpress.com/136/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pellegrinofrc.wordpress.com/136/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pellegrinofrc.wordpress.com/136/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pellegrinofrc.wordpress.com/136/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pellegrinofrc.wordpress.com/136/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pellegrinofrc.wordpress.com/136/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pellegrinofrc.wordpress.com/136/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pellegrinofrc.wordpress.com/136/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pellegrinofrc.wordpress.com/136/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pellegrinofrc.wordpress.com/136/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pellegrinofrc.wordpress.com/136/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pellegrinofrc.wordpress.com&amp;blog=4057675&amp;post=136&amp;subd=pellegrinofrc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pellegrinofrc.wordpress.com/2008/11/02/la-nostra-prima-applicazione-con-qt-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e79f68f765445dbe52502466e51492dd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pellegrinofrsc</media:title>
		</media:content>

		<media:content url="http://galaxy.helloweb.eu/blogcache/Qt_soft1.JPG" medium="image">
			<media:title type="html">Qt Software 1</media:title>
		</media:content>
	</item>
		<item>
		<title>Sviluppare con Qt 4.4 Cross-Platform Application Framework</title>
		<link>http://pellegrinofrc.wordpress.com/2008/11/02/sviluppare-con-qt-44-cross-platform-application-framework/</link>
		<comments>http://pellegrinofrc.wordpress.com/2008/11/02/sviluppare-con-qt-44-cross-platform-application-framework/#comments</comments>
		<pubDate>Sun, 02 Nov 2008 11:25:41 +0000</pubDate>
		<dc:creator>Francesco Pellegrino</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[qt creator]]></category>

		<guid isPermaLink="false">http://pellegrinofrc.wordpress.com/?p=131</guid>
		<description><![CDATA[Come forse molti di voi sapranno è da un bel pò di tempo uscita una nuova versione del famoso framework di librerie per lo sviluppo di applicativi multipiattaforma. Sto parlando di Qt giunto alla versione 4.4 che ha portato molte migliorie e sopratutto novità! Non sto ad entrare nei dettagli tecnici ma passo subito al [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pellegrinofrc.wordpress.com&amp;blog=4057675&amp;post=131&amp;subd=pellegrinofrc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://trolltech.com/logo.png"><img class="alignnone" title="Qt Logo" src="http://trolltech.com/logo.png" alt="" width="174" height="71" /></a></p>
<p>Come forse molti di voi sapranno è da un bel pò di tempo uscita una nuova versione del famoso framework di librerie per lo sviluppo di applicativi multipiattaforma. Sto parlando di Qt giunto alla versione 4.4 che ha portato molte migliorie e sopratutto novità! Non sto ad entrare nei dettagli tecnici ma passo subito al dunque; molti neofiti del settore possono scoraggiarsi nell&#8217;usare queste librerie assieme al linguaggio C++ per il semplice motivo che raggiungere un buon prodotto finale risulta più faticoso rispetto a quanto possa esserlo usando Visual Studio e linguaggio come il Visual Basic. Ma <strong>non scoraggiatevi </strong>con Qt avete ormai a disposizione tutto quello di cui c&#8217;è bisogno. Esiste la versione Open Source, che vi permette di sfruttare tutta la potenza di tali librerie a costo 0, con la sola imposizione di creare software esclusivamente Open Source e non commerciale, per quello bisogna comprarle. Inoltre il framework vi offre tante funzioni e comodità che aiutano nello sviluppo di software. Per sviluppare con Qt potete godere di questi componenti:</p>
<ol style="list-style-type:decimal;">
<li><strong>Librerie Qt</strong> (per Windows, Linux o MacOS) scaricabili dal sito ufficiale</li>
<li><strong>Qt Designer</strong> (incluso nell&#8217;istaller per Windows e separatamente per altri OS) scaricabile sempre dal sito ufficiale.</li>
<li><strong>Qt Assistant</strong> (incluso nell&#8217;istaller per Windows e separatamente per altri OS) che vi aiuterà come riferimento al framework, diciamo una sorta di MSDN.</li>
<li><strong>Qt Creator</strong> è un IDE (es. Visual Studio, per capirci) che ci permette di sviluppare con più comodità, evitando di lavoare quasi esclusivamenet solo via codice, come avveniva fino a tempo fa. La versione è ancora ALPHA, e la release ufficiale stabile è prevista con l&#8217;uscita di Qt 4.5; è disponibile anche una versione di un IDE chiamato <strong>QDevelop</strong> che non è creato dalla società che ha sviluppato Qt, ma che risulta comunque valido (non l&#8217;ho mai provato).</li>
</ol>
<p><span style="font-size:medium;"><span style="color:blue;"><strong>Chi usa Qt?</strong></span></span><br />
Bene, questa domanda ha una risposta che a molti lettori dovrebbe dare una certa fiducia. Qt è usato da: <strong>Adobe, Skype Limited, Firefox </strong><em>(in furuto)</em><strong>, VCL Media Player </strong><em>(partendo dall&#8217;ultima versione)</em><strong>, Tor, KDE </strong><em>(l&#8217;intero ambiente desktop di molte distro Linux)</em>, e altri ancora&#8230;</p>
<p><strong><span style="font-size:medium;"><span style="color:blue;">Inoltre..</span></span></strong><span style="font-size:medium;"><span style="color:blue;"><br />
</span></span><strong>Qt è disponibile per qualsiasi piattaforma dekstop</strong> come Windows, Linux e MacOS. Le applicazioni finali per cui, saranno facilmente trasportabili da una piattaforma all&#8217;altra con poche modifiche. In più, la nuova versione è approdata <strong>anche su dispositivi mobili, come cellulari</strong> che usano Symbian come OS.</p>
<p>Una notazione <span style="text-decoration:underline;">importantissima:</span> già dalle ultime versioni di Qt, arrivando all&#8217;attuale 4.4 è possibile utilizzarle con tanti linguaggi di programmazione, senza soffermarci per forza al C++. Infatti, Qt è interfacciabile anche con Java, Python e Ruby (se non erro).</p>
<p>Tale framework è oggi giorno sponsorizzato da tanti grossi del settore come: <em>Epson, Google, AMD, Volvo, Philips&#8230;</em></p>
<p><em>Curiosità: la versione Estesa di Qt (quella commerciale) permette anche l&#8217;interfacciamente con Visual Studio).</em></p>
<p><em></em>Non sarà la perfezione, non saranno veloci come la luce, ma non si può dire che siano un cattivo prodotto <img class="inlineimg" title="Wink2" src="http://www.playanueva.com/images/smilies/wink2.gif" border="0" alt="" /></p>
<p><span style="text-decoration:underline;"><strong>Il sito ufficiale:</strong></span> <a href="http://trolltech.com/products" target="_blank">http://trolltech.com/products</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pellegrinofrc.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pellegrinofrc.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pellegrinofrc.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pellegrinofrc.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pellegrinofrc.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pellegrinofrc.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pellegrinofrc.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pellegrinofrc.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pellegrinofrc.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pellegrinofrc.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pellegrinofrc.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pellegrinofrc.wordpress.com/131/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pellegrinofrc.wordpress.com/131/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pellegrinofrc.wordpress.com/131/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pellegrinofrc.wordpress.com&amp;blog=4057675&amp;post=131&amp;subd=pellegrinofrc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pellegrinofrc.wordpress.com/2008/11/02/sviluppare-con-qt-44-cross-platform-application-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e79f68f765445dbe52502466e51492dd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pellegrinofrsc</media:title>
		</media:content>

		<media:content url="http://trolltech.com/logo.png" medium="image">
			<media:title type="html">Qt Logo</media:title>
		</media:content>

		<media:content url="http://www.playanueva.com/images/smilies/wink2.gif" medium="image">
			<media:title type="html">Wink2</media:title>
		</media:content>
	</item>
		<item>
		<title>Intervista a Dario Fo</title>
		<link>http://pellegrinofrc.wordpress.com/2008/11/01/intervista-a-dario-fo/</link>
		<comments>http://pellegrinofrc.wordpress.com/2008/11/01/intervista-a-dario-fo/#comments</comments>
		<pubDate>Sat, 01 Nov 2008 19:23:28 +0000</pubDate>
		<dc:creator>Francesco Pellegrino</dc:creator>
				<category><![CDATA[Attualità & Mondo]]></category>
		<category><![CDATA[Dario]]></category>
		<category><![CDATA[Fo]]></category>
		<category><![CDATA[gelmini]]></category>
		<category><![CDATA[governo]]></category>
		<category><![CDATA[intervista]]></category>
		<category><![CDATA[scuola]]></category>
		<category><![CDATA[università]]></category>

		<guid isPermaLink="false">http://pellegrinofrc.wordpress.com/?p=126</guid>
		<description><![CDATA[Volevo postare questa intervista fatta a Dario Fo da beppegrillo.it. L&#8217;intervista parla prevalentemente della scuola, della situazione unviersitaria e del governo attuale.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pellegrinofrc.wordpress.com&amp;blog=4057675&amp;post=126&amp;subd=pellegrinofrc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Volevo postare questa intervista fatta a Dario Fo da beppegrillo.it. L&#8217;intervista parla prevalentemente della scuola, della situazione unviersitaria e del governo attuale.</p>
<span style="text-align:center; display: block;"><a href="http://pellegrinofrc.wordpress.com/2008/11/01/intervista-a-dario-fo/"><img src="http://img.youtube.com/vi/wgphdGySuQ0/2.jpg" alt="" /></a></span>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pellegrinofrc.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pellegrinofrc.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pellegrinofrc.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pellegrinofrc.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pellegrinofrc.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pellegrinofrc.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pellegrinofrc.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pellegrinofrc.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pellegrinofrc.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pellegrinofrc.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pellegrinofrc.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pellegrinofrc.wordpress.com/126/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pellegrinofrc.wordpress.com/126/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pellegrinofrc.wordpress.com/126/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pellegrinofrc.wordpress.com&amp;blog=4057675&amp;post=126&amp;subd=pellegrinofrc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pellegrinofrc.wordpress.com/2008/11/01/intervista-a-dario-fo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e79f68f765445dbe52502466e51492dd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pellegrinofrsc</media:title>
		</media:content>
	</item>
		<item>
		<title>C++ &#124; Parametri e indirizzi</title>
		<link>http://pellegrinofrc.wordpress.com/2008/08/24/c-parametri-e-indirizzi/</link>
		<comments>http://pellegrinofrc.wordpress.com/2008/08/24/c-parametri-e-indirizzi/#comments</comments>
		<pubDate>Sun, 24 Aug 2008 00:38:11 +0000</pubDate>
		<dc:creator>Francesco Pellegrino</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[funzioni]]></category>
		<category><![CDATA[indirizzo]]></category>
		<category><![CDATA[parametri]]></category>

		<guid isPermaLink="false">http://pellegrinofrc.wordpress.com/?p=103</guid>
		<description><![CDATA[Eccoci con un altro post sul linguaggio C++. In questo articolo parlerò degli indirizzi e dei parametri delle funzioni. Come credo sapete, il C++ come il C permette due metodi per passare dei parametri a una funzione: per valore e per indirizzo. Il passaggio di parametri per valore, crea una copia del dato che si [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pellegrinofrc.wordpress.com&amp;blog=4057675&amp;post=103&amp;subd=pellegrinofrc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Eccoci con un altro post sul linguaggio C++. In questo articolo parlerò degli indirizzi e dei parametri delle funzioni. Come credo sapete, il C++ come il C permette due metodi per passare dei parametri a una funzione: per valore e per indirizzo. Il passaggio di parametri per valore, crea una copia del dato che si sta passando come parametro, di conseguenza non si agisce effettiamente sull&#8217;indirizzo in cui risidere il dato. Il passaggio per indirizzo invece, fa lavorare la funzione direttamente sull&#8217;indirizzo dove risidere il dato. Il C metteva a disposizione un metodo per far ciò, che era più <em>manuale.</em> Ma il C++, oltre a supportare quella metodologia, usa anche una nuova pratica, che risulta anche meno complessa, più automatica, elegante e semplice. Vediamole con un esempio, l&#8217;utilizzo. Non spiego altro, perchè già questo argomento è indirizzato non ai soli principianti, ma agli utenti medi, o comunque a gente che studia seriamente il C++, per cui il codice assortito di commenti dovrebbe bastare a rendere l&#8217;idea <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<blockquote><p><span style="color:#0000ff;">#include &lt;cstdlib&gt;<br />
#include &lt;iostream&gt;</span></p>
<p>using namespace std;</p>
<p><strong>void</strong> Swap(<strong>int </strong>&amp;i, <strong>int</strong> &amp;j);<br />
<strong>void </strong>SSwap(<strong>int </strong>*p);</p>
<p><strong>int</strong> main(<span style="color:#000000;">int</span> argc, <strong>char </strong>*argv[])<br />
{<br />
<strong>int </strong>a, b, c, d, e;</p>
<p>a = <span style="color:#ff00ff;">1</span>;<br />
b = <span style="color:#ff00ff;">2</span>;<br />
c = <span style="color:#ff00ff;">3</span>;<br />
d = <span style="color:#ff00ff;">4</span>;</p>
<p><span style="color:#008000;"> //Usiamo la funzione Swap() &#8211; Stile C++</span><br />
cout &lt;&lt; <span style="color:#ff0000;">&#8220;A e B: &#8220;</span> &lt;&lt; a &lt;&lt; <span style="color:#ff0000;">&#8221; &#8220;</span> &lt;&lt; b &lt;&lt; endl;<br />
Swap(a, b);<br />
cout &lt;&lt; <span style="color:#ff0000;">&#8220;A e B con Swap: &#8220;</span> &lt;&lt; a &lt;&lt; <span style="color:#ff0000;">&#8221; &#8220;</span> &lt;&lt; b &lt;&lt; <span style="color:#ff0000;">&#8220;\n\n&#8221;</span>;</p>
<p>cout &lt;&lt; <span style="color:#ff0000;">&#8220;C e D: &#8221; </span>&lt;&lt; a &lt;&lt; <span style="color:#ff0000;">&#8221; &#8221; </span>&lt;&lt; b &lt;&lt; endl;<br />
Swap(c, d);<br />
cout &lt;&lt; <span style="color:#ff0000;">&#8220;C e D con Swap: &#8220;</span> &lt;&lt; c &lt;&lt; <span style="color:#ff0000;">&#8221; &#8220;</span> &lt;&lt; d &lt;&lt; <span style="color:#ff0000;">&#8220;\n\n&#8221; </span>&lt;&lt; <span style="color:#ff0000;">&#8220;* * *&#8221;</span> &lt;&lt; <span style="color:#ff0000;">&#8220;\n\n&#8221;</span>;</p>
<p><span style="color:#008000;">//Usiamo la funzione SSwap() &#8211; Veccio stile C manuale</span><br />
e = <span style="color:#ff00ff;">5</span>;<br />
cout &lt;&lt;<span style="color:#ff0000;"> &#8220;E: &#8221; </span>&lt;&lt; e &lt;&lt; endl;<br />
SSwap(&amp;e);<br />
cout &lt;&lt; <span style="color:#ff0000;">&#8220;E con SSwap: &#8220;</span> &lt;&lt; e &lt;&lt; endl;</p>
<p>getchar();<br />
<strong>return </strong>EXIT_SUCCESS;<br />
}</p>
<p><strong>void</strong> Swap(<span style="color:#000000;">int </span>&amp;i, <strong>int</strong> &amp;j)<br />
{</p>
<p><span style="color:#339966;">//esegue un&#8217;inversione dei valori tra le variabili</span><br />
<strong>int </strong>t;<br />
t = i;<br />
i = j;<br />
j = t;</p>
<p><span style="color:#008000;">/* Nello stile C++ non abbiamo bisogno di usare l&#8217;operatore *, basta dichiarare<br />
i parametri con l&#8217;operatore &amp;, e quindi diamo come parametri direttamente gli<br />
indirizzi. */</span><br />
}</p>
<p><strong>void</strong> SSwap(<span style="color:#000000;">int </span>*p)<br />
{</p>
<p><span style="color:#339966;">//Esegue un&#8217;inversione di segno della variabile</span><br />
*p = -*p;<br />
<span style="color:#008000;">/* Si noti che in questa funzione dobbiamo dire che come parametro accettiamo<br />
un puntatore. Nell&#8217;operare con i dati, abbiamo bisogno di usare l&#8217;operatore<br />
*, che indica &#8220;all&#8217;indirizzo di&#8221;, quindi agisce sul valore contenuto dall&#8217;indirizzo.<br />
Questo è il contrario di quanto avviene sopra, nello stile del C++ */</span><br />
}</p></blockquote>
<p>Si provi a compilare e eseguire il codice <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/pellegrinofrc.wordpress.com/103/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/pellegrinofrc.wordpress.com/103/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pellegrinofrc.wordpress.com/103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pellegrinofrc.wordpress.com/103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pellegrinofrc.wordpress.com/103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pellegrinofrc.wordpress.com/103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pellegrinofrc.wordpress.com/103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pellegrinofrc.wordpress.com/103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pellegrinofrc.wordpress.com/103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pellegrinofrc.wordpress.com/103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pellegrinofrc.wordpress.com/103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pellegrinofrc.wordpress.com/103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pellegrinofrc.wordpress.com/103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pellegrinofrc.wordpress.com/103/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pellegrinofrc.wordpress.com/103/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pellegrinofrc.wordpress.com/103/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pellegrinofrc.wordpress.com&amp;blog=4057675&amp;post=103&amp;subd=pellegrinofrc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pellegrinofrc.wordpress.com/2008/08/24/c-parametri-e-indirizzi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e79f68f765445dbe52502466e51492dd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pellegrinofrsc</media:title>
		</media:content>
	</item>
		<item>
		<title>Perchè usare le funzioni inline</title>
		<link>http://pellegrinofrc.wordpress.com/2008/08/20/perche-usare-le-funzioni-inline/</link>
		<comments>http://pellegrinofrc.wordpress.com/2008/08/20/perche-usare-le-funzioni-inline/#comments</comments>
		<pubDate>Wed, 20 Aug 2008 13:03:33 +0000</pubDate>
		<dc:creator>Francesco Pellegrino</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[funzioni]]></category>
		<category><![CDATA[inline]]></category>
		<category><![CDATA[motivi]]></category>
		<category><![CDATA[uso]]></category>

		<guid isPermaLink="false">http://pellegrinofrc.wordpress.com/?p=92</guid>
		<description><![CDATA[In questo articolo illustriamo un esempio e una spiegazione esaustiva ma concisa sulle funzioni inline in C++. Partò dalla presupposizione che sappiate già le basi del C e del C++, per cui vado subito all&#8217;esempio pratico, per descriverne le caratteristiche e varie: //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; /* Funzioni inline */ //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; #include &#60;stdio.h&#62; #include &#60;iostream&#62; using namespace std; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pellegrinofrc.wordpress.com&amp;blog=4057675&amp;post=92&amp;subd=pellegrinofrc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In questo articolo illustriamo un esempio e una spiegazione esaustiva ma concisa sulle funzioni <strong>inline</strong> in C++. Partò dalla presupposizione che sappiate già le basi del C e del C++, per cui vado subito all&#8217;esempio pratico, per descriverne le caratteristiche e varie:</p>
<p><span style="color:#008000;">//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span></p>
<p>/* Funzioni inline */</p>
<p>//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p><span style="color:#0000ff;">#include &lt;stdio.h&gt;<br />
#include &lt;iostream&gt;</span></p>
<p><span style="color:#000000;"><strong>using namespace</strong></span> std;</p>
<p><strong>inline int</strong> max(<strong>int</strong> a, <strong>int</strong> b)<br />
{<br />
<span style="color:#000000;">return</span> a &gt; b ? a : b;<br />
}</p>
<p><strong>int</strong> main(<strong>int </strong>argc, <strong><span style="color:#000000;">char</span></strong>* argv[])<br />
{<br />
cout &lt;&lt; max(<span style="color:#ff0000;">10</span>, <span style="color:#ff0000;">20</span>);<br />
cout &lt;&lt; &#8221; &#8221; &lt;&lt; max(<span style="color:#ff0000;">99</span>, <span style="color:#ff0000;">88</span>);</p>
<p>getchar();<br />
<span style="color:#000000;">return</span> <span style="color:#ff0000;">0</span>;<br />
}<br />
<span style="color:#008000;">//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span></p>
<p>La funzione inline si dichiara antecedendo appunto la parola chiave <strong>inline </strong>che non fa altro che effettuare una richiesta al processore, che può anche teoricamente non accettare tale richiesta. La richiesta chiede appunto, come fa <strong>register</strong> un trattamento speciale. La funzione viene eseguita ogni volta che è necessario e non richiamata, quindi evitiamo tante operazioni e uso di memoria eccessivo. Le funzioni inline possono essere anche membri di classi. Consiglio comunque di usare tale tipologia di funzioni solo in casi in cui le funzioni sono molto concise o comunque al posto di normali funzione che rallentano di molti le prestazioni del software. C&#8217;è da annotare che alcuni compilatori non accetteranno sempre e comunque tutte le funzioni inline, per via di certe eccezzioni, in tal caso, il compilatore tratterà la funzione come una normale funzione!</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/pellegrinofrc.wordpress.com/92/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/pellegrinofrc.wordpress.com/92/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pellegrinofrc.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pellegrinofrc.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pellegrinofrc.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pellegrinofrc.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pellegrinofrc.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pellegrinofrc.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pellegrinofrc.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pellegrinofrc.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pellegrinofrc.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pellegrinofrc.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pellegrinofrc.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pellegrinofrc.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pellegrinofrc.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pellegrinofrc.wordpress.com/92/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pellegrinofrc.wordpress.com&amp;blog=4057675&amp;post=92&amp;subd=pellegrinofrc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pellegrinofrc.wordpress.com/2008/08/20/perche-usare-le-funzioni-inline/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e79f68f765445dbe52502466e51492dd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pellegrinofrsc</media:title>
		</media:content>
	</item>
		<item>
		<title>Framework C++ per creare GUI</title>
		<link>http://pellegrinofrc.wordpress.com/2008/08/19/framework-c-per-creare-gui/</link>
		<comments>http://pellegrinofrc.wordpress.com/2008/08/19/framework-c-per-creare-gui/#comments</comments>
		<pubDate>Tue, 19 Aug 2008 15:55:38 +0000</pubDate>
		<dc:creator>Francesco Pellegrino</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[C++ Builder]]></category>
		<category><![CDATA[finestre]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[grafico]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[VC++]]></category>
		<category><![CDATA[visual c#]]></category>

		<guid isPermaLink="false">http://pellegrinofrc.wordpress.com/?p=88</guid>
		<description><![CDATA[Lo sviluppo di software è un arte molto complicata, raffinata e affascinante. Sin da sempre sono stati progettati nuovi stili di programmazione atti a garantire una maggiore flessibilità del linguaggio e una gestione del codice ottimale. Pensiamo al progresso dal linguaggio macchina, all&#8217;assembly, al codice strutturato sino alla OOP. Però, man mano che i tempo [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pellegrinofrc.wordpress.com&amp;blog=4057675&amp;post=88&amp;subd=pellegrinofrc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Lo sviluppo di software è un arte molto complicata, raffinata e affascinante. Sin da sempre sono stati progettati nuovi stili di programmazione atti a garantire una maggiore flessibilità del linguaggio e una gestione del codice ottimale. Pensiamo al progresso dal linguaggio macchina, all&#8217;assembly, al codice strutturato sino alla OOP. Però, man mano che i tempo vanno cambiando, corre sempre di più il bisogno di creare software non a livello console, bensì grafico. Malgrado sia possibile creare un software con la grafica più svariata che vogliamo, e in tanti linguaggi di programmazione (sempre per mezzo di librerie grafiche) in questo articolo parliamo dei software grafici in C e C++, introducento i vari framework principali per il software grafico, su Windows e su Linux.</p>
<p>Iniziamo col dire che in C è possibile scrivere GUI (Grapich User Interface) ma non è consigliato, perchè la maggior parte delle librerie in circolazione è disponibile solo per C++ e non per il C, dato che sono destinate a essere usate per la programmazione OOP. Di conseguenza, se siete su Windows per esempio, e volete creare finestre grafiche potete affidarvi alle API o comunque gestire tutto a manina. Potreste anche trovare librerie o robe simili, ma il linguaggio ottimale è il C++, perchè è un linguaggio OOP.</p>
<p>Infatti, ci sarà pure un motivo per cui sia stata inventata la OOP. Parlando a livello molto basso, comprnesibile da tutti, possiamo dire che essa ci permette di pensare &#8220;tutto&#8221; come oggetti, e di conseguenza anche i vari componenti di una finestra grafica. In questo modo, grazie alle classi che sono le astrazioni degli oggetti, possiamo gestire al meglio il codice.</p>
<p>Ma non soffermiamoci troppo sulla teoria, quella è qualcosa che dobbiamo studiare da noi, parliamo invece di ciò che tratta il post, i framework disonibli! Anticipiano comunque che tutti i framework hanno degli stili di default per creare finestre, quindi non potrete farle di forme a vostro piacimento, se non con modifiche varie al codice.</p>
<p>Ecco i principali framework:</p>
<ul>
<li><strong>Qt </strong>- Qt è uuna grande libreria che permette di creare interfaccia utente tramite dei widgets, che sono quelli che compongono essenzialmente anche le altre librerie che vedremo in seguito. Esistono due versione del framework Qt: una opensoruce e un&#8217;altra shareware. La prima può essere usata solo per sviluppare software open, la seconda per qualsiasi utilizzo. Il framework di Qt offre anche un Designer per creare le finestre in maniera visuale, ed evitare la fatica del codice. Punto di forza è che sono molto potenti, e sopratutto <strong><em>multipiattaforma</em></strong>, ovvero sono disponibili sia per Windows che per Linux. Esistono anche altre versione per altri OS, come per Mac OS. Sono semplici da usare, ma per un principiante non sono il massimo!</li>
<li><strong>Visual C++ &#8211; </strong>E&#8217; un IDE offerto dalla Microsoft sotto due licenze: una freeware (limitata) e una sharewre (completa). Esso permette di creare software, compilarlo (ha un compilatore interno di proprietà della Microsoft) e tanto altro. Il framework che usa per creare le interfaccie grafiche è componeto dalle librerie MFC che includono tutte le funzioni delle API. Di conseguenza dobbiamo dire però, che l&#8217;uso non è affatto scemplice, e le applicazioni uscenti saranno solo eseguibili su sistemi Windows. Inoltre le ultime versioni permettono di creare anche applicazioni C++/CLI ovvero sfruttando il .NET Framework di Microsoft. Ciò può aiutare la portabilità del softwre finale anche su Linux, dove esiste Mono che è un porting del .NET Framework. Attualmente è supportato fino alla versione 2.0!</li>
<li><strong>CodeGear C++ Builder 2007</strong> &#8211; Questo ambiente è sviluppato dalla Borland Software Corporation ed è adatto per sviluppare GUI sotto Windows XP/Vista. Esiste la versione precedente che supporta anche Windows 98. E&#8217; importante dire che questo ambiente semplifica molto la gestione e la creazione di GUI sotto Windows rispetto a Visual C++ e le MFC, che richiedono tempo e compotenza! E&#8217; veloce, ma non è freeware. L&#8217;unica versione è commerciale. Possiede un compilatore proprio, sempre sviluppato dalla Borland. E&#8217; possibile utilizzare due librerie: una integra le API di Windows e altre funzionalità, l&#8217;altra include la funzionalità con Linux, per cui sarà possibilità di esportare il prodotto finale.</li>
</ul>
<p>Esistono anche altri prodotti che permettono di creare GUI, ma questo sono a mio parere i migliori e i più gettonati. Il primo utile per la portatilità del codice, il secondo per ambienti Windows, e il terzo per avere tempo di sviluppo e un ottima gestionabilità dei progetti (sempre per Windows).</p>
<p>Questi di default permettono di creare finestre nello stesso stile di cui sono le finestre del sistema operativo, se si vuole, si potrebbe grazie ad altre librerie creare softwre grafico personalizzato.</p>
<p>Per informazioni o chiarimenti o critiche sull&#8217;articolo, lasciate pure un commento!</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/pellegrinofrc.wordpress.com/88/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/pellegrinofrc.wordpress.com/88/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pellegrinofrc.wordpress.com/88/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pellegrinofrc.wordpress.com/88/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pellegrinofrc.wordpress.com/88/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pellegrinofrc.wordpress.com/88/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pellegrinofrc.wordpress.com/88/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pellegrinofrc.wordpress.com/88/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pellegrinofrc.wordpress.com/88/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pellegrinofrc.wordpress.com/88/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pellegrinofrc.wordpress.com/88/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pellegrinofrc.wordpress.com/88/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pellegrinofrc.wordpress.com/88/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pellegrinofrc.wordpress.com/88/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pellegrinofrc.wordpress.com/88/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pellegrinofrc.wordpress.com/88/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pellegrinofrc.wordpress.com&amp;blog=4057675&amp;post=88&amp;subd=pellegrinofrc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pellegrinofrc.wordpress.com/2008/08/19/framework-c-per-creare-gui/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e79f68f765445dbe52502466e51492dd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pellegrinofrsc</media:title>
		</media:content>
	</item>
		<item>
		<title>Unioni anonime in C++</title>
		<link>http://pellegrinofrc.wordpress.com/2008/08/17/unioni-anonime-in-c/</link>
		<comments>http://pellegrinofrc.wordpress.com/2008/08/17/unioni-anonime-in-c/#comments</comments>
		<pubDate>Sun, 17 Aug 2008 23:46:01 +0000</pubDate>
		<dc:creator>Francesco Pellegrino</dc:creator>
				<category><![CDATA[Informatica]]></category>

		<guid isPermaLink="false">http://pellegrinofrc.wordpress.com/?p=86</guid>
		<description><![CDATA[Le unioni fanne parte del linguaggio C e ovviamente vengono ereditate anche dal successore C++. Il C++ permette di usare le unioni come se fossero delle classi, con alcune restrizioni, come per esempio: Non possono ereditare proprietà da altre classi Non possono contenere funzioni membro virtuali Nessuna variabile static può essere membro di un unione [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pellegrinofrc.wordpress.com&amp;blog=4057675&amp;post=86&amp;subd=pellegrinofrc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Le unioni fanne parte del linguaggio C e ovviamente vengono ereditate anche dal successore C++. Il C++ permette di usare le unioni come se fossero delle classi, con alcune restrizioni, come per esempio:</p>
<ul>
<li>Non possono ereditare proprietà da altre classi</li>
<li>Non possono contenere funzioni membro virtuali</li>
<li>Nessuna variabile static può essere membro di un unione</li>
<li>Nessun membro dell&#8217;unione può avere un overloading all&#8217;operatore =</li>
<li>Un unione non può essere presa come classe base o genitore</li>
</ul>
<p>Le unioni possono contenere sia dati che funzioni. Però esiste anche in C++ un particolare uso delle unioni, che vengono detto <strong>unioni anonime.</strong> Si tratta di unioni che possono contenere solo dati, che come di regola condividono la stessa area di memoria. Questi dati all&#8217;interno dell&#8217;unione anonima, hanno l&#8217;unica caratteristica di avere in comune la stessa area di memoria, del resto è come se fossero delle normali variabili con il normale campo di visibilità delle altre che si trovano fuori l&#8217;unione. Infatti, non vi è alcun bisogno per andare a lavorare su un mbro di tale unioni adoperando una dichiarazione e il dot (.) e non vi è alcun bisogno di dare un nome all&#8217;unione, ma basta usare la parola chiave union!</p>
<p>Tutto avviene automaticamente, come normali variabili, ecco un esempio:</p>
<blockquote><p><span style="color:#008000;">//unione anonima</span><br />
<strong>union</strong> {<br />
<strong>long</strong> l;<br />
<strong>double</strong> d;<br />
}</p>
<p><span style="color:#008000;">//accesso diretto ai membri dell&#8217;unione anonima</span><br />
l = 10000;<br />
d = 123.2345;</p>
<p>cout &lt;&lt; l &lt;&lt; &#8221; &#8221; &lt;&lt; d &lt;&lt; <span style="color:#ff0000;">&#8220;\n&#8221;</span>;</p></blockquote>
<p>C&#8217;è da ricordarsi che le unioni anonime non possono conterere membri private o protected, e inoltre se dichiarata come globale, i dati devono essere preceduti dal modificatore static.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/pellegrinofrc.wordpress.com/86/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/pellegrinofrc.wordpress.com/86/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pellegrinofrc.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pellegrinofrc.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pellegrinofrc.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pellegrinofrc.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pellegrinofrc.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pellegrinofrc.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pellegrinofrc.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pellegrinofrc.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pellegrinofrc.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pellegrinofrc.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pellegrinofrc.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pellegrinofrc.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pellegrinofrc.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pellegrinofrc.wordpress.com/86/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pellegrinofrc.wordpress.com&amp;blog=4057675&amp;post=86&amp;subd=pellegrinofrc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pellegrinofrc.wordpress.com/2008/08/17/unioni-anonime-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e79f68f765445dbe52502466e51492dd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pellegrinofrsc</media:title>
		</media:content>
	</item>
		<item>
		<title>Usiamo le classi in C++</title>
		<link>http://pellegrinofrc.wordpress.com/2008/08/16/usiamo-le-classi-in-c/</link>
		<comments>http://pellegrinofrc.wordpress.com/2008/08/16/usiamo-le-classi-in-c/#comments</comments>
		<pubDate>Sat, 16 Aug 2008 16:32:10 +0000</pubDate>
		<dc:creator>Francesco Pellegrino</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[classe]]></category>
		<category><![CDATA[membri]]></category>
		<category><![CDATA[oggetto]]></category>
		<category><![CDATA[OOP]]></category>

		<guid isPermaLink="false">http://pellegrinofrc.wordpress.com/?p=84</guid>
		<description><![CDATA[Uno degli aspetti che diversifica (in maniera positiva) il C++ dal C è proprio il supporto per la programmazione OOP. Senza soffermarmi troppo a spiegare cos&#8217;è la OOP, arrivo al dunque: le classi. Sono proprio le classi che fanno da padrone nella programmazione OOP, in pratica consentono di creare un incapsulamento di dati e codice, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pellegrinofrc.wordpress.com&amp;blog=4057675&amp;post=84&amp;subd=pellegrinofrc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Uno degli aspetti che diversifica (in maniera positiva) il C++ dal C è proprio il supporto per la programmazione OOP. Senza soffermarmi troppo a spiegare cos&#8217;è la OOP, arrivo al dunque: le classi. Sono proprio le classi che fanno da padrone nella programmazione OOP, in pratica consentono di creare un incapsulamento di dati e codice, e quindi un oggetto. Noi lo creiamo tramite la parola chiave <strong>class </strong>in maniera astratta, ma di fatto in memoria verrà creato l&#8217;oggetto solo quando andremo a instanziare tale classe, e non quando la definiamo. Andiamo a vedere un esempio (commentato passo passo) che ci illustra come creare, utilizzare e richiamare una classe e le sue funzioni. In più, ho eseguito anche un overloading della funzione creata.</p>
<ol>
<li>Iniziamo con il definire gli header e incorporare il namespace std, che ci metterà a disposizione un accesso più diretto ai membri di iostream:</li>
</ol>
<blockquote><p><span style="color:#0000ff;"> #include &lt;cstdlib&gt;<br />
#include &lt;iostream&gt;</span></p>
<p>using <strong>namespace</strong> std;</p></blockquote>
<p>2.  A questo punto, creiamo la nostra classe, definendo due funzioni pubbliche e una variabile privata accessibile solo dalle funzioni della classe:</p>
<blockquote><p><span style="color:#000000;"><strong>class</strong> Math {<br />
<strong>int </strong>Ris;<br />
<strong> public</strong>:<br />
<strong>void</strong> Add(<strong>int</strong> a, <strong>int</strong> b);<br />
<strong>void </strong>Sott(<strong>int</strong> a,<strong> int </strong>b);<br />
};</span></p></blockquote>
<p>3.  A questo punto accediamo alle funzioni tramite l&#8217;operatore :: che indica il campo d&#8217;azione, e scriviamo dentro di esse il codice per eseguire i calcoli:</p>
<blockquote><p><strong>void </strong>Math::Add(<span style="color:#000000;"><strong>int</strong></span> a, <span style="color:#000000;"><strong>int</strong></span> b)<br />
{<br />
Ris = a + b;</p>
<p>cout &lt;&lt; <span style="color:#ff0000;">&#8220;La somma di 2 + 2 e&#8217; &#8221; </span>&lt;&lt; Ris &lt;&lt; <span style="color:#ff0000;">&#8220;\n&#8221;</span>;<br />
}</p>
<p><strong>void</strong> Math::Sott(<strong>int</strong> a, <strong>int </strong>b)<br />
{<br />
(a &gt; b) ? Ris = a &#8211; b : Ris = b &#8211; a; <span style="color:#339966;">//Corrisponde a una forma più &#8220;elegante&#8221; del controllo <strong>if</strong></span></p>
<p>cout &lt;&lt; <span style="color:#ff0000;">&#8220;La sottrazione di 4 &#8211; 2 e&#8217; &#8220;</span> &lt;&lt; Ris &lt;&lt; <span style="color:#ff0000;">&#8220;\n&#8221;</span>;<br />
}</p></blockquote>
<p>4.  Adesso, creiamo un&#8217;istanza dell&#8217;oggetto Math nella funzione principale main() e richiamiamo le funzioni:</p>
<blockquote><p><span style="color:#000000;"><strong>int</strong> </span>main()<br />
{<br />
Math Matematica; <span style="color:#339966;">//Creo l&#8217;istanza dell&#8217;oggetto Math, chiamandola Matematica</span></p>
<p>Matematica.Add(<span style="color:#ff00ff;">2</span>, <span style="color:#ff00ff;">2</span>); <span style="color:#339966;">//Esegue la somma tramite la funziona Add dell&#8217;oggetto Math</span><br />
Matematica.Sott(<span style="color:#ff00ff;">4</span>, <span style="color:#ff00ff;">2</span>); <span style="color:#339966;">//Esegue la sottrazione tramite la funziona Sott dell&#8217;oggetto Math</span></p>
<p>getchar(); <span style="color:#339966;">//Attendo prima di chiudere il programma</span><br />
<strong>return</strong> EXIT_SUCCESS;<br />
}</p></blockquote>
<p>5.  Adesso il programma è finite, nella sua versione più semplice e imperfetta. L&#8217;output sarà il seguente:</p>
<blockquote><p><em>La somma di 2 + 2 e&#8217; 4</em></p>
<p><em>La sottrazione di 4 &#8211; 2 e&#8217; 2</em></p></blockquote>
<p>Per chiarimenti, o altro ancora, potete lasciare un commento. <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/pellegrinofrc.wordpress.com/84/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/pellegrinofrc.wordpress.com/84/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pellegrinofrc.wordpress.com/84/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pellegrinofrc.wordpress.com/84/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pellegrinofrc.wordpress.com/84/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pellegrinofrc.wordpress.com/84/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pellegrinofrc.wordpress.com/84/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pellegrinofrc.wordpress.com/84/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pellegrinofrc.wordpress.com/84/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pellegrinofrc.wordpress.com/84/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pellegrinofrc.wordpress.com/84/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pellegrinofrc.wordpress.com/84/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pellegrinofrc.wordpress.com/84/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pellegrinofrc.wordpress.com/84/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pellegrinofrc.wordpress.com/84/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pellegrinofrc.wordpress.com/84/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pellegrinofrc.wordpress.com&amp;blog=4057675&amp;post=84&amp;subd=pellegrinofrc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pellegrinofrc.wordpress.com/2008/08/16/usiamo-le-classi-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e79f68f765445dbe52502466e51492dd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pellegrinofrsc</media:title>
		</media:content>
	</item>
		<item>
		<title>Un client per Windows in C/C++ usando le WinSock2</title>
		<link>http://pellegrinofrc.wordpress.com/2008/08/15/un-client-per-windows-in-cc-usando-le-winsock2/</link>
		<comments>http://pellegrinofrc.wordpress.com/2008/08/15/un-client-per-windows-in-cc-usando-le-winsock2/#comments</comments>
		<pubDate>Fri, 15 Aug 2008 14:06:27 +0000</pubDate>
		<dc:creator>Francesco Pellegrino</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[applicazione]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[client]]></category>
		<category><![CDATA[rete]]></category>
		<category><![CDATA[socket]]></category>
		<category><![CDATA[winsock]]></category>

		<guid isPermaLink="false">http://pellegrinofrc.wordpress.com/?p=77</guid>
		<description><![CDATA[In questo articolo illustrerò le fondamenta per usare le librerie WinSock2 della Microsoft che permettono di creare applicazioni di rete server e client. Precisamente in questo articolo costruiremo un client semplice e base, da modificare successivamente per le varie esigenze. L&#8217;articolo tratta molto la pratica, descrivendo poca teorica, ma necessaria a capire il funzionamento del [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pellegrinofrc.wordpress.com&amp;blog=4057675&amp;post=77&amp;subd=pellegrinofrc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In questo articolo illustrerò le fondamenta per usare le librerie WinSock2 della Microsoft che permettono di creare applicazioni di rete server e client. Precisamente in questo articolo costruiremo un client semplice e base, da modificare successivamente per le varie esigenze. L&#8217;articolo tratta molto la pratica, descrivendo poca teorica, ma necessaria a capire il funzionamento del tutto!</p>
<p>IMPORTANTE: Per usare il codice che sta per seguire bisogna linkare al linker le seguenti lib:</p>
<ul>
<li><em>ws2_32.lib</em></li>
<li><em>Mswsock.lib</em></li>
<li><em>Advapi32.lib</em></li>
</ul>
<p>L&#8217;header del nostro file .c o .cpp sarà composto dai seguenti header necessari e della dichiarazione di una variabile globale utilizzata per effettuare vari controlli:</p>
<blockquote><p><span style="color:#339966;">#include &lt;windows.h&gt;<br />
#include &lt;winsock2.h&gt;<br />
#include &lt;ws2tcpip.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;string.h&gt;</span><br />
<strong>int</strong> iResult;</p></blockquote>
<p>Passiamo ora all&#8217;inizio della programmazione pratica. Innanzi tutto bisogna creare e inizilizzare un oggetto <span style="color:#0000ff;">WSADATA <span style="color:#000000;">(per maggiori informazioni sulla struttura WSADATA visitate il supporto MS all&#8217;indirizzo http://msdn.microsoft.com/en-us/library/ms741563(VS.85).aspx)</span></span>:</p>
<blockquote><p>WSADATA wsaData;<br />
<span style="color:#008080;">//Inizializzo Winsock</span><br />
iResult = WSAStartup(MAKEWORD(2, 2), &amp;wsaData);<br />
<strong>if</strong>(iResult != <span style="color:#ff00ff;">0</span>)<br />
{<br />
printf(<span style="color:#ff0000;">&#8220;WSAStartup failed: %d\n&#8221;</span>, iResult);<br />
<strong>return</strong> <span style="color:#ff00ff;">1</span>;<br />
}</p></blockquote>
<p>Il blocco If, come si può capire serve per controllare eventuali errori. La variabile iResult è una variabile globale, di tipo intero. Alla funzione WSAStartup abbiamo pasato come argomenti due parametri: il primo è la versione dei socket che stiamo usando, ovvero 2.2, il secondo parametro invece è l&#8217;indirizzo dell&#8217;oggetto WSAData precedentemente creato. Andiamo avanti, e vediamo come fare per gestire passo passo il lato client. Iniziamo col definire una porta che useremo per le connessioni e l&#8217;inizializzazione di un oggetto<span style="color:#0000ff;"> addinfo</span> <span style="color:#000000;">che contiene una struttura <span style="color:#0000ff;">sockaddr</span></span> (per informazioni a queste due struttura vi rimando sempre al sito MSDN DI Microsoft):</p>
<blockquote><p><span style="color:#339966;">#define PORT &#8220;8000&#8243;</span><br />
<strong>struct</strong> addrinfo *result = NULL, *ptr = NULL, hints;</p>
<p class="libCScode">ZeroMemory(&amp;hints, <strong>sizeof</strong>(hints));</p>
<p>hints.ai_family = AF_UNSPEC;<br />
hints.ai_socktype = SOCK_STREAM;<br />
hints.ai_protocol = IPPROTO_TCP;</p></blockquote>
<p>In questo caso abbiamo riempito il campo della struttura ai_family con AF_UNSPEC che indica che non è definito la versione del protocollo IP, per cui può essere sia IPv4 che IPv6. Se volessimo definire l&#8217;uso dell&#8217;IPv4 avremmo messo AF_INET, contrariamente per IPv6 avremmo messo AF_INET6. Il secondo campo, ai_socktype, indica il tipo di socket, in questo caso abbiamo scleto SOCK_STREAM che è quello usato per comunicazioni di rete. Il terzo campo, ai_protocol, riguarda il protocollo usato per la trasmissione e il controllo dei dati trasmessi: il suo valore è IPPROTO_TCP, che indica appunto il protocollo TCP. La scelta risulta pressochè obbligatoria, in quanto prima abbiamo specificato il tipo di socket come SOCK_STREAM, se avessimo invece usato SOCK_DGRAM avremmo potuto usare il protocollo UDP, che appunto usa i datagrammi. <em>Queste sono le specificazioni basilari, per maggiori informazioni sulla struttura addrinfo potete visitare il sito di MS http://msdn.microsoft.com/en-us/library/ms737530(VS.85).aspx</em></p>
<p>Adesso dobbiamo vedere a quale indirizzo IP dobbiamo connetterci, quindi il server di destinazione. In questo caso useremo la funzione <span style="color:#0000ff;">getaddrinfo</span> <span style="color:#000000;">che restiruisce un valore intero, anche se il nostro valore sarà una stringa come ad esempio &#8220;192.168.1.2&#8243; o &#8220;irc.azzurra.org&#8221;. Andiamo a vedere il codice:</span></p>
<blockquote>
<p class="libCScode"><span style="color:#339966;">// Resolve the server address and port</span><br />
iResult = getaddrinfo(argv[1], DEFAULT_PORT, &amp;hints, &amp;result);<br />
<strong>if </strong>( iResult != <span style="color:#ff00ff;">0</span> ) {<br />
printf(<span style="color:#ff0000;">&#8220;getaddrinfo failed: %d\n&#8221;</span>, iResult);<br />
WSACleanup();<br />
<strong>return</strong> <span style="color:#ff00ff;">1</span>;<br />
}</p></blockquote>
<p>La funzione getaddrinfo accetta diversi parametri, precisamente 4.. analizziamoli: il primo è l&#8217;host, ovvero il nodo a cui connetterci, esso è rappresentato da un indirizzo IPv4 o 6 in base alle dichiarazioni prima effettuate, ed è passato in formato stringa, tant&#8217;è vero che gli abbiamo dato in pasto il parametro argv[1] della funzione main(), quindi il suo valore sarà inserito all&#8217;avvio dell&#8217;applicazione tramite riga di comando, ovvero: <em>nomeprogramma server_a_cui_connettersi</em>. In seguito abbiamo passato la porta e due indirizzi: il primo è del puntatore a una struttura addrinfo e il secondo a una struttura addrinfo. La funzione restituisce un valore intero, per tale motivo l&#8217;abbiamo assegnato alla variabile intera iResult e abbiamo controllato eventuali errori con un iterazione if: se tutto è andato a buon fine, solitamente, riceveremo un valore pari a 0. Altrimenti ci sono diversi tipi di errori, consultabili nella pagina MSDN http://msdn.microsoft.com/en-us/library/ms738520(VS.85).aspx</p>
<p>Adesso, non ci resta che creare ed utilizzare il socket! Creiamo quindi l&#8217;oggetto SOCKET con la seguente stringa:</p>
<blockquote>
<p class="libCScode">SOCKET ConnectSocket = INVALID_SOCKET;</p>
</blockquote>
<p>Quindi inizializziamo il socket, con i valori prima definiti:</p>
<blockquote>
<p class="libCScode">ptr=result;</p>
<p><span style="color:#339966;">// Socket for connect to server</span><br />
ConnectSocket = socket(ptr-&gt;ai_family, ptr-&gt;ai_socktype,<br />
ptr-&gt;ai_protocol);</p></blockquote>
<p>E facile capire, che i parametri passati sono proprio gli elemnti della strutta addrinfo che abbiamo prima riempito. Ma, come proposto dal sito di MSDN Microsoft, è bene cercare sempre eventuali errori, e lo facciamo con un controllo per mezzo dell&#8217;istruzione if:</p>
<blockquote>
<p class="libCScode"><strong>if</strong> (ConnectSocket == INVALID_SOCKET) {<br />
printf(<span style="color:#ff0000;">&#8220;Error at socket(): %ld\n&#8221;</span>, WSAGetLastError());<br />
freeaddrinfo(result);<br />
WSACleanup();<br />
<strong>return</strong> 1;<br />
}</p></blockquote>
<p>Quindi, facciamo un pò di chiarezza del codice stampato: se il socket ritorna essere invalido, stampiamo la scritta di errore e richiamiamo la funzione WSAGetLastError() che appunto ci comunica l&#8217;ultimo errore verificato. Poi liberiamo le risorse tramite la funzione freeaddrinfo() e usiamo WSACleanup per terminare anche l&#8217;uso della libreria WS2_32 DLL. Adesso però, prendendo per buono che tutto è andato a buon fine, dobbiamo connettersi a un socket remoto. Bene, è arrivato il momento di usare la funzione connect(). Vediamo un pò di codice, e poi commentiamo:</p>
<blockquote>
<p class="libCScode"><span style="color:#339966;"><strong> </strong><strong>// Connect to server.</strong></span><br />
iResult = connect( ConnectSocket, ptr-&gt;ai_addr, (int)ptr-&gt;ai_addrlen);<br />
<strong>if </strong>(iResult == SOCKET_ERROR) {<br />
closesocket(ConnectSocket);<br />
ConnectSocket = INVALID_SOCKET;</p>
<p>freeaddrinfo(result);</p>
<p><strong>if </strong>(ConnectSocket == INVALID_SOCKET) {<br />
printf(<span style="color:#ff0000;">&#8220;Unable to connect to server!\n&#8221;</span>);<br />
WSACleanup();<br />
<strong>return</strong> <span style="color:#ff00ff;">1</span>;<br />
}<br />
}</p></blockquote>
<p>Analizziamo il codice. Abbiamo usato la funzione connect per connetterci al server remoto, ed ecco i parametri che abbiamo passato alla funzione: il primo è il socket usato per la connessione, il secondo e il terzo sono dei puntatori che accedono agli elementi delle relative strutture, precisamente il server a cui provare a connettersi e la porta. Di seguito poi, come potrete capire, avviene il controllo per verificare l&#8217;eventuale presenza di errori, e in tal caso comunicarli. Ora però, dobbiamo inviare e ricevere dati, quindi vediamo come farlo, come comunciare col server:</p>
<blockquote><p><span style="color:#339966;">#define DEFAULT_BUFLEN 512</span><br />
<strong>char </strong>*sendbuf = &#8220;Qui i dati&#8221;;</p>
<p><strong>char</strong> recvbuf[DEFAULT_BUFLEN];<br />
<span style="color:#339966;">// Inviamo un buffer iniziale di dati</span></p>
<p>iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), <span style="color:#ff00ff;">0</span> );</p>
<p><strong>if </strong>(iResult == SOCKET_ERROR) {</p>
<p>printf(<span style="color:#ff0000;">&#8220;send failed: %d\n&#8221;</span>, WSAGetLastError());</p>
<p>closesocket(ConnectSocket);</p>
<p>WSACleanup();</p>
<p><strong>return</strong> <span style="color:#ff00ff;">1</span>;</p>
<p>}</p>
<p class="libCScode">
printf(<span style="color:#ff0000;">&#8220;Bytes Sent: %ld\n&#8221;</span>, iResult);</p></blockquote>
<p>Molto semplice, abbiamo usato la funzione send per inviare dei dati. Essa accetta come primo parametro il socket da noi creato, in successione i dati da inviare sottoforma di char *, e la lunghezza del buffer dati inviati. L&#8217;ultimo argomento è solitamente 0, per ulteriori informazioni potete consultare il sito di MSDN, che è una vera encicplopedia di riferimento <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Adesso vediamo come mandare un shutdown il socket per usarlo nel secondo momento per ricevere i dati dal server:</p>
<blockquote><p><strong>if</strong> (iResult == SOCKET_ERROR) {</p>
<p>printf(<span style="color:#ff0000;">&#8220;shutdown failed: %d\n&#8221;</span>, WSAGetLastError());</p>
<p>closesocket(ConnectSocket);</p>
<p>WSACleanup();</p>
<p><strong>return</strong> 1;</p>
<p>}</p>
<pre class="libCScode"></pre>
</blockquote>
<p>Ed ecco infine come ricevere i dati:</p>
<blockquote>
<p class="libCScode"><span style="color:#339966;">// Receive data until the server closes the connection</span><br />
<strong>do </strong>{</p>
<p>iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);<br />
<strong>if </strong>( iResult &gt; 0 )<br />
printf(<span style="color:#ff0000;">&#8220;Bytes received: %d\n&#8221;</span>, iResult);<br />
<strong>else if </strong>( iResult == 0 )<br />
printf(&#8220;Connection closed\n&#8221;);<br />
<strong> else</strong><br />
printf(<span style="color:#ff0000;">&#8220;recv failed: %d\n&#8221;</span>, WSAGetLastError());</p>
<p>} <strong>while</strong>( iResult &gt; 0 );</p></blockquote>
<p class="libCScode">In questo caso, i parametri sono simili alla funzione di invio dati, l&#8217;unica differenza è che il secondo parametro è il buffer dati che riceviamo e non quello che inviamo, il funzionamento è pressochè simile. Infine, non ci resta che disconnettersi dal server:</p>
<blockquote>
<p class="libCScode">iResult = shutdown(ConnectSocket, SD_SEND);<br />
<strong>if </strong>(iResult == SOCKET_ERROR) {<br />
printf(<span style="color:#ff0000;">&#8220;shutdown failed: %d\n&#8221;</span>, WSAGetLastError());<br />
closesocket(ConnectSocket);<br />
WSACleanup();<br />
<strong>return</strong> <span style="color:#ff00ff;">1</span>;<br />
}</p>
<p><span style="color:#339966;">// Cleanup</span><br />
closesocket(ConnectSocket);<br />
WSACleanup();</p>
<p class="libCScode"><strong>return</strong> <span style="color:#ff00ff;">0</span>;</p>
</blockquote>
<p class="libCScode">
<p class="libCScode">PS. Buona parte di questo articolo fa parte di una mia traduzione ai post scritti su MSDN in lingua inglese, spero di aver fatto un buon lavoro per alcuni che non masticano bene l&#8217;inglese e di aver trasmessmo come iniziare ad usare le socket in WIndows con il linguaggio C/C++.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/pellegrinofrc.wordpress.com/77/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/pellegrinofrc.wordpress.com/77/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pellegrinofrc.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pellegrinofrc.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pellegrinofrc.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pellegrinofrc.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pellegrinofrc.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pellegrinofrc.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pellegrinofrc.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pellegrinofrc.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pellegrinofrc.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pellegrinofrc.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pellegrinofrc.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pellegrinofrc.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pellegrinofrc.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pellegrinofrc.wordpress.com/77/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pellegrinofrc.wordpress.com&amp;blog=4057675&amp;post=77&amp;subd=pellegrinofrc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pellegrinofrc.wordpress.com/2008/08/15/un-client-per-windows-in-cc-usando-le-winsock2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e79f68f765445dbe52502466e51492dd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pellegrinofrsc</media:title>
		</media:content>
	</item>
		<item>
		<title>Allocare memoria in C</title>
		<link>http://pellegrinofrc.wordpress.com/2008/08/08/allocare-memoria-in-c/</link>
		<comments>http://pellegrinofrc.wordpress.com/2008/08/08/allocare-memoria-in-c/#comments</comments>
		<pubDate>Fri, 08 Aug 2008 19:23:39 +0000</pubDate>
		<dc:creator>Francesco Pellegrino</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[allocare]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[esecuzione]]></category>
		<category><![CDATA[free()]]></category>
		<category><![CDATA[heap]]></category>
		<category><![CDATA[malloc()]]></category>
		<category><![CDATA[memoria]]></category>

		<guid isPermaLink="false">http://pellegrinofrc.wordpress.com/?p=69</guid>
		<description><![CDATA[Il linguaggio C mette a disposizione un sistema per allocare memoria in fase di esecuzione, nel caso il programma ne abbia il bisogno. Questo per il semplice fatto che in alcuni casi, non è possibile sapere a priori quanta memoria debba utilizzare un programma in determinate circostante, di conseguenza è improprio usare le normali variabili. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pellegrinofrc.wordpress.com&amp;blog=4057675&amp;post=69&amp;subd=pellegrinofrc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Il linguaggio C mette a disposizione un sistema per allocare memoria in fase di esecuzione, nel caso il programma ne abbia il bisogno. Questo per il semplice fatto che in alcuni casi, non è possibile sapere a priori quanta memoria debba utilizzare un programma in determinate circostante, di conseguenza è improprio usare le normali variabili. Ecco che entrano in gioco le funzione malloc() e free(). Rispettivamente queste due funzioni allocano memoria e la tolgono. La funzione malloc() infatti prepara la memoria in base ai parametri che gli vengono passati, e free() provvede a svuotare la memoria che era stata precedentemente usata da malloc().</p>
<p>Ecco il prototipo della funzione malloc(): <strong><em>void *malloc(size_t numero_di_byte);</em></strong></p>
<p>Essa restituisce un puntatore NULL nel caso avviene qualche errore, come per esempio quando lo spazio richiesto e troppo grande rispetto a quello disponibile (lo spazio viene allocato in uno spazio chiamato <em>heap</em>, che si trova tra l&#8217;area di memoria utilizzata dal programma e lo stack). Nel caso tutto è andato a buon fine, malloc() restituisce un puntatore che punta all&#8217;indirizzo della memoria richiesta.</p>
<p>La funzione free invece accetta come parametro il puntatore che punta alla memoria richiesta, in modo tale da svuotarla (liberarla, restiruirla al sistema). Una nota <strong>importante: </strong>richiamate sempre free() con un argomento valido, cioè un puntatore prima utilizzato da malloc(), altrimenti rischiate di distruggere aree di memoria dello heap già libere o comunque far danno!</p>
<p>Vediamo un esempio:</p>
<p>#include &lt;stdio.h&gt;<br />
#include &lt;stdlib.h&gt;</p>
<p>int main(int argc, char *argv[])<br />
{<br />
int *p; //Puntatore che riceverà l&#8217;indirizzo della memoria</p>
<p>p = (int *)malloc(10*sizeof(int)); //Richiediamo la memoria per 10 interi</p>
<p>/* Controlliamo che tutto sia andato a buon fine */<br />
if(!p)<br />
{<br />
printf(&#8220;Memoria esaurita\n\n&#8221;);<br />
exit(1);<br />
}</p>
<p>return EXIT_SUCCESS;<br />
}</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/pellegrinofrc.wordpress.com/69/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/pellegrinofrc.wordpress.com/69/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/pellegrinofrc.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/pellegrinofrc.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/pellegrinofrc.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/pellegrinofrc.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/pellegrinofrc.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/pellegrinofrc.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/pellegrinofrc.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/pellegrinofrc.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/pellegrinofrc.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/pellegrinofrc.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/pellegrinofrc.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/pellegrinofrc.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/pellegrinofrc.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/pellegrinofrc.wordpress.com/69/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=pellegrinofrc.wordpress.com&amp;blog=4057675&amp;post=69&amp;subd=pellegrinofrc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://pellegrinofrc.wordpress.com/2008/08/08/allocare-memoria-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e79f68f765445dbe52502466e51492dd?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">pellegrinofrsc</media:title>
		</media:content>
	</item>
	</channel>
</rss>
