精华内容
下载资源
问答
  • strcpy_s函数

    万次阅读 多人点赞 2016-05-06 17:54:13
    C++标准中使用了更为安全的strcpy_s函数,让人蛋疼的是为毛不直接更新strcpy函数,非要加_s,可能是为了兼顾旧的工程。不管怎样该用还得用 strcpy_s包含在头文件中,亲测也可,反正就改个名,其定义如下: _...

    C++标准中使用了更为安全的strcpy_s函数,让人蛋疼的是为毛不直接更新strcpy函数,非要加_s,可能是为了兼顾旧的工程。不管怎样该用还得用

    strcpy_s包含在头文件<string.h>中,亲测<cstring>也可,反正就改个名,其定义如下:

     _ACRTIMP errno_t __cdecl strcpy_s(
            _Out_writes_z_(_SizeInBytes) char*       _Destination,
            _In_                         rsize_t     _SizeInBytes,
            _In_z_                       char const* _Source
            );

    第一个参数:目标字符串指针

    第二个参数:字符串长度,可使用strlen()函数直接求出,切记,在使用strlen()求出字符串长度时,勿忘+1

    第三个参数:输入字符串指针

    实例如下:

    StringBad::StringBad(const char * s)
    {
    	len = strlen(s);	//计算字符串长度
    	str = new char[len + 1];	//分配存储空间
    	strcpy_s(str, len+1,s);	//将s中字符串复制到str,最后一个空间为'\0'结束符
    	num_strings++;
    	cout << num_strings << ": \"" << str << "\" object created" << endl;
    }


    展开全文
  • C++中strncpy函数和strncpy_s函数的使用及注意事项

    万次阅读 多人点赞 2018-09-17 17:49:24
    在掌握了strcpy函数和strcpy_s函数之后,我们不可避免地会谈到strncpy函数和strncpy_s函数,其实这四个函数的功能几乎一致,就是对两个字符串数组进行复制和赋值,但是具体实现有一点点区别。 首先来说一下strncpy...

    在掌握了strcpy函数和strcpy_s函数之后,我们不可避免地会谈到strncpy函数和strncpy_s函数,其实这四个函数的功能几乎一致,就是对两个字符串数组进行复制和赋值,但是具体实现有一点点区别。

    首先来说一下strncpy函数。该函数依然还是存在于标准名称空间std内,出现的目的很简单,对于strcpy函数,只能将两个字符串进行完整的复制和赋值,这里就会产生一个实际应用时的问题,如果我们只需要复制某个字符串的前几个字符呢?

    其实对于这个问题,我们首先可能会想到使用strcpy_s函数,因为该函数有一个长度,我们在安全函数的基础上将长度表示成我们希望复制的长度,但是实际运行时这样写会出现问题,举例如下:

    // strncpy_s.cpp
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <cstring>
    
    int main()
    {
        using namespace std;
    
        char str1[100];
        char str2[5];
        cout << "Please enter your favorite lines (Warning: No longer than 100!):\n";
        cin.getline(str1, 100);
        strcpy_s(str2, 5, str1);
        cout << "str1 is " << endl << str1 << endl;
        cout << "while str2 is " << endl << str2 << endl;
    
        system("pause");
        return 0;
    }

    对于以上代码,运行结果如下图所示:

    由运行结果可知,Buffer is too small,即告诉我们安全函数之所以安全,就是不可以这样操作,不可以把一个长度超过x的字符串数组复制并赋值给长度为x的字符串数组

    于是由此,strncpy函数应运而生。

    由于我使用的IDE是Visual Studio 2017,所以只要使用strncpy函数就会报错并提示使用安全版本,所以这里对于基础版本的strncpy函数只做理论介绍。

    strncpy函数的原型如下所示:

    char * strncpy(char * str2, char * str1, int size);

    功能就是复制str1中的内容,赋进str2中,复制的长度由size的数值决定,size的类型不一定是Int,但我们一般来说遇到的长度都是整数,所以这里用int比较简单。

    比如说以下语句:

    char str1[5] = "abcd";
    char str2[10] = "leonardo";
    strncpy(str2, str1, 3);

    因为IDE不支持基础版本函数,所以我没法看运行结果,就文字描述一下。

    以上代码运行之后,strncpy函数会将str1的前3个字符的内容复制,赋到str2里,于是str2就变成了‘a’'b'‘c’。

    那么对于strncpy_s函数,原型如下所示:

    strncpy_s(char * str2, int size2, char * str1, int size1);

    这里多了一个长度,就是被复制的str2的长度,我们可以用sizeof(str2)来表示这个长度。

    那么改成使用strncpy_s函数之后,上面的代码就可以正确运行了。

    // strncpy_s.cpp
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <cstring>
    
    int main()
    {
        using namespace std;
    
        char str1[5] = "abcd";
        char str2[10] = "leonardo";
        cout << "str1 is " << endl << str1 << endl;
        cout << "str2 is " << endl << str2 << endl;
        strncpy_s(str2, sizeof(str2), str1, 3);
        cout << "after the copy str2 is " << endl << str2 << endl;
    
        system("pause");
        return 0;
    }
    

    运行结果如下图所示:

    于是回到我们最早那个代码,稍作修改使用strncpy_s函数,修改后代码如下:

    // strncpy_s.cpp
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <cstring>
    
    int main()
    {
        using namespace std;
    
        char str1[5] = "abcd";
        char str2[10] = "leonardo";
        cout << "str1 is " << endl << str1 << endl;
        cout << "str2 is " << endl << str2 << endl;
        strncpy_s(str2, sizeof(str2), str1, 3);
        cout << "after the copy str2 is " << endl << str2 << endl;
    
        char str3[100];
        char str4[10];
        cout << "Please enter your favorite lines (Warning: No longer than 100!):\n";
        cin.getline(str3, 100);
        strncpy_s(str4, sizeof(str4), str3, 10);
        cout << "str3 is " << endl << str3 << endl;
        cout << "while str4 is " << endl << str4 << endl;
    
        system("pause");
        return 0;
    }

    对于str3,它本身的长度是100,用户输入可以输入小于100的任意长度的字符,但是str4没有这么长,它的长度只有10,所以只能把str3的前10个字符内容复制给str3。

    但是上面这样写还是有点问题,那就是字符串数组的最后一位一定是‘\0',如果直接复制10位,无法赋进str4,因为这样就把它最后一位的'\0'给覆盖了,就会报错,所以我们修改上面代码的strncpy_s()函数那里,改为

    strncpy_s(str4, sizeof(str4), str3, 9);

    这样就正确了。

    运行结果如下图所示:

    于是就完成了我们之前所说的,希望只复制某个字符串数组的一部分给另一个字符串数组的功能了。

    其实这个功能还可以延伸,假如说,我们希望复制的字段并不是原字符串最开始的字符怎么办呢,其实也很简单,只需要在strncpy_s函数的第三个参数处进行操作就可以了。

    比如说我们希望从第2个字符开始复制,那么第3个参数就由"str3"改写为"str3+1"即可。因为str3是数组,数组名直接使用而不带标号,即是表示地址,所以“str3+1”即是表示str3[1]的地址了,同理"str3+5"即是表示str[5]的地址。

    于是我们把上述程序的第23行,即strncpy_s()函数赋值那一句改成如下所示:

    strncpy_s(str4, sizeof(str4), str3 + 1, 9);

    运行结果如下图:

    从图中可以看出,确实是从第2个字符开始复制的。

    那么接下来我们就要考虑,如果希望复制的不是连续的字符,而是分散的,比如说str3[2],str3[5],str3[8]和str3[9]这种呢?

    这种情况就需要多个strncpy_s语句了,因为每一句只能进行一次复制和赋值,多次才能完成上述任务。

    此时我们就需要去操作第1个参数了,即str4,因为str4也是一个数组名表示地址,所以我们这样分散复制时,后面几次复制就需要从str4的str4[2]开始赋值了。

    我们来看一下完整代码:

    // strncpy_s.cpp
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <cstring>
    
    int main()
    {
        using namespace std;
    
        char str1[5] = "abcd";
        char str2[10] = "leonardo";
        cout << "str1 is " << endl << str1 << endl;
        cout << "str2 is " << endl << str2 << endl;
        strncpy_s(str2, sizeof(str2), str1, 3);
        cout << "after the copy str2 is " << endl << str2 << endl;
        cout << endl;
    
        char str3[100];
        char str4[10];
        cout << "Please enter your favorite lines (Warning: No longer than 100!):\n";
        cin.getline(str3, 100);
        cout << endl;
        strncpy_s(str4, sizeof(str4), str3 + 2, 1);
        strncpy_s(str4 + 1, sizeof(str4) - 1, str3 + 5, 1);
        strncpy_s(str4 + 2, sizeof(str4) - 2, str3 + 8, 2);
        cout << "str3 is " << endl << str3 << endl;
        cout << "while str4 is " << endl << str4 << endl;
    
        system("pause");
        return 0;
    }

    上述代码的第25,26,27三行都是在进行strncpy_s函数的复制,可以看到我们分了3次复制,因为str3[2],str3[5]都只能单独复制,因为不连续,而str3[8]和str3[9]可以联合复制,因为连续。

    上述代码运行结果如下图所示:

    从图中可以看到,str3[2]是‘ ’,str3[5]是'm',str3[8]是'i',str3[9]是's'。

    所以这样我们就完成了分散复制的功能了。

    目前我掌握的有关strncpy函数和strncpy_s函数的使用及注意事项就是这样,以后继续学习遇到新的知识了会持续补充。

    展开全文
  • S函数初识(m文件写成的S函数)

    千次阅读 2016-04-04 14:51:15
    S函数初识(m文件写成的S函数)

    实验环境:

    • matlab2012a

    实用链接(本文档基本和该链接内容一致)

    [新浪博客](‘http://blog.sina.com.cn/s/blog_9d4c04170101azzs.html‘)

    步骤

    • command window中输入open sfuntmpl.m,拷贝到自己的S-function中,按照它的结构进行修改

    • 下面结合sfuntmpl.m中的代码来讲具体的结构:

      switch flag, %判断flag,看当前处于哪个状态
      
      case 0,
      [sys,x0,str,ts]=mdlInitializeSizes;
      // 解释说明
      flag=0表示当前处于初始化状态,此时调用函数mdlInitializeSizes进行初始化,此函数在该文件的第149行定义. 其中的参数sys是一个结构体,它用来设置模块的一些参数,各个参数详细说明如下
      size = simsizes;%用于设置模块参数的结构体用simsizes来生成
      sizes.NumContStates = 0; %模块连续状态变量的个数
      sizes.NumDiscStates = 0; %模块离散状态变量的个数
      sizes.NumOutputs = 0; %模块输出变量的个数
      sizes.NumInputs = 0; %模块输入变量的个数
      sizes.DirFeedthrough = 1; %模块是否存在直接贯通
      sizes.NumSampleTimes = 1; %模块的采样时间个数, 至少是一个
      sys = simsizes(sizes); %设置完后赋给sys输出
      

      举个例子,考虑如下模型:

      dx/dt=fc(t,x,u) 也可以用连续状态方程描述:dx/dt=A*x+B*u

    x(k+1)=fd(t,x,u) 也可以用离散状态方程描述:x(k+1)=H*x(k)+G*u(k)

    y=fo(t,x,u) 也可以用输出状态方程描述:y=C*x+D*u

    设上述模型连续状态变量、离散状态变量、输入变量、输出变量均为1个,我们就只需改上面那一段代码为(一般连续状态与离散状态不会一块用, 我这儿是为了方便说明):

        sizes.NumContStates=1;
        sizes.NumDiscStates=1;
        sizes.NumOutputs=1;
        sizes.NumInputs=1;
    

    其他的可以不变, 继续在mdlInitializeSizes函数中往下看:

        x0 = []; %状态变量设置为空,表示没有状态变量,以我们上面的假设,可改为x0=[0,0](离散和连续的状态变量我们都设它初值为0)
        str = []; %保留参数, 置[]就可以了, 没什么用
        ts = [0 0]; %采样周期设为0表示是连续系统, 如果是离散系统在下面的mdlGetTimeOfNextVarHit函数中具体介绍
        case 1,
        sys=mdlDerivatives(t,x,u);
        //
    

    flag=1表示此时要计算连续状态的微分, 即上面提到的dx/dt=fc(t,x,u)中的dx/dt, 找到193行的函数mdlDerivatives, 如果设置连续状态变量个数为0, 此处只需sys=[]就可以了, 按我们上述讨论的那个模型, 此处改成 sys=fc(t,x(1),u)sys=A*x(1)+B*u, 我们这儿x(1)是连续状态变量, 而x(2)是离散的, 这儿只用到连续的, 此时的输出sys就是微分

        case 2,
        sys=mdlUpdate(t,x,u);
    

    flag=2表示此时要计算下一个离散状态, 即上面提到的x(k+1)=fd(t,x,u), 找到mdlUpdate函数, 它这儿sys=[]表示没有离散状态, 我们这儿可以改成sys=fd(t,x(2),u)sys=H*x(2)+G*u;%sys即为x(k+1)

        case 3,
        sys=mdlOutputs(t,x,u);
    

    flag=3表示此时要计算输出, 即y=fo(t,x,u), 找到218行的mdlOutputs函数. 如果sys=[]表示没有输出, 我们改成sys=fo(t,x,u)sys=C*x+D*u %sys此时为输出y

        case 4,
        sys=mdlGetTimeOfNextVarHit(t,x,u);
    

    flag=4表示此时要计算下一次采样的时间, 只在离散采样系统中有用(即上文的mdlInitializeSizes中提到的ts设置ts(1)不为0), 连续系统中只需在mdlGetTimeOfNextVarHit函数中写上sys=[]. 这个函数主要用于变步长的设置, 具体实现大家可以用edit vsfuncvsfunc.m这个例子

        case 9,
        sys=mdlTerminate(t,x,u);
    

    flag=9表示此时系统要结束,一般来说写上在mdlTerminate函数中写上sys=[]就可, 如果你在结束时还要设置什么,就在此函数中写完了.

    Example

    s函数还可以带用户参数, 下面给个例子, 它和simulink下的gain模块功能一样

        function [sys,x0,str,ts] = sfungain(t,x,u,flag,gain)
        switch flag,
        case 0,
        sizes = simsizes;
        sizes.NumContStates = 0;
        sizes.NumDiscStates = 0;
        sizes.NumOutputs = 1;
        sizes.NumInputs = 1;
        sizes.DirFeedthrough = 1;
        sizes.NumSampleTimes = 1;
        sys = simsizes(sizes);
        x0=[];
        str=[];
        ts=[0,0];
        case 3,
        sys=gain*u;
        case {1,2,4,9},
        sys = [];
        end
    
    展开全文
  • MATLABS-Function s函数简单应用

    千次阅读 2019-06-26 21:09:06
    文章目录什么叫S函数用MATLAB语言编写S函数(1)主函数(2)子函数S函数的应用(1)定义s函数1.主函数2.初始化子函数3.输出子函数完整代码(2)在Simulink模型中使用S函数 B站av52613760/p52 什么叫S函数 s函数是系统函数...


    参照B站av52613760/p52视频,视频中和我所用的MATLABR20141a不同,改动后在我的版本上运行成功

    什么叫S函数

    • s函数是系统函数(System Function)的简称,是指采用一种程序设计语言描述的一个功能模块。
    • 用户可以采用MATLAB语言,也可以采用C、C++或FORTRAN等语言来编写S函数。
    • S函数有自己特定的语法构成规则,可以用来描述并实现连续系统、离散系统以及复合系统。
    • S函数能够接收来自Simulink求解算法的相关信息,并对求解算法发出的命令做出适当的响应,这种交互作用类似于Simulink系统模块与求解算法的相互作用。

    用MATLAB语言编写S函数

    在MATLAB命令行窗囗输入命令,打开模板文件。

    >> edit sfuntmpl.m
    

    模板文件sfuntmpl.m包括:

    • 1个主函数
    • 6个子函数

    (1)主函数

    主函数的引导语句为:
    function [sys,x0,str,ts]=fname(t,x,u,flag)

    • fmame是S函数的函数名.
    • 输入形参t、x、u、flag分别为仿真时间、状态向量、输入向量和子函数调用标志.
    • 输出形参sys代表一种返回参数;×0是初始状态值;对于M文件S函数,str将被置成一个空阵;ts是一个两列矩阵(一列是各状态变量的采样周期,一列是相应的采样时间的偏移量).TS = [0 0] 连续采样 ;TS =[-1 0]继承被连接模块的采样时间

    (2)子函数

    S函数共有6个子函数,这些子函数的前辍为mdl,由flag的值来控制在仿真的各阶段调用S函数的哪一个子函数.

    • flag取0:调用初始化子函数mdllnitializeSizes.
    • flag取1:调用子函数mdlDerivatives实现连续状态的更新.
    • flag取2:调用子函数mdlUpdate实现离散状态的更新.
    • Flag取3:调用输出子函数mdlOutputs.
    • flag取4,9的情况较少使用

    S函数的应用

    采用S函数实现y=kx+b.

    (1)定义s函数

    1.主函数

    function [sys,x0,str,ts]=timekb(t,x,u,flag,k,b)
    switch flag
        case 0
            [sys,x0,str,ts]=mdlInitializeSizes;%初始化
        case 3
            sys=mdlOutputs(t.x.u,k.b);%计算输出量
    %该段其余代码与模板一致
    
    end
    

    2.初始化子函数

    function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
    sizes=simsizes;
    sizes.NumContStates=0;%无连续状态
    sizes.NumDiscStates=0;%无离散状态
    sizes.NumOutputs=1;%有一个输出量
    sizes.NumInputs=1;%有一个输入信号
    sizes.DirFeedthrough=1;%输出量中含有输入量
    sizes.NumSampleTimes=1;%单个采样周期
    sys=simsizes(sizes);
    %给其他返回参数赋值
    X0=[];%设置初始状态为零状态
    str=[];%将str变量设置为空字符串
    ts=[-1,0];%假定继承输入信号的采样周期
    

    3.输出子函数

    function sys=mdlOutputs(t,x,u,k,b)%t仿真时间,x状态向量,u输入向量,k,b自定义参数
    sys=k*u+b;
    

    完整代码

    以下代码为在模板按照上述说明做改动,所用软件版本为matlabR2014a且成功运行

    function [sys,x0,str,ts,simStateCompliance] = timeFunctionkb(t,x,u,flag,k,b)%%较模板加入k.b
    %SFUNTMPL General MATLAB S-Function Template
    %   With MATLAB S-functions, you can define you own ordinary differential
    %   equations (ODEs), discrete system equations, and/or just about
    %   any type of algorithm to be used within a Simulink block diagram.
    %
    %   The general form of an MATLAB S-function syntax is:
    %       [SYS,X0,STR,TS,SIMSTATECOMPLIANCE] = SFUNC(T,X,U,FLAG,P1,...,Pn)
    %
    %   What is returned by SFUNC at a given point in time, T, depends on the
    %   value of the FLAG, the current state vector, X, and the current
    %   input vector, U.
    %
    %   FLAG   RESULT             DESCRIPTION
    %   -----  ------             --------------------------------------------
    %   0      [SIZES,X0,STR,TS]  Initialization, return system sizes in SYS,
    %                             initial state in X0, state ordering strings
    %                             in STR, and sample times in TS.
    %   1      DX                 Return continuous state derivatives in SYS.
    %   2      DS                 Update discrete states SYS = X(n+1)
    %   3      Y                  Return outputs in SYS.
    %   4      TNEXT              Return next time hit for variable step sample
    %                             time in SYS.
    %   5                         Reserved for future (root finding).
    %   9      []                 Termination, perform any cleanup SYS=[].
    %
    %
    %   The state vectors, X and X0 consists of continuous states followed
    %   by discrete states.
    %
    %   Optional parameters, P1,...,Pn can be provided to the S-function and
    %   used during any FLAG operation.
    %
    %   When SFUNC is called with FLAG = 0, the following information
    %   should be returned:
    %
    %      SYS(1) = Number of continuous states.
    %      SYS(2) = Number of discrete states.
    %      SYS(3) = Number of outputs.
    %      SYS(4) = Number of inputs.
    %               Any of the first four elements in SYS can be specified
    %               as -1 indicating that they are dynamically sized. The
    %               actual length for all other flags will be equal to the
    %               length of the input, U.
    %      SYS(5) = Reserved for root finding. Must be zero.
    %      SYS(6) = Direct feedthrough flag (1=yes, 0=no). The s-function
    %               has direct feedthrough if U is used during the FLAG=3
    %               call. Setting this to 0 is akin to making a promise that
    %               U will not be used during FLAG=3. If you break the promise
    %               then unpredictable results will occur.
    %      SYS(7) = Number of sample times. This is the number of rows in TS.
    %
    %
    %      X0     = Initial state conditions or [] if no states.
    %
    %      STR    = State ordering strings which is generally specified as [].
    %
    %      TS     = An m-by-2 matrix containing the sample time
    %               (period, offset) information. Where m = number of sample
    %               times. The ordering of the sample times must be:
    %
    %               TS = [0      0,      : Continuous sample time.
    %                     0      1,      : Continuous, but fixed in minor step
    %                                      sample time.
    %                     PERIOD OFFSET, : Discrete sample time where
    %                                      PERIOD > 0 & OFFSET < PERIOD.
    %                     -2     0];     : Variable step discrete sample time
    %                                      where FLAG=4 is used to get time of
    %                                      next hit.
    %
    %               There can be more than one sample time providing
    %               they are ordered such that they are monotonically
    %               increasing. Only the needed sample times should be
    %               specified in TS. When specifying more than one
    %               sample time, you must check for sample hits explicitly by
    %               seeing if
    %                  abs(round((T-OFFSET)/PERIOD) - (T-OFFSET)/PERIOD)
    %               is within a specified tolerance, generally 1e-8. This
    %               tolerance is dependent upon your model's sampling times
    %               and simulation time.
    %
    %               You can also specify that the sample time of the S-function
    %               is inherited from the driving block. For functions which
    %               change during minor steps, this is done by
    %               specifying SYS(7) = 1 and TS = [-1 0]. For functions which
    %               are held during minor steps, this is done by specifying
    %               SYS(7) = 1 and TS = [-1 1].
    %
    %      SIMSTATECOMPLIANCE = Specifices how to handle this block when saving and
    %                           restoring the complete simulation state of the
    %                           model. The allowed values are: 'DefaultSimState',
    %                           'HasNoSimState' or 'DisallowSimState'. If this value
    %                           is not speficified, then the block's compliance with
    %                           simState feature is set to 'UknownSimState'.
     
     
    %   Copyright 1990-2010 The MathWorks, Inc.
     
    %
    % The following outlines the general structure of an S-function.
    %
    switch flag,
     
      %%%%%%%%%%%%%%%%%%
      % Initialization %
      %%%%%%%%%%%%%%%%%%
      case 0,
        [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;
     
      %%%%%%%%%%%%%%%
      % Derivatives %
      %%%%%%%%%%%%%%%
      case 1,
        sys=mdlDerivatives(t,x,u);
     
      %%%%%%%%%%
      % Update %
      %%%%%%%%%%
      case 2,
        sys=mdlUpdate(t,x,u);
     
      %%%%%%%%%%%
      % Outputs %
      %%%%%%%%%%%
      case 3,
        sys=mdlOutputs(t,x,u,k,b);%%%%较模板加入k.b
     
      %%%%%%%%%%%%%%%%%%%%%%%
      % GetTimeOfNextVarHit %
      %%%%%%%%%%%%%%%%%%%%%%%
      case 4,
        sys=mdlGetTimeOfNextVarHit(t,x,u);
     
      %%%%%%%%%%%%%
      % Terminate %
      %%%%%%%%%%%%%
      case 9,
        sys=mdlTerminate(t,x,u);
     
      %%%%%%%%%%%%%%%%%%%%
      % Unexpected flags %
      %%%%%%%%%%%%%%%%%%%%
      otherwise%出错处理
        DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
     
    end
     
    % end sfuntmpl
     
    %
    %=============================================================================
    % mdlInitializeSizes
    % Return the sizes, initial conditions, and sample times for the S-function.
    %=============================================================================
    %
    function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
     
    %
    % call simsizes for a sizes structure, fill it in and convert it to a
    % sizes array.
    %
    % Note that in this example, the values are hard coded.  This is not a
    % recommended practice as the characteristics of the block are typically
    % defined by the S-function parameters.
    %
    sizes = simsizes;
     
    sizes.NumContStates  = 0;
    sizes.NumDiscStates  = 0;
    sizes.NumOutputs     = 1;
    sizes.NumInputs      = 1;
    sizes.DirFeedthrough = 1;
    sizes.NumSampleTimes = 1;   % at least one sample time is needed
     
    sys = simsizes(sizes);
     
    %
    % initialize the initial conditions
    %
    x0  = [];
     
    %
    % str is always an empty matrix
    %
    str = [];
     
    %
    % initialize the array of sample times
    %
    ts  = [-1 0];
     
    % Specify the block simStateCompliance. The allowed values are:
    %    'UnknownSimState', < The default setting; warn and assume DefaultSimState
    %    'DefaultSimState', < Same sim state as a built-in block
    %    'HasNoSimState',   < No sim state
    %    'DisallowSimState' < Error out when saving or restoring the model sim state
    simStateCompliance = 'UnknownSimState';
     
    % end mdlInitializeSizes
     
    %
    %=============================================================================
    % mdlDerivatives
    % Return the derivatives for the continuous states.
    %=============================================================================
    %
    function sys=mdlDerivatives(t,x,u)
     
    sys = [];
     
    % end mdlDerivatives
     
    %
    %=============================================================================
    % mdlUpdate
    % Handle discrete state updates, sample time hits, and major time step
    % requirements.
    %=============================================================================
    %
    function sys=mdlUpdate(t,x,u)
     
    sys = [];
     
    % end mdlUpdate
     
    %
    %=============================================================================
    % mdlOutputs
    % Return the block outputs.
    %=============================================================================
    %
     
    function sys=mdlOutputs(t,x,u,k,b)%%t仿真时间,x状态向量,u输入向量,k,b自定义参数
    sys=k*u+b;
    % end mdlOutputs
     
    %
    %=============================================================================
    % mdlGetTimeOfNextVarHit
    % Return the time of the next hit for this block.  Note that the result is
    % absolute time.  Note that this function is only used when you specify a
    % variable discrete-time sample time [-2 0] in the sample time array in
    % mdlInitializeSizes.
    %=============================================================================
    %
    function sys=mdlGetTimeOfNextVarHit(t,x,u)
     
    sampleTime = 1;    %  Example, set the next hit to be one second later.
    sys = t + sampleTime;
     
    % end mdlGetTimeOfNextVarHit
     
    %
    %=============================================================================
    % mdlTerminate
    % Perform any end of simulation tasks.
    %=============================================================================
    %
    function sys=mdlTerminate(t,x,u)
     
    sys = [];
     
    % end mdlTerminate
    
    

    (2)在Simulink模型中使用S函数

    做好了s函数后,simulink–user-defined function下拖一个S-Function到你的模型,就可以用了;在simulink——-user-defined function还有个s-Function Builder,他可以生成用c语言写的s函数;
    在matlab的workspace下打sfundemos,可以看到很多演示s函数的程序
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    设置完之后,点击运行,再点击查看波形可得如下结果
    运行之后得出此波形

    展开全文
  • S函数模板

    千次阅读 2017-03-27 16:52:54
    本文为simulink中s函数模板的翻译版。可直接拷入m文件编辑。
  • simulink之S函数

    千次阅读 2018-08-11 08:40:47
    s函数是system Function的简称,用它来写自己的simulink模块。(够简单吧,^_^,详细的概念介绍大伙看帮助吧)可以用matlab、C、C++、Fortran、Ada等语言来写,这儿我只介绍怎样用matlab语言来写吧(主要是它比较...
  • simulink中S函数格式

    千次阅读 2019-04-26 20:39:24
    s函数可以利用matlab的丰富资源,而不仅仅局限于simulink提供的模块,而用c或c++等语言写的s函数还可以实现对硬件端口的操作。 S函数格式 在matlab的workspace里打edit sfuntmpl,就可以看到matlab自己提供的s函数...
  • matlab中S函数的概念及使用

    万次阅读 多人点赞 2018-04-08 21:03:31
    S函数即系统函数System Function的意思,为什么要使用S函数呢?是因为在研究中,有时需要用到复杂的算法设计等,而这些算法因为其复杂性不适合用普通的Simulink模块来搭建,即matlab所提供的Simulink模块不能满足...
  • 神经网络中的S函数是什么?

    千次阅读 2018-01-29 22:30:31
    S函数是什么?有什么用? S函数(Sigmoid function)是BP神经网络中常用的非线性作用函数,即sigmoid函数,公式是f(x)=1/(1+e-x)(-x是幂数) Sigmoid函数又分为Log-Sigmoid函数和Tan-Sigmoid函数。 ...
  • s函数小实例

    千次阅读 2018-07-14 16:16:53
    采用S函数实现y=kx+b。①主函数function [sys,x0,str,ts]=timekb(t,x,u,flag,k,b)switch flag case 0 [sys,x0,str,ts]=mdlInitializeSizes; %初始化 case 3 sys=mdlOutputs(t,x,u,k,b); %计算输出量 ca...
  • 带双参数的双极S函数

    千次阅读 2016-11-16 00:15:08
    带双参数的双极S函数sigmod(x,α\alpha,β\beta)
  • S函数:Sigmoid 函数

    万次阅读 2017-07-07 18:16:07
    Sigmoid函数,即f(x)=1/(1+e-x)。神经元的非线性作用函数。(-x是幂数) 人工神经网络的学习算法-BP算法  神经网络的学习是基于一组样本进行的,它包括输入和输出(这里用期望输出表示),输入和输出有多少...
  • scala中的s函数

    千次阅读 2018-11-02 14:00:38
    //s函数的应用 val name="Tom" s"Hello,$name"//Hello,Tom
  • 基于S函数的BP神经网络PID控制器及simulink仿真

    千次阅读 热门讨论 2019-12-05 13:51:58
    文章目录文章来源和摘要S函数的编写格式和运行步骤simulink模型结构S函数模型初始化部分代码理解S函数模型更新部分S函数模型输出部分S函数完整代码附录 文章来源和摘要 S函数的编写格式和运行步骤 S函数相当于...
  • 论VS2017中的scanf函数和scanf_s函数的区别 ** 在visual studio 2017中格式化输入函数不同于其他c/c++编译器使用scanf,而是使用scanf_s。 scanf_s相比较于scanf来说更安全,因为使用scanf_s函数需要设定有一个缓冲...
  • [Simulink] 从S函数到模块代码生成

    千次阅读 2019-03-30 23:15:20
    文章目录S函数S函数类型S函数的组成及执行顺序编写S函数Level1 M S函数Level2 M S函数C Mex S函数mdlInitializeSizesC Mex S函数的实例 S函数 当Simulink默认提供的模块不能够满足用户的需求时,用户可以通过S函数...
  • MATLAB2015a中Simulink使用S函数的方法全过程

    万次阅读 多人点赞 2018-11-13 20:18:05
    S函数即系统函数System Function的意思,在研究中,有时需要用到复杂的算法设计等,而这些算法因为其复杂性不适合用普通的Simulink模块来搭建,即matlab所提供的Simulink模块不能满足用户的需求,需要用编程的形式...
  • S函数的相关概念与写法,直接在帮助文件中搜:【MATLAB S-Functions Create custom blocks defined】、【S-Function Concepts】等 S函数模块可以从下图中拖出来: 图 1 其中S-Function是正宗的S函数模块,...
  • matlab中s函数

    千次阅读 2011-12-04 19:55:31
    matlab中s函数编写s函数是system Function的简称,用它来写自己的simulink模块。(够简单吧,^_^,详细的概念介绍大伙看帮助吧)可以用matlab、C、C++、Fortran、Ada等语言来写,这儿我只介绍怎样用matlab语言来写吧...
  • VS中的scanf_s函数和scanf

    万次阅读 多人点赞 2018-06-15 18:03:22
    ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时...目前最新的c11标准中已经将scanf_s函数“转正”了。 http://msdn.microsoft.com/zh-cn/library/w40768et%28VS.80%29.aspx 如果想继续使用scanf这个不安全的
  • TP框架中S函数使用方法

    千次阅读 2018-08-31 14:22:51
    TP框架中S函数使用步骤: //初始化 type为缓存方式;prefix为缓存前缀标示,也就是名字;expire为生存周期  //我这里设置缓存方式为xcache,名字ticket,周期7100秒 cache=S(array(′type′=&gt;′xcache′,′prefix...
  • matlab实现S函数的五种方式

    千次阅读 2018-03-07 22:03:02
    Matlab允许你使用以下五种方式之一来实现S函数:   A Level-1 M-file S-function provides a simple M interface to interact with a small portion of the S-function API. Level-2 M-file S-functions supersede...
  • s函数诠释

    千次阅读 2005-04-26 00:59:00
    这是我摸索s函数的一些心得,与大伙分享。 s函数是system Function的简称,用它来写自己的simulink模块。(够简单吧,^_^,详细的概念介绍大伙看帮助吧)可以用matlab、C、C++、Fortran、Ada等语言来写,这儿我只...
  • sprintf_s函数用法

    万次阅读 2017-10-26 16:08:57
    sprintf_s是一个函数,其函数功能是将数据格式化输出到字符串。sprintf_s对于格式化string中的格式化的字符的有效性进行了检查,sprintf_s也携带着接收格式化字符串的缓冲区的大小。 sprintf_s将格式化字符串存到...
  • Matlab S函数编写

    千次阅读 2009-04-10 19:20:00
    s函数是system Function的简称,用它来写自己的simulink模块。(够简单吧,^_^,详细的概念介绍大伙看帮助吧)可以用matlab、C、C++、Fortran、Ada等语言来写,这儿我只介绍怎样用matlab语言来写吧(主要是它比较...
  • 1.thinkphp中的s函数是文件缓存吗?这个s函数文件缓存是静态缓存吗? 2.memcache是动态缓存?
  • linux下sprintf_s函数的替代

    千次阅读 2016-03-10 20:11:23
    linux下sprintf_s函数的替代
  • C++ 中 _itoa_s函数

    千次阅读 2017-05-05 09:55:30
    _itoa_s 函数原型如下:  errno_t _itoa_s(  int value, //要转换的数字  char *buffer, //存放转换结果的字符串  size_t sizeInCharacters, //存放结果的字符数组长度  int radix //转化的进制...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 102,193
精华内容 40,877
关键字:

s函数