Thursday, July 9, 2009

Chương trình chơi nhạc đơn giản trên Linux ( ver 1.0 ) GTK+

Đây là một chương trình chơi nhạc mp3 nhỏ mà mình mới viết hôm nay. Chức năng thì cực kì giới hạn T_T, chỉ chơi đuợc đúng một file và còn một số chức năng khác như dừng, lặp lại, click vào treeview để lặp lại.... Vì mình chỉ viết trong vỏn vẹn một ngày cho nên chắc chắn bug là khó tránh khỏi. Dù vậy mình cũng post nó lên đây coi như thói quen làm việc từng ngày của mình, mình chắc chắn là sẽ update nó lên nhiều. Các chính là mình chỉ mới bắt đầu tìm hiểu gstreamer( multimedia framework ) cho nên chương trình còn hạn chế rất nhiều. Lúc này mình cũng còn đang phân vân không biết nên dùng SDL( cross-platform ) hay thằng gstreamer này vì cả 2 thằng đều có đặc điểm hay riêng cả T_T.

Các bạn có thể down toàn bộ source ở đây chỉ 1 file ^_^
source

Để compile chương trình các bạn dùng dòng lệnh sau :

g++ main.cpp -o main `pkg-config --cflags --libs gtk+-2.0 gstreamer-0.10`


Và đây là screenshot :
Photobucket

Wednesday, July 8, 2009

Chương trình IDE đơn giản trên Linux với GTK+ ( ver. 1.1 )

Đây là phiên bản thứ hai mà mình viết, có thêm code-statistics và mình vừa edit lại một số lỗi nhỏ ! Các bạn có thể download toàn bộ chương trình ở đây :D !

source

Dịch chương trình với dòng lệnh sau nhé :

g++ main.cpp ch_type.h token.h statistics.h -o main -Wall -pedantic -O3
`pkg-config --cflags --libs gtk+-2.0 gtksourceview-2.0`


Và đây là screenshot của nó :
Photobucket

Photobucket

How to implement Auto Pointer C++

In C++, auto_ptr<> is a smart pointer which automatically destroy itself when the program ends. Implementing an auto_ptr class is really easy and straightforward.

#include <iostream>
#include <cstdlib>

template< class T >
class AutoPointer
{
public :
explicit AutoPointer( T* rhs = NULL )
:is_owner( rhs != NULL ), g( rhs )
{ }

AutoPointer( AutoPointer& rhs )
:is_owner( rhs.is_owner )
{
g = rhs.release();
}

~AutoPointer()
{
free_mem();
}

const AutoPointer& operator =( AutoPointer& rhs )
{
if ( &rhs != this )
{
T* other = rhs.deref();
if ( other != g )
{
free_mem();
is_owner = rhs.is_owner;
}
else if ( rhs.is_owner )
{
is_owner = true;
}
g = rhs.release();
}
return *this;
}

T& operator *() const
{
return *deref();
}

T* operator ->() const
{
return deref();
}

T* deref() const
{
return g;
}

T* release()
{
is_owner = false;
return g;
}

private:
T* g;
bool is_owner;
void free_mem()
{
if ( is_owner )
delete g;
}
};

struct Integer
{
Integer( int a ):x( a )
{ }

~Integer()
{
std::cout << "DESTRUCT " << x << '\n';
}

int x;
};


int main( )
{
AutoPointer< Integer > p1( new Integer( 3 ) );
AutoPointer< Integer > p2 = p1;
AutoPointer< Integer > p3;

std::cout << ( *p1 ).x << " " << ( *p2 ).x << '\n';
p3 = p1;
std::cout << p1->x << " " << p2->x << " " << p3->x << '\n';
// 3 is owned by p2.

AutoPointer< Integer > p4( new Integer( 4 ) );
std::cout << p1->x << " " << p2->x << " " << p3->x << " " << p4->x << '\n';
p2 = p4;

std::cout << "3 is no longer owned! p1 and p3 are stale!!!" << '\n';
std::cout << p2->x << " " << p4->x << std::endl;

return 0;
}

Tuesday, July 7, 2009

Simple IDE with GTK+

Đây là chương trình giả tạo IDE đơn giản mà mình viết dùng C/C++ với library GTK+. Nó cũng chẳng có chức năng gì nhiều cả. Nhưng cái chính mình viết nó là để học tập, và mình sẽ còn tiếp tục phát triển nó. Hi vọng có một ngày nó sẽ hoàn thiện hơn.
Chương trình chỉ vọn vẹn có một file ^_^, tuy vậy nó hơi dài nên mình sẽ post lên đây. Các bạn có thể download chương trình tại đây nhé.
source

Vì mình dùng thư viện hỗ trợ gtksourceview-2.0 nên các bạn muốn dịch được thì phải download thằng này về rồi install hoặc install dưới synaptic package manager cũng đuợc.
Các bạn dịch chương trình với lệnh sau :

g++ main.cpp -o main -Wall -pedantic -O3 `pkg-config --cflags --libs gtk+-2.0 gtksourceview-2.0`