C Programlama diliyle şamatalar

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

arslan74

Alıntı yapılan: arslan74 - 05 Kasım 2014, 08:46:57
%5d yerine %05d yaz istediğin olur.

Merhaba,

XC8 de deniyorum sorunsuz çalışıyor. Sende başka sorun olabilir.

iruraz

Alıntı yapılan: yamak - 04 Kasım 2014, 23:32:18
Siz dizi[0]="on"  dediğinizde bu adresteki veriyi değil de adresin kendisini değiştirmiş oluyosunuz.Fakat *dizi[0]=5 gibi bir işlemi yapamazsınız.Bunu yapabilmeniz için const belirtecini kaldırmanız gerekir.Tabi sadece const u kaldırarak denerseniz derleme hatası almazsınız ama çalışma esnasında segmentation fault oluşabilir.Tabi bu ayrı bi konu.

@yamak hocam, eğer dizi[0] = "on"; dediğimde değişen adresin kendisi oluyorsa aşağıdaki kodu derleyip çalıştığımda neden aynı adres değerleri dönüyor? Diziyi değiştirdiğimde adres değerinin de değişmesi gerekmez mi?

#include <stdio.h>

int main(void)
{
    int i;

    const char *dizi[4] = {"bir", "iki", "uc", "dort"};

    for(i = 0; i < 4; i++)
    {
        printf("&dizi[%d]: %p\n", i + 1, &dizi[i]);
    }

    dizi[0] = "on";
    dizi[1] = "yirmi";
    dizi[2] = "otuz";
    dizi[3] = "kirk";

    printf("\n****************************\n\n");

    for(i = 0; i < 4; i++)
    {
        printf("&dizi[%d]: %p\n", i + 1, &dizi[i]);
    }

    return 0;
}




Alıntı yapılan: mir_as82 - 04 Kasım 2014, 20:26:47
Her dizi elemani diyor ki. Ben gosterdigim adresi sadece okuma yapmak için gosteririm. O adreslerin içeriğini benim vasitamla değiştiremezsiniz, der. Yani senin yaptigin. Verdiğin sozu tutmamaktir:).

mesaj birleştirme:: 05 Kasım 2014, 20:36:22

Sen gerbay hocanin dediğini yap.
Ömrü boyunca ayni adresi ve o adresi de sadece okuma yapmak için göstersin. Kendisi const gosterdigi yer const olan gösterici demek. Const char * const dizi[ ]. Bu su demek. Hep ayni adresi gosteririm ve o adresin olduğu yerdeki nesneyi benim vasitamla degisemezsin.

Hocam amacım söz verip de tutmamak değil :) Anlamadığım şey, "array pointer" const char *dizi[] şeklinde tanımlandıktan sonra *dizi[] nin taşıdığı bilgi string 'in başlangıç adresleri mi oluyor. Yukarda yazdığım kod parçasını değiştirip derlediğimde:

#include <stdio.h>

int main(void)
{
    int i;

    const char *dizi[4] = {"bir", "iki", "uc", "dort"};

    for(i = 0; i < 4; i++)
    {
        printf("*dizi[%d]: %p\n", i + 1, *dizi[i]);
    }

    dizi[0] = "on";
    dizi[1] = "yirmi";
    dizi[2] = "otuz";
    dizi[3] = "kirk";

    printf("\n****************************\n\n");

    for(i = 0; i < 4; i++)
    {
        printf("*dizi[%d]: %p\n", i + 1, *dizi[i]);
    }

    return 0;
}




sonucu ortaya çıkıyor. Burada çıkan değerler girilen string 'lerin başlangıç adresleri mi oluyor?

Burak hocam makale için teşekkür ederim.

yamak

Hocam &dizi[1] şeklinde yazdırdığınızda dizi[1] değişkeninin bellekte tutulduğu adresi öğrenmiş olursunuz.Halbuki öğrenmeniz gereken bu adreste saklanan adres.
Mesela aşağıdaki gibi bi pointerım olsun
int* ptr;
Ben bu tanımlamayı yaptığımda ptr değişkenini derleyici bellekte bir yere yerleştirir.
ptr="on";
dediğimde ise ptr değişkeninin bellekte tututlduğu adrese "on" string inin adresi yerleştirilir.
Benim yukarıdaki bahsettiğim şey ptr'nin bellekte tutulduğu adres içindeki adreste tutulan değerin değiştirilemeyeceği fakat ptr'nin tutulduğu adresteki adresin ise değiştrilebileceği.Siz yukarda her seferinde ptr'nin bellekteki adreseni yazdırmış oluyosunuz,o adresteki adresi değil.

iruraz

Hocam kafamı karıştıran Deitel 'den Struct konusunu çalışırken aşağıdaki örnek oldu:
/* Fig. 10.3: fig10_03.c
   The card shuffling and dealing program using structures */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/* card structure definition */               
struct card {                                 
   const char *face; /* define pointer face */
   const char *suit; /* define pointer suit */
}; /* end structure card */                   

typedef struct card Card; /* new type name for struct card */

/* prototypes */
void fillDeck( Card * const wDeck, const char * wFace[], 
   const char * wSuit[] );
void shuffle( Card * const wDeck );
void deal( const Card * const wDeck );

int main( void )
{ 
   Card deck[ 52 ]; /* define array of Cards */

   /* initialize array of pointers */
   const char *face[] = { "Ace", "Deuce", "Three", "Four", "Five",
      "Six", "Seven", "Eight", "Nine", "Ten",
      "Jack", "Queen", "King"};

   /* initialize array of pointers */
   const char *suit[] = { "Hearts", "Diamonds", "Clubs", "Spades"};

   srand( time( NULL ) ); /* randomize */

   fillDeck( deck, face, suit ); /* load the deck with Cards */
   shuffle( deck ); /* put Cards in random order */
   deal( deck ); /* deal all 52 Cards */
   return 0; /* indicates successful termination */
} /* end main */

/* place strings into Card structures */
void fillDeck( Card * const wDeck, const char * wFace[], 
   const char * wSuit[] )
{ 
   int i; /* counter */

   /* loop through wDeck */
   for ( i = 0; i <= 51; i++ ) { 
      wDeck[ i ].face = wFace[ i % 13 ];
      wDeck[ i ].suit = wSuit[ i / 13 ];
   } /* end for */
} /* end function fillDeck */

/* shuffle cards */
void shuffle( Card * const wDeck )
{ 
   int i; /* counter */
   int j; /* variable to hold random value between 0 - 51 */
   Card temp; /* define temporary structure for swapping Cards */

   /* loop through wDeck randomly swapping Cards */
   for ( i = 0; i <= 51; i++ ) { 
      j = rand() % 52;
      temp = wDeck[ i ];      
      wDeck[ i ] = wDeck[ j ];
      wDeck[ j ] = temp;      
   } /* end for */
} /* end function shuffle */

/* deal cards */
void deal( const Card * const wDeck )
{ 
   int i; /* counter */

   /* loop through wDeck */
   for ( i = 0; i <= 51; i++ ) {
      printf( "%5s of %-8s%s", wDeck[ i ].face, wDeck[ i ].suit,
         ( i + 1 ) % 4 ? "  " : "\n" );
   } /* end for */
} /* end function deal */



/**************************************************************************
 * (C) Copyright 1992-2010 by Deitel & Associates, Inc. and               *
 * Pearson Education, Inc. All Rights Reserved.                           *
 *                                                                        *
 * DISCLAIMER: The authors and publisher of this book have used their     *
 * best efforts in preparing the book. These efforts include the          *
 * development, research, and testing of the theories and programs        *
 * to determine their effectiveness. The authors and publisher make       *
 * no warranty of any kind, expressed or implied, with regard to these    *
 * programs or to the documentation contained in these books. The authors *
 * and publisher shall not be liable in any event for incidental or       *
 * consequential damages in connection with, or arising out of, the       *
 * furnishing, performance, or use of these programs.                     *
 *************************************************************************/


Buradaki const kullanımlarını pek anlayamadım. Mesela neden struct içindeki ifadeleri const olarak tanımlamış?
struct card {                                 
   const char *face; /* define pointer face */
   const char *suit; /* define pointer suit */
};

mir_as82

#859
Onun gösterdiği yerdeki verileri değiştirmemesi için olabilir. Yani sen o değişkene başka bir yerin adresini yukleyip pointer degiskenin baska adresi gostermeaini saglayabilirsin ama o yukledigin adresin içindeki veriyi pointer değişkeni dereference ederek degisemezsin.

mesaj birleştirme:: 05 Kasım 2014, 20:16:26

Adam yazilari değiştirmek istemiyor ki. Kartların adi belli. Ama elindeki kartin ne olacagina adreslerini değişerek set ediyor. Yani switch gibi düşün. Anahtarı 1 konumuna aliyor 1 konumunun altindaki devreleri değiştirmek istemiyor. 1 konumunu yesil ledi yaksin, 2 nolu konum kirmizi ledi yaksin. Adamin yesil veya kirmizi ledi değişmek gibi bir niyeti yok. Adam anahtarin konumunu degiserek ya kirmiziyi yakacak ya yesili.

iruraz

Alıntı yapılan: mir_as82 - 05 Kasım 2014, 19:59:44
Onun gösterdiği yerdeki verileri değiştirmemesi için olabilir. Yani sen o değişkene başka bir yerin adresini yukleyip pointer degiskenin baska adresi gostermeaini saglayabilirsin ama o yukledigin adresin içindeki veriyi pointer değişkeni dereference ederek degisemezsin.

mesaj birleştirme:: 06 Kasım 2014, 20:16:26

Adam yazilari değiştirmek istemiyor ki. Kartların adi belli. Ama elindeki kartin ne olacagina adreslerini değişerek set ediyor. Yani switch gibi düşün. Anahtarı 1 konumuna aliyor 1 konumunun altindaki devreleri değiştirmek istemiyor. 1 konumunu yesil ledi yaksin, 2 nolu konum kirmizi ledi yaksin. Adamin yesil veya kirmizi ledi değişmek gibi bir niyeti yok. Adam anahtarin konumunu degiserek ya kirmiziyi yakacak ya yesili.

Teşekkürler @mir_as82 hocam verdiğiniz örnekle kafamda netleşti.

@yamak hocam açıklama için teşekkürler.

İyi akşamlar.

GreeN

#define LCD_RAM   *(vu16*)((u32)0x60020000)

LCD_RAM = 0x2c;  Keil bu işlem için hata veriyor . Problem nedir ?





Terörü Lanetliyoruz.

arslan74

Alıntı yapılan: GreeN - 18 Kasım 2014, 12:49:14
#define LCD_RAM   *(vu16*)((u32)0x60020000)

LCD_RAM = 0x2c;  Keil bu işlem için hata veriyor . Problem nedir ?


birde

*LCD_RAM = 0x2c;

böyle dene.

GreeN

..\..\tft\src\glcd.c(210): error:  #18: expected a ")"
..\..\tft\src\glcd.c(210): error:  #20: identifier "u32" is undefined

hala şeklinde bir hata veriyor. Keil ile daha önce derlemişti. Farklı PC de çalışıyorum şu an bu hatayı veriyor.
Terörü Lanetliyoruz.

arslan74

Sanki bu kodda değilde, bunun öncesinde bir hata var gibi duruyor.

GreeN

#865
uint16_t GLCD_ReadRAM(void)
{
     uint16_t dumry;
  LCD_REG = 0x2C;
   dumry=LCD_RAM; 
  return LCD_RAM;
}

mesaj birleştirme:: 18 Kasım 2014, 13:17:39

Keil'in c/c++ ayarlarıyla ilgili olabilir mi?
Terörü Lanetliyoruz.

ercan_t

#define LCD_RAM   *(vu16*)((u32)0x60020000)

bu değeri şuna cevirip denermisin

#define LCD_RAM   *(unsigned short*)((unsigned int)0x60020000)

kantirici

#867
#20: identifier "u32" is undefined

ile u32 tanımlı değil demiş.

#define u32 unsigned int

kodunu ekleyerek denermisin.

GreeN

#define LCD_RAM   *(volatile uint16_t*)((uint32_t)0x60020000)

şeklinde oldu.

#define LCD_RAM   *(vu16*)((u32)0x60020000) 

vu16 ve u32 yeni oluşturduğum projede tanımsız , ama eski bir proje açtığımda bunlar tanımlı. Teşekkürler.
Terörü Lanetliyoruz.

iruraz

Merhaba,

Aşağıdaki kodu hata almadan derleyip çalıştırabiliyorum:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct liste
{
    char *isim;
};

typedef struct liste Liste;

int main(void)
{
    Liste n1;

    scanf("%s", n1.isim);

    printf("%s\n", n1.isim);

    return 0;
}

struct yapısı için char *soyisim şeklinde ikinci bir pointer tanımlıyorum. Derlediğimde hata vermiyor fakat çalışırken "dosya_adi.exe  çalışmayı durdurdu" hatası alıyorum. Sebebi nedir acaba?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct liste
{
    char *isim;
    char *soyisim;
};

typedef struct liste Liste;

int main(void)
{
    Liste n1;

    scanf("%s", n1.isim);

    printf("%s\n", n1.isim);

    return 0;
}


İyi akşamlar.