|
Вопрос # 5 271/ вопрос открыт / |
|
Здравствуйте!
У меня к Вам такой вопрос. Есть структура, описанная через typedef в одном модуле, и есть другой модуль, в котором есть функция, в которую требуется передать структуру. При попытке передачи, компилятор ругается на синтаксис (что не существует такого типа, как бы), но если описание поместить и в этом модуле, становится все ок. Так вот, вопрос: нельзя ли избежать такого повтора кода?
Заранее, спасибо.
Приложение: Переключить в обычный режим- // main.c
-
- // ...
- typedef struct InpData {
- double u1 ;
- double u2 ;
- int tStart ;
- int tFinish ;
- int t1 ;
- int t2 ;
-
- double uIn ;
- double uOut ;
-
- int n ; // tabulation
- } InpData;
-
- // ...
-
- // iofunct.c
-
- void get_data(InpData *inp_s) {
- inp_s->n =100500;
- }
-
- //...
-
 |
Вопрос задал: IlluminatI (статус: 2-ой класс)
Вопрос отправлен: 9 мая 2011, 23:41
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 19; последнее сообщение — 12 мая 2011, 14:18; участников в обсуждении: 4.
|
bugmenot (статус: 3-ий класс), 10 мая 2011, 00:26 [#1]:
о директиве #include уже знаем?
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
Вадим К (статус: Академик), 10 мая 2011, 10:42 [#2]:
или эти структуры описаны в файле *.с?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
IlluminatI (статус: 2-ой класс), 10 мая 2011, 15:19 [#3]:
Об #include знаю, предлагаешь создать отдельный файл с описаниями типов и инклудить, где нужно?
Вадим К: да, описана в main.c.
|
|
Вадим К (статус: Академик), 10 мая 2011, 15:36 [#4]:
Первое, правильнее - это добавить .h файл и туда перенести объявление.
Второе, вы точно понимаете, что именно за структуру Вы объявили?
Та объявлена структура с именем InpData и переменная InpData типа InpData
Галочка "подтверждения прочтения" - вселенское зло.
|
|
IlluminatI (статус: 2-ой класс), 10 мая 2011, 18:07 [#5]:
Вадим К: сначала не понял о чем речь, но погуглив, вроде дошло. Но: если сделать так:
typedef struct InpData {
double u1 ;
double u2 ;
int tStart ;
int tFinish ;
int t1 ;
int t2 ;
double uIn ;
double uOut ;
int n ; // tabulation
};
т.е объявить только структуру InpData, то компилятор начинает ругаться.
Как будет правильней?
|
|
IlluminatI (статус: 2-ой класс), 10 мая 2011, 18:16 [#6]:
так будет правильно?
struct InpData {
double u1 ; // 8
double u2 ; // 8
int tStart ; // 4
int tFinish ; // 4
int t1 ; // 4
int t2 ; // 4
double uIn ; // 8
double uOut ; // 8
int n ; // 4, tabulation
};
typedef struct InpData InpData;
|
|
Вадим К (статус: Академик), 10 мая 2011, 18:34 [#7]:
можно ещё так
typedef struct{
double u1 ;
double u2 ;
int tStart ;
int tFinish ;
int t1 ;
int t2 ;
double uIn ;
double uOut ;
int n ; // tabulation
} InpData;
Все зависит от того, что хочется получить.
в этом случае создается новый тип.
Если так
struct InpData {
double u1 ; // 8
double u2 ; // 8
int tStart ; // 4
int tFinish ; // 4
int t1 ; // 4
int t2 ; // 4
double uIn ; // 8
double uOut ; // 8
int n ; // 4, tabulation
};
typedef struct InpData InpData;
То тоже создается новый тип, но ещё и тип структура, и нужно объявлять переменные так
struct InpData somevariable;
Галочка "подтверждения прочтения" - вселенское зло.
|
|
IlluminatI (статус: 2-ой класс), 10 мая 2011, 19:02 [#8]:
Т.е чтобы можно было опускать ключевое слово struct при объявлении переменной, нужно использовать первый способ? В этом случае, InpData - имя типа, а не переменной, так?
|
|
Егор (статус: 10-ый класс), 10 мая 2011, 20:45 [#9]:
я обычно делаю так:
typedef struct InpData_s {
....
} InpData_t;
и потом везде использую новый тип (xxx_t):
InpData_t myVar;
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Вадим К (статус: Академик), 11 мая 2011, 00:13 [#10]:
Если мы говорим о с, то typedef нужен, если не хочется объявлять переменные через struct.
Но нужно понимать, что в таком варианте
struct InpData {
double u1 ; /* 8 */
/* ....*/
int n ; /* 4, tabulation */
} test;
объявлен тип struct InpData и переменная test этого типа.
Но как только сделаем так
typedef struct InpData {
double u1 ; /* 8 */
/* ....*/
int n ; /* 4, tabulation */
} test;
test это уже имя типа!
Но! Те объявления, которые Вы привели - они не будут работать в С, но будут работать в С++.
В С++ typedef использовать не обязательно тут можно написать
struct qqq {...}
и потом объявлять как
qqq somevar;
Но спросите, а почему я решил, что там С++? А просто по стилю комментариев. в С нет такого комментария как два слеша
Поэтому, вначале нужно подумать, о каком именно языке мы говорим, а потом решать, как писать. С и С++ это два достаточно разных языка, хотя и считается, что С++ это улучшенный С, но не всякая программа на С скомпилируется в С++.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Егор (статус: 10-ый класс), 11 мая 2011, 04:46 [#11]:
Цитата (Вадим К):
Но спросите, а почему я решил, что там С++? А просто по стилю комментариев. в С нет такого комментария как два слеша
не было изначально. но сейчас есть. я не знаю ни одного компилятора, который бы не поддерживал комментарий //
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Вадим К (статус: Академик), 11 мая 2011, 11:13 [#12]:
комментарии в виде // поддерживается в компиляторах, которые поддерживают стандарт С99. Некоторые старые компиляторы поддерживали это как расширение.
Но есть один важный момент. Комментарии в виде /* */ будут работать всегда. И когда дело доходит до компилятор для встраиваемых систем или телефонов, то...
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Егор (статус: 10-ый класс), 11 мая 2011, 17:54 [#13]:
Цитата (Вадим К):
И когда дело доходит до компилятор для встраиваемых систем
вот с ними как раз у меня и наибольший опыт. работают оба вида комментариев.
я встретил лишь один компилятор, который не поддерживал "//". выпущен он был, по моему, ещё до 1990 года и компилировал под дос.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Егор (статус: 10-ый класс), 11 мая 2011, 18:02 [#14]:
Цитата (Вадим К):
или телефонов софт для телефонов стали писать уж всяко после 99-го года.
в целом, согласен, что двойной слеш явялется стандартом лишь с 99-го года. но практика показывает, что можно спокойно использовать такие комментарии для любого современного (и не очень) компилятора.
ну а если не скомпилится - что страшного? переделать-то недолго
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Вадим К (статус: Академик), 11 мая 2011, 18:26 [#15]:
Ваше право писать как хочется.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
IlluminatI (статус: 2-ой класс), 11 мая 2011, 19:45 [#16]:
>"Но! Те объявления, которые Вы привели - они не будут работать в С, но будут работать в С++."
Очень странно тогда, пишу на С - объявления работали.
>"в С нет такого комментария как два слеша"
Видимо, у меня работают из-за "доработок" в IDE (там можно поставить с99, но и по-умолчанию с89 (если не ошибась), тоже работает ), т.к пишу под Mac OS в NetBeans 7.0 - там два слеша работают, как комментарий
|
|
Вадим К (статус: Академик), 11 мая 2011, 22:49 [#17]:
Вот он ответ! Цитата (IlluminatI):
т.к пишу под Mac OS в NetBeans 7.0 Ни одно, ни другое компилятором не является! NetBeans можно настроить на любой компилятор.
У Вас же скорее всего gcc или clang.
Странно, что человек, который пишет код, путает компилятор и IDE
Галочка "подтверждения прочтения" - вселенское зло.
|
|
IlluminatI (статус: 2-ой класс), 12 мая 2011, 13:41 [#18]:
Я про компилятор имел ввиду, когда стандарты писал У меня gcc.
|
|
Вадим К (статус: Академик), 12 мая 2011, 14:18 [#19]:
в случае gcc (у меня на данный момент 4.5.1) не ругается. Но те, кто хочет, что бы компилятор был друг и помощник, компилируют свой код с параметрами -Wall -pedantic -Wextra
В этом случае компилятор много интересного расскажет кстати, он будет замечать и конструкцию вида if (x = 0).
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|