struct kullanımı doğru mu ?

Başlatan magnetron, 29 Eylül 2022, 21:27:16

magnetron

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

devrecii


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

magnetron

#2
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


MCansız

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

magnetron

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

devrecii

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.   

magnetron

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

devrecii

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.


magnetron

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  :)

devrecii

O bahsettiğin özelliği ben de bilmiyorum ama #define kullanabilirsin.