реклама на сайте
подробности

 
 
5 страниц V  < 1 2 3 4 5 >  
Reply to this topicStart new topic
> в чем прелесть указателей ?
SasaVitebsk
сообщение Jan 30 2007, 01:26
Сообщение #31


Гуру
******

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



Чем прелестно программирование, что можно любую операцию сделать десятью способами. smile.gif Иногда создаётся впечатление, что у каждого есть свои излюбленные методы. Порой дико удивляешься (я говорю вообще а не о конкретном споре), что твой способ работы с данными соседом объявляется работой через ж... smile.gif Как?? Я же считал его самым правильным?! Возмущаешься ты. Да нет, - это самый неправильный из всех неправильных. biggrin.gif

Боюсь навлечь на себя критику, а также разборки моего текста (чего явно не желаю smile.gif ), но отмечу что мне кажется приведение типов не очень уж большая ошибка. Или так сказать непроффессиализм. Хотя бы для МК. Потому как иногда требуется прямое указание места размещения.

Например.
addr = ((uint8_t __flash *)symbol[tekfonts])+struct_fnt[tekfonts-2][Znak].sm;


Не претендую на истину. Но по умолчанию компилятор приводит к указателю на RAM.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 30 2007, 01:36
Сообщение #32


Гуру
******

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



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

Есть структура, размером, ну так байт 64-256. И внутри некой функции, Вам необходимо, что бы все поля данной структуры были равны, допустим, нулю. Интересно, как Вы собираетесь решить данную проблему?


--------------------
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 30 2007, 02:26
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 30 2007, 02:36
Сообщение #34


Гуру
******

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



Цитата(zltigo @ Jan 30 2007, 06:26) *
А, просите, какое отношение поставленая задачка имеет к непередаче массива в качестве параметра??? Ну как решается? Естественно sizeof() структуры и memset() ну и что?
А самое непосредственное. Вы же, когда будете вызывать memset() передадите указатель на тип char? Не так ли? Хотя фактически это будет приведенный к указателю на char адрес Вашей структуры. Почему я в свою функцию не могу передать массив в качестве параметра, приведя его к типу своей структуры???


--------------------
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 30 2007, 03:27
Сообщение #35


Гуру
******

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



Цитата(prottoss @ Jan 30 2007, 01:36) *
Вы же, когда будете вызывать memset() передадите указатель на тип char?

Передам указатель на область памяти и ее размер. Размер области памяти в общем случае даже не будет совпадать с размером полей структуры.
И совершенно не буду с упорством достойным лучшего применения утверждать, что передал указатель на структуру. Передал именно указатель на область памяти которая в качестве подмножества содержит наряду с мусором и кусочки памяти относящиеся к структуре. И работать memset() будет
с областью памяти обнулив и память относящуюся к тому что кото-то где-то считает относящуюся к структуре и всю прочую.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 30 2007, 03:42
Сообщение #36


Гуру
******

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



Цитата(zltigo @ Jan 30 2007, 07:27) *
Передал именно указатель на область памяти которая в качестве подмножества содержит наряду с мусором и кусочки памяти относящиеся к структуре. И работать memset() будет
с областью памяти обнулив и память относящуюся к тому что кото-то где-то считает относящуюся к структуре и всю прочую.
Отлично. Тогда говоря Вашими терминами, я, в своем примере, в функцию, в качестве параметра, передал область памяти


--------------------
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 30 2007, 08:09
Сообщение #37


Adept
******

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



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

массив array1 был передан в функцию в качестве аргумента - так? Или не так? Не надо объяснять - скажите - да или нет smile.gif

Нет!

У меня к Вам вопрос: можно ли в С/С++ передавать в функцию в качестве аргумента функцию?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Jan 30 2007, 11:42
Сообщение #38


Дух погибшего транзистора
****

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



Цитата(prottoss @ Jan 30 2007, 01:15) *
И если мне вздумалось передать массив как аргумент, то я из кожи вылезу но сделаю это smile.gif

Придется сильно попотеть smile.gif для того чтобы сделать так, как в используемом языке невозможно сделать. smile.gif

ЗЫ
Прямо какое-то обострение у контингента началось, везде дон кихоты от С с красными дипломами.


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 30 2007, 11:50
Сообщение #39


Гуру
******

Группа: Свой
Сообщений: 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 был передан в функцию в качестве аргумента - так? Или не так? Не надо объяснять - скажите - да или нет smile.gif
Нет!
А ЧТО тогда было переданно в функцию? smile.gif

Цитата(dxp @ Jan 30 2007, 12:09) *
У меня к Вам вопрос: можно ли в С/С++ передавать в функцию в качестве аргумента функцию?
Функцию нельзя, потому что на этапе компиляции не известен ее размер, адрес функции можно, потому что размер адреса известен


--------------------
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 30 2007, 12:13
Сообщение #40


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 30 2007, 12:15
Сообщение #41


Гуру
******

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



Цитата(SpiritDance @ Jan 30 2007, 15:42) *
Цитата(prottoss @ Jan 30 2007, 01:15) *
И если мне вздумалось передать массив как аргумент, то я из кожи вылезу но сделаю это smile.gif
Придется сильно попотеть smile.gif для того чтобы сделать так, как в используемом языке невозможно сделать. smile.gif
А потеть и не надо. Попробую еще раз объяснить. Есть определенный мною тип данных:

Код
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) *
ЗЫ
Прямо какое-то обострение у контингента началось, везде дон кихоты от С с красными дипломами.
Не надо флудить и злорадно хихикать smile.gif Если у Вас есть что сказать по теме, говорите, если нет - тихо наблюдайте


--------------------
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 30 2007, 12:29
Сообщение #42


Гуру
******

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



Цитата(Сергей Борщ @ Jan 30 2007, 16:13) *
Какие указатели? "Какой такой павлин-мавлин?"(с)
Вообще то говорилось, что структура попадает в функцию по значению, попробуйте присвоить ей { 0 }


--------------------
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 30 2007, 12:51
Сообщение #43


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 был передан в функцию в качестве аргумента - так? Или не так? Не надо объяснять - скажите - да или нет smile.gif
Нет!
А ЧТО тогда было переданно в функцию? smile.gif

А Вы не знаете? СТРУКТУРА.

Цитата(prottoss @ Jan 30 2007, 14:50) *
Цитата(dxp @ Jan 30 2007, 12:09) *

У меня к Вам вопрос: можно ли в С/С++ передавать в функцию в качестве аргумента функцию?
Функцию нельзя, потому что на этапе компиляции не известен ее размер, адрес функции можно, потому что размер адреса известен

Да? А я Вам сейчас покажу вашим же способом, что можно:
Код
    void f(int);
    int g();
    ...
    f(g());

Ась? КаковО??! wink.gif И таким способом я могу что угодно передавать куда угодно. Просто волшебство!

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 30 2007, 13:03
Сообщение #44


Гуру
******

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



Цитата(dxp @ Jan 30 2007, 16:51) *
Цитата(prottoss @ Jan 30 2007, 14:50) *

А ЧТО тогда было переданно в функцию? smile.gif

А Вы не знаете? СТРУКТУРА.
В функцию был передан массив по значению. Просто массив был приведен к типу обределенной мной структуры

Цитата(dxp @ Jan 30 2007, 16:51) *
Да? А я Вам сейчас покажу вашим же способом, что можно:
Код
    void f(int);
    int g();
    ...
    f(g());

Ась? КаковО??! wink.gif И таким способом я могу что угодно передавать куда угодно. Просто волшебство!
Вот что Ваш код делает: Вызывается функция g, и возвращаемое ею значение типа int передается функции f в качестве входного параметра. И что здесь волшебного? smile.gif . Ну если только это Ваши первые достижения в Си smile.gif

Цитата(dxp @ Jan 30 2007, 16:51) *
Если серьезно, то советую хорошенько разобраться с порядком работы компилятора в этих местах - с тем, что такое временные объекты, время их жизни, когда они создаются, когда уничтожаются и т.д. Это веьсма важный вопрос, можно сказать, основы.
дада и Вам того же smile.gif


--------------------
Go to the top of the page
 
+Quote Post
dryadae
сообщение Jan 30 2007, 13:13
Сообщение #45


Частый гость
**

Группа: Новичок
Сообщений: 154
Регистрация: 7-03-06
Пользователь №: 15 051



Цитата(prottoss @ Jan 30 2007, 02:36) *
Цитата(zltigo @ Jan 30 2007, 06:26) *
А, просите, какое отношение поставленая задачка имеет к непередаче массива в качестве параметра??? Ну как решается? Естественно sizeof() структуры и memset() ну и что?
А самое непосредственное. Вы же, когда будете вызывать memset() передадите указатель на тип char?

Неправда - void * smile.gif smile.gif smile.gif


Цитата(prottoss @ Jan 30 2007, 03:42) *
Цитата(zltigo @ Jan 30 2007, 07:27) *
Передал именно указатель на область памяти которая в качестве подмножества содержит наряду с мусором и кусочки памяти относящиеся к структуре. И работать memset() будет
с областью памяти обнулив и память относящуюся к тому что кото-то где-то считает относящуюся к структуре и всю прочую.
Отлично. Тогда говоря Вашими терминами, я, в своем примере, в функцию, в качестве параметра, передал область памяти

Вы передали то, что лежит в стеке. А в стеке лежит адрес (2 байта у near адресации, 4 у far/flat), и ничего больше excl.gif
"Передать" - значит затолкнуть в стек, а не засунуть в глобальную переменную, или куда-то там ещё...

push ebp
mov ebp, esp
start equ [ebp+4]
; вот где начинаются аргументы Вашей функции, порядок зависит от callspec

Сообщение отредактировал dryadae - Jan 30 2007, 13:24
Go to the top of the page
 
+Quote Post

5 страниц V  < 1 2 3 4 5 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 18:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01542 секунд с 7
ELECTRONIX ©2004-2016