精华内容
下载资源
问答
  • 编写嵌入式软件代码的10个技巧
    2020-05-29 10:36:18

    代码维护是应用程序开发的重要方面,而为了缩短上市时间,通常会忽略代码维护。对于某些应用程序,这可能不会造成重大问题,因为这些应用程序的寿命很短,或者已部署该应用程序,并且再也不会碰它。

    但是,嵌入式系统应用程序的使用寿命可能长达数十年,这意味着一些早期的错误可能会在以后导致可观的成本。

    在开发可能具有长寿命的嵌入式应用程序时,在设计和实现上都必须考虑维护。以下技巧绝不会构成一个完整列表,但是它们解决了一些常见问题,这些问题可能会使您的应用程序维护者有理由诅咒您的名字,并且不要忘记您可能是其中之一!

    提示1:避免使用汇编代码

    当然,在低端PIC上您别无选择,而在高端ARM上您可能不需要它,但是在这两种极端之间,有很多平台使用汇编代码来实现以下目的:提高性能并减少代码大小。但是,问题在于,简单地选择使用汇编代码可能会使您的项目脱轨,并使您陷入困境。

    尽管汇编代码允许您直接访问机器的功能,但由于难以理解程序中正在发生的事情,因此可以轻易地忽略性能优势。正是出于这个原因,构思了高级语言,例如C和Java。

    由于调试高级语言的安全功能非常容易,因此请在调试时将每条汇编代码都视为可疑的。如果必须使用汇编,请在发表评论时尽量保持谨慎。在C或Java中,注释可以使代码混乱,但是将注释组合在一起可以节省大量时间和挫败感。

    您可以选择注释汇编块,但请确保每个块中的指令不超过5或6条。理想情况下,应该在注释中直接用伪代码拼写所使用的算法(请参阅提示8)。

    提示2:避免注释蠕变

    这是一个通用的编程提示,但是在长寿命应用程序中变得尤为重要的提示“管理您的注释与它们记录的代码的关联。随着代码的更新,注释的迁移非常容易,并且结果很难理解。以下示例说明了随着时间的推移,注释蠕变的发生有多么容易:

    //此函数将两个数字相加并返回结果 #if __DEBUG voidprintNumber(int num){ printf(“ Output:%dn”,num);

    } #万一

    //此函数将两个数字相乘并返回结果 整数乘(整数,整数b){

    返回a * b; }

    int add(int a,intb){

    #if __DEBUG //调试输出 printNumber(a + b); #万一 返回a + b; }

    请注意,功能“添加”的注释位于列表的顶部,而实际功能则位于下方。如果注释和函数之间存在空格,则可能会超时发生。

    可能的原因是在’add’及其注释描述之间添加了printNumber函数。后来,有人看到有一个加法函数,并且在其上加上multiplenext似乎是合乎逻辑的”,注释的蠕变导致代码内的文档脱节。要解决此问题,请尝试将代码保留在其文档的功能内,或通过在注释上方和下方插入行来使注释块非常明显。

    提示3:不要过早优化。

    编程的主要缺点之一是过早的优化。但是,由于时间限制,草率的编码或过分热心的工程师,该规则在实践中经常被打破。您编写的任何程序都应尽可能简单地开始,并且仍然提供所需的功能。“如果需要性能,请尝试简单地实现该程序,即使它与性能不匹配。

    一旦测试并调试了完整的单元(它是大型系统的编程器或组件),然后回去进行优化。危险地优化代码会导致维护噩梦,因为优化后的代码通常较难理解,并且您可能无法理解您需要的性能结果。理想情况下,使用探查器(例如与GCC一起使用的gprof或Intel的VTune)来查看瓶颈所在,并专注于这些领域-真正缓慢的事情可能会让您感到惊讶。

    提示4:ISR应该很简单

    出于性能和维护方面的考虑,中断服务例程(ISR)应该尽可能简单。作为异步性质的ISR本质上比“常规”程序代码更难调试,因此将其责任降到最低对于您的应用程序的总体可维护性很重要。尝试将所有数据处理移出ISR并移至主程序中,然后ISR仅负责获取数据(例如,从硬件中获取)并将其放置在缓冲区中以备后用。可以使用一个简单的标志来向主程序发出信号,通知有要处理的数据。

    提示5:将调试代码保留在源文件中

    在开发过程中,您可能会添加大量旨在调试“详细输出,声明,LED闪烁等”的代码。当项目结束时,可能很想删除其中的这些部分。代码以清理整个应用程序,尤其是在随意添加调试代码的情况下。

    尽管清理应用程序是一个崇高的追求,但是删除调试代码会在以后产生问题。任何试图维护该代码的人都可能会复制原始开发中创建的许多步骤,“如果代码已经存在,则维护变得非常容易。如果需要在生产版本中删除代码,请使用条件编译或将调试代码放在中央模块或库中,不要将其链接到生产版本中。应用程序的初始开发应包括编写文档和清理调试代码的时间;花费的额外时间将是值得的。

    技巧6:为系统调用编写包装器

    尝试通过接口将低级I / O例程与高级程序逻辑分开,因为通过单片开发可以使程序难以管理。将应用程序的所有功能放到几个大功能中会使代码难以理解,并且更难更新和调试。对于硬件接口尤其如此。您可能可以直接访问硬件寄存器或I / O,甚至可以访问平台供应商提供的API,但是有很多动机来创建自己的“包装程序”接口。

    您通常无法控制硬件的功能,并且如果将来将来必须更改平台,则在应用程序中使用特定于硬件的代码(API或直接操作,这无关紧要)将使移植更加困难。

    如果您创建自己的包装器接口,就像创建为硬件API定义的宏一样简单,则代码可以是一致的,并且移植所需的所有更新都将位于集中位置。

    提示7:仅分解功能

    嵌入式应用程序将与PC应用程序不同,因为许多功能将专用于您正在使用的硬件。不建议将功能单元尽可能地拆分为最小–将单个作用域(功能)中的功能调用数保持在5或6以下,并使硬件的功能单元与软件中的功能单元相对应。

    进一步分解程序将创建调用图的蜘蛛网,从而使调试和理解变得困难。

    提示8:文档

    保留所有文档以及代码,理想情况下,还应保留硬件副本。在记录应用程序时,请尝试将尽可能多的设计和应用程序模型直接放入源代码中。如果必须将其分开,则将其作为巨大的注释放入源文件中,并将其链接到程序中。

    至少,如果您使用版本控制系统(例如CVS或Microsoft Source Safe),则将文档与源代码检查到同一目录中-如果不与源代码一起放置,则丢失文档确实很容易。

    理想情况下,将所有文档和源文件放在CD(或您选择的便携式存储设备)上,将其与使用的硬件和开发工具一起密封在袋子中,然后将其放在安全的地方“您的后继者将感谢您。

    提示9:不要机灵!

    类似于过早的优化,聪明的编码会导致麻烦。由于C和C ++仍然是嵌入式世界中的主导语言,因此有很多方法可以解决一个问题。模板,继承,goto,三元运算符(“?”),列表会不断出现。

    真正聪明的程序员可以提出使用这些工具解决问题的极其紧凑和优雅的方法。问题是通常只有程序员才能理解聪明的解决方案(以后可能会忘记它是如何工作的)。

    唯一的解决方案是例如避免聪明,并尽量减少使用深奥的语言功能”,例如,不要依赖C语句中的短路评估,也不要使用三元运算符进行程序控制(使用if语句代替)。

    提示10:将所有定义放在一个地方

    如果您有很多常量定义或条件定义,请将它们放在中央位置。这可能是单个文件或源代码目录,但是如果将定义深埋在实现中,它会再次咬住您。

    更多相关内容
  • 一种从源代码自动生成伪代码的工具。 安装 使用Docker 泊坞窗就是您所需要的。 docker attach `docker run -itd delihiros/pseudogen` /# cd pseudogen/data /# ../run-pseudogen.sh -f tune/travatar.ini 要求 ...
  • 1.sfc-v2-3 这个流程图工具可以直接输出伪代码,画程序逻辑最好 sfc-v2-3.exe 是我汉化的版本 eXeBat.exe 是汉化工具(发现汉化不完全的地方可以继续汉化) 基本够用了 2.玲珑流程图 是一个简易的基本流程图工具 以上...
  • 这里写目录标题Word文档添加伪代码(Aurora插件) Word文档添加伪代码(Aurora插件) 1.先下载MiKTex 官网地址 https://miktex.org/download 安装步骤可以看官网的指导 https://miktex.org/howto/install-miktex 2....

    本博客仅作个人学习记录,也希望本博客对大家也有所帮助。

    一、Word文档添加伪代码(Aurora插件)

    1.先下载MiKTex
    官网地址 https://miktex.org/download
    安装步骤可以看官网的指导 https://miktex.org/howto/install-miktex

    2.下载Aurora插件

    链接:https://pan.baidu.com/s/1OqJlfOWsPWmBzDErg53f5A
    提取码:86w9
      这个插件博主也是从网上找的,网上应该大部分的应该和这个一样。在office 2016版 64位亲测有效。
      安装过程中唯一需要注意的就是不要选择Micro MiKTex,因为我们上一步已经安装好MiKTex。如果在安装Aurora之前没有安装MiKTex,而是选择在这里安装,会报错的。
    在这里插入图片描述
      一些博客说安装好Aurora需要Aurora.2.x.Keygen.exe进行注册,但在博主实际操作过程中发现注册时会报错,但是Aurora还是可以正常使用,所以私认为可以跳过注册这一步。

    3.配置环境
    这部分操作博主是参考该博客https://blog.csdn.net/jucksu/article/details/116307244#comments_16316252
      这时打开word的对象里应该就会有显示Aurora了
    在这里插入图片描述
      进入Aurora——》点击Propertises——》点击Paths,然后根据你安装MiKTex的路径来配置环境。
    在这里插入图片描述
    4.开始编写伪代码
      由于博主也是小白一名,所以也是参考了很多博客,下面给出亲测有效的博客
    1.https://blog.csdn.net/LIN_SHUQING/article/details/78896623?utm_source=blogxgwz1
    2.https://blog.csdn.net/smileyan9/article/details/113896811?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-2&spm=1001.2101.3001.4242
    3.https://blog.csdn.net/jucksu/article/details/116307244#comments_16316252
    当然,特殊符号的格式也是不能少的
    1.https://blog.csdn.net/ying_xu/article/details/51240291

      添加好package,写好代码,点击refresh,如果底部显示done,那么word里面就会显示整齐美观的伪代码了。
    在这里插入图片描述
    在这里插入图片描述

    二、Word文档添加数学公式(AxMath插件)

    下载地址:https://www.amyxun.com/
      安装过程就像普通软件一样,没有坑,这里就不详细说了。
      安装好后会显示在word的操作栏,使用起来还是挺方便的,没有什么特别的语法,非常适合小白。
    在这里插入图片描述

    展开全文
  • 作者在github中提到学习红黑树时,想要画一个流程图让笔记更加直观,但是画流程图比较麻烦,于是作者想到写一个小工具,可以通过输入很简单的伪代码,得到一个纯字符串的流程图。 代码效果如下: 伪代码: 流程图 ...

    公众号关注 “ML_NLP”

    设为 “星标”,重磅干货,第一时间送达!

    这是阿三的第 56期分享

    作者 | 阿三

    首发 | 程序员遇见GitHub

    大家好,我是阿三,今天给大家带来的是一个很有意思的小项目,能够输入伪代码自动生成流程图。

    一.FlowChar

    作者在github中提到学习红黑树时,想要画一个流程图让笔记更加直观,但是画流程图比较麻烦,于是作者想到写一个小工具,可以通过输入很简单的伪代码,得到一个纯字符串的流程图。

    代码效果如下:

    伪代码:

    流程图

    是不是一个很有意思的项目? 大家赶紧clone尝试一下吧~

    项目地址:https://github.com/Gusabary/FlowChar


    重磅!忆臻自然语言处理-Pytorch交流群已成立
    我们为大家整理了Pytorch中文版官方教程,
    添加小助手领取,还可以进入官方交流群!
    注意:请大家添加时修改备注为 [学校/公司 + 姓名 + 方向]
    例如 —— 哈工大+张三+对话系统。
    号主,微商请自觉绕道。谢谢!

    Alt

    Alt

    推荐阅读:
    NLP学习(一)——初识NER
    NLP学习(二)——NER综述
    Softmax函数与交叉熵

    在这里插入图片描述

    展开全文
  •  下面将利用伪代码编写MVC创建流程,其中(1)到(6)是编写MVC软件框架的基本步骤,第(7)~第(10)步骤是可选的,可以提高灵活性,适合用于打造高度灵活的应用程序或者应用程序框架。 (1)将人机交互与核心...

    上一篇博文简要概述了MVC的基本框架流程 https://blog.csdn.net/yangfahe1/article/details/84075227

           下面将利用伪代码编写MVC创建流程,其中(1)到(6)是编写MVC软件框架的基本步骤,第(7)~第(10)步骤是可选的,可以提高灵活性,适合用于打造高度灵活的应用程序或者应用程序框架。

    (1)将人机交互与核心功能分离。分析应用领域,将核心功能与所需的输入输出行为进行分离。设计应用程序的模型组件,使其封装所需的核心数据和功能,并提供函数用于访问要显示的数据。确定要通过控制器将模型的那些功能暴露给客户,进而给模型添加相应的接口。

           在我们的实例中,模型在两个等长的列表中分别存储选举人和得票数,并提供两个返回迭代器的方法,用于访问这些列表。该模型还提供了修改投票数据的接口。

    class Model
    {
        List<long> votes;
        List<string> parties;
    public:
        
        Model(List<string> partyNames);
        
        void clearVotes();
        
        void changeVotes(string party, long vote);
        
        Iterator<long> makeVoteIterator()
        {
            return Iterator<long>(votes);
        }
        
        Iterator<string> makePartyIterator()
        {
            return Iterator<string>(partyNames);
        }
        
        //未完待续
    };

    (2)实现变更传播机制。为此,可采用Publisher-Subscriber设计模式,并让模型充当发布者(publisher)。在模型中添加一个用来存储观察对象的容器,并提供让视图和控制器能够向变更传播机制注册和卸载的过程。模型的通知过程调用所有观察对象的更新过程。模型中每个修改模型状态的过程都在执行修改后调用通知过程。

           根据C++使用指南,应定义一个提供更新接口的抽象类Observer,并让视图和控制器都继承Observe。对第(1)步的Model类进行扩展,使其包含一个观察者的引用集合以及让观察者能够注册和卸载attach()和detach()接口。接口notify()被修改模型状态的接口调用。

    class Observer
    {
    public:

        /*接口 用来更新视图和控制器
        */
        virtual void update();
    }

    class Model
    {
        //待续
    public:
        void attach(Observer *obs)
        {
            registry.add(s);
        }
        void detach(Observer *obs)
        {
            registry.remove(obs);
        }
    protected:
        virtual void notify();
    private:
        List<Observer *> registry;
    };
           我们的notify()接口实现了遍历所有已经注册的Observe对象并调用其更新接口。由于存储注册对象的List仅供内部使用,因此我们没有提供创建注册对象的迭代器对象。
    void Model::notify()
    {
        Iterator<Observer *>iter(registry);
        while(iter.next()) iter.curr()->update();
    }
    接口changeVote和clearVotes在修改投票数据后调用notify();

    (3)设计并实现视图。设计每个视图的外观,规范并实现在屏幕上显示视图的绘图(draw)过程。这个过程首先从模型那里获取要显示的数据,余下的部分与用户界面平台无关,如调用绘制线或渲染文本的过程。

           实现反映模型变化的更新过程,为此最简单的方法是调用绘图过程,让它取回视图所需的数据。对于需要频繁更新的复杂视图,这种简单的更新可能效率低下。在这种情况下,有多种优化策略可供使用。一种方法是给更新过程提供额外的参数,让视图能够判断是否需要重绘;另一种解决方案,在后面还有要求重绘视图的事件时,不马上绘制视图,而等到没有未处理的事件时再重绘视图。

           除了更新和绘图过程外,每个视图都需要包含一个初始化过程。初始化过程注册模型的变更传播机制,并关联到控制器,如第(5)步所示。初始化控制器后,视图将自己显示到屏幕上。平台或控制器可能要求视图提供其他功能,如调整试图窗口大小的过程。

            在投票系统中,我们定义了基类View,所有视图都从它派生而来。这个基类包含两个成员变量(用于存储于视图相关联的模型和控制器),并提供了获取它们的接口。View的构造函数通过注册变更传播机制来与模型建立关系,而析构函数通过卸载来中断这种关系。View还提供了一个update(),这个方法很简单,未经优化。
    class View
    : public Observer
    {
    public:
        View(Model *m)
        : model(m)
        , controller(0)
        {
            model->attach(this);
        }
        virtual ~View()
        {
            model->detach(this);
        }
        virtual void update()
        {
            this->draw();
        }
        virtual void initialize();
        virtual void draw();
        //未完待续
        Model *getModel()
        {
            return model;
        }
        Controller *getController()
        {
            return controller;
        }
    protected:
        Model *model;
        Controller *controller;
    };


    class BarChartView
        : public View
    {
    public:
        BarChartView(Model *m)
            : View(m)
            {
            }
        virtual void draw();
    }

    void BarChartView::draw()
    {
        Iterator<string> party = model->makePartyIterator();
        Iterator<long> vote = model->makeVoteIterator();
        List<long> dl;            //存储充满整个屏幕时的缩放比例
        long max = 1;
        while(vote.next())
        {
            if(vote.curr() > max) max = vote.curr();
        }
        vote.reset();
        while(vote.next())
        {
            dl.append((MAXBARSIZE * vote.curr()) / max);
        }
        vote = dl;
        vote.reset();
        while(party.next() && vote.next())
        {
            //绘制文本
            //绘制矩形
        }
    }

    类BarChartview的定义演示了该系统的一个具体视图,它重写了方法draw(),使其使用柱状显示投票数据。

    (4)设计并实现控制器。对于应用程序的每个视图,确定系统如何响应用户操作。我们规定底层平图以事件的方法传递用户执行的每项操作。控制器接受这些事件,并使用一个专用过程进行解读。对于重要的控制起来说,这种解读依赖于模型的状态。

           初始化控制器时应关联到模型和视图,并启动事件处理。如何完成这些工作取决去用户界面平台,例如,控制器可向窗口系统注册,并将事件处理过程指定为回调函数。

            在我们的示例中,大部分视图都用于显示结果,不需要处理事件,因此我们定义了基类Controller,它包含了一个空的handleEvent()接口。其中的构造函数将控制其关联到模型,而析构函数断开关联。

    class Controller
        : public Observer
    {
    public:
        virtual void handleEvent(Event *)
        {
        }
        
        Controller(View *v)
            : view(v)
        {
            model = view->getModel();
            model->attach(this);
        }
        virtual ~Controller()
        {
            model->detach(this);
        }
        virtual void update()
        {
        }
    protected:
        Model *model;
        View *view;
    }

    这里没有提供独立的控制器初始化方法,因为已经在构造函数中关联到了视图和模型。

    调用功能核心导致控制器与模型联系紧密,因为控制器依赖于应用程序特定的模型接口。如果你打算修改功能或希望控制器可重用,必须让控制器独立于特定的接口,为此可使用Command Processor设计模式。这种情况下,MVC模型将扮演Command Processor供应者(supplier)角色;在模型和控制器之间新增了命令类和命令处理器组件;而MVC控制器将扮演Command Processor控制器角色。

    (5)设计并实现视图-控制器关系。视图通常在初始化期间创建与之相关联的控制器。创建视图和控制器类层次结构遵循Factory Method设计模式,在视图类中定义接口makeController()。如果视图所需的控制器与其超类所需的控制器不同,就必须重写工厂接口makeController()。

           在下面的C++示例代码中,基类View实现了接口initialize(),而这个方法调用了工厂接口makeController()。不能在View类的构造函数中调用makeController(),否则将不会调用子类中重写的makeController()。在View的子类中,只有TableView需要的特殊控制器,因此他重写了makeController(),使其返回一个可接受用户输入的TableController。


    class View
        : public Observer
    {
    public:
        virtual void initialize()
        {
            controller = makeController();
        }
        virtual Controller *makeController()
        {
            return new Controller(this);
        }
    };

    class TableController
        : public Controller
    {
    public:
        TableController(TableView *tv)
            : Controller(tv)
        {
        }
        virtual void handleEvent(Event *e)
        {
            //释放事件e
            //如更新等票数
            if(vote && party)
            {
                model->changeVotes(party, vote);
            }
        }
    };

    class TableView
        : public View
    {
    public:
        TableView(Model *m)
            : model(m)
        {
        }
        virtual void draw();
        virtual Controller *makeController()
        {
            return new TableController(this);
        }
    };

    (6)实现搭建MVC的代码。搭建MVC的代码首先初始化模型,在创建并初始化视图。完成初始化后,启动事件处理,这通常是一个循环,也可能是一个包含循环的过程。由于模型应独立于视图和控制器,这种搭建代码应位于模型外部,如主程序中。

           在下面的简单代码示例中,函数main()初始化模型和多个视图。事件处理将事件交给表视图的控制器,让用户能够输入和修改投票数据。
    main()
    {
        List<string> partys;
        partys.append("black");
        partys.append("red  ");
        partys.append("oth.  ");
        partys.append("blue ");
        partys.append("green");
        Model m(parties);
        //初始化视图
        TableView *vl = new TableView(&m);
        vl->initialize();
        BarChartView *v2 = new BarChartView(&m);
        v2->initialize();
        //开始处理事件
    }
    (7)动态创建视图。如果应用程序允许动态地打开和关闭视图,最好提供一个负责对打开的试图进行管理的组件。该组件还可以负责在最后一个试图关闭后保存数据和终止应用程序。要实现这种管理组件可以使用View Handle设计模式。

    (8)“可插入式”的控制器。通过将控制方面与视图分离,可将试图与不同的控制器组合。可以利用这种灵活性实现不同的运行模式(如提供新用户和专家级用户使用的模式),还可以使用忽略所有输入的控制器来构造只读视图。这种灵活性的另一种用途是,集成新的输入和输出设备。例如:提供残障人士使用的眼睛跟踪设备的控制器可利用既有模型和视图的功能,很容易集成到系统中。

           在我们示例代码中,只有TableView类支持多种控制器,其默认控制器TableController让用户能够输入投票数据。如果TableView只用来显示信息,那就可以给它配置一个忽略所有用户输入的控制。下面的代码演示了如果更换控制器。请注意,setController返回以前使用的控制器对象,这里不再需要改控制器对象,因此马上将它删除掉。

    class View
        : public Observer
    {
    public:
        virtual Controller *setController(Controller *ctrll);
    };

    main()
    {
        //*****
        //更换控制器
        delete v1->setController(new Controller(v1));
        //*****
        //打开另一个只读的视图
        TableView *v3 = new TableView(&m);
        v3->initialize();
        delete v3-setController(new Controller(v3));
        //继续事件处理
        //*****
    };

    (9)创建视图和创建控制器层次结构。基于MVC的框架实现了可重用的视图类和控制器类,其中的视图类通常表示常用的用户界面元素,如按钮、菜单和文本编辑器。这样,创建应用程序的用户界面时,主要工作是组合预先定义好的试图对象。可使用Composite模式来创建层次型组合视图。如果有多个视图处于活动状态,这时可能同时有多个控制器对事件感兴趣。例如,对话框中的按钮响应鼠标单击,但不响应键盘输入。如果该对话框还包含了一个文本框,键盘输入将被发送这个文本框的控制器。事件按指定顺序依次传递给所有活动控制器的事件处理过程。要管理这种事件委托,可以使用Chain of Responsibility模式。如果正确地设置了责任链,控制器将把未处理的事件传递给夫视图或者兄弟视图的控制器。

    (10)进一步降低系统的依赖性。打造框架需精心制作一系列视图和控制器类,代价不菲。因此,你可能希望这些类独立与平台,有些系统就是这样做得。为此可使用Bridge模式在系统和平台之间再添加一层:让视图使用表示窗口display类,让控制器使用负责处理事件的sensor类。

           抽象类display定义了用于创建窗口、绘制线条和文本、修改鼠标外观等操作的方法;抽象类sensor定义了独立于平台的事件,每个sensor子类都将系统特定的市价映射到独立于平台的事件。为支持的每个平台实现display和sensor子类。他们封装了与系统相关的细节。

           抽象类display和sensor的设计关系重大,因为他们将影响最终代码效率,还将影响在不同平台上可实现的具体类的效率。一种方法是抽象类sensor和display只定义所有用户界面平台都提供的基本功能。另一个极端是让display和sensor提供更高级的抽象,这种类使用的用户界面平台原生代码更多,移至工作量更大。采用第一种方法时,应用程序的外观在不同平台上看起来类似;采用第二种方法时,应用程序更严格地遵循了平台特定的指导原则。

    展开全文
  • 文章原创工具制作

    2020-12-23 11:59:04
    文章原创工具制作什么是原创?简单点来说,就是将原创文章进行加工后得到一篇意思和原文章相近的原创文章。常见于网站发文,自媒体创作,媒体搬运等。因为个体用户创作经历有限,而为了达到目的需要采取原创...
  • 外挂下载小偷程序源码,PHP静态版,自己制作的,真实演示站wg.xgy.in/ 自己第一次制作,希望大家给点意见 先找到wz_data里wz_config.php 用记事本打开<?php$wz_web='\u5c0f\u5c0f\u5916\u6302'; 这里改成你...
  • 安装方法使用pip安装命令:pipinstall-UwxPython2、请求,re,hashlib,时间让我们开始吧:第一步是创建具有以下效果的界面:创建接口的代码:App = wx.app () win = wx.frame(无,title = "(在此填写软件标题)"。...
  • 石青原创工具

    2019-03-05 14:04:04
    原创工具是一款SEO高级工具,专门用来生成原创及原创文章,使用原创工具可以制作出互联网上具有唯一性的原创文章,支持中文和英文原创。 本软件是一款免费的专业原创文章生成器,其专门针对百度和google...
  • C#开发收银系统简单收银源代码.
  • 安装方法使用pip安装命令:pipinstall-UwxPython2、请求,re,hashlib,时间让我们开始吧:第一步是创建具有以下效果的界面:创建接口的代码:App = wx.app () win = wx.frame(无,title = "(在此填写软件标题)"。...
  • Python代码生成器(代码生成工具)是一款很优秀好用的为新手制作代码生成助手。小编带来的这款Python代码生成器功能强大,操作简单,使用后可以帮助用户更轻松便捷的生成Python代码,非常方便实用。其内置了大量的...
  • 软件制作加密狗

    千次阅读 2019-09-20 05:17:52
    这段用于翻译伪代码并负责具体执行的子程序就叫作虚拟机VM(好似一个抽象的CPU)。它以一个函数的形式存在,函数的参数就是字节码的内存地址。由于虚拟机代码和虚拟机CPU的实现可以做到每次都是随机设计和随机执行...
  • 使用加密狗进行程序的加密保护是非常成熟的加密方案。目前市面上比较常见的加密锁:深思的精锐5,威步,safenet。国内比较老牌的加密锁公司是深思,深思的锁从...3、 使用控制锁和写锁工具制作配套使用的用户锁。4、...
  • 使用绘图软件制作和更新图表很慢 它使用转换图表的markdown代码块。 Graphviz的伪代码受此启发。 伪代码被转换为点文件,然后Graphviz的dot程序将其转换为矢量图像。 系统要求 Ruby 1.9.2及更高版本 Graphviz(经点...
  • 图像分割标签制作软件

    千次阅读 2019-01-19 11:02:55
    只能标注两类,可以撤销10次,可以设置工作半径和颜色阈值,用了简单的颜色距离判断,当然你可以在我的基础上更改代码,使用区域生长法等其他方法。 本软件对于块分区明显的图片比较容易标注,但对于我自己项目的...
  • 【转】给自己的软件制作注册码

    千次阅读 2019-06-17 15:51:37
    转自:http://www.csharpwin.com/csharpspace/2337.shtml 还有就是:... 从今天起,您开发的的任何软件如果您愿意都可以为之加密--为您的软件制作一款注册机! 当...
  • 有时我还会使用它来为我的应用程序的小部分制作原型,因为Python非常接近伪代码。 这是ESRI用于地理处理任务的脚本系统。 我们使用它来维护我们的GIS并回答用户的地理问题。 为了避免用C ++编写文本处理或任务自动化...
  • 添加永久root是无意间看到rom制作大师实验得来的,本人也是小白一个,连个技术宅都算不上,希望大神们不要喷我。最主要的是本贴只作为交流使用,不是为了推广获取利益啥的,如果涉及侵权请告知我,立刻删帖。教程...
  • matlab求累加代码斯滕利卜 Stefan Engblom的Matlab库-日常使用的软件包。 stenglib的许可声明 ...对于为()频谱方法,FEM编写代码的人员,或者经常使用多维数组或张量表示法的人员,该软件包很有用
  • 人工智能原创工具(AI原创)

    千次阅读 2020-12-17 15:03:08
    欢迎提交人工智能(AI)、自然语言处理(NLP)、大数据(big data)、机器学习(ML)、数据挖掘(DM)、知识图谱、智能硬件、工业互联网、工业机器人、...方案、开放平台产品、ai算法、ai模型、源码、sdk\模块、软件系统、...
  • 我有一些好消息要告诉你,软件开发的未来已经到来!好吧,准确地说,软件开发未来可能发生的下一件大事就在这里……又一次。 随处可用,只需添加 RAM内存 我对Eiection电子这个名字有这种心理障碍。我不完全确定为...
  • 1.1 人类制作软件已经有多久的历史了 1 1.2 软件开发是一种什么样的活动 2 1.3 软件开发缺少了什么 4 1.4 谁说了算 6 1.5 独特性 6 第2章 从衣橱到探月 8 2.1 软件开发中的模式和专业化 8 2.2 Andrea的衣橱 9...
  • --- 修改 aireplay-ng 代码,使其支持中文SSID的连接(aireplay-ng -1) --- iw 升级至 0.9.18 --- 增加 cowpatty.tcz(Ver:4.6),可用来破解 WPA/WPA2 握手包 --- 增加 tcpdump.tcz,wpa_supplicant.tcz,wl....
  • Tooltip是个应用非常广泛的东西,指的是鼠标移到图片或者按钮等元素上时弹出的一个用于描述图片或者说明按钮功能的提示文本,就比如下图的这个东西。html其实也有内置的“Tooltip”,...所以我们还是自己制作这样...
  • 文章目录一、软件项目开发流程逻辑图开发流程需求分析概要设计详细设计编码测试软件交付验收维护软件维护软件升级软件项目开发流程以及人员职责软件工程中五种常用的软件开发模型整理软件系统开发流程七大详细步骤...
  • seo原创生成器,织梦原创插件,英文原创哪里有只要你知道来怎么做中文的原源创,做好了,...·火车头原创插件api接口代码怎么用原创插件来api目前用过自就小发猫AI+的靠谱,一个基于人工智能的原创...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,118
精华内容 4,847
关键字:

伪代码制作软件