C中for循环中的奇怪指针算法
我正在用IAR EBW编程msp430 我得到的表达式如下:C中for循环中的奇怪指针算法,c,pointers,msp430,pointer-arithmetic,iar,C,Pointers,Msp430,Pointer Arithmetic,Iar,我正在用IAR EBW编程msp430 我得到的表达式如下: adres = (uint_fast16_t *) 0x8602 + (0x0200*i); 在for循环中,因此i随每个循环而增加。出于某种原因,它跳过了两个地址中的每一个,给了我: 0x8602 0x8A02 0x8E02 等等。因此,0x8802被跳过,0x8C02也被跳过,以此类推 为什么会这样 ////下面是完整的代码,请注意,我被放置在三个循环中,每个人都给出相同的结果。 ////还请注意,在调试期间检查时,它显示为:
adres = (uint_fast16_t *) 0x8602 + (0x0200*i);
在for循环中,因此i随每个循环而增加。出于某种原因,它跳过了两个地址中的每一个,给了我:
0x8602
0x8A02
0x8E02
等等。因此,0x8802被跳过,0x8C02也被跳过,以此类推
为什么会这样
////下面是完整的代码,请注意,我被放置在三个循环中,每个人都给出相同的结果。
////还请注意,在调试期间检查时,它显示为:1,2,3。。。等
#include "io430.h"
#include <stdint.h>
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
// Inicjalizuj piny GPIO
P3OUT &= ~(BIT4+BIT5); // zeruj wartości by zapobiec krótkotrwałym impulsom
P3DIR |= BIT4; // ustaw pin3.4 UCA0TXD oraz piny 3.0 CS, 3.1 SIMO, 3.3 CLK jako wyjście
P3DIR &= ~(BIT5); // ustaw pin3.5 UCA0RXD oraz 3.2SOMI jako wejście
P3SEL |= BIT4+BIT5; // daj funkcje TXD i RXD pinom 3.4 i 3.5, funkcje SIMO,SOMI,CLK pinom 3.1,3.2,3.3
// Inicjalizuj ustawienia zegarów BCS
BCSCTL1 = CALBC1_16MHZ; // ustawia DCO na 16MHz, wyłącz XT2, LFXT1 w trybie niskiej częstotliwości
DCOCTL = CALDCO_16MHZ; // ustawia DCO na 16MHz
BCSCTL2 |= BIT2; // ustawia dzielnik SMCLK na 4
// Ustaw flash na czyszczenie segmentów
while(FCTL3&BIT0); // czekaj aż będzie można inicjalizować
FCTL2 = FWKEY + BIT6 + BIT5+BIT3+BIT2; // ustawia źródło zegara na MCLK oraz jego dzielnik dający f = 363 kHz
FCTL1 = FWKEY + BIT1; // czyść indywidualne segmenty
FCTL3 = FWKEY; // zdejmuje blokadę na pisanie i czyszczenie (tu segmentów)
// Czyść segmenty
uint_fast16_t *adres;
uint_fast8_t i=0;
for ( i=0 ; i < 59; i++)
{
adres = (uint_fast16_t *) 0x8602 + i*0x0200; // ustawia wskaźnik na kolejne miejsa w pamięci. sprawdzić!!
*adres = 0; // wyczyść segment przez wpisanie w jego komórkę głupiego bitu
while(FCTL3&BIT0); // poczekaj aż generator czasowy dla flasha
}
FCTL1 = FWKEY; // blokuje możliwość czyszczenia
__delay_cycles(65000);
// Ustaw flash na zapis danych
while(FCTL3&BIT0); // czekaj aż będzie można pisać
FCTL1 = FWKEY + BIT6; // pozwól pisać do flash
// Pisz do flash
uint_fast16_t szesnastka = 0;
for ( i=0 ; i < 59; i++)
{
szesnastka = (0x55 << 8 ) | 0xF0;
adres = (uint_fast16_t *) 0x8602 + (0x0200*i); // ustawia wskaźnik na kolejne miejsa w pamięci. sprawdzić!!
*adres = szesnastka; // wyczyść segment przez wpisanie w jego komórkę głupiego bitu
while(FCTL3&BIT0); // poczekaj aż generator czasowy dla flasha
}
FCTL1 = FWKEY; // blokuje możliwość pisania
FCTL3 = FWKEY + LOCK; // ustawia blokadę na pisanie i czyszczenie
__delay_cycles(65000);
// Inicjalizuj ustawienia do transmisji UART
UCA0CTL0 = 0x00; // ustawia domyślne parametry protokołu
UCA0CTL1 |= BIT7+BIT6; // ustawia źródło sygnału na SMCLK
UCA0BR0 = 0xA0; // ustawia dzielnik 4MHz do baud rate 9600
UCA0BR1 = 0x01; // ustawia dzielnik 4MHz do baud rate 9600
UCA0MCTL |= BIT2+BIT3; // ustawia modulacje zegara do baud rate 9600
UCA0CTL1 &= ~UCSWRST; // włącza maszynę USCI
uint8_t *ptr;
// Wyślij wszystkie wyniki poprzez UART
for( i=0 ; i < 59 ; i++ )
{
ptr = (uint8_t *) 0x8602 + i*0x0200; // ustawia wskaźnik na kolejne miejsa w pamięci.
while(!(IFG2&UCA0TXIFG)); // czeka na możliwość wysłania
UCA0TXBUF = *ptr; // wysyła dane przez UART
ptr++;
while(!(IFG2&UCA0TXIFG)); // czeka na możliwość wysłania
UCA0TXBUF = *ptr; // wysyła dane przez UART
}
return 0;
}
您将第一个值强制转换为指向16位值的指针,因此添加0x200将使其向前移动512个16位或2字节值 如果您这样做了:
adres = (uint_fast32_t *) 0x8602 + (0x0200 * i ) ;
它可以做到:
0x8602
0x8E02
0x9202
可以按比例减半,也可以在演员阵容开始前进行计算:
adres = ( uint_fast16_t *) ( 0x8602 + ( 0x0200 * i ) ) ;
您将第一个值强制转换为指向16位值的指针,因此添加0x200将使其向前移动512个16位或2字节值 如果您这样做了:
adres = (uint_fast32_t *) 0x8602 + (0x0200 * i ) ;
它可以做到:
0x8602
0x8E02
0x9202
可以按比例减半,也可以在演员阵容开始前进行计算:
adres = ( uint_fast16_t *) ( 0x8602 + ( 0x0200 * i ) ) ;
进行指针添加时,将指针类型的大小添加到正在操作的指针上。例如,向char*添加1将添加1,向uint32_t*添加1将添加4 因此,如果您将代码更改为:
adres = (uint_fast16_t *) ((char*)0x8602 + (0x0200*i));
进行指针添加时,将指针类型的大小添加到正在操作的指针上。例如,向char*添加1将添加1,向uint32_t*添加1将添加4 因此,如果您将代码更改为:
adres = (uint_fast16_t *) ((char*)0x8602 + (0x0200*i));
这是指针运算,而不是整数运算
当i递增时,uint\u fast16\u t*0x8602+0x0200*i递增0x0200*2,因为在本例中,sizeofuint\u fast16\u为2。这是指针算术,而不是整数算术
当i递增时,uint\u fast16\u t*0x8602+0x0200*i递增0x0200*2,因为在本例中,sizeofuint\u fast16\u为2。您将uint\u fast16*指针递增0x0200*i
当您添加到指针时,它将按基类型的大小递增,因此您将递增2字节*0x0200*i,而不仅仅是0x0200*i您将uint_fast16*指针递增0x0200*i
当您添加到指针时,它将按基类型的大小递增,因此您将递增2个字节*0x0200*i,而不仅仅是0x0200*i您可以显示实际的循环吗?我可能在它里面的某个地方被修改了…我来自哪里。你能展示整个循环吗?你知道了,谢谢你的回复!值得补充的是,uint_fast16; t的大小不一定是16位。在中,最快的整数类型int_fastN_t或uint_fastN_t,其中N=8、16、32或64被定义为。是的,我同意你的看法,先生。我这样写是为了适应它。虽然我的CPU是16位的,但如果uint\u fast16\t被认为至少有16位,而我的CPU有16位,这就是结果。谢谢你的链接你能给我们看看实际的循环吗?我可能在它里面的某个地方被修改了…我来自哪里。你能展示整个循环吗?你知道了,谢谢你的回复!值得补充的是,uint_fast16; t的大小不一定是16位。在中,最快的整数类型int_fastN_t或uint_fastN_t,其中N=8、16、32或64被定义为。是的,我同意你的看法,先生。我这样写是为了适应它。虽然我的CPU是16位的,但如果uint\u fast16\t被认为至少有16位,而我的CPU有16位,这就是结果。感谢链接它基于sizeofuint\u fast16\t,而不是指针的大小。例如,在32位系统上,指针的长度通常为32位,但您可以按单个字节移动内存指针。@Mario,是的,我的拼写错误。它基于sizeofuint\u fast16\t,而不是指针的大小。例如,在32位系统上,指针的长度通常为32位,但您可以按单个字节移动内存指针。@Mario,是的,我是打字错误。