Arama butonu
Bu konudaki kullanıcılar: 1 misafir
2
Cevap
1147
Tıklama
0
Öne Çıkarma
C'de pointer hataları. Acil Yardım ! (Çözüldü)
S
14 yıl (242 mesaj)
Teğmen
Konu Sahibi

Öncelikle merhaba. Ufak bir proje ödevim var fakat pointer hatalarıyla başım dertte. Program dili C. Proje olduğundan kodun sağlam kısmını error vermeyecek şekilde çıakrtmam gerekti. Kodda mantık aramayın oyüzden .

1) Yarattığım myHead struct'ını MyFuction fonksiyonuna nasıl yollayacağım ve nasıl kullanacağım? Zira MyFunction içinde ne zaman myHead kullansam deferencing pointer to incomplete type hatası aldım.

2)myHead structını MyFunction fonksiyonundan bir diğer fonksiyona nasıl yollayacağım/kullanacağım? (Örneğin start fonksiyonu. Henüz ilk sorun yüzünden deneyemedim bile.)


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

typedef struct Node{
int t;
int ts;
struct node *next;
}node;

typedef struct Head{
int c;
struct node *first;
struct node *tail;
}head;

void start(**myHead){ //Henüz yazmadim.
}

void MyFunction(head *myHead ){
node * newNode;

newNode=((node*)malloc(sizeof(node)));

//İçinnde MyHead geçen herşey hata veriyor burdan itibaren
while(newNode->ts >(*myHead)->c){
start(myHead);
}
if(*myHead->first==NULL){
(*myHead)->first=newNode;
(*myHead)->tail=newNode;
}
else{
(*myHead)->tail->next = newNode;
(*myHead)->tail = newNode;
}
newNode->next=NULL;
return;
}


int main(void) {
int choice;
head * myHead;
myHead=((head*)malloc(sizeof(head)));

if(myHead == NULL){ //ERROR CHECK
printf("Unable to allocate memory\n");
fflush(stdout);
return 0;
}
else{
myHead->c=0;
myHead->first=NULL;
myHead->tail=NULL;
choice=0;

MyFunction(&myHead);// Nasil yollayacagim?



}

return 0;
}


DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil





< Bu mesaj bu kişi tarafından değiştirildi sparkan -- 25 Aralık 2012; 21:03:34 >

G
14 yıl (8718 mesaj)
Yarbay

Neresini düzeltsek bilemedim. Kısaca şöyle söyleyeyim.

Bir struct elemanına nesnenin kendisi üzerinden erişiyorsan bunu . operatörü ile yaparsın. Yani;

head myHead;
myHead.c = 10;

Yok eğer işaretçi üzerinden erişiyorsan -> ile.

head *myHead = (head*) malloc(sizeof(head));
myHead->c = 10;

veya
head myHead;
head *myHeadPtr = &myHead;
myHeadPtr->c = 42;

MyFunction içindeki myHead işaretçi olduğu için şöyle erişirsin;
myHead->first = newNode;

* ile dereference edince nesnenin kendisi elde edildiği için şöyle de olabilir ama bu gereksiz.

(*myHead).tail = newNode;

MyFunction çağrısı işaretçi gönderdiğin için şöyle olmalı.
MyFunction(myHead); // & yok

myHead işaretçi değilde struct un kendisi olsaydı senin yaptığın gibi olurdu.


Bu mesaja 1 cevap geldi.
S
14 yıl (242 mesaj)
Teğmen
Konu Sahibi

quote:

Orijinalden alıntı: elektro_gadget

Neresini düzeltsek bilemedim. Kısaca şöyle söyleyeyim.

Bir struct elemanına nesnenin kendisi üzerinden erişiyorsan bunu . operatörü ile yaparsın. Yani;

head myHead;
myHead.c = 10;

Yok eğer işaretçi üzerinden erişiyorsan -> ile.

head *myHead = (head*) malloc(sizeof(head));
myHead->c = 10;

veya
head myHead;
head *myHeadPtr = &myHead;
myHeadPtr->c = 42;

MyFunction içindeki myHead işaretçi olduğu için şöyle erişirsin;
myHead->first = newNode;

* ile dereference edince nesnenin kendisi elde edildiği için şöyle de olabilir ama bu gereksiz.

(*myHead).tail = newNode;

MyFunction çağrısı işaretçi gönderdiğin için şöyle olmalı.
MyFunction(myHead); // & yok

myHead işaretçi değilde struct un kendisi olsaydı senin yaptığın gibi olurdu.

Öncelikle çok teşekkürler.

myHead'in sonundaki node'a tail işaretçisi ile ulaşıp, o nodun next'ini newNode yapmak istiyorum.
myHead->tail->next = newNode;
yapınca yine aynı hatayı veriyor. Bu değişikliği hangi notasyonla yapabilirim?


Ayrıca söylediğiniz düzeltmeleri yapınca errorlerin yerini assigment from incompatible pointer type warning'i aldı newNode içeren her satır.
Örneğin;

myHead->tail = newNode;

İlk söylediğim errorleri düzeltemediğimden warningleri test edemiyorum

-------------------------------------

Structları tanımlarken
struct node *next; yazmışım. Onlar struct Node *next olacak

Gözden kaçan bu ufak ama sinir bozucu hatayı da düzeltince kod tıkıt tıkır çalışıyor.





< Bu mesaj bu kişi tarafından değiştirildi sparkan -- 25 Aralık 2012; 21:06:49 >

DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.