Ccs yi yeni başladım daha ilk komutumda hata

Başlatan rree, 08 Şubat 2011, 22:23:39

rree

Basic dilini terk ediyorum. CCs kara verdim ilk proğramda hatanın kaynağını anlamadım
yardımlar için şimdiden teşekürler.
#define N_595_OutPutEnable PIN_D4
#define N_595_MR PIN_D3
#define N_595_Lach PIN_D2
#define N_595_CLK PIN_D1
#define N_595_DATA PIN_D0


void YediSegment6_Yaz(Char Yazi7Seg6[10])
{
   Char Temp_Yazi7Seg6[6],*Vir,*ikiNokta;
   int8 i,k,;

   //Vir=StrChar(Yazi7Seg6,",");// virgül metin içinde kaçıncı karekter                  hata1
   //ikiNokta=StrChar(Yazi7Seg6,":");// iki nokta metin içinde kaçıncı karekter    Hata2
   
  // Virgül iki nokta üstüste yi datadan çıkar ve  Temp_Yazi7Seg6 ye aktar
   k = 0;                                                    // Expecting an identifier  Hata3
   For(i = 0;i >= 9 ; i++ )
   {
     
      if (Yazi7Seg6==",")||(Yazi7Seg6==",")
      {}
         else
      {
            k++;
            Temp_Yazi7Seg6[k]=Yazi7Seg6
      }
   }

}

1-Program yukarıda olduğu gibi. Oluşturduğum prosudur  gelen metin içinde virgül veya iki nokta varsa çıkarılacak. Temp_Yazi7Seg6 aktarılacak.
2-Virgü ve iki nokta kaçıncı karekterlerde olduğu bir değişkende tutulacak.

Hatalarımı açıklarsanız
Ana programdan Fonksiyonu çağıryorum
#include <18F452.h>
#device adc=8
#fuses NOWDT,WDT128,HS, NOPROTECT, NOOSCSEN, BROWNOUT, BORV20, NOPUT, STVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOWRTB, NOWRTC, NOCPD, NOCPB, NOEBTR, NOEBTRB
#use delay(clock=20000000,RESTART_WDT)
//#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PC,errors)

#include <ds18b20.c>
#include <sht75Lib.c>
#include <ds1307.c>
#use Fast_io(d)
#include <FLEX_LCD420.C>
#include <YediSegmentEfect.C>

void main()
{
   char Metin10[9]
   float temp;
   float restemp, truehumid;
   BYTE sec;
   BYTE min;
   BYTE hrs;
   BYTE day;
   BYTE month;
   BYTE yr;
   BYTE dow;
        sht_init();
        ds1307_init();
        set_tris_d(0x00);
        lcd_init();
        Delay_ms(100);
  // Set date for -> 15 June 2005 Tuesday
  // Set time for -> 15:20:55
  ds1307_set_date_time(15,6,5,2,15,20,55);

lcd_putc("\fReady...\n");
Delay_ms(100);

while (TRUE) {
   
    Metin10="12:13,C";
    YediSegment6_Yaz(Metin10);
  cls;
 
  // Diğer kütüphaneler çalışıyor Onları şimdilik kapattım
}

rree

 int8 i,k,;   Doğrusu  int8 i,k; Hatanın birini buldum virgül fazla  dikkatimden kaçmış.

Esas burayı çözmem lazım. C kitabına göre yazdım. Bu kısımdada hata verdi

if (Yazi7Seg6==",")||(Yazi7Seg6==":") 

Yazi7Seg6  değişkeninde ","  veya ":"  varsa  altaki komutları işlet şeklinde düşündüm. 


JKramer

Koda bakmadan son mesaj için konuşuyorum:
if ((Yazi7Seg6==",")||(Yazi7Seg6==":"))


Bu tip hatalarla karşılaşmamak için açtığınız parantezi hemen kapatın, daha sonra parantez içine kodunuzu yazın. Ya da bunu otomatik yapan farklı bir ide kullanabilirsiniz.

arslan74

#3
Alıntı yapılan: rree - 08 Şubat 2011, 22:54:52
int8 i,k,;   Doğrusu  int8 i,k; Hatanın birini buldum virgül fazla  dikkatimden kaçmış.

Esas burayı çözmem lazım. C kitabına göre yazdım. Bu kısımdada hata verdi

if (Yazi7Seg6==",")||(Yazi7Seg6==":") 

Yazi7Seg6  değişkeninde ","  veya ":"  varsa  altaki komutları işlet şeklinde düşündüm.

Merhaba,

İlk başta burada yazdığın örnekle kodunda verdiğin örnek farklı. Ve her ikisinde de hata var fakat hatalar tamamen faklı hatalardır. En başta burada verdiğin örnekle ele alırsak. Sen pointer ile data arasında farkları tam kavrayamadığın için kaynaklanıyor olduğu anlaşılıyor. Yazi7Seg6[] bir dizide eğer sadece ismini yazarsan if (Yazi7Seg6) gibi o zaman pointerden bahis etmiş olursun. yani bu dizinin adresinden kast etmiş olursun. Eğer if ( Yazi7Seg6[1] ) gibi kullanırsan dizin bir elemanından bahis etmiş olursun. Aynı şeklide çift tırnakla yazılan yazılarda içinde yazı tutan dizilerdir.  Kodunda if (Yazi7Seg6==",") gibi  sorgu yaparsan iki dizinin adresi sorgulamış olursun, Buda sürekli farklı olduğu için hiçbir zaman aynı olmaz. if (Yazi7Seg6==",") diye bir sorgu yaptığında bir data ile bir pointer karşılaştırması yapmış olursun. Buda zaten sana hata veya uyarı verecektir. Eğer içerik sorgulaması yapmak istiyorsan karşı tarafından bir data olması gerektir. Doğrusu şöyle olmalıdır. Çift tırnakla değil, tek tırnakla yazılması gerekir yani  if (Yazi7Seg6 [val] == ',' ) gibi bir sorgu atman lazım.

Selamlar

rree

Değişkenler  Basic den farklı bir mantığa sahip.  Pointer  kavramını bir daha bakayım.Bir kaç kelime daha öğrendim.

Ruzgarbey

merhaba.bende basici terk edip ccs ye başladım.syantax iyice pekiştirildikten sonra anlamak daha kolay oluyor.
değişkenler basicten farklı demişsin ama bir farkını ben göremedim.  int8 = byte     int1=bit    int16=word     vede dizi değişkenler basicte ;
dizi[10] var byte    /// basic için
unsigned byte dizi[10]   /// ccs için.
her iki dildede değişkenler aynı mantıkta kullanılıyor.basictede
if dizi[]="," or dizi[]=":"  then      ////mantığındada kullanamazsınız. ccs içinde aynı şey geçerli.

daha önce picbasicte yazdığım kodları şimdi ccs de yazmaya çalışıyorum.bana araştırma şansı ve mantığı doğru kurma şansı veriyor.elbetteki sıkıntı yaşadığım zamanlar çok oluyor ama sıkıntı çekmeden bişi öğrenilmiyor.kolay gelsin.
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

rree

Sağolun o kısmı sayenizde çözdüm.
Yine 3 saat uğraşştım.  Bu sefer fonksiyondan TamM değeri boş i dönüyor.



YediSegmentEfect.C  Dosyama  aşağıdaki fonksiyonu ekledim

Void YediSegmentDonustur(float FloatDeger,unsigned int16 TamF,Kesirf)
{
  int16 Tam16fi,Kesir16fi;
  float TempDegFloat;
      //Tam ve kesirli kısımlar ayrılıyor
      TempDegFloat=FloatDeger;
      Tam16fi=Abs(TempDegFloat);
     
             TamF=Tam16fi;
             //KesirF=Kesir16fi;
     
   delay_cycles( 1 );
}




Main:  Ana programdaki çağırma şeklim.
         
         float DegfloatRE;
         int16 TamM,KesirM;   
   

DegfloatRE =(12345.53) ;

YediSegmentDonustur(DegfloatRE,TamM,KesirM);

  lcd_gotoxy(1,1);
  printf(lcd_putc,"Tam=\%8Lu",TamM);
  delay_ms(2000);

TamM  Değişkenin değeri boş  Sıfır sonuc geliyor.
        isis similasyonunda.
Hatada vermiyor.

YediSegmentEfect.C  fonksiyonu Ana dosyada main:   etiketinde  abs komutalrını kullanırsam doğru çalışıyor.       
   


rree

En sonunda örneklere bakarak bir çzüm buldum. Değişkenlerin önüne & işareti ekleyince geldi bunun  fonksiyon veya değişken tanımındaki anlama nedir?
void YediSegmentDonustur(float FloatDeger, int16 &TamM,int16 &KesirM)

arslan74

Alıntı yapılan: rree - 10 Şubat 2011, 17:57:59
En sonunda örneklere bakarak bir çzüm buldum. Değişkenlerin önüne & işareti ekleyince geldi bunun  fonksiyon veya değişken tanımındaki anlama nedir?
void YediSegmentDonustur(float FloatDeger, int16 &TamM,int16 &KesirM)


Merhaba,

Burada  "&" adin anlamı kullanılan değişkenin adresini al anlamında dır. Onuda içinde adres tutabilen bir pointer atabilirsin. Aslında "int16 &TamM" ile int16 türünden bir değişkenin adresini tutan bir pointer olduğunu belirtiyor. Ancak ANSI-C de böyle bir bildirim hatalıdır. Ansi-C de pointer bildirimleri ya yıldız(*), yada köşelik parantez([]) ile bildirebilirsiniz. Adres alma(&) operatörünü de fonksiyon çağırırken kullanırsın.

Ama CCS Ansi-C dışın dışına çıktığı için bunu kabul etmiş. Böylelikle yeni başlayanlar için çok iyi bir kolaylık yapmış durumda pointerle fazla uğraşmadan pointerleri kullanmayı sağlamış oluyor. Ama bunun tüm C derleyiciler de böyle olduğu sakın düşünmeyin, yoksa çok büyük bir hata yapmış olursunuz.

Selamlar.

omereliusuk

Basic dilini terk ediyorum. CCs kara verdim ilk proğramda hatanın kaynağını anlamadım.
siz yine kod yazmaya başlamışsınız.
hocam aynı yoldayız. ben de arkama baka baka terkediyorum. bu sigarayı bırakmak gibi bir şey. 3 gün oldu örnek kitaplarla filan araştırıyorum. henüz kod yazmaya başlamadım. oldukça zengin bir dil en azından bana öyle geldi. öğrendikten sonra daha rahat yazılacak gibime geliyor. inşallah senin ve benim için de hayırlı olur.

rree

Pata çata ilk programım bitti.Yedi segment  nem , sıcaklık,Saat ve tarih gösteren programı bitirdim. Arkadaşlar sağ olsun takıldığım yerlerde yardımcı oldular. Elektronik devresinde çizip bir degerçekte çalışacakmı bakayım.
C nin sevdiğim taraf  başkaların yazdığı kütüphaneleride edit ve izleyebilinmesi.

rree

Bri fonksiyon yazdım. Belkide c böyle bir komut vardır ama ben bulamadım.Basicde left,mid ,right komut vardı C ne olduğunu bulamadım. Kendim yazayım dedim örnek aşağıda. Bu fonksiyon daha iyileştirliebilir.

int16 *find_charecter(char *FindString[10],Chrt)
{   unsigned int8 i,Deger;
    for(i=0;i<10;i++){
     Deger=FindString[i];
     if(Chrt==Deger){
      Return(i);
      Break;
     }

    }
}