Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/2: Рейтинг темы: голосов - 2, средняя оценка - 4.50
rattrapper
foo();
871 / 573 / 222
Регистрация: 03.07.2013
Сообщений: 1,548
Записей в блоге: 2
1

Можно ли реализовать функцию по примеру из C#

28.03.2015, 23:13. Просмотров 456. Ответов 9

В си нету внутренних методов, но мне никак в голову не приходит, можно ли как-то реализовать такую ф-ю? (Не нарушая правила языка )
C#
1
2
3
4
5
6
7
8
9
typedef int(*indexer)(int, int);
indexer minor(indexer source, int column)
{
    int getVal(int i, int j)
    {
        return(source(i + 1, j < column ? j : j + 1));
    }
    return &getVal;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.03.2015, 23:13
Ответы с готовыми решениями:

Можно ли реализовать перегруженную функцию на masm?
Добрый вечер. Подскажите, можно ли реализовать перегруженную функцию на MASM? В оптимале - при...

Реализовать стиль по примеру
Добрый день. Помогите реализовать подобное отображение. заголовок ****текст где, &quot;текст&quot;...

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

Реализовать пул потоков, в который можно помещать функцию
не могу реализовать как в книге главу 9 пул потоков который,в который можно помещать функцию что бы...

Выяснить, можно ли реализовать функцию f формулой глубины k над множеством M
Помогите понять, как решать такую задачу. Выяснить, можно ли реализовать функцию f формулой...

9
HighPredator
5693 / 2013 / 723
Регистрация: 10.12.2010
Сообщений: 5,783
Записей в блоге: 3
31.03.2015, 12:34 2
Что оно вообще делает?
0
Novi4ekC
81 / 81 / 33
Регистрация: 03.03.2013
Сообщений: 311
31.03.2015, 21:27 3
Цитата Сообщение от rattrapper Посмотреть сообщение
В си нету внутренних методов, но мне никак в голову не приходит, можно ли как-то реализовать такую ф-ю? (Не нарушая правила языка )
Всё что пропустит компилятор языка без ошибок, не нарушит правила языка.
0
HighPredator
5693 / 2013 / 723
Регистрация: 10.12.2010
Сообщений: 5,783
Записей в блоге: 3
01.04.2015, 08:38 4
rattrapper, если я правильно понял то, что у вас написано, то можно сэмулировать следующим образом:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
typedef int (*indexer)(int, int);
 
static indexer getValInnerFunctionPtr = NULL; /* "source" in getVal's scope */
static int getValColumn = 0;                  /* "column" in getVal's scope */
 
static int getVal(int i, int j)
{
  return (getValInnerFunctionPtr(i + 1, j < getValColumn ? j : j + 1));
}
 
static void InitGetVal(indexer source, int column)
{
  /* to make getVal have valid values of both on call */
  getValInnerFunctionPtr = source;
  getValColumn = column;
}
 
indexer minor(indexer source, int column)
{
  /* make "visible" source + column in getVal */
  InitGetVal(source, column);
  return getVal;
}
Суть изворота собственно в подмене локальной области видимости nested-функции для аргументов source + column глобальной.
1
rattrapper
foo();
871 / 573 / 222
Регистрация: 03.07.2013
Сообщений: 1,548
Записей в блоге: 2
01.04.2015, 21:15  [ТС] 5
HighPredator, к сожалению, ваш код не решает моей проблемы, так как мне необходимо вызывать функцию "minor" в рекурсивной ф-ии. Вообще, по задумке, я просто собирался использовать память, автоматически выделяемую для параметров ф-ции, что сильно бы упростило задачу

Добавлено через 21 минуту
зы. кто-то из модеров переименовал тему. Хотел просто уточнить, что в C# (ровно как и в C) таких конструкций не существует.
0
HighPredator
5693 / 2013 / 723
Регистрация: 10.12.2010
Сообщений: 5,783
Записей в блоге: 3
02.04.2015, 08:26 6
Цитата Сообщение от rattrapper Посмотреть сообщение
мне необходимо вызывать функцию "minor" в рекурсивной ф-ии
Можете всю механику использования показать? Не факт что что-то архи сделаю, но так, для общего понимания картины.
0
rattrapper
foo();
871 / 573 / 222
Регистрация: 03.07.2013
Сообщений: 1,548
Записей в блоге: 2
02.04.2015, 19:18  [ТС] 7
Цитата Сообщение от HighPredator Посмотреть сообщение
Можете всю механику использования показать?
Где-то так, примерно:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
#include <malloc.h>
 
typedef int(*indexer)(int, int);
 
indexer self(int **matrix)
{
    int val(int i, int j)
    {
        return matrix[i][j];
    }
    return &val;
}
indexer minor(indexer source, int row, int col)
{
    int val(int i, int j)
    {
        return source(i < row ? i : i + 1, j < col ? j : j + 1);
    }
    return &val;
}
parity(n)
{
    return n % 2 ? -1 : 1;
}
determinant(indexer matrix, int n)
{
    if (n == 1)
        return matrix(0, 0);
    int sum = 0;
    for (int i = 0; i < n; i++)
    {
        sum += matrix(0, 0) * parity(i)* determinant(minor(matrix, 0, i), n - 1);
    }
    return sum;
}
main()
{
    int **matrix, n, res;
    //init
    res = determinant(self(matrix), n);
}
0
HighPredator
03.04.2015, 08:36
  #8

Не по теме:

Жесть....

0
gng
848 / 583 / 180
Регистрация: 08.09.2013
Сообщений: 1,570
03.04.2015, 20:59 9
Цитата Сообщение от rattrapper Посмотреть сообщение
Где-то так, примерно:
Напряг все свои телепатические способности и, как мне показалось, понял, чего вы хотите.
Но Си принципиально не принимает элементов телепатии.
Этот подход ("телепатический") начал применяться с развитием концепции ООП и достиг определенных успехов в современных графических интерфейсах.
На Си обычно пишут проще, что-то такое
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <malloc.h>
#define N 3
 
int *minor(const int *m, int n, int row, int col)
{
  int *mr= malloc ((n-1)*(n-1)*sizeof (int));
  int i, j, k= -1;
  for (i= 0; i<n; i++) for (j= 0; j<n; j++)
    if (i != row && j != col) mr[++k]= m[i*n+j];
  return mr;
}
 
int determinant (const int *matrix, int n)
{
  if (n == 1) return matrix[0];
  int sum = 0;
  for (int i = 0; i < n; i++)
    sum += (1 - i%2*2) * matrix[i] * determinant (minor (matrix, n, 0, i), n-1);
  return sum;
}
 
int main()
{
  int matrix[N*N]= {1,2,3,4,5,6,7,8,9};
  printf ("%d\n", determinant (matrix, N));
  return 0;
}
0
rattrapper
foo();
871 / 573 / 222
Регистрация: 03.07.2013
Сообщений: 1,548
Записей в блоге: 2
03.04.2015, 21:11  [ТС] 10
gng, гы... это я уже давно написал
Мой вариант функции det по определению
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int** minor(int** matrix, int row, int n)
{
    int **res = malloc(sizeof(int*) * (n - 1));
    for (int i = 0; i < n; i++)
    {
        if (i == row)
            continue;
        int k = i < row ? i : i - 1;
        res[k] = matrix[i] + 1;
    }
    return res;
}
parity(x)
{
    return x % 2 ? -1 : 1;
}
det(int **matrix, int n)
{
    if (n == 1)
        return matrix[0][0];
    int sum = 0;
    for (int i = 0; i < n; i++)
    {
        int** m = minor(matrix, i, n);
        sum += parity(i) * (matrix[i][0]) * det(m, n - 1);
        free(m);
    }
    return sum;
}

Цитата Сообщение от gng Посмотреть сообщение
Напряг все свои телепатические способности и, как мне показалось, понял, чего вы хотите.
Я специально оставил пару намеков, типа
Цитата Сообщение от rattrapper Посмотреть сообщение
C
1
determinant
просто хотел попробовать указатели на функции в Си в деле
0
03.04.2015, 21:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2015, 21:11

Нужно реализовать скрипт друзей на php, по моему примеру
Всем привет! Можете подсказать скрипт, который бы делал следующее: 1) Нажимаешь на кнопку,...

Как реализовать функцию-член, которую можно вызвать только один единственный раз?
Доброго времени суток. Моя проблема в том, что при создании экземпляра дочернего класса,...

Можно ли ограничить ввод в буфер, к примеру, 10 символами?
Всем привет! Делаю задания, оно прозвучало так: внесите изменения в функцию, чтобы она прекращала...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru