Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 12 13 14 15 16 17 18 19 [20] 21   вперед  Ctrl
 Re: Си и массив как аргумент функции  [new]
petrav
Member

Откуда:
Сообщений: 2118
a guest
petrav
пропущено...

В прямом смысле.
void f(int (*a)[3]) {}

int main(void)
{
    int a[3];
    f(&a);
}



Хороший пример, но нет:

void f(int (*a)[3]) {}

void ft()
{
    int a[3][3];
    f(a);
}

Тут мы в функцию подставляем двухмерный массив, а в функции получаем... ну мне лень формулировать. И так понятно.
23 май 20, 01:08    [22138042]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
booby
Member

Откуда:
Сообщений: 1940
rdb_dev,
(точку нет - нет не брал, но смысла это не меняет, хотя точка нет - костыль в крышке гроба визуальных бейсиков ((; )
типы ссылочные.
но для встроенных типов структура известна, и это позволяет работать
передаче по ссылке или значению.
Для пользовательских структур в классическом vb/vba передача по значению запрещена с выдачей ошибки времени компиляции при попытке заказа такой передачи.

строки - в переменной ссылка на первый символ в строке, сами символы двухбайтные.
строка заканчивается нулем, до сих пор всё как в си.
но перед первым символом сидит 32-разрядная длина строки.
Это позволяет всегда, независимо от места выделения строки (строки фиксированного размера - на стеке, остальные в куче) понять сколько надо копировать.
формируется новая строка со своим указателем, который и отдается в качестве параметра при вызове byval.

работает чисто и просто, автоматически обеспечивая самую дешевую из возможных
передачу строк при межпроцессном взаимодействии (передаче параметра в activeX exe, например, где входной параметр, если подразумеваются полугигабайтные строки, как раз настоятельно желательно принимать byval, поскольку byref подразумевает организацию обратного маршалинга.)

У массивов в переменной тоже ссылка, но не на первый элемент массива, а на структуру-описатель, рассказывающей о типе элемента, размерностях массива и адресе его первого элемента.
Глядя только в нее, тем же механизмом копирования тройки - новая память значений+новая структура описатель+ссылка на неё, обеспечивается эффект передачи массива по значению

как-то так...
как-то так устроен COM, а визуальный бейсик был спроектирован быть его клиентом.
23 май 20, 01:18    [22138044]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3219
booby
но перед первым символом сидит 32-разрядная длина строки.
Это позволяет всегда, независимо от места выделения строки (строки фиксированного размера - на стеке, остальные в куче) понять сколько надо копировать.
формируется новая строка со своим указателем, который и отдается в качестве параметра при вызове byval.
Собственно, некоторые сишные менеджеры кучи делают примерно тоже самое, если заглянуть в адреса сразу перед тем, что был возвращён функцией malloc. Вообще, тема с длиной строки перед первым символом строки, на сколько я понимаю, перекочевала в VB из Pascal.

booby
работает чисто и просто, автоматически обеспечивая самую дешевую из возможных
передачу строк при межпроцессном взаимодействии (передаче параметра в activeX exe, например, где входной параметр, если подразумеваются полугигабайтные строки, как раз настоятельно желательно принимать byval, поскольку byref подразумевает организацию обратного маршалинга.)

У массивов в переменной тоже ссылка, но не на первый элемент массива, а на структуру-описатель, рассказывающей о типе элемента, размерностях массива и адресе его первого элемента.
Глядя только в нее, тем же механизмом копирования тройки - новая память значений+новая структура описатель+ссылка на неё, обеспечивается эффект передачи массива по значению
Все эти высокоуровневые обёртки и так понятны. Полуинтерпретаторные/полубайткодные по другому не умеют. Им вечно всё надо контролировать, чтобы всякие не накодили чего-нибудь с memory leak просто забыв где-нибудь что-то типа delete.
23 май 20, 01:34    [22138046]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
petrav
Member

Откуда:
Сообщений: 2118
rdb_dev
petrav, помниться, в начале 90-ых на своём ZX Spectrum с помощью бейсиковской команды POKE забивал в память машинные коды предварительно написанного на бумажке ассемблерных инструкций алгоритма и переведённых по таблице в машинные коды. Вывод точки на экран по заданным в регистрах координатам получился размером в 48 байт. :) Ты ведь помнишь структуру видеобуфера Спектрума, ага? :)

Нет, не помню. У меня не было данных для программирования на ассемблере ZX Spectrum. Были какие-то отрывочные статьи, но и только. А так я на Басике зажигал. Автоматическое решение головоломок "мат в три хода", сборка Кубика Рубика, синтаксический анализ текстов и т.д.

На бумажке я программировал на МК-52.
23 май 20, 01:38    [22138047]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
booby
Member

Откуда:
Сообщений: 1940
rdb_dev
....Все эти высокоуровневые обёртки и так понятны. ....

дело не в том, полуинтерпретаторные они или полубайткодные.

В контексте данного топика существо дела в том, что это встроено в подсистему передачи параметров.
Между прочим, всегда позволяя внутри процедуры к параметру относиться как к объекту присвоения, но при этом обеспечивать семантику передачи параметров по значению,
к которой программист имеет доступ в виде синтаксического модификатора способа передачи byref/byval

к объектам, являющимся экземплярами классов, это не относится в том смысле, что здесь
подсистема передачи параметров говорит - я не знаю (даже мне, умеющей копировать
массивы, это дорого или невозможно знать)
внутреннюю структуру передаваемого класса, в общем случае.
поэтому ничего, кроме как организовать передачу копии ссылки на твой объект, раз уж ты хочешь byval, не могу.
23 май 20, 01:56    [22138049]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
booby
Member

Откуда:
Сообщений: 1940
booby
.. всегда позволяя внутри процедуры к параметру относиться как к объекту присвоения...

вот позиция, сама по себе, имеет потенциал стартовать самостоятельный флейм
ещё страниц на сорок вперед...
23 май 20, 01:59    [22138050]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3219
booby, не, я пас... Это уже будет реальное переливание из пустого в порожний. :)
23 май 20, 02:18    [22138052]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
booby
Member

Откуда:
Сообщений: 1940
rdb_dev
...
Вообще, тема с длиной строки перед первым символом строки, на сколько я понимаю, перекочевала в VB из Pascal.
...

Брукс определяет архитектурными такие вещи, о которые ты бьёшься лбом,
продвигаясь ночью по направлению к туалету, и не можешь убрать их с дороги.
Каждая такая штука есть архитектура.

у Паскаля в этом месте врожденный дефект - строки были ограничены небольшой
максимальной длиной и размещались только на стеке.

Паскали имеют тенденцию до сих пор об это биться...
У "Победы" две буквы осыпались...
23 май 20, 02:18    [22138053]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
petrav
Member

Откуда:
Сообщений: 2118
rdb_dev
booby, не, я пас... Это уже будет реальное переливание из пустого в порожний. :)

Хватит флудить в моей теме. Сейчас банить начну. :)
23 май 20, 02:24    [22138054]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3219
booby
rdb_dev
...
Вообще, тема с длиной строки перед первым символом строки, на сколько я понимаю, перекочевала в VB из Pascal.
...

Брукс определяет архитектурными такие вещи, о которые ты бьёшься лбом,
продвигаясь ночью по направлению к туалету, и не можешь убрать их с дороги.
Каждая такая штука есть архитектура.
Понятно, by design! :)
23 май 20, 02:33    [22138056]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
mayton
Member

Откуда: loopback
Сообщений: 46599
Изопропил
petrav
язык Си спроектирован неправильно.

как страшно жить.

Да ему уже больше 40 лет. И он не теоретический, а промышленный язык. Конечно со своими недостатками.

Да кого эти массивы парят? Там все равно с указателем больше работают.

Массив - сахарок.
23 май 20, 11:33    [22138085]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
mayton
Member

Откуда: loopback
Сообщений: 46599
petrav
rdb_dev
booby, не, я пас... Это уже будет реальное переливание из пустого в порожний. :)

Хватит флудить в моей теме. Сейчас банить начну. :)

Wow! Легче на поворотах. Нельзя выдавать себя за скрытого модератора!

За это тоже можно получить банан!
23 май 20, 11:42    [22138086]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
mayton
Member

Откуда: loopback
Сообщений: 46599
rdb_dev
petrav, помниться, в начале 90-ых на своём ZX Spectrum с помощью бейсиковской команды POKE забивал в память машинные коды предварительно написанного на бумажке ассемблерных инструкций алгоритма и переведённых по таблице в машинные коды. Вывод точки на экран по заданным в регистрах координатам получился размером в 48 байт. :) Ты ведь помнишь структуру видеобуфера Спектрума, ага? :)

Старый добрый Синклер.. Я помню что его библиотека графики была несовершенна.
Окружность например рисовалась через полярные координаты. Тоесть явное вращение
угла и синус+косинус. А современные библиотечки - через квадартный корень от явного
уравнения типа y=f(x) рисуют восьмушку круга. Потом несколькими зеркальными отражениями
просто реплицируют эту восьмушку направо налево вверх вниз и получается таже окружность
только раз в 10 быстрее. Впрочем на современных API вы это не замечаете. Где DirectX уже
отвечает за векторную графику.

Тоже самое в Спектрумах - рисование линии. Медленновато. Возможно через целочисленное деление.
Хотя есть более быстрый метод.

Вобщем я-бы ROM переделал.
23 май 20, 14:16    [22138140]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3219
mayton, у ZX Spectrum была весьма своеобразная структура видеобуфера. Видеобуфер с вертикальной развёрткой 192 строки в непрерывном адресном пространстве видеобуфера разбит на 3 блока по 64 строки, в каждом блоке последовательно идут подряд сначала байты с битами-точками первой строки, затем 9-ой, потом 17-ой и так далее до 57-ой, но следующие байты уже будут принадлежать 2-ой строке, затем 18-ой и т.д., пока не заполниться первый блок. Для второго и третьего блока всё тоже самое, а цвет вообще задаётся в отдельном участке буфера, но не для каждой точки, а для блока точек 8х8 (для символа) как цвет фореграунда и бэкграунда (для присутствия и отсутствия точки). Соответственно, вывод точки по заданным координатам X и Y чуточку сложнее, чем просто результат произведения Y на кол-ва бит в строке, сложенное с результатом произведения X на кол-во бит на точку.
23 май 20, 15:56    [22138169]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
mayton
Member

Откуда: loopback
Сообщений: 46599
Я тебе говорю о том что алгоритм использующий тригонометрию (!) при выводе circle() на медленном 3.5 Мегагерцном
процессоре можно улучшить просто в вакууме. Даже без вывода пикселя. И рисование draw() линий - Брезенхемом.

А то о чем ты говоришь - просто особенности реализации банков видеопамяти. Они не только
в спектруме но и в других архитектурах были уе6 анскNe.

Кстати это лишний раз подтверждает мою праводу. Ведь пространственную когерентность пикслеей
легче контролировать когда рисуешь кружок через y=f(x) , x = f(y) чем x,y как функция от фи.
23 май 20, 16:04    [22138175]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
petrav
Member

Откуда:
Сообщений: 2118
mayton
Я тебе говорю о том что алгоритм использующий тригонометрию (!) при выводе circle() на медленном 3.5 Мегагерцном
процессоре можно улучшить просто в вакууме. Даже без вывода пикселя. И рисование draw() линий - Брезенхемом.

А то о чем ты говоришь - просто особенности реализации банков видеопамяти. Они не только
в спектруме но и в других архитектурах были уе6 анскNe.

Кстати это лишний раз подтверждает мою праводу. Ведь пространственную когерентность пикслеей
легче контролировать когда рисуешь кружок через y=f(x) , x = f(y) чем x,y как функция от фи.

Судя по резко возросшему количество опечаток mayton или на ходу пишет, или что-то уже налито. :)

Тогда давайте свою платформу проектировать. Raspberry Pi же смогли. И nginx смогли.
23 май 20, 16:14    [22138178]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
mayton
Member

Откуда: loopback
Сообщений: 46599
Я пока пью фруктовый чай.

Raspberry Pi - хорошая платформа. Но там мне уже негде руки приложить.
Коробочный линукс убил весь энтузиазм. Я вряд-ли напишу что-то лучше
чем в линуксе. А синклер - был игрушкой детства. Вот отсюда и разные
мозговые задачки которые "приятно" думать. Безо всякой пользы и без
монетизации.
23 май 20, 16:54    [22138202]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
Изопропил
Member

Откуда:
Сообщений: 31468
mayton
Но там мне уже негде руки приложить

а паяльник если в руки взять?
23 май 20, 16:57    [22138203]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
petrav
Member

Откуда:
Сообщений: 2118
Изопропил
mayton
Но там мне уже негде руки приложить

а паяльник если в руки взять?

Вот-вот-вот! mayton-а мы и посадим на конвейер. Если ничего написать не может, то пусть паяет. А нам нужна идея.
23 май 20, 17:02    [22138207]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
mayton
Member

Откуда: loopback
Сообщений: 46599
Изопропил
mayton
Но там мне уже негде руки приложить

а паяльник если в руки взять?

Зачем?
23 май 20, 17:03    [22138209]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
Изопропил
Member

Откуда:
Сообщений: 31468
mayton
Изопропил
пропущено...

а паяльник если в руки взять?

Зачем?

чтоб руки к Raspberry приложить
23 май 20, 17:11    [22138213]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
mayton
Member

Откуда: loopback
Сообщений: 46599
Но зачем мне делать то чего я не хочу?
23 май 20, 17:15    [22138216]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
Изопропил
Member

Откуда:
Сообщений: 31468
mayton,

говоришь же, что хочешь руки приложить
23 май 20, 17:18    [22138219]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
mayton
Member

Откуда: loopback
Сообщений: 46599
Яж про синклер говорил.
23 май 20, 17:26    [22138227]     Ответить | Цитировать Сообщить модератору
 Re: Си и массив как аргумент функции  [new]
rdb_dev
Member

Откуда: с болот
Сообщений: 3219
mayton, синклер давно потерял свою актуальность. Впору приглядеться к отечественному MIPS'у "Байкал BE-T1000", но чот меня жаба душит выкладывать сорокет за DevKit.
25 май 20, 01:41    [22138735]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 12 13 14 15 16 17 18 19 [20] 21   вперед  Ctrl
Все форумы / C++ Ответить