Pointer to pointer ve fonksiyonda kullanımı nasıl?

Başlatan RaMu, 10 Ekim 2014, 15:00:01

RaMu

https://www.picproje.org/index.php/topic,55626.0.html
Bu konuda detaylı anlattım problemi ama
çözüm olarak pointer a işaret eden pointer kullanmak gözüküyor,
en azından farklı bir çözümü olsada ben bu yöntemi öğrenmek istiyorum,
fonksiyonun geriye pointer değer döndürmeside bir çözüm olabilir ama bunu istemiyorum.

Mesele kısaca şöyle:

Dizi halinde karakter işleyen bir fonksiyonumuz olsun
1.fonksiyon("girdiğimiz karakterler");


Bu fonksiyon şu şekilde tanımlı ve ikinci bir fonksiyonu kullanıyor;
void 1.fonksiyon (rom char *goster)
{
2.fonksiyon(*goster); 
}


2. fonksiyonda şu şekilde tanımlı
void ikinci_fonksiyon(char gelen)
{
output_x(gelen); gibi işlemler, tabi daha karışık ama netice bu.
}



Birinci fonksiyon dizi kabul edebiliyor,
yazılan dizinin adresini goster pointer ına almış oluyor,
pointer a *goster++ diyerek
sıradaki elemanı göstermesini sağlayabiliyor,
değerine=*goster diyerek mevcut elemanın değerine bakabiliyor
ikinci_fonksiyon(*goster); diyerek mevcut elemanı 2. fonksiyona yollayabiliyor

Bana 3. bir fonksiyon lazım
bu fonksiyon
1. fonksiyonda şu anda bakılan dizi elmanını yani (*goster) değerini inceleyebilecek,
ve goster pointer ının gosterdiği adresi değiştirebilecek (aslında sadece 1 arttırabilecek)

Bu nedenle 1. fonksiyonda kullanılan goster adlı pointerı işaret edebilmesi lazım,
misal point_goster benim goster adlı 1. fonksiyonda kullanılan pointer ı gosteren pointer ım olacak,
Ben **point_goster e baktığımda

point_goster in gösterdiği (şuanda goster adlı) pointer ın,
gösterdiği (suanki dizi elemanı) değişkeni görecem,
Eğer *point_goster++; dersem goster adlı pointer ı bir arttırmış olacam

yani sıradaki dizi elemanını göstermeye geçmiş olacak.

Ben yazdım çizdim ama şuanda pointer too pointer çalıştıramadım,
1. ve 2. fonksiyon kısımlarını çalıştırabildim sadece,
bununla ilgili örneği olan var mı, yada örnek verebilecek olan?

Birazdan çalıştırabildiğim 1. ve 2. kısmı basit bir örnek haline getirip paylaşırım,
yada onun üzerine nasıl ekleme yapmak lazım orada yardımcı olursunuz.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html


RaMu

Evet onu inceledim,
zaten örnek alarak yapmaya çalışıyorum ama daha başaramadım.

Çalıştırabildiğim kadarı şöyle;
Buna bahsettiğim 3. fonksiyonu eklemeye çalışıyorum,
misal z karakterini görürse yazdırmasını engellemek diyelim amacımız,
ama bunu 3. bir fonksiyon olan misal z_bul ile yapacağız.

ekran çıktısı


main
#include <main_ptop.h>
#use     rs232(baud=115200,parity=N,xmit=PIN_b5,rcv=PIN_b4,bits=8,FORCE_SW) //software uart,

#include "fonk.c"

void main_kurulum()
{
   setup_adc_ports (AN0);         
   setup_adc(ADC_CLOCK_DIV_32);   
   set_adc_channel(0);                 
   setup_wdt         (WDT_OFF); 
   setup_timer_0     (RTCC_INTERNAL | RTCC_DIV_1); 
   setup_timer_1     (T1_DISABLED | T1_DIV_BY_1); 
   setup_timer_2     (T2_DISABLED, 0,1); 
   setup_timer_3     (T3_DISABLED | T3_DIV_BY_1); 
   setup_comparator  (NC_NC_NC_NC); 
   setup_vref        (FALSE); 

}

   void main()
   {
   main_kurulum();
   
   //fonksiyonu deneme
   //fonksiyon tırnak işaretleri arasındakileri, rs232 ile bir defa yazdırıyor
   birinci_fonk("girdigimiz karakterler x");

      while(TRUE)
      {//boş bekle
      output_toggle(pin_B7);
      delay_ms(300);
      }

}


fonk.c
#include "fonk.h"

//son karakter geldimi iye kontrol ediyor,
//gelene kadar karakterleri tek tek ikinci fonksiyona gönderiyor
//------------------------------------
void birinci_fonk( rom char *ptr1 )
{
while(*ptr1 != '\0')
      {
      ikinci_fonk( *ptr1++ );
      }
}
//------------------------------------

//birinci fonksiyondan gelen karakteri yazdırıyor
//-----------------------------------
void ikinci_fonk( char c )
{
printf(" %c \r\n", c );
}
//-----------------------------------


fonk.h
//fonksiyon prototipleri


//------------------------------------
void birinci_fonk( rom char * );
//------------------------------------

//-----------------------------------
void ikinci_fonk( char );
//-----------------------------------


main_ptop.h
#include <18F2550.h>
#device ADC=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(crystal=20MHz)
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

JKramer

Şimdi CCS'de rom'u işaret eden pointer'lar biraz karışıktı sanırım, isterseniz denemeleri önce normal pointer'larla yapmayı deneyin. Benim derleyicide deneme şansım olmadığından pc'de şöyle yazdım:

void func1( const u8 *goster )
{
    while( *goster )
    {
        func3( &goster );
        printf( "goster=0x%X -- *goster=%c\n", goster, *goster );
        goster++;
    }
}
void func3(const u8 **goster )
{
    if( ( **goster ) == 'z' )
    {
        ( *goster )++;
    }
}

RaMu

Hocam bu linkide siz vermiştiniz https://www.picproje.org/index.php/topic,35128.msg248248.html#msg248248
konuda böyle kullanılmasının faydalı olduğundan bahsediliyordu, ama hitechc için denmiş olabilir tabi,
ben bu kadarını problemsiz çalıştırdım.

Şuana kadar sorduğum 3. fonksiyon için yaptığım araştırmalarda
sizinkine benzer bir fonksiyon oluşturmam gerektiğini gördüm,
( * goster )++ veya  *goster++ bile farklı anlama geldiğinden
hata yapma olasılığım çok yüksek,
bu yazdığınız fonksiyon pcde problemsiz çalışıyor mu?

func1 in son komutu
*goster++
olması gerekmiyor mu?

func3 de goster değilde başka bir isim kullansak yine aynı işi yapar mı?
Yani isim aynı olsada zaten bu başka bir değişken olarak tanımlıdır durumu var değil mi?
Böyleyse aynı ismi kullanmak kafa karıştırıcı benim için.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

JKramer

Alıntı yapılan: RaMu - 10 Ekim 2014, 17:08:24
func3 de goster değilde başka bir isim kullansak yine aynı işi yapar mı?
Yani isim aynı olsada zaten bu başka bir değişken olarak tanımlıdır durumu var değil mi?
Böyleyse aynı ismi kullanmak kafa karıştırıcı benim için.
Evet yapar, istediğiniz adı verebilirsiniz.
Alıntı yapılan: RaMu - 10 Ekim 2014, 17:08:24
func1 in son komutu
*goster++
olması gerekmiyor mu?
Hayır, biz adresi arttırmak istiyoruz ama bu durum için farketmemesi lazım çünkü (++), (*) operatörüne göre öncelikli. Pc'de çalışan(gcc) program şöyle:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
typedef int8_t s8;
typedef int16_t s16;
typedef int32_t s32;

void func1( const u8 *goster );
void func3( const u8 **pptr);

int main()
{
    func1( "girdigimiz x" );

    return 0;
}

void func1( const u8 *goster )
{
    while( *goster )
    {
        func3( &goster );
        printf( "goster=0x%X -- *goster=%c\n", goster, *goster );
        goster++;
    }
}

void func3( const u8 **pptr )
{
    if( ( **pptr ) == 'z' )
    {
        ( *pptr )++;
    }
}

RaMu

Sanırım aynı şekilde yazdım fonksiyonu,
proteus debug kısmındada bakıyorum
şimdi tek tek pointer to pointer ın da değerlerini yazdırıp bakıyorum,
yani func3 deki ( **pptr )
doğru değer göstermiyor,
olması gereken (goster in gösterdiği) *goster değeri yani sıradaki harf olmuyor
fotodaki çıktıyı alıyorum;
Acaba 3. fonksiyon için tip tanımlamasında mı problem var,
ccsc destekleme derleme hatası vermesi gerekmez mi?




bunlarda isisin söylediği hatalar,


//son karakter geldimi diye kontrol ediyor,
//gelene kadar karakterleri tek tek ikinci fonksiyona gönderiyor
//------------------------------------
void birinci_fonk( rom char *ptr1 )
{
while(*ptr1 != '\0')
      {
      ucuncu_fonk( &ptr1 );
      ikinci_fonk( *ptr1++ );
      }
}
//------------------------------------

//birinci fonksiyondan gelen karakteri yazdırıyor
//-----------------------------------
void ikinci_fonk( char c )
{
printf(" %c \r\n", c );
}
//-----------------------------------

void ucuncu_fonk(char **pptr1 )
{
      printf(" *pptr1 %c, **pptr1 %c,", *pptr1, **pptr1);
   if( (**pptr1) == 'z' )
   {
   (*pptr1)++;
   }


mesaj birleştirme:: 10 Ekim 2014, 18:16:34

func1 deki *goster++ i ben 2. fonksiyonda
sizin yaptığınız gibi kullanmış oluyorum aynı şeyi yapmışım
ama kafam karıştı doğruladığınız için teşekkür ederim.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

omereliusuk


JKramer

Dediğim gibi rom'u işaret etme biraz karışık olabilir. Öncelikle ram'da istediğinizi yapmaya çalışın;
char text[]="girdigimiz x";
birinci_fonk(text);

birinci_fonk'dan da "rom"u çıkartın.

RaMu

"rom" ifadesini çıkararak ve daha farklı denemelerde yapıyorum,
bu denemelerden enteresan sonuçlarda alıyorum,
biraz toparlayıp denemelere ve sonuçları yazacam.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html