Передача по имени реализации в C

Как я могу вычислить значение арифметического выражения ????^2 + 3i − 1, которое зависит от индекса i, используя механизм передачи по имени в языке C

9
∑ i^2 + 3i − 1
????=0

через вызов процедуры суммирования с аргументами, переданными по имени

Примеры передачи по именам, написанные на C, также могут мне помочь


person Kadir Erceylan    schedule 12.05.2016    source источник
comment
Это не хороший вопрос! Пожалуйста, переформатируйте его и спросите подробности. Не размещайте ссылки на изображения. Покажите нам, что вы действительно пытались решить проблему, а затем вернитесь и спросите!   -  person Retro Gamer    schedule 13.05.2016
comment
Все, что сказал @Developer. Вы можете найти руководство о том, как задавать вопросы здесь.   -  person Steve Heim    schedule 13.05.2016
comment
В C нет передачи по имени, поэтому вы не можете этого сделать.   -  person n. 1.8e9-where's-my-share m.    schedule 13.05.2016
comment
Я знаю, что C не работает с механизмом передачи по имени, но передача по имени может быть написана на C. Я провел небольшое исследование, и есть два способа сделать это: 1) с помощью макроса 2) с помощью преобразователя, но я не мог не понимаю логику работы преобразователь в C   -  person Kadir Erceylan    schedule 13.05.2016
comment
передача по имени может быть написана на C Макросы действительно используют передачу по имени. Это не функции, но самое близкое, что вы можете получить. В C нет переходников. Возможно, вы сможете написать преобразователь на ассемблере и вызвать его из C, но это будет использовать механизм передачи по имени на языке ассемблера.   -  person n. 1.8e9-where's-my-share m.    schedule 13.05.2016
comment
Не могли бы вы дать мне небольшую функцию в качестве примера механизма передачи по имени в ассемблере.   -  person Kadir Erceylan    schedule 16.05.2016


Ответы (2)


Здесь две совершенно разные темы:

  • (1) Вы хотите изучить C. В C вы всегда передаете значение, но это значение может быть указателем, который фактически работает как передача по ссылке.
  • (2) вы хотите вычислить эту сумму.

Вы можете использовать (1) для решения (2), но это не лучший способ.

Вы можете использовать (2) в качестве примера, чтобы изучить (1).

Но должно быть совершенно ясно, что (1) и (2) не одно и то же.

  • Вот как вы передаете значение функции в C: void f(int i); ... f(123);

  • Вот как вы передаете указатель на функцию в C: void f(int* i); ... int i=123; f(&i);

Это типичный способ вычисления суммы в C:

int sum = 0;
for(int i=0; i<=9; ++i)
    sum += 2 + 3*i - 1;
// now sum contains the sum

Если по какой-то причине (например, требование домашней работы?) Вы хотите передать указатель для вычисления суммы, тогда:

void f(int* psum, int i) {
    *psum += 2 + 3*i - 1;
}
...
int sum=0;
for(int i=0; i<=9; ++i)
    f(&sum, i);
person Bernd Elkemann    schedule 13.05.2016
comment
Передача по имени и передача по ссылке совершенно разные. - person n. 1.8e9-where's-my-share m.; 13.05.2016
comment
ОП новичок в этом, я предполагаю, что он не имеет в виду p-by-name, о котором вы думаете. Почти наверняка смятение, которое он испытывает, — это именно то, что я развею в своем ответе. - person Bernd Elkemann; 13.05.2016
comment
Вы можете спутать OP с синтаксисом C++... int& sum - person AndersK; 13.05.2016
comment
Как мы видим из комментариев, он имеет в виду именно то, что говорит. - person n. 1.8e9-where's-my-share m.; 13.05.2016
comment
Я не уверена. Он звучит как человек, который просто набирает в поисковой системе пропуск по имени. Но если вы правы, то вы должны написать ответ, и если он мне скажет, то я удалю этот ответ. - person Bernd Elkemann; 13.05.2016
comment
Вопрос в том, как вычислить сумму, используя передачу по имени в C. В C нет передачи по имени, поэтому я не могу написать ответ. - person n. 1.8e9-where's-my-share m.; 14.05.2016

Я сделал такое решение, как оно работает, но я не уверен, работает ли оно с передачей по имени или нет. Не могли бы вы прокомментировать мое решение?

#include <stdio.h>

int i;
typedef int* (*intThunk)(void);
int* vSubiThunk(void){ return &i; }

int sum(intThunk i){
    return (*i())* (*i()) + (*i() * 3) - 1 ;
}

int main(void){
    int total = 0;
    for(i=0;i<=9;i++)
        total += sum(vSubiThunk);

    printf("%d \n",total);
}
person Kadir Erceylan    schedule 16.05.2016
comment
Это дает правильный расчетный ответ, но я не уверен в механизме передачи по имени. - person Kadir Erceylan; 16.05.2016