Индексация массива, запускающаяся в числе не 0

Действительно ли возможно запустить массив в индексе не нуль... Т.Е. у Вас есть массив [35] 35 элементов, теперь я хочу индексировать в, говорят, что запуск 100, таким образом, числа были бы [100], [101]... [134], который возможен?

Я пытаюсь генерировать "карту распределения памяти" для платы, и у меня будет один массив названным SRAM[10000] и другим названным БАЗИСНЫМ БИБЛИОТЕЧНЫМ МЕТОДОМ ДОСТУПА [5000], например, но в видимости "памяти" они непрерывны, Т.Е. Базисный БИБЛИОТЕЧНЫЙ МЕТОД ДОСТУПА запускается прямо после SRAM поэтому если бы я пытаюсь указать на ячейку памяти 11000, я читал бы, это видит, что это - более чем 10 000 затем передача это к базисному библиотечному методу доступа.

При вводе этого я понял, что мог я предполагать, затем вычитают 10K из числа и передачи, что в БАЗИСНЫЙ БИБЛИОТЕЧНЫЙ МЕТОД ДОСТУПА, но ради аргумента, действительно ли это возможно индексировать передачу 11000 к БАЗИСНОМУ БИБЛИОТЕЧНОМУ МЕТОДУ ДОСТУПА?

Спасибо за любую справку.

Обновленный для фиксации [34] к [134]

Обновленный для получения дополнительной информации: В фактической архитектуре я буду реализовывать, существует быть разрывом между sram и базисным библиотечным методом доступа так, например, адрес 11008 не мог бы быть видим в карте распределения памяти, таким образом пишущий, что гигантский массив, полный памяти, затем "делящей" его, будет работать, но я должен буду все еще сделать логику, чтобы определить, ли это в диапазонах "sram и базисный библиотечный метод доступа". Который является тем, чего я хотел избежать во-первых.

9
задан manlio 21 May 2014 в 20:56
поделиться

12 ответов

Можно ли начать массив не с нулевого индекса... Например, у вас есть массив a[35], состоящий из 35 элементов, теперь я хочу индексировать его, скажем, начиная со 100, так что числа будут a[100], a[101], ... a[134], возможно ли это?

Нет, в C это невозможно. Массивы всегда начинаются с нуля. В C++ вы можете написать свой собственный класс, скажем OffsetArray и перегрузить оператор [] для доступа к базовому массиву, вычитая смещение из индекса.

Я пытаюсь создать "карту памяти" для платы и у меня будет один массив под названием SRAM[10000] и другой под названием BRAM[5000], например, но в видимости "памяти" они смежные, т.е. BRAM начинается сразу после SRAM, поэтому если я попытаюсь указать на ячейку памяти 11000, я прочитаю ее и увижу, что она больше 10000, затем передам ее в bram.

Вы можете попробовать что-то вроде этого:

char memory[150000];
char *sram = &memory[0];
char *bram = &memory[100000];

Теперь, когда вы обращаетесь к sram[110000] вы будете обращаться к чему-то, что находится "в bram"

19
ответ дан 4 December 2019 в 05:53
поделиться

] C ++ предоставляет в этом отношении немного больше, чем C. Вы можете перегрузить оператор [] , чтобы выполнить вычитание, и если вы хотите сообщить об ошибке (например, выдать исключение), если индекс находится вне допустимого диапазона.

В качестве минимальной демонстрации рассмотрим следующее:

#include <iostream>
#include <stdexcept>

template <class T, int lower, int upper>
class array {
    T data[upper-lower];
public:
    T &operator[](int index) { 
        if (index < lower || index >= upper)
            throw std::range_error("Index out of range");
        return data[index-lower]; 
    }
    T *begin() { return data; }
    T *end() { return data + (upper-lower); }
};

int main() {
    array<int, -3, 5> data;

    for (int i=-3; i<5; i++)
        data[i] = i;

    for (auto const &i : data) 
        std::cout << i << "\t";
    std::cout << "\n";
}
13
ответ дан 4 December 2019 в 05:53
поделиться

Я помню, как читал в книге «Экспертное программирование на C - секреты Deep C», Питер Ван дер Линден раскрывает уловку, позволяющую обмануть компилятор, заставляя думать, что смещения массива начинаются с 1 ... теоретически трюк может быть выполнен, я не Возьмите книгу с собой, но я вспомнил, что читал ее ... она не переносима и может приводить к неопределенному поведению ...

Изменить: См. здесь раздел 6.17 в C-FAQ. ВНИМАНИЕ: Непереносимое и неопределенное поведение! Цитата из источника здесь.

6.17: Here's a neat trick: 
      if I write int realarray[10]; 
         int *array = &realarray[-1]; 
I can treat "array" as if it were a 1-based array. A: Although this technique 
is attractive (and was used in old editions of the book _Numerical Recipes in C_), 
it is not strictly conforming to the C Standard. Pointer arithmetic is defined 
only as long as the pointer points within the same allocated block of memory, 
or to the imaginary "terminating" element one past it; otherwise, the behavior 
is undefined, *even if the pointer is not dereferenced*. The code above could 
fail if, while subtracting the offset, an illegal address were generated 
(perhaps because the address tried to "wrap around" past the beginning of some 
memory segment). 

References: K&R2 Sec. 5.3 p. 100, Sec. 5.4 pp. 102-3, Sec. A7.7 pp. 205-6; 
ISO Sec. 6.3.6; Rationale Sec. 3.2.2.3.

Read more: http://www.faqs.org/faqs/C-faq/faq/#ixzz0ftyqHOvm

Надеюсь, это поможет.

9
ответ дан 4 December 2019 в 05:53
поделиться

Нет - поскольку вы не можете изменить нижнюю границу в объявлении, например VB6.

Да - например, вы можете выполнять трюки вроде

int a[35];
int* actual_a = a-100;
printf("%d", actual_a[101]);
...

, потому что x [a] эквивалентно * (x + a) . Это крайне не рекомендуется.

6
ответ дан 4 December 2019 в 05:53
поделиться

You ' re не очень ясно, как именно вы хотите использовать эти массивы, но достаточно легко настроить один непрерывный массив, который может выглядеть как два разных массива:

int   ram[15000]; 
int * sram=&ram[0];
int * bram=&ram[10000];

Я использовал нотацию & foo [xxx], чтобы сделать это явным что ты делаешь. В любом случае теперь вы можете использовать ram для индексации в любом месте всего массива или sram и bram для индексации в определенных частях.

4
ответ дан 4 December 2019 в 05:53
поделиться

Просто имейте переменную, которая учитывает смещение. Даже если возможно, наличие массива, который не начинается с обычного 0, будет крайне нечитаемым.

0
ответ дан 4 December 2019 в 05:53
поделиться

Можно схитрить с макросом:

int myarray[35];

#define a (myarray - 100)

a[100] = 0;

Можно также использовать указатель.

8
ответ дан 4 December 2019 в 05:53
поделиться

строго говоря, это решение не позволяет вам определять массив, начинающийся с индекса, отличного от 0, но вы можете объявить свою память следующим образом:

typedef union
{
    unsigned char all[15000];
    struct
    {
        unsigned char sram[10000];
        unsigned char bram[5000];
    };
} memory;

это действительно передает намерение, что память является непрерывной и что она разделить на 2 части. обратите внимание, что вам следует остерегаться выравнивания bram и sram , может потребоваться #pragma pack (1) .

2
ответ дан 4 December 2019 в 05:53
поделиться

Не в C. Вы должны сами выполнять арифметические операции. Вероятно, есть причудливые обходные пути, которые работают большую часть времени, например, создание нового указателя, который является BRAM-11000, и его использование вместо него.

1
ответ дан 4 December 2019 в 05:53
поделиться

Самый простой способ сделать это:

у вас есть:

int *array = memory ; // starts with 0;
array-= 1000 ; // now array[1000] is 0

В C ++ просто создайте класс с помощью оператора []

1
ответ дан 4 December 2019 в 05:53
поделиться

Указатели и массивы очень похожи в C, так что вы можете легко сделать что-то вроде

element SRAM_MEM[10000];
element BRAM_MEM[5000];

element* SRAM = SRAM_MEM;
element* BRAM = BRAM_MEM-10000;

BRAM[10001] = 0; // sets the first element of BRAM_MEM
0
ответ дан 4 December 2019 в 05:53
поделиться

Может быть, вы можете использовать union?

#pragma pack(0)
union 
{
  char array[15000];
  struct { char sram[10000]; char bram[5000];  } map;
} combination;

Они есть физически смежные. Если вы обращаетесь к 'array', тогда он перейдет в bram или sram в зависимости от смещения

. Вам нужна прагма, чтобы сообщить компилятору НЕ выравнивать элементы структуры по границам слова. Это предотвращает появление большого количества байтов между двумя частями структуры карты.

0
ответ дан 4 December 2019 в 05:53
поделиться