无题(四)续:分割字符串(在堆空间分配内存)

本文详细解析了一个C++字符串分割函数的实现过程,包括初始化条件、查找字符、复制子串、重新初始化等关键步骤,并通过代码示例展示了如何使用此函数。同时介绍了内存分配与释放的管理方法。
<pre name="code" class="cpp">#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int spitString03(const char *buf1, char c, char **mypp, int *num)
{
	int ret = 0;
	char *p = NULL;
	char *pTmp = NULL;
	int ncount = 0;
	if (buf1==NULL ||  num==NULL)
	{
		return -1;
	}
	//步骤1 初始化条件 pTmp,p都执行检索的开头
	p = buf1;
	pTmp = buf1;
	do 
	{
		//步骤2 strstr strchr,会让p后移 	在p和pTmp之间有一个差值
		p = strchr(p, c);
		if (p == NULL) //没有找到则跳出来
		{
			break;
		}
		else 
		{

			//挖字符串
			strncpy(mypp[ncount], pTmp, p-pTmp);
			mypp[ncount][p-pTmp] = '\0';
			ncount++;

			//步骤3 让p和pTmp重新初始化,达到检索的条件
			pTmp = p  = p + 1;
		}

	} while (*p != '\0');
	//printf("ncout:%d\n", ncount);
	*num = ncount;
	return ret;
}

//分配内存函数
char **getMem(int num)
{
	int i = 0;
	//char **pp = (char **)malloc(sizeof(num*sizeof(char *)));
	char **pp = (char **)malloc(num* sizeof(char *) );
	if (pp == NULL)
	{
		return NULL;
	}
	for (i=0; i<num; i++)
	{
		pp[i] = (char *)malloc(100);
		if (pp[i] == NULL)
		{
			return NULL;
		}
	}
	return pp;
}

int FreeMem(char **pp, int num)
{
	int i = 0;
	if (pp == NULL)
	{
		 return -1;
	}
	for (i=0; i<num; i++)
	{
		free(pp[i]);
	}
	free(pp);
	return 0;
}

//对付1个入口多个出口的问题。。。有方法
//采用goto语句进行处理  将要释放的内存或者后期处理的语句 放到goto表示符的后面

void main()
{
	int			ret = 0, i = 0;
	int			num = 0;
	int			numArray = 10;
	const char	*buf1 = "abcdef,acccd,";
	char			c = ',';

	char			**pp =  NULL;
	char			**pp2 =  NULL;

	//"ab"
	//char *buf = (char *)malloc(strlen("ab") + 1);
	//strcpy(buf, "ab");


	pp = getMem(numArray);
	if (pp == NULL)
	{
		ret = -1;
		printf("func getMem() err:%d\n", ret);
		goto End;
	}

	pp2 = getMem(numArray);
	if (pp2 == NULL)
	{
		ret = -2;
		printf("func getMem() err:%d\n", ret);
		goto End;
	}
		
	ret =  spitString03(buf1, c, pp, &num);
	if (ret == 0) //故意写错
	{
		printf("func spitString() err:%d\n", ret);
		goto End;
	}

	for (i=0; i<num; i++)
	{
		printf("%s\n", pp[i]);
	}

End:

	if (pp != NULL)
	{
		FreeMem(pp, numArray);
	}
		
	if (pp2 != NULL)
	{
		FreeMem(pp2, numArray);
	}
	
	system("pause");
}




                
一、 内容概要 本资源提供了一个完整的“金属板材压弯成型”非线性仿真案例,基于ABAQUS/Explicit或Standard求解器完成。案例精确模拟了模具(凸模、凹模)与金属板材之间的接触、压合过程,直至板材发生塑性弯曲成型。 模型特点:包含完整的模具-工件装配体,定义了刚体约束、通用接触(或面面接触)及摩擦系数。 材料定义:金属板材采用弹塑性材料模型,定义了完整的屈服强度、塑性应变等真实应力-应变数据。 关键结果:提供了成型过程中的板材应力(Mises应力)、塑性应变(PE)、厚度变化​ 云图,以及模具受力(接触力)曲线,完整再现了压弯工艺的力学状态。 二、 适用人群 CAE工程师/工艺工程师:从事钣金冲压、模具设计、金属成型工艺分析与优化的专业人员。 高校师生:学习ABAQUS非线性分析、金属塑性成形理论,或从事相关课题研究的硕士/博士生。 结构设计工程师:需要评估钣金件可制造性(DFM)或预测成型回弹的设计人员。 三、 使用场景及目标 学习目标: 掌握在ABAQUS中设置金属塑性成形仿真的全流程,包括材料定义、复杂接触设置、边界条件与载荷步。 学习如何调试和分析大变形、非线性接触问题的收敛性技巧。 理解如何通过仿真预测成型缺陷(如减薄、破裂、回弹),并与理论或实验进行对比验证。 应用价值:本案例的建模方法与分析思路可直接应用于汽车覆盖件、电器外壳、结构件等钣金产品的冲压工艺开发与模具设计优化,减少试模成本。 、 其他说明 资源包内包含参数化的INP文件、CAE模型文件、材料数据参考及一份简要的操作要点说明文档。INP文件便于用户直接修改关键参数(如压边力、摩擦系数、行程)进行自主研究。 建议使用ABAQUS 2022或更高版本打开。显式动力学分析(如用Explicit)对计算资源有一定要求。 本案例为教学与工程参考目的提供,用户可基于此框架进行拓展,应用于V型弯曲
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,广泛应用于图像处理、计算机视觉和模式识别等领域。物体识别是OpenCV的一个重要应用场景,以下是一些常见的物体识别方法和技术: 1. **特征提取与匹配**: - **SIFT(尺度不变特征变换)**和**SURF(加速稳健特征)**:这些算法用于检测和描述局部特征,能够在图像中识别出相同的物体,即使它们的大小、旋转或光照条件发生变化。 - **ORB(定向快速旋转BRIEF)**:一种快速的特征检测和描述算法,适用于实时应用。 2. **模板匹配**: - 通过在图像中滑动一个模板(已知物体的图像),并计算模板与图像区域的相似度,来找到物体的位置。 3. **机器学习与深度学习**: - **支持向量机(SVM)**:用于分类和回归分析,可以用于物体识别任务。 - **卷积神经网络(CNN)**:深度学习模型,特别适合处理图像数据,能够自动学习图像的特征并进行分类。 4. **目标检测算法**: - **Haar级联分类器**:基于积分图和AdaBoost算法,用于实时人脸检测。 - **YOLO(You Only Look Once)**和**SSD(Single Shot MultiBox Detector)**:实时目标检测算法,能够在单次前向传播中同时进行目标定位和分类。 5. **实例分割**: - **Mask R-CNN**:在目标检测的基础上,进一步分割出目标的精确轮廓。 OpenCV提供了丰富的API和工具,可以方便地实现上述方法。以下是一个简单的示例代码,展示如何使用OpenCV进行模板匹配: ```python import cv2 import numpy as np # 读取原始图像和模板图像 original_image = cv2.imread('original_image.jpg') template = cv2.imread('template.jpg') template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY) w, h = template_gray.shape[::-1] # 转换为灰度图 gray_original = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY) # 模板匹配 result = cv2.matchTemplate(gray_original, template_gray, cv2.TM_CCOEFF_NORMED) threshold = 0.8 loc = np.where(result >= threshold) # 绘制矩形框 for pt in zip(*loc[::-1]): cv2.rectangle(original_image, pt, (pt[0] + w, pt[1] + h), (0, 255, 255), 2) # 显示结果 cv2.imshow('Detected', original_image) cv2.waitKey(0) cv2.destroyAllWindows() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值