Как использовать '~' (тильда) в контексте путей?

Есть ли способ сбросить переменные, объявленные как статические внутри функции? Цель состоит в том, чтобы убедиться, что функция не вызывается с длительными значениями из несвязанного вызова. Например, у меня есть функция opearting на столбцах матрицы.

int foo(matrix *A, int colnum, int rownum){
static int whichColumn;
static int *v; //vector of length A->nrows 
   if (column != whichColumn){
    memset(v,0,size);
    whichColumn = which;
   } 
   //do other things
}

Функция вызывается n раз, один раз для каждого столбца. Это правильный способ «переустановки» статической переменной? Существуют ли другие общие надежные способы сброса статических переменных? Например, я хочу убедиться, что если вызов выполняется с новой матрицей с возможно разными размерами, вектор v изменяется и обнуляется и т. Д. Кажется, что самый простой способ - вызвать функцию с указателем NULL:

int foo(matrix *A, int colnum, int rownum){
static int whichColumn;
static int *v; //vector of length A->nrows 
   if (A == NULL){
    FREE(v);
    whichColumn = 0;
   } 
   //do other things
}
7
задан Lightness Races with Monica 2 January 2014 в 00:38
поделиться

3 ответа

Я бы рекомендовал превратить его в структуру и написать небольшую вспомогательную функцию для управления семантикой того, что вы пытаетесь сделать. Он может вернуть буфер, если запрос соответствует его размеру, или создать новый по запросу (и освободить старый), если необходимо.

0
ответ дан 7 December 2019 в 16:37
поделиться

Вместо этого используйте идемпотентную функцию инициализатора и глобальные переменные.

Например:

int foo;
int *m = NULL;

static void InitVars() {
    foo = 0;
    if (m != NULL) {
        free(m);
    }
    m = malloc(sizeof(int)*5);
    memset(m, 0, sizeof(int)*5);
}

Если ваш инициализатор действительно идемпотентный, вы можете вызвать его снова, чтобы сбросить переменные.

Если вам нужно, чтобы это вызывалось автоматически, используйте __ attribute __ ((constructor)) (для GCC) следующим образом:

static void InitVars __attribute__((constructor)) ();

Однако вы должны отметить, что если вам нужно для этого вам следует пересмотреть использование встроенных статических переменных и вместо этого использовать переданные новые переменные, которые возвращаются / записываются и передаются последующим связанным вызовам.

3
ответ дан 7 December 2019 в 16:37
поделиться

Один из подходов, который я видел при импорте модуля C в C ++, заключался в том, чтобы окружить весь модуль оболочкой класса и заменить все статические переменные внутри функций на «глобальные» переменные с уникальными именами вне функций. Я не знаю хорошего способа добиться аналогичного эффекта для проектов, включающих несколько исходных файлов, хотя я хотел бы знать, существует ли он. У меня есть встроенный системный код на C, который я моделирую, добавляя некоторые оболочки C ++ в VS2005. Например, у меня есть регистры ввода / вывода, определенные таким образом, что что-то вроде TX1CON = 0x5C; переводится во что-то вроде IOMAP (0x251) .P = 0x5C; IOMAP - это свойство, которое отправляет «записать 0x5C по адресу 0x251» программе моделирования оборудования. Этот подход работает хорошо, но я не могу выполнить полный сброс. Есть идеи?

0
ответ дан 7 December 2019 в 16:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: