10 / 10 / 1
Регистрация: 16.06.2009
Сообщений: 194
1

ошибки которых на самом деле нет

16.06.2009, 13:08. Показов 1407. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
possible use of идентификатор before diffinotion(С++)
у меня в компиляторе возникает такое предупреждение, хотя все переменные объявлены ВО ВРЕМЯ.
это происходит на компиляторе Borland 3.01 на borland 3.11 все идет нормально.
хотелось бы узнать почему....код выложить на вряд ли смогу, он на 2500 строк.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.06.2009, 13:08
Ответы с готовыми решениями:

На самом деле #define'а нету.
На самом деле #define нету. Вот например если мы напишем в c++ #define yes 1 #define no 0 то на...

Число double 0.1 на самом деле не 0.1
Кто сталкивался с таким глюком, почему если я задаю double x=0.1; в дебаггере я его вижу как...

Что такое ссылка на самом деле?
Здравствуйте. Насколько я понимаю, ссылка - это переменная, которая на самом деле является...

Что такое string на самом деле?
Всем привет! Столкнулся с проблемой и никак не могу разобраться. Мне необходимо из строки...

16
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
16.06.2009, 13:10 2
хотелось бы узнать почему
компилятор считает себя умнее?
0
10 / 10 / 1
Регистрация: 16.06.2009
Сообщений: 194
16.06.2009, 13:13  [ТС] 3
не думаю что это так.....раз он говорит что они не объявлены перед использованием хотя они объявлены....
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
16.06.2009, 13:49 4
мало ли что ты там не думаешь. ты сначала думал, а потом можешь и передумать. а компилятор - железный, он не передумает (((:
0
10 / 10 / 1
Регистрация: 16.06.2009
Сообщений: 194
16.06.2009, 16:19  [ТС] 5
хотелось бы ответов по теме, если не знаете не пишите пожалуйста
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
16.06.2009, 16:20 6
Ну, я верю компилеру. Можно было бы и код увидеть. Хотя бы ввиде вложения. А остальные компилеры как?
0
10 / 10 / 1
Регистрация: 16.06.2009
Сообщений: 194
16.06.2009, 16:30  [ТС] 7
вот одна из функций в которой он это делает
char *tek_data,*god,*mesyac,*chislo;вот объявление
while(1)
{
puts("vvedite tekush'uy datu i vremya(DD.MM.YY CH:MM):");
gets(tek_data);
if(strlen(tek_data)==14&&tek_data!='\0')break;
puts("Neverniy vvod!");

}
а вот здесь использование и вот в этом месте borland 3.01 говорит что использование до описания переменной tek_data на других(высших версиях) оно нормально конечно...но хотелось бы узнать из за чего здесь он ошибку находит.
с переменными *god,*mesyac,*chislo то же самое
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
void Reboot_Date(FILE *f_reis)
{
   int i,god_int,mesyac_int,chislo_int;
   char *tek_data,*god,*mesyac,*chislo;
   int reis_count, reis_max;
  //long pos;// prev, next;
   I_REIS table_reis[REIS_SZ];
 
   rewind(f_reis);
   fread(&reis_count,sizeof(int),1,f_reis);
   fread(&reis_max,sizeof(int),1,f_reis);
   fread(table_reis,sizeof(table_reis),1,f_reis);
   i=0;
 
   while(1)
     {
      puts("vvedite tekush'uy datu i vremya(DD.MM.YY CH:MM):");
      gets(tek_data);
      if(strlen(tek_data)==14&&tek_data!='\0')break;
      puts("Neverniy vvod!");
 
     }
 
   while(i!=reis_count)
     {
      while(1)
    {
     if(DateTimeCmp(table_reis[i].viezd_data[0]->data_viezda,tek_data)<0)
      {
 
       for(int j=0;j<REIS_SZ;j++)
         {
          table_reis[i].viezd_data[j]=table_reis[i].viezd_data[i+1];
 
         }
       //generirovanie dat
       strncpy(god,&table_reis[i].viezd_data[REIS_SZ-2]->data_viezda[6],2);      god[2]='\0';
       strncpy(mesyac,&table_reis[i].viezd_data[REIS_SZ-2]->data_viezda[3],2);   mesyac[2]='\0';
       strncpy(chislo,table_reis[i].viezd_data[REIS_SZ-2]->data_viezda,2);       chislo[2]='\0';
       god_int=atoi(god);//perevodim is char v int
       mesyac_int=atoi(mesyac);
       chislo_int=atoi(chislo);
       i=0;
 
 
        if(table_reis[i].period==0)
        {
         if(chislo_int>=30) {mesyac_int++;chislo_int=1;
         if(mesyac_int>=13){god_int++;mesyac_int=1;}   }
 
         else chislo_int++;
 
        itoa(chislo_int,chislo,10);//perevodim is int v char
        itoa(mesyac_int,mesyac,10);
        itoa(god_int,god,10);
        if(chislo_int<10) strcat("0",chislo);
        strcat(chislo,".");
        if(mesyac_int<10) strcat(chislo,"0");
        strcat(chislo,mesyac);
        strcat(chislo,".");
        if(god_int<10) strcat(chislo,"0");
        strcat(chislo,god);
        strcat(chislo," ");
        strcat(chislo,table_reis[i].vr_viezda);
        strcpy(table_reis[i].viezd_data[REIS_SZ-1]->data_viezda,chislo);
 
        }
         if((table_reis[i].period==1)||(table_reis[i].period==2))
           {
        chislo_int=chislo_int+2;
        if(chislo_int>=31) {mesyac_int++;chislo_int=table_reis[i].period;
        if(mesyac_int>=13){god_int++;mesyac_int=1;}   }
 
 
        itoa(chislo_int,chislo,10);
        itoa(mesyac_int,mesyac,10);
        itoa(god_int,god,10);
        if(chislo_int<10) strcat("0",chislo);
        strcat(chislo,".");
        if(mesyac_int<10) strcat(chislo,"0");
        strcat(chislo,mesyac);
        strcat(chislo,".");
        if(god_int<10) strcat(chislo,"0");
        strcat(chislo,god);
        strcat(chislo," ");
        strcat(chislo,table_reis[i].vr_viezda);
        strcpy(table_reis[i].viezd_data[REIS_SZ-1]->data_viezda,chislo);
 
 
           }
      }
      else break;
     }
      i++;
   }
 
}
0
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
16.06.2009, 16:38 8
ну естевственно! куда же вы сохраняете функцией gets()?
в указатель... память же у вас не выделена!! вы либо выделяйте память, либо пишите:
не char *tek_data, а char tek_data[50] и т.д.
1
10 / 10 / 1
Регистрация: 16.06.2009
Сообщений: 194
16.06.2009, 18:45  [ТС] 9
Monte-Cristo, а можно char* tek_data = new char?
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
16.06.2009, 19:08 10
salvafion,
хотелось бы ответов по теме
теперь ты можешь получить ответ по теме
причина - в этом нуб-коде:

char *tek_data,*god,*mesyac,*chislo
...
gets(tek_data);
0
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
16.06.2009, 19:48 11
Цитата Сообщение от salvafion Посмотреть сообщение
Monte-Cristo, а можно char* tek_data = new char?
тогда уже
C++
1
char* tek_data = new char[50]; // 50 - это длина строки
но лучше просто написать
C++
1
char tek_data[50];
использование будет одинаоквым, но ты избавишься от необходимости удаления выделенной области памяти.
0
10 / 10 / 1
Регистрация: 16.06.2009
Сообщений: 194
16.06.2009, 19:54  [ТС] 12
Rififi, спасибо что объяснил...прям так все понятно сразу стало))хоть я и догадывался что в этом дело...ты объясни в чем именно проблема....с памятью, с компилятором , или еще с чем...

Добавлено через 4 минуты 26 секунд
Monte-Cristo,спасибо, но вот еще вопрос: может ли из-за этого в структурах к полям фиксированного размера дописываться мусор. т.е. есть строковое поле размером 5 в него мы записываем значение а оно при переходе в kheue. функцию дописывает туда еще значений 10 всякого разного борохла, а так же местами заменяет строковые константы на всякий мусор...
0
2816 / 1407 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
16.06.2009, 20:04 13
Цитата Сообщение от salvafion Посмотреть сообщение
в чем именно проблема....с памятью, с компилятором , или еще с чем...
понимаешь.. ты создаешь указатель на массив символов... область памяти не выделяешь и не связывешь с указателем.. при запуске программы, у тебя указатель будет проинициализирован случайным адресом.. т.е. и запись будет просиходить в случайную область памяти... это чревато потерями данных.. например одна программа хранить в области некий результат своей работы, а потом твоя программа берет и затирает те данные, и размещает тама свои... у тебя может происзойти крэш программы... или еще хуже - системы... твой старый компилятор, не компилировал, так как ты сохранял в область памяти, неинициализированного указателя... новый компилятор, может сохранить.. но ответственность целиком ложится на программсита.. ты должен следить за этим..


Цитата Сообщение от salvafion Посмотреть сообщение
может ли из-за этого в структурах к полям фиксированного размера дописываться мусор.
при неаккуратном использовании может... поэтому советую их инициализировать '\0'..
0
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
16.06.2009, 20:08 14
salvafion,
прям так все понятно сразу стало))хоть я и догадывался что в этом дело...
а что, нынешнее поколение специализированную литературу уже не признаёт?
твою кривизну объясняют в любом учебнике по C/С++ в разделе указатели.
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
16.06.2009, 20:10 15
Цитата Сообщение от Rififi Посмотреть сообщение
а что, нынешнее поколение специализированную литературу уже не признаёт?
как видишь оно так и есть.
0
10 / 10 / 1
Регистрация: 16.06.2009
Сообщений: 194
17.06.2009, 06:55  [ТС] 16
ну тут вы конечно правы)))за год который я учу С++ я ни разу не открыл ни одного учебника по с++)))))так что если что извеняйте))не со зла

Добавлено через 6 минут 22 секунды
а вот здесь в чем проблема
if(((j+1)%7)==0) getch();//Каждые 7 ожидать нажатия клавиши для продолжения
такая же ошибка только с интовской переменной j
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void Print_Reis(FILE*&f_reis)
{
 int reis_count,reis_max, i,j;
 I_REIS table_reis[REIS_SZ];
 //long pos;
 
 clrscr();
 puts("SPISOK REISOV:\n");
 
 rewind(f_reis);
 fread(&reis_count,sizeof(int),1,f_reis);
 fread(&reis_max,sizeof(int),1,f_reis);
 if(reis_count==0){ puts("reisov net!");getch(); return;}
 
 fread(table_reis,sizeof(table_reis),1,f_reis);//Загрузка в память таблицы из базы данных
 
   printf("+-----------+-----------------+--------+-------+------+\n");
   printf("| Nomer     |     Punkti      | Vremya |  Cena | Vsego|\n");
   printf("| marshruta |   sledovaniya   | v puti | bileta|  mest|\n");
   printf("+-----------+-----------------+--------+-------+------+\n");
 
 for(i=0;i<reis_count;i++)
    {
     //pos=table_reis[i].pos;
     // while(pos!=EOF)
     // {
     printf("|  %3d  |%16s| %5d | %5d |  %3d  |\n",table_reis[i].num, table_reis[i].name_marsh[0], table_reis[i].time, table_reis[i].price, table_reis[i].k_mest);
     printf("|       |%16s|       |       |   |\n", table_reis[i].name_marsh[1]);
     printf("+-------+----------------+-------+\n");
     if(((j+1)%7)==0) getch();//Каждые 7 ожидать нажатия клавиши для продолжения
     j++;
 
   //   }
    }
getch();
}
Добавлено через 10 часов 19 минут 23 секунды
и еще он почему то в строчные фиксированные массивы записывает несколько лишних совершенно левых знаков..
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
17.06.2009, 09:51 17
C
1
2
    if (strlen(tek_data) == 14 && tek_data != '\0')
        break;
надо

C
1
2
    if (strlen(tek_data) == 14 && *tek_data != '\0')
        break;
вообще конечно надо

C
1
2
    if (strlen(tek_data) == 14)
        break;
потому что strlen как раз и будет искать первый '\0' и тут он не будет первым, потому что будет четырнадцатым
0
17.06.2009, 09:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2009, 09:51
Помогаю со студенческими работами здесь

что же на самом деле делает strcpy?
вот такой пример #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main () {...

Передача массива в функцию - что на самом деле предается?
Имя массива это константный указатель. Когда мы передаем его в функциюvoid f1(int *iArray) f1 это...

Оператор \ выражение - что же это такое на самом деле?
Какого ... выражение называют оператором?

Ссылки на сапе: есть на самом деле но нет в индексе.
Здраствуйте. C февраля начал закупать на свой ресурс сcылки на сапе и на этой неделе решил...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru