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

Тип и имя переменной одинаковые?

Вопрос такой - может ли совпадать тип и имя переменной?

Наши алгоритмисты чего-то нагородили в Матлабе, потом сгенерировали сишный код (под 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];
	

И все работает.

Что вообще компилятор себе надумает, когда имя переменной совпадлает с его типом?!

 

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


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

27 minutes ago, Allregia said:

Что вообще компилятор себе надумает, когда имя переменной совпадлает с его типом?!

В С и С++ вылезут соответствующие ошибки компиляции. Проект, разумеется, не соберется с такими грубейшими ошибками.

Совпадать должен регистр используемых букв.

 

Если в вашем вопросе имелось ввиду что-то другое, то укажите точнее.

30 minutes ago, Allregia said:
struct1 sctruct1[100];} struct2;

компилятор сразу пошлет такого пейсателя лесом, учить матчасть - базовые основы по си

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


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

А где у вас одинаковые имена? Тип зовётся struct1, а поле структуры struct2 зовётся sctruct1 - идентификаторы отличаются. Или это вы сами написали и опечатались?

И ещё, если я не ошибаюсь, если вы определяете тип структуры без typedef (то есть как у вас), то при каждом упоминании этого типа вы должны писать не просто yourtype var, а struct yourtype var.

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


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

43 minutes ago, engel65536 said:

Или это вы сами написали и опечатались?

Разумеется, я исправил.

То я с планшета писал.

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


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

Ключевое слово struct - зарезервировано, такое имя нельзя давать переменной. Имя типа структуры и имя переменной структуры может совпадато, то есть
 

struct st{
	int a;
	int b;
}st;

st.a = 2;

компилируется и работает без проблем.

А в остальном, если имя структуры и имя переменной другого типа будут в одной области видимости, компилятор заявит: "конфликт определений". То есть вот так - нельзя.

struct st{
	int a;
	int b;
}st;

int st;

 

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


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

56 minutes ago, Forger said:

Проект, разумеется, не соберется с такими грубейшими ошибками.

Проект не только собрается, но  и работает в железе, на STM32H7.

Но ведет себя очень странно, пока не уберешь тот цикл. Прерывание с более низким приоритетом блокирует один вызов прерывания с более высоким, причем происходящее уже после того как первое закончилось.

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


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

а тип 

type member1; 

это какой тип?

Вообще, имена типов обычно оканчиваются на _t, это негласное правило для облегчения восприятия.

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


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

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, это негласное правило для облегчения восприятия.

Я у себя так и делаю (или вначате большую "Т" ставлю), а у алгоритмистов  кодогенератор Матлаба с их помощью много чего наворотить может.

Рассмативемый проблемный кусок, не тот что я выше с головы написал, а настоящий - это автоматически сгенерированный матлабом сишный код.

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


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

Самая банальная ошибка программистов - давать бессмысленные имена типа array или struct1, struct2

Кстати, попробовал - 

struct1 struct1[100];

пишет уже ошибку сборки: "changes meaning of 'struct1' from 'typedef struct struct1 struct1' [-fpermissive]" и "declaration of 'struct1 <anonymous struct>::struct1 [100]' [-fpermissive]"

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

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


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

1 hour ago, Allregia said:

Что вообще компилятор себе надумает, когда имя переменной совпадлает с его типом?!

Регулярно встречал такое в чужих исходниках. Делал рефакторинг под себя.

Возможно некий типовой Вижуал Си съедает такой код без проблем.

 

только вроде там struct1 в другом месте было. Вы точно ничего не изменяли после генерации?

типа typedef struct my_struct {...} my_struct_t;

 

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


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

1 hour ago, Allregia said:

Проект не только собрается, но  и работает в железе, на STM32H7.

Ну-ну, оно и видно :dirol: Вставьте в "проект" ваш же кусок из первого поста темы:

typedef struct {   
  type member1;   
  type member2;
} struct1;
  
typedef struct {
    type member1;   
    type member2;   
    struct1 struct1[100];
} struct2;

ошибка будет на строке:

struct1 struct1[100];

Чтобы это понять, даже компилятор не нужно запускать.

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


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

В 31.01.2023 в 21:13, Forger сказал:

Чтобы это понять, даже компилятор не нужно запускать.

я бы всё же запустил прежде чем утверждать

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


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

Я не переписывал весь код, писал по памяти. Там структура на структуре и каждая по полторы страницы, и указатели на указатель на указатель.  Но в общем, ответ уже дали, что да. тип и имя могут совпадать. Будем завтра искать дальше.

 

Вот я кусочек скопировал:

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:

Вы точно ничего не изменяли после генерации?

Да я там выше от фонаря писал, те мболее что это вообще не мой проект а соседней группы.

Вопрос-же был не в синтаксисе. но некторым оязательно надо вместо прямого ответа начинать цепляться к сторонним вещам.

Всем спасибо.

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


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

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...