笔记(原创) - jues

VC工程中添加lib库

#pragma comment(lib,"xxxxx.lib")或者在工程中添加这个lib.

例如:

#include <wininet.h> 
#pragma comment(lib,"wininet.lib")

 

参考网上。

C/C++指针笔记(1)

今天在百度上看到一个提问C语言指针的问题,问题如下

 

main() 
{
  int  a[6] = {1,2,3,4,5,6};
  int *ptr =  (int*)(&a+1);
  printf("%d\n" , *(ptr-1) );

}
请问输出为多少?请解释

从程序看来,应该是输出 1 ,很简单嘛,+1 然后 -1;

但运行结果却是6,这时你就有疑问了。

如果不懂的却又不怕我误导的朋友们,请往下看...

 

------------------------------------------------------------------------------------------------------

 

为什么C/C++的指针一直那么神奇,但我看来并不是指针的神奇,是对运算(控制)的不了解。

上面的程序如果改为

 

main() 
{
  int  a[6] = {1,2,3,4,5,6};
  int *ptr =  (int*)(a+1);
  printf("%d\n" , *(ptr-1) );

}

 

那答案就是之前你们想的一样是 1 。

 

这里的问题主要是类型转换问题,这里有人问了,这与类型转换有什么关系,请往下看。

当( a + 1 )时,因为a是一个数组,所以a这样的写法指向一个数组首地址指针,大小是 a[ 0 ] ,所以单位运算时 + 1就是向后移动一个 int 类型。

 

当( &a + 1 )时,因为a是一个数组,所以&a这样的写法指向一个数组首地址的首地址指针(不运算时输出的结果一样的),大小是 sizeof( a ) ,所以单位运算时 +  1 就是向后移动一个 sizeof( a ) 大小的类型。

 

测试:

#include <stdio.h>

void main() 
{
  int  a[6] = {1,2,3,4,5,6};
  int *ptr1 ;
  int i;
 // int *ptr2 =  ( int * )a;
  printf( "&a = 0x%X\r\n",&a );

  for ( i = 0;sizeof( a ) / sizeof( a[ 0 ] )  > i; i++ )
  {
	ptr1 =  (int*)( &a + i );
	printf( "&a + %d = 0x%X\r\n",i,( long )ptr1 );

	ptr1 =  (int*)( a + i );
	printf( "( a + %d = 0x%X )\r\n",i,( long )ptr1 );
  }

}

 

 

所以个人总结:

( a + 1 )  =  ( ( char* )a + sizeof( *a )  )


( &a + 1 )  =  ( ( char* )a + sizeof( *&a )  )

 

 

 

以上纯个人观点,只能在自己博客显显眼,如有误导,请多多包涵。

 

 

JList

    以前经常用QT,发现里面的QList很好用,今天自己也写了一个方便在别的平台使用,在此分享一下,欢迎测试,转载和使用请注明头部作者相关信息。

如有错漏欢迎指出,谢谢!

 

/************************************************************************
function    :    JList
writer    :    jues
mail    :    jue_s@live.cn
home    :    http://jues.i11r.com
date    :    2013-08-20

 
    example    :    JList<type> test;
    
      eg1        :   JList<int>  test;
      eg2        :   JList<struct>  test;
      eg2        :   JList<class>  test;
      
************************************************************************/

// jlist.h: interface for the JList class.
//
//////////////////////////////////////////////////////////////////////
#include <string.h>

/**/
template <typename T>
class JList  
{
private:
    struct T_dat
    {
        T m_t;
        T_dat *p_up;
        T_dat *p_down;
    };
    private:
        T_dat *m_first;
        T_dat *m_last;
        unsigned long  m_count;
        
    public:
        /* init data */
        void init( void )
        {
            this->m_first = NULL;
            this->m_last = NULL;
            this->m_count = 0;
        }
        JList()    {  
            this->init();
        }
        ~JList(){  
            this->clear();
        };
    private:
        /* get index value */
        T_dat * _getAt( const unsigned long &index )
        {
            unsigned long i;
            T_dat *p_t;
            /**/
            
            if ( this->m_count <= index )
                return NULL;
            /* find */
            i = 0;
            p_t = this->m_first;
            while( index >= i )
            {
                p_t = p_t->p_down;
                i++;
            }
            return p_t;
        }
    public:
        /* add new data for class */
        unsigned long add( JList<T> &ts )
        {
            unsigned long count;
            unsigned long index;
            /**/
            count = ts.m_count;
            index = 0;
            while( count > index  )
            {
                this->add( ts.getAt( index ) );
                index++;
            }
            return this->m_count;
        }
        /* add new data for value*/
        unsigned long add( const T &t )
        {
            /* first one add */
            if ( NULL == this->m_last )
            {
                this->m_first = new T_dat;
                this->m_first->p_up = NULL;
                this->m_last = this->m_first;
                this->m_count = 1;
            }
            else
            {
                this->m_last->p_down = new T_dat;
                this->m_last->p_down->p_up = this->m_last;
                this->m_last = this->m_last->p_down;
                this->m_count++;
            }
            /* last add */
            this->m_last->m_t = t;
            this->m_last->p_down = NULL;
            /* return add  */
            return this->m_count;
        }
        /* get count */
        unsigned long getCount( void )
        {
            return this->m_count;
        }
        /* get index value */
        T getAt( const unsigned long &index )
        {
            T_dat *p_t;
            T t;
            /**/
            memset( &t,0,sizeof( t ) );
            p_t = this->_getAt( index );
            /* not find */
            if ( NULL == p_t )
                return t;
            /* finded */
            return ( p_t->m_t );
        }
        /* remove index value */
        void remove( const unsigned long &index )
        {
            T_dat *p_t;
            /**/
            p_t = this->_getAt( index );
            /* not find */
            if ( NULL == p_t )
                return;
            
            p_t->p_up->p_down = p_t->p_down;
            p_t->p_down->p_up = p_t->p_up;
            delete  p_t ;
            this->m_count--;
        }
        /* clear all */
        void clear( void )
        {
            T_dat *p_t;
            /**/
            while( NULL != this->m_last )
            {
                p_t = this->m_last;
                this->m_last = this->m_last->p_up;
                delete p_t ;
            }
            this->init();
        }
        /* find first one */
        T*  findFirst( const T &t )
        {
            T_dat *p_t;
            /**/
            p_t = this->m_first;
            while ( NULL != p_t )
            {
                if ( 0 == memcmp( &t,&( p_t->m_t ),sizeof( T ) ) )
                    return &( p_t->m_t );
                p_t = p_t->p_down;
            }
            return NULL;
        }
        /* find last one */
        T*  findLast( const T &t )
        {
            T_dat *p_t;
            /**/
            p_t = this->m_last;
            while ( NULL != p_t )
            {
                if ( 0 == memcmp( &t,&( p_t->m_t ),sizeof( T ) ) )
                    return &( p_t->m_t );
                p_t = p_t->p_up;
            }
            return NULL;
        }
};

获取函数的真实地址

几年记得找到过一个例子,说怎么改其它函数中的变量方面的,后来以为自己会记得,现在又忘了,

自己摸索一下,写了一个应该类似的获取函数的真实地址函数,特意发来以防止再忘记。

如有错漏,望多多指出。

#include <stdio.h>


/************************************************************************

  作者: jues
  邮箱: jue_s@live.cn
  主页: http://jues.i11r.com/
  
    函数: get_fun_add
    说明: 获取函数的真实地址
	环境: win2003 sp2 VC6.0 
	日期: 2013-08-15 18:31
	
	  参数: fun 为 要获取的函数
	  返回: 真实的函数地址
	  
************************************************************************/
long get_fun_add( long fun )
{
	/**/
	if ( (char)0xE9 == (char)( *(char*)fun ) )/*0xE9 = jmp 汇编中的跳转指令,这里判断是否是虚函数*/
		( ( char* )&fun )[ 0 ] += ( ( char* )fun )[ 1 ]/* 偏移数长度 */ + 0x05/* 操作数长度 */  ;
	else
		fun = 0x000000;
	
	return fun;
}

void test()
{
	char str[] = "this is test.";
	/**/
	
	puts( str );
}

void main()
{
	long fun;
	char *str;
	/**/
	fun = ( long )get_fun_add;
	str = ( char* )get_fun_add;
	fun = get_fun_add( ( long )get_fun_add );
	
	test();
}

android分区

   很多朋友们说android默认的安装储存空间太小,安装不了几个就满了(当然你可以安装在SD卡),对于分区的方式有各种各样,这里介绍的是从手机内部储存的/mnt/sdcard分区,分出一些空间作为/data分区(安装储存空间)。

对linux熟悉的朋友们都知道,在linux可以用比较原始的fdisk 分区,不错,这里也是用这个方法;至于有的朋友说这和安装在SD卡上没区别,不必要,说真的,看到这句话真的些不想写这教程了,区别还是有的,具体了解下linux挂载工作原理和效率,简单来说,你在手机的终端里进行下 mount 就能知道你挂载了多少,你安装多一个软件在SD卡上就会多挂载一个块文件,挂载过来而且是vfat类的格式,当然比原来的ext4效率慢,想想用安装多少在SD卡上的软件。

发两张完成后的效果图:

 

具体思路: 为了简单,我的思路是不要原来/data分区(最好留着不动,以防以后刷别的rom时用得着,当然如果你稍改下rom也是可以的),然后把原来的/mnt/sdcard分区删除,然后分出一个新的比原来小的/mnt/sdcard分区,接着剩下的空间分为新的/data分区,最后修改boot.img ,改开机默认挂载新的/data分区。

 注意: 这教程如果你操作不当有开不了机的可能,所以最好是前提有一个能刷romconvery比较好,这样就算开不了机也可以刷rom,仅个人爱好,需要的尝试,注意操作,失败有风险。

教程应该是比较简单的,可能我写的比较多起来复杂而已.

  1.  首先注明:由于本人的手机已经成功分区过,所以下面的教程,关键部分是模拟的(还好fdisk支持模拟操作),本人的rom是2.3.5的,不同的版本rom可能有些不一样,自己灵活变通下就好了,记得备份好/mnt/sdcard上的数据。
  2. 首先打开手机的终端(这个随便,在手机用终端模拟器也行,最好能在reconvery模式下连接电脑打开终端。),我这里是正常开机的状态下连接电脑打开的终端(如电脑上没有adb.exe,可把”a820l_内核解包打包_rle文件修改工具2.zip”解压后打开”cmd.bat”)。

因为以下操作需要管理器权限,

输入 su 命令,然后回车

  1. 查看 /data分区和/mnt/sdcard分区的设备路径,然后自己记下来.

       输入命令 mount,然后回车

由于我这是分区过的,所以我这可能和你们的不太一样,我这里是(设备名我按照fdisk显示的格式写,其它你只记下后面的数字就好了,除非你操作的是外部SD卡进入分区):

/data的是/dev/block/mmcblk0p27    (原来我的是14)

/mnt/sdcard的是/dev/block/mmcblk0p26

 

 

  1. 输入命令 :fdisk /dev/ block /mmcblk0  ,然后回车

在Command (m for help): 后面里输入 p,回车,查看/dev/ block /mmcblk0的设备

  1. 找到/mnt/sdcard 也就是/dev/block/mmcblk0p26,然后删除它(如/mnt/sdcard有重要数据,请备份好,当然如果没有执行 w 操作fdisk不会改变你的分区).

           

       在 Command (m for help): 提示下输入 ‘d’ 回车 (进行删除操作)

在 Command (m for help): 提示下输入 ‘26’ 回车 (删除指定分区26)

在 Command (m for help): 提示下输入 ‘p’ 回车 (查看删除后的变化)

 

 

  1. 重新划分/mnt/sdcard 大小。

在 Command (m for help): 提示下输入 ‘n’ 回车 (进行新建分区操作)

在 First cylinder (6322-1923584, default 6322): 提示下输入 ‘290819’ 回车 (新建分区的起始位置,应该是26分区前面的分区(这是25)的结束位置+2).

在 Last cylinder or +size or +sizeM or +sizeK (290819-1923584, default 1923584): 提示下输入 ‘+9000M’ (这里可以用单位M,9000M大约为9G,想自己定的可以算好,是减去/data分区的大小)

 

  1. 新建立一个分区作为/data

      

      这里新建分区和 /mnt/sdcard类似,这里把所有剩下的空间都分给新建的分区作为/data   (   ( 1923584 – 1389454)/128 = 4172.8 M )

  1. 保存分区表。

 (请一定确认你保存在/mnt/sdcard的重要数据是备份好的)在 Command (m for help): 提示下输入 ‘wq’ 回车 (保存分区表信息,并退出fdisk),保存时可能提示错误,但没关系,实际已经成功了,然后重启下手机。

  1. 格式化新分区(事先应该用”fdisk -l /dev/block/mmcblk0”确认下是否分区成功)。

<1>格式化/mnt/sdcard ,这个可以不用命令行格式化,在手机设置中可以操作

<2>格式后新/data分区

这里我就不格式化了,如遇到提示输入的地方一路回车就可以了,很快就可以格式式完成。

  1. 恢复数据 。
  2. 把备份好的/mnt/sdcard 数据还原到/mnt/sdcard上。

<2> 挂载新/data分区临时挂载到/mnt/data,然后复制原来/data的数据(建议mount挂载后使用re复制).

  1.  修改 boot.img 中的init.rc文件,指向新的/data分区.

          解压 “a820l_内核解包打包_rle文件修改工具2.zip”

  • 运行 “a820l_内核解包打包_rle文件修改工具2” 中的 “1、解包内核.bat”.

<2> 修改” a820l_内核解包打包_rle文件修改工具2\boot\ramdisk\init.rc”文件.

   查找前面记下的 /data 分区的设备名. 我这里是 从14改为27. 修改好请保存。

  • 运行 “a820l_内核解包打包_rle文件修改工具2” 中的 “2、重新打包内核.bat”.

 

<4> 最后运行 “3、写入内核.bat” 。

<6> 重启手机测试是否成功。

 

     writer:   jues

     email :    jue_s@live.cn

     home  :    http://jues.i11r.com/

     date  :    2013-05-13

 

      转换请注明出外(盗者必究): http://jues.is-programmer.com/posts/39225.html