从VS 2005重写代码(Windows窗体应用程序)到VS 2015"遇到STATUS_STACK_BUFFER_OVERRUN"发生错误。在VS2005程序工作正常。我真的不知道出了什么问题。代码是用XP OS编写的。现在我试图在win7 64位VS2015上启动它。这个程序是我的编程类的一个例子。需要将其重复用于其他目的。
#pragma once
namespace Fal_end {
#include <math.h>
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Summary for Form1
///
/// WARNING: If you change the name of this class, you will need to change the
/// 'Resource File Name' property for the managed resource compiler tool
/// associated with all .resx files this class depends on. Otherwise,
/// the designers will not be able to interact properly with localized
/// resources associated with this form.
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
}
protected:
/// <summary>
/// Clean up any resources being used.
/// </summary>
~Form1()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::Label^ label13;
protected:
private: System::Windows::Forms::Label^ label12;
private: System::Windows::Forms::Button^ button1;
private: System::Windows::Forms::Label^ label11;
private: System::Windows::Forms::Label^ label10;
private: System::Windows::Forms::Label^ label9;
private: System::Windows::Forms::TextBox^ pred_zadana;
private: System::Windows::Forms::Label^ label8;
private: System::Windows::Forms::Label^ label7;
private: System::Windows::Forms::TextBox^ bieguny;
private: System::Windows::Forms::Label^ label6;
private: System::Windows::Forms::TextBox^ czestotliwosc;
private: System::Windows::Forms::Label^ label5;
private: System::Windows::Forms::TextBox^ predkosc;
private: System::Windows::Forms::Label^ label4;
private: System::Windows::Forms::TextBox^ napiecie;
private: System::Windows::Forms::Label^ label3;
private: System::Windows::Forms::TextBox^ textBox1;
private: System::Windows::Forms::Label^ label2;
private: System::Windows::Forms::Label^ label1;
private: System::Windows::Forms::Label^ label17;
private: System::Windows::Forms::Label^ label18;
private: System::Windows::Forms::TextBox^ okres_amp;
private: System::Windows::Forms::Label^ label15;
private: System::Windows::Forms::Label^ label16;
private: System::Windows::Forms::Label^ label14;
protected:
private:
/// <summary>
/// Required designer variable.
/// </summary>
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
void InitializeComponent(void)
{
this->label13 = (gcnew System::Windows::Forms::Label());
this->label12 = (gcnew System::Windows::Forms::Label());
this->button1 = (gcnew System::Windows::Forms::Button());
this->label11 = (gcnew System::Windows::Forms::Label());
this->label10 = (gcnew System::Windows::Forms::Label());
this->label9 = (gcnew System::Windows::Forms::Label());
this->pred_zadana = (gcnew System::Windows::Forms::TextBox());
this->label8 = (gcnew System::Windows::Forms::Label());
this->label7 = (gcnew System::Windows::Forms::Label());
this->bieguny = (gcnew System::Windows::Forms::TextBox());
this->label6 = (gcnew System::Windows::Forms::Label());
this->czestotliwosc = (gcnew System::Windows::Forms::TextBox());
this->label5 = (gcnew System::Windows::Forms::Label());
this->predkosc = (gcnew System::Windows::Forms::TextBox());
this->label4 = (gcnew System::Windows::Forms::Label());
this->napiecie = (gcnew System::Windows::Forms::TextBox());
this->label3 = (gcnew System::Windows::Forms::Label());
this->textBox1 = (gcnew System::Windows::Forms::TextBox());
this->label2 = (gcnew System::Windows::Forms::Label());
this->label1 = (gcnew System::Windows::Forms::Label());
this->label17 = (gcnew System::Windows::Forms::Label());
this->label18 = (gcnew System::Windows::Forms::Label());
this->okres_amp = (gcnew System::Windows::Forms::TextBox());
this->label15 = (gcnew System::Windows::Forms::Label());
this->label16 = (gcnew System::Windows::Forms::Label());
this->label14 = (gcnew System::Windows::Forms::Label());
this->SuspendLayout();
//
// label13
//
this->label13->AutoSize = true;
this->label13->Location = System::Drawing::Point(430, 223);
this->label13->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
this->label13->Name = L"label13";
this->label13->Size = System::Drawing::Size(49, 20);
this->label13->TabIndex = 42;
this->label13->Text = L"..........";
//
// label12
//
this->label12->AutoSize = true;
this->label12->Location = System::Drawing::Point(430, 185);
this->label12->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
this->label12->Name = L"label12";
this->label12->Size = System::Drawing::Size(49, 20);
this->label12->TabIndex = 41;
this->label12->Text = L"..........";
//
// button1
//
this->button1->Location = System::Drawing::Point(468, 397);
this->button1->Margin = System::Windows::Forms::Padding(4, 5, 4, 5);
this->button1->Name = L"button1";
this->button1->Size = System::Drawing::Size(128, 62);
this->button1->TabIndex = 40;
this->button1->Text = L"SYMULACJA";
this->button1->UseVisualStyleBackColor = true;
this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
//
// label11
//
this->label11->AutoSize = true;
this->label11->Location = System::Drawing::Point(268, 223);
this->label11->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
this->label11->Name = L"label11";
this->label11->Size = System::Drawing::Size(142, 20);
this->label11->TabIndex = 39;
this->label11->Text = L"Czestotliwość [Hz]:";
//
// label10
//
this->label10->AutoSize = true;
this->label10->Location = System::Drawing::Point(268, 186);
this->label10->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
this->label10->Name = L"label10";
this->label10->Size = System::Drawing::Size(97, 20);
this->label10->TabIndex = 38;
this->label10->Text = L"Napięcie [V]:";
//
// label9
//
this->label9->AutoSize = true;
this->label9->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 12, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point,
static_cast<System::Byte>(238)));
this->label9->Location = System::Drawing::Point(267, 142);
this->label9->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
this->label9->Name = L"label9";
this->label9->Size = System::Drawing::Size(138, 29);
this->label9->TabIndex = 37;
this->label9->Text = L"Parametry:";
this->label9->TextAlign = System::Drawing::ContentAlignment::MiddleLeft;
//
// pred_zadana
//
this->pred_zadana->Location = System::Drawing::Point(273, 91);
this->pred_zadana->Margin = System::Windows::Forms::Padding(4, 5, 4, 5);
this->pred_zadana->Name = L"pred_zadana";
this->pred_zadana->Size = System::Drawing::Size(148, 26);
this->pred_zadana->TabIndex = 36;
this->pred_zadana->Text = L"1000";
//
// label8
//
this->label8->AutoSize = true;
this->label8->Location = System::Drawing::Point(268, 65);
this->label8->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
this->label8->Name = L"label8";
this->label8->Size = System::Drawing::Size(138, 20);
this->label8->TabIndex = 35;
this->label8->Text = L"predkość [obr/min]";
//
// label7
//
this->label7->AutoSize = true;
this->label7->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 12, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point,
static_cast<System::Byte>(238)));
this->label7->Location = System::Drawing::Point(267, 15);
this->label7->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
this->label7->Name = L"label7";
this->label7->Size = System::Drawing::Size(119, 29);
this->label7->TabIndex = 34;
this->label7->Text = L"Zadajnik:";
this->label7->TextAlign = System::Drawing::ContentAlignment::MiddleLeft;
//
// bieguny
//
this->bieguny->Location = System::Drawing::Point(21, 378);
this->bieguny->Margin = System::Windows::Forms::Padding(4, 5, 4, 5);
this->bieguny->Name = L"bieguny";
this->bieguny->Size = System::Drawing::Size(148, 26);
this->bieguny->TabIndex = 33;
this->bieguny->Text = L"2";
//
// label6
//
this->label6->AutoSize = true;
this->label6->Location = System::Drawing::Point(16, 352);
this->label6->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
this->label6->Name = L"label6";
this->label6->Size = System::Drawing::Size(27, 20);
this->label6->TabIndex = 32;
this->label6->Text = L"pb";
//
// czestotliwosc
//
this->czestotliwosc->Location = System::Drawing::Point(21, 306);
this->czestotliwosc->Margin = System::Windows::Forms::Padding(4, 5, 4, 5);
this->czestotliwosc->Name = L"czestotliwosc";
this->czestotliwosc->Size = System::Drawing::Size(148, 26);
this->czestotliwosc->TabIndex = 31;
this->czestotliwosc->Text = L"50";
//
// label5
//
this->label5->AutoSize = true;
this->label5->Location = System::Drawing::Point(16, 280);
this->label5->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
this->label5->Name = L"label5";
this->label5->Size = System::Drawing::Size(54, 20);
this->label5->TabIndex = 30;
this->label5->Text = L"fs [Hz]";
//
// predkosc
//
this->predkosc->Location = System::Drawing::Point(21, 232);
this->predkosc->Margin = System::Windows::Forms::Padding(4, 5, 4, 5);
this->predkosc->Name = L"predkosc";
this->predkosc->Size = System::Drawing::Size(148, 26);
this->predkosc->TabIndex = 29;
this->predkosc->Text = L"1475";
this->predkosc->TextChanged += gcnew System::EventHandler(this, &Form1::textBox1_TextChanged);
//
// label4
//
this->label4->AutoSize = true;
this->label4->Location = System::Drawing::Point(16, 206);
this->label4->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
this->label4->Name = L"label4";
this->label4->Size = System::Drawing::Size(82, 20);
this->label4->TabIndex = 28;
this->label4->Text = L"n [obr/min]";
//
// napiecie
//
this->napiecie->Location = System::Drawing::Point(21, 162);
this->napiecie->Margin = System::Windows::Forms::Padding(4, 5, 4, 5);
this->napiecie->Name = L"napiecie";
this->napiecie->Size = System::Drawing::Size(148, 26);
this->napiecie->TabIndex = 27;
this->napiecie->Text = L"380";
//
// label3
//
this->label3->AutoSize = true;
this->label3->Location = System::Drawing::Point(16, 135);
this->label3->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
this->label3->Name = L"label3";
this->label3->Size = System::Drawing::Size(53, 20);
this->label3->TabIndex = 26;
this->label3->Text = L"Un [V]";
//
// textBox1
//
this->textBox1->Location = System::Drawing::Point(21, 91);
this->textBox1->Margin = System::Windows::Forms::Padding(4, 5, 4, 5);
this->textBox1->Name = L"textBox1";
this->textBox1->Size = System::Drawing::Size(148, 26);
this->textBox1->TabIndex = 25;
this->textBox1->Text = L"15000";
this->textBox1->TextChanged += gcnew System::EventHandler(this, &Form1::textBox1_TextChanged);
//
// label2
//
this->label2->AutoSize = true;
this->label2->Location = System::Drawing::Point(16, 65);
this->label2->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
this->label2->Name = L"label2";
this->label2->Size = System::Drawing::Size(55, 20);
this->label2->TabIndex = 24;
this->label2->Text = L"Pn [W]";
//
// label1
//
this->label1->AutoSize = true;
this->label1->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 12, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point,
static_cast<System::Byte>(238)));
this->label1->Location = System::Drawing::Point(15, 15);
this->label1->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
this->label1->Name = L"label1";
this->label1->Size = System::Drawing::Size(223, 29);
this->label1->TabIndex = 23;
this->label1->Text = L"Par. Znamionowe:";
this->label1->TextAlign = System::Drawing::ContentAlignment::MiddleLeft;
//
// label17
//
this->label17->AutoSize = true;
this->label17->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 12, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point,
static_cast<System::Byte>(238)));
this->label17->Location = System::Drawing::Point(267, 303);
this->label17->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
this->label17->Name = L"label17";
this->label17->Size = System::Drawing::Size(139, 29);
this->label17->TabIndex = 47;
this->label17->Text = L"Symulacja:";
this->label17->TextAlign = System::Drawing::ContentAlignment::MiddleLeft;
//
// label18
//
this->label18->AutoSize = true;
this->label18->Location = System::Drawing::Point(268, 340);
this->label18->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
this->label18->Name = L"label18";
this->label18->Size = System::Drawing::Size(174, 20);
this->label18->TabIndex = 48;
this->label18->Text = L"ilość okresów amplitudy";
//
// okres_amp
//
this->okres_amp->Location = System::Drawing::Point(273, 378);
this->okres_amp->Margin = System::Windows::Forms::Padding(4, 5, 4, 5);
this->okres_amp->Name = L"okres_amp";
this->okres_amp->Size = System::Drawing::Size(148, 26);
this->okres_amp->TabIndex = 49;
this->okres_amp->Text = L"2";
//
// label15
//
this->label15->AutoSize = true;
this->label15->Location = System::Drawing::Point(852, 135);
this->label15->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
this->label15->Name = L"label15";
this->label15->Size = System::Drawing::Size(0, 20);
this->label15->TabIndex = 51;
//
// label16
//
this->label16->AutoSize = true;
this->label16->Location = System::Drawing::Point(828, 135);
this->label16->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
this->label16->Name = L"label16";
this->label16->Size = System::Drawing::Size(0, 20);
this->label16->TabIndex = 52;
//
// label14
//
this->label14->AutoSize = true;
this->label14->Location = System::Drawing::Point(888, 135);
this->label14->Margin = System::Windows::Forms::Padding(4, 0, 4, 0);
this->label14->Name = L"label14";
this->label14->Size = System::Drawing::Size(0, 20);
this->label14->TabIndex = 53;
//
// Form1
//
this->AutoScaleDimensions = System::Drawing::SizeF(9, 20);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(1132, 463);
this->Controls->Add(this->label14);
this->Controls->Add(this->label16);
this->Controls->Add(this->label15);
this->Controls->Add(this->okres_amp);
this->Controls->Add(this->label18);
this->Controls->Add(this->label17);
this->Controls->Add(this->label13);
this->Controls->Add(this->label12);
this->Controls->Add(this->button1);
this->Controls->Add(this->label11);
this->Controls->Add(this->label10);
this->Controls->Add(this->label9);
this->Controls->Add(this->pred_zadana);
this->Controls->Add(this->label8);
this->Controls->Add(this->label7);
this->Controls->Add(this->bieguny);
this->Controls->Add(this->label6);
this->Controls->Add(this->czestotliwosc);
this->Controls->Add(this->label5);
this->Controls->Add(this->predkosc);
this->Controls->Add(this->label4);
this->Controls->Add(this->napiecie);
this->Controls->Add(this->label3);
this->Controls->Add(this->textBox1);
this->Controls->Add(this->label2);
this->Controls->Add(this->label1);
this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::Fixed3D;
this->Margin = System::Windows::Forms::Padding(4, 5, 4, 5);
this->Name = L"Form1";
this->Text = L"Falownik Napięcia z modulacją szerokości impulsów MSI";
this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
this->ResumeLayout(false);
this->PerformLayout();
}
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
// deklaracja zmiennych
double n1, ns, fs, sn, f, pred_z, nap_U, x, U;
double t, tt = 0, y_sin, roz_t;
double pi = 3.14159265359;
int i = 0, x0;
double y0;
double T = 0; // okres przebiegu
int pb; // liczba par biegunów
//label14->Text = ("|");
fs = Convert::ToDouble(czestotliwosc->Text);
pb = Convert::ToInt16(bieguny->Text);
n1 = (60 * fs) / pb;
ns = Convert::ToDouble(predkosc->Text);
sn = (n1 - ns) / n1;
sn = (int)(sn * 1000) / 1000.0; // Odcinanie cyfr po przecinku
pred_z = Convert::ToDouble(pred_zadana->Text);
f = (pred_z*pb) / (60 * (1 - sn));
T = (1 / f) * 1000;
f = (int)(f * 10) / 10.0; // Odcinanie cyfr po przecinku
T = (int)(T * 10) / 10.0; // Odcinanie cyfr po przecinku
label16->Text = ("T=");
label14->Text = ("ms");
label15->Text = Convert::ToString(T);
nap_U = Convert::ToDouble(napiecie->Text);
x = nap_U / fs;
U = x*f;
U = (int)(U * 10) / 10.0; // Odcinanie cyfr po przecinku
double wsp_nap;
wsp_nap = U / nap_U; // amplituda sinusoidy
label12->Text = Convert::ToString(U);
label13->Text = Convert::ToString(f);
//label16->Text = Convert::ToString(wsp_nap);
Graphics^ g1 = this->CreateGraphics();
g1->Clear(Color::White); // Czyszczenie obrazu
Pen^ pioro1 = gcnew Pen(System::Drawing::Color::Black);
Pen^ pioro2 = gcnew Pen(System::Drawing::Color::Black);
Pen^ pioro3 = gcnew Pen(System::Drawing::Color::Red);
pioro1->Width = 2;
pioro2->Width = 1;
pioro3->Width = 2;
g1->DrawLine(pioro1, 405, 0, 750, 0); // ramka górna
g1->DrawLine(pioro1, 750, 0, 750, 160);
g1->DrawLine(pioro1, 750, 160, 405, 160);
g1->DrawLine(pioro1, 405, 160, 405, 0);
g1->DrawLine(pioro2, 405, 80, 750, 80); //oś górna x
g1->DrawLine(pioro2, 405, 235, 750, 235); //oś górna x
g1->DrawLine(pioro1, 405, 165, 750, 165); // ramka dolna
g1->DrawLine(pioro1, 750, 165, 750, 305);
g1->DrawLine(pioro1, 750, 305, 405, 305);
g1->DrawLine(pioro1, 405, 305, 405, 165);
int okres;
int sinus_tab[345];
okres = Convert::ToInt32(okres_amp->Text);
t = okres / f; // czas 2 okresów sinusoidy o czestotliwosci f
roz_t = t / 345; //Rozdzielczość czasu na osi x, 345 piksele
while (tt <= t) // pętla rysująca sinusoidę
{
if (tt == 0) // pierwszy punkt
{
y_sin = wsp_nap * sin(2 * pi*f*tt) * 70;
}
else
{
y_sin = wsp_nap * sin(2 * pi*f*tt) * 70;
g1->DrawLine(pioro3, x0 + 405, 80 - Convert::ToInt32(y0), i + 405, 80 - Convert::ToInt32(y_sin));
}
y0 = y_sin;
x0 = i;
sinus_tab[i] = 80 - Convert::ToInt32(y0); // tablica elementów sinusa
tt = tt + roz_t;
i = i + 1;
}
//Rysowanie trójkąta
i = 0;
int tr = 0, tr0 = 0;
int troj_tab[345];
while (i <= 345)
{
if (i == 0)
{
tr0 = 80;
troj_tab[i] = tr0;
}
if (i <= 10 && i > 0)
{
tr = 80 - 8 * i;
g1->DrawLine(pioro2, 405 + i, tr0, 405 + i + 1, tr);
tr0 = tr;
troj_tab[i] = tr0;
}
if (i > 10 && i <= 30)
{
tr = 0 + 8 * (i - 10);
g1->DrawLine(pioro2, 405 + i, tr0, 405 + i + 1, tr);
tr0 = tr;
troj_tab[i] = tr0;
}
if (i > 30 && i <= 50)
{
tr = 160 - 8 * (i - 30);
g1->DrawLine(pioro2, 405 + i, tr0, 405 + i + 1, tr);
tr0 = tr;
troj_tab[i] = tr0;
}
if (i > 50 && i <= 70)
{
tr = 0 + 8 * (i - 50);
g1->DrawLine(pioro2, 405 + i, tr0, 405 + i + 1, tr);
tr0 = tr;
troj_tab[i] = tr0;
}
if (i > 70 && i <= 90)
{
tr = 160 - 8 * (i - 70);
g1->DrawLine(pioro2, 405 + i, tr0, 405 + i + 1, tr);
tr0 = tr;
troj_tab[i] = tr0;
}
if (i > 90 && i <= 110)
{
tr = 0 + 8 * (i - 90);
g1->DrawLine(pioro2, 405 + i, tr0, 405 + i + 1, tr);
tr0 = tr;
troj_tab[i] = tr0;
}
if (i > 110 && i <= 130)
{
tr = 160 - 8 * (i - 110);
g1->DrawLine(pioro2, 405 + i, tr0, 405 + i + 1, tr);
tr0 = tr;
troj_tab[i] = tr0;
}
if (i > 130 && i <= 150)
{
tr = 0 + 8 * (i - 130);
g1->DrawLine(pioro2, 405 + i, tr0, 405 + i + 1, tr);
tr0 = tr;
troj_tab[i] = tr0;
}
if (i > 150 && i <= 170)
{
tr = 160 - 8 * (i - 150);
g1->DrawLine(pioro2, 405 + i, tr0, 405 + i + 1, tr);
tr0 = tr;
troj_tab[i] = tr0;
}
if (i > 170 && i <= 190)
{
tr = 0 + 8 * (i - 170);
g1->DrawLine(pioro2, 405 + i, tr0, 405 + i + 1, tr);
tr0 = tr;
troj_tab[i] = tr0;
}
if (i > 190 && i <= 210)
{
tr = 160 - 8 * (i - 190);
g1->DrawLine(pioro2, 405 + i, tr0, 405 + i + 1, tr);
tr0 = tr;
troj_tab[i] = tr0;
}
if (i > 210 && i <= 230)
{
tr = 0 + 8 * (i - 210);
g1->DrawLine(pioro2, 405 + i, tr0, 405 + i + 1, tr);
tr0 = tr;
troj_tab[i] = tr0;
}
if (i > 230 && i <= 250)
{
tr = 160 - 8 * (i - 230);
g1->DrawLine(pioro2, 405 + i, tr0, 405 + i + 1, tr);
tr0 = tr;
troj_tab[i] = tr0;
}
if (i > 250 && i <= 270)
{
tr = 0 + 8 * (i - 250);
g1->DrawLine(pioro2, 405 + i, tr0, 405 + i + 1, tr);
tr0 = tr;
troj_tab[i] = tr0;
}
if (i > 270 && i <= 290)
{
tr = 160 - 8 * (i - 270);
g1->DrawLine(pioro2, 405 + i, tr0, 405 + i + 1, tr);
tr0 = tr;
troj_tab[i] = tr0;
}
if (i > 290 && i <= 310)
{
tr = 0 + 8 * (i - 290);
g1->DrawLine(pioro2, 405 + i, tr0, 405 + i + 1, tr);
tr0 = tr;
troj_tab[i] = tr0;
}
if (i > 310 && i <= 330)
{
tr = 160 - 8 * (i - 310);
g1->DrawLine(pioro2, 405 + i, tr0, 405 + i + 1, tr);
tr0 = tr;
troj_tab[i] = tr0;
}
if (i > 330 && i <= 345)
{
tr = 0 + 8 * (i - 330);
g1->DrawLine(pioro2, 405 + i, tr0, 405 + i + 1, tr);
tr0 = tr;
troj_tab[i] = tr0;
}
i = i + 1;
}
i = 0;
int fal = 0;
int fal0 = 0;
while (i <= 345)
{
if (i == 0)
{
if (sinus_tab[i] <= troj_tab[i])
{
fal0 = 185;
}
else
{
fal0 = 285;
}
}
else
{
if (sinus_tab[i] <= troj_tab[i])
{
fal = 185;
}
else
{
fal = 285;
}
g1->DrawLine(pioro3, 405 + i - 1, fal0, 405 + i, fal);
fal0 = fal;
}
i = i + 1;
}
}
private: System::Void textBox1_TextChanged(System::Object^ sender, System::EventArgs^ e) {
}
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
}
};
}
答案 0 :(得分:2)
int sinus_tab[345];
while (i <= 345) {
sinus_tab[i] = 80 - Convert::ToInt32(y0); // tablica elementów sinusa
}
突出显示导致此运行时错误的代码行。您的代码中有一个off-by-one错误。 sinus_tab []中的最后一个有效索引是344.但是你正在编写sinus_tab [345],while循环条件应该是i < 345
。这是一个缓冲区溢出错误,它会随机破坏堆栈帧。这种内存损坏可能无法检测到。
你在troj_tab []中有完全相同的错误。
像这样的缓冲区溢出错误是臭名昭着的病毒攻击向量,它允许用数据操作程序。在这种特殊情况下,您没有看到任何不良影响,但您可以例如覆盖返回地址。使程序跳转到任意位置。
自从.NET 4.0(VS2010)以来,微软采取了相应的措施来阻止这种攻击。您的错误是跳过此缓冲区溢出检测机制,它会覆盖堆栈金丝雀并且您的程序正确中止。
使用托管数组,以便您可以及早发现这样的错误,您将获得IndexOutOfRangeException。修正:
array<int>^ sinus_tab = gcnew array<int>(345);