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

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

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

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

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

possible use of идентификатор before diffinotion(С++)
у меня в компиляторе возникает такое предупреждение, хотя все переменные объявлены ВО ВРЕМЯ.
это происходит на компиляторе Borland 3.01 на borland 3.11 все идет нормально.
хотелось бы узнать почему....код выложить на вряд ли смогу, он на 2500 строк.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rififi
 Аватар для Rififi
2332 / 1047 / 43
Регистрация: 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
 Аватар для Rififi
2332 / 1047 / 43
Регистрация: 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
Почетный модератор
6471 / 2246 / 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
 Аватар для Monte-Cristo
2807 / 1372 / 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
 Аватар для Rififi
2332 / 1047 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
16.06.2009, 19:08     ошибки которых на самом деле нет #10
salvafion,
хотелось бы ответов по теме
теперь ты можешь получить ответ по теме
причина - в этом нуб-коде:

char *tek_data,*god,*mesyac,*chislo
...
gets(tek_data);
Monte-Cristo
 Аватар для Monte-Cristo
2807 / 1372 / 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
 Аватар для Monte-Cristo
2807 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
16.06.2009, 20:04     ошибки которых на самом деле нет #13
Цитата Сообщение от salvafion Посмотреть сообщение
в чем именно проблема....с памятью, с компилятором , или еще с чем...
понимаешь.. ты создаешь указатель на массив символов... область памяти не выделяешь и не связывешь с указателем.. при запуске программы, у тебя указатель будет проинициализирован случайным адресом.. т.е. и запись будет просиходить в случайную область памяти... это чревато потерями данных.. например одна программа хранить в области некий результат своей работы, а потом твоя программа берет и затирает те данные, и размещает тама свои... у тебя может происзойти крэш программы... или еще хуже - системы... твой старый компилятор, не компилировал, так как ты сохранял в область памяти, неинициализированного указателя... новый компилятор, может сохранить.. но ответственность целиком ложится на программсита.. ты должен следить за этим..


Цитата Сообщение от salvafion Посмотреть сообщение
может ли из-за этого в структурах к полям фиксированного размера дописываться мусор.
при неаккуратном использовании может... поэтому советую их инициализировать '\0'..
Rififi
 Аватар для Rififi
2332 / 1047 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
16.06.2009, 20:08     ошибки которых на самом деле нет #14
salvafion,
прям так все понятно сразу стало))хоть я и догадывался что в этом дело...
а что, нынешнее поколение специализированную литературу уже не признаёт?
твою кривизну объясняют в любом учебнике по C/С++ в разделе указатели.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1345 / 878 / 51
Регистрация: 02.01.2009
Сообщений: 2,643
Записей в блоге: 1
16.06.2009, 20:10     ошибки которых на самом деле нет #15
Цитата Сообщение от Rififi Посмотреть сообщение
а что, нынешнее поколение специализированную литературу уже не признаёт?
как видишь оно так и есть.
salvafion
10 / 10 / 1
Регистрация: 16.06.2009
Сообщений: 193
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 секунды
и еще он почему то в строчные фиксированные массивы записывает несколько лишних совершенно левых знаков..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2009, 09:51     ошибки которых на самом деле нет
Еще ссылки по теме:

что же на самом деле делает strcpy? C++
C++ Вывести на экран слова, в которых все символы повторяющиеся, или сообщение «Нет», если требуемых слов нет
C++ Почему нет ошибки?
C++ Что такое string на самом деле?
Оператор \ выражение - что же это такое на самом деле? C++

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

Или воспользуйтесь поиском по форуму:
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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' и тут он не будет первым, потому что будет четырнадцатым
Yandex
Объявления
17.06.2009, 09:51     ошибки которых на самом деле нет
Ответ Создать тему
Опции темы

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