C Array Değişmesini Engellemek
-
Cde fonksiyona string array gönderiyorum ama *pointer olarak göndermememe rağmen global olan string arrayi değiştirio. ben sadece fonksiyon içinde değişmesini istiyorum nasıl sağlarım ?
örnek yazim karışık olmuş biraz.
char string[128];
int main(){
void myfunc(char x[128]){
x[5]='c';
}
myfunc(string);
printf("%s",string);
}
(kodu denemedim ama mantık bu)
burda stringin aynı kalmasını istiyorum.
nurulmac11 tarafından 29/Nis/16 17:14 tarihinde düzenlenmiştir -
C ve C++ da diziler pass by value şeklinde oluyordu bildiğim kadarıyla. Dolaylı yoldan zaten diziler pointer olduğu için temel anlamda pass by adress şeklinde yollanıyor.
Birde main fonksiyonunun içinde fonksiyon tanımlamak ne demektir. Bu kodu yazan en yakın zamanda intihar etmek felan mı istiyor? Polise haber vermelisin.
DrKill tarafından 29/Nis/16 18:03 tarihinde düzenlenmiştir -
DrKill bunu yazdı
C ve C++ da diziler pass by value şeklinde oluyordu bildiğim kadarıyla. Dolaylı yoldan zaten diziler pointer olduğu için temel anlamda pass by adress şeklinde yollanıyor.
Birde main fonksiyonunun içinde fonksiyon tanımlamak ne demektir. Bu kodu yazan en yakın zamanda intihar etmek felan mı istiyor? Polise haber vermelisin.
hocam yeni öğreniyorum C'yi :D bi çaresi yok mu yani ? aklıma veriyi bitfield şeklinde göstermek geldi ama stringi nasıl manipüle edeceğimi biliyorum bitfield olursa içinden çıkabilir miyim bilmiyorum.
-
nurulmac11 bunu yazdıDrKill bunu yazdı
C ve C++ da diziler pass by value şeklinde oluyordu bildiğim kadarıyla. Dolaylı yoldan zaten diziler pointer olduğu için temel anlamda pass by adress şeklinde yollanıyor.
Birde main fonksiyonunun içinde fonksiyon tanımlamak ne demektir. Bu kodu yazan en yakın zamanda intihar etmek felan mı istiyor? Polise haber vermelisin.
hocam yeni öğreniyorum C'yi :D bi çaresi yok mu yani ? aklıma veriyi bitfield şeklinde göstermek geldi ama stringi nasıl manipüle edeceğimi biliyorum bitfield olursa içinden çıkabilir miyim bilmiyorum.
başka bir kopyasını oluşturursun böylece orjinal dizin değişmemiş olur. ama istediğin şey bu mu?
void myFunc(char x[]){ char tempDizi[128]; strcpy(tempDizi, x); tempDizi[5] = 'c' printf("%s", tempDizi); //dizinin değiştirilmişi }
Holy e not: Bug buldum tempDizi[5] = 'c' yazıyor 3. satırda. Taglarda c kullanıldığı için öyle yapıyor sanırım.
@DrKill callByValue değilde callByRef olarak çağırılıyor sanırım.
BerkayCit tarafından 29/Nis/16 18:42 tarihinde düzenlenmiştir -
Sen char x[10]; dedigin zaman (genellikle) 10 bytelik bir alanin basina point eden bir pointer olusturmus oluyorsun(aslinda array'in adi bir pointer gorevi goruyor, ama array ve pointer ayni sey degil). O yuzden senin function(char string[]) demenle function(char *string) demen arasinda bir fark yok.
Detayli bir cevap icin suraya bakabilirsin: http://eli.thegreenplace.net/2009/10/21/are-pointers-and-arrays-equivalent-in-c
Telefondan yaziyorum, o yuzden duzgun bir cevap olmadi. Yanlisim varsa tugberk veya firex carpsin beni.
-
mRBerkay bunu yazdınurulmac11 bunu yazdıDrKill bunu yazdı
@DrKill callByValue değilde callByRef olarak çağırılıyor sanırım.
Aynen hocam yanlış yazmışım. PassByAdress şeklinde diyecektim zaten cümlenin sorununda yazmışım passByAddress diye yazmışım.
Bu arada dedikleri gibi dizinin bir kopyasını oluşturursun olur biter.Ya da ANSI C yerine ISO C++ ile çalışıyorsan, String sınıfı ile çalışabilirsin, nesnenin bir kopyasını oluşturman daha kolay olur.