C Struct içerisinde pointer ve pointer to pointer kullanımında anlamsız çalışma

Başlatan Cemre., 07 Nisan 2018, 17:28:30

Cemre.

Merhabalar,

Yazmaya çalıştığım kodun yapmasını istediğim şey aslında çok karmaşık değil. Hatta PC'de yapmak istediğim şeyi çalıştırdım, bir sorun da gözükmüyor. Ancak bunu STM32 ve Keil ile yapmaya çalıştığımda sorunla karşılaşıyorum.

Aşağıdaki gibi bir struct tanımladım. Bu struct'ta hem pointer'lar hem de pointer to pointer'lar mevcut.
typedef struct
{
...
 signed short *Ia;
 signed short *Ib;
 signed short *Ic;
 signed short **Measurement_L;
 signed short **Measurement_R;
 signed short **Measurement_X;
 signed short Measurement_L_Sign;
 signed short Measurement_R_Sign;
...
} SVPWM_TypeDef;

Bir fonksiyon içerisinde ise bu pointer to pointer'ları switch case sonucuna göre aynı struct içerisindeki diğer pointerlar ile dolduruyorum. Örnek,

case 1:
 ...
 SVPWM_Variables.Measurement_L_Sign = 1;
 SVPWM_Variables.Measurement_L = &SVPWM_Variables.Ic;
 SVPWM_Variables.Measurement_R_Sign = -1;
 SVPWM_Variables.Measurement_R = &SVPWM_Variables.Ib;
 SVPWM_Variables.Measurement_X = &SVPWM_Variables.Ia;
 break;

Eğer debug aşamasında Call Stack + Local sekmesinden bu değişkenleri izlersem, Örneğin Measurement_L_Sign = 1 olduğunu görüyorum. Fakat aynı anda Watch Window'dan bakarsam değişkenler hala 0 olan başlangıç değerlerlerini koruyorlar. Dolayısıyla sistemin geri kalanı düzgün çalışamıyor. Eğer pointer to pointer tipindeki değişkenlere main fonksiyon içerisinde başlangıç değeri olarak switch case içerisinde yaptığım gibi rastgele bir atama yaparsam, pointer ile gösterdiğim değişkenlerin değerlerinin değiştiğini de görüyorum. Ancak switch case içerisindeki kodlar yine de işlevsiz olduğu için pointer to pointer değişkenlerinin içeriği veya Sign değişkenlerinin içeriği asla değişmiyor.

Bunun sebebi ne olabilir? Call Stack + Local'de çalışan kod neden global struct değişkeninin içeriğine müdahale edemez?

Herkese iyi hafta sonları dilerim...

Cemre.

PC'de yazdığım kod parçası ve çıktısı...

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

typedef struct Vars{
    signed int *ptrOfMyA;
    signed int *ptrOfMyB;
    signed int **ptrOfPtrA;
    signed int **ptrOfPtrB;
};

signed int myA, myB;

int main(int argc, char** argv) {
    struct Vars myVars; 

    myVars.ptrOfMyA = &myA;
    myVars.ptrOfMyB = &myB;
    
    myVars.ptrOfPtrA = &myVars.ptrOfMyA;
    myVars.ptrOfPtrB = &myVars.ptrOfMyB;
    
    **myVars.ptrOfPtrA = 500;
    **myVars.ptrOfPtrB = 100;
    
    printf("A = %i\n", **myVars.ptrOfPtrA);
    printf("B = %i\n", **myVars.ptrOfPtrB);
    return (EXIT_SUCCESS);
}


Çıktı:

A = 500
B = 100

RUN SUCCESSFUL (total time: 65ms)

Cemre.

Problem solved :)

Hepsi benim hatam. Umarım C'ye yeni başlayan arkadaşlar bu konuyu okumazlar.

xxx.xxx'lerden de farkedeceğiniz üzere fonksiyona geçtiğim argümanı pointer olarak tanımlamak yerine dümdüz geçmişim. Bu sebeple içeriğine müdahale edemiyordum.

void fonksiyon(SVPWM_Typedef SVPWM_Variables) olan tanımlamamı void fonksiyon(SVPWM_Typedef *SVPWM_Variables) ile,
fonksiyon içerisindeki "."'ları da "->" ile değiştirince doğal olarak sorun çözüldü.

izturk

Biz daha pointer kullanamıyoruz doğru düzgün. Elalem pointer to pointer kullanıyor. Hata yapıyor. Onu da kimse cevaplamadan kendi çözüyor. Kim öğretecek abi bize bu c yi kullanmayı?

Hocam bu arada pointer to pointer ne demek sorması ayıp olmasın. İlk defa duydum.

Yuunus

@izturk; Sahsen, ASM ile ugrasinca pointer kavrami oturmustu, adresleri kurcaliyorsun adresi oteleyip registerlara birseyler yukleyip geri cagiriyorsun baya bir artisi oluyor. isin asli ugrasmadan ogrenilmiyor yoksa kitabi bilgi heryerde var onemli olan bu kavramin sizin alginizda ne ifade ettigi ve bunlarla neler yapabilirim sorusu. Uyarayim da lutfen mevzu dil muhabbetine donmesin.

Cemre.

Pointer konusu ile ilgili güzel bir anlatım için: https://youtu.be/H1gR250FWac

Bilgisayar Kavramları kanalının diğer videolarını da incelemenizi öneririm.