C Programlama diliyle şamatalar

Başlatan z, 23 Ekim 2011, 15:32:04

muhittin_kaplan

assert_failed fonksiyonunu kullanan vardır diye umut ediyorum. Hatalı Dosyayı, Fonksiyonu ve geçirilmeye çalışılan parametreyi veriyor diye biliyorum.
Bunu Nasıl Yapıyor ?

unknownperson

Merhaba, C de Sudoku yapmayı planlıyorum fakat bunu kendim internetten herhangi bir kod bakmayarak yapmak istiyorum. Kafamda şekillendi diziden 3x3 tablo oluşturup rand() ile sayı atıcam herşeyi planladım fakat tek sıkıntım şu bu sudokunun çözülmesi için belli sayıların yeri boşluk olmalı ki kullanıcı tamamlasın fakat hangi yerlerin boşluk olacağını nasıl ayarlıcam ? yardımcı olursanız sevinirim.

AsHeS

#827
Alıntı yapılan: muhittin_kaplan - 13 Haziran 2014, 14:38:47
assert_failed fonksiyonunu kullanan vardır diye umut ediyorum. Hatalı Dosyayı, Fonksiyonu ve geçirilmeye çalışılan parametreyi veriyor diye biliyorum.
Bunu Nasıl Yapıyor ?
Muhittin hoca hala cevabı bulamadıysan söyleyeyim __FILE__ ve __LINE__ makrosu ile.

printf("File: %s  Line = %d",__FILE__, __LINE__);// Dosya ismi ve satır numarasını alırsın direkt.

Edit: Ahanda doküman
http://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html

musaak

c de  int *dizi[6];  tanımlaması nasıl kullanılıyor?

Gökhan BEKEN

Alıntı yapılan: musaak - 11 Temmuz 2014, 01:06:38
c de  int *dizi[6];  tanımlaması nasıl kullanılıyor?
int *dizi; deserseniz int türünde bir adet pointer tanımlamış olursunuz.
int *dizi[6]; deserseniz int türünde 6 farklı adres tutabilen bir pointer tanımlamış olursunuz.
Özel mesaj okumuyorum, lütfen göndermeyin.

Mucit23

Can Bus ile uğraşırken bir sorunla karşılaştım önerilerinizi almak isterim.

Şöyle bir Struct yapı var
typedef struct
{
  uint32_t StdId;  /*!< Specifies the standard identifier.
                        This parameter can be a value between 0 to 0x7FF. */

  uint32_t ExtId;  /*!< Specifies the extended identifier.
                        This parameter can be a value between 0 to 0x1FFFFFFF. */

  uint8_t IDE;     /*!< Specifies the type of identifier for the message that will be transmitted.
                        This parameter can be a value of @ref CAN_identifier_type */

  uint8_t RTR;     /*!< Specifies the type of frame for the message that will be transmitted.
                        This parameter can be a value of @ref CAN_remote_transmission_request */

  uint8_t DLC;     /*!< Specifies the length of the frame that will be transmitted.
                        This parameter can be a value between 0 to 8 */

  uint8_t Data[8]; /*!< Contains the data to be transmitted. It ranges from 0 to 0xFF. */
} CanTxMsg;

/** 
  * @brief  CAN Rx message structure definition  
  */

typedef struct
{
  uint32_t StdId;  /*!< Specifies the standard identifier.
                        This parameter can be a value between 0 to 0x7FF. */

  uint32_t ExtId;  /*!< Specifies the extended identifier.
                        This parameter can be a value between 0 to 0x1FFFFFFF. */

  uint8_t IDE;     /*!< Specifies the type of identifier for the message that will be received.
                        This parameter can be a value of @ref CAN_identifier_type */

  uint8_t RTR;     /*!< Specifies the type of frame for the received message.
                        This parameter can be a value of @ref CAN_remote_transmission_request */

  uint8_t DLC;     /*!< Specifies the length of the frame that will be received.
                        This parameter can be a value between 0 to 8 */

  uint8_t Data[8]; /*!< Contains the data to be received. It ranges from 0 to 0xFF. */

  uint8_t FMI;     /*!< Specifies the index of the filter the message stored in the mailbox passes through.
                        This parameter can be a value between 0 to 0xFF */
} CanRxMsg;


Ben CanBus kütüphanemde Yukarıdaki gibi CanRxMsg türünde değişken tanımlar gibi bir yapı tanımlıyorum.

CanRxMsg RxMessage;

CanBus kütüphanesi içerisinde yukarıdaki şekilde tanımlanmış yapının elemanlarındaki değerleri görebiliyorum. Örneğin RxMessage.StdId nin içerisindeki değerleri doğru bir şekilde görebiliyorum. Şimdi Ben aynı yapıyı yani RxMessage yapısını main.c içerisindede kullanayım diyorum. Gerektiğinde RxMessage.StdId içeriğini main'dede görebileyim.
main.c'nin başına aşağıdaki gibi bir tanımlama yapıyorum.

extern CanRxMsg RxMessage;

Bu şekilde bir kullanımda keil hata vermiyor ama CanBus kütüphanesi içerisinde RxMessage.StdId içerisindeki değeri görebilirken aynı değere main içerisinde baktığımda içinin 0 olduğunu görüyorum. RxMessage nin bütün elemanları için geçerli bu durum.

Örneğin CanBus kütüphanes içerisinde RxMessage.StdId değişkenine 0x3042 yüklüyorum ve mainde aynı elemanı okuyorum içeriği sıfır.

Ama aynı şekilde CanBus kütüphanesinde yine Global olarak tanımladığım uint8_t türündeki değişkenimi aynı şekilde main programının başında tanımlayıp kullanabiliyorum. Tek bir değişkende sıkıntı çıkmıyor.

Anlam veremedim. Normalde bir fonksiyon içerisinde global olarak tanımlanmış Struct bir yapıyı başka bir fonksiyonda kullanmak için ne yapmamız gerekiyor. Yanlış birşeymi yapıyorum?




mir_as82

Hocam sadece sonunun son cümlesi için,
Fonksiyon içinde global tanımlama nasıl oluyor? Benim bildiğim fonksiyon içinde tanımlanan sadece o fonksiyonun yerel değişkenleri olmaz mı? Global yapmak için "file scope" olması gerekmez mi?Yani fonksiyon alanı dışında tanımlanması gerekmiyor mu?

Burak B

#832
1 - Global değişkenleri mümkün mertebe kullanmamaya özen gösterin.
2 - Eğer illa kullanacaksanız volatile olduğundan emin olun.
3 - Global değişken kullanmak yerine bu türde değişken aktarımlarını weak callback fonksiyonlar ile yapabilirsiniz.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

Mucit23

Alıntı yapılan: mir_as82 - 15 Ağustos 2014, 09:47:22
Hocam sadece sonunun son cümlesi için,
Fonksiyon içinde global tanımlama nasıl oluyor? Benim bildiğim fonksiyon içinde tanımlanan sadece o fonksiyonun yerel değişkenleri olmaz mı? Global yapmak için "file scope" olması gerekmez mi?Yani fonksiyon alanı dışında tanımlanması gerekmiyor mu?

Hocam pardon, Aslında orada cümleyi yanlış kurmuşum. Dediğiniz gibi tezatlık var. Global derken RxMessage Yapısını CanBus kütüphanemin başında tanımlıyorum. CanBus kütüphanesi için Global oluyor sanırım.

Normalde bu işlemi tek değişken ile sıklıkla kullanırım. Global değişken neden kullanmamaya özen gösteriyoruz?
Dediğiniz gibi veri aktarımı için bir fonksiyon yazabilirim ama doğrudan bahsettiğim yöntemle değişken aktarımı daha çok işime gelir.

Benim anlamadığım, tek bir değişkende sürekli kullandığım yöntem neden bir struct için işe yaramıyor?

Burak B

#834
Alıntı YapGlobal değişken neden kullanmamaya özen gösteriyoruz?

1 - Global değişkenler hatalara en çok sebebiyet verenlerdir.
2 - Her fonksiyon tarafından erişilebilir olmaları yazılım büyüdükçe takip edilmelerini çok zorlaştırır.
3 - Doğru tanımlanmamışsalar derleme esnasında derleyici tarafından optimize edilebilirler.

Ayrıca değişkenleri kullanılacakları yere yakın tutmak iyi bir tasarım pratiğidir. Ayrıca mümkünse derleyiciniz destekliyorsa C99 ve üstü standartlara uygun kod yazmaya çalışın. Keil v4 için "--c99" parametresini C/C++ sekmesinde tanımlamanız bu işi görür. Keil v5 de zaten seçebiliyorsunuz.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

Mucit23

@ByteMaster Dediklerinizi anladım.  Ama hala asıl sorun hakkında cevap alamadım. Fikri olan varmı?

X-Fi

Hocam benim anladığım global bir structure oluşturmak istiyorsunuz.

define.C dosya içerisinde struck tanımlayıp isimlendirin.

struct  CanTx   CanTxMsg;


define.H dosya içerisinide aşağıdaki şekilde oluşturun.

struct CanTxMsg
{
...
} ;

extern struct CanTx CanTxMsg;


Bu şekilde define.H dosyasını çağırdığınız her C dosyasında struct dizilerinize erişebilirsiniz. Bunun başka türlü bir yolu yok.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

mir_as82

Başınıza multiple inclusion sorunu gelirse bunu egale etmeyi de unutmayin. Belki olabilir diye uyarayim dedim : )

kantirici

#838
Merhaba,

Elimde ki uint16-8 tipi değişkenlerin yüksek değerli 2 basamağını bir diziye kaydetmek için sprintf ile çalışıyorum.

sprintf(array,"a:%02 b:%1d",a,b);  gibi kullanıyorum. Fakat a değişkeni içinde 3 basamaklı olduğunda 3, 2 olduğunda ise 2 basamaklı yazıyor yani 0 eklemiyor. Aynı şekilde b değişkeninide tek hane yazmıyor.Çıktı şu şekilde oluyot;

a:251 b: 123
a:25   b:563  gibi.

Daha önce yazıyordu program üzerinde biraz ekle çıkar dan sonra düzgün çalışmamaya başladı. Sorun neden kaynaklı olabilir acaba?
Bu iş için bir fonksiyon yazabilirm ama çok sayıda ve değişken uzunlukta sayılarla uğraşacagım için sprintf daha esnek olur diye düşünüyorum.

Gökhan BEKEN

printf(%5d\n",3);
çıktı: "00003"
Özel mesaj okumuyorum, lütfen göndermeyin.