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

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

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

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

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

possible use of идентификатор before diffinotion(С++)
у меня в компиляторе возникает такое предупреждение, хотя все переменные объявлены ВО ВРЕМЯ.
это происходит на компиляторе Borland 3.01 на borland 3.11 все идет нормально.
хотелось бы узнать почему....код выложить на вряд ли смогу, он на 2500 строк.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2009, 13:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос ошибки которых на самом деле нет (C++):

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

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

что же на самом деле делает strcpy? - C++
вот такой пример #include <iostream> #include <string> using namespace std; int main () { string buff; buff += "what a...

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

Что такое string на самом деле? - C++
Всем привет! Столкнулся с проблемой и никак не могу разобраться. Мне необходимо из строки string str получить unsignet char* для...

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

16
Rififi
2359 / 1052 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
16.06.2009, 13:10 #2
хотелось бы узнать почему
компилятор считает себя умнее?
0
salvafion
10 / 10 / 1
Регистрация: 16.06.2009
Сообщений: 194
16.06.2009, 13:13  [ТС] #3
не думаю что это так.....раз он говорит что они не объявлены перед использованием хотя они объявлены....
0
Rififi
2359 / 1052 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
16.06.2009, 13:49 #4
мало ли что ты там не думаешь. ты сначала думал, а потом можешь и передумать. а компилятор - железный, он не передумает (((:
0
salvafion
10 / 10 / 1
Регистрация: 16.06.2009
Сообщений: 194
16.06.2009, 16:19  [ТС] #5
хотелось бы ответов по теме, если не знаете не пишите пожалуйста
0
Vourhey
Почетный модератор
6485 / 2259 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
16.06.2009, 16:20 #6
Ну, я верю компилеру. Можно было бы и код увидеть. Хотя бы ввиде вложения. А остальные компилеры как?
0
salvafion
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
Monte-Cristo
2790 / 1376 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
16.06.2009, 16:38 #8
ну естевственно! куда же вы сохраняете функцией gets()?
в указатель... память же у вас не выделена!! вы либо выделяйте память, либо пишите:
не char *tek_data, а char tek_data[50] и т.д.
1
salvafion
10 / 10 / 1
Регистрация: 16.06.2009
Сообщений: 194
16.06.2009, 18:45  [ТС] #9
Monte-Cristo, а можно char* tek_data = new char?
0
Rififi
2359 / 1052 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
16.06.2009, 19:08 #10
salvafion,
хотелось бы ответов по теме
теперь ты можешь получить ответ по теме
причина - в этом нуб-коде:

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

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


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

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

Вывести на экран слова, в которых все символы повторяющиеся, или сообщение «Нет», если требуемых слов нет - C++
Дана последовательность символов, состоящая из слов. Вывести на экран слова, в которых все символы повторяющиеся, или сообщение «Нет», если...

Найти слова, буквы которых расположены по алфавиту и слова, в которых нет повторяющихся букв - C++
Разработать алгоритм и программу. Вводится текст из заглавных и строчных латинских букв,пробелов.Количество символов не должно превышать...

Почему нет ошибки? - C++
Метод IsEmpty() класса указываю константным. Но в нем я изменяю состояние класса. Почему нет ошибки, а только предупреждение? ...


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

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

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