精华内容
下载资源
问答
  • 近来思绪有点停不下来,构思了一个GUI的框架(用在Cotex...状态机的好处不用多说,自己百度去,但传统的编程模式,无论是C语言,或是硬件FPGA的Verilog都是采用switch-case结构,硬件的还好说,是并行的,但如果是C语...

    近来思绪有点停不下来,构思了一个GUI的框架(用在Cotex-M平台上,很小),期待以后有时间去实现,里面有一个对触摸屏的检测,自然想到使用状态机进行消息的生成和分发,于是想着实现一个状态机实现的模型,以后再其他项目上应用也方便。

    状态机的好处不用多说,自己百度去,但传统的编程模式,无论是C语言,或是硬件FPGA的Verilog都是采用switch-case结构,硬件的还好说,是并行的,但如果是C语言实现状态机则可能需要对每个case进行判断,状态少比如几个可能没什么效率之类的问题,但状态多几十个上百个呢,那么就需要进行上百次的判断是否匹配,毫无疑问效率很低,切每次的状态切换时间也不确定。那么有没有一种好的实现模式不用switch-case结构呢?下面我来为C语言状态机的实现建立一个最优模式。

    实现

    前面说了一堆***i的废话,下面进入正题,前段时间研究了下函数式编程,发现C语言的循环结构完全可以用尾递归(不懂百度)实现,最后C就只剩下唯有if和switch还不能用函数式编程实现,而今天要讲的状态机模式就是用函数式编程实现switch-case,那么switch-case其实可以看做一种查找的跳转,我们知道C语言中goto可以实现跳转,那么还有什么可以实现跳转呢,答案是函数调用,但是又需要如何实现指定的函数调用呢,难道要用if判断,显然没什么意义,那么又没有比if判断(如果上百次判断)更高效的东西呢?有人已经想到是查表,如果将查表和函数调用结合,那么就是函数指针数组的应用了!

    上代码!首先定义一个函数指针类型,为什么要带void *的参数后面会说:

    typedef unsigned char State;

    typedef State(*Procedure)(void *);

    这样就可以方便地定义一个函数指针数组:

    Procedure Steps[] = { step_init, step_count, step_done, step_default };

    step_init,step_count等是函数名,再定义状态:

    enum states{ s_init, s_count, s_done, s_default };

    枚举定义对应着{0,1,2,3},有了这些再状态机联系那么可以想到,数组的索引就是状态定义,上核心代码,两行(简单吧!关键是想到):

    void BestStateMachine(void * invar) { static State NS = s_init; //定义下一状态 NS = Steps[NS](invar); } static的变量NS在每次BestStateMachine调用会得到维护,我们只需再每Steps返回下一个状态并保存到NS中可以实现状态的保存和切换。再说说为什么要加个void*的参数,状态机一般有很多自身变量的维护,而且对于mealy状态机还需根据输入判断,因为函数调用返回是不保留局部变量的,那么就需要将变量传递来实现更改和保存,之所以只用了一个void*参数是因为,如果需要保存和传递的变量很多,直接传递会在调用函数是浪费大量的栈空间,且效率低下,采用这种模式,你可以将变量用一个结构体封装,然后将结构体指针传递给void *的形参,再函数内部再强制转换即可使用结构体内部的变量。现在你已经在嘀咕这作者真啰嗦,好上实例代码,就是一个简单的计数器(以前学状态机都从计数器开始),在计数完成打印信息:

    #include typedef unsigned char State; typedef State(*Procedure)(void *); enum states{ s_init, s_count, s_done, s_default };//状态定义 typedef struct _SM_VAR //对状态机参数封装 { int cnt; }SM_VAR; State step_init(void * arg)//初始化 { SM_VAR *p = (SM_VAR *)arg; p->cnt = 0; printf("CS:init ;cnt=%d;NS:count\n", p->cnt); return s_count; } State step_count(void * arg)//计数 { SM_VAR *p = (SM_VAR *)arg; if (p->cnt < 3){ p->cnt+=1; printf("CS:count;cnt=%d;NS:count\n", p->cnt); return s_count; } else{ printf("CS:count;cnt=%d;NS:done\n", p->cnt); return s_done; } } State step_done(void * arg)//计数完成 { SM_VAR *p = (SM_VAR *)arg; printf("CS:done ;cnt=%d;NS:init\n", p->cnt); return s_init; } State step_default(void * arg)//错误过程 { SM_VAR *p = (SM_VAR *)arg; printf("Wrong State\n"); return s_init; } Procedure Steps[] = { step_init, step_count, step_done, step_default }; void BestStateMachine(void * invar) { static State NS = s_init; //定义下一状态 NS = Steps[NS](invar); } int main(void) { SM_VAR var; int i; for (i = 0; i <8; i++){//给状态机8个周期的时钟驱动 BestStateMachine(&var); } return 0; }

    最后在VS2013上调试如下:

    CS:init ;cnt=0;NS:count CS:count;cnt=1;NS:count CS:count;cnt=2;NS:count CS:count;cnt=3;NS:count CS:count;cnt=3;NS:done CS:done ;cnt=3;NS:init CS:init ;cnt=0;NS:count CS:count;cnt=1;NS:count 请按任意键继续. . .

    总结

    以这种模式不仅可以实现上面的Moore型状态机,还可根据实际实现Mealy型状态机,结构清晰易懂,在这里我敢说最优,是因为这是C函数式编程的极限了,如果你有更好的想法联系我,邮箱:869119842@qq.com,唐童鞋。如果你对嵌入式GUI感兴趣,我们可以一起探讨写出我们自己的GUI。

    展开全文
  • 命令行模式和输入模式切换 命令行一些命令 函数(三要素) 基本的C语言代码结构   1.ls 显示当前所有文件+目录 2.cd bin/ls/cd ..(返回上一级) 3.创建文件夹: mkdir myfile cd myfile(打开文件夹) 4...
    
    1. linux终端命令

    2. gcc过程

    3. 命令行模式和输入模式切换

    4. 命令行一些命令

    5. 函数(三要素)

    6. 基本的C语言代码结构

       

      1.ls 显示当前所有文件+目录

      2.cd bin/ls/cd ..(返回上一级)

      3.创建文件夹:mkdir myfile   cd myfile(打开文件夹)

      4.创建文件touch myfile.c

        打开和创建文件 vim myfile.c

      按上、下箭头键可以在命令的执行历史中查找命令。

      5.vi

      vi(vim)是上Linux非常常用的编辑器,很多Linux发行版都默认安装了vi(vim)。

      vi有3个模式:插入模式、命令模式、低行模式。

      插入模式:在此模式下可以输入字符,按ESC将回到命令模式。

      命令模式:可以移动光标、删除字符等。

      低行模式:可以保存文件、退出vi、设置vi、查找等功能(低行模式也可以看作是命令模式里的)。

       

      vi myfile.c(命令行模式)

      1.进入输入模式i

      2.退出Esc(命令行模式)  :wq(保存并退出vi:q!(强制退出)

       #include<stdio.h>

       int main(参数)->程序入口

      {

      4printf(     )

      (其中 printf打印一个值)

       return 0;

      }

       

      1.参数2.函数体3.返回值

       

       

       

       

      #include<stdio.h>

      int main()

      {

      printf(helloworld);

      return 0;

      }

      运行结果:helloworld

       

    1. gcc编译gcc myfile.c

      ls(产生可执行文件)

    2.   ./a.out(显示运行结果)

       

      #include<stdio.h>

      int main()

      {

          wyx(5);  

          return 0;

      }

      int wyx(int a)

      {

          printf("%d",a);

          return 0;

      }

      输出结果:5

       

      #include<stdio.h>

      int main()

      {

          printf("%d",wyx(5));  "%d"占位符

          return 0;

      }

      int wyx(int a)

      {

          printf("%d",a);

          return a*2;

      }

      运行结果:510

      set  shiftwidth=4(设置4个空格)

      8.

      1.rm: 单用无法删除目录,只能删文件

            rm-r cyx(目录名)

      rm:是否删除 目录 “cyx?  y

          ls查看

      2.ps -aux查看后台线程

      3.man printf会出现printf的说明

      9.运行如果不停输出 按Ctrl+C

      10.命令行模式

      dd删除行,10dd删除10行,u返回,yyp复制行 ,10yyp复制10

    1. int4个字节)char(1 )  float(4) sizeof字节数

          #include<stdio.h>

      int main()

      {

                 int a=5;

                 char b='c';

                 printf("%d",sizeof(a));

                 printf("%d",sizeof(b));

      }

      运行结果41

       

       

      作业:1.gcc工具(linux)

            (compile几个步骤:预处理、编译、汇编、链接)

        2.预习

        3.复习课上代码

    展开全文
  • 策略模式C语言实现

    2020-02-09 20:34:43
    【说明】策略模式C语言实现,实现了3种排序算法的灵活切换。 【代码清单】 typedef.h /* Author : tandesir Time : 2013-03-09 借鉴Li XianJing部分代码, 感谢 Li XianJing <xianjiml...

    【说明】策略模式的C语言实现,实现了3种排序算法的灵活切换。

    【代码清单】

    typedef.h
    
    /*
    	Author : tandesir
    	Time : 2013-03-09
    	借鉴Li XianJing部分代码, 感谢  Li XianJing <xianjimli@hotmail.com>
    	欢迎访问 http://blog.csdn.net/tandesir
    */
    #ifndef __TYPEDEF_H__
    #define __TYPEDEF_H__
     
    #include <stdio.h>
     
    enum 
    {
    	RET_OK,
    	RET_FAIL
    };
     
    #ifdef __cplusplus
    #define DECLS_BEGIN extern "C" {
    #define DECLS_END }
    #else
    #define DECLS_BEGIN 
    #define DECLS_END 
    #endif/* __cplusplus */
     
    #define DEBUG_PRINT(FORMAT, VALUE) printf("File %s line %d: "\
    			#VALUE " = " FORMAT "\n"\
    			,__FILE__, __LINE__,VALUE\
    			);
     
    #define LENGTH(array) (sizeof(array)/sizeof(array[0])) 
     
    #define return_if_fail(p) if(!(p)) \
    	{printf("%s : %d Warning : "#p" failed.\n",\
    	__func__, __LINE__); return ;}
     
    #define return_val_if_fail(p, ret) if(!(p))\
    	{printf("%s : %d Warning : "#p" failed.\n",\
    	__func__, __LINE__); return (ret);}
     
    #define SAFE_FREE(p) if(p != NULL){free(p); p = NULL;}
     
     
    #endif/*__TYPEDEF_H__*/
    

    sort.h

    #ifndef __SORT_H__
    #define __SORT_H__
     
    #include "typedef.h"
    #include "cmp.h"
     
    DECLS_BEGIN 
     
    struct _Sort;
    typedef struct _Sort Sort;
     
    struct _Sort
    {
    	int (*sort)(int arr[], size_t count, DataCompare cmp);
    	void (*destroy)(void *thiz);
    };
     
    static inline int sort(Sort *thiz, DataCompare cmp, int arr[], size_t count)
    {
    	return_val_if_fail(thiz != NULL, RET_FAIL);
    	
    	if(thiz->sort != NULL)
    	{
    		return thiz->sort(arr, count, cmp);
    	}
     
    	return RET_OK;
    }
     
    static inline void sorter_destroy(Sort *thiz)
    {
    	return_if_fail(thiz != NULL);
    	
    	if(thiz->destroy != NULL)
    	{
    		return thiz->destroy(thiz);
    	}
    }
     
    DECLS_END
     
    #endif
    

    bubble_sort.h

    /*
    	Author : tandesir
    	Time : 2013-03-09
    	借鉴Li XianJing部分代码, 感谢  Li XianJing <xianjimli@hotmail.com>
    	欢迎访问 http://blog.csdn.net/tandesir
    */
    #ifndef __BUBBLE_SORT_H__
    #define __BUBBLE_SORT_H__
     
    #include "typedef.h"
    #include "sort.h"
    #include "cmp.h"
     
    DECLS_BEGIN 
     
    struct _Bubble;
    typedef struct _Bubble Bubble;
     
    typedef int (*BubbleSort)(int arr[], size_t count, DataCompare cmp);
     
    struct _Bubble
    {
    	Sort sorter;
    };
     
    Bubble *BubbleSortCreate(void);
     
    DECLS_END
     
    #endif
    

    bubble_sort.c

    /*
    	Author : tandesir
    	Time : 2013-03-09
    	借鉴Li XianJing部分代码, 感谢  Li XianJing <xianjimli@hotmail.com>
    	欢迎访问 http://blog.csdn.net/tandesir
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    #include "typedef.h"
    #include "bubble_sort.h"
    #include "cmp.h"
     
    /* 
     冒泡排序(1)
     i∈[N-1,0)               //循环N-1遍
       j∈[N-1,N-i-1)         //每遍循环要处理的无序部分
         swap(j,j-1)         //两两排序(升序/降序)
    */
    static int bubble_sort(int arr[], size_t count, DataCompare cmp)
    {
    	size_t i, j;
    	int temp;
     
    	if(count < 2)
    	{
    		return RET_OK;
    	}
    	for(i = count - 1; i > 0; i--)
    	{
    		for(j = count - 1; j > count - 1 - i; j--)
    		{
    			if(cmp(arr[j-1], arr[j]) > 0)
    			{   
    				temp = arr[j];
    				arr[j] = arr[j-1];
    				arr[j-1] = temp;
    			}
    		}
    	}
     
    	return RET_OK;
    }
     
    static void bubble_destroy(void *thiz)
    {
    	if(thiz != NULL)
    	{
    		SAFE_FREE(thiz);
    	}
    }
     
     
    Bubble *BubbleSortCreate(void)
    {
    	Bubble *thiz = malloc(sizeof(Bubble));	
    	
    	if(thiz != NULL)
    	{
    		thiz->sorter.sort = bubble_sort;
    		thiz->sorter.destroy = bubble_destroy;
    	}
     
    #ifdef DEBUG
    	printf("construct bubble\n");
    #endif
     
    	return thiz;
    }
    

    merge_sort.h

    /*
    	Author : tandesir
    	Time : 2013-03-09
    	借鉴Li XianJing部分代码, 感谢  Li XianJing <xianjimli@hotmail.com>
    	欢迎访问 http://blog.csdn.net/tandesir
    */
    #ifndef __MERGE_SORT_H__
    #define __MERGE_SORT_H__
     
     
    #include "sort.h"
    #include "cmp.h"
     
    DECLS_BEGIN 
     
    struct _Merge;
    typedef struct _Merge Merge;
     
    typedef int (*MergeSort)(int storage[], int arr[], size_t low, size_t mid, size_t high, DataCompare cmp);
     
    struct _Merge
    {
    	Sort sorter;
    };
     
    Merge *MergeSortCreate(void);
     
    DECLS_END
     
    #endif
    

    merge_sort.c

    /*
    	Author : tandesir
    	Time : 2013-03-09
    	借鉴Li XianJing部分代码, 感谢  Li XianJing <xianjimli@hotmail.com>
    	欢迎访问 http://blog.csdn.net/tandesir
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    #include "typedef.h"
    #include "merge_sort.h"
    #include "cmp.h"
     
    #ifdef DEBUG
    static int i = 0;
    #endif
     
     
    /* 
     归并排序(1)
     递归
    */
    static int merge_sort_impl(int storage[], int arr[], size_t low, size_t mid, size_t high, DataCompare cmp)
    {
    	size_t i = low;
    	size_t j = low;
    	size_t k = mid;
     
    	if((low + 1) < mid)
    	{
    		size_t x = low + ((mid - low) >> 1);
    		merge_sort_impl(storage, arr, low, x, mid, cmp);
    	}
     
    	if((mid + 1) < high)
    	{
    		size_t x = mid + ((high - mid) >> 1);
    		merge_sort_impl(storage, arr, mid, x, high, cmp);
    	}
     
     
    	while(j < mid && k < high)
    	{
    		if(cmp(arr[j], arr[k]) <= 0)
    		{
    			storage[i++] = arr[j++];
    		}
    		else
    		{
    			storage[i++] = arr[k++];
    		}
    	}
    	while(j < mid)
    	{
    		storage[i++] = arr[j++];
    	}
    	while(k < high)
    	{
    		storage[i++] = arr[k++];
    	}
    	for(i = low; i < high; i++)
    	{
    		arr[i] = storage[i];
    	}
    #ifdef DEBUG
    	printf("depth:%d\n", i++);
    #endif
    	return RET_OK;
    }
    static int merge_sort(int arr[], size_t count, DataCompare cmp)
    {
    #ifdef DEBUG	
    	DEBUG_PRINT("%d", count);
    #endif
    	return_val_if_fail(cmp != NULL, RET_FAIL);
    	int storage[count];
    	if(count > 1)
    	{
    		merge_sort_impl(storage, arr, 0, count>>1, count, cmp);
    	}
     
    #ifdef DEBUG
    	i = 0;
    #endif
    	return RET_OK;
    }
     
    static void merge_destroy(void *thiz)
    {
    	if(thiz != NULL)
    	{
    		SAFE_FREE(thiz);
    	}
    }
     
    Merge *MergeSortCreate(void)
    {
    	Merge *thiz = malloc(sizeof(Merge));	
    	
    	if(thiz != NULL)
    	{
    		thiz->sorter.sort = merge_sort;
    		thiz->sorter.destroy = merge_destroy;
    	}
     
    #ifdef DEBUG
    	printf("construct merge\n");
    #endif
    	
    	return thiz;
    }
    

    quick_sort.h

    /*
    	Author : tandesir
    	Time : 2013-03-09
    	借鉴Li XianJing部分代码, 感谢  Li XianJing <xianjimli@hotmail.com>
    	欢迎访问 http://blog.csdn.net/tandesir
    */
    #ifndef __QUICK_SORT_H__
    #define __QUICK_SORT_H__
     
    #include "typedef.h"
    #include "sort.h"
    #include "cmp.h"
     
    DECLS_BEGIN 
     
    struct _Quick;
    typedef struct _Quick Quick;
     
    typedef int (*QuickSort)( int arr[], size_t left, size_t right, DataCompare cmp);
     
    struct _Quick
    {
    	Sort sorter;
    };
     
    Quick *QuickSortCreate(void);
     
    DECLS_END
     
    #endif
    

    quick_sort.c

    /*
    	Author : tandesir
    	Time : 2013-03-09
    	借鉴Li XianJing部分代码, 感谢  Li XianJing <xianjimli@hotmail.com>
    	欢迎访问 http://blog.csdn.net/tandesir
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    #include "typedef.h"
    #include "quick_sort.h"
    #include "cmp.h"
     
    #ifdef DEBUG
    static int i = 0;
    #endif
     
    /* 
     快速排序(1)
    */
    static int quick_sort_impl(int arr[], size_t left, size_t right, DataCompare cmp)
    {
    	size_t save_left = left;
    	size_t save_right = right;
    	int x = arr[left];
    		
    	while(left < right)
    	{
    		while(cmp(arr[right], x) >= 0 && left < right) right--;
    		if(left != right)
    		{
    			arr[left] = arr[right];
    			left++;
    		}
    		while(cmp(arr[left], x) <= 0 && left < right) left++;
    		if(left != right)
    		{
    			arr[right] = arr[left];
    			right--; 
    		}
    	}
    	arr[left] = x;
    	if(save_left < left)
    	{
    		quick_sort_impl(arr, save_left, left-1, cmp);
    	}
    	if(save_right > left)
    	{
    		quick_sort_impl(arr, left+1, save_right, cmp);
    	}
     
    #ifdef DEBUG	
    	printf("depth:%d\n", i++);
    #endif
     
    	return RET_OK;
    }
     
     
    static int quick_sort(int arr[], size_t count, DataCompare cmp)
    {
    #ifdef DEBUG	
    	DEBUG_PRINT("%d", count);
    #endif
    	return_val_if_fail(cmp != NULL, RET_FAIL);
     
    	if(count > 1)
    	{
    		quick_sort_impl(arr, 0, count-1, cmp);
    	}
     
    #ifdef DEBUG
    	i = 0;
    #endif
    	return RET_OK;
    }
     
    static void quick_destroy(void *thiz)
    {
    	if(thiz != NULL)
    	{
    		SAFE_FREE(thiz);
    	}
    }
     
    Quick *QuickSortCreate(void)
    {
    	Quick *thiz = malloc(sizeof(Quick));	
    	
    	if(thiz != NULL)
    	{
    		thiz->sorter.sort = quick_sort;
    		thiz->sorter.destroy = quick_destroy;
    	}
     
    #ifdef DEBUG
    	printf("construct quick\n");
    #endif
     
    	return thiz;
    }
    

    cmp.h

    #ifndef __CMP_H__
    #define __CMP_H__
     
    #include "typedef.h"
     
    DECLS_BEGIN 
     
    typedef int (*DataCompare)(int a, int b);
     
    int cmp_int(int a, int b);
    int cmp_int_invert(int a, int b);
     
    DECLS_END
     
    #endif
    

    cmp.c

    #include "cmp.h"
     
    int cmp_int(int a, int b)
    {
    	return a - b;
    }
     
    int cmp_int_invert(int a, int b)
    {
    	return b - a;
    }
    

    test.c

    /*
    	Author : tandesir
    	Time : 2013-03-09
    	借鉴Li XianJing部分代码, 感谢  Li XianJing <xianjimli@hotmail.com>
    	欢迎访问 http://blog.csdn.net/tandesir
    */
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    #include "bubble_sort.h"
    #include "quick_sort.h"
    #include "merge_sort.h"
    #include "sort.h"
    #include "cmp.h"
     
    int main(int arc, char* const argv[])
    {
    	size_t i = 0, n = 0;
    	int arr1[] = {5, 4, 1, 3, 6, 10, 9, 8, 7, 2, 2};
    	
    	//-1-
    	n = LENGTH(arr1);
     
    #ifdef DEBUG
    	DEBUG_PRINT("%d", n);
    #endif
     
    	printf("Before sort:\n");
    	for(i = 0; i < n; i++)
    		printf("%4d", arr1[i]);
    	printf("\nAfter sort:\n");
    	
    	sort((Sort *)QuickSortCreate(), cmp_int_invert, arr1, n);
    	for(i = 0; i < n; i++)
    		printf("%4d", arr1[i]);
    	printf("\n");
    	
    	return 0;
    }
    

    Makefile

    src = typedef.h sort.h bubble_sort.h bubble_sort.c merge_sort.h merge_sort.c quick_sort.h quick_sort.c cmp.h cmp.c test.c
    target = test
    temp = $(wildcard *~ test)
    flags = -DDEBUG
    all:$(src)
    	gcc -g $^ -o $(target)
     
    clean:
    	rm $(temp)
     
    
    展开全文
  • CPP的状态机实现搞的很复杂,C中的实现很简单,一个状态机,有状态变量,和切换状态的流程即可: int state = 0; int switch() {  switch(state){  case 0: state = 1;break

    http://blog.csdn.net/derek_yi/article/details/8576176

    CPP的状态机实现搞的很复杂,C中的实现很简单,一个状态机,有状态变量,和切换状态的流程即可:


    int state = 0;


    int switch()

    {

         switch(state){

             case 0: state = 1;break;

             case 1: state = 2;break;

            case 2: state = 0;break;

        }

    }

    或者:

    int switch_by_msg(int msg)

    {

        state = func(msg)

    }



    展开全文
  • 其实说起来很简单,当用fopen打开文件后,在读取和写入之间,要加一句fseek。...原本是只需要读取,用r方式打开文件,然后又需要写入,将打开模式换成r+后,结果写入失败。 或者在写入之后用fgetc来读取字符,结
  • 注意啊,没看下面的文章的要先看看下面的,再看这一篇啊。我们刚才成功从启动层跳转到了内核程序,现在就应该从内核程序执行C语言了。但是,由于现在的CPU处于实模式中,而我们计划使用保护模式,...
  • 利用C语言绘制操作系统图像界面

    万次阅读 2016-09-13 11:39:04
    那么怎么表现C语言的强大功能呢,如果还只是一味的在界面上输出几行字符,那太没意思,考虑到,我们的目标是做出像windows那样具备舒心的图像用户界面那样的系统,所以在这一节,我们由字符模式切换入画面模式,初步...
  • c语言mysql api

    2014-12-09 08:42:00
    c语言mysql api 原文:c语言mysql api1.mysql_affected_rows() //返回上次UPDATE、DELETE或INSERT查询更改/删除/插入的行数。2.mysql_autocommit() //切换 autocommit模式,ON/OFF。3.mysq...
  • 标准C语言day02复习:1、常用的Linux命令ls、cd、pwd clear touch cp mv rm cat/more/head/tail mkdir rmdir chmodfind grep ifconfig ping whoami man sudoftp telnet ssh tar2...三大模式:正常、插入、行底切换方...
  • 五子棋: 需要的数据: ...4、切换角色 } 第一种(移动光标输入坐标): #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <getch.h> // 棋盘 char
  • 标准C语言day02

    2020-07-08 20:56:08
    标准C语言day02 复习: 1、常用的Linux命令 ls、cd、pwd clear touch cp mv rm cat/more/head/tail mkdir rmdir chmod find grep ifconfig ping whoami man sudo ftp telnet ssh tar 2、vim文本编辑器 vi是系统自带...
  • 标准c语言02

    2020-10-14 10:32:44
    复习: 1、Linux常用的命令 ls cd pwd clear touch mv cp cat/head/tail/more mkdir rmdir chomd rm ...切换方法:Esc i : 正常模式下的操作: 光标的移动:gg G nG vim file.c +n 删除代码: dd x dw\de ndd d$ d^ dgg
  • 在linux中编写c语言代码方案9、测试 运行Make命令进行编译。然后运行ex2-2程序 2.8 使用gdb调试程序 2.8.1 初次使用gdb 2.8.2 gdb的基本命令 2.8.3 gdb的调用 2.8.4 gdb运行模式的选择 在实际的开发过程中,程序除了...
  • 在deepin 中编译c语言程序,用到vim的基本操作,例如:i切换到可以插入的模式,退出和保存的命令是: :wq,Linux的基本操作,例如:sudo apt-get install build-essential 用来安装build-essential,build-essential...
  • C语言学习day02

    2020-10-13 20:16:34
    复习: 1.Linux 常用命令 is cd pwd clear touch mv cp cat/head/tail/more mkdir chomd rm find grep ...切换方法:ESC i : 正常模式下的操作: 光标的移动:gg G nG vim file.c +n 删除代码: dd x dw/de ndd
  • C语言编写俄罗斯方块

    千次阅读 2011-11-20 11:15:45
    Tc2.0中有两种显示模式,一种是我们所熟知的字符模式,另一种是图形模式。在字符模式下只能显式字符,如ASCII字符。... Tc2.0中用initgraph()函数可以切换到图形模式,用closegraph()可以从图形模式切换回字符模式。
  • C语言MYSQL api归纳

    2019-08-12 17:06:17
    mysql_affected_rows() ...切换 autocommit模式,ON/OFF mysql_change_user() 更改打开连接上的用户和数据库。 mysql_charset_name() 返回用于连接的默认字符集的名称。 mysql_close() 关闭服务器连接。 my...
  • C语言中的段错误

    2010-03-08 14:41:00
    MMU产生一个异常,CPU从用户模式切换到特权模式,跳转到内核代码中执行异常服务程序。 内核把这个异常解释为段错误,把引发异常的进程终止掉。 转载于:...
  • 集成学习环境(C语言)

    2009-07-03 15:16:57
    2提供了总结精辟的C语言概念讲解,能够逐条学习并能随意切换到与概念相关的演示和习题,并能收集以便以后学习。3练习模式使得用户在学习概念时能够随时进行概念相关的练习巩固。练习题目都是可从相关内容概念中进行...
  • vi编辑器和C语言基础

    2018-07-07 17:56:27
    (1)从命令模式切换插入模式: i:光标所在左侧插入 I光标移动到所在行的最左侧 o:光标移动到下一行(新的一行) O:光标移动到上一行(新的一行) a:光标移动到所在行的右侧输入 A:光标移动到所在...
  • 编程高手之路代码集萃C语言编写的俄罗斯方块 Tc2.0中怎么样设置图形显示 Tc2.0中有两种显示模式一种是我们所熟知的字符模式另一种是图形模式在字符模式下只能显式字符如ASCII字符一般是显示25 行每行80个字符程序...
  • 复习: 1、常用的Linux命令 ls、cd、pwd clear touch cp mv rm cat/more/head/tail mkdir rmdir chmod ...切换方法:i Esc : 正常模式下的操作: 光标移动:gg、G、nG、vim file.c +n 删除代码:x、nx、d
  • vi编译器与C语言基础

    2018-07-07 16:56:52
    一、vi编辑器: 三种模式:底行模式 命令模式 插入模式 命令模式: 1、从命令切换插入模式:  i : 光标所在左侧输入 I 光标移动到所在行的最左则  o :光标移动的下一行(新的一行) O:光标移动的上一行(新的...
  • VI编译器和C语言基础

    2018-07-07 17:17:19
    从命令切换到插入模式 i/I:分别从光标左侧输入和光标移动所在行的最左侧输入 o/O:光标移动到下一行和光标移动到上一行(新的一行) a/A:光标移动到所在行的右侧输入和光标移动到所在行的最右侧输入 2....
  • Vi编译器与C语言基础

    2018-07-09 20:02:30
    vi的编辑器: 1、三种模式:底行模式 命令模式 插入模式 命令模式:1、从命令切换插入模式:i : 光标所在左侧输入 I 光标移动到所在行的最左则o :光标移动的下一行(新的一行) O:光标移动的上一行(新的一行)...
  • vi编译器,C语言基础

    2018-07-07 17:26:39
    vi的编辑器: 1、三种模式:底行模式 命令模式 插入模式命令模式: 1、从命令切换插入模式:i:光标所在左侧输入 I:光标所在行的最左侧输入o:光标移动的下一行(新的一行) O:光标所在的行的上一行(新的一...
  • 代码集萃Tc2.0中怎么样设置图形显示? Tc2.0中有两种显示模式,一种是我们所熟知的字符模式,另一种是图形模式。在字符模式下只能显式字符,如ASCII字符。...要想进行图形显示和绘图操作,必须切换到图形模 式下。

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 221
精华内容 88
关键字:

c语言模式切换

c语言 订阅