char basla="yak"; string ifade tanımlamada hata

Başlatan ziyaretci, 07 Eylül 2012, 22:23:56

ziyaretci

#15
Alıntı yapılan: Erdem  - 09 Eylül 2012, 02:02:29
Eğer yapmak istediğini doğru anladıysam sanırım şu şekilde yapabilirsin  ;)
#include <stdio.h>
#include <string.h>

#define UZUNLUK 80

void ledYak()
{
    printf("Ledleri yaktım\n");

    /* PORTB'nin uçlarına bağlı tüm ledleri yak */
}

void lcdyeYaz(char * mesaj)
{
    printf("Ekrana yazmak istediğiniz mesajı giriniz\n");

    mesaj = gets(mesaj);

    printf("Ekrana %s yazıyorum", mesaj);
}


int main()
{
    char komut[UZUNLUK];
    printf("Çalıştırmak istediğiniz komutu giriniz\n");
    gets(komut);

    if (strcmp(komut, "yak") == 0) {
        ledYak();

    } else if (strcmp(komut, "yaz") == 0) {
        lcdyeYaz(komut);
    }

    return 0;
}


   int main()  döngüsünü yukarıda benim verdiğim kodda kesmenin içine atacağım diğerlerinide ekleyeceğim kesme döngüsünün altına yarın deneyeceğim bu gece defalarca bişeyler denedim olmadı buda olmazsa kaldıramam  >:( yarın tekrar görüşürüz . :)

  @Erdem ,  bilgi vermeye çalışıyorsunuz verdiğiniz bilgiler harikülade yararlı bilgiler ama inanırmısın anlamakta zorluk çekiyorum. Bilgiyi dolaylı yollardan veriyorsunuz gerisini bana bırakıyorsunuz :)  :) lütfen biraz ayrıntı istiyorum. :) Teşekkürler.   

    Benim verdiğim kod üzerinden gerekli bilgileri verirseniz biraz nefes alacağım :D ""H a a a"  demek bu şekilde oluyormuş diyeyim"   

  CCS C de  "strcmp" komutunu ilk defa görüyorum.

  En son verdiğiniz koddan anladıklarımı ve benim üzerinde çalıştığım kodda nereye koyacağımı size göstereyim;


 
#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4M)
#include <stdio.h>
#include <string.h>

 #define LCD_DATA_PORT      getenv("SFR:PORTB")
 #include <lcd.c>
  
   #use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7, parity=N, stop=1)


   
    

     #int_rda
      
       
        Void serihaberlesme_kesmesi()
         {
           disable_interrupts(int_rda);
           char komut[80];
           printf("Çalıştırmak istediğiniz komutu giriniz\n");
           gets(komut);

    if (strcmp(komut, "yak") == 0) { ledYak(); }

    else if (strcmp(komut, "yaz") == 0) { lcdyeYaz(komut); }

    return 0;
         }


void ledYak()
{
    printf("Ledleri yaktım\n");

    /* PORTB'nin uçlarına bağlı tüm ledleri yak */
}
         

void lcdyeYaz(char * mesaj)
{
    printf("Ekrana yazmak istediğiniz mesajı giriniz\n");

    mesaj = gets(mesaj);

    printf("Ekrana %s yazıyorum", mesaj);
}

         Void main()
         {
         setup_psp(PSP_DISABLED);   // psp kapatıldı.
       setup_timer_1(T1_DISABLED); //t1 kapatıldı.
       setup_timer_2(T2_DISABLED,0,1);  // t2 kapatıldı.
       setup_adc_ports(NO_ANALOGS);  // analog grişler kapatıldı.
       setup_adc(ADC_OFF);    // adc kapatıldı.
       setup_CCP1(CCP_OFF);   // ccp1 kapatıldı.
       setup_CCP2(CCP_OFF);   // ccp2 kapatıldı.
       
        output_low(pin_c5);
        lcd_init();
        printf("\r**SAYIN YONETICI**Merhaba*****");
        printf("\n\rKlavyeden girdiginiz bilgiler lcdde gozukecektir\n\n");
        printf("\n\rKlavyeden bir metin giriniz ve enter tusuna basiniz>");
        enable_interrupts(GLOBAL);  
        
        while(1)
        {
         enable_interrupts(int_rda);
          
         }
         }

Klavyeden "yak" yazıp enter ' a bastığımızda " ledyak(); " alt programına gidiyor. "Yak" dan hariç bir karakterler girdiğimizde , girdiğimiz karakteri lcd de göstericek. Yukarıdaki kodu denemedim.

Bu mudur?
 

Erdem

#16
Alıntı yapılan: erkantr67 - 09 Eylül 2012, 03:11:37
  @Erdem ,  bilgi vermeye çalışıyorsunuz verdiğiniz bilgiler harikülade yararlı bilgiler ama inanırmısın anlamakta zorluk çekiyorum. Bilgiyi dolaylı yollardan veriyorsunuz gerisini bana bırakıyorsunuz :)
O zaman belki de bir C kitabı almanın zamanı gelmiştir :)

http://bit.ly/P5X9Oe

Çünkü bunlar daha çok temel konular. İşin ABC'si bile değil. Hatta eğer fırsat bulabilirsen ceviz forumlarını da takip etmeni tavsiye ederim. C konusunda kendini geliştirmiş olursun.

http://forum.ceviz.net/c-c/

Alıntı yapılan: erkantr67 - 09 Eylül 2012, 03:11:37Benim verdiğim kod üzerinden gerekli bilgileri verirseniz biraz nefes alacağım :D

Tamam o zaman :)

Ama yazdığın komutlar mikrodenetleyiciler için olan derleyiciler için yazıldığı için deneme imkanım yok. O yüzden sana tavsiyem o komutları bir kenara bırak sonra standart C'ye çevir. Örneğin lcdYaz() kısmında printf'le yazıyorum yazsın. Böylece programın taslağını oluşturmuş olursun hem de sadece programlama ile ilgili forumlarda da sorabilirsin.

Aslında ben de böyle yapıyorum. İlkönce programların taslağını oluşturuyorum. Sonra içlerini gerekli kodlarla dolduruyorum. Hatta D ile  yazdığım bir LCD sınıfının kodlarını göstereyim. İçinde D kodu dışında hiç bir şey yok şimdilik.

https://github.com/erdemoncel/elektronikhobi/blob/master/kaynak/lcd.d

const char* islem[3]="yak"; 


Burada derleyicinin hata vermemesine şaşırdım. Çünkü bu durumda islem içerisinde 3 tane const char için gösterge bulunduran bir dizi olmuş oluyor. Yani gösterge dizisi :)

   while(*(cavus_emri)==*(islem)){komutlarım; break;}


Tabi buradaki komutlarım da hiç bir zaman çalışmaz. Çünkü dizginin ilk karakterlerini karşılaştırmış oluyorsun.

Alıntı yapılan: erkantr67 - 09 Eylül 2012, 03:11:37
En son verdiğiniz koddan anladıklarımı ve benim üzerinde çalıştığım kodda nereye koyacağımı size göstereyim;

Bu mudur?

Bence çalışıyorsa sorun yok! :)

mesaj birleştirme:: 09 Eylül 2012, 04:31:33

Tabi değiştirdiğin programda Void main'in doğrusu int main() olacak. Ayrıca özel bir nedeni yoksa serihaberlesme_kesmesi() yerine ana programın içeriği int main()'in içerisinde olmalı.

ziyaretci

#17
Alıntı yapılan: Erdem  - 09 Eylül 2012, 04:00:48
O zaman belki de bir C kitabı almanın zamanı gelmiştir :)

http://bit.ly/P5X9Oe

Çünkü bunlar daha çok temel konular. İşin ABC'si bile değil. Hatta eğer fırsat bulabilirsen ceviz forumlarını da takip etmeni tavsiye ederim. C konusunda kendini geliştirmiş olursun.

http://forum.ceviz.net/c-c/

Tamam o zaman :)

Ama yazdığın komutlar mikrodenetleyiciler için olan derleyiciler için yazıldığı için deneme imkanım yok. O yüzden sana tavsiyem o komutları bir kenara bırak sonra standart C'ye çevir. Örneğin lcdYaz() kısmında printf'le yazıyorum yazsın. Böylece programın taslağını oluşturmuş olursun hem de sadece programlama ile ilgili forumlarda da sorabilirsin.

Aslında ben de böyle yapıyorum. İlkönce programların taslağını oluşturuyorum. Sonra içlerini gerekli kodlarla dolduruyorum. Hatta D ile  yazdığım bir LCD sınıfının kodlarını göstereyim. İçinde D kodu dışında hiç bir şey yok şimdilik.

https://github.com/erdemoncel/elektronikhobi/blob/master/kaynak/lcd.d

const char* islem[3]="yak"; 


Burada derleyicinin hata vermemesine şaşırdım. Çünkü bu durumda islem içerisinde 3 tane const char için gösterge bulunduran bir dizi olmuş oluyor. Yani gösterge dizisi :)

   while(*(cavus_emri)==*(islem)){komutlarım; break;}


Tabi buradaki komutlarım da hiç bir zaman çalışmaz. Çünkü dizginin ilk karakterlerini karşılaştırmış oluyorsun.

Bence çalışıyorsa sorun yok! :)

mesaj birleştirme:: 09 Eylül 2012, 04:31:33

Tabi değiştirdiğin programda Void main'in doğrusu int main() olacak. Ayrıca özel bir nedeni yoksa serihaberlesme_kesmesi() yerine ana programın içeriği int main()'in içerisinde olmalı.

  Anlaşıldı iş başa düştü allem edeceğim gallem edeceğim bunu yapacağım.

const char* islem[3]="yak"; 


Derleyici hata veriyor zaten ben sadece benim anladığımı size göstermek için o şekilde yazdım. 

1-2  ay php ile uğraştım orada bu şartlar kolayca kontrol edilebiliyor kafam orada kaldı herhalde.Aslında daha öncede hatta her zaman olduğu gibi ilk önce bir işe ezberle yaklaşıyorum bu alışkanlık çok kötü bişey. :(

Elimde CCS C kitabı var en kısa zamanda MicroC de alacağım.

Aşağıdaki kodları tekrar gözden geçireceğim.

Alıntı yapılan: Erdem  - 09 Eylül 2012, 00:11:47
strcmp Türkçeye çevirirsek iki dizgiyi karşılaştır demektir. Eğer dizgiler birbirine eşitse 0 döndürür, eğer ilk dizgi diğerinden alfabetik olarak önce geliyorsa negatif bir sayı döndürür, sıra diğer şekildeyse ilk dizgi diğerinden sonra geliyorsa pozitif bir sayı döndürür.
#include <stdio.h>
#include <string.h>

int main()
{
    printf("strcmp(\"A\", \"A\") sonucu ");
    printf("%d\n", strcmp("A", "A"));

    printf("strcmp(\"A\", \"B\") sonucu ");
    printf("%d\n", strcmp("A", "B"));

    printf("strcmp(\"B\", \"A\") sonucu ");
    printf("%d\n", strcmp("B", "A"));

    printf("strcmp(\"C\", \"A\") sonucu ");
    printf("%d\n", strcmp("C", "A"));

    printf("strcmp(\"Z\", \"A\") sonucu ");
    printf("%d\n", strcmp("Z", "A"));

    printf("strcmp(\"elmalar\", \"elma\") sonucu ");
    printf("%d\n", strcmp("elmalar", "elma"));

    return 0;
}
Örneğin bu program benim kullandığım ortamda şu çıktıyı veriyor:
Bir de C stili dizgilerle ilgili olarak örneğin const char * mesaj şeklindeki bir göstergenin tek bir karakteri yani dizginin ilk karakterini gösterdiğini söylemiştik. Ayrıca dizinin son karakteri \0 ile bitiyordu. Bunu kullanarak bir dizginin tüm karakterlerini şu şekilde yazdırabiliriz:
#include <stdio.h>

int main()
{
    const char * mesaj = "Elektroniği seviyorum!";

    while (*(mesaj) != '\0') { /* dizinin sonuna gelince dur */
        putchar(*(mesaj++));   /* göstergenin gösterdiği karakteri yazdır,
                                  göstergeyi bir arttır */
    }
    return 0;
}


Erdem

Alıntı yapılan: erkantr67 - 09 Eylül 2012, 15:50:49
Derleyici hata veriyor zaten ben sadece benim anladığımı size göstermek için o şekilde yazdım. 

Eğer derleyici hata veriyorsa kendin bazı değişiklikler yaparak kodu düzeltmeye çalışabilirsin. Eğer hala hata alıyorsan forumlarda sorabilirsin. Tabi hata mesajlarını da yazarak  ;)

Alıntı yapılan: erkantr67 - 09 Eylül 2012, 15:50:49
Aslında daha öncede hatta her zaman olduğu gibi ilk önce bir işe ezberle yaklaşıyorum bu alışkanlık çok kötü bişey. :(

Evet bir arkadaşımın deyimiyle programcılık bir zenaattir. Hatta bağlantısını da vereyim:

http://www.izmirdesanat.org/ali-cehreli-ile-bilgisayar-programciligi-uzerine

Ben de öyle düşünüyorum.

Örneğin enstrüman çalmak o da bir zenaat. Şimdi ben sana aylarca anlatsam, keman böyle tututur, arşe şudur. Notalar şunlardır, yay şöyle bilekten çekilir. Anlattım diyelim o sürenin sonunda keman çalabilirmisin ? Çalamazsın.

Programcılık da böyledir. Sadece ezberle, okuyarak olmaz. Ben örneğin geçenlerde bir C kitabı aldım 900 sayfa. Şimdi bu kitabı alsam (hani okunmaz da  ;) baştan sona okusam sonra desem ki ben C öğrendim. Diyebilir miyim? Diyemem. Çünkü C öğrenmek için o kodları teker teker yazıp, derlemem anlamadığım noktaları haber gruplarında, forumlarda sorup öğrenmem gerekir. Artık o noktadan sonra hiç kitaba bakmadan kendim C programları yazabilirim.

O yüzden derleyici ve editörle yakın bir ilişkiye girmelisin! :)

Ben sana bir şey anlatayım. Böyle 2,5 tane (bir kitabı yarım bırakmıştım) Türkçe C++ kitabı okuduktan sonra dedim ki ben öğrendim bu işi. Sonra bir gün C++ ile ilgili bir forumda bir soru sordum. Hatta göstergeler falan vardı. İçimden dedim ki bu soruyu bilen çıkmaz  ;) Sonra bir yanıt geldi haydaa! Ben sorunun yanıtını anlayamadım.  ::)

O zaman dedim ki sen daha C++ bilmiyorsun. Ancak bu kitaplara ek olarak 3-4 tane de yabancı C++ ile ilgili kitap okuduktan sonra o soruları ve yanıtlarını rahat anlayabilir, hatta sorulara yanıt verir hale geldim. Ama şimdi sorsan hala bu konuda başlangıç düzeyinde olduğumu düşünüyorum.

Kendilerinin ileri düzey C++ programcısı olduğunu düşünenler Andrei Alexandrescu'nun Modern C++ Design kitabını okusunlar sonra görüşelim :)

Demek istediğim bir programlama dilini öğrenmek için çokca pratik yap. Kod yaz. Ceviz.net gibi forumları takip et. Oradaki sorulara yanıt vermeye çalış. Ancak ondan sonra programcılık konusundan ilerleyebilirsin.

Alıntı yapılan: erkantr67 - 09 Eylül 2012, 15:50:49
Elimde CCS C kitabı var en kısa zamanda MicroC de alacağım.

Öyle kitapların dilin kendisini öğretmekte yetersiz olacağını düşünüyorum. Sana tavsiyem mesela  biraz klasik olsa da Brian W. Kernighan ve Dennis M. Ritchie'nin C programlama dili kitabının Türkçe'ye çevrildiğini gördüm. O olabilir mesela. Aslında başka güzel C kitapları da var ama Türkçesinin olup olmadığını bilmiyorum.

http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list

Daha sonra o PIC C vs.. kitaplarını çerez niyetine okursun  ;)

ziyaretci

#19
    Ben bu programcılık işine bir heves ile girdim başlangıçta çevrem bana destek olacağı yerde köstek oldular.
Sağolsun lisedeki hocamın verdiği mantıkların ve @skara1214  serkan abimin çok çok yardımı oldu.

  İlk yaptığım pic devresi 16f84 ile 8 led animasyon yak söndür vs.vs.  bilirsiniz.Acemiliğin şaheseri.. :)

Bu devreden sonra programcılığa başlama hevesimin asıl amacı olan led tabela projesi  ödev filan değil heaa sadece ben istediğim için.Ama keşke okuduğum lisede programcılık dersleri olsaydıda, ödev olsaydı .Mantığı kavramada zorluk çekmezdim.
  İlk başladlığım anlarda ilk ay ezbercilik ile başladım.Sonrasında kurtularak herşeyin bana ait olduğu bir 8x48 led tabela projesi bitirdim geliştirdim.  Hatta bu forumda bile birçok kez "satır tarama nasıl yapılıyor" ,"dizi kaydırma  " vs. vs bir çok konu açtım. :)

   http://elektrocavus.com/index-4.php projenin son hali
 
Artık animasyon yapmada zorlanmıyorum. Artık benim için animasyon 2-3 saat kafa yor, uygula.


Şimdi rs232 iletişim (seri iletişim) e girdim buda aynı olacak çünkü sizin ve diğer arkadaşların verdiği bilgilerle ezber olarak başladım.Mecburen bu da bir adım çünkü  en azından ne yaparsanız çalışmaz onu öğreniyorum.
 
   Kesinlikle bol bol tecrübe, uygulama yapmak en iyi öğrenme yolu.

Neyse sizin verdiğiniz yoldan ve kodlardan şimdilik vazgeçiyorum. Yapmak istediğimi "getchar" ile tek tek kayıt edicem tek tek kontrol edeceğim ona göre işlem yaptıracağım.Belki bu yoldan esinlenerek sizin verdikleriniz mantıkları daaha kolay oturur.


AsHeS

#21
@erkantr67 Deitel&Deitel C ve C++  adında bir kitabı var.İstanbul'da yaşıyorsan D&R 55 liraya  orjinali Akmar Pasaj'ında 35 liraya korsanı satılmakta.Kitabı kesinlikle tavsiye ediyorum.Aklına iki konu üzerine yazılmış kitap mı olur lan diye düşünebilirsin lakin işin aslı şöyle normalde C ve C++ kitabı ayrı fakat çevirenler ikisini de birleştirmişler C++ ilgi duymayabilirsin ama C kısmını kesinlikle tavsiye ediyorum.Soruları ve programlama hataları kısmı çok yardımcı olur insana.Kitap ANSI C (Bilgisayar için C) üzerinedir.Ama onu öğrendikten sonra diğer C dillerinin %74 ünü öğrenmiş olacaksın çünkü algoritma mantığını da iyi veriyor.

ziyaretci

Teşekkür ederim @ Erdem

Alıntı yapılan: AsHeS35 - 09 Eylül 2012, 20:34:58
@erkantr67 Deitel&Deitel C ve C++  adında bir kitabı var.İstanbul'da yaşıyorsan D&R 55 liraya  orjinali Akmar Pasajın'da 35 liraya korsanı satılmakta.Kitabı kesinlikle tavsiye ediyorum.Aklına iki konu üzerine yazılmış kitap mı olur lan diye düşünebilirsin lakin işin aslı şöyle normalde C ve C++ kitabı ayrı fakat çevirenler ikisini de birleştirmişler C++ ilgi duymayabilirsin ama C kısmını kesinlikle tavsiye ediyorum.Soruları ve programlama hataları kısmı çok yardımcı olur insana.Kitap ANSI C (Bilgisayar için C) üzerinedir.Ama onu öğrendikten sonra diğer C dillerinin %74 ünü öğrenmiş olacaksın çünkü algoritma mantığını da iyi veriyor.

  @AsHeS35 teşekkürler kitabı not aldım alacağım diğer kitapların arasına İstanbul'a yolum düşerse alacağım inşallah.