Определите массив глобально с переменным параметром в C
Вот код:
int EdgeCount = 0;
int numOfEdges = 0;
void addEdge() {
// some code
numOfEdges++;
}
int EdgeWeightArray[numOfEdges]; // error
Я хочу, чтобы этот глобальный массив с переменными параметрами использовал его позже, но я не мог этого сделать, потому что без #define
мы не можем определить параметры глобальных массивов; а также #define
это не переменная вещь. В моем коде numOfEdges
является переменным, и я не мог сделать это постоянным.
4 ответа
EdgeWeightArray
имеет глобальный scobe, поэтому он должен быть фиксированного размера. Но numOfEdges
конечно не постоянное выражение.
Какой размер вы ожидаете EdgeWeightArray
быть? Вы ожидаете, что он будет расти, когда вы увеличиваете numOfEdges
? Если это так, вы должны изучить динамическое распределение памяти; а именно malloc
а также realloc
,
Краткий пример без проверки ошибок:
int numOfEdges = 0;
int *EdgeWeightArray;
void addEdge(some parameters) {
//SOME CODE
numOfEdges++;
EdgeWeightArray = realloc(EdgeWeightArray, numOfEdges * sizeof(EdgeWeightArray[0]));
}
На мой взгляд, вы хотите создать не очень хорошо разработанный код, где размер имеет глобальную область видимости, а вектор должен иметь локальную область видимости, чтобы быть сохраненным в стеке (в соответствии с вашей отправной точкой). В любом случае, вы можете сделать что-то вроде этого:
void defineSize() {
numOfEdges++;
}
void useIt()
{
int EdgeWeightArray[numOfEdges];
/* Use EdgeWeightArray, once the function has been executed, \
EdgeWeightArray will dissapear */
}
Почему бы не использовать глобальный указатель int и не распределять память с помощью malloc() с требуемым количеством элементов?
То, что вы пытаетесь сделать, невозможно, поскольку память для глобальных переменных вычисляется во время компиляции, а значение numOfEdges обновляется во время выполнения.
Это расширение к ответу Джонатона.
Если вы уже знаете, сколько элементов будет максимально для вашего массива, вы можете использовать фиксированный размер для вашего массива. Это может быть быстрее в данный момент, потому что перераспределение не происходит. Но вы должны удостовериться, что с этим подходом выполняется соответствующая обработка ошибок. Это может быть довольно подвержено ошибкам.
Затем вам понадобится счетчик, чтобы отслеживать ваши края, но у вас уже есть один из них.
Ваш код будет выглядеть так:
#define MAX_EDGE_COUNT 1000
int EdgeCount = 0;
void addEdge() {
// some code
EdgeWeightArray[EdgeCount] = newEdge;
EdgeCount++;
}
int EdgeWeightArray[MAX_EDGE_COUNT];