我在C编程方面有一些经验,但我不敢称自己精通.最近,我遇到了以下宏:
#define CONST(x) (x)
Run Code Online (Sandbox Code Playgroud)
我发现它通常用于表达式,例如:
double x, y;
x = CONST(2.0)*y;
Run Code Online (Sandbox Code Playgroud)
完全被这个宏的观点困惑,我广泛研究了宏的优点/缺点和属性,但我仍然无法弄清楚这个宏的用途是什么.我错过了什么吗?
我注意到bash 表示法的返回状态明显不一致(( ))
.
考虑以下
$> A=0
$> ((A=A+1))
$> echo $? $A
0 1
Run Code Online (Sandbox Code Playgroud)
但是使用其他众所周知的速记增量表示法产生:
$> A=0
$> ((A++))
$> echo $? $A
1 1
Run Code Online (Sandbox Code Playgroud)
如果set -e
脚本中有内置的第二个表示法将导致脚本退出,因为((A++))
返回的非零的退出状态.在这个相关问题中或多或少地解决了这个问题.但它似乎并没有解释这两个符号在退出状态的差异((A=A+1))
和((A++))
((A++))
似乎1
只有在A
等于时返回0
.(免责声明:我没有做过详尽的测试.在bash 4.1.2和4.2.25中测试过).所以最后一个问题归结为:
为什么要A=0; ((A++))
回来1
?
我在hive中有两个表,它们都用表示时间戳的String分区(我使用字符串而不是时间戳,因为我使用的是Cloudera Impala中的表,它不支持按时间戳分区的表).
这些表用于在特定时间片中存储大量数据.第一个表包含更高时间粒度的最新数据,比如说1分钟时间片和第二个较低粒度的旧数据,这里说1小时时间片.
所以我有一个查询总结了比1分钟时间片的特定时间更早的数据,这样我就有1小时时间片的数据,并用1小时时间片将其插入到我的表中.
创建1小时时间片后,我想删除新1小时时间片中包含的所有1分钟时间片.并且由于表是由表示时间的字符串分区的,因此我可以删除相应的分区.
并且知道我的实际问题:
是否有可能在蜂巢中以某种方式丢弃分区
ALTER TABLE oneMinSlices DROP IF EXISTS PARTITION(time < 'YYYY-MM-DD HH:MM:SS')
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助.
ps:如果你想知道为什么我这样做:数据是持续增长的,如果我们不删除1分钟的时间片,那么包含它们的表变得非常大,导致我们的查询变慢并且需要很多空间.
我遇到了一个相当复杂的应用程序的问题,其中 valgrind 报告与使用函数指针相关的无效读取大小问题。我试图将问题减少到尽可能小的代码。基本上,有一个类A
定义了一个model
将一些数据作为参数的函数。类B
具有函数指针,稍后将其设置为model
类A
实例的函数。然后函数B->run()
调用函数指针。
#include <iostream>
#include <vector>
#include <functional>
using namespace std::placeholders;
class A
{
public:
A() {};
~A(){};
void model(std::vector<double>*);
};
void A::model(std::vector<double>* data)
{
for (size_t i = 0; i <= (*data).size(); ++i) {
std::cout << (*data)[i] << std::endl;
}
return;
}
class B
{
public:
B() {};
~B(){};
void run();
std::function<void(std::vector<double>*)> f_model;
};
void B::run()
{
std::vector<double> data(10, 1);
f_model(&data);
return;
}
int main(int argc, …
Run Code Online (Sandbox Code Playgroud)