merhaba forum,
diyelim bir step motor hareket fonksiyonu oluşturacağım
mesela JOG fonksiyonu 3 eksen için aynı olacak sadece değişkenlerin ismi değişecek
yani 3 eksen için aynı fonksiyonu 3 kez çağıracağım
fonksiyonun kullandığı değişkenleri struct olarak tanımladım
şimdi bu struct yapı ile örnek X ekseni için bir pointer tanımlıyorum
ve fonksiyonu çağırırken argumanlarından birisi bu pointer olacak
typedef struct{
uint8_t motionbefore;
uint8_t MOTION;
uint8_t VSF;
uint8_t DIR;
uint8_t RPLUS;
uint8_t RMINUS;
uint8_t CONST;
int32_t speed;
int32_t FEED;
volatile int32_t TARGET;
} axesmotion;
fonksiyonu çağırırken bu pointeri arguman olarak geçersem istediğim olur mu
burası fonskiyonun tanımlanması
void feedaxesJOG(axesmotion *Axes,/* */){
Axes->Motionbefore =Axes->MOTION;
if (vsf && JOGs & 0x30)) Axes->MOTION=1;
else Axes->MOTION=0;
if (DIRs&0x10) {Axes->DIR=-1;}
if (DIRs&0x20) {Axes->DIR= 1;}
burası da X ekseni için fonskiyonun çağırılması
axesmotion *XAxes={0}*,YAxes={0},*ZAxes={0};
while (1){
feedaxesJOG(&XAxes,/* */ );
biraz kafam karıştı doğru mu yapıyorum ?
teşekkür
axesmotion *XAxes={0}*,YAxes={0},*ZAxes={0};
burada * ile tanımladığın zaman o pointer olur yani sadece adres gösterir, * ile tanımlamazsan fiziksel bir hafızada yer eder. Yani baştaki yıldızları kaldırırsan olur, bazı derleyiciler bunu tanımaz -> { 0 }.
feedaxesJOG(&XAxes,/* */ );
Burada derleyici hata verektir burası /* */ bu açıklama işaretleri, ama virgulden sonrası boş.
hocam teşekkür
yani
axesmotion *XAxes
olarak değil
axesmotion XAxes
olarak tanımlıycam
fonksiyonu çağırırken de
while (1) {
feedaxesJOG(&XAxes) olacak
peki fonksiyon gövdesinde
void feedaxesJOG(axesmotion *Axes){
Axes->Motionbefore =Axes->MOTION;
şeklinde "->" kullanım mümkün olacak mı bu durumda
Alıntı yapılan: magnetron - 30 Eylül 2022, 11:53:44peki fonksiyon gövdesinde
void feedaxesJOG(axesmotion *Axes){
Axes->Motionbefore =Axes->MOTION;
şeklinde "->" kullanım mümkün olacak mı bu durumda
fonksiyon parametresi pointer olduğundan "->" şeklinde alt parametreye ulaşabilirsiniz. yani evet mümkün
hocam bir soru daha sorayım
eğer struct içindeki bir eleman işaretçi ise
bunun gösterdiği değişkene nasıl erişim sağlanır (Kaan Aslan'nın kitabına baktım tam anlayamadım )
mesela yukardaki struct içinde bir
uint8_t * bits işaretçi olsun
axesmotion XAxes olarak bu yapı cinsinden değişken tanımlıyorum
şimdi XAxes.*bits olarak mı bu işaretçinin gösterdiği değişkene erişeceğim ?
aynı şekilde
axesmotion *Axes olarak bu yapı cinsinden işaretçi tanımlarsam
bahsettiğim değişkene erişmek için
Axes->*bits mi olucak ?
teşekkür
axesmotion XAxes böyle ise *XAxes.bits=10 yada XAxes.bits[0]=10 kodlar bits[0] a 10 değeri verir.
axesmotion *XAxes böyle ise *XAxes->bits=10 yada XAxes->bits[0]=10 yada XAxes[0].bits[0]=10 kodlar bits[0] a 10 değeri verir.
herkese yardımları için teşekkür
zorluklarla karşılaştıkça yeni sorular ortaya çıkıyor
yukarda verdiğim örnekte
void feedaxesJOG(axesmotion *Axes){
fonksiyonunda struct elemanlarına -> operatoruyle erişmek için
her seferinde elemanın önüne Axes-> yazmak gerekiyor
acaba Axes pointerini bir kere göstersek başka bir operatörle
->eleman ismi şeklinde ulaşmak C de mümkün mü
Kaan Aslan'ın kitabına baktım bulamadım
aslında bu struct sayesinde, C++ neden ortaya çıktı anlamaya başladım ::ok
bir de Kaan Aslan C++ kitabı yazacağım demiş aradım internette bulamadım yazdı mı acaba
int *dugme=&XAxes->dugme;
Bu şekilde dışarı çekip kullnabilirsin, bu kodda axis içindeki dugme değişkeninin adresi alındı eğer dugme[0]=10 yada *dugme=10 dersen axis içindeki int değişkenine göndermiş olursun.
teşekkür hocam bu bilgi de iyiymiş
benim sormak istediğim şuydu
mesela fonksiyon gövdesi içinde
void fonksiyon (yapıismi * Ayapı){
with Ayapı
-> DIR = 1;
-> Speed = 100 ;
-> MOTION = 0;
burada with kelimesini başka bir metinde gördüğümü hatırlıyorum
yani her seferinde
Ayapı-> DIR = 1;
Ayapı-> Speed = 100 ;
Ayapı-> MOTION = 0;
yazmadan demek istiyorum
C de böyle bir imkan var mı ?
inşallah siz forum üyelerini bıktırmadım sorularımla :)
O bahsettiğin özelliği ben de bilmiyorum ama #define kullanabilirsin.