pointer *void

Başlatan armsistem, 20 Haziran 2013, 18:07:12

armsistem

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];
}

Tagli

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.
Gökçe Tağlıoğlu

armsistem

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.

Tagli

O zaman görülen o ki char*'dan void*'e dönüşüm otomatik olarak yapılmış.
Gökçe Tağlıoğlu

fatih6761

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...

armsistem

Teşekkür ederim çok açıklayıcı oldu.