Перейти к содержанию
    

в чем прелесть указателей ?

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

 

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

 

Например.

addr = ((uint8_t __flash *)symbol[tekfonts])+struct_fnt[tekfonts-2][Znak].sm;

 

 

Не претендую на истину. Но по умолчанию компилятор приводит к указателю на RAM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

массивом назвать нельзя...

Проверить легко (обращение внутри функции):

param[0] = 0;

даст ошибку, а это значит, что не массив был передан в функцию.

Хорошо, вот Вам, уважаемый defunct простая задачка:

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

массивом назвать нельзя...

Проверить легко (обращение внутри функции):

param[0] = 0;

даст ошибку, а это значит, что не массив был передан в функцию.

Хорошо, вот Вам, уважаемый defunct простая задачка:

 

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

А, просите, какое отношение поставленая задачка имеет к непередаче массива в качестве параметра???

Ну как решается? Естественно sizeof() структуры и memset() ну и что?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы же, когда будете вызывать memset() передадите указатель на тип char?

Передам указатель на область памяти и ее размер. Размер области памяти в общем случае даже не будет совпадать с размером полей структуры.

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

с областью памяти обнулив и память относящуюся к тому что кото-то где-то считает относящуюся к структуре и всю прочую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Передал именно указатель на область памяти которая в качестве подмножества содержит наряду с мусором и кусочки памяти относящиеся к структуре. И работать memset() будет

с областью памяти обнулив и память относящуюся к тому что кото-то где-то считает относящуюся к структуре и всю прочую.

Отлично. Тогда говоря Вашими терминами, я, в своем примере, в функцию, в качестве параметра, передал область памяти

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Нет!

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И если мне вздумалось передать массив как аргумент, то я из кожи вылезу но сделаю это :)

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

 

ЗЫ

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Нет!
А ЧТО тогда было переданно в функцию? :)

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть структура, размером, ну так байт 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;
  }

}

Какие указатели? "Какой такой павлин-мавлин?"(с)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И если мне вздумалось передать массив как аргумент, то я из кожи вылезу но сделаю это :)
Придется сильно попотеть :) для того чтобы сделать так, как в используемом языке невозможно сделать. :)

А потеть и не надо. Попробую еще раз объяснить. Есть определенный мною тип данных:

 

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

 

ЗЫ

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

Не надо флудить и злорадно хихикать :) Если у Вас есть что сказать по теме, говорите, если нет - тихо наблюдайте

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какие указатели? "Какой такой павлин-мавлин?"(с)
Вообще то говорилось, что структура попадает в функцию по значению, попробуйте присвоить ей { 0 }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Нет!
А ЧТО тогда было переданно в функцию? :)

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

 

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

Функцию нельзя, потому что на этапе компиляции не известен ее размер, адрес функции можно, потому что размер адреса известен

Да? А я Вам сейчас покажу вашим же способом, что можно:

    void f(int);
    int g();
    ...
    f(g());

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

В функцию был передан массив по значению. Просто массив был приведен к типу обределенной мной структуры

 

Да? А я Вам сейчас покажу вашим же способом, что можно:

    void f(int);
    int g();
    ...
    f(g());

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А, просите, какое отношение поставленая задачка имеет к непередаче массива в качестве параметра??? Ну как решается? Естественно sizeof() структуры и memset() ну и что?
А самое непосредственное. Вы же, когда будете вызывать memset() передадите указатель на тип char?

Неправда - void * :) :) :)

 

 

Передал именно указатель на область памяти которая в качестве подмножества содержит наряду с мусором и кусочки памяти относящиеся к структуре. И работать memset() будет

с областью памяти обнулив и память относящуюся к тому что кото-то где-то считает относящуюся к структуре и всю прочую.

Отлично. Тогда говоря Вашими терминами, я, в своем примере, в функцию, в качестве параметра, передал область памяти

Вы передали то, что лежит в стеке. А в стеке лежит адрес (2 байта у near адресации, 4 у far/flat), и ничего больше :excl:

"Передать" - значит затолкнуть в стек, а не засунуть в глобальную переменную, или куда-то там ещё...

 

push ebp

mov ebp, esp

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

Изменено пользователем dryadae

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...