小编sag*_*ian的帖子

为什么我不能将函数指针转换为(void*)?

我有一个函数,它接受一个字符串,一个字符串数组和一个指针数组,并在字符串数组中查找字符串,并从指针数组中返回相应的指针.因为我将它用于几个不同的东西,指针数组被声明为(void*)的数组,并且调用者应该知道实际上有什么类型的指针(因此它返回的返回值是什么类型的指针) ).

但是,当我传入一个函数指针数组时,在编译时会收到警告-Wpedantic:

铛:

test.c:40:8: warning: assigning to 'voidfunc' (aka 'void (*)(void)') from 'void *' converts
      between void pointer and function pointer [-Wpedantic]
Run Code Online (Sandbox Code Playgroud)

GCC:

test.c:40:8: warning: ISO C forbids assignment between function pointer and ‘void *’ [-Wpedantic]
   fptr = find_ptr("quux", name_list, (void **)ptr_list,
Run Code Online (Sandbox Code Playgroud)

这是一个测试文件,尽管警告确实正确打印"quux":

#include <stdio.h>
#include <string.h>

void foo(void)
{
  puts("foo");
}

void bar(void)
{
  puts("bar");
}

void quux(void)
{
  puts("quux");
}

typedef void (* voidfunc)(void);

voidfunc ptr_list[] = {foo, bar, quux};

char *name_list[] = {"foo", "bar", …
Run Code Online (Sandbox Code Playgroud)

c pointers function-pointers

11
推荐指数
4
解决办法
7897
查看次数

如何让Firefox从其他域上的页面返回时触发popstate事件?

我有一个简单的网页,即:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>History hacks</title>
<script>
window.onpopstate = function (e) {
    alert("location: " + document.location + ", state: " + JSON.stringify(e.state));
}
window.onload = function (e) {
    alert('page loaded');
}
</script>
</head>
<body>
<p> <a href="http://www.yahoo.com">Yahoo</a> <a href="#part1">Part 1</a></p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

现在关于Chrome和Firefox如何触发popstate事件有很多不同之处(当我开始测试IE时,我不禁想到我正在反对的事情),但是在这里给我带来问题的是Chrome会触发一个popstate只要我点击这两个链接中的任何一个,然后当我点击后退按钮时再次发生事件.Firefox将触发更改散列部分的链接事件(仅在哈希链接相同时才第一次),如果单击Yahoo链接然后单击后退按钮,则根本不会触发它.

那么有一种方法我可以在Firefox中告诉用户刚刚点击回来并从另一个域上的完全不同的站点返回我的页面吗?还有另一个可以在Firefox中用于此目的的事件吗?(当我从yahoo.com返回时,加载事件不会被触发.)

javascript firefox javascript-events popstate

7
推荐指数
2
解决办法
5196
查看次数

为什么类定义的关键字参数在删除后会重新出现?

我创建了一个定义该__prepare__方法的元类,该方法应该使用类定义中的特定关键字,如下所示:

class M(type):
    @classmethod
    def __prepare__(metaclass, name, bases, **kwds):
        print('in M.__prepare__:')
        print(f'  {metaclass=}\n  {name=}\n'
              f'  {bases=}\n  {kwds=}\n  {id(kwds)=}')
        if 'for_prepare' not in kwds:
            return super().__prepare__(name, bases, **kwds)
        arg = kwds.pop('for_prepare')
        print(f'  arg popped for prepare: {arg}')
        print(f'  end of prepare: {kwds=} {id(kwds)=}')
        return super().__prepare__(name, bases, **kwds)

    def __new__(metaclass, name, bases, ns, **kwds):
        print('in M.__new__:')
        print(f'  {metaclass=}\n  {name=}\n'
              f'  {bases=}\n  {ns=}\n  {kwds=}\n  {id(kwds)=}')
        return super().__new__(metaclass, name, bases, ns, **kwds)


class A(metaclass=M, for_prepare='xyz'):
    pass
Run Code Online (Sandbox Code Playgroud)

当我运行它时,for_prepare类 A 定义中的关键字参数重新出现在__new__ …

python metaclass python-3.x

6
推荐指数
1
解决办法
144
查看次数

如何创建一个包含 threading.Event 和 multiprocessing.Event 的协议?

Python 标准库multiprocessing.Event被明确声明为克隆threading.Event并具有相同的接口。我想注释变量和参数,以便它们可以接受这些类中的任何一个,并对mypy它们进行类型检查。我尝试创建一个协议(我使用了它,multiprocessing.synchronize.Event因为这是由 返回的实际类multiprocessing.Event)。

import multiprocessing
import threading

from typing import Optional, Type, Protocol


class Event(Protocol):
    def wait(self, timeout: Optional[float]) -> bool:
        ...

    def set(self) -> None:
        ...

    def clear(self) -> None:
        ...

    def is_set(self) -> bool:
        ...


class Base:
    flag_class: Type[Event]

    def foo(self, e: Event):
        pass


class DerivedOne(Base):
    flag_class = multiprocessing.synchronize.Event

    def foo(self, e: multiprocessing.synchronize.Event):
        pass


class DerivedTwo(Base):
    flag_class = threading.Event

    def foo(self, e: threading.Event):
        pass
Run Code Online (Sandbox Code Playgroud)

然而,mypy(版本 0.761)无法识别这一点 …

python type-hinting mypy

3
推荐指数
1
解决办法
694
查看次数