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;
}