C Struct Указатели - PullRequest
       0

C Struct Указатели

2 голосов
/ 27 апреля 2011

Задана структура по умолчанию:

struct counter {
  long long counter;
};    

struct instruction {
  struct counter *counter;
  int repetitions;
  void(*work_fn)(long long*);
};

static void increment(long long *n){
  n++;
}

Моя строка:

n = 2;
struct counter *ctest = NULL;

int i;
if( ctest = malloc(sizeof(struct counter)*n){
  for( i=0; i<n ;i++){
    ctest[i].counter = i;
  } 

  for( i=0; i<n ;i++){
    printf("%lld\n", ctest[i].counter);
  }
}

struct instruction itest;

itest.repetitions = 10;
itest.counter = ctest; //1. This actually points itest.counter to ctest[0] right?
                       //2. How do I actually assign a function?    

printf("%d\n", itest.repetitions);
printf("%lld\n", itest.counter.counter); // 3. How do I print the counter of ctest using itest's pointer?

Итак, я пытаюсь заставить эти три вещи работать.

Спасибо

Ответы [ 3 ]

1 голос
/ 27 апреля 2011

itest.counter = ctest; // Это фактически указывает itest.counter на ctest [0] верно?

правый. itest.counter == &ctest[0]. Кроме того, itest.counter[0] относится непосредственно к первому объекту ctest, itest.counter[1] относится ко второму и т. Д.

Как на самом деле назначить функцию?

itest.work_fn = increment;

Как мне распечатать счетчик ctest, используя указатель итеста?

printf("%lld\n", itest.counter->counter); // useful if itest.counter refers to only one item
printf("%lld\n", itest.counter[0].counter); // useful if itest.counter refers to an array
0 голосов
/ 27 апреля 2011

Да, это так.Но, может быть, это более ясно, как это:

iter.counter = &ctest[0];

itest.work_fn = increment;

printf("%lld\n", itest.counter->counter);

То есть, если вы планируете иметь только один счетчик.Из вашего кода вы хотите несколько, и, возможно, вам следует сохранить число в инструкции struct.Если это так, то это будет:

for (i = 0; i < itest.n; i++)
    printf("%lld\n", itest.counter[i].counter);

В этом случае также следует изменить функцию.

0 голосов
/ 27 апреля 2011
  1. Это указывает на адреса ctest. (что совпадает с адресами его первого элемента)
  2. Вы должны объявить некоторую функцию с той же сигнатурой (скажем, void f(long long *)) и здесь написать itest.work_fn = f;
  3. for(int i = 0; i < n; ++i) printf("%lld\n", itest.counter[i].counter);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...