|
|
  |
в чем прелесть указателей ? |
|
|
|
Jan 30 2007, 01:26
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Чем прелестно программирование, что можно любую операцию сделать десятью способами.  Иногда создаётся впечатление, что у каждого есть свои излюбленные методы. Порой дико удивляешься (я говорю вообще а не о конкретном споре), что твой способ работы с данными соседом объявляется работой через ж...  Как?? Я же считал его самым правильным?! Возмущаешься ты. Да нет, - это самый неправильный из всех неправильных. Боюсь навлечь на себя критику, а также разборки моего текста (чего явно не желаю  ), но отмечу что мне кажется приведение типов не очень уж большая ошибка. Или так сказать непроффессиализм. Хотя бы для МК. Потому как иногда требуется прямое указание места размещения. Например. addr = ((uint8_t __flash *)symbol[tekfonts])+struct_fnt[tekfonts-2][Znak].sm; Не претендую на истину. Но по умолчанию компилятор приводит к указателю на RAM.
|
|
|
|
|
Jan 30 2007, 01:36
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(defunct @ Jan 30 2007, 04:46)  массивом назвать нельзя... Проверить легко (обращение внутри функции): param[0] = 0; даст ошибку, а это значит, что не массив был передан в функцию. Хорошо, вот Вам, уважаемый defunct простая задачка: Есть структура, размером, ну так байт 64-256. И внутри некой функции, Вам необходимо, что бы все поля данной структуры были равны, допустим, нулю. Интересно, как Вы собираетесь решить данную проблему?
--------------------
|
|
|
|
|
Jan 30 2007, 02:26
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(prottoss @ Jan 30 2007, 00:36)  Цитата(defunct @ Jan 30 2007, 04:46)  массивом назвать нельзя... Проверить легко (обращение внутри функции): param[0] = 0; даст ошибку, а это значит, что не массив был передан в функцию. Хорошо, вот Вам, уважаемый defunct простая задачка: Есть структура, размером, ну так байт 64-256. И внутри некой функции, Вам необходимо, что бы все поля данной структуры были равны, допустим, нулю. Интересно, как Вы собираетесь решить данную проблему? А, просите, какое отношение поставленая задачка имеет к непередаче массива в качестве параметра??? Ну как решается? Естественно sizeof() структуры и memset() ну и что?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 30 2007, 03:27
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(prottoss @ Jan 30 2007, 01:36)  Вы же, когда будете вызывать memset() передадите указатель на тип char? Передам указатель на область памяти и ее размер. Размер области памяти в общем случае даже не будет совпадать с размером полей структуры. И совершенно не буду с упорством достойным лучшего применения утверждать, что передал указатель на структуру. Передал именно указатель на область памяти которая в качестве подмножества содержит наряду с мусором и кусочки памяти относящиеся к структуре. И работать memset() будет с областью памяти обнулив и память относящуюся к тому что кото-то где-то считает относящуюся к структуре и всю прочую.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 30 2007, 08:09
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(prottoss @ Jan 29 2007, 23:22)  Цитата(dxp @ Jan 29 2007, 16:57)  Покажите как? Как передать массив по значению (в качестве аргумента) в функцию? Я показал, КАК МОЖНО ПЕРЕДАТЬ МАССИВ ПО ЗНАЧЕНИЮ, то бишь, В КАЧЕСТВЕ АРГУМЕНТА. Я не говорю, что я так делаю, я лишь показал то, что Вы просили: массив array1 был передан в функцию в качестве аргумента - так? Или не так? Не надо объяснять - скажите - да или нет  Нет! У меня к Вам вопрос: можно ли в С/С++ передавать в функцию в качестве аргумента функцию?
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jan 30 2007, 11:42
|

Дух погибшего транзистора
   
Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288

|
Цитата(prottoss @ Jan 30 2007, 01:15)  И если мне вздумалось передать массив как аргумент, то я из кожи вылезу но сделаю это  Придется сильно попотеть  для того чтобы сделать так, как в используемом языке невозможно сделать. ЗЫ Прямо какое-то обострение у контингента началось, везде дон кихоты от С с красными дипломами.
--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
|
|
|
|
|
Jan 30 2007, 11:50
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(dxp @ Jan 30 2007, 12:09)  Цитата(prottoss @ Jan 29 2007, 23:22)  Цитата(dxp @ Jan 29 2007, 16:57)  Покажите как? Как передать массив по значению (в качестве аргумента) в функцию? Я показал, КАК МОЖНО ПЕРЕДАТЬ МАССИВ ПО ЗНАЧЕНИЮ, то бишь, В КАЧЕСТВЕ АРГУМЕНТА. Я не говорю, что я так делаю, я лишь показал то, что Вы просили: массив array1 был передан в функцию в качестве аргумента - так? Или не так? Не надо объяснять - скажите - да или нет Нет! А ЧТО тогда было переданно в функцию? Цитата(dxp @ Jan 30 2007, 12:09)  У меня к Вам вопрос: можно ли в С/С++ передавать в функцию в качестве аргумента функцию? Функцию нельзя, потому что на этапе компиляции не известен ее размер, адрес функции можно, потому что размер адреса известен
--------------------
|
|
|
|
|
Jan 30 2007, 12:13
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(prottoss @ Jan 30 2007, 00:36)  Есть структура, размером, ну так байт 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; }
} Какие указатели? "Какой такой павлин-мавлин?"(с)
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 30 2007, 12:15
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(SpiritDance @ Jan 30 2007, 15:42)  Цитата(prottoss @ Jan 30 2007, 01:15)  И если мне вздумалось передать массив как аргумент, то я из кожи вылезу но сделаю это  Придется сильно попотеть  для того чтобы сделать так, как в используемом языке невозможно сделать. А потеть и не надо. Попробую еще раз объяснить. Есть определенный мною тип данных: Код 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 Цитата(SpiritDance @ Jan 30 2007, 15:42)  ЗЫ Прямо какое-то обострение у контингента началось, везде дон кихоты от С с красными дипломами. Не надо флудить и злорадно хихикать  Если у Вас есть что сказать по теме, говорите, если нет - тихо наблюдайте
--------------------
|
|
|
|
|
Jan 30 2007, 12:51
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(prottoss @ Jan 30 2007, 14:50)  Цитата(dxp @ Jan 30 2007, 12:09)  Цитата(prottoss @ Jan 29 2007, 23:22)  Цитата(dxp @ Jan 29 2007, 16:57)  Покажите как? Как передать массив по значению (в качестве аргумента) в функцию? Я показал, КАК МОЖНО ПЕРЕДАТЬ МАССИВ ПО ЗНАЧЕНИЮ, то бишь, В КАЧЕСТВЕ АРГУМЕНТА. Я не говорю, что я так делаю, я лишь показал то, что Вы просили: массив array1 был передан в функцию в качестве аргумента - так? Или не так? Не надо объяснять - скажите - да или нет Нет! А ЧТО тогда было переданно в функцию? А Вы не знаете? СТРУКТУРА. Цитата(prottoss @ Jan 30 2007, 14:50)  Цитата(dxp @ Jan 30 2007, 12:09)  У меня к Вам вопрос: можно ли в С/С++ передавать в функцию в качестве аргумента функцию?
Функцию нельзя, потому что на этапе компиляции не известен ее размер, адрес функции можно, потому что размер адреса известен Да? А я Вам сейчас покажу вашим же способом, что можно: Код void f(int); int g(); ... f(g()); Ась? КаковО??!  И таким способом я могу что угодно передавать куда угодно. Просто волшебство! Если серьезно, то советую хорошенько разобраться с порядком работы компилятора в этих местах - с тем, что такое временные объекты, время их жизни, когда они создаются, когда уничтожаются и т.д. Это веьсма важный вопрос, можно сказать, основы.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jan 30 2007, 13:03
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(dxp @ Jan 30 2007, 16:51)  Цитата(prottoss @ Jan 30 2007, 14:50)  А ЧТО тогда было переданно в функцию?  А Вы не знаете? СТРУКТУРА. В функцию был передан массив по значению. Просто массив был приведен к типу обределенной мной структуры Цитата(dxp @ Jan 30 2007, 16:51)  Да? А я Вам сейчас покажу вашим же способом, что можно: Код void f(int); int g(); ... f(g()); Ась? КаковО??!  И таким способом я могу что угодно передавать куда угодно. Просто волшебство! Вот что Ваш код делает: Вызывается функция g, и возвращаемое ею значение типа int передается функции f в качестве входного параметра. И что здесь волшебного?  . Ну если только это Ваши первые достижения в Си Цитата(dxp @ Jan 30 2007, 16:51)  Если серьезно, то советую хорошенько разобраться с порядком работы компилятора в этих местах - с тем, что такое временные объекты, время их жизни, когда они создаются, когда уничтожаются и т.д. Это веьсма важный вопрос, можно сказать, основы. дада и Вам того же
--------------------
|
|
|
|
|
Jan 30 2007, 13:13
|
Частый гость
 
Группа: Новичок
Сообщений: 154
Регистрация: 7-03-06
Пользователь №: 15 051

|
Цитата(prottoss @ Jan 30 2007, 02:36)  Цитата(zltigo @ Jan 30 2007, 06:26)  А, просите, какое отношение поставленая задачка имеет к непередаче массива в качестве параметра??? Ну как решается? Естественно sizeof() структуры и memset() ну и что? А самое непосредственное. Вы же, когда будете вызывать memset() передадите указатель на тип char? Неправда - void * Цитата(prottoss @ Jan 30 2007, 03:42)  Цитата(zltigo @ Jan 30 2007, 07:27)  Передал именно указатель на область памяти которая в качестве подмножества содержит наряду с мусором и кусочки памяти относящиеся к структуре. И работать memset() будет с областью памяти обнулив и память относящуюся к тому что кото-то где-то считает относящуюся к структуре и всю прочую. Отлично. Тогда говоря Вашими терминами, я, в своем примере, в функцию, в качестве параметра, передал область памятиВы передали то, что лежит в стеке. А в стеке лежит адрес (2 байта у near адресации, 4 у far/ flat), и ничего больше  "Передать" - значит затолкнуть в стек, а не засунуть в глобальную переменную, или куда-то там ещё... push ebp mov ebp, esp start equ [ebp+4] ; вот где начинаются аргументы Вашей функции, порядок зависит от callspec
Сообщение отредактировал dryadae - Jan 30 2007, 13:24
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|