язык С
От: Gorn  
Дата: 06.10.04 08:11
Оценка:
Весь вечер вчера просидел.. Скажите, где не прав, а то начинаю сомневаться в своем понимании языка...

файл table.h


struct Entry
{
    int i;
};

void AddToTable ();



файл main.c


int main(int argc, char* argv[])
{
    AddToTable ("", 0, 0);

    struct Entry e;
    return 0;
}


На строке
struct Entry e;


ошибка

error C2143: syntax error : missing ';' before 'type'


Спасибо....
Re: язык С
От: Vamp Россия  
Дата: 06.10.04 08:15
Оценка:
А где прототип AddToTable с тремя параметрами?
Да здравствует мыло душистое и веревка пушистая.
Re: язык С
От: Bell Россия  
Дата: 06.10.04 08:16
Оценка:
Здравствуйте, Gorn, Вы писали:

G>Весь вечер вчера просидел.. Скажите, где не прав, а то начинаю сомневаться в своем понимании языка...


G>файл table.h



G>
G>typedef struct 
G>{
G>    int i;
G>} Entry;

G>
Любите книгу — источник знаний (с) М.Горький
Re: язык С
От: Guard_h4s Россия  
Дата: 06.10.04 08:16
Оценка: -1
Здравствуйте, Gorn, Вы писали:

...
G>
G>struct Entry
G>{
G>    int i;
G>};

G>void AddToTable ();
G>

...

Это не определение типа, а создание глобального экземпляра структуры, надо так
typedef struct 
{
    int i;
}Entry;


теперь Entry — это тип.
Re[2]: язык С
От: Gorn  
Дата: 06.10.04 08:17
Оценка:
пробовал, то же самое...
Re[2]: язык С
От: Gorn  
Дата: 06.10.04 08:17
Оценка:
Здравствуйте, Vamp, Вы писали:

V>А где прототип AddToTable с тремя параметрами?

ошибся... прототип такой:

void AddToTable ();
Re: язык С
От: Gorn  
Дата: 06.10.04 08:19
Оценка:
да, еще интересный момент: эти две строчки (вызов функции и создание экземпляра структуры) работают по отдельности (!), но не вместе...
Re: язык С
От: Demon Россия  
Дата: 06.10.04 08:21
Оценка: 1 (1) +1
Здравствуйте, Gorn, Вы писали:

G>файл table.h


G>
G>struct Entry
G>{
G>    int i;
G>};

G>void AddToTable ();
G>



G>файл main.c


G>
G>int main(int argc, char* argv[])
G>{
G>    AddToTable ("", 0, 0);

G>    struct Entry e;
G>    return 0;
G>}
G>


G>На строке

G>
G>struct Entry e;
G>


1. Исправь несоответсвие типов AddToTable
в table.h она объявлена без параметров, а используется с параметрами
Но ошибка не из-за этого.
2. В С (не С++) переменные должны объявляться в начале блока.
Т.е. Нужно делать так:
int main(int argc, char* argv[])
{
    struct Entry e;
    AddToTable ("", 0, 0);
    return 0;
}
Re: язык С
От: Sheridan Россия  
Дата: 06.10.04 08:22
Оценка:
Здравствуйте, Gorn, Вы писали:

А зачем это?

[сcode]
int main(int argc, char* argv[])
{
AddToTable ("", 0, 0);

struct Entry e;
return 0;
}
[/сcode]
Без struct не пробовал?
-=RSDN@Home 1.1.4 beta 3 rev. 190=- [...]
Matrix has you...
Re[2]: язык С
От: Gorn  
Дата: 06.10.04 08:22
Оценка:
спасибо... Все понятно...
Re[3]: язык С
От: Demon Россия  
Дата: 06.10.04 08:25
Оценка:
Здравствуйте, Gorn, Вы писали:

G>спасибо... Все понятно...

А почему так грустно?
Оно работает?
Re: язык С
От: PVA  
Дата: 06.10.04 08:30
Оценка:
Здравствуйте, Gorn, Вы писали:

G>Весь вечер вчера просидел.. Скажите, где не прав, а то начинаю сомневаться в своем понимании языка...


В языке С переменные должны быть объявлены в начале, до какой-либо функциональности/
Примерно так:
struct Entry
{
    int a;
};

void AddFun();

int main(int argc, char *argv[])
{
    struct Entry m;

    AddFun();

    return 0;
}
newbie
Re[2]: язык С
От: achp  
Дата: 06.10.04 11:03
Оценка: 3 (1)
Здравствуйте, Demon, Вы писали:

D>1. Исправь несоответсвие типов AddToTable

D> в table.h она объявлена без параметров, а используется с параметрами

В table.h функция объявлена как принимающая произвольные параметры (без прототипа), так что несоответствия типов нет.
Я кончил, джентльмены, мне остается только поблагодарить вас за внимание.
Re[2]: язык С
От: Lorenzo_LAMAS  
Дата: 06.10.04 13:13
Оценка:
PVA>В языке С переменные должны быть объявлены в начале, до какой-либо функциональности/

В языке С переменные можно объявлять в начале блока, т.е. не обязательно в начале определения функции.
void Foo();
int Bar();
void fun(void)
{
  int i;
  Foo();

  if(Bar())
  {
     int k = 0;
     Foo();
     {
         int k1 = 1;
     }
  }
}


Кроме того, можно вот так

void f()
{
   //
   SomeFun();
   for (int i = 0; ;){}
}
Of course, the code must be complete enough to compile and link.
Re[3]: язык С
От: PVA  
Дата: 06.10.04 13:55
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

PVA>>В языке С переменные должны быть объявлены в начале, до какой-либо функциональности/


L_L>В языке С переменные можно объявлять в начале блока, т.е. не обязательно в начале определения функции.

Согласен

L_L>Кроме того, можно вот так

А вот так низзя!!!
L_L>
L_L>void f()
L_L>{
L_L>   //
L_L>   SomeFun();
L_L>   for (int i = 0; ;){}
L_L>}
L_L>


но можно вот так:
void f()
{
//
   SomeFun();
   {
      int i;
      for (i = 0; ;){}
   }
}
newbie
Re[4]: язык С
От: Lorenzo_LAMAS  
Дата: 06.10.04 13:57
Оценка:
PVA>А вот так низзя!!!

Хехе, так в С99 можно и если у тебя компилятор хороший ...
Of course, the code must be complete enough to compile and link.
Re[2]: язык С
От: _wqwa США  
Дата: 07.10.04 09:05
Оценка:
Здравствуйте, Demon, Вы писали:

D>2. В С (не С++) переменные должны объявляться в начале блока.

D> Т.е. Нужно делать так:
D>
D>int main(int argc, char* argv[])
D>{
D>    struct Entry e;
D>    AddToTable ("", 0, 0);
D>    return 0;
D>}
D>


Если быть точным, то С99 позволяет смешивать объявления переменных и рабочий код, равно как и не позволяет так свободно обращаться с декларациями функций, но, понятно, не везде этого уже придерживаются
... << RSDN@Home 1.1.3 stable >>
Кто здесь?!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.