Pull to refresh

Comments 26

Автор, возможно, хотел сказать, что в структуры он поместил указатели на будущие методы. Потому что структуры в Си НЕ МОГУТ содержать функции!

Да автор вообще что-то странное написал, я вот в последний абзац вообще не понял, что значит вопрос "где хранятся ссылки на адреса ячеек памяти?" Похоже автор что-то нахватал по верхам, но до конца не понял, и теперь у него в голове смешались в кучу имена переменных, адреса и ссылки.

UFO just landed and posted this here
UFO just landed and posted this here

Я по своей глупости слово "ссылка" использовал как синоним "адрес". Спасибо за комментарии)

Вот и настало то время, когда компилируемый язык без сборки мусора, это хаб "ненормальное программирование"

Все структуры объявлены по два раза, память под барьеры почему не переиспользуется, а выделяется всегда больше. Все структуры всегда аллцируются на куче — не надо так. Про поток сознания из последнего абзаца вообще сказать нечего

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

Для перебора ряда данных (одномерный массив) берется адрес первого элемента, а затем в цикле (с шагом = размер типа данных) осуществляется переход на следующий адрес.

int n = 10;
int step = sizeof(Barrier);
Barrier* barrier = malloc(step * n);
for (int i = 0; i < n; i += step) {
    *(barrier + i) = data;
}

Простите, что?!


Во-первых, в арифметике указателей уже учитывается размер типа данных, например, прибавление 1 к указателю типа int* прибавит sizeof(int).


Во-вторых,


for (int i = 0; i < n; i++) {
    barrier[i] = data;
}

i[barrier] = data, тоже подойдет… Поэтому, в принципе, у автора там верно.

а может поэтому это ненормальное программирование?
может это такой юмор?

Потому что так по стандарту, адрес элемента массива ничто иное, как i + barrier, а потому без разницы как обращаться barrier + i, т. е. barrier[i] или i + barrier, т. е i[barrier]. Это не юмор, это Си.

Я не хотел говорить об арифметике указателей, мне хотелось рассказать про то, как это как это работает внутри.
Спасибо за комментарии)

Приведённый выше Ваш код просто некорректный странно, что приложение не падает (или падает?), так как происходит выход за пределы выделенной памяти.

По-моему, вы мало что узнали, но запутались окончательно. Например, в Си вообще нет ссылок, только указатели. Лучше, все таки вначале, что то почитать.

За С обидно.
Отхватил люлей и за то что сам мусор не удаляет и массивы у него размер не меняют.
В свое время я его в школе учил, наверное, не плохо бы это в принудительном порядке делать, чтобы люди с низким уровнем знакомились

В ассемблере любая переменная хранит как ссылку на ячейку памяти, так и значение, которое в ней хранится.

Переменная может и в регистре храниться.
Эх, всё-таки нас правильно учили: сначала устройство компьютера, потом ассемблер, потом С, потом С++, и только потом всякие джавы. А нет, вру, сначала были алгоритмы и структуры данных. Т.е. знакомили с основ, постепенно повышая уровень абстракции.

А теперь не знают ничего ни про регистры, ни про устройство памяти, ни что такое реальный\защищенный режим. Начинают сразу с джаваскрипта, а С\С++ — это уже «сложно-непонятно» и позорятся незнанием.
У меня на первом курсе с самого начала параллельно давали знания о булевой алгебре и физике логических элементов. На 3 курсе лаба была — на fpga свой процессор сделать. А там еще и сети были, и всякие цифро-аналоговые системы, системное программирование, схемотехника, теорверы и прочее.

Были ли полезны эти знания в работе непосредственно — нет. Помогло ли в обучении реально используемым вещам — очень даже.

Написать шейдер для unity 3d — без проблем. Навалять скриптик на python — легко. Распределенная приложуха на aws — дайте документацию, будет готово к вечеру. Написать прототип на embedded проект — вообще не напрягаясь.

Такая солянка в универе напрочь отбила любой страх обучению новому и дала гибкость. Даже банальная «чуйка» выработалась — базовые вещи уже на уровне инстинктов отложились, и часто пробелы в конкретных вещах компенсируются умением быстро докопаться к истине.

За 7 лет работы в на самых разнообразных проектах не возникало трудностей от слова совсем, и не потому что я знаю все на свете, а потому что научили учится.
потом С, потом С++, и только потом всякие джавы.

Не троллинга ради, а интересных мыслей получения для: какой сакральный смысл в этой цепочки у С++? Да, на нем много всякого прикладного понаписано, но ведь при необходимости к нему вполне можно будет вернуться без потерь, нарушив озвученный порядок. Он ведь не даст каких-то сакральных знаний в сравлении с той же Java, это будет еще одна имплементация того же ООП.
логично же: сначала процедурное программирование, потом ООП, а потом на выбор что заинтересует
Не логично учить ООП через C++. Язык имеет достаточно отличий от C, чтобы не отдавать ему приоритет на фоне остальных С-подобных. Он объективно сложен, причем победа над этой сложностью не дает преимущества при освоении других языков и технологий впоследствии.
Да, почему-то нередко ООП в С++ представляют «каноничным», «таким, какой должен быть», при этом ругая джаву. А вот лично мне он видится там страшным костылём.
Хотя, что ожидать от человека (меня), который начал с ZX бейсика и ассемблера, а в «настоящие компьютеры» вошел с изучением Perl, Java и PHP (да-да, все версии 4ые)…

А я узнал, что существительное "длина" может писаться как с одной, так и с двумя "н". По-видимому в зависимости от того, насколько длинна эта длина. Интересно, если ли версия с тремя "н"?

Да, а еще жираф — это длинношеее животное с тремя буквами "е", следующими подряд :)

Sign up to leave a comment.

Articles

Change theme settings