Picproje Elektronik Sitesi

SERBEST BÖLGE => Programlama ve Algoritma => Konuyu başlatan: armsistem - 20 Haziran 2013, 18:07:12

Başlık: pointer *void
Gönderen: armsistem - 20 Haziran 2013, 18:07:12
Arkadaşlar merhaba ;

Aşağıda kod çalışıyor. Lakin kafamı karıştıran göstericiler.

1- Göndericeğim veriyi dizi olarak tanımlamışım.Ok.
2- Fonksiyonda 'deger' pointer tanımlamışım.Ok.
3-"to_flash(deger, " yerine "to_flash(&deger, "  yazsam deger adresini göndermiş oluyorum peki ama neden çalışmıyor.?
4-"(deger, (void *)CONFIG_FLASH_OFFSET, 256);"  ---- "int iap_copy_ram_to_flash(void* ram_address, void* flash_address, unsigned int count)"
yukarıda kullanılan (void*) fonksiyonları ne anlama geliyor.




static char  flw1[] =  "AAAAAAA";

dataflash_yaz(flw1);
void dataflash_yaz(char *deger){
iap_status = (__e_iap_status) iap_copy_ram_to_flash(deger, (void *)CONFIG_FLASH_OFFSET, 256);
   if (iap_status != CMD_SUCCESS) while(1); }



iap copy ram to flash fonksiyon


int iap_copy_ram_to_flash(void* ram_address, void* flash_address, unsigned int count) {
    unsigned int command[5];
    unsigned int result[4];
    command[0] = COPY_RAM_TO_FLASH;
    command[1] = (unsigned int) flash_address;
    command[2] = (unsigned int) ram_address;
    command[3] = count;
    command[4] = SystemCoreClock / 1000;
    iap_entry(command, result);
    return (int) result[0];
}

Başlık: Ynt: pointer *void
Gönderen: Tagli - 20 Haziran 2013, 19:04:26
Derleme hatası mı alıyorsun yoksa çalışma sırasında mı sıkıntı oluyor? Derleme hatası alıyorsan hata nedir?

iap_copy_ram_to_flash fonksiyonunu çağırırken deger'i (void*) deger şeklinde yazmayı bir dene.

(void*) ifadesi bir fonksiyon değil, bir cast operatörüdür (bu kelime biraz yanlış oldu sanırım). Yani tür değiştiricidir. Flash'a yazan fonksiyonun dizi elemanlarının türünü bilmesine gerek yok. Bu sebeple onları ham byte'lar olarak görmesi yeterli. Bu sebeple char pointer'ı void pointer'a dönüştürmen gerekiyor.
Başlık: Ynt: pointer *void
Gönderen: armsistem - 20 Haziran 2013, 19:12:51
Herhangi bir sıkıntı yok iap ile mcu flash istediğimi yazbiliyorum vede okuyabiliyorum , ama yaptığımı üstünkörü değil tam olarak anlamaya çalışıyorum sorum o yüzden.
Başlık: Ynt: pointer *void
Gönderen: Tagli - 20 Haziran 2013, 19:21:43
O zaman görülen o ki char*'dan void*'e dönüşüm otomatik olarak yapılmış.
Başlık: Ynt: pointer *void
Gönderen: fatih6761 - 20 Haziran 2013, 19:28:03
Alıntı yapılan: armsistem - 20 Haziran 2013, 18:07:12
Arkadaşlar merhaba ;

Aşağıda kod çalışıyor. Lakin kafamı karıştıran göstericiler.

1- Göndericeğim veriyi dizi olarak tanımlamışım.Ok.
2- Fonksiyonda 'deger' pointer tanımlamışım.Ok.
3-"to_flash(deger, " yerine "to_flash(&deger, "  yazsam deger adresini göndermiş oluyorum peki ama neden çalışmıyor.?
4-"(deger, (void *)CONFIG_FLASH_OFFSET, 256);"  ---- "int iap_copy_ram_to_flash(void* ram_address, void* flash_address, unsigned int count)"
yukarıda kullanılan (void*) fonksiyonları ne anlama geliyor.




static char  flw1[] =  "AAAAAAA";

dataflash_yaz(flw1);
void dataflash_yaz(char *deger){
iap_status = (__e_iap_status) iap_copy_ram_to_flash(deger, (void *)CONFIG_FLASH_OFFSET, 256);
   if (iap_status != CMD_SUCCESS) while(1); }



iap copy ram to flash fonksiyon


int iap_copy_ram_to_flash(void* ram_address, void* flash_address, unsigned int count) {
    unsigned int command[5];
    unsigned int result[4];
    command[0] = COPY_RAM_TO_FLASH;
    command[1] = (unsigned int) flash_address;
    command[2] = (unsigned int) ram_address;
    command[3] = count;
    command[4] = SystemCoreClock / 1000;
    iap_entry(command, result);
    return (int) result[0];
}



3-"to_flash(deger, " yerine "to_flash(&deger, "  yazsam deger adresini göndermiş oluyorum peki ama neden çalışmıyor.?

Hocam deger zaten bir pointer, yani verinin adresini taşıyor. Tekrar ref işareti koymayacaksınız. Tekrar ref işareti koyarsanız dizinin adresini taşıyan değişkenin kopyasının adresi ( ??? ) olur.

4-"(deger, (void *)CONFIG_FLASH_OFFSET, 256);"  ---- "int iap_copy_ram_to_flash(void* ram_address, void* flash_address, unsigned int count)"
yukarıda kullanılan (void*) fonksiyonları ne anlama geliyor.
Hocam void* ler fonksiyon değil, pointer türü belli olmadığından void pointer kullanılmış. Derleyici uyarı vermesin diye de boş bir type casting yapılmış.
(void *)CONFIG_FLASH_OFFSET ile CONFIG_FLASH_OFFSET arasında hiçbir fark yok.
Neden böyle birşey yapmışlar derseniz, mesela siz uint8 taşımak istiyorsunuz, ancak fonksiyon uint32'ye göre tanımlanmış. Bu noktada hem programcı açısından hem kütüphane açısından kavram sıkıntısı yaşanabilir.
Diğer türlü aralarında bir fark yok zaten(pointer aritmetiği dışında !)
Eğer pointer aritmetiği yapılacaksa iş değişir, tür önemli olur.
İyi çalışmalar hocam...
Başlık: Ynt: pointer *void
Gönderen: armsistem - 20 Haziran 2013, 19:35:51
Teşekkür ederim çok açıklayıcı oldu.