Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => KEIL => Konuyu başlatan: görkem - 28 Ağustos 2017, 14:08:42

Başlık: typedef struct ile ilgili
Gönderen: görkem - 28 Ağustos 2017, 14:08:42
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";

Başlık: Ynt: typedef struct ile ilgili
Gönderen: JKramer - 28 Ağustos 2017, 14:16:51
Tip bir tane olacak, sadece isim_type yani. isim_type data[50] olacak.
Başlık: Ynt: typedef struct ile ilgili
Gönderen: baran123 - 28 Ağustos 2017, 14:21:42
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);
}
Başlık: Ynt: typedef struct ile ilgili
Gönderen: quarko - 28 Ağustos 2017, 14:21:50
char türünden bir diziye o şekilde string ifade girilmez. "strcpy" fonksiyonunu kullanman gerekir. Ya da bir benzerini kendin yazmalısın.
Başlık: Ynt: typedef struct ile ilgili
Gönderen: yldzelektronik - 28 Ağustos 2017, 14:29:48

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.
Başlık: Ynt: typedef struct ile ilgili
Gönderen: XX_CİHAN_XX - 28 Ağustos 2017, 15:05:43
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.
Başlık: Ynt: typedef struct ile ilgili
Gönderen: yldzelektronik - 28 Ağustos 2017, 15:45:18
@XX_CİHAN_XX


Biraz açabilir misiniz? Yanlış bildiğim şeyi düzelteyim.
Başlık: Ynt: typedef struct ile ilgili
Gönderen: XX_CİHAN_XX - 28 Ağustos 2017, 16:07:34
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;
}
Başlık: Ynt: typedef struct ile ilgili
Gönderen: baran123 - 28 Ağustos 2017, 16:08:11
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];

Başlık: Ynt: typedef struct ile ilgili
Gönderen: 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ı.
Başlık: Ynt: typedef struct ile ilgili
Gönderen: Klein - 28 Ağustos 2017, 18:12:58
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 :)   
Başlık: Ynt: typedef struct ile ilgili
Gönderen: görkem - 28 Ağustos 2017, 21:26:56
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.
Başlık: Ynt: typedef struct ile ilgili
Gönderen: MrDarK - 29 Ağustos 2017, 07:40:09
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.
Başlık: Ynt: typedef struct ile ilgili
Gönderen: OptimusPrime - 29 Ağustos 2017, 16:59:26
@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.
Başlık: Ynt: typedef struct ile ilgili
Gönderen: görkem - 30 Ağustos 2017, 01:05:41
dediğiniz gibi ram den çalışıcam resetlemede de başlangıçta flashdan ram e bilgi aktarıp çalışmaya devam edicek.