单片机、OpenGL、matlab、C++、VB、java、Delphi、CPLD等编程思路编程好的思路。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机、OpenGL、matlab、C++、VB、java、Delphi、CPLD等编程思路编程好的思路。相关的知识,希望对你有一定的参考价值。

回答者注意审题,不要理解错了。

我只要思路。不要做实物,这不是项目,是想法。就是提出一些新的想法使我们在编写程序时省时、省事、省力、要想法,把不同于我的想法写上去如果合理被采纳就给分,可能就一句话。也可能几行。

我想要想法,好的想法。不是关于客户沟通的那类。在进行软件设计时客户沟通肯定是要做的,但是我的问题不属于那个范畴。

经过3次的提问总结出以下几个想法,写在下面,
1、程序细化,将类似程序和相同程序列出来,用一段代码实现解决,重复性错误。
2、程序模块化,不同功能调用不同模块,禁止黑箱子模块。
3、编写通用程序,载入不同脚本实现不同的功能。
4、编写一些工具或编辑器,用编辑的方法来代替程序实现(不是编译器)。
5、用通用现成的功能库来实现,提高速度。
6、持续优化重构和改进,提高程序代码质量。(lens23 提出的)
7、建立通用数学模型,使一类事物用一个统一模型表示,程序能分析模型。
8、预留一些接口,提高程序的可扩展性。(chm51666提出的)
9、添加一些注释、流程图、说明文档使思路清晰。
10、规定编程接口,编程规范,采用大众编程规范,利于多人合作。
11、将抽象部分与它的实现部分分离,使它们都可以独立地变化,“桥梁模式”(S_Kr提出)。
12、编程的时候把一些写出来的函数整理成库,方便以后编写类似程序时使用(S_Kr提出)。
思想要适合大多数软件,回答者注意概括思想和方法。
5、用通用现成的功能库来实现或用现成的优质代码进行复制和粘贴,提高编程速度。

复制、粘贴这么强的功能你竟然没写。多阅读别人的代码,把一些你不知道的功能的代码或算法,给复制、粘贴过来,保存好;然后也可以按照你的12条整理成库,也可以整理成“类”。
不过你这12条对我也很有帮助;
你这里除了第5条外其它的都是自己干,要么自己写,要么自己整理。没想过参考别人的?我们程序员不是代码工人。像一些无脑的,或者很好理解的代码,简单的。让别人去想就好了。我们用现成的。追问

其实你的粘贴和复制我们也常用,应该算是第5条的范畴,我也不好分类你这个是不是新添加内容。复制粘贴确实没写。谢谢你给我一个有用的思路,但是暂时还不能添加你的想法。你的想法只能是修改第5条的表达。

追答

你的第5条还是太局限了,要么你把第5条细化,多分成几条。要么把第5条扩大化。变成一个概括性的。可以参考我写的第二段话

追问

有道理。如何写成概括性的呢?

追答

他山之玉可以攻石。借用别人的智慧解决你的问题。至于如何整理语句你自己想想把!意思就是这样的。其实编程和文学,建筑学,电子电路,管理学等等都是可以相通的。只是形式不一样,万法归一,大道自然。

参考技术A 这个问题这么问是有问题的,我是做java的,java在编程上用的就和VB差别很大

比如在java中还有如下做法
1:使用监视器模型,将实例类和用户接口通过监视器实例进行通信
2:将大量重复使用的函数做成静态函数库,再由不同的实现者通过接口关联调用
3:为每个应用建立独立使用的数学模型,这些数学模型可以通过一个作为根模型的静态模型扩展出来

另外还有很多,不同的语言需要使用不同的变成模式,不可以混淆的追问

晕,你的这个是到达一个针对每种语言的具体方法了,我不是这意思。不过我写的问题你这么回答没错,看样子写提问时还得好好花一下子心事。
你的第一条我的不知道如何概括,有点像“桥梁模式”。
第二条是模块化思想,也是我的第二条。
第三条是我的第7条,因此也是重复的。

其实我和你的理解有分歧,不同的软件或语言是会变成不同的模式,但是想法往往可以概括。
如单片机也有模块化、C++也有模块化、甚至java也是一样。

参考技术B 看了一下楼主总结的答案,觉得楼主想要的答案应该在那些编程总结的编程圣经中,如CODE之类的书

Matlab+Qt开发笔记:Qt打开mat文件显示读取的数据

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/121240756
红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

Qt开发专栏:三方库开发技术

上一篇:《Matlab+Qt开发笔记(一):matlab搭建Qt开发matlib环境以及Demo测试
下一篇:敬请期待…


前言

  介绍了基础环境,最终是为了读取显示.mat文件,本篇读取mat文件并显示。


补充

  测试的mat文件是double类型的。

Matlab库数据类型

变量类型:matError,错误变量

  错误类型,实际上是整形。

变量类型:MATFile,mat文件指针

  打开mat文件返回的指针,操作文件需要一直使用,直至关闭。

变量类型:mxArray,mat数组

  打开mat文件所产生的二维数组类型。


Matlab库函数打开读取需要用到的

  实际整理了一些函数,但是实际本篇只列出了本篇需要用到的函数(用“*”号标记)

*函数:matOpen,打开mat文件

MAT_API MATFile* matOpen(const char *filename, const char * mode);

  使用“模式”打开MAT文件“文件名”。回来指向MAT文件的指针,用于其他MAT API函数。
  当前支持的模式:

  • r” – 只读
  • w” – 只写(删除已经存在的文件)
  • w4” – 跟"w"一样,但是创建MATLAB 4.0 MAT文件
  • w7.3” – 跟"w",一样,但是创建MATLAB 7.3 MAT文件.
  • u” – 更新文件,允许读写,不删除现有文件

函数:matGetDir,获取组名称的列表

char ** matGetDir(MATFile * pMF, int *num);

  获取MAT文件中数组名称的列表。此函数返回的字符串数组包含“num”项。它是通过一次对mxCalloc的调用分配的,因此可以(必须)通过一次对mxFree的调用来释放它。

*函数:matGetNextVariable,获取下一个变量数组

mxArray * matGetNextVariable(MATFile *pMF, const char **nameptr);

  从MAT文件pMF的当前文件位置读取下一个数组值。此功能只能与matOpen和matClose一起使用。将pMF传递给任何其他API函数将导致matGetNextVariable()无法正常工作。
  特别注意:轮询变量表,那么直接第二个参数传入0。

函数:matGetNextVariableInfo,获取下一个变量数组

mxArray * matGetNextVariableInfo(MATFile *pMF, const char **nameptr);

  读取MAT文件中下一个数组值的数组头。此功能只能与matOpen和matClose一起使用。将pMF传递给任何其他API函数将导致matGetNextVariableInfo无法正常工作。
  有关定义,请参见matGetVariableInfo()的说明以及数组头的有效使用。
  注意:此函数与matGetNextVariable一样,但是无法通过mxGetPtr获取实体)。

函数:matGetVariable,获取指定名称的变量数组

`mxArray * matGetVariable(MATFile * pMF, const char * name)

  从MAT文件中读取指定变量名的数组值,返回0则出错。

函数:matGetVariableInfo,获取指定名称的变量数组

  mxArray * matGetVariableInfo(MATFile *pMF, const char * name);

  从MAT文件中读取具有指定名称的变量的数组头。
  数组头包含与数组相同的所有信息,只是pr、pi、ir和jc数据结构没有分配给非递归数据类型。也就是说,单元格、结构和对象包含指向其他数组头的指针,但数字、字符串和稀疏数组的pr、pi、ir或jc字段中不包含有效数据。
  数组头的用途是在不读取数组的所有实际数据的情况下快速访问有关数组的信息。因此,诸如mxGetM、mxGetN和mxGetClassID之类的函数可以与数组头一起使用,但mxGetPr、mxGetPi、mxGetIr、mxGetJc、mxSetPr、mxSetPi、mxSetIr和mxSetJc不能。数组头不应返回到MATLAB(例如通过MEX API)或任何其他需要完整mxArray的非矩阵访问API函数(例如engPutVariable()、matPutVariable()和mexPutVariable())。
  注意:此函数与matGetVariable一样,但是无法通过mxGetPtr获取实体)。

*函数:mxGetM,获取行数

size_t mxGetM(const mxArray *pa);

*函数:mxGetN,获取列数

size_t mxGetN(const mxArray *pa); 

*函数:double * mxGetPr,获取mxArray的实体指针

double *mxGetPr(const mxArray *pa);

  (PS:数据存储是一列一列存储的)

*函数:matClose,关闭mat文件

matError matClose(MATFile *pMF);

  关闭使用matOpen打开的MAT文件。matClose返回后,MATfile参数的指针无效。成功返回零,错误返回EOF。


Mat文件验证

  


Demo

bool MatlabManager::openMatFile(QString filePath)
{
    MATFile *pMATFile = 0;

    pMATFile = matOpen(filePath.toUtf8().data(), "r");
    if(!pMATFile)
    {
        LOG << "Failed to matOpen:" << filePath;
        QMessageBox::information(0, "Failed", QString("Failed to open file:%1").arg(filePath));
        return false;
    }
//    QMessageBox::information(0, "Succeed", QString("Succeed to open file:%1").arg(filePath));

    char **namePtr = 0;

    // 获取第一个变量名和
    mxArray *pMxArray = matGetNextVariable(pMATFile, 0);
//    mxArray *pMxArray = matGetNextVariableInfo(pMATFile, 0);
    LOG;
    if(!pMxArray)
    {
        QMessageBox::information(0, "Failed", QString("Failed to matGetNextVariableInfo"));
        return false;
    }
//    QMessageBox::information(0, "Succeed", QString("Succeed to matGetNextVariableInfo"));
    LOG;
    // 获取行数和列数
    int rows = mxGetM(pMxArray);
    int cols = mxGetN(pMxArray);
//    QMessageBox::information(0, "Succeed", QString("Succeed to get row:%1 col:%2").arg(rows).arg(cols));
    LOG << "read rows:" << rows << ", cols:" << cols;
    // 获取指针地址
    double *pData;
    pData = mxGetPr(pMxArray);
    // 显示
    for(int col = 0; col < cols; col++)
    {
        QString str;
        for(int row = 0; row < rows; row++)
        {
            str += QString("%1").arg((double)(pData[col * rows + row])) + ",";
        }
        LOG << str;
    }
    LOG;
    // 关闭文件
    matClose(pMATFile);
    LOG << pMATFile;
    pMATFile = 0;
    LOG << pMATFile;
}

Demo演示

  
  
  
  读取出值:
  

  可看出,值是竖着读的,这里的行为6行,10列:
  
  实际读取顺序如下:
  
  优化代码矫正后:
  


工程模板:v1.1.0

  testMatlabDemo_工程模板_v1.1.0_读取matlab文件并打印数据.rar


入坑

入坑一:进入matlab主界面货不对板

问题

  安装完成后,只有一个图标,如下:
  
  打开则进入工程界面(实际只是matlab内的一个小工具):
  

原因

  未知

解决

  进去matlab安装目录bin下,直接打开matlab.exe,读matlab主界面后,不会马上出来,多点几次等等(几分钟),会出来如下图,这才是matlab主界面:
  

入坑二:获取mxArray,获取其指针打印宕机

问题

  获取mxGetPtr获取的为0x00。

原因

  获取mxArray的时候,使用的是matGetNextVariableInfo函数,实际需要获取值则需要matGetNextVariable函数,matGetNextVariableInfo函数是获取非实体的头信息(可能提高了速度)。

解决

  


上一篇:《Matlab+Qt开发笔记(一):matlab搭建Qt开发matlib环境以及Demo测试
下一篇:敬请期待…

以上是关于单片机、OpenGL、matlab、C++、VB、java、Delphi、CPLD等编程思路编程好的思路。的主要内容,如果未能解决你的问题,请参考以下文章

单片机的上位机开发用啥软件好?

Matlab+Qt开发笔记:Qt打开mat文件显示读取的数据

Matlab+Qt开发笔记:Qt打开mat文件显示读取的数据

想找一些C++编程例题

在 vb.net 中使用 MATLAB 函数

Mqtt开发笔记:windows下C++ ActiveMQ客户端介绍编译和使用