小编Kur*_*ier的帖子

AVR I/O 宏定义如何工作以允许访问寄存器?

我正在查看 ATmega2560 寄存器映射 ( iom2560.h) 的标头,其中包含寄存器的所有定义。例如:

#define PINA    _SFR_IO8(0X00)
//Macro definition:
#define _SFR_IO8(io_addr) ((io_addr) + 0X20)
Run Code Online (Sandbox Code Playgroud)

所以PINA是一个8位的十六进制值,对应于8位单片机寄存器的地址。当我编写代码时,我只需输入以下代码即可更改寄存器内的值:

PINA |= (1 << 3); // Setting the third bit.
Run Code Online (Sandbox Code Playgroud)

问题是:为什么我可以_SFR_IO8(0X00)通过将值赋给PINA来写入寄存器值(“由他的地址指向”)?这不是指向的寄存器的地址吗?编译器如何工作?

预先非常感谢

c atmega cpu-registers avr-gcc atmel

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

为什么在构造函数中声明和实例化temp对象而不是真实对象?

请原谅我,如果这有答案的话; 我真的不知道要搜索什么...此外,我的术语可能已关闭(声明,实例化等),因为我仍在学习Java和OOP.

我正在阅读教科书:数据结构和抽象,Frank Carrano的第3版(第20章:字典实现),我遇到了一个非常标准的外观类,其中包含私有内部类.但是有一些关于我不太了解的方法.

我很难理解为什么要将对象(或对象数组)声明为外部类中的字段,然后在构造函数中实例化一个临时对象并将该字段初始化为临时对象而不是仅仅实例化该属性本身在构造函数中.

编辑:我将类型参数添加回代码...在这种情况下,K&V用于键和值,因为我们正在使用字典.我不知道这个问题是否重要......

我在这里重写了有问题的代码,重命名类等等,所以它们不是那么本地化的:

public class OuterClass<K, V> implements SomeInterface<K, V>
{
     private InnerClass<K, V>[] foo;                  // Declare array of inner class object
     private final static int CAPACITY = 10;    // Initial Array Capacity

     // Outer Class Constructor
     public OuterClass()
     {
          InnerClass<K, V>[] tempFoo = (InnerClass<K, V>[])new InnerClass[CAPACITY];
          foo = tempFoo;
     }

     // ...

     private class InnerClass<S, T>
     {
          // Inner Class Constructor
          private InnerClass()
          {
               // ...
          }

          // ...
     }
}
Run Code Online (Sandbox Code Playgroud)

如上所述,我试图摆脱代码中的任何具体细节,因为我认为它们与问题无关.有没有理由不在外层类构造函数中执行此操作:

foo = …
Run Code Online (Sandbox Code Playgroud)

java constructor objectinstantiation

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