我有一些表:
Employee: id, name, id_suc, id dep, id_sec Suc : id_suc, name Dep : id_dep, id_suc, name Sec : id_sec, id_dep, id_suc, name
不要责怪我,这是一个现有的应用程序,我没有创建数据库,因为里面的数据太多而报告依赖于它,所以无法触及结构.我只是想按照要求修改报告.
我查询:
SELECT DISTINCT
s.name as sucurs,
d.name as depart,
c.name as section,
e.name AS emp
FROM
employee e
join suc s on (e.id_suc = s.id_suc)
join dep d on (e.id_dep = d.id_dep)
join sec c on (e.id_sec = c.id_sec)
ORDER BY
sucurs, depart, section, emp
Run Code Online (Sandbox Code Playgroud)
并带给我一个笛卡尔积.我想要:
sucurs1, depart1, section1, emp1
sucurs1, depart1, section1, emp2
.....
Run Code Online (Sandbox Code Playgroud)
(然后在报告中我按成功分组,然后是dep,然后是秒) …
例如,如果我想写一个"免费",可以使指针变为空白,我可以编写如下内容:
void myfree(void **data) {
free(*data);
*data = NULL;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试写这个时,我得到一个编译器警告(来自gcc 4.6.2)说:( warning: passing argument 1 of ‘myfree’ from incompatible pointer type [enabled by default] ... note: expected ‘void **’ but argument is of type ‘char **‘在这种情况下,我释放一个char数组).
似乎void*是特殊的套管,以避免这种警告,因为calloc,free等不触发这样的警告,但void**不(给定以上).唯一的解决方案是明确的演员,还是我误解了什么?
[我正在重新审视最近一个项目中的一些痛点,想知道如何更好地处理它们,所以我们正在考虑角落案件,因此今天的C问题.]
鉴于这void*是特殊的更新,我可以在其中使用void*和转换myfree,但这将是一个有点不负责任的解决方案,因为每个人和他们的狗将传递一个看起来像的东西的指针free,所以我需要某种编译器警告基于"间接程度",这是一个实用的解决方案.因此,通用"指针指针"的想法.
当我看到优化问题时,我看到了很多选择.一种是线性编程.我用抽象的术语理解LP是如何工作的,但我发现很难看出某个特定问题是否适合LP.是否有任何启发式方法可以帮助指导此决策?
例如,描述的工作是否有一种很好的方法来进行这种类型的挖掘?花了几周才看到如何正确地解决问题.是否有可能"提前"知道LP可以解决问题,而不首先看到"如何表达它"?
有没有我可以用来确定问题是否适合LP的清单?是否有针对此主题的标准(可读)参考?
每当我们调用函数返回值时,为什么不需要捕获值?考虑以下C代码,
int main()
{
int i;
scanf("%d",&i);
printf("Value of i is: ",i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里scanf()返回值1,但因为它没有在任何地方捕获,为什么没有弹出错误?允许这样编程的原因是什么?