Sorunum: main metodundaki o son satır "gs.AddJoystick(j1);" execute edildikten sonra bir sebepten ötürü ilk resimdeki hatayı alıyorum. Retry'a tıklayınca 2. resimdeki pencere geliyor, break deyince de 3. resimdeki yere yönlendiriyor beni. Program orada durduğunda watch ekranından axises'ın içeriğini şu şekilde görebiliyorum; ---------------------------------------------------------------------------------------------- this->axises[0] {id=1 sensivity=1 pin=1 ...} Potentiometer id 1 int sensivity 1 int pin 1 int val 0 int onval 0x01181249 {Ground System.exe!ptn(int,int)} void (int, int) * ---------------------------------------------------------------------------------------------- this->axises[1] {id=2 sensivity=1 pin=2 ...} Potentiometer id 2 int sensivity 1 int pin 2 int val 0 int onval 0x01181249 {Ground System.exe!ptn(int,int)} void (int, int) * ---------------------------------------------------------------------------------------------- this->axises[2] {id=0 sensivity=1 pin=3 ...} Potentiometer id 0 int sensivity 1 int pin 3 int val 0 int onval 0x01181249 {Ground System.exe!ptn(int,int)} void (int, int) *
Tam olarak nedir hata anlamadım? Neden destructor çağırılmış onu da anlamadım? axisesı oluşturma şeklim şöyle;
this->axises = new Potentiometer[size]; this->potCount = 0; this->potSize = size;
Edit: Eklemeyi unutmuşum: Main metodunun tamamı değil yukarıda yazdığım, aslında o kısım bir if statementın içinde, dolayısıyla Destructor oradan çıkınca çağırılıyor anladığım kadarıyla, ama hata verdiği yerde neden hata veriyor anlamadım. delete'i kullanmayla ilgili bir yanlış yaptım sanırım? (delete[] kullanmam gerekiyordu galiba)
ekleme:
reform metodlarının hepsinini içine de şu şartı ekledim;
if (this->buttons != nullptr) { delete[] this->buttons; }
Örnek bir tane;
void Joystick::reformButtons(const int size) { if (this->buttons != nullptr) { delete[] this->buttons; } this->buttons = new Button[size]; this->buttonCount = 0; this->buttonSize = size; }
Bu sefer de "Unhandled exception at 0x549AA9E8 (msvcr120d.dll) in Ground System.exe: 0xC0000005: Access violation reading location 0xCDCDCDC1." hatası alıyorum. Araştırdığıma göre bu adress debug sırasında verilen ve normalde kullanılmayan bir adresmiş.
Sorunu tam olarak fark edemesek te kopyalamayla ilgili olduğunu düşünüyorum. Fonksiyon imzaların nesnelerin kopyalarını alacak şekilde yazılmış. Fonksiyondan çıkınca kopyanın yıkıcısı çağrılır, bu yüzden sürekli yıkıcı fonksiyon çağrısı görürsün. Kopyalanan nesnenin yıkıcı fonksiyonunda delete varsa program patlar çünkü henüz işi bitmemiş olan bir nesneyi yok eder.
char AddAxis(Potentiometer pot); Eğer kopya kurucu fonksiyon yazmadıysan bu şekilde parametre c++ ta hatadır. Şu şekilde değiştirmelisin;
char AddAxis(const Potentiometer &pot);
Bir de; reformButtons(const int size) Tam tersi buradaki const ta gereksizdir çünkü size kopyalandığı için istesende değiştiremezsin. int gibi basit türlerde const kullanma. class larda ise mümkün olduğunca const ve referans (&) kullan.
Son olarak fonksiyon işaretçisi yerine std::function kullanabilirsin. c++ a daha uygun olur.
Sorunu tam olarak fark edemesek te kopyalamayla ilgili olduğunu düşünüyorum. Fonksiyon imzaların nesnelerin kopyalarını alacak şekilde yazılmış. Fonksiyondan çıkınca kopyanın yıkıcısı çağrılır, bu yüzden sürekli yıkıcı fonksiyon çağrısı görürsün. Kopyalanan nesnenin yıkıcı fonksiyonunda delete varsa program patlar çünkü henüz işi bitmemiş olan bir nesneyi yok eder.
char AddAxis(Potentiometer pot); Eğer kopya kurucu fonksiyon yazmadıysan bu şekilde parametre c++ ta hatadır. Şu şekilde değiştirmelisin;
char AddAxis(const Potentiometer &pot);
Bir de; reformButtons(const int size) Tam tersi buradaki const ta gereksizdir çünkü size kopyalandığı için istesende değiştiremezsin. int gibi basit türlerde const kullanma. class larda ise mümkün olduğunca const ve referans (&) kullan.
Son olarak fonksiyon işaretçisi yerine std::function kullanabilirsin. c++ a daha uygun olur.
Sorun düzeldi, copy constructoru yazdım, add fonksiyonlarında ilk başta referans kullanmıştım, şimdi pointer kullanmayı düşünüyorum olur mu acaba? reform'da const kullanmamın nedeni bi kaç gündür VLA'lerle ilgili falan araştırma yapıyordum sanırım kafam karışmış, new kullanırken girdiğim boyutun constant olmasına gerek yok değil mi? Sonuçta dynamic memory allocation yapıyor? Ben onu hiç düşünmeden yaptım sanki int arr[size] yapar gibi. Fonksiyon işaretçisi kullanmamın nedeni compiler olarak XC32 kullanacak olmam (veya mikroC 32 compiler) dolayısıyla onlar bahsettiğiniz şeyi içeriyor mu bilmiyorum, açıkçası librarylerini falan açıp okumadım pek, ona baktıktan sonra geçiş yapabilirim std::function'a. Teşekkür ederim cevabınız için, kolay gelsin.
Button.h
Potentiometer.h
Joystick.h
GS.h
main methodum;
Sorunum:
main metodundaki o son satır "gs.AddJoystick(j1);" execute edildikten sonra bir sebepten ötürü ilk resimdeki hatayı alıyorum.
Retry'a tıklayınca 2. resimdeki pencere geliyor, break deyince de 3. resimdeki yere yönlendiriyor beni. Program orada durduğunda watch ekranından axises'ın içeriğini şu şekilde görebiliyorum;
----------------------------------------------------------------------------------------------
this->axises[0] {id=1 sensivity=1 pin=1 ...} Potentiometer
id 1 int
sensivity 1 int
pin 1 int
val 0 int
onval 0x01181249 {Ground System.exe!ptn(int,int)} void (int, int) *
----------------------------------------------------------------------------------------------
this->axises[1] {id=2 sensivity=1 pin=2 ...} Potentiometer
id 2 int
sensivity 1 int
pin 2 int
val 0 int
onval 0x01181249 {Ground System.exe!ptn(int,int)} void (int, int) *
----------------------------------------------------------------------------------------------
this->axises[2] {id=0 sensivity=1 pin=3 ...} Potentiometer
id 0 int
sensivity 1 int
pin 3 int
val 0 int
onval 0x01181249 {Ground System.exe!ptn(int,int)} void (int, int) *
Tam olarak nedir hata anlamadım? Neden destructor çağırılmış onu da anlamadım?
axisesı oluşturma şeklim şöyle;
Değiştirme şeklim şöyle;
Genel olarak hatayla ilgili bilgilendirebilecek veya onun dışında yanlış yaptığım hatalı kullandığım şeyleri düzeltebilecek ufak bilgilendirmeler, yönlendirmeler çok yardımcı olacak, teşekkürler, iyi forumlar.
< Resime gitmek için tıklayın >< Resime gitmek için tıklayın >< Resime gitmek için tıklayın >