Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
si1n3rd
42 / 41 / 17
Регистрация: 27.04.2016
Сообщений: 158
1

Код на оценку (Односвязный список)

17.10.2017, 12:11. Просмотров 993. Ответов 18
Метки нет (Все метки)

Доброго времени суток! Хотелось бы попросить опытных обитателей сего форума оценить мой код. Это моя частичная реализация библиотеки для работы с односвязным списком, который должен принимать любой вид данных. Естественно, большая часть работы с памятью возлагается на плечи пользователей библиотеки. Принимается любая критика, только просьба писать ее конкретно, а не типа "код гавно" Скажу что мне не нравится. Мне уж больно не нравится уровень вложенности. Но так как опыт у меня не большой, то я могу ошибаться.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// list.h
 
#ifndef LIST_H
#define LIST_H
 
typedef struct _list list_t;
 
struct _list {
    void* data;
    list_t* next;
};
 
list_t* list_create(void);
int list_init(list_t* list);
int list_size(list_t* list);
int list_is_empty(list_t* list);
int list_add(void* data, int pos, list_t** list);
int list_prepend(void* data, list_t** list);
int list_append(void* data, list_t** list);
int list_traverse(list_t* list, void (*func) (void* data));
 
#endif // LIST_H
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
// list.c
 
#include "list.h"
 
#include "stdio.h"
#include "stdlib.h"
 
static list_t* __list_alloc(void);
static int __list_check_null(list_t* list);
static list_t* __list_get_nth(list_t* list, int n);
 
list_t* list_create(void) {
    return __list_alloc();
}
 
int list_init(list_t* list) {
    int status;
 
    status = __list_check_null(list);
    if(status != -1) {
        list -> data = NULL;
        list -> next = NULL;
    }
 
    return status;
}
 
int list_size(list_t* list) {
    list_t* curr;
    int status;
    int size = -1;
    
    status = __list_check_null(list);
    if(status != -1) {
        size = 0;
        curr = list;
        while(curr && curr -> data) {
            size++;
            curr = curr -> next;
        }
    }
 
    return size;
}
 
int list_is_empty(list_t* list) {
    return list_size(list);
}
 
int list_add(void* data, int pos, list_t** list) {
    list_t* new;
    list_t* curr;
    int status;
    int empty;
    int size;
 
    size = list_size(*list);
    printf("Size: %d\n", size);
    status = __list_check_null(*list);
    if(pos == 0)
        status = list_prepend(data, list);
    else if(pos >= size)
        status = list_append(data, list);
    else if(status != -1) {
        empty = list_is_empty(*list);
        if(empty) {
            new = __list_alloc();
            curr = __list_get_nth(*list,
                    pos - 1);
            if(new && curr) {
                new -> data = data;
                new -> next = curr -> next;
                curr -> next = new;
                status = 0;
            }
            else
                status = -1;
        }
        else {
            (*list) -> data = data;
            status = 0;
        }   
    }
 
    return status;
}
 
int list_prepend(void* data, list_t** list) {
    list_t* new;
    int status;
    int empty;
 
    status = __list_check_null(*list);
    if(status != -1) {
        empty = list_is_empty(*list);
        if(empty) {
            new = __list_alloc();
            if(new) {
                new -> data = data;
                new -> next = *list;
                *list = new;
                status = 0;
            }
            else
                status = -1;
        }
        else {
            (*list) -> data = data;
            status = 0;
        }
    }
 
    return status;
}
 
int list_append(void* data, list_t** list) {
    list_t* curr;
    list_t* new;
    int status;
    int empty;
 
    status = __list_check_null(*list);
    if(status != -1) {
        empty = list_is_empty(*list);
        if(empty) {
            new = __list_alloc();
            curr = __list_get_nth(*list, list_size(*list));
            if(new && curr) {
                new -> data = data;
                curr -> next = new;
                status = 0;
            }
            else
                status = -1;
        }
        else {
            (*list) -> data = data;
            status = 0;
        }
    }
 
    return status;
}
 
int list_traverse(list_t* list, void (*func) (void* data)) {
    list_t* curr;
    int status = 0;
 
    status = __list_check_null(list);
    if(status != -1) {
        curr = list;
        while(curr) {
            func(curr -> data);
            curr = curr -> next;
        }
    }
 
    return status;
}
 
static list_t* __list_alloc(void) {
    list_t* list;
 
    list = malloc(sizeof(list_t));
    if(!list)
        fprintf(stderr, "Allocation error.\n");
 
    return list;
}
 
static int __list_check_null(list_t* list) {
    int status = 0;
 
    if(!list) {
        fprintf(stderr, "NULL pointer.\n");
        status = -1;
    }
 
    return status;
}
 
static list_t* __list_get_nth(list_t* list, int n) {
    list_t* nth;
    int pos;
 
    pos = 0;
    nth = list;
    while(nth && nth -> next && pos != n) {
        pos++;
        nth = nth -> next;
    }
 
    return nth;
}
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2017, 12:11
Ответы с готовыми решениями:

Односвязный список (псевдокод) - поменять два элемента местами (посмотреть, правильно ли написан код)
Дан односвязный список 0...9 Дан указатель на первый элемент - p Поменять...

Переделать двусвязный список в односвязный список
//--------------------------------------------------------------------------- ...

Односвязный список
Вопрос может не по теме и не для форума, но я задам. Решил написать на СИ...

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

Односвязный список и файл
Всем привет. При написании программы реализующей создание записей о заказчиках...

18
CoderHuligan
811 / 536 / 201
Регистрация: 30.06.2015
Сообщений: 2,996
Записей в блоге: 13
17.10.2017, 13:59 2
Цитата Сообщение от si1n3rd Посмотреть сообщение
Принимается любая критика
Первое что увидел это знак подчёркивания в именах, который находится впереди. Это запрещено вроде бы стандартом, так нельзя делать.

Добавлено через 1 минуту
Исправь это, а потом будем смотреть остальное.
1
si1n3rd
42 / 41 / 17
Регистрация: 27.04.2016
Сообщений: 158
17.10.2017, 14:37  [ТС] 3
Поправил, не знал об этом. Стандарт действительно это запрещает.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// list.h
 
#ifndef LIST_H
#define LIST_H
 
typedef struct list list_t;
 
struct list {
    void* data;
    list_t* next;
};
 
list_t* list_create(void);
int list_init(list_t* list);
int list_size(list_t* list);
int list_is_empty(list_t* list);
int list_add(void* data, int pos, list_t** list);
int list_prepend(void* data, list_t** list);
int list_append(void* data, list_t** list);
int list_get(list_t* list, int pos, void** data);
int list_traverse(list_t* list, void (*func) (void* data));
 
#endif // LIST_H
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
// list.c
 
#include "list.h"
 
#include "stdio.h"
#include "stdlib.h"
 
static list_t* list_alloc(void);
static int list_check_null(list_t* list);
static list_t* list_get_nth(list_t* list, int n);
 
list_t* list_create(void) {
    return list_alloc();
}
 
int list_init(list_t* list) {
    int status;
 
    status = list_check_null(list);
    if(status != -1) {
        list -> data = NULL;
        list -> next = NULL;
    }
 
    return status;
}
 
int list_size(list_t* list) {
    list_t* curr;
    int status;
    int size = -1;
    
    status = list_check_null(list);
    if(status != -1) {
        size = 0;
        curr = list;
        while(curr && curr -> data) {
            size++;
            curr = curr -> next;
        }
    }
 
    return size;
}
 
int list_is_empty(list_t* list) {
    return list_size(list);
}
 
int list_add(void* data, int pos, list_t** list) {
    list_t* new;
    list_t* curr;
    int status;
    int empty;
    int size;
 
    size = list_size(*list);
    printf("Size: %d\n", size);
    status = list_check_null(*list);
    if(pos == 0)
        status = list_prepend(data, list);
    else if(pos >= size)
        status = list_append(data, list);
    else if(status != -1) {
        empty = list_is_empty(*list);
        if(empty) {
            new = list_alloc();
            curr = list_get_nth(*list,
                    pos - 1);
            if(new && curr) {
                new -> data = data;
                new -> next = curr -> next;
                curr -> next = new;
                status = 0;
            }
            else
                status = -1;
        }
        else {
            (*list) -> data = data;
            status = 0;
        }   
    }
 
    return status;
}
 
int list_prepend(void* data, list_t** list) {
    list_t* new;
    int status;
    int empty;
 
    status = list_check_null(*list);
    if(status != -1) {
        empty = list_is_empty(*list);
        if(empty) {
            new = list_alloc();
            if(new) {
                new -> data = data;
                new -> next = *list;
                *list = new;
                status = 0;
            }
            else
                status = -1;
        }
        else {
            (*list) -> data = data;
            status = 0;
        }
    }
 
    return status;
}
 
int list_append(void* data, list_t** list) {
    list_t* curr;
    list_t* new;
    int status;
    int empty;
 
    status = list_check_null(*list);
    if(status != -1) {
        empty = list_is_empty(*list);
        if(empty) {
            new = list_alloc();
            curr = list_get_nth(*list, list_size(*list));
            if(new && curr) {
                new -> data = data;
                curr -> next = new;
                status = 0;
            }
            else
                status = -1;
        }
        else {
            (*list) -> data = data;
            status = 0;
        }
    }
 
    return status;
}
 
int list_get(list_t* list, int pos, void** data) {
    list_t* find;
    int status;
    int empty;
 
    status = list_check_null(list);
    if(status != -1) {
        empty = list_is_empty(list);
        if(empty) {
            find = list_get_nth(list, pos);
            *data = find -> data;
            status = 0;
        }
        else
            status = -1;
    }
    else
        status = -1;
 
    return status;
}
 
int list_traverse(list_t* list, void (*func) (void* data)) {
    list_t* curr;
    int status = 0;
 
    status = list_check_null(list);
    if(status != -1) {
        curr = list;
        while(curr) {
            func(curr -> data);
            curr = curr -> next;
        }
    }
 
    return status;
}
 
static list_t* list_alloc(void) {
    list_t* list;
 
    list = malloc(sizeof(list_t));
    if(!list)
        fprintf(stderr, "Allocation error.\n");
 
    return list;
}
 
static int list_check_null(list_t* list) {
    int status = 0;
 
    if(!list) {
        fprintf(stderr, "NULL pointer.\n");
        status = -1;
    }
 
    return status;
}
 
static list_t* list_get_nth(list_t* list, int n) {
    list_t* nth;
    int pos;
 
    pos = 0;
    nth = list;
    while(nth && nth -> next && pos != n) {
        pos++;
        nth = nth -> next;
    }
 
    return nth;
}
0
si1n3rd
42 / 41 / 17
Регистрация: 27.04.2016
Сообщений: 158
18.10.2017, 15:57  [ТС] 4
Тема актуальна, прошу вашей оценки
0
likehood
984 / 828 / 396
Регистрация: 25.12.2016
Сообщений: 2,727
Завершенные тесты: 3
18.10.2017, 17:53 5
В функции list_is_empty видимо опечатка, не хватает знака !
C
1
return ! list_size(list);
Добавлено через 3 минуты
Ещё странно выглядит printf в функции list_add. Видимо раньше использовалось для отладки, но теперь уже можно убрать.

Добавлено через 1 минуту
Ну и по стилю. Обычно звёздочки в указателях пишут вплотную к переменным, а не типам.
Например list_t **list вместо list_t** list. Хотя это скорее дело вкуса и ошибкой не является.
1
si1n3rd
42 / 41 / 17
Регистрация: 27.04.2016
Сообщений: 158
18.10.2017, 18:11  [ТС] 6
likehood, благодарю за комментарии. А что можете сказать насчет уровня вложенности, размеров функций и вообще общей логики?
0
tmpValue
41 / 74 / 15
Регистрация: 04.10.2017
Сообщений: 284
18.10.2017, 21:33 7
Цитата Сообщение от likehood Посмотреть сообщение
Обычно звёздочки в указателях пишут вплотную к переменным, а не типам.
Неправда. Встречается все три возможные варианта. Я вообще привык в декларациях писать так: type_t * nameOfBound.

Добавлено через 13 минут
si1n3rd, размер лучше хранить. Иначе он будет постоянно высчитываться. А так доступ О(1) за всего 4 байта. Смотри:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct node node_t;
typedef struct node_t * node_ptr;
typedef struct list list_t;
 
struct node {
  void * value;
  struct node * next;
}
 
struct list {
  size_t size;
  node_ptr head;
}
Так мы строим интерфейсы, которые на вход принимают тип list_t (или list_ptr), а внутри себя работают с типом node_t, node_ptr. Реализация интерфейса "получить размер списка" становится не востребованной. Ну или инлайнится:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
typedef struct node node_t;
typedef node_t * node_ptr;
 
typedef struct list list_t;
typedef list_t * list_ptr;
 
struct node {
  void * value;
  struct node * next;
};
 
struct list {
  size_t size;
  node_ptr head;
};
 
/* Здесь префикс ML есть сокращение от My Library. */
inline size_t
MLSize (list_ptr l) {
  return l->size;
}
Добавлено через 12 минут
si1n3rd, интерфейс add не должен подразумевать позицию вставки. Традиционно список это есть стек. Вставка по-умолчанию подразумевается вместо головы, если не оговорено иначе. Так что для позиционной вставки я бы называл интерфейс иначе. Например addPos.
list_init генерирует ошибку в случае попытки инициализации значением NULL. Концептуально это не правильно. Наоборот, как раз инициализировать значением NULL и нужно, хотя ничто не мешает инициализировать нодой, а вот интерфейс list_create удаляем за ненадобностью. Вобщем, если пользователь желает передать NULL в list_init, ничего преступного в этом нет.
1
likehood
984 / 828 / 396
Регистрация: 25.12.2016
Сообщений: 2,727
Завершенные тесты: 3
18.10.2017, 21:35 8
Цитата Сообщение от tmpValue Посмотреть сообщение
Неправда. Встречается все три возможные варианта.
Если звёздочка ставится вплотную к типу, то при объявлении двух одинаковых указателей возникает стилистическая неоднородность:
C
1
int* p, *q;
Поэтому звёздочки лучше ставить вплотную к переменным, или же равноудалённо (хотя такой стиль встречается реже).

Но, повторюсь, это в конечном счёте дело вкуса.
1
tmpValue
41 / 74 / 15
Регистрация: 04.10.2017
Сообщений: 284
18.10.2017, 21:56 9
likehood, нормальная практика (ты же практикующий?) - декларация переменных на отдельной строке вместе с комментариями.
C
1
2
type_t foo; /* comment for foo */
type_t bar; /* comment for bar */
Ок. Завязываем флуд, мы друг друга поняли.

si1n3rd, интерфейс append подразумевает сцепку двух списков. Для добавления элемента в конец списка достаточно вызвать addPos(..., head.size + 1 ,...).

Цитата Сообщение от tmpValue Посмотреть сообщение
размер лучше хранить
это также избавит от необходимости в интерфейсе list_check_null.


не совсем понял задачу list_traverse. Это аналог map/foreach/forall?

list_alloc как для школьного уровня сойдет. По-хорошему нужен довольно емкий обработчик ошибок. И весь обвешенный ifdef'ами для разных целевых платформ соответственно. Сделай хотя бы несколько повторных попыток в слечае неудачи. С паузами и логами соответственно.
1
si1n3rd
42 / 41 / 17
Регистрация: 27.04.2016
Сообщений: 158
18.10.2017, 22:53  [ТС] 10
Цитата Сообщение от tmpValue Посмотреть сообщение
не совсем понял задачу list_traverse. Это аналог map/foreach/forall?
Да, он самый. Применяем функцию к каждому элементу списка.
Цитата Сообщение от tmpValue Посмотреть сообщение
list_alloc как для школьного уровня сойдет. По-хорошему нужен довольно емкий обработчик ошибок. И весь обвешенный ifdef'ами для разных целевых платформ соответственно.
А я раньше думал, что много if-elseif-else это плохо. Видимо, я ошибался. А можете подсказать какую-то литературу по проектированию кода? Интересует именно с использованием C, ибо остальные с C++, Java примерами идут с ООП. А я хочу разобраться с императивным подходом. Можно на английском
0
tmpValue
41 / 74 / 15
Регистрация: 04.10.2017
Сообщений: 284
19.10.2017, 03:27 11
Лучший ответ Сообщение было отмечено si1n3rd как решение

Решение

Цитата Сообщение от si1n3rd Посмотреть сообщение
А я раньше думал, что много if-elseif-else это плохо.
Я говорю о препроцессорных директивах. В юзабельных библиотеках из них как правило довольно смачная лапша получается.
Цитата Сообщение от si1n3rd Посмотреть сообщение
А можете подсказать какую-то литературу по проектированию кода? Интересует именно с использованием C
Боянистая книга с собакой. Вообще специфика языка обязывает. Так что потом сразу к практике. Сети, системщина, embedded на выбор. Есть новая, не читал, но оглавление обнадеживает. Пока что тебе хватит.

Добавлено через 3 минуты
Цитата Сообщение от si1n3rd Посмотреть сообщение
ибо остальные с C++, Java примерами идут с ООП. А я хочу разобраться с императивным подходом.
Со структурным ты хотел сказать. Одноименная статья Эдгара Дейсктры "Структурное программирование". Читал очень давно, не скажу чтобы много пользы и нее вынес.

Добавлено через 3 минуты
Цитата Сообщение от si1n3rd Посмотреть сообщение
Можно на английском
Всё уже давно переведено. Структурщина не тренд уже, наверное лет 40. Так что всё что есть ценного - довольно старенькое (это не значит плохое или не актуальное). Я смотрю CoderHuligan, на васике что-то разрабатывает. Может он больше полезных источников по структурщине подкинет.
1
CoderHuligan
811 / 536 / 201
Регистрация: 30.06.2015
Сообщений: 2,996
Записей в блоге: 13
19.10.2017, 12:59 12
Цитата Сообщение от si1n3rd Посмотреть сообщение
прошу вашей оценки
Нужен пример использования самой библиотеки, иначе нужно разбираться что где используется первым и т. д., а кто этим будет заниматься.
Цитата Сообщение от tmpValue Посмотреть сообщение
Я смотрю CoderHuligan, на васике что-то разрабатывает. Может он больше полезных источников по структурщине подкинет.
Есть много книг по конкретному языку, а вот книг с примерами конструирования практически нет, кроме Буча с его ООП. Есть работа -
"Adam Tornhill. Patterns in C. Patterns, Idioms and Design Principles. "
Есть ещё такая, но там используется язык си++. Однако примеры упрощены настолько, что позволяет понять и и пишущим на си: "http://gameprogrammingpatterns.com/contents.html"
1
si1n3rd
42 / 41 / 17
Регистрация: 27.04.2016
Сообщений: 158
19.10.2017, 13:20  [ТС] 13
CoderHuligan, за книги спасибо, посмотрю.
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Нужен пример использования самой библиотеки, иначе нужно разбираться что где используется первым и т. д., а кто этим будет заниматься.
Ок, когда приведу в порядок имеющейся код, то напишу в этой теме
0
easybudda
Модератор
Эксперт CЭксперт С++
10209 / 6108 / 1536
Регистрация: 25.07.2009
Сообщений: 11,610
21.10.2017, 03:26 14
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Первое что увидел это знак подчёркивания в именах, который находится впереди. Это запрещено вроде бы стандартом, так нельзя делать.
Цитата Сообщение от si1n3rd Посмотреть сообщение
Стандарт действительно это запрещает.
Это вы где такое вычитали?
An identifier is a sequence of nondigit characters (including the underscore _, the
lowercase and uppercase Latin letters, and other characters) and digits, which designates
one or more entities as described in 6.2.1.
Committee Draft — April 12, 2011 6.4.2.1.2
0
CoderHuligan
811 / 536 / 201
Регистрация: 30.06.2015
Сообщений: 2,996
Записей в блоге: 13
21.10.2017, 11:48 15
Цитата Сообщение от easybudda Посмотреть сообщение
Это вы где такое вычитали?
Это касается предопределённых и зарезервированных идентификаторов, которые начинаются со знака подчёркивания:

7.1.3 Reserved identifiers

1 Each header declares or defines all identifiers listed in its associated subclause, and
optionally declares or defines identifiers listed in its associated future library directions
subclause and identifiers which are always reserved either for any use or for use as file
scope identifiers.

— All identifiers that begin with an underscore and either an uppercase letter or another
underscore are always reserved for any use.

— All identifiers that begin with an underscore are always reserved for use as identifiers
with file scope in both the ordinary and tag name spaces.

— Each macro name in any of the following subclauses (including the future library
directions) is reserved for use as specified if any of its associated headers is included;
unless explicitly stated otherwise (see 7.1.4).

— All identifiers with external linkage in any of the following subclauses (including the
future library directions) are always reserved for use as identifiers with external
linkage.157)

— Each identifier with file scope listed in any of the following subclauses (including the
future library directions) is reserved for use as a macro name and as an identifier with
file scope in the same name space if any of its associated headers is included.
1
si1n3rd
42 / 41 / 17
Регистрация: 27.04.2016
Сообщений: 158
21.10.2017, 12:18  [ТС] 16
Цитата Сообщение от easybudda Посмотреть сообщение
Это вы где такое вычитали?
Не то, чтобы запрещает, но явно на это указывает. CoderHuligan, привел источник на который я опирался.
0
easybudda
Модератор
Эксперт CЭксперт С++
10209 / 6108 / 1536
Регистрация: 25.07.2009
Сообщений: 11,610
21.10.2017, 14:31 17
Цитата Сообщение от CoderHuligan Посмотреть сообщение
которые начинаются со знака подчёркивания
... и заглавной буквы, или двух знаков подчёркивания.
А из
Цитата Сообщение от CoderHuligan Посмотреть сообщение
— All identifiers that begin with an underscore are always reserved for use as identifiers
with file scope in both the ordinary and tag name spaces.
следует, что к примеру
C
1
static _myfunc(void);
вполне себе ликвидное объявление...

Ну наверное можно от греха подальше вообще никогда никакие имена не начинать со знака подчёркивания. Но выражение "стандарт запрещает" никаких вариантов допускать не должно. Или однозначно запрещает, или нет.
0
CoderHuligan
811 / 536 / 201
Регистрация: 30.06.2015
Сообщений: 2,996
Записей в блоге: 13
21.10.2017, 15:23 18
Цитата Сообщение от easybudda Посмотреть сообщение
выражение "стандарт запрещает" никаких вариантов допускать не должно. Или однозначно запрещает, или нет.
Стандарт "резервирует" на будущее. Конечно лучше не использовать такие имена чтобы в будущем не напороться на грабли.
0
tmpValue
41 / 74 / 15
Регистрация: 04.10.2017
Сообщений: 284
21.10.2017, 15:54 19
Лучший ответ Сообщение было отмечено si1n3rd как решение

Решение

Эти выдержки адресованы в первую очередь авторам компиляторов. Так что решайте сами, насколько есть желание напороться на потенциальный конфликт собственных идентификаторов с библиотечными.
1
21.10.2017, 15:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2017, 15:54

Прошить односвязный список указателями
Задание гласит: Организовать список, содержащий символы текста. Прошить этот...

Создать односвязный список из структур
Помогите пожалуйста..Сколько читаю ничего не понимаю(Большинство с...

Односвязный список, ошибка вывода
не пойму почему не работает вывод? пишет ошибку,якобы я залезаю в...


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

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

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