小编S E*_*S E的帖子

返回函数指针类型

我经常发现需要编写返回函数指针的函数.每当我这样做,我使用的基本格式是:

typedef int (*function_type)(int,int);

function_type getFunc()
{
   function_type test;
   test /* = ...*/;
   return test;
}
Run Code Online (Sandbox Code Playgroud)

但是,在处理大量函数时,这会很麻烦,所以我不想为每个函数声明一个typedef(或者对于每个函数类)

我可以删除typedef并声明函数中返回的局部变量: int (*test)(int a, int b);使函数体看起来像这样:

{
     int (*test)(int a, int b);
     test /* = ...*/;
     return test;
}
Run Code Online (Sandbox Code Playgroud)

但后来我不知道该函数的返回类型设置了什么.我试过了:

int(*)(int,int) getFunc()
{
    int (*test)(int a, int b);
    test /* = ...*/;
    return test;
}
Run Code Online (Sandbox Code Playgroud)

但是报告语法错误.如何在不声明函数指针的typedef的情况下声明此类函数的返回类型.它甚至可能吗?另请注意,我知道为每个函数声明typedef似乎更干净,但是,我非常小心地将我的代码构造成尽可能干净且易于遵循.我想消除typedef的原因是它们通常只用于声明检索函数,因此在代码中看起来是多余的.

c syntax types function-pointers

54
推荐指数
2
解决办法
4万
查看次数

Java允许泛型中的原始类型

我知道java不应该支持通用参数,这些参数是原始类型,并且确实如下:

Vector<byte> test;
Run Code Online (Sandbox Code Playgroud)

将无法编译.

然而,我偶然在一个程序中执行了一点点手,我发现实际上可以用原始类型创建一个通用对象(技术如下所示)

此外,java错误地允许将此实例分配给类型的变量,而Vector<Byte>当print语句显示时,byte.class和Byte.class是两个独立的野兽.因此,尝试对对象进行调用会导致意外和奇怪的行为/错误.

这是一个java bug吗?还是有些押韵或理由让这种疯狂?似乎即使java允许创建基本类型泛型的意外行为,它们也不应该被赋予包装类型的泛型,该类型与原语具有不同的类.

import java.util.Vector;

public class Test
{
    //the trick here is that I am basing the return type of
    //the vector off of the type that was given as the generic
    //argument for the instance of the reflections type Class,
    //however the the class given by byte.class yields a non-class
    //type in the generic, and hence a Vector is created with a
    //primitive type
    public static <Type> Vector<Type> createTypedVector(Class<Type> type)
    { …
Run Code Online (Sandbox Code Playgroud)

java generics

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

Android中不安全的类?

Android Dalvik标准库是否具有类似于Java SE中未记录的类sun.misc.Unsafe的类,它允许直接访问内存.

java android dalvik

8
推荐指数
1
解决办法
3171
查看次数

如果在声明之前放置静态初始化程序错误

我注意到静态初始化器中的某些内容可能是javac中的一个错误.我构建了一个场景,我可以为变量赋值,但不能读回该值.

下面是两个示例,第一个编译正常,第二个在尝试从tmp读取值时出错,但由于某种原因,允许为tmp分配值.我可以理解它是否既不能读取也不能写入变量,因为tmp是在静态初始化器之后声明的,但是只有其中一个错误对我来说没有意义.

//Compiles Successfully:
public class Script
{
    public static Object tmp;
    static
    {
        tmp = new Object();
        System.out.println(tmp);
    }

}

//error only on the read but not the assignment
public class Script
{

    static
    {
        tmp = new Object();
        System.out.println(tmp);
    }
    public static Object tmp;
}
Run Code Online (Sandbox Code Playgroud)

为了进一步强调这一点,这确实可以成功编译.

public class Script
{

    static
    {
        tmp = new Object();
    }
    public static Object tmp;
}
Run Code Online (Sandbox Code Playgroud)

java static-initializer

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

Java Atomics是否仅需要与VM相关的原子性

我正在查看AtomicInteger类的Java源代码(在此处找到),以查看实现JVM所需的原子基元.我注意到他们使用未记录的UnsafeAPI来实现他们的原子整数操作,并且他们使用的唯一两个原语似乎是compare and swapcompare and set操作.而Unsafe类将这些指令实现为本机方法,这使我相信它们正在使用在一般情况下执行这些原始操作的本机指令.然而,并非每个处理器(尽管大多数现代处理器都有)具有本地支持这些原语的指令集.现在,即使没有本机处理器支持,这些原语也可以由VM实现,以保证与其他VM线程的原子性,但不一定与其他本机线程一致.那么java是否要求本机架构上的这些原语具有有效的JVM,因此所有JVM实现都支持本机线程的原子性,或者java中的原子性只保证在java线程之间?

java multithreading jvm atomic native-code

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

从内核空间执行用户空间函数

我在linux中编写一个自定义设备驱动程序,必须能够在中断时快速响应.用于处理此问题的代码已存在于用户空间实现中,但这种代码太慢,因为它依赖于软件不断检查中断线的状态.在做了一些研究后,我发现你可以从内核模块注册这些中断线,并执行函数指针给出的函数.但是我们想要执行的代码是在用户空间中,有没有办法从内核空间模块调用用户空间中的函数?

c linux module linux-kernel

5
推荐指数
2
解决办法
1万
查看次数

使用i2c总线访问驱动程序时未知核心转储

目前我正在为Arm 9嵌入式应用程序开发两个驱动程序.它们都是i2c驱动程序,每个驱动程序都使用IO扩展器pcf8575.我已经独立测试了驱动程序,但是当我将它们编译到内核并运行我的主应用程序时,我得到了下面的核心转储.通常不会在第一次驱动程序访问期间发生.它似乎是随机发生的.当我的驱动程序调用i2c驱动程序在I2c总线上传输(i2c_master_send(客户端,&buff [0],计数))时,肯定会发生这种情况.我将为我的两个司机附上主要文件.它们很相似,都非常简单.我已经独立完成了很多测试.我通过在两个非常不同的硬件上获得相同的结果来将此作为硬件问题排除在外.我猜我 我甚至不确定它何时说内核分页请求甚至开始查找.我很难相信问题出现在i2c核心驱动程序中,但这是它正在消亡的代码部分.

> Unable to handle kernel paging request at virtual address 000b9a81
> pgd = cfb80000 [000b9a81] *pgd=3fba1031,
> *pte=3f0e43cf, *ppte=3f0e4ffe Internal error: Oops: 17 [#1] Modules linked
> in: i2c_lcd gpio CPU: 0    Not tainted
> (2.6.28.10 #1036) PC is at s3c24xx_i2c_irq+0x308/0x5c4 LR is at
> handle_IRQ_event+0x44/0x80 pc :
> [<c01e7ce8>]    lr : [<c00a870c>]   
> psr: 80000093 sp : cfbe1d08  ip :
> cfbe1d2c  fp : cfbe1d28 r10: cfbe0000 
> r9 : 00000000  r8 : 00000004 …
Run Code Online (Sandbox Code Playgroud)

c linux kernel i2c linux-kernel

5
推荐指数
1
解决办法
1032
查看次数

限制模拟cpu速度的方法

我正在编写一个MOS 6502处理器仿真器,作为我业余时间进行的一个大型项目的一部分.模拟器是用Java编写的,在你说之前,我知道它不会像用c或汇编语言那样高效和优化,但目标是使它在各种平台上运行并拉动2.5MHZ在1GHZ处理器上,这对于解释型仿真器非常有用.我的问题恰恰相反,我需要将周期数限制为1MHZ.我环顾四周,但没有看到很多这样做的策略.我尝试了一些事情,包括检查一些周期后的时间和睡眠预期时间与实际时间之间的差异,但检查时间会使仿真速度减慢8倍,所以有人有任何更好的建议或也许在Java中优化时间轮询以减少减速的方法?

java optimization emulation

5
推荐指数
1
解决办法
1488
查看次数

jvm异常捕获

所以我最近编写了一个扩展异常的java类,并使用此类的实例来检查案例并在发生错误时抛出自身.我发现当main的调用者捕获到这个异常时,它所引发异常的行是从创建异常的行开始,而不是从抛出它的位置开始.我只是想知道为什么会这样,以及它是否是jvm的预期行为,因为这不是抛出异常的常用方法.如果它是预期的行为,那么这是什么理由,因为看起来抛出异常的行号会更有用(并且可能更容易跟踪堆栈).示例案例遵循预期的行为和意外情况.


普通例外投掷:

1  public class Test
2  {
3   public static void main(String ... args) throws Throwable
4   {
5       switch(5)
6       {
7           case 1: throw new Exception("Exception");
8           case 2: throw new Exception("Exception");
9           case 3: throw new Exception("Exception");
10          case 4: throw new Exception("Exception");
11          case 5: throw new Exception("Exception");
12      }
13  }
14 }
Run Code Online (Sandbox Code Playgroud)

输出:

Exception in thread "main" java.lang.Exception: Exception
    at Test.main(Test.java:11)
Run Code Online (Sandbox Code Playgroud)

我的方法(简化):

1  public class Test
2  {
3   public static void main(String …
Run Code Online (Sandbox Code Playgroud)

java debugging jvm exception-handling

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

PIC32解除引用指针可能的编译器错误

我正在使用XC32编译器为PIC32MX795F512L编写一些代码.我需要从作为void*传递给函数的缓冲区中读取数据.我需要将数据作为无符号32位整数数组读取.问题是当我将void*转换为uint32*并尝试读取该数组的索引0处的值时,处理器会调用一般错误处理程序,而如果我将void*转换为uint8*并执行某些操作位操作得到相同的数据,它工作正常.

代码如下所示:

void foo(void* data, uint32 length)
{
    uint32 i,j;
    uint32 block;
    for(i = 0, j = 0; i < length; i+= sizeof(uint32),j++)
    {
        printfUART(DEBUG_UART,"Debug 0\r\n");
#if 0//working code
        block = ((uint8*)data)[i + 3];
        block <<= 8;
        block |= ((uint8*)data)[i + 2];
        block <<= 8;
        block |= ((uint8*)data)[i + 1];
        block <<= 8;
        block |= ((uint8*)data)[i + 0];
#else//not working code
        block = ((uint32*)data)[j];
#endif
        printfUART(DEBUG_UART,"Debug 1\r\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您更改#if 0#if 1的代码按预期工作,我看到"Debug 0""Debug …

c compiler-construction pointers pic pic32

2
推荐指数
1
解决办法
714
查看次数

内核函数在中断时失败但在ioctl上没有

我正在写一个内核驱动程序通过i2c接口,我在多个地方从总线接口芯片读取.一些是通过ioctl从用户空间完成的,而其他一些是在中断时发生的.从ioctl完成的读取工作正常,但从中断完成的读取会导致核心转储(参见下文).

以下是相关的代码部分:

static struct i2c_client *pcf8575_client; //global i2c client handle

static void
pcf8575_init_client(struct i2c_client *client) {
   .
   .
   .
    pcf8575_client = client;
   .
   . 
   .
}

static int
pcf8575_ioctl(struct inode *inode,struct file *file,unsigned int request,unsigned long argument)
{
  .
  .
  .
  pcf8575_read_char(pcf8575_client, &key); //works fine here, gets back appropriate value
  .
  .
  .
}

static irqreturn_t i2c_keys_isr (int irq, void *data)
{
   int result;
   static char last_key, key;
   static struct i2c_client *pcf8575_client;
   pcf8575_client = (struct i2c_client*) data;
   .
   .
   . …
Run Code Online (Sandbox Code Playgroud)

c linux kernel linux-device-driver linux-kernel

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