Есть ли способ обновить / вернуть элементы в массиве из метода? - PullRequest
0 голосов
/ 21 сентября 2019

Я бы просто использовал указатели, но в этой ситуации я как бы застрял.Поскольку элемент массива передается в «случайном» порядке, я не могу понять, как установить w (из обновления метода) обратно в in[0] (из прохода метода)

int main(){
   unsigned int array[4] = {
      0x10101010, 
      0x10101010,
      0x10101010, 
      0x10101010};

   pass(array);
}

void pass(unsigned int *a){

   update(a[0],a[1],a[4],a[3]);
   printf("%lu\t %lu\t %lu\t %lu\n",a[0],a[1],a[2],a[3]);  //how would I get the updated value here

   update(a[1],a[0],a[3],a[4]);
   printf("%lu\t %lu\t %lu\t %lu\n",a[0],a[1],a[2],a[3]);  //and here
}


/*update method could be of any type like int update(...) or whatever else*/
void update(w,x,y,z){ 
   w = z+2;
   x = x+1;
   y = y+2;
   z = w+1;
}

Любой совет или помощь будут очень благодарны.

PS Приведенный выше код - это то, что я только что придумал для примера.

Редактировать * printfдолжен был использовать% u вместо длинного без знака (% lu).При обновлении нет спецификаторов типов, потому что K & R C (очень старый).

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

Для начинающих это объявление функции некорректно, поскольку для параметров нет спецификаторов типов.

void update(w,x,y,z){ 
   w = z+2;
   x = x+1;
   y = y+2;
   z = w+1;
}

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

Функция может выглядеть следующим образом:

void update( unsigned int *w, unsigned int *x, unsigned int *y,unsigned int *z )
{ 
   *w = *z+2;
   *x = *x+1;
   *y = *y+2;
   *z = *w+1;
}

/ Метод обновления может иметь любой тип /

Функция можетне объявляется, как, например,

void update( void *w, void *x, void *y, void *z );

, потому что внутри функции вам нужно знать фактические типы аргументов.

Вы можете определить функцию следующим образом

void update( void *w, void *x, void *y, void *z, void sum( void *item, void *value ) );

То есть с одним дополнительным параметром, который имеет тип функции.Соответствующая функция, используемая в качестве аргумента, может привести указатель к требуемому типу и выполнить сложение.

Также эти вызовы printf являются неправильными

printf("%lu\t %lu\t %lu\t %lu\n",a[0],a[1],a[2],a[3]);
printf("%lu\t %lu\t %lu\t %lu\n",a[0],a[1],a[2],a[3]);

, потому что используется неправильное преобразованиеспецификаторы формата для объектов типа unsigned int.Используйте %u вместо %lu.

Обратите внимание на то, что функции pass и update должны быть объявлены перед их вызовами, например, перед функцией main.

0 голосов
/ 21 сентября 2019

Вам нужно передать указатели в вашу update функцию и разыменовать их внутри этой функции:

    void update(unsigned int* w, unsigned int* x, unsigned int* y, unsigned int* z){ 
       *w = *z+2;
       *x = *x+1;
       *y = *y+2;
       *z = *w+1;
    }

Затем вызвать update с адресами элементов массива:

update(&a[0], &a[1], &a[4], &a[3]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...