Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
salvafion
10 / 10 / 1
Регистрация: 16.06.2009
Сообщений: 193
#1

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

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

possible use of идентификатор before diffinotion(С++)
у меня в компиляторе возникает такое предупреждение, хотя все переменные объявлены ВО ВРЕМЯ.
это происходит на компиляторе Borland 3.01 на borland 3.11 все идет нормально.
хотелось бы узнать почему....код выложить на вряд ли смогу, он на 2500 строк.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
16.06.2009, 13:10     ошибки которых на самом деле нет #2
хотелось бы узнать почему
компилятор считает себя умнее?
salvafion
10 / 10 / 1
Регистрация: 16.06.2009
Сообщений: 193
16.06.2009, 13:13  [ТС]     ошибки которых на самом деле нет #3
не думаю что это так.....раз он говорит что они не объявлены перед использованием хотя они объявлены....
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
16.06.2009, 13:49     ошибки которых на самом деле нет #4
мало ли что ты там не думаешь. ты сначала думал, а потом можешь и передумать. а компилятор - железный, он не передумает (((:
salvafion
10 / 10 / 1
Регистрация: 16.06.2009
Сообщений: 193
16.06.2009, 16:19  [ТС]     ошибки которых на самом деле нет #5
хотелось бы ответов по теме, если не знаете не пишите пожалуйста
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
16.06.2009, 16:20     ошибки которых на самом деле нет #6
Ну, я верю компилеру. Можно было бы и код увидеть. Хотя бы ввиде вложения. А остальные компилеры как?
salvafion
10 / 10 / 1
Регистрация: 16.06.2009
Сообщений: 193
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++;
   }
 
}
Monte-Cristo
2788 / 1374 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
16.06.2009, 16:38     ошибки которых на самом деле нет #8
ну естевственно! куда же вы сохраняете функцией gets()?
в указатель... память же у вас не выделена!! вы либо выделяйте память, либо пишите:
не char *tek_data, а char tek_data[50] и т.д.
salvafion
10 / 10 / 1
Регистрация: 16.06.2009
Сообщений: 193
16.06.2009, 18:45  [ТС]     ошибки которых на самом деле нет #9
Monte-Cristo, а можно char* tek_data = new char?
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
16.06.2009, 19:08     ошибки которых на самом деле нет #10
salvafion,
хотелось бы ответов по теме
теперь ты можешь получить ответ по теме
причина - в этом нуб-коде:

char *tek_data,*god,*mesyac,*chislo
...
gets(tek_data);
Monte-Cristo
2788 / 1374 / 30
Регистрация: 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];
использование будет одинаоквым, но ты избавишься от необходимости удаления выделенной области памяти.
salvafion
10 / 10 / 1
Регистрация: 16.06.2009
Сообщений: 193
16.06.2009, 19:54  [ТС]     ошибки которых на самом деле нет #12
Rififi, спасибо что объяснил...прям так все понятно сразу стало))хоть я и догадывался что в этом дело...ты объясни в чем именно проблема....с памятью, с компилятором , или еще с чем...

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


Цитата Сообщение от salvafion Посмотреть сообщение
может ли из-за этого в структурах к полям фиксированного размера дописываться мусор.
при неаккуратном использовании может... поэтому советую их инициализировать '\0'..
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
16.06.2009, 20:08     ошибки которых на самом деле нет #14
salvafion,
прям так все понятно сразу стало))хоть я и догадывался что в этом дело...
а что, нынешнее поколение специализированную литературу уже не признаёт?
твою кривизну объясняют в любом учебнике по C/С++ в разделе указатели.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2009, 20:10     ошибки которых на самом деле нет
Еще ссылки по теме:
C++ Вывести на экран слова, в которых все символы повторяющиеся, или сообщение «Нет», если требуемых слов нет
Найти слова, буквы которых расположены по алфавиту и слова, в которых нет повторяющихся букв C++
C++ Почему нет ошибки?
Почему нет ошибки? C++
C++ Переполение массива - нет ошибки

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

Или воспользуйтесь поиском по форуму:
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
16.06.2009, 20:10     ошибки которых на самом деле нет #15
Цитата Сообщение от Rififi Посмотреть сообщение
а что, нынешнее поколение специализированную литературу уже не признаёт?
как видишь оно так и есть.
Yandex
Объявления
16.06.2009, 20:10     ошибки которых на самом деле нет
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru