C Исправлена ​​ошибка, когда массив указывал на части массива. - PullRequest
0 голосов
/ 06 июля 2010

Я делаю проект, в котором я столкнулся с этой ситуацией:

typedef unsigned char Page[16384];
unsigned char Memory[16384*64]={...values...};
void foo(Page* page);

Теперь, как вы видите, память состоит из «страниц», теперь я хотел бы передать страницу в функцию, ноСтраница должна быть указателем на значения памяти (поэтому индексы страницы должны быть указателями на значения памяти).Что я имею в виду, должно быть понятно, наблюдая за этим:

Page tmp;
Memory[16400]=50;
tmp=(unsigned char[16384])&Memory[16384];//This is not possible but is what I would like to do
printf("Value should be 50: %d\n",tmp[15]);

Любое предложение?

Обновление 1: Мне нужно, чтобы память была большим массивом, а не массивом массивов (хотя на самом деле они одинаковые, если я не ошибаюсь), это требование проекта (для университета).

Обновление 2: Obviusly - это пример кода, я использовал макрос для 16384(а также для 16384 * 64), размеры не могут измениться.

Обновление 3: Я бы хотел сохранить страницу как беззнаковый символ [16384] , потому что яхотел бы использовать его для передачи значений, которые должны быть сохранены (чтобы они нигде не хранились), но я думаю, что это невозможно, поэтому я буду следовать Тайлеру МакГенри совету

Обновление 4: Как заявил Тайлер МакГенри , Обновление 3 не имеет смысла, поэтому я объясняю, что я имею в виду: я хотел бы использовать Page для передачи значений в функции, которые должны хранитьэти значения в «файл подкачки» (это симулятор системной памяти), так что на самом деле есть некоторые случаи, когдаСтраница не будет ссылкой на что-либо (просто массив значений), но проблема в том, что страница должна быть указателем на часть памяти ИЛИ просто на простой массив из 16384 байтов, поэтому1 тип для 2 вещей - проблема.

Примером может быть такой:

typedef char Page[16384];
void WritePageToSwapFile(char* swapfilePath,Page* page);
...somewhere in a function...
Page myNewPage;
myNewPage[5]=23;
WritePageToSwapFile("swapfile",&myNewPage);
...somewhere else, in another function...
Page tmp;
Memory[16400]=50;
tmp=(unsigned char[16384])&Memory[16384];//This is not possible but is what I would like to do
WritePageToSwapFile("swapfile",&tmp);

Я не думаю, что я могу сделать обе вещи с одним типом

Ответы [ 4 ]

4 голосов
/ 06 июля 2010

Массивы в качестве параметров функции эквивалентны указателям. Просто передайте указатель смещения как Memory + 16384 в функцию.

4 голосов
/ 06 июля 2010

Просто Page будет unsigned char* вместо unsigned char[16384], и вы получите именно то, что хотите. Единственное предостережение заключается в том, что вам придется помнить внешне (например, используя постоянную PAGE_SIZE или что-то еще), какова страница большого размера, поскольку вы не сможете использовать sizeof(Page) для получения этой информации.

например. (также используя константу PAGE_SIZE для устранения магического числа 16384, разбросанного по всему коду ...)

/* In C, this has to be a define, since I'm going to use it as part of an
 * array size specifier. In C++ it could be a constant integer */
#define PAGE_SIZE 16384

typedef unsigned char* Page;
unsigned char Memory[PAGE_SIZE*64]={...values...};

Page tmp;
Memory[PAGE_SIZE+15]=50;
tmp=&Memory[PAGE_SIZE];
printf("Value should be 50: %d\n", tmp[15]); // Prints 50

/* Print out all of the values in page "tmp" */
for (int i = 0; i < PAGE_SIZE; ++i) {
  printf("%d\n", tmp[i]);
}
3 голосов
/ 06 июля 2010

Вы можете объявить массив страниц:

Page Memory[64] = {{first page}, {2nd page} ... };

Тем не менее, этот массив будет изоморфен плоскому массиву.

1 голос
/ 07 июля 2010

Если вы измените тип tmp на Page *, вы можете сделать это:

Page *tmp;
Memory[16400]=50;
tmp = (Page *)&Memory[16384];
WritePageToSwapFile("swapfile", tmp);

... ты этого хочешь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...