typedef struct ile ilgili

Başlatan görkem, 28 Ağustos 2017, 14:08:42

görkem

Merhaba arkadaşlar

struct ile igili bir problem yaşıyorum. data.ID ye veri atabiliyorum fakat adi dizisine string veri giremiyorum hata veriyor nerde yanlış yapıyorum?

typedef struct{
	uint8_t ID;
	char adi[20],soyadi[20];
	uint8_t cardID[5];

} isim_type[50];
 isim_type data;


data[0].ID=1;	
data[0].adi="hakan";

JKramer

Tip bir tane olacak, sadece isim_type yani. isim_type data[50] olacak.

baran123

#2
Diziyi öyle pat diye bir string ifade atayamazsın strcpy kullanman gerekir.

#include <stdio.h>
#include <stdlib.h>
#include <stdint-gcc.h>

typedef struct
{
    int ID;
    char adi[20];
    char soyadi[20];
    int cardID[5];
} isim_type;

int main(int argc, char** argv) 
{
    isim_type data[50];
    
    data[0].ID = 1;	
    
    strcpy(data[0].adi , "hakan");
    
    printf("%s", data[0].adi);
    
    return (0);
}


Yada pointer yapacaksın.
#include <stdio.h>
#include <stdlib.h>
#include <stdint-gcc.h>

typedef struct
{
    int ID;
    char* adi;
    char* soyadi;
    int cardID[5];
} isim_type;

int main(int argc, char** argv) 
{
    isim_type data[50];
    
    data[0].ID = 1;	
    
    data[0].adi = "hakan";
    
    printf("%s", data[0].adi);
    
    return (0);
}

quarko

char türünden bir diziye o şekilde string ifade girilmez. "strcpy" fonksiyonunu kullanman gerekir. Ya da bir benzerini kendin yazmalısın.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

yldzelektronik

typedef struct
{
   uint8_t ID;
   char adi[ 50 ];
   char soyadi[ 50 ];
   uint8_t cardID[ 5 ];
}Isım_TypeDef;


int main( void )
{
   Isım_TypeDef data[ 50 ];


   data[ 0 ].ID = 25;


   strcpy( data[ 0 ].adi, "görkem" );
   strcpy( data[ 0 ].soyadi, "soyadi ne bilmiyorum" );


   data[ 0 ].cardID[ 0 ] = 0x45;
}



Peki sizin yazdığınızdaki hata ne?


C ile bir struct tanımı yaparken dizi oluşturamazsınız. Yapının üyeleri dizi olabilir ama yapı dizi olamaz. Yani isim_type[50] diye bir tanımlama yapamazsınız.Peki dizi kullanmak isterseniz ne yapacaksınız?


Tanımladığınız türden oluşturacağınız değişkenler dizi olarak tanımlanabilir. Mesela Isım_TypeDef data[ 50 ] şeklinde bir tanımlama ile Isım_TypeDef isimli türden data adıyla 50 elemanlı bir dizi değişken oluşturduk.


Peki diğer sorun ne?


Yine C ile string diye bir tür kullanamazsınız.C dilinde böyle bir tür yok. Karakter dizisi (katar) var. Bu diziye elemanları tek tek sizin yerleştirmeniz gerekiyor.


Bu durum daha yüksek seviyeli dillerde farklı.Çünkü doğrudan string diye bir türleri var.


Örnekte kullandığım fonksiyon standard kütüphanede yer alan string copy fonksiyonu.Yani bir karakter dizisine katar (string) kopyalamak için kullanılan fonksiyon.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

XX_CİHAN_XX

Alıntı yapılan: yldzelektronik - 28 Ağustos 2017, 14:29:48
C ile bir struct tanımı yaparken dizi oluşturamazsınız. Yapının üyeleri dizi olabilir ama yapı dizi olamaz.
Böyle bir şey yok. Yapı türünden dizi üretebilir.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

yldzelektronik

@XX_CİHAN_XX


Biraz açabilir misiniz? Yanlış bildiğim şeyi düzelteyim.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

XX_CİHAN_XX

Alıntı yapılan: yldzelektronik - 28 Ağustos 2017, 15:45:18
@XX_CİHAN_XX


Biraz açabilir misiniz? Yanlış bildiğim şeyi düzelteyim.

Dev-C++ programında aşağıdaki kodu deneyebilirsiniz.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
   char ID;
   char adi[ 50 ];
   char soyadi[ 50 ];
   char cardID[ 5 ];
}str;
    
int main(int argc, char *argv[]) {
	
	str st[10];
    
    strcpy (&st[0].adi[0],"ilk dizi");
    strcpy (&st[1].adi[0],"ikinci dizi");
    strcpy (&st[2].adi[0],"ucuncu dizi");
    
    printf ("%s\n%s\n%s\n",st[0].adi, st[1].adi, st[2].adi);

    return 0;
}
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

baran123

C de yapı dizileri var deneyebilirsiniz.

typedef struct
{
   uint8_t ID;
   char adi[ 50 ];
   char soyadi[ 50 ];
   uint8_t cardID[ 5 ];
}Isım_TypeDef;

Isım_TypeDef Isimler[128];

yldzelektronik

#9
 :) :)


@XX_CİHAN_XX  @baran123

Ben aslında açık olur diye düşündüm.Ama ifadem yanlış oldu galiba.Aslında pek yanlış gelmiyor ama tekrar edeceğim (emin olmak istiyorum).

C ile tür (struct vs) tanımı yaparken dizi oluşturulamaz.Değişken tanımlarken oluşturulabilir.

Bir yerde tanımlanmış
typedef struct{ int a[10]; char b;}struct_typedef;
türden
struct_typedef variable[100]
şeklinde bir değişken elbetteki oluşturulabilir.

Ancak benim bahsettiğim kısım
typedef struct{ int a[10]; char b;}struct_typedef[10];


şeklinde bir yaklaşım.Yapamazsınız dediğim kısım bu. Tanım yaparken dediğim kısım burası.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Klein

Alıntı yapılan: yldzelektronik - 28 Ağustos 2017, 17:45:50
:) :)


@XX_CİHAN_XX  @baran123

Ben aslında açık olur diye düşündüm.Ama ifadem yanlış oldu galiba.Aslında pek yanlış gelmiyor ama tekrar edeceğim (emin olmak istiyorum).

C ile tür (struct vs) tanımı yaparken dizi oluşturulamaz.Değişken tanımlarken oluşturulabilir.

Bir yerde tanımlanmış
typedef struct{ int a[10]; char b;}struct_typedef;
türden
struct_typedef variable[100]
şeklinde bir değişken elbetteki oluşturulabilir.

Ancak benim bahsettiğim kısım
typedef struct{ int a[10]; char b;}struct_typedef[10];


şeklinde bir yaklaşım.Yapamazsınız dediğim kısım bu. Tanım yaparken dediğim kısım burası.

"Yapamazsınız" kısmı biraz yanlış anlaşılmaya müsait.
Sonuç olarak tip tanımı yapıyoruz. 

typedef struct{
    int a;
    int b;
}ab_tipi[10];

şeklinde tip tanımı yapılabilir.  Ben her abc_tip tipinde bir değişken tanımladığımda , bundan 10 tanesi için alan ayırmak istiyor olabilirim. Bu tip tanımında bir hata yok.
Fakat ben bu şekilde yapar mıydım? hayır. Kaç tane istediğime değişkeni tanımı aşamasında karar vermek isterim.

"Yapılamaz" yerine "yapmasaydık iyiydi" demek gerek sanırım :)   

görkem

Arkadaşlar teşekkürler cvplar için pointer kullanarak devam ediyorum.
Birde algoritma hakkında danışmak istiyorum rfid kart okuma ile ilgili database oluşturmam gerekiyor 100 adete kadar rfid kart mevcut en verimli algoritma nasıl olabilir benim ilk aklıma gelen flasha seri no ları ve o seri no ya karşılık gelen ismi  kaydetmek ve kart okunacağı zaman bütün flasha kayıtlı olan database i okuyup karşılaştırmak.sizlerin önerilerinide duymak isterim.

MrDarK

Sisteme reset atılmadığı müddetçe Ram den çalışman daha mantıklı olur. Eğer reset atılırsa da rfid yi açmadan önce hafızadaki tüm kayıtları tekrar Ram e doldur. Bu sayede kart her yaklaştığında hafızayı okumakla zaman kaybetmezsin.
Picproje Eğitim Gönüllüleri ~ MrDarK

OptimusPrime

#13
@görkem

100 adet icin bahsettigin yontem uygun. 1000 ve uzeri icin hizli algoritmalar daha mantikli olacaktir. yine de islemi hizlandirmak istersen ve c++ kullaniyorsan map ve set fonksiyonlarina bakabilirsin. senin yerine hizli bir sekilde kart ekler cikartir ve bulur. bunlarda anahtar kart numarasi olmadir. c++ kullanmiyorsan hash tablolu linked list is gorur. elinle koymus gibi kart numarasina denk gelen ismi bulursun. bunlardan herhangi birini gozune kestirdiginde ilk once pc uzerinde programini gelistir derim. daha sonra kopyala yapistir yaparsin kendi sistemine.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

görkem

dediğiniz gibi ram den çalışıcam resetlemede de başlangıçta flashdan ram e bilgi aktarıp çalışmaya devam edicek.