Allregia 9 31 января, 2023 Опубликовано 31 января, 2023 · Жалоба Вопрос такой - может ли совпадать тип и имя переменной? Наши алгоритмисты чего-то нагородили в Матлабе, потом сгенерировали сишный код (под STM32), и происходят какие-то совершенно непоняные эффекты. Там сделано примерно так: Определена структура1 с типом структура1. потом определана структура2, одним из членов котороя является массив типа структура1 типа так: typedef struct { type member1; type member2; } struct1; typedef struct { type member1; type member2; struct1 struct1[100]; } struct2; // Эффекты происходят при: const char arr[100]={чего-то тут}; ... void func(struct2 *pstr2_name){ int i; ... for(i=0;i<100;i++) pstr2_name->struct1[i]=arr[i]; ... } Делаешь char tmp[100]; ... for(i=0;i<100;i++) tmp[i]=arr[i]; И все работает. Что вообще компилятор себе надумает, когда имя переменной совпадлает с его типом?! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 31 января, 2023 Опубликовано 31 января, 2023 · Жалоба 27 minutes ago, Allregia said: Что вообще компилятор себе надумает, когда имя переменной совпадлает с его типом?! В С и С++ вылезут соответствующие ошибки компиляции. Проект, разумеется, не соберется с такими грубейшими ошибками. Совпадать должен регистр используемых букв. Если в вашем вопросе имелось ввиду что-то другое, то укажите точнее. 30 minutes ago, Allregia said: struct1 sctruct1[100];} struct2; компилятор сразу пошлет такого пейсателя лесом, учить матчасть - базовые основы по си Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
engel65536 11 31 января, 2023 Опубликовано 31 января, 2023 · Жалоба А где у вас одинаковые имена? Тип зовётся struct1, а поле структуры struct2 зовётся sctruct1 - идентификаторы отличаются. Или это вы сами написали и опечатались? И ещё, если я не ошибаюсь, если вы определяете тип структуры без typedef (то есть как у вас), то при каждом упоминании этого типа вы должны писать не просто yourtype var, а struct yourtype var. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 31 января, 2023 Опубликовано 31 января, 2023 · Жалоба 43 minutes ago, engel65536 said: Или это вы сами написали и опечатались? Разумеется, я исправил. То я с планшета писал. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Variant99 7 31 января, 2023 Опубликовано 31 января, 2023 · Жалоба Ключевое слово struct - зарезервировано, такое имя нельзя давать переменной. Имя типа структуры и имя переменной структуры может совпадато, то есть struct st{ int a; int b; }st; st.a = 2; компилируется и работает без проблем. А в остальном, если имя структуры и имя переменной другого типа будут в одной области видимости, компилятор заявит: "конфликт определений". То есть вот так - нельзя. struct st{ int a; int b; }st; int st; Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 31 января, 2023 Опубликовано 31 января, 2023 · Жалоба 56 minutes ago, Forger said: Проект, разумеется, не соберется с такими грубейшими ошибками. Проект не только собрается, но и работает в железе, на STM32H7. Но ведет себя очень странно, пока не уберешь тот цикл. Прерывание с более низким приоритетом блокирует один вызов прерывания с более высоким, причем происходящее уже после того как первое закончилось. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Variant99 7 31 января, 2023 Опубликовано 31 января, 2023 · Жалоба а тип type member1; это какой тип? Вообще, имена типов обычно оканчиваются на _t, это негласное правило для облегчения восприятия. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 31 января, 2023 Опубликовано 31 января, 2023 · Жалоба 6 minutes ago, Variant99 said: Ключевое слово struct - зарезервировано, такое имя нельзя давать переменной. Его никто и не давал. 6 minutes ago, Variant99 said: Имя типа структуры и имя переменной структуры может совпадато, то есть struct st{ int a; int b; }st; st.a = 2; компилируется и работает без проблем. Это я и хотел спросить. Тогда тем более непонятно откуда глюк возникает. 3 minutes ago, Variant99 said: это какой тип? Неважно, проблема не в нем. 3 minutes ago, Variant99 said: Вообще, имена типов обычно оканчиваются на _t, это негласное правило для облегчения восприятия. Я у себя так и делаю (или вначате большую "Т" ставлю), а у алгоритмистов кодогенератор Матлаба с их помощью много чего наворотить может. Рассмативемый проблемный кусок, не тот что я выше с головы написал, а настоящий - это автоматически сгенерированный матлабом сишный код. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Variant99 7 31 января, 2023 Опубликовано 31 января, 2023 (изменено) · Жалоба Самая банальная ошибка программистов - давать бессмысленные имена типа array или struct1, struct2 Кстати, попробовал - struct1 struct1[100]; пишет уже ошибку сборки: "changes meaning of 'struct1' from 'typedef struct struct1 struct1' [-fpermissive]" и "declaration of 'struct1 <anonymous struct>::struct1 [100]' [-fpermissive]" Изменено 31 января, 2023 пользователем Variant99 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 24 31 января, 2023 Опубликовано 31 января, 2023 · Жалоба 1 hour ago, Allregia said: Что вообще компилятор себе надумает, когда имя переменной совпадлает с его типом?! Регулярно встречал такое в чужих исходниках. Делал рефакторинг под себя. Возможно некий типовой Вижуал Си съедает такой код без проблем. только вроде там struct1 в другом месте было. Вы точно ничего не изменяли после генерации? типа typedef struct my_struct {...} my_struct_t; Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 31 января, 2023 Опубликовано 31 января, 2023 · Жалоба 1 hour ago, Allregia said: Проект не только собрается, но и работает в железе, на STM32H7. Ну-ну, оно и видно Вставьте в "проект" ваш же кусок из первого поста темы: typedef struct { type member1; type member2; } struct1; typedef struct { type member1; type member2; struct1 struct1[100]; } struct2; ошибка будет на строке: struct1 struct1[100]; Чтобы это понять, даже компилятор не нужно запускать. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gridinp 2 31 января, 2023 Опубликовано 31 января, 2023 · Жалоба В 31.01.2023 в 21:13, Forger сказал: Чтобы это понять, даже компилятор не нужно запускать. я бы всё же запустил прежде чем утверждать Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 31 января, 2023 Опубликовано 31 января, 2023 · Жалоба Я не переписывал весь код, писал по памяти. Там структура на структуре и каждая по полторы страницы, и указатели на указатель на указатель. Но в общем, ответ уже дали, что да. тип и имя могут совпадать. Будем завтра искать дальше. Вот я кусочек скопировал: typedef struct { float expp; float varr; float cnt; } rAvgS; typedef struct { float y_prv[2]; float y_N[6]; float y_S[6]; } ED; typedef struct { float S_d[100]; rAvgS pmS; rAvgS pmN; ED ED; } TotAdpt; 2 hours ago, _4afc_ said: Возможно некий типовой Вижуал Си съедает такой код без проблем. Это IAR. 2 hours ago, _4afc_ said: Вы точно ничего не изменяли после генерации? Да я там выше от фонаря писал, те мболее что это вообще не мой проект а соседней группы. Вопрос-же был не в синтаксисе. но некторым оязательно надо вместо прямого ответа начинать цепляться к сторонним вещам. Всем спасибо. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться