- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
int enumDevices(DevInfo* &lst) {
int count = 0;
DevInfo* tmp = NULL;
Device device;
for (int i = 0; i < MAXDEVICES; i++)
if (device = OpenDevice(i)) {
count++;
realloc(tmp, sizeof(DevInfo)*count);
ReadInfo(device, &tmp[count-1]
}
if (count == 0) return 0;
lst = new DevInfo[count];
for (int i = 0; i < count; i++)
lst[i] = tmp[i];
free(tmp);
return count;
}
//................
DevInfo* list;
int devcount = enumDevices(list);
/* работаем со списком */
delete[] list;
Vindicar 06.01.2014 14:02 # +5
roman-kashitsyn 07.01.2014 00:36 # +2
Нам всем ужасно интересно, что это за девайсы такие?
Vindicar 07.01.2014 16:14 # 0
bormand 06.01.2014 14:07 # +2
Строки 12-15 вместо lst = tmp чисто ради того, чтобы не удалять malloc'нутый кусок через delete[]?
P.S. Я бы все-таки поюзал std::vector...
P.P.S. А еще можно было бы сделать какой-нибудь device_info_iterator, возвращающий по одной инфе об устройстве за раз :)
govnomonad 06.01.2014 15:44 # +6
bormand 06.01.2014 15:45 # 0
roman-kashitsyn 06.01.2014 23:43 # +3
http://www.codingstandard.com/section/8-1-type-names/
Stertor 06.01.2014 23:50 # −4
bormand 07.01.2014 07:57 # +2
Всего лишь в том, что я не заметил еще один признак крестов, помимо new[] и delete[], в этом коде :)
В остальном же этот код обычная сишка (ну ок, С99, т.к. объявление переменной в цикле).
Vindicar 06.01.2014 17:48 # 0
Я даже не помню зачем я это делал - наверно чтобы удалять именно через delete[].
bormand 06.01.2014 18:00 # +2
bormand 06.01.2014 18:06 # 0
bormand 06.01.2014 18:14 # +1
Vindicar 06.01.2014 18:21 # +1
bormand 06.01.2014 18:24 # +1
bormand 06.01.2014 18:21 # 0
Vindicar 07.01.2014 16:16 # 0
bormand 07.01.2014 16:28 # +1
Тогда как-то так, в оригинале же на это проверки не было:
Vindicar 07.01.2014 16:36 # +1
Bart 06.01.2014 17:58 # +3
Примем, что realloc() всегда возвращает tmp. Тогда можно не присваивать его значение в tmp, ибо оно есть постоянно.
bormand 06.01.2014 18:02 # +5
Vindicar 06.01.2014 18:18 # 0
bormand 06.01.2014 18:19 # +1
bormand 06.01.2014 18:32 # +1
Synopsis Description
2. The realloc function deallocates the old object pointed to by ptr and returns a pointer to a new object that has the size specified by size. The contents of the new object shall be the same as that of the old object prior to deallocation, up to the lesser of the new and old sizes. Any bytes in the new object beyond the size of the old object have indeterminate values.
3. If ptr is a null pointer, the realloc function behaves like the malloc function for the specified size. Otherwise, if ptr does not match a pointer earlier returned by the calloc, malloc, or realloc function, or if the space has been deallocated by a call to the free or realloc function, the behavior is undefined. If memory for the new object cannot be allocated, the old object is not deallocated and its value is unchanged.
Returns
4. The realloc function returns a pointer to the new object (which may have the same value as a pointer to the old object), or a null pointer if the new object could not be allocated.
Bart 06.01.2014 19:44 # 0
roman-kashitsyn 06.01.2014 20:16 # +1
указатель на void, а это совсем другое
Vindicar 07.01.2014 16:16 # 0
bormand 07.01.2014 16:29 # 0
roman-kashitsyn 06.01.2014 20:22 # +6
defecate-plusplus 06.01.2014 20:36 # +8
проплачено госдепом!
roman-kashitsyn 06.01.2014 21:01 # +6
defecate-plusplus 06.01.2014 21:17 # +4
вместо того, чтобы насоветовать человеку разобраться с декомпозицией и инкапсуляцией, ты его ещё больше сваливаешь в рутину ручного заката солнца - чтобы тактика съела вообще всю стратегию
лично мое мнение, что написать хорошую программу на С ничуть не легче, и скорее всего, ещё даже сложнее, чем хорошую программу на С++
при этом она будет отличаться явными чертами ООП (привет, ООП-ненавистники), но заодно содержать кучу низкоуровневого кода, засоряющего эфир - т.е. она будет более трудоёмка
LispGovno 06.01.2014 21:26 # 0
defecate-plusplus 06.01.2014 21:36 # +3
классы пригодятся в любом языке, даже в прости господи дельфях
ну а без контейнеров - что, постоянно юзать сишные массивы или велосипедить списки? или сразу забить на std::string - "поебись ка сперва, как наши деды поеблись"!
про буст тут пока что никто и не заикается
человек посмотрит на эту унылость и съебёт в сишарп, скажет спасибо досвиданья
LispGovno 06.01.2014 21:39 # 0
Нет, тонкие моменты. Думаю я до сих пор не все знаю. А если ты сейчас меня попросишь назвать все тонкие моменты - я все не вспомню.
defecate-plusplus 06.01.2014 21:41 # +4
roman-kashitsyn 06.01.2014 21:40 # +3
так ведь скатертью дорожка :)
anonimb84a2f6fd141 07.01.2014 00:49 # −1
roman-kashitsyn 07.01.2014 00:57 # 0
kegdan 07.01.2014 00:59 # 0
anonimb84a2f6fd141 07.01.2014 01:02 # −1
roman-kashitsyn 07.01.2014 01:06 # +1
Есть люди, которым хочется работать с технологией Blurb, а есть те, кому не хочется (+те, кому не хочется, но заставляют, но мы пока их не рассматриваем). Я прекрасно понимаю людей, которым не нравится писать на крестах/сишке. Зачем истязать себя и окружающих? Нужно заниматься тем, что приносит удовольствие.
kegdan 07.01.2014 01:20 # +2
roman-kashitsyn 07.01.2014 01:22 # −1
У вас детская трамва и комплекс неполноценности? Хотите об этом поговорить?
Обратитесь к M-x doctor
kegdan 07.01.2014 01:24 # +1
А вы хотели поговорить о неполноценности?)
Stertor 07.01.2014 01:36 # −1
kegdan 07.01.2014 01:39 # 0
Stertor 07.01.2014 01:44 # −1
На дельфях.
kegdan 07.01.2014 01:48 # 0
Stertor 07.01.2014 01:54 # −1
kegdan 07.01.2014 02:00 # +2
Stertor 07.01.2014 02:01 # 0
Abbath 07.01.2014 19:42 # 0
anonimb84a2f6fd141 07.01.2014 02:24 # −1
roman-kashitsyn 07.01.2014 09:14 # +1
kegdan 07.01.2014 09:23 # 0
bormand 07.01.2014 09:43 # +2
Как это могло бы быть для него важным или не важным, если бы его не было?
kegdan 07.01.2014 10:02 # 0
С какой то точки зрения что то имеет смысл, с другой - ничего не имеет и все эти точки зрения правы.
bormand 07.01.2014 10:03 # +2
Ссылка на самого себя не спасёт от зловещего GC...
Пока тебя и твои слова помнят другие люди - ты еще не умер ;)
kegdan 07.01.2014 12:00 # 0
Stertor 07.01.2014 12:02 # −1
Тебя случайно не из будущего к нам закинули, мсье Терминатор Кёгдан?
Вспомнил, как один 27 летний ебень учил меня уму-разуму: никогда не спорь ни с кем, просто делай то, что тебе хочется.
kegdan 07.01.2014 12:04 # 0
Гугли, разрешаю
Stertor 07.01.2014 12:07 # −1
p/s
будешь дерзить - на металлолом сдам.
kegdan 07.01.2014 12:16 # −2
Abbath 07.01.2014 19:46 # −2
3.14159265 07.02.2018 19:24 # 0
Какой Кьеркегор )))
g0_1494089156986 09.02.2018 00:29 # 0
Abbath 07.01.2014 19:45 # −1
>сейчас не важно
Это так не работает. Мысль принято доносить.
Lure Of Chaos 07.01.2014 21:27 # +2
Нет, это слабая ссылка.
Abbath 07.01.2014 19:44 # −1
roman-kashitsyn 07.01.2014 11:25 # 0
> не знаешь плюсы - не программист
я имел в виду, что в плюсах очень много возможностей, некоторые из которых откровенно неудачны или унаследованы от сишки и плохо согласуются с остальным языком. Поэтому написать utter crap на плюсах без должного опыта и дисциплины очень просто. Некоторые вещи могут на первый вгляд выглядеть хорошей мыслью (вроде throws деклараций), но на самом деле вредны. Поэтому чем меньше неосведомлённые о подводных камнях люди будут писать на крестах, тем меньше потом разгребать.
kegdan 07.01.2014 12:01 # 0
Abbath 07.01.2014 19:40 # 0
LispGovno 06.01.2014 21:42 # +1
Тарас же сказал: это как армия и её нужно пройти чтобы быть настоящим мужикомпрограммистом.
Stertor 06.01.2014 21:44 # −6
LispGovno 06.01.2014 21:45 # +1
anonimb84a2f6fd141 07.01.2014 00:50 # −2
Stertor 07.01.2014 01:48 # −1
kegdan 07.01.2014 00:48 # +1
Abbath 07.01.2014 19:37 # 0
roman-kashitsyn 07.01.2014 22:46 # 0
bormand 07.01.2014 22:57 # +1
defecate-plusplus 07.01.2014 23:17 # +1
roman-kashitsyn 06.01.2014 21:59 # 0
ну а где тут особая рахитектура-то
Считываем неизвестное кол-во объектов в память и работаем с ними. Никакой рахитектуры, просто незнание стандартных идиом работы с контейнерами и объектами. Без приличной литературы ведь всё равно будет что-то вроде
defecate-plusplus 07.01.2014 00:22 # 0
1. где класс Device, у которого есть open, close, readinfo
2. почему девайсы тупо перенумерованы - уже странновато (могу предположить, что это, например, N устройств на rs-485 линии, или ip-устройства с адресом [base_ip + i])
3. что произойдет дальше с девайсом? с ним работать кто-то собирается? т.е. его надо будет снова открывать, но уже для работы? неоправданные тормоза
4. (со звёздочкой) девайс - по умолчанию сущность асинхронная, потому их бы желательно параллельно независимо попердолить, асихронно собирая результат об ответе или неответе на что-либо - сейчас я вангую, что если очередной девайс не отвечает, то все будут сосать в очереди, пока не наступит таймаут этого девайса - а он, допустим, 1..10 секунд
p.s. пациент уже знает про ссылки, так что сможет передать вектор уж не по указателю
roman-kashitsyn 07.01.2014 00:43 # 0
2, 3. Ждём ответа от топикстартера
4. Да, из общих соображений асинхронность при опросе устройств бы не помешала. С другой стороны, если "девайсы" лежат где-то на HDD (в моей либе у меня FAT-like файлы назывались девайсами), то профита от неё никакого.
Vindicar 07.01.2014 16:22 # 0
2. Нумерация - честно, хрен его знает, брал с примера от вендора. Поищи L-Card E-154, найдешь. Подрубается оно по USB.
3. Да, потом будет использоваться только один.
Впрочем, на практике получение всего списка будет использоваться только один раз, чтобы увидеть серийники доступных АЦП и вбить нужный в настройки программы. Хотя похожий перебор используется для поиска девайса по серийнику, так как VIP/PID у них у всех одинаковые.
4. Асинхронности в открытии вроде нема, или я её не увидел, только при сборе данных. Всё по старинке, всё синхронно.
bormand 07.01.2014 16:46 # 0
Какой же он класс, если вся работа с ним ведется по-сишному, внешними функциями... Он больше на какой-то хендл похож...
Vindicar 07.01.2014 16:49 # 0
А код, который я привел - кишки моей объектной обертки.
bormand 07.01.2014 16:51 # 0
Ага, именно их.
> А код, который я привел - кишки моей объектной обертки.
Понятно.
Abbath 07.01.2014 19:35 # +1
C++ was and is meant to be a tool for professionals and for people who takes programming seriously. Basically, C++ was not primarily designed for tasks of medium complexity, medium performance, and medium reliability, written by programmers of medium skills and experience.
bormand 06.01.2014 21:01 # +5
govnomonad 07.01.2014 09:43 # +2
Bart 07.01.2014 12:56 # +2
kegdan 07.01.2014 13:11 # 0