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

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

ziyaretci

 Merhaba,

char basla="yak";
  olarak string ifade tanımlıyorum fakat derleyici hata veriyor.

Hata; "expression must evaluate to a constant" 
          "ifadesi bir sabit değerlendirmeniz gerekir"

  google çeviricide çevirdim yukarıdaki hatanın türkçe karşılığından şunu anladım.

"Tanımladığımız string ifadesinide ayriyetten tanımlamamız gerekiyor" diye düşündüm.Denedim;
örnek:
char yak;
char basla="yak";


Fakat yine olmadı hata aynı.

  Varsa bir fikriniz veya düşünceniz paylaşırsanız sevinirim.

Teşekkür ederim.

fatihinanc

#1
Selam,

Pointer olmalı. Siz 1 byte lık yere 3 byte + \n yazmaya çalışıyorsnuz bu şekilde

char* basla = "yak";

ya da
char basla[] = "yak";


yaparsanız çalışacaktır..

Kolay Gelsin.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

ziyaretci

Alıntı yapılan: fatihinanc - 07 Eylül 2012, 22:30:43
Selam,

Pointer olmalı. Siz 1 byte lık yere 3 byte + \n yazmaya çalışıyorsnuz bu şekilde

char* basla = "yak";


yaparsanız çalışacaktır..

Kolay Gelsin.

mesaj birleştirme:: 07 Eylül 2012, 22:32:03



  Çok teşekkür ettim  @ fatihinanc     :)

Erdem

Alıntı yapılan: erkantr67 - 07 Eylül 2012, 22:23:56
char basla="yak";
  olarak string ifade tanımlıyorum fakat derleyici hata veriyor.

Burada char tek bir karakter olmuş oluyor. Örneğin char karakter = 'k' gibi..

Fatih'in de gösterdiği gibi bir dizi olması için bir dizi olması gerekiyor. Hatta değişmeyecekse
const char mesaj[40] = "Merhaba nasılsın"; 
const char * yanit = "\nİyiyim ya sen?";

şeklinde const olması daha iyi.

Şimdi bu ikisi arasında nasıl bir ilişki var ona bakalım. Karakter dizisinin ismi dizideki ilk karakterin adresidir. Yani aşağıdakiler doğrudur.

mesaj == &mesaj[0] , *mesaj == 'M' ve *(mesaj + 1) == mesaj[1] == 'e'


Aslında bazı farklılıklar da var ama mesajı fazla uzatmak istemiyorum. Ama en bariz fark yukarıdakilerin ikisi de sadece char olsaydı dizi ismi mesaj sabit (constant) yanit ise değiştirilebilir bir gösterge olacaktı.

ziyaretci

Alıntı yapılan: Erdem  - 07 Eylül 2012, 23:11:06
Burada char tek bir karakter olmuş oluyor. Örneğin char karakter = 'k' gibi..

Fatih'in de gösterdiği gibi bir dizi olması için bir dizi olması gerekiyor. Hatta değişmeyecekse
const char mesaj[40] = "Merhaba nasılsın"; 
const char * yanit = "\nİyiyim ya sen?";

şeklinde const olması daha iyi.

Şimdi bu ikisi arasında nasıl bir ilişki var ona bakalım. Karakter dizisinin ismi dizideki ilk karakterin adresidir. Yani aşağıdakiler doğrudur.

mesaj == &mesaj[0] , *mesaj == 'M' ve *(mesaj + 1) == mesaj[1] == 'e'


Aslında bazı farklılıklar da var ama mesajı fazla uzatmak istemiyorum. Ama en bariz fark yukarıdakilerin ikisi de sadece char olsaydı dizi ismi mesaj sabit (constant) yanit ise değiştirilebilir bir gösterge olacaktı.

  mesela şarta bağlı işlem yapacağız.

klavyeden gelen bilgiyi a değişkenine aktaralım.

bizim
const char* dur="kapat";
diye bir değişkenimiz olsun.

şimdi klavyeden" kapat" girdik a değişkenine aktarıldı.

if(a==dur){komut;}

  bu şekildemi şarta bakarız daha derli toplu olarak;

const char* dur="kapat";

char a[40];

  gets(a);
 if(a==dur){komut;}

AsHeS

Bildiğim kadarıyla C dilinde string karşılaştırma işlemi için string.h kütüphanesi altında ki strcmp komutuyla yapılıyor.Bahsi geçen
string a,b; //tanımlaması altında
if (a!=b);  // tanımlaması geçersiz sayılıyor maalesef.

ziyaretci

Alıntı yapılan: AsHeS35 - 08 Eylül 2012, 04:56:36
Bildiğim kadarıyla C dilinde string karşılaştırma işlemi için string.h kütüphanesi altında ki strcmp komutuyla yapılıyor.Bahsi geçen
string a,b; //tanımlaması altında
if (a!=b);  // tanımlaması geçersiz sayılıyor maalesef.


Bu  şekilde şartı kontrol etme .php de sağlanıyor. php web yazılım dili ama php de olan ccs c de neden olmasın bir yolu olması lazım.

Getchar(); ile teker teker kayıt ederek yapılabilir. Ama kolay yolu string kelimeyi komple kontrol etme.Bu nasıl olacak inş. birisinin tecrübesi vardır bu konuda.

JKramer

Yukarıda söylendiği gibi, strcmp ile olacak.

AsHeS

Alıntı yapılan: erkantr67 - 08 Eylül 2012, 12:47:24

Bu  şekilde şartı kontrol etme .php de sağlanıyor. php web yazılım dili ama php de olan ccs c de neden olmasın bir yolu olması lazım.

Getchar(); ile teker teker kayıt ederek yapılabilir. Ama kolay yolu string kelimeyi komple kontrol etme.Bu nasıl olacak inş. birisinin tecrübesi vardır bu konuda.
Bu yoldan istifade ile C# dilinde de "=" işaretinin aşırı yüklenmesi ile oluyorda bu C de maalesef olmuyor.

Erdem

Alıntı yapılan: erkantr67 - 08 Eylül 2012, 02:22:14
bizim
const char* dur="kapat";
diye bir değişkenimiz olsun.

şimdi klavyeden" kapat" girdik a değişkenine aktarıldı.

if(a==dur){komut;}

  bu şekildemi şarta bakarız

O şekilde yapamayız çünkü dur tek bir karakteri gösteren bir gösterge. Dizinin ilk karakterini gösteriyor. Hatta *(dur + 3) ile dur[3] eşit demiştik.

Ama C'deki diziler '\0' ile sonlandığı için bu işlevi biz yazabiliriz ya da arkadaşların dediği dizideki karakterleri null karakterine gelene kadar teker teker karşılaştıran strcmp kullanabiliriz.
#include <stdio.h>
#include <string.h>

int main()
{
    const char * komut = "kapat";

    if (strcmp(komut, "kapat") == 0) {
        printf("kapatıyorum\n");
    }
}

Alıntı yapılan: AsHeS35 - 08 Eylül 2012, 04:56:36
Bildiğim kadarıyla C dilinde string karşılaştırma işlemi için string.h kütüphanesi altında ki strcmp komutuyla yapılıyor.
Bahsi geçen
string a,b; //tanımlaması altında

Tabi C dilinde string diye bir tür yoktur. C++'da std::string var.

Alıntı yapılan: AsHeS35 - 08 Eylül 2012, 04:56:36
if (a!=b);  // tanımlaması geçersiz sayılıyor maalesef.

C++'deki std::string için strcmp gereksiz. <, ==, !=  işleçleri ile karşılaştırma yapılabiliyor.

Ama eğer istersek  C++'de null ile biten C stili dizgileri karşılaştırmak için std::strcmp kullanabiliriz. Örneğin:
#include <vector>
#include <cstring>
#include <algorithm>
#include <iostream>

using std::vector;
using std::sort;
using std::strcmp;
using std::cout;


int main() 
{
    vector<const char*> kediler {"Minnoş", "Mırnav", "Tekir", "Pamuk"};

    sort(kediler.begin(), kediler.end(), [](const char * ilk, const char * ikinci) {
            return strcmp(ilk, ikinci) < 0;
        });

    for (const char * kedi : kediler) {
        cout << kedi << '\n';
    }
}

Dizilerin bu şekilde ilklenmesi bir C++11 özelliği olduğu için derlemek için derleyicinize uygun seçeneği eklemek gerekiyor. Örneğin gcc için -std=c++0x seçeneğini eklemek gerekiyor.

AsHeS

#10
@Erdem hmm ilginç aklımda ödev yaparken tanımladığım(string a="dsdsa",b="sdsa" // gibi) gelmişti demek ki C# ile karıştırmışım şimdi biraz baktım da neyse boşluğuma geldi diyelim :).

ziyaretci

"strcmp" bu komutun tam anlamıyla işlevi nedir ?

Erdem

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:
Alıntı Yapstrcmp("A", "A") sonucu 0
strcmp("A", "B") sonucu -1
strcmp("B", "A") sonucu 1
strcmp("C", "A") sonucu 1
strcmp("Z", "A") sonucu 1
strcmp("elmalar", "elma") sonucu 1

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;
}

ziyaretci

 
Klavyeden "abc" girdik ve enter' a bastık. Gelen veriler string olarak lcd'ye gönderdik.Lcd ' de "abc " karakterleri  gözüktü.


   Ben mesela klavyeden "gel" komutu girip enter 'a   bastığımda " { komutlar;}  "  bloğu işleme girsin istiyorum.


gets(); : rs 232 iletişimde RX pini üzerinden string ifade alımı için kullanılır.Enter a basılıncaya kadarki yazılan string ifade ile geri döner.

  Aşağıda klavyeden gelen bilgi string olarak "cavus_emri" değişkenine yazılıyor da, benim belirlediğim string ifade ile klavyeden gelen string ifade eşitliğine göre işlem yapamıyorum.

Defalarca aynı konu üzerine sizlerden bilgi istiyorum kusura bakmayın. Anlayamadım bir türlü daha doğrusu iki string dizisinin  karakterlerinin eşitliğine göre işlem yapmada takıldım.

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


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


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

     #int_rda
      
       
        Void serihaberlesme_kesmesi()
         {
          disable_interrupts(int_rda);
          output_high(pin_c5);
       
          gets(cavus_emri);                                                   
            printf("\n\rGirdiginiz emir-> %s\n",cavus_emri);
          printf(lcd_putc,"\f%s",cavus_emri);
          
   while(*(cavus_emri)==*(islem)){komutlarım; break;}

          output_low(pin_c5);
          printf("\n\rSAYIN CAVUS EMiR VE KOMUTLARINIZA HAZiRiM ->");
         }
         
         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);
          
         }
         }
         


Erdem

#14
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;
}