Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 271

Раздел: C++
/ вопрос открыт /

Здравствуйте!
У меня к Вам такой вопрос. Есть структура, описанная через typedef в одном модуле, и есть другой модуль, в котором есть функция, в которую требуется передать структуру. При попытке передачи, компилятор ругается на синтаксис (что не существует такого типа, как бы), но если описание поместить и в этом модуле, становится все ок. Так вот, вопрос: нельзя ли избежать такого повтора кода?
Заранее, спасибо.

Приложение:
  1. // main.c
  2.  
  3. // ...
  4. typedef struct InpData {
  5. double u1 ;
  6. double u2 ;
  7. int tStart ;
  8. int tFinish ;
  9. int t1 ;
  10. int t2 ;
  11.  
  12. double uIn ;
  13. double uOut ;
  14.  
  15. int n ; // tabulation
  16. } InpData;
  17.  
  18. // ...
  19.  
  20. // iofunct.c
  21.  
  22. void get_data(InpData *inp_s) {
  23. inp_s->n =100500;
  24. }
  25.  
  26. //...
  27.  


IlluminatI Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: IlluminatI (статус: 2-ой класс)
Вопрос отправлен: 9 мая 2011, 23:41
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 19; последнее сообщение — 12 мая 2011, 14:18; участников в обсуждении: 4.
bugmenot

bugmenot (статус: 3-ий класс), 10 мая 2011, 00:26 [#1]:

о директиве #include уже знаем?
виконання програми розпочинається з того самого мiсця, де призупинилося.

Вадим К

Вадим К (статус: Академик), 10 мая 2011, 10:42 [#2]:

или эти структуры описаны в файле *.с?
Галочка "подтверждения прочтения" - вселенское зло.
IlluminatI

IlluminatI (статус: 2-ой класс), 10 мая 2011, 15:19 [#3]:

Об #include знаю, предлагаешь создать отдельный файл с описаниями типов и инклудить, где нужно?

Вадим К: да, описана в main.c.
Вадим К

Вадим К (статус: Академик), 10 мая 2011, 15:36 [#4]:

Первое, правильнее - это добавить .h файл и туда перенести объявление.
Второе, вы точно понимаете, что именно за структуру Вы объявили?
Та объявлена структура с именем InpData и переменная InpData типа InpData
Галочка "подтверждения прочтения" - вселенское зло.
IlluminatI

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

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

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

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

IlluminatI (статус: 2-ой класс), 12 мая 2011, 13:41 [#18]:

Я про компилятор имел ввиду, когда стандарты писал :) У меня gcc.
Вадим К

Вадим К (статус: Академик), 12 мая 2011, 14:18 [#19]:

в случае gcc (у меня на данный момент 4.5.1) не ругается. Но те, кто хочет, что бы компилятор был друг и помощник, компилируют свой код с параметрами -Wall -pedantic -Wextra
В этом случае компилятор много интересного расскажет:) кстати, он будет замечать и конструкцию вида if (x = 0).
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:36
Выполнено за 0.04 сек.