powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Где он обращается к несуществующей памяти?(
7 сообщений из 7, страница 1 из 1
Где он обращается к несуществующей памяти?(
    #38176532
Фотиния
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем здравствуйте! Прошу помощи, ибо замучилась с этим си.
Суть: приведеная ниже функция проходит свое тело до конца, однако на выходе выдает Access violation ... in module Proeсt.exe, потом при попытке завершить программу пишет abnormal program termination. Кое как отловила ошибку, до этого catch не мог ее отследить прога просто висла и все.

Код: plaintext
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.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
int TFKalend::zapisGrafik(int KodRasch, AnsiString Tip, AnsiString VidRasch, TDateTime NachDate, TDateTime KonDate, int KodSootv=0)
{
  TDateTime d1,d2,d3,d4;
  AnsiString Mas[3];
  int kolCikl=2;
  if ((VidRasch=="kolCokol")||(VidRasch=="kolEtazh1")||(VidRasch=="KolOstalEtazh"))
  {

     AnsiString b;
     if (VidRasch=="kolCokol") b="301";
       else if (VidRasch=="kolEtazh1") b="302";
              else b="303";


     FMain->ZaprosOpen(ADOQ,"Select t1.Znachenie[t1],t2.Znachenie[t2] from ZnachNastr t1,ZnachNastr t2 where t1.kodRasch=t2.kodRasch and (t2.kodNastr-t1.kodNastr=100) and t1.kodNastr="+b+" and t1.kodRasch="+IntToStr(KodRascheta));
     if (StrToDate(ADOQ->FieldValues["t1"])>NachDate)
     {
        if (StrToDate(ADOQ->FieldValues["t1"])>KonDate)
        {
          d3=StrToDate(ADOQ->FieldValues["t1"]);
          d4=StrToDate(ADOQ->FieldValues["t2"]);
          d1=NachDate;
          d2=KonDate;
          Mas[1]="2";
          Mas[2]="1";
        }
        else
        {
          d1=NachDate;
          d2=StrToDate(ADOQ->FieldValues["t1"]);
          kolCikl=3;
          if (StrToDate(ADOQ->FieldValues["t2"])>KonDate)
          {
             d3=KonDate;
             d4=StrToDate(ADOQ->FieldValues["t2"]);
             Mas[1]="2";
             Mas[2]="1 or kodDoma=2";
             Mas[3]="1";
          }
          else
          {
             d4=KonDate;
             d3=StrToDate(ADOQ->FieldValues["t2"]);
             Mas[1]="2";
             Mas[2]="1 or kodDoma=2";
             Mas[3]="2";
          }
        }
     }
     else
     {
        if (StrToDate(ADOQ->FieldValues["t2"])<NachDate)
        {
          d1=StrToDate(ADOQ->FieldValues["t1"]);
          d2=StrToDate(ADOQ->FieldValues["t2"]);
          d3=NachDate;
          d4=KonDate;
          Mas[1]="1";
          Mas[2]="2";
        }
        else
        {
          d2=NachDate;
          d1=StrToDate(ADOQ->FieldValues["t1"]);
          kolCikl=3;
          if (StrToDate(ADOQ->FieldValues["t2"])>KonDate)
          {
             d3=KonDate;
             d4=StrToDate(ADOQ->FieldValues["t2"]);
             Mas[1]="1";
             Mas[2]="1 or kodDoma=2";
             Mas[3]="1";
          }
          else
          {
             d4=KonDate;
             d3=StrToDate(ADOQ->FieldValues["t2"]);
             Mas[1]="1";
             Mas[2]="1 or kodDoma=2";
             Mas[3]="2";
          }
        }
     }
  }
  //Выбираем список отсеков
  AnsiString Paste="";
  AnsiString Text="";
  if (Tip=="СВ") Text+="Select KodOtseka,dlina,obrez,shponka,lastHvost";
  if (Tip=="ПП") Text+="Select KodOtseka,dlina,shirina,sh1,ank1,virez1,sh2,ank2,virez2,sh3,ank3,virez3,sh4,ank4,virez4";
  FMain->ZaprosOpen(QOts,Text+" from otseki where kodTipPanel='"+Tip+"'");
  //обновляем таблицу панелей
  Text="update paneli set raspred=((select "+VidRasch+" from raschPanel where paneli.kodPanel=raschPanel.kodPanel and kodRasch="+IntToStr(KodRasch)+")-(select count(*) from grafik g where kodRasch="+IntToStr(KodRasch)+" and g.kodPanel=paneli.kodPanel and charindex('"+VidRasch+"',komment)>0)) where isnull("+VidRasch+",0)>0 and kodTipPanel='"+Tip+"'";
  FMain->ZaprosExec(ADOQ,Text);

  //Запускаем цикл по дню
  TDateTime day,dateF;
  for (int i=1; i<=kolCikl; i++)
  {
  if (i==1) {NachDate=d1; KonDate=d2;}
  if (i==2) {NachDate=d2; KonDate=d3;}
  if (i==3) {NachDate=d3; KonDate=d4;}

  day=NachDate;

  while (day<KonDate)
  {

    QOts->First();
    do
    {
      dateF.Val=0;
      Text="";
      Paste="";
      if (VidRasch=="KolOstalEtazh") Paste="*9";
      if (Tip=="СВ") Text+="Select kodPanel,dlina,"+VidRasch+Paste;
      if (Tip=="ПП") Text+="Select kodPanel,dlina,"+VidRasch+Paste+",shirina";
      Text+=" from Paneli where isnull("+VidRasch+",0)>0 and kodTipPanel='"+Tip+"' and dlina<="+QOts->FieldValues["dlina"];
      if (Tip=="СВ")
      {
        if (KodSootv==0) Text+=" and obrez="+QOts->FieldValues["obrez"]+" and shponka="+QOts->FieldValues["shponka"]+" and lastHvost="+QOts->FieldValues["lastHvost"]+" and raspred>0 and ostalos>0 and kodPanel in (select kodPanel from RaschPanel where kodRasch="+IntToStr(KodRasch)+")";
        if (KodSootv==1) Text+=" and obrez="+QOts->FieldValues["obrez"]+" and raspred>0 and ostalos>0 and kodPanel in (select kodPanel from RaschPanel where kodRasch="+IntToStr(KodRasch)+")";
      }
      if (Tip=="ПП")
      {
        Text+=" and shirina<="+QOts->FieldValues["shirina"]+" and sh1="+QOts->FieldValues["sh1"]+" and ank1="+QOts->FieldValues["ank1"]+" and virez1="+QOts->FieldValues["virez1"]+" and sh2="+QOts->FieldValues["sh2"]+" and ank2="+QOts->FieldValues["ank2"];
        Text+=" and virez2="+QOts->FieldValues["virez2"]+" and sh3="+QOts->FieldValues["sh3"]+" and ank3="+QOts->FieldValues["ank3"]+" and virez3="+QOts->FieldValues["virez3"]+" and raspred>0 and sh4="+QOts->FieldValues["sh4"]+" and ank4="+QOts->FieldValues["ank4"]+" and virez4="+QOts->FieldValues["virez4"]+"  and kodPanel in (select kodPanel from RaschPanel where kodRasch="+IntToStr(KodRasch)+")";
      }
      if (VidRasch=="KolOstalEtazh")
      {
        Paste="*15";
        if (Tip=="СВ") Text+="union Select kodPanel,dlina,"+VidRasch+Paste;
        if (Tip=="ПП") Text+="Select kodPanel,dlina,"+VidRasch+Paste+",shirina";
        Text+=" from Paneli where isnull("+VidRasch+",0)>0 and raspred>0 and ostalos>0 and kodTipPanel='"+Tip+"' and dlina<="+QOts->FieldValues["dlina"];
        if (Tip=="СВ")
        {
          if (KodSootv==0) Text+=" and obrez="+QOts->FieldValues["obrez"]+" and shponka="+QOts->FieldValues["shponka"]+" and lastHvost="+QOts->FieldValues["lastHvost"]+" and kodPanel in (select kodPanel from RaschPanel where kodRasch="+IntToStr(KodRasch)+")";
          if (KodSootv==1) Text+=" and obrez="+QOts->FieldValues["obrez"]+" and kodPanel in (select kodPanel from RaschPanel where kodRasch="+IntToStr(KodRasch)+")";
        }
        if (Tip=="ПП") Text+=" and shirina<="+QOts->FieldValues["shponka"]+" and sh1="+QOts->FieldValues["sh1"]+" and ank1="+QOts->FieldValues["ank1"]+" and virez1="+QOts->FieldValues["virez1"]+" and sh2="+QOts->FieldValues["sh2"]+" and ank2="+QOts->FieldValues["ank2"]+" and virez2="+QOts->FieldValues["virez2"]+" and sh3="+QOts->FieldValues["sh3"]+" and ank3="+QOts->FieldValues["ank3"]+" and virez3="+QOts->FieldValues["virez3"]+" and sh4="+QOts->FieldValues["sh4"]+" and ank4="+QOts->FieldValues["ank4"]+" and virez4="+QOts->FieldValues["virez4"]+"  and kodPanel in (select kodPanel from RaschPanel where kodRasch="+IntToStr(KodRasch)+")";
      }
      Text+=" and koddoma="+Mas[i]+" order by 3 desc";
      FMain->ZaprosOpen(QPan,Text);
      QPan->First();

      int per=0;
      FMain->ZaprosOpen(ADOQ,"Select top 1 p.kodPanel,dataNachForm,dataKonForm,sum(p.dlina)[SumDlina],count(doublePanel)[countPan],komment from grafik g join paneli p on p.kodPanel=g.KodPanel Where g.kodRasch="+IntToStr(KodRasch)+" and kodOtseka="+QOts->FieldValues["KodOtseka"]+" Group by  p.kodPanel,dataNachForm,dataKonForm,komment order by 2 desc");
      if (ADOQ->RecordCount==0)
      {
        dateF=NachDate;
      }
      else
      {
        if (ADOQ->FieldValues["KodPanel"]!=QPan->FieldValues["KodPanel"])
        {
          dateF=TDateTime(ADOQ->FieldValues["dataKonForm"])+1.0/24; per=1;
        }
        else
        {
          dateF=TDateTime(ADOQ->FieldValues["dataKonForm"]);
        }
      }

      if (dateF<=(day+1.0))
      {
      bool raspr=true;
      if (QPan->RecordCount>0)
      {
        while (dateF<=(day+1.0) &&  raspr)
        {
            FMain->ZaprosOpen(ADOQ,"select raspred from paneli where kodPanel="+QPan->FieldValues["KodPanel"]);
            int kolPan=ADOQ->FieldValues["raspred"];
            if (kolPan<1)
            {
              QPan->Next();
              FMain->ZaprosOpen(ADOQ,"select raspred from paneli where kodPanel="+QPan->FieldValues["KodPanel"]);
              kolPan=ADOQ->FieldValues["raspred"];
            }
            if (kolPan<=0) break;

            FMain->ZaprosOpen(QDom,"select kodDoma,nameDoma from Grafik g join NameDom n on g.KodRasch=n.KodRasch where koddoma=(select kodDoma from Paneli p where p.KodPanel="+QPan->FieldValues["KodPanel"]+") and g.kodRasch="+IntToStr(KodRasch)+" Order by dataNachForm");
            int Posl=0;
            if (!QDom->FieldValues["kodDoma"].IsNull())
            Posl=(int)QDom->FieldValues["kodDoma"];
            FMain->ZaprosOpen(QDom,"select kodDoma,NameDoma From NameDom where kodDoma=(select kodDoma from Paneli where KodPanel="+QPan->FieldValues["KodPanel"]+") and kodRasch="+IntToStr(KodRasch)+" order by 1");

            QDom->First();
            while (Posl>0 && (int)QDom->FieldValues["kodDoma"]!=Posl)
            {
              QDom->Next();
            }
            if (!QDom->FindNext()) QDom->First();
            try
            {
              FMain->ZaprosExec(QVstav,"insert into Grafik (kodRasch,kodOtseka,dataNachForm,dataKonForm,kodPanel,kodSootv,perenal,doublePanel,komment,otprav) values ("+IntToStr(KodRasch)+","+QOts->FieldValues["KodOtseka"]+",'"+dateF.FormatString("mm.dd.yyyy hh:nn")+"','"+(dateF+11.0/24).FormatString("mm.dd.yyyy hh:nn")+"',"+QPan->FieldValues["kodPanel"]+","+IntToStr(KodSootv)+","+per+",0,'"+VidRasch+","+QDom->FieldValues["NameDoma"]+"',0) update paneli set raspred=raspred-1,ostalos=ostalos-1 where kodPanel="+QPan->FieldValues["KodPanel"]);
              kolPan-=1;
              if (!QDom->FindNext()) QDom->First();
              if (kolPan>0 && (int)QPan->FieldValues["dlina"]*2<=(int)QOts->FieldValues["dlina"])
              {
                FMain->ZaprosExec(QVstav,"insert into Grafik (kodRasch,kodOtseka,dataNachForm,dataKonForm,kodPanel,kodSootv,perenal,doublePanel,komment,otprav) values ("+IntToStr(KodRasch)+","+QOts->FieldValues["KodOtseka"]+",'"+dateF.FormatString("mm.dd.yyyy hh:nn")+"','"+(dateF+11.0/24).FormatString("mm.dd.yyyy hh:nn")+"',"+QPan->FieldValues["kodPanel"]+","+IntToStr(KodSootv)+","+per+",1,'"+VidRasch+","+QDom->FieldValues["NameDoma"]+"',0) update paneli set raspred=raspred-1,ostalos=ostalos-1 where kodPanel="+QPan->FieldValues["KodPanel"]);
                kolPan-=1;
              }
              dateF+=11.0/24;
              raspr=true;
            }
            catch (...)
            {raspr=false;}
    }
    }
    }
    } while (QOts->FindNext());

    day+=1.0;
  }
  }
  QOts->Close();
  QPan->Close();
  ADOQ->Close();
  QDom->Close();
  return 0;
}



Вызывается эта функция при создании формы:
Код: plaintext
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.
FMain->ZaprosExec(QRasch,"update paneli set ostalos=kolNaDom*(Select cast(Znachenie as int) from ZnachNastr where kodRasch="+IntToStr(KodRascheta)+" and kodNastr=1) where kodDoma=1");
 FMain->ZaprosExec(QRasch,"update paneli set ostalos=kolNaDom*(Select cast(Znachenie as int) from ZnachNastr where kodRasch="+IntToStr(KodRascheta)+" and kodNastr=2) where kodDoma=2");
 FMain->ZaprosOpen(QRasch,"select t1.kodNastr,t1.Znachenie[t1],t2.Znachenie[t2] from ZnachNastr t1,ZnachNastr t2 where t1.kodRasch=t2.kodRasch and (t2.kodNastr-t1.kodNastr=100) and t1.kodNastr>303 and t1.kodNastr<400 and t1.kodRasch="+IntToStr(KodRascheta)+" order by 1");
 QRasch->First();
 try
 {
 int c=zapisGrafik(KodRascheta,"СВ","kolCokol",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],0);
 zapisGrafik(KodRascheta,"СВ","kolCokol",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],1);
 }
 catch(Exception *E)
 {
   ShowMessage("Ошибочка2!"+E->ClassName()+" "+E->Message);
 }
 QRasch->Next();
 zapisGrafik(KodRascheta,"СВ","kolEtazh1",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],0);
 zapisGrafik(KodRascheta,"СВ","kolEtazh1",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],1);
 QRasch->Next();
 zapisGrafik(KodRascheta,"СВ","KolOstalEtazh",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],0);
 zapisGrafik(KodRascheta,"СВ","KolOstalEtazh",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],1);
 QRasch->Next();
 zapisGrafik(KodRascheta,"СВ","kolEtazh17",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],0);
 zapisGrafik(KodRascheta,"СВ","kolEtazh17",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],1);
 QRasch->Next();
 zapisGrafik(KodRascheta,"СВ","kolEtazh18",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],0);
 zapisGrafik(KodRascheta,"СВ","kolEtazh18",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],1);
 QRasch->First();
 zapisGrafik(KodRascheta,"ПП","kolCokol",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],0);
 QRasch->Next();
 zapisGrafik(KodRascheta,"ПП","kolEtazh1",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],0);
 QRasch->Next();
 zapisGrafik(KodRascheta,"ПП","kolOstalEtazh",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],0);
 QRasch->Next();
 zapisGrafik(KodRascheta,"ПП","kolEtazh17",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],0);
 QRasch->Next();
 zapisGrafik(KodRascheta,"ПП","kolEtazh18",QRasch->FieldValues["t1"],QRasch->FieldValues["t2"],0);

}



причем указанный здесь catch не отрабатывается. ошибку отлавливает компонент ApplicationEvents.


на всякий случай код вызываемых внутри пользовательских функций
Код: plaintext
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.
int TFMain::ZaprosOpen(TADOQuery *Q,AnsiString Text)
{
  try
  {
    Q->SQL->Clear();
    Q->SQL->Add(Text);
    Q->Open();
  }
  catch (Exception *ex)
  {
    Application->MessageBoxA(ex->Message.c_str(),"Ошибка!",0);
    return 1;
  }
  return 0;
}

int TFMain::ZaprosExec(TADOQuery *Q,AnsiString Text)
{
  try
  {
    Q->SQL->Clear();
    Q->SQL->Add(Text);
    Q->ExecSQL();
  }
  catch (Exception *ex)
  {
    Application->MessageBoxA(ex->Message.c_str(),"Ошибка!",0);
    return 1;
  }
  return 0;
}



Помогие, плиз, непутевой!
ПС. Знаю, код не оптимизирован, все руки не доходят этим заняться
...
Рейтинг: 0 / 0
Где он обращается к несуществующей памяти?(
    #38176546
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фотиния,

Что сказал отладчик/отладочная печать?
...
Рейтинг: 0 / 0
Где он обращается к несуществующей памяти?(
    #38176552
Фотиния
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
он молчал. прога вылетает в месте
QOts->Close();
QPan->Close();
ADOQ->Close();
QDom->Close();
return 0;
}
...
Рейтинг: 0 / 0
Где он обращается к несуществующей памяти?(
    #38176562
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ФотинияВсем здравствуйте! Прошу помощи, ибо замучилась с этим си.
Суть: приведеная ниже функция проходит свое тело до конца, однако на выходе выдает Access violation ... in module Proeсt.exe, потом при попытке завершить программу пишет abnormal program termination. Кое как отловила ошибку, до этого catch не мог ее отследить прога просто висла и все.
....
Помогие, плиз, непутевой!
ПС. Знаю, код не оптимизирован, все руки не доходят этим заняться
Первое: стоит заняться оптимизацией. Во первых это сделает код более читабельным и в нем будет проще искать ляпы. Во вторых, неявные ляпы сделанные из-за тяп-ляп кода в чистом коде не смогут появиться по определению.

Второе: ищи ошибку методом художественного вырезания. Сначала закомментируй весь код функции. Проверь работает ли программа - если да, то ошибка точно внутри функции. Потом сними комментарий с первых нескольких строк функции - работает? Потом еще кусочек функции верни в код - работает? Таким образом найдешь те несколько строк из-за которых возникает непонятная проблема в странном месте. А потом уже думай почему "вроде-бы правильный" код в одном месте влияет на падение в другом месте.
...
Рейтинг: 0 / 0
Где он обращается к несуществующей памяти?(
    #38176579
Фотиния
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
похоже проблема в массиве AnsiString. Подозрение на выделение памяти.. но все равно не понимаю в чем тут криминал..
...
Рейтинг: 0 / 0
Где он обращается к несуществующей памяти?(
    #38176597
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Фотинияпохоже проблема в массиве AnsiString. Подозрение на выделение памяти.. но все равно не понимаю в чем тут криминал..массивы нумеруются с нуля а не с единицы.
...
Рейтинг: 0 / 0
Где он обращается к несуществующей памяти?(
    #38176634
Фотиния
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
о, вот тут я затупила, не спорю) всем спасибо, проблема решена)
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Где он обращается к несуществующей памяти?(
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]