- 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;
Нам всем ужасно интересно, что это за девайсы такие?
Строки 12-15 вместо lst = tmp чисто ради того, чтобы не удалять malloc'нутый кусок через delete[]?
P.S. Я бы все-таки поюзал std::vector...
P.P.S. А еще можно было бы сделать какой-нибудь device_info_iterator, возвращающий по одной инфе об устройстве за раз :)
http://www.codingstandard.com/section/8-1-type-names/
Всего лишь в том, что я не заметил еще один признак крестов, помимо new[] и delete[], в этом коде :)
В остальном же этот код обычная сишка (ну ок, С99, т.к. объявление переменной в цикле).
Я даже не помню зачем я это делал - наверно чтобы удалять именно через delete[].
Тогда как-то так, в оригинале же на это проверки не было:
Примем, что realloc() всегда возвращает tmp. Тогда можно не присваивать его значение в tmp, ибо оно есть постоянно.
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.
указатель на void, а это совсем другое
проплачено госдепом!
вместо того, чтобы насоветовать человеку разобраться с декомпозицией и инкапсуляцией, ты его ещё больше сваливаешь в рутину ручного заката солнца - чтобы тактика съела вообще всю стратегию
лично мое мнение, что написать хорошую программу на С ничуть не легче, и скорее всего, ещё даже сложнее, чем хорошую программу на С++
при этом она будет отличаться явными чертами ООП (привет, ООП-ненавистники), но заодно содержать кучу низкоуровневого кода, засоряющего эфир - т.е. она будет более трудоёмка
классы пригодятся в любом языке, даже в прости господи дельфях
ну а без контейнеров - что, постоянно юзать сишные массивы или велосипедить списки? или сразу забить на std::string - "поебись ка сперва, как наши деды поеблись"!
про буст тут пока что никто и не заикается
человек посмотрит на эту унылость и съебёт в сишарп, скажет спасибо досвиданья
Нет, тонкие моменты. Думаю я до сих пор не все знаю. А если ты сейчас меня попросишь назвать все тонкие моменты - я все не вспомню.
так ведь скатертью дорожка :)
Есть люди, которым хочется работать с технологией Blurb, а есть те, кому не хочется (+те, кому не хочется, но заставляют, но мы пока их не рассматриваем). Я прекрасно понимаю людей, которым не нравится писать на крестах/сишке. Зачем истязать себя и окружающих? Нужно заниматься тем, что приносит удовольствие.
У вас детская трамва и комплекс неполноценности? Хотите об этом поговорить?
Обратитесь к M-x doctor
А вы хотели поговорить о неполноценности?)
На дельфях.
Как это могло бы быть для него важным или не важным, если бы его не было?
С какой то точки зрения что то имеет смысл, с другой - ничего не имеет и все эти точки зрения правы.
Ссылка на самого себя не спасёт от зловещего GC...
Пока тебя и твои слова помнят другие люди - ты еще не умер ;)
Тебя случайно не из будущего к нам закинули, мсье Терминатор Кёгдан?
Вспомнил, как один 27 летний ебень учил меня уму-разуму: никогда не спорь ни с кем, просто делай то, что тебе хочется.
Гугли, разрешаю
p/s
будешь дерзить - на металлолом сдам.
Какой Кьеркегор )))
>сейчас не важно
Это так не работает. Мысль принято доносить.
Нет, это слабая ссылка.
> не знаешь плюсы - не программист
я имел в виду, что в плюсах очень много возможностей, некоторые из которых откровенно неудачны или унаследованы от сишки и плохо согласуются с остальным языком. Поэтому написать utter crap на плюсах без должного опыта и дисциплины очень просто. Некоторые вещи могут на первый вгляд выглядеть хорошей мыслью (вроде throws деклараций), но на самом деле вредны. Поэтому чем меньше неосведомлённые о подводных камнях люди будут писать на крестах, тем меньше потом разгребать.
Тарас же сказал: это как армия и её нужно пройти чтобы быть настоящим мужикомпрограммистом.
ну а где тут особая рахитектура-то
Считываем неизвестное кол-во объектов в память и работаем с ними. Никакой рахитектуры, просто незнание стандартных идиом работы с контейнерами и объектами. Без приличной литературы ведь всё равно будет что-то вроде
1. где класс Device, у которого есть open, close, readinfo
2. почему девайсы тупо перенумерованы - уже странновато (могу предположить, что это, например, N устройств на rs-485 линии, или ip-устройства с адресом [base_ip + i])
3. что произойдет дальше с девайсом? с ним работать кто-то собирается? т.е. его надо будет снова открывать, но уже для работы? неоправданные тормоза
4. (со звёздочкой) девайс - по умолчанию сущность асинхронная, потому их бы желательно параллельно независимо попердолить, асихронно собирая результат об ответе или неответе на что-либо - сейчас я вангую, что если очередной девайс не отвечает, то все будут сосать в очереди, пока не наступит таймаут этого девайса - а он, допустим, 1..10 секунд
p.s. пациент уже знает про ссылки, так что сможет передать вектор уж не по указателю
2, 3. Ждём ответа от топикстартера
4. Да, из общих соображений асинхронность при опросе устройств бы не помешала. С другой стороны, если "девайсы" лежат где-то на HDD (в моей либе у меня FAT-like файлы назывались девайсами), то профита от неё никакого.
2. Нумерация - честно, хрен его знает, брал с примера от вендора. Поищи L-Card E-154, найдешь. Подрубается оно по USB.
3. Да, потом будет использоваться только один.
Впрочем, на практике получение всего списка будет использоваться только один раз, чтобы увидеть серийники доступных АЦП и вбить нужный в настройки программы. Хотя похожий перебор используется для поиска девайса по серийнику, так как VIP/PID у них у всех одинаковые.
4. Асинхронности в открытии вроде нема, или я её не увидел, только при сборе данных. Всё по старинке, всё синхронно.
Какой же он класс, если вся работа с ним ведется по-сишному, внешними функциями... Он больше на какой-то хендл похож...
А код, который я привел - кишки моей объектной обертки.
Ага, именно их.
> А код, который я привел - кишки моей объектной обертки.
Понятно.
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.