Şimdi Ara

C++ Yardım..

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
21
Cevap
1
Favori
1.136
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 12
Sayfaya Git
Git
sonraki
Giriş
Mesaj
  • 1 Header dosyasındaki class fonksiyonundan bilgi çekmeye çalışıyorum fakat main dışındaki cpp dosyalarında çekerken hata verip program göçüyor.

    Şöyle çalışıyor:

    1- Mevcut bir text dosyasını okuyor.
    2- Okuduğu dosyanın içindeki bilgileri satır satır kaydediyor.
    3- Kaydedilen satırlardaki 2. 3. 4.(artık kaçıncısını istiyorsam) yazıyı ekrana yazıyor.
    4- (Problem burada) Main haricindeki başka bir cpp dosyasından kaydedilen yazıyı çekmesini istediğimde sanki hiç kaydetmemiş gibi hata verip program göçüyor.



  • Yazdıkların pek anlaşılır değil.

    Programın birçok kaynak kod dosyasından oluşuyor ve başka bir dosyadaki sınıflara mı erişemiyorsun? Gerçi bu şekilde hiç derlenmez.

    Yoksa program bir cpp dosyasını txt gibi okumaya mı çalışıyor? Veya başka bişeymi?
  • En iyisi bir tane örnek yazayım.

    Birinci.h
     
    ..... // INCLUDE vs. vs. 2saat yazmadım.
    class Deneme
    {
    public:
    string MesajıÇek(int sayı)
    {
    return dil[sayı];
    }
    private:
    vector<string> dil;
    };


    Main.cpp
     
    ..... // INCLUDE vs. vs. 2saat yazmadım.
    #include "Birinci.h"

    int _tmain(int argc, _TCHAR* argv[])
    {
    Deneme sDeneme;
    Deneme2 sDeneme2;
    dil.push_back("ILK YAZI");
    dil.push_back("IKINCI YAZI");
    dil.push_back("UCUNCU YAZI");
    printf("%s", sDeneme.MesajıÇek(0).c_str()); // BURADA SORUN YOK EKRANA "ILK YAZI" YAZACAK
    sDeneme2.Baslat();

    }


    Ikinci.cpp
     
    ..... // INCLUDE vs. vs. 2saat yazmadım.
    #include "Birinci.h"

    void Deneme2::Başlat()
    {
    Deneme sDeneme;
    printf("%s", sDeneme.MesajıÇek(0).c_str()); // SORUN BURADA.
    }


    Derlemede problem yok fakat sanki hiç kaydetmemiş gibi dil vektörü boş gözüküyor. Ikinci.cpp'de "size" koduyla baktım 0 gözüküyor ama mainde 0 değil.



    < Bu mesaj bu kişi tarafından değiştirildi Cecelon -- 18 Ekim 2011; 14:29:12 >




  • Yahu yok mu şunu halletmenin yolunu bilen bir Allahın kulu ?



    < Bu mesaj bu kişi tarafından değiştirildi Cecelon -- 17 Ekim 2011; 16:10:24 >
  • Yukarda yaptığın iş biraz karışık,

    Deneme2 sınıfın nerde?

    ve farkettiğim kadarı ile referansını Deneme2 sınıfının Başlat methodunda tekrar oluşturuyosun, boş olması doğal çünki yeni bi referans oluşuyor.
  • Yazmış olduğun program parçasında birden fazla hata var.

    Aşağıda kısa kod parçası en azından sana fikir veriri, kafana göre yeniden düzenleyebilirsin...


     

    #include <iostream>
    #include <vector>
    #include <string>

    using namespace std;

    class Deneme1
    {

    public:
    string MesajiCek(int sayi)
    {

    if(sayi<dil.size()&&sayi>=0)
    return dil[sayi];

    else return "Kayit yok";
    }

    void setVector(string s)
    {
    dil.push_back(s);
    }

    private:

    vector<string> dil;

    };

    class Deneme2
    {

    public:

    void baslat(Deneme1& deneme1,int i)
    {


    cout<<deneme1.MesajiCek(i)<<endl;

    }

    };

    int main()
    {


    Deneme1 deneme1;
    Deneme2 deneme2;
    deneme1.setVector("ILK YAZI");
    deneme1.setVector("IKINCI YAZI");
    deneme1.setVector("UCUNCU YAZI");

    deneme2.baslat(deneme1,1);

    system("pause");
    return 0;
    }





  • quote:

    Orijinalden alıntı: fenasi44

    Yazmış olduğun program parçasında birden fazla hata var.

    Aşağıda kısa kod parçası en azından sana fikir veriri, kafana göre yeniden düzenleyebilirsin...


     

    #include <iostream>
    #include <vector>
    #include <string>

    using namespace std;

    class Deneme1
    {

    public:
    string MesajiCek(int sayi)
    {

    if(sayi<dil.size()&&sayi>=0)
    return dil[sayi];

    else return "Kayit yok";
    }

    void setVector(string s)
    {
    dil.push_back(s);
    }

    private:

    vector<string> dil;

    };

    class Deneme2
    {

    public:

    void baslat(Deneme1& deneme1,int i)
    {


    cout<<deneme1.MesajiCek(i)<<endl;

    }

    };

    int main()
    {


    Deneme1 deneme1;
    Deneme2 deneme2;
    deneme1.setVector("ILK YAZI");
    deneme1.setVector("IKINCI YAZI");
    deneme1.setVector("UCUNCU YAZI");

    deneme2.baslat(deneme1,1);

    system("pause");
    return 0;
    }











    Normalde herhangi bir hata yok, ben sadece kabataslak bir şekilde yazdım. Deneme2 ile Deneme sınıfları aynı header dosyasındayken problem yok ama 2sinin aynı header dosyasında olmaması lazım(Çok karışıklık oluyor).




  • quote:

    Orijinalden alıntı: sehlor

    Yukarda yaptığın iş biraz karışık,

    Deneme2 sınıfın nerde?

    ve farkettiğim kadarı ile referansını Deneme2 sınıfının Başlat methodunda tekrar oluşturuyosun, boş olması doğal çünki yeni bi referans oluşuyor.

    Deneme2 sınıfı başka bir header dosyasında. Deneme sınıfıyla aynı dosya üzerinde değil yani. Diğer türlü nasıl yapabilirim ki ?
  • Bariz hatalar var...

    Sinif içinde private olarak tanımlı olan "vector<string> dil" sinif şablonunu main fonksiyonu içinde aşağıdaki şekilde kullanamazsin.
    Yok böyle bir kullanim şekli.

     
    int _tmain(int argc, _TCHAR* argv[])
    {
    Deneme sDeneme;
    Deneme2 sDeneme2;
    dil.push_back("ILK YAZI"); //?
    dil.push_back("IKINCI YAZI"); //?
    dil.push_back("UCUNCU YAZI"); //?
    printf("%s", sDeneme.MesajıÇek(0).c_str()); // BURADA SORUN YOK EKRANA "ILK YAZI" YAZACAK
    sDeneme2.Baslat();

    }





    Kaldı ki Deneme sinifindan sDeneme diye bir nesne oluştursan da yukarida olduğu gibi, sDeneme.dil.push_back("ILK YAZI") şeklinde yine kullanamazsin.Çünkü private: ,sinifin kedisi dışında hiçkimse erişemez.Dışardan dil vector sinif şablonuna erişmek istiyorsan ya get/set yazacaksın yada erişim belirleyiclerini değiştireceksin veya başka yol bulacaksin(friend gibi).

    Ayrıca aşağıda yazmış olduğun kod parçasında "yeni" bir nesne tanımı yapmışsın.Adı üstünde "Yeni" bir nesne ,bu sDeneme nesnesi içindeki vector<string> dil şablonunu içi boştur.

     

    void Deneme2::Başlat()
    {
    Deneme sDeneme;
    printf("%s", sDeneme.MesajıÇek(0).c_str()); // SORUN BURADA. //?
    }




    < Bu mesaj bu kişi tarafından değiştirildi fenasi44 -- 17 Ekim 2011; 18:40:34 >




  • Public içinde dil ile alakalı işlemleri yapmak için void var, onu kullanıyorum. Bütün kodları yazmamak için bu şekilde özet geçtim. Derlemede bir problem YOK, bunu defalarca yazmak istemiyorum. Zaten bir önceki mesajda da kabataslak yazdım demişim.
    Al onu da yazayım:

    Deneme sınıfında
     
    public:
    void DilKaydet(string dill)
    {
    dil.push_back(dill);
    }


    Maindeki gibi dil.push_back(METİN) yerine DilKaydet(METİN) kullanıyorum.



    < Bu mesaj bu kişi tarafından değiştirildi Cecelon -- 17 Ekim 2011; 19:08:37 >
  • Kodu görmeyince tahmin etmek zor ama fazla olasılıkta yok zaten. sehlor un dediği gibi yeni bir nesne üzerindeki vector tabiki boş olur.

    Aslında bu gibi sorunların sebebini bulmak çok basit. Kodu debug et ve adım adım izle.
  • Sorun zaten belli, vector boş gibi oluyor. Onu nasıl yeni nesne değil de mevcut nesne gibi ayarlayabilirim ? Yani ben
    Deneme sDeneme;

    şeklinde çekip sDeneme'de işlem yaptırıyorum diğer türlü nasıl olur ?
  • quote:

    Orijinalden alıntı: Cecelon

    Sorun zaten belli, vector boş gibi oluyor. Onu nasıl yeni nesne değil de mevcut nesne gibi ayarlayabilirim ? Yani ben
    Deneme sDeneme;

    şeklinde çekip sDeneme'de işlem yaptırıyorum diğer türlü nasıl olur ?

    Yukarıdaki mesajımda örnek kod yazdım

    Tekrar bir bak,incele.Sorunun cevabı orda.

    Yapman gereken bu.Fonsiyona parametre olarak nesnenin referansini gondermek.
    Ayrıca fonsiyon içinde bir nesne tanımlamaya da gerek yok.


     
    //Deneme1 sinifi türünden bir nesne olan deneme1, referans olarak fonsiyona parametre giriliyor.

    void baslat(Deneme1& deneme1,int i)
    {


    cout<<deneme1.MesajiCek(i)<<endl;

    }





  • quote:

    Orijinalden alıntı: Cecelon

    Sorun zaten belli, vector boş gibi oluyor. Onu nasıl yeni nesne değil de mevcut nesne gibi ayarlayabilirim ? Yani ben
    Deneme sDeneme;

    şeklinde çekip sDeneme'de işlem yaptırıyorum diğer türlü nasıl olur ?

    Sanırım, aynı isimli nesnelerin aynı yeri işaret ettikleri gibi bir yanılgıya düşüyorsun. C++ ta her nesnenin bir kapsamı (scope) vardır ve kapsam dışında doğrudan tanınmazlar. Bu yüzden baslat fonksiyonu içinde sDeneme nesnesinin tanınabilmesi için main den nesnenin adresi veya referansını almak gerekir. Aksi halde sadece baslat içinde tanınacak olan yeni bir Deneme nesnesi oluşturmuş olursun.
  • quote:

    Orijinalden alıntı: fenasi44

    quote:

    Orijinalden alıntı: Cecelon

    Sorun zaten belli, vector boş gibi oluyor. Onu nasıl yeni nesne değil de mevcut nesne gibi ayarlayabilirim ? Yani ben
    Deneme sDeneme;

    şeklinde çekip sDeneme'de işlem yaptırıyorum diğer türlü nasıl olur ?

    Yukarıdaki mesajımda örnek kod yazdım

    Tekrar bir bak,incele.Sorunun cevabı orda.

    Yapman gereken bu.Fonsiyona parametre olarak nesnenin referansini gondermek.
    Ayrıca fonsiyon içinde bir nesne tanımlamaya da gerek yok.


     
    //Deneme1 sinifi türünden bir nesne olan deneme1, referans olarak fonsiyona parametre giriliyor.

    void baslat(Deneme1& deneme1,int i)
    {


    cout<<deneme1.MesajiCek(i)<<endl;

    }



    Ne yazık ki herhangi bir değişiklik olmadı :S




  • quote:

    Orijinalden alıntı: elektro_gadget
    Sanırım, aynı isimli nesnelerin aynı yeri işaret ettikleri gibi bir yanılgıya düşüyorsun. C++ ta her nesnenin bir kapsamı (scope) vardır ve kapsam dışında doğrudan tanınmazlar. Bu yüzden baslat fonksiyonu içinde sDeneme nesnesinin tanınabilmesi için main den nesnenin adresi veya referansını almak gerekir. Aksi halde sadece baslat içinde tanınacak olan yeni bir Deneme nesnesi oluşturmuş olursun.

    Referans olayını nasıl yapabilirim ? Bir örnek gösterebilir misin ?



    < Bu mesaj bu kişi tarafından değiştirildi Cecelon -- 18 Ekim 2011; 1:10:10 >
  • quote:

    Orijinalden alıntı: Cecelon

    quote:

    Orijinalden alıntı: elektro_gadget
    Sanırım, aynı isimli nesnelerin aynı yeri işaret ettikleri gibi bir yanılgıya düşüyorsun. C++ ta her nesnenin bir kapsamı (scope) vardır ve kapsam dışında doğrudan tanınmazlar. Bu yüzden baslat fonksiyonu içinde sDeneme nesnesinin tanınabilmesi için main den nesnenin adresi veya referansını almak gerekir. Aksi halde sadece baslat içinde tanınacak olan yeni bir Deneme nesnesi oluşturmuş olursun.

    Referans olayını nasıl yapabilirim ? Bir örnek gösterebilir misin ?

    fenasi44 göstermiş zaten. Değişiklik olmaması mümkün değil. Bi kontrol et bence.
  • quote:

    Orijinalden alıntı: Cecelon
    fakat main dışındaki cpp dosyalarında çekerken hata verip program göçüyor.

    Daha önce de dediğim gibi main içinde çekerken problem yok ama mesela

     
    void Deneme2::yaz()
    {
    baslat(deneme1,int i);
    }


    yaparken yine aynı hata oluyor. Benim bu şekilde çekmem lazım, diğer türlü zaten yapabiliyorum.
  • Arkadaşlar yardımlarınız için çok teşekkürler, çözdüm. Nasıl çözdüğümü de anlatayım da aynı sorunu yaşayan olursa buradan bakar.

    Main içindeki  
    sDeneme2.Başlat();
    kodunu
    sDeneme2.Başlat(sDeneme);
    olarak değiştiriyoruz.

    Deneme2 sınıfındaki
    void Başlat();
    kodunu da
    void Başlat(class Deneme);
    şeklinde değiştiriyoruz.

    Main içerisinden sDeneme2.Başlat(sDeneme) şeklinde çağırdığımız zaman

    void sDeneme2::Başlat(Deneme sDeneme)
    {
    cout<<sDeneme.MesajıÇek(2)<<endl; // Ve sonunda çalışıyor...
    }


    Şimdi main içinden sDeneme2.Başlat(sDeneme); çağırdığımız zaman yazıyı yazacak.



    < Bu mesaj bu kişi tarafından değiştirildi Cecelon -- 18 Ekim 2011; 14:46:45 >
  • Şimdi 2. sorunumdan bahsedicem, umarım buna da çözüm bulabiliriz. Şimdi program mevcut bir dosyanın içerisindeki yazıları satır satır okuyup dil vektörünün içine kaydediyor. Fakat programı debug modunda(F5) ile çalıştırdığımız zaman bu mevcut dosyayı bulamıyor. Kod örneği de yazayım:

    Deneme.h
     
    class Deneme
    {
    public:
    DilOku();
    };


    Main.cpp
     
    #include "Deneme.h"

    int _tmain(int argc, _TCHAR* argv[])
    {
    DilOku();
    }

    void Deneme::DilOku()
    {
    FILE *dosya;
    errno_t err;

    err = fopen_s(&dosya, "dosya.txt","rb");
    if (err == 2)
    {
    ifstream dosya ("dosya.txt");
    err = fopen_s(&dosya, "dosya.txt","rb");
    }
    if (err == 2)
    {
    printf("Dosya bulunamadı!");
    terminate();
    }
    }


    Debug modda(f5) çalıştırınca terminate kodunu çalıştırmadan önce "Dosya bulunamadı!" hatası veriyor. Debug modda çalıştırmayınca herhangi bir sorun yok.



    < Bu mesaj bu kişi tarafından değiştirildi Cecelon -- 18 Ekim 2011; 14:47:05 >




  • 
Sayfa: 12
Sayfaya Git
Git
sonraki
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.