Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Где он обращается к несуществующей памяти?( / 7 сообщений из 7, страница 1 из 1
06.03.2013, 18:51
    #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
06.03.2013, 18:59
    #38176546
Abstraction
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где он обращается к несуществующей памяти?(
Фотиния,

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

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


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