C++ Şamataları

Başlatan muhittin_kaplan, 28 Nisan 2014, 01:02:41

muhittin_kaplan

#15
Derlemez hata verir
Error	1	error C2661: 'MyClass::Fonk1' : no overloaded function takes 3 arguments


mesaj birleştirme:: 03 Mayıs 2014, 00:30:31

#include <iostream>
using namespace std;
	
class MyClass
{
public:
	MyClass(int x,int y);
	~MyClass();
	float Fonk1(float,float,int,int);
	float Fonk1(float,float );

private:
	int ilkSayi;
	int İkinciSayi;
};

MyClass::MyClass(int x,int y) //Yapıcı
{
	ilkSayi=x;
	İkinciSayi=y;
}

MyClass::~MyClass()//Yıkıcı
{
		ilkSayi=1;
		İkinciSayi=1;
}
float MyClass::Fonk1(float x,float y, int t,int t3)
{

	return x*y*t*t3;

}

float MyClass::Fonk1(float x,float y)
{

	
	return x*y;
}


	int main(){
		
		MyClass K(3,5);
		//T.İkinciSayi=30; //HATALI BIR ISLEM CUNKI SADECE CLASS ICINDEN ERİŞİLİR.
		cout<<K.Fonk1(3.0,4.5,3)<<endl ;
		bool z=1;	
		cin>>z;
	return 0;

}


mesaj birleştirme:: 03 Mayıs 2014, 00:31:47

Yöntemi vardır belkide ama şu anki bilgim (ve bana derleyicinin söylediği) bu.

mufitsozen

default parameters!

void PrintValues(int nValue1=10, int nValue2=20, int nValue3=30)
{
    using namespace std;
    cout << "Values: " << nValue1 << " " << nValue2 << " " << nValue3 << endl;
}


PrintValues(1, 2, 3);
PrintValues(1, 2);
PrintValues(1);
PrintValues();


Alıntı Yap
The following output is produced:

Values: 1 2 3
Values: 1 2 30
Values: 1 20 30
Values: 10 20 30

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

muhittin_kaplan

eğer param geçilmezse bu değeri kabul et.

mesaj birleştirme:: 03 Mayıs 2014, 01:22:22

aynen dediğiniz gibi oluyor.  ;)

bocek

yalnız dikkat edin ilk default değer verdiğiniz parametreden sonra hep default değer vermelisiniz.
örnek:
void foo(int a, int b=20, int c); // yanlış kullanım.

void foo(int a, int b=20, int c=30); // doğru kullanım. ilk default değer verilen parametreden sonra gelen her parametreye default değer verilmeli

diğer türlü hangi parametreyi siz verdiniz, hangisini default olarak alacak bilemez derleyici.

alakası yok ama şunun gibi
int a,b=1,c; // yanlış
int a,b=1,c=0; // doğru

1 ya da 0. işte 'bit'ün mesele..

kantirici

default parametre yok ama .

uint8_t PCD_TransceiveData(uint8_t *sendData, uint8_t sendLen, uint8_t *backData, uint8_t *backLen, uint8_t *validBits, uint8_t rxAlign, uint8_t checkCRC) {
    uint8_t waitIRq = 0x30; // RxIRq and IdleIRq
    return PCD_CommunicateWithPICC(PCD_Transceive, waitIRq, sendData, sendLen, backData, backLen, validBits, rxAlign, checkCRC);
} // End PCD_TransceiveData()


Fonksiyon böyle tanımlanmış ve başka bir fonksiyon içerisinden şöyle çağırılmış.

status = PCD_TransceiveData(&command, 1, bufferATQA, bufferSize, &validBits );



Bir başka fonk. ise;

uint8_t  PCD_CommunicateWithPICC(	uint8_t command, uint8_t waitIRq, uint8_t  *sendData, uint8_t sendLen, uint8_t *backData, uint8_t *backLen, uint8_t *validBits, uint8_t rxAlign, uint8_t checkCRC )


tanmlanmış ve şöyle çağırılmış.

return PCD_CommunicateWithPICC(PCD_MFAuthent, waitIRq, &sendData[0], sizeof(sendData));



İlgli class burada. https://github.com/miguelbalboa/rfid/blob/master/MFRC522.cpp

bocek

@kantirici, siz cpp dosyasında fonksiyon tanımlama kısmına bakıp default parametre yok diyorsunuz.
oysa mfrc522.h dosyasında deklarasyon kısmında fonksiyon şöyle tanımlanmış:
byte PCD_TransceiveData(byte *sendData, byte sendLen, byte *backData, byte *backLen, byte *validBits = NULL, byte rxAlign = 0, bool checkCRC = false);


zaten parametrelere default değer verme işi normalde deklarasyon kısmında yapılır.
1 ya da 0. işte 'bit'ün mesele..

kantirici

@bocek evet hocam gözden kaçmış orası. Teşekkürler arkadaşlar.

pea

mbed ile bir proje yaparken ilk class'ımı yazmam gerekti ve dolayısıyla C++'a girişmiş bulundum. Birkaç ders okudum, onlarca örnek baktım ve ilk class'ımı yazdım ancak sonuç hüsran, çalışmadı.

.h dosyam şu şekilde:
/*
Pololu Dual MC33926 Motor Driver Shield kütüphanesi icin tanimlamalar.
*/
#ifndef MotorShield_h
#define MotorShield_h

#include "mbed.h"

class MotorShield
{
public:
    // Constructor/yapıcı fonksiyon:
    MotorShield(PinName pwm1, PinName dir1, PinName fb1, PinName pwm2, PinName dir2, PinName fb2, PinName nD2, PinName nSF);

    // Default değerli Contructor/yapıcı fonksiyon:
    MotorShield();

    // Motor hızını ayarla
    // speed: 1.0 = tam hız ileri, -1.0 = tam hız geri
    // motor: 0 = Motor1, 1= Motor2
    void setSpeed(float speed, bool motor);
    void setSpeed(float speed);
    // Motor akımını oku
    float getCurrent(bool motor);

    // Hata durumunu oku
    bool getFault(void);

protected:
    PwmOut _pwm1;           // motor 1 pwm
    DigitalOut _dir1;       // motor 1 yön
    AnalogIn _fb1;          // motor 1 akım
    PwmOut _pwm2;           // motor 2 pwm
    DigitalOut _dir2;       // motor 2 yön
    AnalogIn _fb2;          // motor 2 akım
    DigitalOut _nD2;
    DigitalIn _nSF;
};

#endif


.cpp dosyam da böyle:
/*

Pololu Dual MC33926 Motor Driver Shield kütüphanesi fonksiyonları
dir : Motor direction input
pwm : Motor speed/pwm input
nSF : Not of Status flag indicator(0 = fault)
fb  : Current sense feedback ( 525mV/A) > if over 6.5A(3.4V), analog port is fried
nD2 : When low, disables both outputs of both motor channels
*/

#include "MotorShield.h"
#include "mbed.h"

MotorShield::MotorShield(PinName pwm1, PinName dir1, PinName fb1, PinName pwm2, PinName dir2, PinName fb2, PinName nD2, PinName nSF) :
    _pwm1(pwm1), _dir1(dir1), _fb1(fb1), _pwm2(pwm2), _dir2(dir2), _fb2(fb2), _nD2(nD2), _nSF(nSF) {

    _pwm1.period_ms(0.1f);      // 10Khz pwm
    _pwm1 = 0;                 // Duty 0 = brake
    _dir1 = 0;                  // 0: forward , 1: reverse

    _pwm2.period_ms(0.1f);
    _pwm2 = 0;
    _dir2 = 0;

    _nD2 = 1;
}

// Default shield connections, compatible with Arduino form factor
MotorShield::MotorShield(): 
_pwm1(D9), _dir1(D7), _fb1(A0), _pwm2(D10), _dir2(D8), _fb2(A1), _nD2(D4), _nSF(D12) {
    
    _pwm1.period_ms(0.1f);      // 10Khz pwm
    _pwm1 = 0.5f;                 // Duty 0 = brake
    _dir1 = 0;                  // 0: forward , 1: reverse

    _pwm2.period_ms(0.1f);
    _pwm2 = 0;
    _dir2 = 0;

    _nD2 = 1;
}

// motor.speed(0.8, 1) > 2. motoru 0.8 hızında çalıştırır.
// motor.speed(0.1, 0) > 1. motoru 0.1 hızında
void MotorShield::setSpeed(float speed,bool motor)
{

    if (speed >= 0) {
        // Hız 0'dan büyükse ileri(dir =0), 0'dan küçükse abs al ve geri(dir=1)
        if(!motor) {        // !0 = 1, yani ilk motor seçilmişse(bool motor = 0 ise)
            _pwm1 = speed;
            _dir1 = 0;
        } else {
            _pwm2 = speed;
            _dir2 =0;
        }
    }

    else {
        if(motor) {        // Motor 2 ise
            _pwm2 = speed;
            _dir2 = 0;
        } else { 
            _dir1 = 1;
            _pwm1 = abs(speed); 
        }
    }
}

void MotorShield::setSpeed(float speed)
{
    _pwm1=speed;
}

float MotorShield::getCurrent(bool motor)
{
    if (motor)  return _fb2;
    else return _fb1;
}

//Hata durumuna bak
bool MotorShield::getFault()
{
    return (_nSF);
}


Compiler hata vermiyor, kart çalışıyor ancak Pwm çıkışı alamıyorum. Constructor işinde hatam var sanırım ama bulamadım.
Derdim nedir?

pea

Pwm kütüphanesini yanlış kullanıyormuşum. .period_ms(int) şeklindeymiş. Float verince niye hata vermemiş, ne yapmış anlamadım.

unknownperson

Merhaba konuyu çok dağıtmak da istemiyorum fakat benim ufak bir sorum olacak. C'den sonra C++ öğrenmeye karar verdim bu class yapılarını öğrenmeye başladım fakat bana biraz anlamsız geldi. Mesela Struct yapısı farklı veri tiplerini birleştirmeye yarıyor mantıklı bir görevi var ama class yapısının ne mantığını ne görevini anladım. Örneklere baktığımda kendi kendime "e bunu main içinde de yapabilirim neden class açıyoruz ki" diyorum. .Bir de fonksiyonların programı kısaltma dışında etkin bir şekilde kullanımı var mıdır ? Hocalarım kısa bir açıklama yaparsanız sevinirim.

mir_as82

Cevabin yarisini kendin vermiş sin, diğer yarisi da ayni yapinin içinde fonksiyon kullanabiliyorsunuz. Yani hem veriler hem o verileri manipule eden(get, set) fonksiyonlar ayni yapinin içinde. Mantıksal soyutlama, inheritance, encapsulation ve polimorfizm sinif in anahtar kelimeleridir.