Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

* pointer

Başlatan hasankomur, 13 Aralık 2012, 12:43:00

arslan74

Alıntı yapılan: hasankomur - 13 Aralık 2012, 19:14:07
Cevaplarınız için teşekkürler. Önerilerinizin hepsini uyguladım fakat istediğim değeri göremiyorum farklı farklı değerler alıyorum.

Ayrıca kup(kup1) deyimini kabul etmiyor hata veriyor program. kup(&kup1) şeklinde olması gerekiyor.

Böyle birşey olamaz. Cünkü bu hatal kullanım, eğer sen hatalı kullanımı kabul ediyor, olması gereken kullanımı kabul etmiyor diyorsan o zaman senin kodunun biryerine başka hata var oda burayı etkilediği için o hatayı alıyorsundur.

Bu durumda kodların tamamını görmeden sen sorununa çözüm üretmek cok zor. Eğer kodlarını yayınlama imkanın varsa sorun hemen çözülür.


hasankomur

tüm kodlar ...

#include <16f877a.h>
#use delay(clock=4000000)
#fuses xt,noput,nowrt,nodebug,nowdt,nobrownout,nocpd,nolvp,noprotect
#use fast_io(a)
#use fast_io(b)
#use fast_io(d)

const int kat[4]={0x01,0x02,0x04,0x08};

int i,j,k,h,a=0,b=2;

void sifirla(){
    output_b(0);
   output_d(0);
}

void kup(){
  while(a<3){
  for(k=0;k<30;k++){
   for(i=a;i<b;i++){
   for(j=0;j<250;j++){
   output_a(kat[i]);
   switch(b){
   case 2: 
          output_b(0xC3);
          delay_us(1);
          break;
   case 3:
          output_b(0x60);
          output_d(0x60);
          delay_us(1);
          break;
   case 4:
         
          output_d(0xC3);
          delay_us(1);
          break;
   } 
   }
   }
   sifirla();
   }
   a++;
   b++;
  }
  a=0;
  b=2;
}

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   set_tris_a(0x00);
   set_tris_b(0x00);
   set_tris_d(0x00);
   output_a(0);
   output_b(0);
   output_d(0);
  
   
   while(1){

   for(h=0;h<3;h++)
   kup();
   
 }
}

Kazım

#17
Alıntı yapılan: arslan74 - 14 Aralık 2012, 07:32:05
Böyle birşey olamaz. Cünkü bu hatal kullanım, eğer sen hatalı kullanımı kabul ediyor, olması gereken kullanımı kabul etmiyor diyorsan o zaman senin kodunun biryerine başka hata var oda burayı etkilediği için o hatayı alıyorsundur.

Sevgili @hasankomur;

İşin kolayına kaçarsanız birşey öğrenemezsiniz.Tabi amacınız tek bu projeyle sınırlıysa birşey demiyorum.ilk mesajımda verdiğim linkte "  Bir dizinin adı, dizinin ilk elemanının adresini saklayan bir göstericidir " diyor.Hepsini okumak istemiyor yada kavrayamıyorsan sadece ilgili bölümü buraya kopyalıyorum.Okumalı ve yanlışını kendin bulmaya çalışmalısınız

11.4   Gösterici ve Diziler Arasındaki İlişki
C dilinde göstericiler ve diziler arasında yakın bir ilişki vardır. Bir dizinin adı, dizinin ilk elemanının adresini saklayan bir göstericidir. Bu yüzden, bir dizinin herhangi bir elemanına gösterici ile de erişilebilir. Örneğin:

          int kutle[5], *p, *q;

şeklinde bir bildirim yapılsın. Buna göre aşağıda yapılan atamalar geçerlidir:

          p = &kutle[0];    /* birinci elemanın  adresi p göstericisne atandı */
          p = kutle;        /* birinci elemanın  adresi p göstericisne atandı */
          q = &kutle[4];    /* son      elemanın adresi q göstericisne atandı */

İlk iki satırdaki atamalar aynı anlamdadır. Dizi adı bir gösterici olduğu için, doğrudan aynı tipteki bir göstericiye atanabilir. Ayrıca, i bir tamsayı olmak üzere,

          kutle;

ile
          *(p+i);

aynı anlamdadır. Bunun sebebi, p göstericisi kutle dizisinin başlangıç adresini tutmuş olmasıdır. p+i işlemi ile i+1. elemanın adresi, ve *(p+i) ile de bu adresteki değer hesaplanır.

NOT
Bir dizinin, i. elemanına erişmek için *(p+i) işlemi yapılması zorunludur. Yani

  *p+i;   /* p nin gösterdiği değere (dizinin ilk elemanına) i sayısını ekle */
  *(p+i); /* p nin gösterdiği adresten i blok ötedeki sayıyı hesapla */
anlamındadır. Çünkü, * operatörü + operatörüne göre işlem önceliğine sahiptir. 


jackal183

Alıntı yapılan: hasankomur - 13 Aralık 2012, 20:26:48
Bu da işe yaramıyor. Ve kup(kup1) yazınca hata veriyor

mesaj birleştirme:: 13 Aralık 2012, 20:33:13

Program bu şekilde çalışıyor fakat benim yapmak istediğim değerleri dizi içine atmak ve farklı değerleri de kullanma. Pointer geldi aklıma onuda uygulayamadım

...

void kup(){
  while(a<3){
  for(k=0;k<30;k++){
   for(i=a;i<b;i++){
   for(j=0;j<250;j++){
   output_a(kat);
   switch(b){
   case 2:
          output_b(0xC3);     
          delay_us(1);
          break;
   case 3:
       
          output_b(0x60);
          output_d(0x60);
          delay_us(1);
          break;
   case 4:
         
          output_d(0xC3);
          delay_us(1);
          break;
   }
   }
   }
   sifirla();
   }
   a++;
   b++;
  }
  a=0;
  b=2;
}

...

kup();
...

kodu eklerken forumun kod ekle özelliğini kullanmalısın ki net bir şekilde görelim. şimdi bir kere bu kodda case 3 ve case 4 hiç çalışmaz. çünkü kodun başında while(a<3) var. switch(b) dediğinde b değişkeninde for döngüsünde a ile  bağlı. a<3 iken b nasıl 3 ve 4 olabilir ?

ikincisi de arkadaşların söylemiş olduğu pointer atamaları ve işlemler doğru, eğer kod istediğin gibi çalışmıyorsa, sorunu pointerda kodun başka yerlerinde aramalısın

sadogan

Alıntı yapılan: hasankomur - 14 Aralık 2012, 09:35:58
tüm kodlar ...

#include <16f877a.h>
#use delay(clock=4000000)
#fuses xt,noput,nowrt,nodebug,nowdt,nobrownout,nocpd,nolvp,noprotect
#use fast_io(a)
#use fast_io(b)
#use fast_io(d)

const int kat[4]={0x01,0x02,0x04,0x08};

int i,j,k,h,a=0,b=2;

void sifirla(){
    output_b(0);
   output_d(0);
}

void kup(){
  while(a<3){
  for(k=0;k<30;k++){
   for(i=a;i<b;i++){
   for(j=0;j<250;j++){
   output_a(kat[i]);
   switch(b){
   case 2: 
          output_b(0xC3);
          delay_us(1);
          break;
   case 3:
          output_b(0x60);
          output_d(0x60);
          delay_us(1);
          break;
   case 4:
         
          output_d(0xC3);
          delay_us(1);
          break;
   } 
   }
   }
   sifirla();
   }
   a++;
   b++;
  }
  a=0;
  b=2;
}

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   set_tris_a(0x00);
   set_tris_b(0x00);
   set_tris_d(0x00);
   output_a(0);
   output_b(0);
   output_d(0);
  
   
   while(1){

   for(h=0;h<3;h++)
   kup();
   
 }
}

Kodunuzu inceledim isis de simule ettim program yazdıgınız gibi çalışıyor tablo adreslemede sorun yok.
Sıkıntı nedir .

hasankomur

#20
Alıntı yapılan: jackal183 - 14 Aralık 2012, 10:15:16
kodu eklerken forumun kod ekle özelliğini kullanmalısın ki net bir şekilde görelim. şimdi bir kere bu kodda case 3 ve case 4 hiç çalışmaz. çünkü kodun başında while(a<3) var. switch(b) dediğinde b değişkeninde for döngüsünde a ile  bağlı. a<3 iken b nasıl 3 ve 4 olabilir ?

ikincisi de arkadaşların söylemiş olduğu pointer atamaları ve işlemler doğru, eğer kod istediğin gibi çalışmıyorsa, sorunu pointerda kodun başka yerlerinde aramalısın

programın öncesi ve sonrasını orada eklememiştim

mesaj birleştirme:: 14 Aralık 2012, 13:00:27

Alıntı yapılan: graski - 14 Aralık 2012, 09:46:27
Sevgili @hasankomur;

İşin kolayına kaçarsanız birşey öğrenemezsiniz.Tabi amacınız tek bu projeyle sınırlıysa birşey demiyorum.ilk mesajımda verdiğim linkte "  Bir dizinin adı, dizinin ilk elemanının adresini saklayan bir göstericidir " diyor.Hepsini okumak istemiyor yada kavrayamıyorsan sadece ilgili bölümü buraya kopyalıyorum.Okumalı ve yanlışını kendin bulmaya çalışmalısınız

11.4   Gösterici ve Diziler Arasındaki İlişki
C dilinde göstericiler ve diziler arasında yakın bir ilişki vardır. Bir dizinin adı, dizinin ilk elemanının adresini saklayan bir göstericidir. Bu yüzden, bir dizinin herhangi bir elemanına gösterici ile de erişilebilir. Örneğin:

          int kutle[5], *p, *q;

şeklinde bir bildirim yapılsın. Buna göre aşağıda yapılan atamalar geçerlidir:

          p = &kutle[0];    /* birinci elemanın  adresi p göstericisne atandı */
          p = kutle;        /* birinci elemanın  adresi p göstericisne atandı */
          q = &kutle[4];    /* son      elemanın adresi q göstericisne atandı */

İlk iki satırdaki atamalar aynı anlamdadır. Dizi adı bir gösterici olduğu için, doğrudan aynı tipteki bir göstericiye atanabilir. Ayrıca, i bir tamsayı olmak üzere,

          kutle;

ile
          *(p+i);

aynı anlamdadır. Bunun sebebi, p göstericisi kutle dizisinin başlangıç adresini tutmuş olmasıdır. p+i işlemi ile i+1. elemanın adresi, ve *(p+i) ile de bu adresteki değer hesaplanır.

NOT
Bir dizinin, i. elemanına erişmek için *(p+i) işlemi yapılması zorunludur. Yani

  *p+i;   /* p nin gösterdiği değere (dizinin ilk elemanına) i sayısını ekle */
  *(p+i); /* p nin gösterdiği adresten i blok ötedeki sayıyı hesapla */
anlamındadır. Çünkü, * operatörü + operatörüne göre işlem önceliğine sahiptir.

Yapmak istediğim işin kolayına kaçmak değil. Sadece bu çıkışları kullanmayacağım. Farklı çıkışlar kullandığımda tekrar aynı kodları defalarca yazmak programcılık mantığına uymuyor bence.

Kazım

#21
Kolayına kaçmaktan kastım şu idi-   Yazıyı okumalısın - Zaten kurallar açık -  öyle yazınca kabul ediyor - böyle etmiyor demenin bi mantığı yok.Onu demek istedim yoksa programlama mantığınla ilgili değil.  Amacım seni kırmak değil -- emin ol --

hasankomur

Alıntı yapılan: graski - 14 Aralık 2012, 13:25:36
Kolayına kaçmaktan kastım şu idi-   Yazıyı okumalısın - Zaten kurallar açık -  öyle yazınca kabul ediyor - böyle etmiyor demenin bi mantığı yok.Onu demek istedim yoksa programlama mantığınla ilgili değil.  Amacım seni kırmak değil -- emin ol --
Afedersiniz belki ben yanlış anladım niyetinizi. Fakat siz de emin olabilirsiniz ki buraya bu konuyu açmadan önce kendim çok uğraştım her yolu denedim internette de araştırdım. Hiçbir şey yapmadım değil. :)