48 / 46 / 18
Регистрация: 27.04.2016
Сообщений: 169
1

Организация кода. Проектирование кода

06.04.2017, 20:13. Показов 1289. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Появилось желание реализовать в учебных целях библиотеку для связанных списков, очередей, стеков. Возник ряд вопросов.
1. Как реализовать эти библиотеки универсальными, чтобы они принимали в качестве своих элементов данные любого формата. Например, чтобы можно было бы организовывать очереди не только из целых чисел, но и различных структур данных.
2. Как подойти к процессу проектирования интерфейса библиотеки?
Возможно, есть какая-та литература по вопросам проектирования ПО? В практике пока не очень силен.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2017, 20:13
Ответы с готовыми решениями:

Проектирование кода
Здравствуйте! Вопрос концептуального характера. Как указано во многих источниках модель (в МВС с...

Напишите фрагмент кода для определения кода нажатой клавиши (расширенного кода в том числе)
Напишите фрагмент кода для определения кода нажатой клавиши (расширенного кода в том числе)....

Организация кода
Задача такая: Открывается окно, где требуется ввести путь до БД. Вводишь правильный путь, затем...

Организация кода по категориям
Всем привет :senor:

9
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
07.04.2017, 05:03 2
Цитата Сообщение от si1n3rd Посмотреть сообщение
1. Как реализовать эти библиотеки универсальными, чтобы они принимали в качестве своих элементов данные любого формата. Например, чтобы можно было бы организовывать очереди не только из целых чисел, но и различных структур данных.
si1n3rd, можно посмотреть как в ядре линуха реализованы списки, загуглить linux list_head.
0
Нарушитель
1166 / 853 / 250
Регистрация: 30.06.2015
Сообщений: 4,447
Записей в блоге: 50
07.04.2017, 10:50 3
Лучший ответ Сообщение было отмечено si1n3rd как решение

Решение

Цитата Сообщение от shvyrevvg Посмотреть сообщение
можно посмотреть как в ядре линуха
Взять библиотеку Glib и посмотреть.
Цитата Сообщение от si1n3rd Посмотреть сообщение
Как реализовать эти библиотеки универсальными, чтобы они принимали в качестве своих элементов данные любого формата. Например, чтобы можно было бы организовывать очереди не только из целых чисел, но и различных структур данных.
Думаю, нужно использовать указатели на void.
1
48 / 46 / 18
Регистрация: 27.04.2016
Сообщений: 169
07.04.2017, 12:07  [ТС] 4
CoderHuligan, разрешите задать еще такой вопрос. Реально ли написать универсальную единую библиотеку для реализации различных видов списков. Например, я запускаю функцию list_init("single"), и мне функция возвращает указатель на односвязный список. Или лучше не морочить голову, а сделать для каждого вида списка свой интерфейс?
0
Нарушитель
1166 / 853 / 250
Регистрация: 30.06.2015
Сообщений: 4,447
Записей в блоге: 50
07.04.2017, 13:45 5
Лучший ответ Сообщение было отмечено si1n3rd как решение

Решение

Цитата Сообщение от si1n3rd Посмотреть сообщение
Реально ли написать универсальную единую библиотеку для реализации различных видов списков. Например, я запускаю функцию list_init("single"), и мне функция возвращает указатель на односвязный список. Или лучше не морочить голову, а сделать для каждого вида списка свой интерфейс?
Думаю, что реально сделать что-то подобное. Я тоже хочу реализовать нечто похожее и универсальное. Однако, думаю, что на си это будет несколько неуклюже выглядеть. Ведь универсализм против специфики конкретной задачи, а значит несколько неоптимален. Да и кстати в glib это уже реализовано, например, для односвязных списков:https://developer.gnome.org/gl... Lists.html
Цитата Сообщение от si1n3rd Посмотреть сообщение
Например, я запускаю функцию list_init("single"), и мне функция возвращает указатель на односвязный список.
Я недавно нечто подобное делал:
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <stdio.h>
#include <stdlib.h>
 
typedef struct list
{
    int data;
    struct list *next;
} List;
 
List * InitList( void )
{
    List *u1 = (List*)malloc(sizeof(List));
    if(u1==NULL)return NULL;
    u1->next=NULL;
    return u1;
}
List * InsertInList(List *u, int a)
{
    List *uk;
    uk=u;
    uk->data=a;
    uk->next=(List*)malloc(sizeof(List));
    uk=uk->next;
    uk->next=NULL;
    return uk;
}
 
void ListClear(List* u)
{
    List* uk;
    while(u!=NULL)
    {
        uk=u;
        u=u->next;
        free(uk);
    }
}
 
void PrintList(List * u)
{
    List* uk=u;
    while(uk->next!=NULL)
    {
        printf("%d\n", uk->data);
        uk=uk->next;
    }
}
 
List* FindInList(List * u, int a)
{
    List *uk=u;
    while(uk->next!=NULL)
    {
        if(uk->data==a)
            return uk;
        uk=uk->next;
    }
    return NULL;
}
 
int main(void)
{
    List *x,*myList = NULL;
    myList=InitList();
    x=myList;
        x=InsertInList(x, 1);
        x=InsertInList(x, 2);
        x=InsertInList(x, 3);
        x=InsertInList(x, 4);
        x=InsertInList(x, 5);
PrintList(myList);
 
printf("\n%d\n", FindInList(myList, 3)->data);
    
ListClear(myList);
 
    return 0;
}
Правда это нужно переделать, так как это просто набросок, хотя и работающий. Однако идея налицо: нужно абстрагироваться от конкретного списка и иметь возможность работать теми же функциям с множеством различных списков. Ну, а что касается типов, то тут нужно подумать.

Добавлено через 28 минут
si1n3rd,
Вот "сырцы" гномовской библиотеки:
https://opensource.apple.com/s... ib-1.2.10/
Реализация односвязных списков:
https://opensource.apple.com/s... .auto.html
Общий заголовочный файл:
https://opensource.apple.com/s... .auto.html
1
48 / 46 / 18
Регистрация: 27.04.2016
Сообщений: 169
07.04.2017, 14:03  [ТС] 6
CoderHuligan, спасибо. Я парочку библиотек уже пересмотрел с реализацией списков и очередей. Везде виды списков реализовываются разными интерфейсами. То есть, я не нашел пока библиотеки, где хотя бы три базовых вида списков реализовывались в одном наборе интерфейсов. Да, и если так подумать, то по всей видимости это не практично. А вот сделать так, чтобы принимался любой вид данных реально, я уже это реализовал. Правда, работы еще завались
1
48 / 46 / 18
Регистрация: 27.04.2016
Сообщений: 169
08.04.2017, 22:58  [ТС] 7
CoderHuligan, есть такой вопрос. Есть два варианта реализовать принятие любого вида данных.
Первый, принимать указатель на объект и цеплять его к void *data.
Второй, принимать указатель на объект, выделять malloc'ом место в ноде под data и копировать туда данные из объекта, но тогда нужно где-то хранить размер передаваемых данных.
Попробую кодом передать.
Первый случай:
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 struct list_node {
  void *data;
  struct list_node *next;
} list_node;
 
typedef struct list {
  list_node *head;
  list_node *tail;
  size_t data_size;
} list;
 
list_append(&item, &list);
list_append(void *data, list *list)
{
  list_node *node;
  
  node = malloc(sizeof(node));
  node -> data = malloc(list -> data_size); // data_size даем при инициализации списка и храним дополнительно в структуре списка
  memcpy(node -> data, data, list -> data_size);
  node -> next = NULL;
 
  // Далее подцепляем к списку новую ноду
}
Вторый случай:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
typedef struct list_node {
  void *data;
  struct list_node *next;
} list_node;
 
typedef struct list {
  list_node *head;
  list_node *tail;
} list;
 
list_append(&item, &list);
list_append(void *data, list *list)
{
  list_node *node;
  
  node = malloc(sizeof(node));
  node -> data = (void *) data;
  node -> next = NULL;
 
  // Далее подцепляем к списку новую ноду
}
В первом случае вся работа с памятью ложится на плечи пользователя, насколько я понимаю. Во втором, на мои плечи. Или я что-то не доганяю
0
Нарушитель
1166 / 853 / 250
Регистрация: 30.06.2015
Сообщений: 4,447
Записей в блоге: 50
09.04.2017, 10:14 8
Лучший ответ Сообщение было отмечено si1n3rd как решение

Решение

Цитата Сообщение от si1n3rd Посмотреть сообщение
Первый, принимать указатель на объект и цеплять его к void *data.
Второй, принимать указатель на объект, выделять malloc'ом место в ноде под data и копировать туда данные из объекта, но тогда нужно где-то хранить размер передаваемых данных.
Второй вариант это конечно бред.
По первому варианту лучше: так как размер данных при определениии функции задан, как void*, то при вызове этой функции мы просто в параметрах сразу приводим указатель на даные к нужному типу, и все дела. Хотя, компилятор это может сделать и за нас. Поэтому не:
C
1
node -> data = (void *) data;
а:
C
1
node -> data = data;
Единственный указатель в параметрах функции естественно может указывать на структуру любой сложности.
1
48 / 46 / 18
Регистрация: 27.04.2016
Сообщений: 169
12.04.2017, 15:25  [ТС] 9
CoderHuligan, обращусь к вам, как к человеку более опытному. Может вы сможете посоветовать какую-то литературу про проектированию ПО? А то не особо понимаю, куда знания то применять.
0
Нарушитель
1166 / 853 / 250
Регистрация: 30.06.2015
Сообщений: 4,447
Записей в блоге: 50
12.04.2017, 16:49 10
Цитата Сообщение от si1n3rd Посмотреть сообщение
обращусь к вам, как к человеку более опытному.
Тут есть намного более опытные товарищи.
Цитата Сообщение от si1n3rd Посмотреть сообщение
Может вы сможете посоветовать какую-то литературу про проектированию ПО? А то не особо понимаю, куда знания то применять.
Литературы по программированию пруд пруди. Но по проектированию ПО мало. В основном это литература по ООП проектированию.
Видимо это потому, что способы проектирования являются своеобразным "ноу-хау" разработки. Оно приходит с опытом, а этим опытом мало кто делится.
Могу посоветовать только в каком направлении рыть. Мэйн-стрим это ООП разработка - там деньги, понты и прочее. Но будущее на мой взгляд за автоматным програмированием, хотя оно только начинает прокладывать себе дорогу. На мой взгляд это и есть истинный путь, но многие могут со мной поспорить. Когда-нибудь оно будет мэйн-стримом, и если сейчас начать изучать этот подход, то в будущем будешь первым. Вот здесь сайт по автоматам:, там много материалов по этому вопросу:http://is.ifmo.ru и здесь(хотя этот сайт немного поломался):http://www.softcraft.ru/auto/
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2017, 16:49
Помогаю со студенческими работами здесь

Правильная организация кода в проекте
Доброго дня! При создании проекта для Windows генерятся два файла - файл формы и файл программы....

Может ли грамотное проектирование и хороший стиль кода компенсировать бедность языка?
Я хочу создать большую, довольно сложную программу. Так уж сложилось исторически, что хорошо я знаю...

Правильная организация кода программы C++ Coocox
Добрый день! Пишу программу в Coocox 1.7.8 C++ под STM32F103. Из-за того что программа...

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

Организация тестирования программного кода для МК
Привет народ. Я работаю в фирме производящей счётчики электроэнергии в отделе разработки...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru