Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: структуры в С
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Страницы: 1, 2
lks
Цитата(zltigo @ Apr 29 2007, 16:29) *
Подсказка - байты не нужны. Массивы могут быть не только байтовые, но массивами структур.


Могут, могут. А память где для них брать?
Чтобы загрузить структуру предлагаете memcpy, а место в памяти пргограмм где взять?
Меня этот путь не устраивает.

Цитата(zltigo @ Apr 29 2007, 16:29) *
Прочитайте медленно и по слогам, что писал, например, dxp по поводу указателя на void.
Преред этим постарайтесь забыть, что Вы "опытный программист" на усеченном (стуктуры данных явно не использовали sad.gif )диалекте ASM под исключительно 8bit, контроллеры.


Я месяца полтора назад в Keil-е все это уже попробовал.
Структура у меня заполняется данными замечательно из буфера по указателю, но только когда я указывал на переменную внутри структуры. Это понятно?

Пример:
struct S{...}s;
struct S* ps;
ps=&s;
не работатет, хотя должен.
Я действительно программы пишу много и давно, только я не преподаватель информатики, я реальные вещи делаю, на реальном "железе". Общетеоретические иссенуации меня не интересуют.
zltigo
Цитата(Legotron @ Apr 29 2007, 15:44) *
Ptr = (struct A *)&a; // сделать можно (и даже 1 поле структуры можно получить, если типы совпадут)

"Неможно".



Цитата(lks @ Apr 29 2007, 15:49) *
Могут, могут. А память где для них брать?
Чтобы загрузить структуру предлагаете memcpy, а место в памяти пргограмм где взять?

Обалдеть sad.gif. Все, граждане-господа-товарищи, я "пас" sad.gif.
Возраст, нервы...
Legotron
Цитата(zltigo @ Apr 29 2007, 16:51) *
"Неможно".

why? blink.gif

Вот нормально работающий кусок...
проверено.
Код
U16 TEMFClass::EMF_ScanRecords(const U8 * PData, U16 Size)
{
ENHMETAHEADER * MainHeader;
EMR    * Header;
int i;

if(PData != NULL)
{
    MainHeader = (ENHMETAHEADER *)PData;   // вот тут
    Header = (EMR *)PData;
    
    for(i=0; i<MainHeader->nRecords; i++) // тут обращение к полю
    {
        //EMF_LUT.AddItem(Header);
        //EMF_LUT.CountItems();
        #if DEBUG
        printf ("#%d - addr: %p  value: %d \n",i,Header,Header->iType);
        #endif

        Header = (EMR *)((U8 *)Header + Header->nSize);        
    }
    return 0;
}
else return 1;
}
zltigo
Цитата(Legotron @ Apr 29 2007, 15:56) *
why? blink.gif

Потому, что указателю на int пытаетесь присвоить указатель на сруктуру, причем его еще дополнительно (масло маслянное) явно преобразовали к указателю на эту-же структуру. Полагаю там описка - должно быть явное преобразование указателя на структуру в указатель на int.
К "куску" (в части работы с указателями) перетензий нет.
Legotron
Цитата(zltigo @ Apr 29 2007, 17:06) *
Потому, что указателю на int пытаетесь присвоить указатель на сруктуру, причем его еще дополнительно (масло маслянное) явно преобразовали к указателю на эту-же структуру. Полагаю там описка - должно быть явное преобразование указателя на структуру в указатель на int.
К "куску" (в части работы с указателями) перетензий нет.

blush.gif Блин, я опять все перепутал!
Вы абсолютно правы!

P.S. Я больше никогда не буду писать код в окне форума (ну разве, что очень простой), а то ерундовые вещи - и все равно ошибаюсь. Впредь буду приводить только реальные (работающие/неработающие) куски из программ, какими-бы там не были специфическими индентификаторы.

P.S. P.S. Какими глючными были бы программы, если бы индентификаторы разрешалось писать тока 1 буквой (никогда бы не работали smile.gif )
lks
Цитата(rezident @ Apr 29 2007, 16:21) *
Ну я уже не знаю как вам объяснять. huh.gif На гайках и автомобилях не понимаете, на яблоки, арбузы и семячки перейти что ли? smile.gif
Указатель в СИ это такая же абстракция как и структура.


На семячках вы еще не упражнялись. smile.gif

Если я напишу массив указателей unsigned char *buf[100]; - это абстракция?
Если я напишу struct и перечислю список переменных - это тоже?
Вообще-то компилятор выделит память под эти переменные - а память стоит денег - значит вещи вполне реальные. smile.gif




Цитата(zltigo @ Apr 29 2007, 16:54) *
Обалдеть sad.gif. Все, граждане-господа-товарищи, я "пас" sad.gif.
Возраст, нервы...


Если бы память позволяла - я бы поставил scanf со списком переменных и читал бы все из буфера, но это занимает памяти еще больше.
rezident
Цитата(lks @ Apr 29 2007, 19:34) *
Если я напишу массив указателей unsigned char *buf[100]; - это абстракция?
Если я напишу struct и перечислю список переменных - это тоже?
Вообще-то компилятор выделит память под эти переменные - а память стоит денег - значит вещи вполне реальные. smile.gif

Мда. Тяжелый случай. Почти безнадежный. cranky.gif Абстракция это сам термин "указатель". Потому что абстракции "указатель" нет однозначного соответствия его физической реализации.
Пожалуй мне тоже придется последовать примеру zltigo и самоустраниться от дальнейшего жевания уже многократно пережеванной каши. А то в свете последних предложений выражение RTFM приравняют к самым грязным ругательствам и будут за его применение банить пожизненно smile.gif
zltigo
Цитата(lks @ Apr 29 2007, 16:34) *
Если я напишу struct и перечислю список переменных - это тоже?
Вообще-то компилятор выделит память под эти переменные - а память стоит денег - значит вещи вполне реальные. smile.gif

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









Цитата(rezident @ Apr 29 2007, 16:49) *
Пожалуй мне тоже придется последовать примеру zltigo и самоустраниться...

Не смог я smile.gif страсть к естествознанию не позволила smile.gif
lks
Цитата(zltigo @ Apr 29 2007, 18:10) *
Для тех, кто в танке - список переменных это то, что после закрывающейся фигурной скобки, а не внутри скобок.


Список - это не только когда после фигурных скобок в структуре.
Смотрите шире.
Будем обсуждать варианты превода разных источников?
zltigo
Цитата(lks @ Apr 29 2007, 17:25) *
Список - это не только когда после фигурных скобок в структуре.

Не "список" а "список переменных", однако.
Цитата
Будем обсуждать варианты превода разных источников?

Первоисточник он один.
Варианты перевода, можно и пообсуждать (у меня настроение сегодня smile.gif )
Итак, пререводим. То, 'что в скобках' называется - "structure members" лично мне встречались варианты "члены структуры" и "'элементы структуры" больше по душе "элементы", но против буквального "членов" не возражаю smile.gif.

Ваш ход.

И, главное ,придавая филологический уклон беседе, не забудьте, что НЕ ВЫДЕЛЯЕТ память компилятор под структуру, если его об этом не попросить.
Запомнили?
Сергей Борщ
Ладно, я еще поприкалываюсь
Цитата(lks @ Apr 29 2007, 14:49) *
Могут, могут. А память где для них брать?
Там же, где вы собираетесь брать ее для байтового массива. Или вы думаете, что байтовый массив занимает меньше места чем структура такого же размера? cranky.gif
Цитата(lks @ Apr 29 2007, 14:49) *
Чтобы загрузить структуру предлагаете memcpy, а место в памяти пргограмм где взять?
"Есть у нас студент, фамилия у него Горидзе, зовут его Авас, а доцент тупой". Переведите термин "загрузить структуру". zltigo предлагает использовать memcpy для КОПИРОВАНИЯ СОДЕРЖИМОГО СТРУКТУРЫ В БАЙТОВЫЙ МАССИВ, что собственно и спрашивалось в первом вопросе.
Цитата(lks @ Apr 29 2007, 14:49) *
Меня этот путь не устраивает.
Я месяца полтора назад в Keil-е все это уже попробовал.
Структура у меня заполняется данными замечательно из буфера по указателю, но только когда я указывал на переменную внутри структуры. Это понятно?
Если вы не умеете что-либо делать, то это не значит что это сделать невозможно и не нужно.
Цитата(lks @ Apr 29 2007, 14:49) *
Пример:
struct S{...}s;
struct S* ps;
ps=&s;
не работатет, хотя должен.
Работает, как и должен.
Код
    47          struct S{
     48              uint8_t i;

   \                                 In segment NEAR_Z, align 1, keep-with-next
   \   00000000                      REQUIRE `?<Segment init: NEAR_Z>`
     49          }s;
     50          struct S* ps;
   \                     ps:
   \   00000000                      DS 2
   \                     s:
   \   00000002                      DS 1

   \                                 In segment CODE, align 2, keep-with-next
     51          void Test()
   \                     ??Test:
     52          {
     53              ps = &s;
   \   00000000   ....               LDI     R16, LOW((ps + 2))
   \   00000002   ....               LDI     R17, (ps + 2) >> 8
   \   00000004   ....               LDI     R30, LOW(ps)
   \   00000006   ....               LDI     R31, (ps) >> 8
   \   00000008   8300               ST      Z, R16
   \   0000000A   8311               STD     Z+1, R17
     54              ps->i = 2;
   \   0000000C   E002               LDI     R16, 2
   \   0000000E   8302               STD     Z+2, R16
     55          }
   \   00000010   9508               RET
Цитата(lks @ Apr 29 2007, 14:49) *
Я действительно программы пишу много и давно, только я не преподаватель информатики, я реальные вещи делаю, на реальном "железе". Общетеоретические иссенуации меня не интересуют.
Прекрасно. Продолжайте вещи делать, только не лезьте теоретизировать о вещах, в которых понятия не имеете. Это уже не первое обсуждение, где вам указывают на ваше невежество.
lks
Цитата(Сергей Борщ @ Apr 29 2007, 19:02) *
Ладно, я еще поприкалываюсь


В чем прикол то?
Что тоже педагог?
Откуда вас тут столько набежало?
Педагоги-теоретики достали своей тупостью!


Цитата(Сергей Борщ @ Apr 29 2007, 19:02) *
Продолжайте вещи делать, только не лезьте теоретизировать о вещах, в которых понятия не имеете. Это уже не первое обсуждение, где вам указывают на ваше невежество.


Мне постоянно пытаются разные умники (вроде вас) указывать на что нибудь!
Тут скопляется ужастное количество лингвистов всех мастей - понятия не имеющих о реальных вещах.
А еще других пытаются учить.
Найдут какой-нибудь учебник - мусолят его, мусолят...
А потом умное лицо начинают делать..
Других людей жизни учить...
Спросишь по теме что-нибудь - одни вопли в ответ - типа: "почему не по учебнику спросил".
Учебник я и сам могу прочитать.

По вопросу того индикатора ЖКИ (которым вы меня попрекаете) - мне влом было искать тогда для вас этот ДШ.
Вам он всеравно не нужен был.
Одна болтовня потому-что.
forever failure
Неужели Дохтур Туамосес ?
zltigo
Цитата(lks @ Apr 29 2007, 19:24) *
Что тоже педагог?
Откуда вас тут столько набежало?
Педагоги-теоретики достали своей тупостью!
Мне постоянно пытаются разные умники (вроде вас) указывать на что нибудь!
Тут скопляется ужастное количество лингвистов всех мастей - понятия не имеющих о реальных вещах.
А еще других пытаются учить.
Найдут какой-нибудь учебник - мусолят его, мусолят...
А потом умное лицо начинают делать..
Других людей жизни учить...

Блеск! smile.gif Все слова которые знал - рассказал.
lks
Цитата(zltigo @ Apr 29 2007, 20:36) *
Блеск! smile.gif

Да нет, "блеск" был это когда вы предложили из буфера в структуру копировать данные с ипользованием библиотечной процедуры.
zltigo
Цитата(lks @ Apr 29 2007, 19:46) *
Да нет, "блеск" был это когда вы предложили из буфера в структуру копировать данные с ипользованием библиотечной процедуры.

Так, с явными преобразованием типов указателей в языке 'C' покончили - туды их в качель.
Ну ниасилил sad.gif соболезную.
Переходим к "практической" критике clib.
Чем библиотечные функции ("процедуры" в переводе smile.gif ) не угодили?
А memcpy() конкретно чем? Глючит? Тормозит?
А, наверное вообще не работает! Угадал?
Сергей Борщ
Цитата(lks @ Apr 29 2007, 19:24) *
В чем прикол то?
В том, как вы с пеной у рта несете чушь laugh.gif
Цитата(lks @ Apr 29 2007, 19:24) *
А еще других пытаются учить.
На ваших советах действительно можно учиться - как не надо делать. Продолжайте.
Цитата(lks @ Apr 29 2007, 19:24) *
Учебник я и сам могу прочитать.
А что же до сих пор не прочитали? biggrin.gif biggrin.gif biggrin.gif Или знакомых букв в нем мало?
lks
Цитата(Сергей Борщ @ Apr 29 2007, 22:03) *
В том, как вы с пеной у рта несете чушь laugh.gif На ваших советах действительно можно учиться - как не надо делать. Продолжайте.А что же до сих пор не прочитали? biggrin.gif biggrin.gif biggrin.gif Или знакомых букв в нем мало?


У моего знакомого, по месту работы - есть охранник, у него на столе стоит комп, а раньше он похоже окончил курсы "оператор ПЭВМ". С этого компа шарит по форумам - поднаторел в терминологии, если что не знает спросит в другом форуме или книжку почитает (наверное кто-то забыл в столе). Короче пишет много, авторитетом пользуюется немалым у молодежи - повышает свою "ущемленную" самооценку до уровня - действующего членкора РАН.
Крутой перец - одним словом. (жалко работатет только - два через день).
zltigo
Цитата(lks @ Apr 29 2007, 21:31) *
книжку почитает (наверное кто-то забыл в столе)
.....
Крутой перец - одним словом. (жалко работатет только - два через день).

Ну это не страшно. Раз он сегодня выходной - книжку у него завтра попросите. Почитайте и возвращайтесь.
Ну а если мы Вам чего "ущемили", так это - ничего личного - только за всуе поруганных K&R и язык "С" заступились.
lks
Цитата(zltigo @ Apr 29 2007, 22:41) *
За язык "C" заступились.


Круто сказано.
А что вы еще умеете?
zltigo
Цитата(lks @ Apr 29 2007, 21:50) *
А что вы еще умеете?

На том уровне, на котором Вы программируете, пожалуй, умею все. Ну разве только солист балета из меня будет похуже sad.gif. Немного.
Legotron
bb-offtopic.gif
Уважаемые собеседники!

Не составит ли вам большого труда вкратце еще раз описать проблему (если таковая имеется) и предложить каждой из сторон варианты ее решения! Что можно делать, что нельзя. Кратко в одном сообщении и без перехода на личности.
Поймите меня правильно, я не ограничеваю (типа не модератор, поэтому на то права не имею) дискуссию. Мне бы просто хотелось посмотреть на проблему вцелом (если она конечно есть smile.gif ) и не сталкнуться с ней самому (как-нибудь) smile.gif А то я чего-то ваще не понимаю mainstreama из всего количества сказанного!

Всё, спасибо. Больше не встреваю cheers.gif
zltigo
Цитата(Legotron @ Apr 29 2007, 22:36) *
еще раз описать проблему (если таковая имеется)

В том-то и "проблема", что проблемы нет. Есть с тупым упорством непонимание (элементарнейших sad.gif ) языковых конструкций. Возникшее, как я понимаю, на почве "практического" знания что есть "его величество байт" и уверенности, что все остальное от лукавого. Когда из какой-то книжки и и чужих исходников вылезло чуждое понятие структуры, то ее эмпирическим ("практическим", как любит lks) путем начал насиловать путем выдергивания из всяких текстов кусков и вставления их куда попало. Изнасиловав , возгордился и решил отрекламировать "достижение". С этого и началось. На все надуманные "проблемы" давались ответы, некоторые коллеги пытались и подробно объяснять, но не воспринимались никоим образом. Если вдруг Вы сможете найти в постах lks что-то, на что не был дан ответ, или он был неправильным, или непонятным лично Вам, будте добры, повторите этот вопрос. Обязательно отвечу.
Vladimir Chekin
rezident >> У вас есть адрес Доктора ТуамОсеса??? Оба-на! Это интересно

Нет, не знаком. Я говорю, о реальной фирме, делающей реальную работу. Мифические персонажи оставьте телесиськам, пусть там резвятся вволю, коли заняться нечем smile.gif
Vladimir Chekin
Может и не в кассу, имхо вот в этой короткой фразе нашего заблуждающегося коллеги кроется смысл проблемы:
"Ну тогда обясните почему я всегда могу получить адресс массива через амперсанд не зависимо от типа данных, а от структуры не получается."

Адрес с помощью "операции амперсанд" ПОЛУЧИТЬ можно у любой конструкции языка, а вот ПРИСВОИТЬ любому указателю, хоть он и указывает на такую же длину данных, нельзя. Компилер ругается не на ВЗЯТИЕ, а на ПРИСВОЕНИЕ.

В принципе, это распространённая ошибка ассемблерного прошлого (сужу по себе), т.е. когда человек начинал программить на асме и делал это довольно долго. Поэтому он недоумевает, раз по моей задумке данные по числу байт совпадают, то почему ими нельзя свободно манипулировать? Но С-компилер этого не знает и ругается.

Хотя, это никому уже не интересно. Пошло стандартное кидание какашками. Жалко.
zltigo
Цитата(Vladimir Chekin @ Apr 30 2007, 04:28) *
Хотя, это никому уже не интересно. Пошло стандартное кидание какашками. Жалко.

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





Цитата(Vladimir Chekin @ Apr 30 2007, 04:28) *
В принципе, это распространённая ошибка ассемблерного прошлого (сужу по себе)

Ассемблерное прошлое само по себе никаких отрицательных эффектов нести не может - только исключительно положительные!!! ASM-ы давно уже имеют высокоуровневые навороты и поддерживают структуры данных. Контроллеры давно уже не 8bit и нюансы работы с памятью большой разрядности ASM-овикам очень знакомы.
Описанные проблемы возникают у "программистов" от сохи "от паяльника" с мозгами отполированными многочисленными простейшими 8bit устойствами с ПО писанным в меру понимания с частичным использованием возможностей ASM. Если после этого и скачек по сложности железа/программ, и язык, и каие-то чужие программы.... И к этому приложить болезненно раздутое самомнение - тут уж беригитесь "программисты не знающие с какого конца за паяльник браться" sad.gif.
Dog Pawlowa
Цитата(zltigo @ Apr 30 2007, 13:30) *
Описанные проблемы возникают у "программистов" от сохи "от паяльника" с мозгами отполированными многочисленными простейшими 8bit устойствами с ПО писанным в меру понимания с частичным использованием возможностей ASM.

Не нужно сводить все к ассеблеру или паяльнику. Святой инструмент! smile.gif Я знаю "чистых" программистов, которые и паяльник в руках не держали, и в программировании не сильно продвинулись (те самые отполированные мозги).
Причина в человеке. Это обратная сторона той же медали - действительно, работая с микроконтроллерами, человек, не получив хорошего образования, может самостоятельно творить, получать результат, и при этом имеет право гордиться собой. Другое дело, когда он ссылается на этот результат как аргумент в споре по другой теме.
zltigo
Цитата(Dog Pawlowa @ Apr 30 2007, 17:16) *
Не нужно сводить все к ассеблеру или паяльнику.

Перечисленные мной условия вовсе не являются необходимыми и тем более достаточными для получения "результата" smile.gif ( но способствуют изрядно sad.gif ). Как и то, что профессия "программист" не гарантирует sad.gif написание владельцем сколь-нибудь нормального кода sad.gif.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.