C/C++ Dizinin boyutunu kullanıcıdan almak

sono

Picopat
Katılım
29 Eylül 2023
Mesajlar
78
Yer
İstanbul
Daha fazla  
Cinsiyet
Erkek
Hocam C++'ta dizinin boyutunu kullanıcıdan almak isteyince "local variable" hatası veriyor, bu sorunu nasıl çözebilirim?
Aşağıya bıraktığım kodu yazmanın doğru yolu nedir, internette bulamadım.

C++:
#include <iostream>
using namespace std;

int main()
{
    int x;

    cout << "Dizi boyutu: ";
    cin >> x;

    int y[x];

    for (int i = 0; i < x; i++)
    {
        cin >> y[i];
    }

    cout << "Y dizisinin elemanları: ";

    for (int i = 0; i < x; i++)
    {
        cout << y[i] << " ";
    }

    return 0;
}

int y[x]; tanımladığım kısımda hata veriyor.
 
Dizi icin bellekte dinamik olarak yer ayirman lazim. O sekilde ayiramazsin.

C++:
#include <iostream>

using namespace std;

int main()
{
    int x;

    cout << "Dizi boyutu: ";
    cin >> x;

    // Istedigin Array icin dinamik olarak bellekte yer ayiriyorsun
    int *y = new int[x];

    cout << "Y dizisinin elemanları giriniz: ";

    for (int i = 0; i < x; i++)
    {
        cin >> y[i];
    }

    cout << "Y dizisinin elemanları: ";

    for (int i = 0; i < x; i++)
    {
        cout << y[i] << " ";
    }

    // Bellekte ayirdigin yeri siliyorsun
    delete[] y;

    return 0;
}
``
 
Stack'te tanımlanan Array'lerin boyutu derleme zamanında bilinmelidir. Ya Array'i @Görkem Say gibi Heap'te tanımlayın ya da ayrıyeten std::vector de kullanabilirsiniz.
C++:
#include <iostream>
#include <vector> // std::vector

int main()
{
    int x{};

    std::cout << "Dizi boyutu: ";
    std::cin >> x;

    // x boyutunda bir dinamik dizi tanımladık.
    std::vector<int> y(x);

    for (int i = 0; i < x; i++)
    {
        std::cin >> y[i];
    }

    std::cout << "Y dizisinin elemanlari: ";

    for (int i = 0; i < x; i++)
    {
        std::cout << y[i] << " ";
    }

    // std::vector; bellek yönetimini kendi yapar, yani ayrılan hafızayı manuel olarak silmeniz gerekmez.

    return 0;
}
 
@newgammaknife @Görkem Say teşekkür ederim, peki bu hatanın sebebi c++ özelinde mi yoksa pythonda veya c# ta da böyle mi bu çözüm
C++ gibi yeni bir dizi oluşturduğunda otomatik bellek yönetimi yapıp da heap'e atmayan her dil böyle.

C99'da "variable-length arrays" (değişken boyutlu diziler) diye bir özellik gelmiş fakat C++ topluluğunda karşılık bulmamış. Ki C++'ta gerek de yok çünkü GCC'deki implementasyona baktığın zaman derleyici senin programına koyduğu kod ile "alloca()" kullanarak sana o kısmı stack'ten geçici bir süreliğine veriyor. Eğer geçici bir süreliğine kullanmadığını düşünürse de kendi içinde "malloc()" kullanarak heap belleği kullanıyor.

Özellikle C++'ın 90'lardan beri STL gibi bir nimeti varken çok fazla gerek yok böyle şeylere girişmeye, ben bu tarz durumlarda std::vector kullanıyorum üstteki arkadaşların bahsettiği gibi.
 
Son düzenleme:
@newgammaknife @Görkem Say teşekkür ederim, peki bu hatanın sebebi c++ özelinde mi yoksa pythonda veya c# ta da böyle mi bu çözüm

Bu bir hata degil aslinda. Sen bilgisayara diyorsun ki ben bir dizi olusturdum, kullanici da bu dizinin buyuklugunu girecek. C++'da dogrudan bellekte ne kadar yer ayirilacagini bilemez. Ya bunu vector ile yapacaksin ya da dinamik olarak ayirip pointer ile bu dizinin yerini tutacaksin ve isin bitince de bellekteki alani temizleyeceksin. C++'in olayi bu zaten. Bellekte detayli olarak performans optimizasyonu yapabiliyorsun. O yuzden UE ve buyuk firmalarin gelistirdikleri oyun motorlari genelde C++ kullaniyor. Dilin temelinde bazi eksik noktalarin var. Geriye donup tekrar etmeni oneririm. Kodda neyi nasil yapacaginla alakali takilirsan da mutlaka ya ChatGPT kullan ya da CodiumAI ya da Blackbox bak.
 

Geri
Yukarı