Haberler:

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

Ana Menü

Geçersiz pointer adresi

Başlatan gokhangokcen, 26 Eylül 2012, 12:43:36

gokhangokcen

Merhaba cümleten hayırlı günler;
32 sütunlu bir kayan yazı yapmak için uğraşmaktayım.İnternette bir kaç kod araştırıp bulduktan sonra indirdiğin bir kod üzerinde düzenlemeler yaparak ccs c ye uyarladım.Derleyici hata vermeden derleme yapıp hex kodunu üretiyor.İsis üzerinde denerken pointerın geçersiz bir adresten karakter almaya çalışıyor koddaki hatayı fark edemedim pointer konusunda neredeyse hiç bilgim yok desem yeridir.Kod aşağıda şekildedir.

#include "16f628.h"
#use delay(clock=4m)


//long sut1,sut2;
const char
     Bos[8]={0,0,0,0,0,0,0,0},
     A[8]={14,17,17,31,17,17,17,0},
     Bb[8]={30,17,17,30,17,17,30,0},
     Cc[8]={14,17,16,16,16,17,14,0},
     D[8]={30,17,17,17,17,17,30,0},
     E[8]={31,16,16,30,16,16,31,0},
     Ff[8]={31,16,16,30,16,16,16,0},
     G[8]={14,17,16,23,17,17,14,0},
     H[8]={17,17,17,31,17,17,17,0},
     Ib[8]={14,4,4,4,4,4,14,0},
     Jj[8]={7,2,2,2,2,18,12,0},
     K[8]={17,18,20,24,20,18,17,0},
     L[8]={16,16,16,16,16,16,31,0},
     M[8]={17,27,21,21,17,17,17,0},
     N[8]={17,25,21,19,17,17,17,0},
     O[8]={14,17,17,17,17,17,14,0},
     P[8]={30,17,17,30,16,16,16,0},
     R[8]={30,17,17,30,20,18,17,0},
     Ss[8]={14,17,16,14,1,17,14,0},
     T[8]={31,21,4,4,4,4,14,0},
     U[8]={17,17,17,17,17,17,14,0},
     V[8]={17,17,17,17,17,10,4,0},
     Y[8]={17,17,10,4,4,4,4,0},
     Zz[8]={31,1,2,4,8,16,31,0};
     

char  *s;
int b,i,j,ba;
int na,la=0,ka=32;
int say,diziboy;
char dizi[60]="MIKRO C ILE PIC PROGRAMLAMA";
char boy=27;//Dizinin eleman sayısı

//**********************************************************

void kaydir()
{

 for(na=0;na<ka;na++)
                     {
                      output_low(pin_a1);//porta.f1=0;
                      output_low(pin_a0);//porta.f0=0;
                      output_high(pin_a0);//porta.f0=1;
                     }
 la++;
 if(la==8)//8'in katı olacak (Hız ayarı için kullanılır.)
            {
             la=0;
             ka--;
            }
 if(ka<-diziboy)ka=50;
}

//**********************************************************

void goster(char za)
{

for(j=7;j>0;j--)
                 {
                  for(ba=(za-1);ba>0;ba--)
                                      {
                                       switch (dizi[ba])
                                                        {
                                                         case ' ': s=Bos;break;
                                                         case 'A': s=A; break;
                                                         case 'B': s=Bb; break;
                                                         case 'C': s=Cc; break;
                                                         case 'D': s=D; break;
                                                         case 'E': s=E; break;
                                                         case 'F': s=Ff; break;
                                                         case 'G': s=G; break;
                                                         case 'H': s=H; break;
                                                         case 'I': s=Ib; break;
                                                         //case 'İ': s=Ib; break;
                                                         case 'J': s=jj; break;
                                                         case 'K': s=K; break;
                                                         case 'L': s=L; break;
                                                         case 'M': s=M; break;
                                                         case 'N': s=N; break;
                                                         case 'O': s=O; break;
                                                         case 'P': s=P; break;
                                                         case 'R': s=R; break;
                                                         case 'S': s=Ss; break;
                                                         case 'T': s=T; break;
                                                         case 'U': s=U; break;
                                                         case 'V': s=V; break;
                                                         case 'Y': s=Y; break;
                                                         case 'Z': s=Zz; break;
                                                        }
                                       b=s[j];
                                       b<<=1;
                                       for(i=0;i<6;i++)
                                                       {
                                                        say++;
                                                        //porta.f1=b&0b00000001;
                                                        output_bit(pin_b0,b&0b00000001);
                                                    
                                                            
                                                        
                                                        
                                                        if(say<=(diziboy+ka))
                                                        {
                                                        output_low(pin_a0);//porta.f0=0;
                                                        output_high(pin_a0);//porta.f0=1;
                                                        }
                                                        b>>=1;
                                                       }

                                     }
                 say=0;
                 kaydir();
                 switch(j%7)
                            {
                             case 0: output_b(0b01111111); break;
                             case 1: output_b(0b10111111); break;
                             case 2: output_b(0b11011111); break;
                             case 3: output_b(0b11101111); break;
                             case 4: output_b(0b11110111); break;
                             case 5: output_b(0b11111011); break;
                             case 6: output_b(0b11111101); break;
                             case 7: output_b(0b11111110); break;
                            }
                output_low(pin_a2);//porta.f2=0;
                output_high(pin_a2);//porta.f2=1;
                delay_ms(1);
                output_low(pin_a3);//porta.f3=0;
                output_high(pin_a3);//porta.f3=1;
              }
}

//**********************************************************

void kurulum()
{
 output_b(0x00);
 output_a(0x00);
 output_high(pin_a3);
}

//**********************************************************



void main()
{
 kurulum();
 diziboy=boy*6;
 while(true)
 {
   say=0;
   goster(boy);//dizinin ilk elemanı dizinin eleman sayısını verir.
 }
}//~


isiste hata veren kısım "b=s[j];" burası.hatayı verme sebebi nedir ve nasıl düzeltebilirim
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

bymrz

                                                        {
                                                         case ' ': s=&Bos;break;
                                                         case 'A': s=&A; break;
                                                         case 'B': s=&Bb; break;
                                                         case 'C': s=&Cc; break;
                                                         case 'D': s=&D; break;
.
.
.
.



bu şekilde denesen?

gokhangokcen

ccs yemedi hocam derler iken hata veriyor.
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

Erdem

Alıntı yapılan: gokhangokcen - 26 Eylül 2012, 12:43:36
isiste hata veren kısım "b=s[j];" burası.hatayı verme sebebi nedir ve nasıl düzeltebilirim

Hata mesajını görmeden çok fazla yorum yapmak mümkün değil ancak burada b'nin türü de char olsa daha doğru olur. b = s[j] yerine b = *(s + j) de yazabilirsin ama ikisi de aynı şey.

Benim tahminim burada s geçerli bir diziyi göstermiyor olabilir.

bymrz

#4
orayı unutmuşum...

b=s[j];   kısmını da


b= *(s+j) ;

(Taib ki bu arada b yi ve j yi de unsigned char olarak tanımla...)
ya da

b=(unsigned char) * ( s + (unsigned char)j  ); şeklinde kullanmalısın...

şeklinde yapacaksın...

gokhangokcen

alone_lover hocam kodun son hali bu;

#include "16f628.h"
#use delay(clock=4m)


//long sut1,sut2;
const char
     Bos[8]={0,0,0,0,0,0,0,0},
     A[8]={14,17,17,31,17,17,17,0},
     Bb[8]={30,17,17,30,17,17,30,0},
     Cc[8]={14,17,16,16,16,17,14,0},
     D[8]={30,17,17,17,17,17,30,0},
     E[8]={31,16,16,30,16,16,31,0},
     Ff[8]={31,16,16,30,16,16,16,0},
     G[8]={14,17,16,23,17,17,14,0},
     H[8]={17,17,17,31,17,17,17,0},
     Ib[8]={14,4,4,4,4,4,14,0},
     Jj[8]={7,2,2,2,2,18,12,0},
     K[8]={17,18,20,24,20,18,17,0},
     L[8]={16,16,16,16,16,16,31,0},
     M[8]={17,27,21,21,17,17,17,0},
     N[8]={17,25,21,19,17,17,17,0},
     O[8]={14,17,17,17,17,17,14,0},
     P[8]={30,17,17,30,16,16,16,0},
     R[8]={30,17,17,30,20,18,17,0},
     Ss[8]={14,17,16,14,1,17,14,0},
     T[8]={31,21,4,4,4,4,14,0},
     U[8]={17,17,17,17,17,17,14,0},
     V[8]={17,17,17,17,17,10,4,0},
     Y[8]={17,17,10,4,4,4,4,0},
     Zz[8]={31,1,2,4,8,16,31,0};
     

//char  *s;
unsigned char b;
unsigned char j;
unsigned char s;
int i,ba;
int na,la=0,ka=32;
int say,diziboy;
char dizi[60]="MIKRO C ILE PIC PROGRAMLAMA";
char boy=27;//Dizinin eleman sayısı

//**********************************************************

void kaydir()
{

 for(na=0;na<ka;na++)
                     {
                      output_low(pin_a1);//porta.f1=0;
                      output_low(pin_a0);//porta.f0=0;
                      output_high(pin_a0);//porta.f0=1;
                     }
 la++;
 if(la==8)//8'in katı olacak (Hız ayarı için kullanılır.)
            {
             la=0;
             ka--;
            }
 if(ka<-diziboy)ka=50;
}

//**********************************************************

void goster(char za)
{

for(j=7;j>0;j--)
                 {
                  for(ba=(za-1);ba>0;ba--)
                                      {
                                       switch (dizi[ba])
                                                        {
                                                         case ' ': s=Bos;break;
                                                         case 'A': s=A; break;
                                                         case 'B': s=Bb; break;
                                                         case 'C': s=Cc; break;
                                                         case 'D': s=D; break;
                                                         case 'E': s=E; break;
                                                         case 'F': s=Ff; break;
                                                         case 'G': s=G; break;
                                                         case 'H': s=H; break;
                                                         case 'I': s=Ib; break;
                                                         //case 'İ': s=Ib; break;
                                                         case 'J': s=jj; break;
                                                         case 'K': s=K; break;
                                                         case 'L': s=L; break;
                                                         case 'M': s=M; break;
                                                         case 'N': s=N; break;
                                                         case 'O': s=O; break;
                                                         case 'P': s=P; break;
                                                         case 'R': s=R; break;
                                                         case 'S': s=Ss; break;
                                                         case 'T': s=T; break;
                                                         case 'U': s=U; break;
                                                         case 'V': s=V; break;
                                                         case 'Y': s=Y; break;
                                                         case 'Z': s=Zz; break;
                                                        }
                                       b=*(s+j);
                                       b<<=1;
                                       for(i=0;i<6;i++)
                                                       {
                                                        say++;
                                                        //porta.f1=b&0b00000001;
                                                        output_bit(pin_b0,b&0b00000001);
                                                    
                                                            
                                                        
                                                        
                                                        if(say<=(diziboy+ka))
                                                        {
                                                        output_low(pin_a0);//porta.f0=0;
                                                        output_high(pin_a0);//porta.f0=1;
                                                        }
                                                        b>>=1;
                                                       }

                                     }
                 say=0;
                 kaydir();
                 switch(j%7)
                            {
                             case 0: output_b(0b01111111); break;
                             case 1: output_b(0b10111111); break;
                             case 2: output_b(0b11011111); break;
                             case 3: output_b(0b11101111); break;
                             case 4: output_b(0b11110111); break;
                             case 5: output_b(0b11111011); break;
                             case 6: output_b(0b11111101); break;
                             case 7: output_b(0b11111110); break;
                            }
                output_low(pin_a2);//porta.f2=0;
                output_high(pin_a2);//porta.f2=1;
                delay_ms(1);
                output_low(pin_a3);//porta.f3=0;
                output_high(pin_a3);//porta.f3=1;
              }
}

//**********************************************************

void kurulum()
{
 output_b(0x00);
 output_a(0x00);
 output_high(pin_a3);
}

//**********************************************************



void main()
{
 kurulum();
 diziboy=boy*6;
 while(true)
 {
   say=0;
   goster(boy);//dizinin ilk elemanı dizinin eleman sayısını verir.
 }
}//~


fakat yinede isiste hata veriyor verdiği hata ise şu "Attempt to read unimplemented memory location 0x0001 ignored" ve bu hex kod ile belirttiği adres ilerleyip gidiyor.Hala sonuca ulaşabilmiş değilim dediğim gibi daha önce bu tarz pointer ve adres işlemleri ile ilgili olarak hiç uğraşmadım genelde animasyon kartı yapıp ona program yazıyordum çok fazla tecrübem yok ccs ile
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

bymrz

sakıncası yoksa bunları da bir char olarak tanımlayıp denesene...

int i,ba;
int na,la=0,ka=32;
int say,diziboy;



bir de "const" tanımlaması kullanıldığında Pic'lerde ram hafızası mı işgal ediliyor program hafızası mı onu bilemiyorum... Normalde program hafızası kullanılması lazım... Eğer ram kullanıyorsa, sen rami zaten fazlasıyla işgal etmişsin... Ondan kaynaklı bir sorun da olabilir...

gokhangokcen

hocam ram hafızası sorunu olacağını sanmıyorum çünkü aynı (orjinal ccs'ye çevirmediğim) kodu micro c ile derledim derliyor ve çalışıyor benim maksadım mikro c ye yabancıyım ccs ile az buçuk aşinalığım var o yüzden idi artık micro c kurdum bilgisayara ve orada derledim hallettim işimi müsait bir zamanda tekrar üzerine düşüp düzenlerim kodu.Yardımlarınız için teşekkür ederim.
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.