访问内存地址数组

时间:2015-05-18 21:54:36

标签: c arrays pointers

我一直用C编写简单的东西,现在我发现了一些更复杂的东西。

PVSNESLIB的这个程序从asm中定义的图像中获取模式,调色板和地图名称:

if pageNumber == 2 {
  KeyboardViewController.showKeyboard()
}else{
  KeyboardViewController.hideKeyboard()
}

使用以下示例函数在屏幕上显示它们:

patterns:
.incbin "RES/images/bkg1.pic" 
patterns_end:
patterns1:
.incbin "RES/images/bkg2.pic" 
patterns1_end:
palette:
.incbin "RES/images/bkg1.pal"
palette_end:
palette1:
.incbin "RES/images/bkg2.pal"
palette1_end:
map:
.incbin "RES/images/bkg1.map"
map_end:
map1:
.incbin "RES/images/bkg2.map"
map1_end:
;;; and so on...

下一个代码将显示"电影":

bgInitTileSet(0, &patterns, &palette, 0, (&patterns_end - &patterns), 256*2, BG_256COLORS, 0x0000);
bgInitMapSet(0, &map, (&map_end - &map),SC_32x32, 0x2000);
   v++; 
//&patterns_end - &patterns is the patterns size
//&map_end - &map is the map size
//0x0000 & 0x2000 are a vram addresses

2 个答案:

答案 0 :(得分:0)

看,模式只是一个char,它不是一个数组。而patterns_end也只是一个字符。所以你只有两个字符,而不是字符的成功。 你可以做一个for循环,定义一个指向模式的指针,然后加1,直到这个aux指针的地址与patterns_end地址匹配。 像这样:

char *aux = &patterns;
char *pattern_vector;
int i;

for(i=0; aux!= (&patterns_end) ; i++) {
  pattern_vector[i] = aux;
  aux++;  // Look that here, i am incrementing the address value
}

//Then, here you can use your array

看看它是否有效。如果我没有犯错(我很快就这么做了),那就应该了!

答案 1 :(得分:0)

我很抱歉,写完完整的代码我意识到我在PAT [v]中使用了错误的数字。

至少我学到了一些东西:

char *PAT0 = &patterns; 
char *PAT[] = {&patterns,.......};

“PAT0”和“PAT [0]”将保持相同(正确)的地址。

谢谢大家。