Şimdi Ara

Buradaki hatayı bulanın elini öpücem [Kolay] (C++)

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
6
Cevap
0
Favori
445
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Bütün gündür pc başındayım kafam bi güzel zaten. Şurdaki hatayı bulur musunuz? (Kütüphanelerde problem yok)

    int n,last,ans; 
    char str[100003];
    int main()
    {
    scanf("%s",str);
    scanf("%d",&n);
    int len = strlen(str);
    pair <int,int> tar[n];
    int startingStars[n];
    for(int i=0;i<n;i++)
    scanf("%d %d",&tar[i].first,&tar[i].second);

    for(int i=0;i<len-1;i++)
    if(str[i] == str[i+1])
    {
    startingStars[last] = i;
    last++;
    }
    printf("%d -\n", tar[0].first);
    return 0;
    }


    Yazdığım kod bu. Bu koda;

    ###..#...# 
    1
    2 4


    Input'u verdiğimde garip bir şekilde tar[0].first 7 oluyor. Yaklaşık bir saattir bön bön bakıyorum. Yardımcı olursanız sevinirim.

    Not: Kodun diğer kısımları önemli değil. Mesele sadece tar'da. Adının hiç bir yerde geçmemesine rağmen yine de

    for(int i=0;i<len-1;i++) 
    if(str[i] == str[i+1])
    {
    startingStars[last] = i;
    last++;
    }

    döngüsünden sonra kendi değerini kaybediyor.


    Edit: Okuma kısmında hata var gibi gözüküyo ama orda problem yok. Forum smile olarak algıladığı için çıkmamış sanırım. Sadece döngüye odaklanın.



    < Bu mesaj bu kişi tarafından değiştirildi astronotc -- 18 Haziran 2013; 10:11:38 >







  • Kodun ne yaptığını anlamasam da c++ ça ya çevirip derledim ve dediğin hatayı almadım.

     
    #include <iostream>
    #include <string>
    using namespace std;

    int main()
    {
    int n, last, ans;
    string str;

    cin >> str;
    cin >> n;

    int len = str.length();
    int *startingStars = new int[n];
    auto tar = new pair<int, int>[n];

    for(int i = 0; i < n; i++)
    cin >> tar[i].first >> tar[i].second;

    for(int i = 0; i < len - 1; i++) {
    if(str[i] == str[i + 1]) {
    startingStars[last] = i;
    last++;
    }
    }
    cout << tar[0].first << " -\n";

    return 0;
    }
  • bu kodun derlenememesi lazım

    scanf("%d %d",&tar.first,&tar.second);
    burada dizinin pointerına atama yapmaya çalışıyorsun, indeks verilmemiş
    scanf("%d %d",&tar.first,&tar.second);
    şeklinde olmalı

    if(str == str[i+1])
    burada da pointerla değeri karşılaştırmaya çalışıyor.
    if(str == str[i+1])
    gibi bir şey olmalı.

    ama senin asıl problemin şurada
    pair <int,int> tar[n];
    int startingStars[n];

    statik yer ayırma işlemlerinde değişken kullanamazsın.
    yani int dizi[3] diyebilirsin, int dizi[n] diyemezsin.
    muhtemelen debug modda çalıştırdığın için program çakılmamış ancak release modda derlersen access violation alırsın.

    bunun yerine new veya malloc kullanarak dinamik bellek ayırma yapmalısın.
    pair<int, int> * tar = new pair<int,int>[n]
    int * startingStars = new int[n]
    şeklinde.

    bellek düzgün ayrılmadığı için belleğe yazılan rasgele değerler senin stackini bozuyor. ondan dolayı değer 7 gibi görünüyor.
    pair <int,int> tar[1];
    int startingStars[1];

    olarak yaz deneme amaçlı muhtemelen düzgün çalışacaktır. dinamik bellek ayırma için yukarıda yazdığım gibi new ya da malloc kullanmalısın.




  • hata almamanın sebebi de new kullanman zaten. kitaba uygun yani ;)
  • quote:

    Orijinalden alıntı: kirmik

    bu kodun derlenememesi lazım

    scanf("%d %d",&tar.first,&tar.second);
    burada dizinin pointerına atama yapmaya çalışıyorsun, indeks verilmemiş
    scanf("%d %d",&tar.first,&tar.second);
    şeklinde olmalı

    if(str == str[i+1])
    burada da pointerla değeri karşılaştırmaya çalışıyor.
    if(str == str[i+1])
    gibi bir şey olmalı.

    ama senin asıl problemin şurada
    pair <int,int> tar[n];
    int startingStars[n];

    statik yer ayırma işlemlerinde değişken kullanamazsın.
    yani int dizi[3] diyebilirsin, int dizi[n] diyemezsin.
    muhtemelen debug modda çalıştırdığın için program çakılmamış ancak release modda derlersen access violation alırsın.

    bunun yerine new veya malloc kullanarak dinamik bellek ayırma yapmalısın.
    pair<int, int> * tar = new pair<int,int>[n]
    int * startingStars = new int[n]
    şeklinde.

    bellek düzgün ayrılmadığı için belleğe yazılan rasgele değerler senin stackini bozuyor. ondan dolayı değer 7 gibi görünüyor.
    pair <int,int> tar[1];
    int startingStars[1];

    olarak yaz deneme amaçlı muhtemelen düzgün çalışacaktır. dinamik bellek ayırma için yukarıda yazdığım gibi new ya da malloc kullanmalısın.





    Edit'te yazdığım gibi kodun derlenmesinde problem yok. Buraya yazarken bazı yerler çıkmadı. Mesela [ i ].first var orada. ama smile olarak algılıyo forum.

    Kod şuanda aynı şekilde gözüküyor. Düzelttim.



    < Bu mesaj bu kişi tarafından değiştirildi astronotc -- 18 Haziran 2013; 10:12:21 >




  • quote:

    Orijinalden alıntı: astronotc

    Edit'te yazdığım gibi kodun derlenmesinde problem yok. Buraya yazarken bazı yerler çıkmadı. Mesela [ i ].first var orada. ama smile olarak algılıyo forum.

    Kod şuanda aynı şekilde gözüküyor. Düzelttim.


    evet benimkini de yanlış yazmış. neyse sen şu new/malloc meselesini bir dene, çalışacaktır.
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
    
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.