Archive for the 'C' Category

C, Source Code, USBAutoStart

Prima versione di USB AutoStart

USB AutoStart

UsbAutoStart è un utility per Windows che permette di eseguire l’autoplay sulle penne usb o sui drive esterni. Windows per questioni di sicurezza infatti impedisce di eseguire l’autoplay negli hard disk rimovibili, ma attraverso questo programma si può bypassare questa impostazione e far sì che venga fatto partire un programma presente nella penna al collegamento di un hard disk esterno.
Inoltre, quando si cerca di rimuovere il dispositivo esterno con la “rimozione sicura dell’hardware”, il programma chiuderà tutti i programmi aperti nel computer che si trovano nella penna USB:

Screenshots:

Rilevamento del collegamento di una periferica usb:

Usb Autostart Periferica collegata

Opzioni di usb autostart:

Usb Autostart Opzioni

Il progetto è hostato su sourceforge, ed è rilasciato sotto la licenza GPL, quindi è completamente open source! :)

Download Usb Autostart

C, Quiz

Coders4fun Quiz #1

Cosa stamperà il seguente codice in c++?

#include <iostream>

int main()
{
	int i = 0;
	for (i = i == 0; i < 9; i = 1 + i * 2);
		std::cout<<i<<std::endl;
	return 0;
}

Si prega di non imbrogliare e di rispondere senza l’aiuto di nessun compilatore! :)

P.S.
Ovviamente l’esempio è compilabile!

C, Source Code

Localizzazione di un progetto wx c++ (wx side)

Questo articolo presuppone la conoscenza di poEdit o di gettext trattati nel precedente articolo “Localizzazione di un progetto wx c++ (usare poEdit)”

wxWidgets

Aggiungere la localizzazione ad un programma scritto in wx è abbastanza semplice. Una volta ottenuti i files .po per tutti le lingue che vogliamo supportare, rinominiamoli con il nome della nostra applicazione e spostiamoli in subdirectory diverse per ogni linguaggio, esempio:

rootDelProgetto/locale/it
rootDelProgetto/locale/it_CH
rootDelProgetto/locale/en_US
rootDelProgetto/locale/en_GB

Continue Reading »

C, Source Code

Localizzazione di un progetto wx c++ (usando poEdit)

In questi giorni febbrili per il primo rilascio di UsbAutostarter, progettino lasciato in asso per un po’, ma che finalmente sta per vedere la luce, ho dedicato il mio pochissimo tempo libero alla localizzazione del programmino, per poterlo uppare su sourceforge. Purtroppo, per un “wxWidgets esordiente” come me, le cose non sono mai semplici sia per la scarsa documentazione online, sia per i pochissimi esempi di codice che si trovano in giro. Fortunatamente molti dei meravigliosi programmi scritti in wx sono open e sbirciando nel codice di amule, sono riuscito a capire come localizzare il progetto wx.

Logo poEdit

Innanzitutto dobbiamo predisporre all’internazionalizzazione i sorgenti del progetto: per distinguere le stringhe da localizzare con quelle che invece devono rimanere invariate, useremo la macro _(). Per es:

...
wxMessageBox( _("testo da localizzare") );
...
wxMessageBox( wxT("testo invariato") );

Continue Reading »

C, Source Code

Stringa auto-dimensionante in c

In questo articolo spiegherò come creare una struttura con relative funzioni associate per permettere di utilizzare una stringa che incrementi la sua dimensione appena lo spazio allocato non basta più per conservare i caratteri, utilizzando soltanto le caratteristiche del linguaggio c (niente classi quindi).
Una stringa del genere è molto utile nei casi dobbiamo lavorare con stringhe di cui non si conosce a priori la lunghezza (per es. una stringa letta da un file xml): possiamo quindi leggere i caratteri ad uno ad uno fino a quando non arriviamo alla fine della stringa, senza preoccuparci dell’allocazione della memoria.
Innanzitutto analizziamo la struttura dati che definisce la stringa autoincrementante:

// Struct containing the growing string
typedef struct
{
	// stringa
	char * text;
	// lunghezza della stringa (comprensiva dello zero terminatore)
	int length;
	// capacità della stringa
	int capacity;
} growing_string;

La variabile text sarà il posto dove effettivamente andremo ad allocare la stringa, length indicherà la lunghezza della stringa corrente mentre capacity la memoria allocata per la stringa.
Per capire meglio la differenza tra length e capacity guardiamo la prossima immagine:

Capacity-Length

Capacity rappresenta quindi lo spazio allocato in memoria per la stringa, mentre length rappresenta il numero di caratteri effettivamente occupati (comprensivo di zero terminatore). Si capisce facilmente che se si aggiungono abbastastanza caratteri da fare in modo che length sia maggiore di capacity, allora bisogna riallocare lo spazio di memoria in modo da far entrare più caratteri.
Continue Reading »

.NET, C

Come realizzare stampe in formato A3 con Crystal Report

Da qualche settimana ho cominciato ad utilizzare per lavoro la versione di Crystal Report fornita in bundle con Visual Studio 2005. Devo dire che è uno strumento potente, che consente di realizzare report di diversa natura e tipologia rimanendo all’interno dell’ambiente .NET e non dovendo ricorrere ad applicativi esterni verso cui esportare i dati, come Excel.
Ciò nonostante, a mio avviso questo applicativo possiede delle pecche che mi auguro possano essere risolte nelle release successive.
Una cosa che mi ha letteralmente fatto uscire di senno è stata la realizzazione delle stampe di grafici in formato A3. Spesso infatti i dati che intendiamo visualizzare su un grafico sono molti e la stampa in formati di dimensione inferiore, come l’A4, non consente di ottenere una rappresentazione nitida e precisa.

Grafico Crystal Report

La cosa triste che ho potuto constatare è che Crystal Report imposta automaticamente lo spazio per realizzare il progetto del report in relazione ai settings della propria stampante installata. Mi spiego meglio: se la stampante che ho installata sul mio PC non supporta la stampa in formato A3, non mi è possibile effettuare progetti dei report di dimensione A3.
Questo fatto è molto limitante per diverse ragioni. Intanto perchè spesso i report creati non necessitano di essere stampati su carta ma basta soltanto che siano visualizzati sul monitor dell’utente, e quindi non vedo la ragione per cui se non devo stampare un report non devo neanche poterlo progettare in quel formato. Un altro motivo consiste nel fatto che le impostazioni della stampante eventualmente installata sul PC dello sviluppatore, non è detto che corrispondano con quelle delle eventuali stampanti installate sui PC degli utenti reali del software.
Continue Reading »

C

Thread in C# utilizzando i metodi anonimi

Per creare un Thread in C# solitamente si usa scrivere un metodo con all’interno il codice che il Thread deve eseguire, per poi creare il Thread settandogli come delegate il metodo appena creato:

public void FaiQualcosaDiUtile()
{
	for (int i = 0; i < 100; i++)
	{
		// faccio qualcosa...
		Thread.Sleep(500);
	}
}

static void Main()
{
	// qui creo il thread passandogli il delegate del metodo creato pocanzi
	Thread t = new Thread(FaiQualcosaDiUtile);
	t.Name = "Thread di prova";
	t.Start();
}

dual core

Per creare i Thread, il C# dà l’opportunità di utilizzare i metodi anonimi. Per utilizzarli, basta scrivere il codice da eseguire nel Thread all’interno del codice della creazione dell’oggetto Thread, offrendo quindi la possibilità di non scrivere il metodo:
Continue Reading »

C, Source Code, Windows

Spegnere o riavviare il pc

Piccolo post per una funzione che spegne o riavvia il pc su Windows in c++.
La funzione viene chiamata con il parametro false se si vuole spegnere il pc, con true se invece si vuole riavviare, e ritorna false nel caso in cui per qualche motivo la procedura di spegnimento non sia andata in porto (per es. qualche processo ha negato lo shutdown).

Shut Down

Per spegnere il pc basta quindi invocare la funzione nel seguente modo:

if (!ShutDown(false))
{
	// spegnimento non riuscito
}

Parte del codice sorgente è di seguito:
Continue Reading »

C, Source Code

Modificare gli elementi di un form da un thread

Scenario:
Si vuole eseguire al clic di un certo elemento di un Form un’operazione abbastanza lunga, come per esempio lo scaricamento di alcuni files da internet, ma durante l’operazione l’utente deve poter avere il controllo del programma e avere un feedback visivo della percentuale di completamento dell’operazione.
Soluzione non funzionante:
Ci si rende conto subito che per risolvere un problema del genere è necessario utilizzare un Thread che esegua l’operazione in un contesto separato da quello del Form principale, altrimenti il programma si bloccherà in attesa della fine dell’operazione senza possibilità di ricevere input dall’utente. Il vero problema adesso si crea quando si cerca di aggiornare i componenti del Form dal Thread:

private void button1_Click(object sender, EventArgs e)
{
    testThread = new Thread(threadProc);
    testThread.Start();
}

public void threadProc()
{
    // wast a lot of time...
    for (int i = 1; i <= 10; i++)
    {
        Thread.Sleep(250);
        progressBar.Value = i * 10;
    }
    MessageBox.Show("Operation Completed!");
}

Purtroppo, all’esecuzione della riga di codice dove viene assegnato il valore alla progressBar si otterrà un messaggio di errore simile al seguente:
“Operazione cross-thread non valida: è stato eseguito l’accesso al controllo ‘progressBar1′ da un thread diverso da quello da cui è stata eseguita la creazione.”

lock

Continue Reading »

.NET, C, Web

Thread e C#

Fino a poco tempo fa ogni qual volta avevo a che fare con i thread lo facevo con poca cognizione di causa… ogni tanto mi era capitato di fare applicazioni che dovevano popolare una lista o aspettare un input, senza che il programma si bloccasse, ma non avevo mai approfondito il tema più di tanto.

amd dualcore

Un esempio del classico uso base dei Thread in C# è il seguente:
Continue Reading »

Next »