Aynı parametreyi birçok fonksiyonda kullanıp değiştirebilme & referansla çağırma

Başlatan RaMu, 10 Ekim 2014, 10:38:26

RaMu

Konu başlığı "neden pointer görünce aval aval bakıyorum da olabilir"

Kısaca yapmaya çalıştığım şey şu;
void 1.foksiyon (rom char *goster)  //girilen dizi elmanları üzerinde işlem yapacak
{
3.fonksiyon(sıradaki değer); //gelen değer x ise 1. fonksiyonun bu değeri atlayıp sıradaki değeri işaret etmesini sağla
2.fonksiyon(sıradaki değer); //sıradaki değeri çıkışa aktar
}

Ayrıca 2. ve 3. foksiyonlar kendi başlarına kullanılabilmeli
yani bu işlemlerin hepsini 1. fonksiyona yıkmama lazım.
Aslında ben sadece 3. fonksiyon işlevini sağlayamadım,
1. ve 2. fonksiyonları yazdım çalıştırdım, konu sonunda nasıl yazdığımı gösterdim.


Geçenlerde bir konu açmıştım,
dizinin elemanları ile ilgili işlemler yapan
bir ana fonksiyon birde yardımcısı fonksiyon vardı,
yapabildiklerimi birazdan tekrar yazacam,
sorunum ise şu;
misal benim birkaç fonksiyonum var
birinci fonksiyon içerisine bir karakter dizisi parametre olarak giriliyor
birinci_fonksiyon ("karakter dizisi"); böylede çağırıyoruz diyelim

Birinci fonksiyon bu dizi elemanlarını kontrol edip
2. fonksiyona tek tek gönderecek,
2. fonksiyon sadece gelen karakterleri misal çıkış portuna direk yazacak output_x(gelen_tek_karakter)
2. fonksiyon aslında lcdye yazıyor yani işlemleri daha ağır ayrı ve
tek karakter göndermek için ayrı olarakda kullanılıyor, bir fonksiyon olmak zorunda.

Yine birinci fonksiyon içerisinde bir fonksiyon daha kullanılacak
buna 3. fonksiyon diyelim,
bu 3. fonksiyon başka yerlerdede kullanılacak
bu nedenle işlevi basit olsada buda fonksiyon olarak bana lazım,
3. fonksiyon ne yapacak
1. ana fonksiyona karakter dizisini vermiştik,
3. fonksiyon karakter dizisi içinde x karakteri varmı diye kontrol yapacak,
x karakteri varsa ana fonksiyon olan 3. fonksiyonun bu parametreyi atlamasını
bu değeri hiç yokmuş farzetmesini sağlayacak,
yani 2. fonksiyona çıkış portuna vermek üzere sıradaki değişkeni göstermesini sağlayacak.

Yani benim 1. fonksiyonum zaten işaretçi kullanmak zorundaki
dizi karakterlerini göstersin ve sıradaki elemana geçebilsin,
void 1.foksiyon (rom char *goster)
diye tanımladığımda güzelce
*goster == bilmemne diyerek içinde ne var görebiliyorum,
*goster++; diyerek sıradaki karakteri göstermesini sağlayabiliyorum,
veya 2. fonksiyona göndermek üzere
2.fonksiyon(*goster)
diyebiliyorum
ikinci fonksiyon şu şekilde tanımlı
void ikinci_fonksiyon(char gelen)
{
output_x(gelen); gibi işlemler
}

ama bu 2. fonksiyon sadece 1. fonksiyonun gönderdiği sıradaki değeri görebiliyor
yani bu değerin asıl yerini bilmiyor, 1. fonksiyon biliyor, isterse sıradaki değişkene geçebiliyor,
benim 3. fonksiyonda sağlamaya çalıştığım özellikde bu zaten,
bunu nasıl yapacağım?
Şöyle bir mantık mı olacak
void  ucuncu_fonksiyon (1. fonksiyonun şu anda işeret ettiği değeri işaret eden değişken adı bir_a olsun)
//böyle olmazsa nasıl 3. fonksiyonun işaretçisini manipule edebilirim, 
//bu fonksiyonu çağırdığındada aynı 1.fonksiyon gibi işaretçinin gösterdiği yeri sıradaki yere (*goster++ gibi) çekebilmeliyim,
bir_a nın gösterdiği yerdeki işaretçi (yani göster) in gösterdiği yerde (yani *göster) x değeri varsa
{
bir sonraki yeri göstermesini sağla;
}


Bilmem ne yapmaya çalıştığımı anlatabildim mi?


Şuanda yapabildiklerim
şu konunun sonunda yazmıştım https://www.picproje.org/index.php/topic,55379.msg424793.html#msg424793
yine tekrarlayayım:

//-----------------------------------------------------------------------------
Bu  birinci fonksiyon oluyor;
void cok_karakter_isleyen_fonk(rom char *goster , varsa_diger_parametreler)
{
   while(*goster != '\0')  //işlenen stringin son karakteri gelene kadar
      {
      tek_karakter_isleyen_fonk(  *goster++  ,  varsa_diger_parametreler);
      //stringden karakterleri tek tek çek ve tek_karakter_isleyen_fonk fonksiyonunda kullan
      }
 }


Bu ikinci fonksiyon oluyor;
ayrıca yukarıdaki fonksiyonun içindede kullanılan foksiyonda şöyle tanımlı;

void tek_karakter_isleyen_fonk(  char degisken_C  ,  varsa_diger_parametreler)
{//degisken_C ye üstteki fonksiyondan gelen karakter ile yapılan  işlemler}


Kullanırken ise

//birden fazla karakter yazmak için
cok_karakter_isleyen_fonk("ne yazacaksak", varsa_diger_parametreler);
//fonksiyonunu bu şekilde kullanıyorum
veya
//tek karakter yazmak için
tek_karakter_isleyen_fonk(  'R'  ,  varsa_diger_parametreler);

//şeklinde kullanıyorum,



Unutmadan birde fonksiyon prototipleri kullandım;
(bunlar fonksiyon prototipi herhalde yanlışsam düzeltin lütfen)

void cok_karakter_isleyen_fonk(rom char * , varsa_diger_parametrelerinde_türleri);

void tek_karakter_isleyen_fonk(  char  ,  varsa_diger_parametrelerinde_türleri);
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

elektronart

Mikroişlemcide Türkçe karakter gösterirken yaşanan soruna benziyor sizin yapmak istediğiniz. Sanki Türkçe karakteri çıkart kalanları göster gibi bir durum. Ben bilgisayarda hazırlanan bir yazıyı mikrodenetleyiciye gönderirken Türkçe karakterleri algılayıp onların kodunu değiştirip göndermiştim. Aynen dediğiniz gibi bufferı bir fonksiyona parametre olarak geçirmiştim. Sonra bu fonksiyonun içinde her bir karakteri tek tek inceleyip eğer Türkçe ise başka bir kod ile değiştirip geri yerine koymuştum. Ama ben sadece buffer alan fonksiyona yani 1. fonksiyona parametreyi referans olarak geçtim, tek karakter işleyenlere doğrudan parametre olarak geçtim. Şuna benzer bir yapı oldu. Bu arada kodu denemedim sadece yazdım, hatalar olabilir.
void 1.fonksiyon (char *buffer){
	char ch;
	ch = 2.fonksiyon(*buffer);
	3.fonksiyon(ch);
	buffer++;
}

char 2.fonksiyon (char ch){
	char ret;
	if(ch == 'ç') ret = 0xC0;
	return ret;
}

void 3.fonksiyon (char ch){
	output_x(ch);
}
Açık Elektronik

RaMu

Aslında return ile değer döndüren bir fonksiyon olarak
2. fonksiyonu tanımlarsam bu çözüm olur gibi geliyor,
bir etraflıca düşüneyim bunu ama başka yoluda olmalı,
yeri gelir birçok değer için aynı işi yapmak zorunda kalırsam return kafi değil,
konuyu yazarken return benimde aklıma geldi ama yukarıdaki nedenle istemedim,
birde inat ettim bunu return olmadan çözmek istiyorum.


Birde mesele sanki şu oldu,
pointer ı işaret eden bir pointer olur mu?
olursa misal
değişken_dizi //adında bir değişken dizimiz olsun
dptr              //bu değişkeni göstersin
dedeptr         //ise dptr yi göstersin (böyle birşey mümkünse)

ben dedeptryi kullanarak dptryi arttırıp azaltabilirim (misal (*dedeptr)++; ) yani
(dedeptr nin gösterdiği yerdeki değişkenin (dptr oluyor) değerini bir arttır)
(dptr artık sıradaki dizi elemanını işaret ediyor oldu)
değişken_dizi içerisinde istediğim sıradaki elemanı işaret etmesini sağlayabilirim,
ama ben işaretçinin (dedeptr nin),  işaret ettiği değişkenin(dptr nin),  işaret ettiği veriyi (dizi elemanı) oku diyebilir miyim?
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

kralsam

Alıntı yapılan: RaMu - 10 Ekim 2014, 11:32:50
Aslında return ile değer döndüren bir fonksiyon olarak
2. fonksiyonu tanımlarsam bu çözüm olur gibi geliyor,
bir etraflıca düşüneyim bunu ama başka yoluda olmalı,
yeri gelir birçok değer için aynı işi yapmak zorunda kalırsam return kafi değil,
konuyu yazarken return benimde aklıma geldi ama yukarıdaki nedenle istemedim,
birde inat ettim bunu return olmadan çözmek istiyorum.


Birde mesele sanki şu oldu,
pointer ı işaret eden bir pointer olur mu?
olursa misal
değişken_dizi //adında bir değişken dizimiz olsun
dptr              //bu değişkeni göstersin
dedeptr         //ise dptr yi göstersin (böyle birşey mümkünse)

ben dedeptryi kullanarak dptryi arttırıp azaltabilirim (misal (*dedeptr)++; ) yani
(dedeptr nin gösterdiği yerdeki değişkenin (dptr oluyor) değerini bir arttır)
(dptr artık sıradaki dizi elemanını işaret ediyor oldu)
değişken_dizi içerisinde istediğim sıradaki elemanı işaret etmesini sağlayabilirim,
ama ben işaretçinin (dedeptr nin),  işaret ettiği değişkenin(dptr nin),  işaret ettiği veriyi (dizi elemanı) oku diyebilir miyim?

hocam benim aklıma da ilk gelen return oldu. böylelikle *(ptr+3.fonk(..)) şeklinde 2. fonksiyona girebilirsin. Böylelikle baştaki karakter sayısı da senin için sorun olmazdı. Yada ortalarda.. örneğin 2 tane de x de olsa, ara elemanlarda da olsa onu atlayıp sistem çalışırdı.

Düzeltme: 2.fonk( *(ptr+3.fonk(...))); gibi

RaMu

c de pointer a pointer varmış,
ccsc de sıkıntı olacak mı acaba
http://www.eskimo.com/~scs/cclass/int/sx8.html

biraz inceleyeyim, daha birşey anlayamadım,
zaten pointerlar oturmadı bende birde pointer to pointer iyi cesaret,
ha birde bunları açıkta değilde fonksiyona  işlev olarak vermek daha karışık oluyor.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html