Monthly Archives: April 2007

DDD

 程序编译过了就要调试了,没想到以前对linux的一点点了解都忘光了,运行gdb后只想到了r,b,l这几个命令和help,其他都忘了。更可恶的是,装了ddd后,只会用next,查看变量值的命令也忘了,太郁闷了。

以前用过的一个Makefile

# Training Projects
CC = icc  -xW -O3   #-march=i686 -mcpu=i686
#CPP = icc -ipo -xW -O3
CPP = g++ -w -O3 -march=pentium4
#CPP = icpc -O0 -xW
#CPP= icpc -xW -O3 -no-ipo
INC = -I/usr/include -I/usr/local/include -I/opt/intel/opencv/include/opencv  -I/opt/intel/ipp41/ia32_itanium/include
LIB = -I/usr/lib -I/usr/local/lib -L/opt/intel/opencv/lib  -L/opt/intel/ipp41/ia32_itanium/sharedlib
OPT = -lcxcore -lcvaux -lcv -lhighgui -lippcore -lipps -lippm -lippi -lstdc++ -lpthread
OBJ = extractfeatures.o learn.o main.o
BIN = train   # executables to create
all: $(BIN)      
$(BIN): $(OBJ)
        $(CPP) -o $(BIN) $(OBJ)  $(LIB) $(OPT)
main.o: main.cpp stdafx.h learn.h Makefile
        $(CPP) -c main.cpp -o main.o  $(INC)
learn.o: learn.cpp stdafx.h learn.h extractfeatures.h Makefile
        $(CPP) -c learn.cpp -o learn.o $(INC)
extractfeatures.o: extractfeatures.cpp stdafx.h learn.h wtfwd53.h extractfeatures.h Makefile
        $(CPP) -c extractfeatures.cpp -o extractfeatures.o  $(INC)
clean:
        rm *~ *.o $(BIN) core train

The std::list Container Class

Last updated May 7, 2003.

Linked lists are another widely-used data structure. Yet writing a linked list from scratch is an arduous, frustrating and time-consuming task. Instead of reinventing the wheel every time anew, use the STL std::list container class. Its uniform interface, generic nature and seamless integration with other STL constructs make it a superior choice to any homemade list class, as I will show in the following sections.

Creating a list object

The header <list> contains the declaration of std::list and its specialized algorithms. Our first step is to create an empty list of integers called li:

#include <list>
using std::list;
int main()
{
 list <int> li;
}

To insert a single element, use the push_back() member function:

li.push_back(1);

To remove the last element of a list, use the pop_back() member function

li.pop_back();

As opposed to push_back(), push_front() inserts an element before the list’s beginning:

li.push_front(0); // the first element is now 0, not 1

Similarly, pop_front() removes the first element of a list:

li.pop_front();

To remove a certain value from the list without indicating its exact position, use remove(). remove(n) removes all the elements that equal to n from the list:

li.remove(0); // li doesn't contain 
       //any zeros anymore
Dealing with Sequences

Up until now I have exemplified list operations that operate on a single element at a time. std::list supports sequence operations as well. These operations enable you to traverse, fill, sort and reverse multiple elements at once.

Iteration is easy. The begin() and end() member functions return iterators pointing at the list’s beginning and end, respectively. Use them to access all the list’s elements sequentially. Note that we’re using a const_iterator instead of an ordinary iterator object because the iteration process in this case doesn’t modify the list’s state:

list<int>::const_iterator it;
for(it=li.begin(); it!=li.end(); ++it)
{
 cout << *it << endl; // each element on a separate line
} 

The assign() member function fills a list with the contents of another sequence such as a vector or an array. It takes two input iterators (for further information on iterator categories, see the resources below) that mark the sequence’s beginning and end, respectively. In the following example, we fill a list with the elements of an array:

int arr[3] = {10,20,30};
li.assign( &arr[0], &arr[3]);

You can merge two lists into one. The merge() member function takes a reference to another list object:

list <int> x;
//..fill x
li.merge(x); // merge the elements of x into li

merge() merges x into li. x becomes empty after the merge operations. To erase one or more elements, use the erase() member function. This function has two overloaded versions; the first of which takes an iterator and erases the element to which it points. The second version takes two iterators that mark the beginning and the end of the sequence to be erased. Suppose you have a list of 10 elements and you want to remove all the elements but the first two. Use erase() as follows:

list<int>::it=li.begin();
++it; ++it; // advance to third element
li.erase(it, li.end()); // erase elements 3 – 10
Support for User-Defined Types

The generic nature of list enables you to define specializations, or instances, of user-defined types. For example, you may create lists of strings and Date objects like this:

#include <string>
#include "Date.h"
list<std::string> ls;
list <Date> ld;

Operations that require element comparison such as sort() and unique() use the overloaded < operator. If you intend to use any of these algorithms with lists, define a matching overloaded version of this operator for your class first:

bool operator < (const Date& d1, const Date& d2);
ld.sort(); // OK, using overloaded < operator

Note that in general, sorting a list is less efficient than sorting a vector or a queue. Therefore, if you need to sort elements frequently, you probably shouldn’t use a list in the first place. The same is true for reverse(), which is also supported:

ld.reverse();
for(it=ld.begin(); it!=ld.end(); ++it)
{
 cout << *it << endl; // descending order
} 

收拾server小记(1)–Update the Firmware of Intel S5000PSL

读ph.d的过程就是磨练自己脾气的过程,收拾琐碎的东西就是很好的一种方式,比如收拾server。其实今天没打算修理它的,后来因为早上换了块fireware卡以后,server启动不了了,才决定修理它的。

不停的重起,拔掉4个pci卡,插上这些卡,重复一两次不会觉得有什么,重复十次呢?如果重复一百次能?中间每次拔插卡的时候再拧拧螺丝什么的,呵呵,肯定很爽~

终于在下午快3点的时候发现是显卡的问题,插上pci-e的显卡就挂了,系统启动不了,status led一直是amber常亮。开始上intel的网站上down firmware的update,提供三种方式升级,一种是用Deployment Assistant 1.2,一种是One Flash Update Utility,还有是在纯dos下用iflash update。第一种主板自带的启动盘版本低,每次用的时候出错,说系统无可启动硬盘;下载的要刻盘,一开始没有空盘;第二种在xp下装了半天一直出错,过了好一阵子才明白这玩意要在win server下装才行,切到win2k3下,装到一半crash,我无语。。。

到晚8点的时候开始准备用dos来升级,花了快2个多小时来整usb启动盘。以前用过usboot来做启动盘,都没有成功过,到公司的时候试了试还是没有搞定。今天终于搞定了!那就是用winimage和DOS80V31.img来做启动盘,也就是先装winimage,然后用用winimage load那个imgfile(有很多imgfile的后缀名为.exe, 不用管它,直接加载),再选择usb盘,开始write就行了,很方便。

一开始的时候用的是dos7.1,碰到了这个错误:

causeway Error 11: Dos reported an error or corrupt file found.

然后google,google也没找到答案,想着可能是dos的版本低,不支持这些新的dos程序,就down了个dos80的下来(发现天空软件上的软件挺多的),最后将bios先升级到66,然后升级到74,都没有问题。想着应该没有问题了,可是装上显卡后server还是在进bios之前挂掉了,又捣鼓了快两个小时,我放弃了,我要先休息一下,恢复一下我的听觉。