SapegoAL 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба Чем прелестно программирование, что можно любую операцию сделать десятью способами. :) Иногда создаётся впечатление, что у каждого есть свои излюбленные методы. Порой дико удивляешься (я говорю вообще а не о конкретном споре), что твой способ работы с данными соседом объявляется работой через ж... :) Как?? Я же считал его самым правильным?! Возмущаешься ты. Да нет, - это самый неправильный из всех неправильных. Боюсь навлечь на себя критику, а также разборки моего текста (чего явно не желаю :) ), но отмечу что мне кажется приведение типов не очень уж большая ошибка. Или так сказать непроффессиализм. Хотя бы для МК. Потому как иногда требуется прямое указание места размещения. Например. addr = ((uint8_t __flash *)symbol[tekfonts])+struct_fnt[tekfonts-2][Znak].sm; Не претендую на истину. Но по умолчанию компилятор приводит к указателю на RAM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба массивом назвать нельзя... Проверить легко (обращение внутри функции): param[0] = 0; даст ошибку, а это значит, что не массив был передан в функцию. Хорошо, вот Вам, уважаемый defunct простая задачка: Есть структура, размером, ну так байт 64-256. И внутри некой функции, Вам необходимо, что бы все поля данной структуры были равны, допустим, нулю. Интересно, как Вы собираетесь решить данную проблему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба массивом назвать нельзя... Проверить легко (обращение внутри функции): param[0] = 0; даст ошибку, а это значит, что не массив был передан в функцию. Хорошо, вот Вам, уважаемый defunct простая задачка: Есть структура, размером, ну так байт 64-256. И внутри некой функции, Вам необходимо, что бы все поля данной структуры были равны, допустим, нулю. Интересно, как Вы собираетесь решить данную проблему? А, просите, какое отношение поставленая задачка имеет к непередаче массива в качестве параметра??? Ну как решается? Естественно sizeof() структуры и memset() ну и что? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба А, просите, какое отношение поставленая задачка имеет к непередаче массива в качестве параметра??? Ну как решается? Естественно sizeof() структуры и memset() ну и что? А самое непосредственное. Вы же, когда будете вызывать memset() передадите указатель на тип char? Не так ли? Хотя фактически это будет приведенный к указателю на char адрес Вашей структуры. Почему я в свою функцию не могу передать массив в качестве параметра, приведя его к типу своей структуры??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба Вы же, когда будете вызывать memset() передадите указатель на тип char? Передам указатель на область памяти и ее размер. Размер области памяти в общем случае даже не будет совпадать с размером полей структуры. И совершенно не буду с упорством достойным лучшего применения утверждать, что передал указатель на структуру. Передал именно указатель на область памяти которая в качестве подмножества содержит наряду с мусором и кусочки памяти относящиеся к структуре. И работать memset() будет с областью памяти обнулив и память относящуюся к тому что кото-то где-то считает относящуюся к структуре и всю прочую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба Передал именно указатель на область памяти которая в качестве подмножества содержит наряду с мусором и кусочки памяти относящиеся к структуре. И работать memset() будет с областью памяти обнулив и память относящуюся к тому что кото-то где-то считает относящуюся к структуре и всю прочую. Отлично. Тогда говоря Вашими терминами, я, в своем примере, в функцию, в качестве параметра, передал область памяти Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба Покажите как? Как передать массив по значению (в качестве аргумента) в функцию? Я показал, КАК МОЖНО ПЕРЕДАТЬ МАССИВ ПО ЗНАЧЕНИЮ, то бишь, В КАЧЕСТВЕ АРГУМЕНТА. Я не говорю, что я так делаю, я лишь показал то, что Вы просили: массив array1 был передан в функцию в качестве аргумента - так? Или не так? Не надо объяснять - скажите - да или нет :) Нет! У меня к Вам вопрос: можно ли в С/С++ передавать в функцию в качестве аргумента функцию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SpiritDance 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба И если мне вздумалось передать массив как аргумент, то я из кожи вылезу но сделаю это :) Придется сильно попотеть :) для того чтобы сделать так, как в используемом языке невозможно сделать. :) ЗЫ Прямо какое-то обострение у контингента началось, везде дон кихоты от С с красными дипломами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба Покажите как? Как передать массив по значению (в качестве аргумента) в функцию? Я показал, КАК МОЖНО ПЕРЕДАТЬ МАССИВ ПО ЗНАЧЕНИЮ, то бишь, В КАЧЕСТВЕ АРГУМЕНТА. Я не говорю, что я так делаю, я лишь показал то, что Вы просили: массив array1 был передан в функцию в качестве аргумента - так? Или не так? Не надо объяснять - скажите - да или нет :) Нет! А ЧТО тогда было переданно в функцию? :) У меня к Вам вопрос: можно ли в С/С++ передавать в функцию в качестве аргумента функцию?Функцию нельзя, потому что на этапе компиляции не известен ее размер, адрес функции можно, потому что размер адреса известен Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба Есть структура, размером, ну так байт 64-256. И внутри некой функции, Вам необходимо, что бы все поля данной структуры были равны, допустим, нулю. Интересно, как Вы собираетесь решить данную проблему? typedef struct { int fieldA; long fieldB[20]; }mystruct_t; mystruct_t struct_to_be_cleared; void main() { { mystruct_t ZeroFilled = {0}; struct_to_be_cleared = ZeroFilled; } } Какие указатели? "Какой такой павлин-мавлин?"(с) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба И если мне вздумалось передать массив как аргумент, то я из кожи вылезу но сделаю это :)Придется сильно попотеть :) для того чтобы сделать так, как в используемом языке невозможно сделать. :) А потеть и не надо. Попробую еще раз объяснить. Есть определенный мною тип данных: typedef struct{ UCHAR array[128]; } int128 /* к примеру */ Есть переменные, но они не приведены к данному типу: UCHAR a[128]; UCHAR b[128]; И есть функция, и не важно, что у нее внутри: void math128(int128 arg1, int128 arg2); Я легко передаю в функцию два массива, приведя их к типу int128: ..... math128(*(int128 *)&a), *(int128 *)&b)); ..... Что я передал в функцию??? Два массива - a и b ЗЫ Прямо какое-то обострение у контингента началось, везде дон кихоты от С с красными дипломами. Не надо флудить и злорадно хихикать :) Если у Вас есть что сказать по теме, говорите, если нет - тихо наблюдайте Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба Какие указатели? "Какой такой павлин-мавлин?"(с) Вообще то говорилось, что структура попадает в функцию по значению, попробуйте присвоить ей { 0 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 65 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба Покажите как? Как передать массив по значению (в качестве аргумента) в функцию? Я показал, КАК МОЖНО ПЕРЕДАТЬ МАССИВ ПО ЗНАЧЕНИЮ, то бишь, В КАЧЕСТВЕ АРГУМЕНТА. Я не говорю, что я так делаю, я лишь показал то, что Вы просили: массив array1 был передан в функцию в качестве аргумента - так? Или не так? Не надо объяснять - скажите - да или нет :) Нет! А ЧТО тогда было переданно в функцию? :) А Вы не знаете? СТРУКТУРА. У меня к Вам вопрос: можно ли в С/С++ передавать в функцию в качестве аргумента функцию?Функцию нельзя, потому что на этапе компиляции не известен ее размер, адрес функции можно, потому что размер адреса известен Да? А я Вам сейчас покажу вашим же способом, что можно: void f(int); int g(); ... f(g()); Ась? КаковО??! ;) И таким способом я могу что угодно передавать куда угодно. Просто волшебство! Если серьезно, то советую хорошенько разобраться с порядком работы компилятора в этих местах - с тем, что такое временные объекты, время их жизни, когда они создаются, когда уничтожаются и т.д. Это веьсма важный вопрос, можно сказать, основы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба А ЧТО тогда было переданно в функцию? :) А Вы не знаете? СТРУКТУРА. В функцию был передан массив по значению. Просто массив был приведен к типу обределенной мной структуры Да? А я Вам сейчас покажу вашим же способом, что можно: void f(int); int g(); ... f(g()); Ась? КаковО??! ;) И таким способом я могу что угодно передавать куда угодно. Просто волшебство! Вот что Ваш код делает: Вызывается функция g, и возвращаемое ею значение типа int передается функции f в качестве входного параметра. И что здесь волшебного? :) . Ну если только это Ваши первые достижения в Си :) Если серьезно, то советую хорошенько разобраться с порядком работы компилятора в этих местах - с тем, что такое временные объекты, время их жизни, когда они создаются, когда уничтожаются и т.д. Это веьсма важный вопрос, можно сказать, основы. дада и Вам того же :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dryadae 0 30 января, 2007 Опубликовано 30 января, 2007 (изменено) · Жалоба А, просите, какое отношение поставленая задачка имеет к непередаче массива в качестве параметра??? Ну как решается? Естественно sizeof() структуры и memset() ну и что? А самое непосредственное. Вы же, когда будете вызывать memset() передадите указатель на тип char? Неправда - void * :) :) :) Передал именно указатель на область памяти которая в качестве подмножества содержит наряду с мусором и кусочки памяти относящиеся к структуре. И работать memset() будет с областью памяти обнулив и память относящуюся к тому что кото-то где-то считает относящуюся к структуре и всю прочую. Отлично. Тогда говоря Вашими терминами, я, в своем примере, в функцию, в качестве параметра, передал область памяти Вы передали то, что лежит в стеке. А в стеке лежит адрес (2 байта у near адресации, 4 у far/flat), и ничего больше :excl: "Передать" - значит затолкнуть в стек, а не засунуть в глобальную переменную, или куда-то там ещё... push ebp mov ebp, esp start equ [ebp+4] ; вот где начинаются аргументы Вашей функции, порядок зависит от callspec Изменено 30 января, 2007 пользователем dryadae Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться