Forum: Diğer Konular RSS
note: expected 'const int (*)[2]' but argument is of type 'int (*)[2]'  (Derleyici Uyarısı)
Sercan #1
Kullanıcı başlığı: B
Üye Ock 2016 tarihinden beri · 3 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: note: expected 'const int (*)[2]' but argument is of type 'int (*)[2]'  (Derleyici Uyarısı)
#include <stdio.h>
 
/* Function prototype: */
void receiveArray(const int array_copy[][2]);
 
int main(void)
{
    int array[2][2] = { { 2, 1 }, { 1, 4 } };
    receiveArray(array);
    return 0;
}
 
void receiveArray(const int array_copy[][2])
{
    printf("Array received successfully.\n");
}

Yukarıdaki kodu derlediğimde derleyici:

note: expected 'const int (*)[2]' but argument is of type 'int (*)[2]'

Şeklinde bir uyarı veriyor. Ben bu uyarıyı gidermek için ile main() içerisindeki fonksiyon çağrısını aşağıdaki gibi düzelttim.

receiveArray((const int (*))array);

Fakat ben neden fonksiyonda böyle bir tip dönüştürücü kullandık anlayamadım. C'i yeni öğrenmeye başladım eğer bukonuyu açıkarsanız öğrenmiş olacağım. Derleyici neden böyle bir uyarı verdi?

Teşekkürler..
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bu, deneyimli C programcılarına bile şaşırtıcı gelen bir konudur. Aslında konunun dizi kullanıyor olmakla bir ilgisi yok; bu örnekte şu kural devreye giriyor: "diziler ilk elemanlarını gösteren gösterge değerine dönüşüverirler".

Şu C FAQ'sünde açıklanıyor:

  http://c-faq.com/ansi/constmismatch.html

Ali
Sercan #3
Kullanıcı başlığı: B
Üye Ock 2016 tarihinden beri · 3 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bu kural daima geçerli değilmidir zaten?
Yani,
"Dizi isimleri aynı zamanda ilk elemanını gösteren göstergedirler"

Benim anlayamadığım nokta:

receiveArray((const int (*)[])array); burada array argümanının önüne gelen tip dönüşüm belirteci orada array dizisini neye çeviriyor ve niye çeviriyor?

Birde bu hatayı tek boyutlu dizilerde vermiyor sadece iki boyutlu "const" belirteci ile tanımlanmış dizi[][X] gibi veri tiplerinde böyle bir uyarı veriyor. Ve bu uyarının kastı, espirisi nedir, ne gibi hatalar meydana gelebileceği için böyle birşey koymuşlar.. Umarım saçmalamamışımdır ama konuyu tam olarak çözemedigim için aklımdakileri soruları direk yazdım..

Teşekkürler.
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bu hatanın dizilerden kaynaklandığı anlamını vermek istememiştim. Tam tersine, örnekte dizi kullanılıyor olması kafamızı karıştırıyor. Diziler gösterge olarak geçirildiklerinden array_copy aslında gösterge göstergesidir.

Buradaki sorun, gösterdiğim FAQ'deki sorunun aynısı. Yani, işlev yazmadan ve dizi kullanmadan, temel bir sorun.

Ek olarak, sırf hatayı giderdiği için eklediğimize göre, '(const int (*))' tür dönüşümünün doğru olmadığını düşünebiliriz. FAQ'de anlatılan konunun üstünü örtmüş oluyoruz: const int göstergeleri dizisi aldığını sanan ve belki de buna güvenen receiveArray(), o elemanlarda ileride yapılabilecek değişikliklerden etkilenebilir.

Ali
Sercan #5
Kullanıcı başlığı: B
Üye Ock 2016 tarihinden beri · 3 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Sanırım anladım :)

fonksiyon prototipinde
void receiveArray(const int array_copy[][2]);

const int tanımladıgımız argüman aslında gösterici göstergesini const ile kilitliyor fakat göstergenin gösterdigi bellekteki veri ile ilgili okuma yazma izni açık ve bunun için bizi uyarıyor.

faq sayfasındada bunu anlatmış sanırım const ile tanımlanan sabit göstericiler ile erişilip değiştiriliyor..

Karışık bir konu :S
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-21, 13:06:02 (UTC -08:00)