第一步,我先从简单的调用出发,定义了一个简单的函数,该函数仅仅实现一个整数加法求和:
LIBEXPORT_API int mySum(int a,int b){ return a+b;}
C# 导入定义:
public class RefComm
{
[DllImport("LibEncryptdll",
EntryPoint=" mySum ",
CharSet=CharSetAuto,CallingConvention=CallingConventionStdCall)]
public static extern int mySum (int a,int b);
}
在C#中调用测试:
int iSum = RefCommmySum(,);
运行查看结果iSum为5,调用正确。第一步试验完成,说明在C#中能够调用自定义的动态链接库函数。
第二步,我定义了字符串 *** 作的函数(简单起见,还是采用前面的函数名),返回结果为字符串:
LIBEXPORT_API char mySum(char a,char b){sprintf(b,"%s",a); return a;}
C# 导入定义:
public class RefComm
{
[DllImport("LibEncryptdll",
EntryPoint=" mySum ",
CharSet=CharSetAuto,
CallingConvention=CallingConventionStdCall)]
public static extern string mySum (string a, string b);
}
在C#中调用测试:
string strDest="";
string strTmp= RefCommmySum("45", strDest);
运行查看结果 strTmp 为"45",但是strDest为空。我修改动态链接库实现,返回结果为串b:
LIBEXPORT_API char mySum(char a,char b){sprintf(b,"%s",a) return b;}
修改 C# 导入定义,将串b修改为ref方式:
public class RefComm
{
[DllImport("LibEncryptdll",
EntryPoint=" mySum ",
CharSet=CharSetAuto,CallingConvention=CallingConventionStdCall)]
public static extern string mySum (string a, ref string b);
}
在C#中再调用测试:
string strDest="";
string strTmp= RefCommmySum("45", ref strDest);
运行查看结果 strTmp 和 strDest 均不对,含不可见字符。再修改 C# 导入定义,将CharSet从Auto修改为Ansi:
public class RefComm
{
[DllImport("LibEncryptdll",
EntryPoint=" mySum ",
CharSet=CharSetAnsi,CallingConvention=CallingConventionStdCall)]
public static extern string mySum (string a, string b);
}
在C#中再调用测试:
string strDest="";
string strTmp= RefComm mySum("45", ref strDest);
运行查看结果 strTmp 为"45",但是串 strDest 没有赋值。第二步实现函数返回串,但是在函数出口参数中没能进行输出。再次修改 C# 导入定义,将串b修改为引用(ref):
public class RefComm
{
[DllImport("LibEncryptdll",
EntryPoint=" mySum ",
CharSet=CharSetAnsi,CallingConvention=CallingConventionStdCall)]
public static extern string mySum (string a, ref string b);
}
运行时调用失败,不能继续执行。
第三步,修改动态链接库实现,将b修改为双重指针:
LIBEXPORT_API char mySum(char a,char b){sprintf((b),"%s",a); return b;}
C#导入定义:
public class RefComm
{
[DllImport("LibEncryptdll",
EntryPoint=" mySum ",
CharSet=CharSetAnsi,CallingConvention=CallingConventionStdCall)]
public static extern string mySum (string a, ref string b);
}
在C#中调用测试:
string strDest="";
string strTmp= RefComm mySum("45", ref strDest);
运行查看结果 strTmp 和 strDest 均为"45",调用正确。第三步实现了函数出口参数正确输出结果。
第四步,修改动态链接库实现,实现整数参数的输出:
LIBEXPORT_API int mySum(int a,int b,int c){ c=a+b; return c;}
C#导入的定义:
public class RefComm
{
[DllImport("LibEncryptdll",
EntryPoint=" mySum ",
CharSet=CharSetAnsi,CallingConvention=CallingConventionStdCall)]
public static extern int mySum (int a, int b,ref int c);
}
在C#中调用测试:
int c=0;
int iSum= RefComm mySum(,, ref c);
运行查看结果iSum 和c均为5,调用正确。
经过以上几个步骤的试验,基本掌握了如何定义动态库函数以及如何在 C# 定义导入,有此基础,很快我实现了变长加密函数在 C# 中的调用,至此目标实现。
三、结论
在 C# 中调用 C++ 编写的动态链接库函数,如果需要出口参数输出,则需要使用指针,对于字符串,则需要使用双重指针,对于 C# 的导入定义,则需要使用引用(ref)定义。
对于函数返回值,C# 导入定义和 C++ 动态库函数声明定义需要保持一致,否则会出现函数调用失败。定义导入时,一定注意 CharSet 和 CallingConvention 参数,否则导致调用失败或结果异常。运行时,动态链接库放在 C# 程序的目录下即可,我这里是一个 C# 的动态链接库,两个动态链接库就在同一个目录下运行。
原来ansys求解完问题之后,会把计算结果保存在一个表里面,表的行是单元的编号,表的列是单元的计算结果,如节点位移、节点力、应力、应变等等。
ETABLE这个命令就是把表中的某个列取出来,赋值给某个自定义的向量,再通过GET命令可以指定某个具体的单元,就可以把该单元的对应计算结果提取出来了。ETABLE,LabltemComp将单元值形成一个表以便进一步的处。
var bak = [];
for( var k in data){
bakpush(data[k]bak);
}
差不多这样吧,data是ng-repeat用到的JSON数组,通过遍历把每个json中bak(即“备份目录”中的值)取出放到一个数组bak里,也不知你要求的是不是这样。
你直接把这个拷贝到一个html文件中,打开就可以看效果,我建议你在生成table的时候可以把text的框加一个id,id中包含它属于的行和列,这样在点击text的时候可以很快的得到它属于的行和列。
<html>
<script>
function showRowAndCol(i, j) {
i = i + 1; //row number;
j = j + 1; //column number
documentgetElementById("currentInput")innerText = "text is at row: " + i + ", column " + j;
}
function getRowColNumber(textObj){
var td = textObjparentNode;
var tr = tdparentNode;
var table = trparentNode;
for (var i = 0; i < tablerowslength; i++) {
var row = tablerows[i];
if (row == tr) {
for (var j = 0; j < rowchildrenlength; j++) {
if (rowchildren[j] == td){
showRowAndCol(i, j);
return;
}
}
}
}
}
</script>
<body>
<div>
<span id="currentInput"></span>
<table border="1">
<tr>
<td width="38px;">
1
</td>
<td>
f
</td>
<td>
<input type="text" onclick="getRowColNumber(this)"/>
</td>
</tr>
<tr>
<td>
2
</td>
<td>
<input type="text" onclick="getRowColNumber(this)"/>
</td>
<td>
g
</td>
</tr>
<tr>
<td>
<input type="text" onclick="getRowColNumber(this)"/>
</td>
<td>
3
</td>
<td>
p
</td>
</tr>
<tr>
<td>
4
</td>
<td>
r
</td>
<td>
<input type="text" onclick="getRowColNumber(this)"/>
</td>
</tr>
<tr>
<td>
5
</td>
<td>
<input type="text" onclick="getRowColNumber(this)"/>
</td>
<td>
t
</td>
</tr>
<tr>
<td>
6
</td>
<td>
g
</td>
<td>
<input type="text" onclick="getRowColNumber(this)"/>
</td>
</tr>
</table>
<div>
</body>
</html>
以上就是关于后台动态查询数据库生成表格,那么后台怎样获取表格的行数列数。table.rows.cells.count提示索引超出全部的内容,包括:后台动态查询数据库生成表格,那么后台怎样获取表格的行数列数。table.rows.cells.count提示索引超出、ansys查询table行数、angularjs 获取table行数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)