它与一颗星 - 恶魔结构可以采取形式
const char* const* blah_blah
,
char const* blah
int const* const integer
,
int* const* const
等等各种组合。const
如何破译这些铭文,为什么总的来说有人需要像蚕一样转身?
它与一颗星 - 恶魔结构可以采取形式
const char* const* blah_blah
,
char const* blah
int const* const integer
,
int* const* const
等等各种组合。const
如何破译这些铭文,为什么总的来说有人需要像蚕一样转身?
明确大小的类型(例如uint32_t
, uint64_t
, uint16_t
)是否保证在所有平台(台式机、移动设备、微控制器)上使用相同数量的内存?实际上,无论答案如何,如何使用这些类型,是否有任何特殊任务非常需要知道位大小?面具,旗帜?在现代 C 语言中,普通的 woodenint
是否确实存在某种禁忌,您不应该使用大小因平台而异的类型(这里对标准的引用很重要,如果它以某种方式对此进行了规范,或者编译器手册)?
例如,
union
{
float fl,
unsigned int uinteg,
char ch,
int integ
} foo;
所有这些都混合存储在一个内存区域中。有什么意义,因为一旦你设置了值
foo.fl = 3.14f;
foo.uinteg = 666;
foo.ch = 'a';
foo.int = -25;
将不再可能将它们取回 - 一切都会混淆吗?一种节省几个字节或几个时钟周期并且仍然可读的方法?不要写 4 个不同的函数,而是写一个接受union
并已经决定在其中做什么的函数?void *
这样的话,接受再转成自己需要的类型不是更容易吗?作为“Just cast”的示例,我将给出以下代码:
经典例子:
typedef enum { STR, INT } tType;
typedef struct {
tType typ; // typ is separate.
union {
int ival; // ival and sval occupy same memory.
char *sval;
};
} tVal;
void printer(tVal uni)
{
if (uni.type == INTEGER) // blah-blah
uni.ival // Используем integer
else
ini.sval // В противном случае
}
打印机函数可以改写成这样:
void printer(void* data, tType typ)
{
if (tType == INTEGER)
{
(int*)data // Чего-то делаем
}
}
另一个例子:
union
{
int a;
int b;
int c;
} bar;
bar.a = 20;
bar.b = 50; // Значение a потеряли :(
同样,如果我可以先创建一个单独的变量int a = 20;
然后更改其值a = 50;
并且效果完全相同,那有什么意义呢?看起来像是强大的巫术。
给定一个表,其中列出了连通有向图的所有弧。表中有两个数字字段,第一个包含弧的起始顶点,第二个 - 结束顶点。
必需的:
编写一个返回弧列表的 SQL 查询,添加弧列表后图形将变得完整。
首先是测试表的代码(Postgresql):
CREATE TEMPORARY TABLE graph
(
start_point INTEGER NOT NULL,
end_point INTEGER NOT NULL
)
ON COMMIT DROP;
INSERT INTO graph VALUES
(1,2),
(1,4),
(2,3),
(3,4);
实际上,我的解决方案:
-- Для начала нужно получить список всех-всех дуг для данного графа
WITH a AS (
WITH points AS(
-- Получаем все вершины, преобразовывем в массив
SELECT array(SELECT DISTINCT start_point FROM graph ORDER BY start_point) ||
array(SELECT DISTINCT end_point FROM graph ORDER BY end_point)
AS allp FROM student
LIMIT 1
)
SELECT DISTINCT i
FROM unnest ((SELECT * FROM points)) AS s(i)
),
all_possible_edges AS(
SELECT *
FROM
-- И затем все эти вершины комбинируем друг с другом
a CROSS JOIN a AS b
WHERE
-- Это условие означает, что пропускаем 1-1. Также оно означает, что будет только дуга 1-2, но не 2-1
-- Хотя эти дуги одинаковы по смыслу
a < b
ORDER BY a, b
)
-- Ну и наконец берем только те дуги, которые есть в комбинациях, но которых нет в оригинальной таблице
SELECT * FROM all_possible_edges EXCEPT SELECT * FROM graph
回答:
>> 2;4
>> 1;3
问题是我不禁觉得解决方案过于复杂。数组的大惊小怪看起来特别恶心。有没有更简单的方法来解决问题?
如何使用新 的矩阵乘法运算符正确而时尚地编写代码?为什么?
A@ B
?
A@B
?
A @ B
?
PEP465 使用第三种表示法,但对我来说太长了。和不寻常的。第二个很短。第一个完全无法理解。例如,文档numpy
根本不使用该字符,而是将所有内容替换为A.matmul(B)
。奇怪的运营商。为什么 PEP8 对此保持沉默?