C Programlama diliyle şamatalar

Başlatan z, 23 Ekim 2011, 15:32:04

Gökhan BEKEN

Dediğiniz gibi hocam, calloc kullanamam,
sürekli gelen bir veri var, eğer buffer'daki alan, yetersiz geliyorsa realloc ile dizinin kapasitesini artırıyorum. Gelen verilerin tamamını aldığımda(dosyanın okunması bittiğinde) , yeni bir dosyaya geçebilmem için o diziyi sıfırlayıp yeniden başlamam gerekiyor. Free kısmınu bu yüzden kullanmıştım ama gerek yokmuş sanırım.
Özel mesaj okumuyorum, lütfen göndermeyin.

z

Önce calloc ile yer ayır sonra realloc ile boyunu değiştir.

Sonra free kullanabilirsin.

free kullanmazsan ayırdığın ram hala sana zimmetli kalır.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Gökhan BEKEN

Tam da öyle yaptım hocam, teşekkürler.
Özel mesaj okumuyorum, lütfen göndermeyin.

unknownperson

Şöyle bir sorunum var belli txt dosyalarında ad, soyad, telefon, mail adresi ve bütçe tutuluyor alt alta. Benim bu dosyadan ekrana ad soyad ve bütçeyi yazdırmam gerekiyor yani telefon ve mail adresini atlamak zorundayım. Satır atlamanın fseek ile yapıldığını biliyorum fakat benim mesela telefon numarasının belli bir uzunluğu var ama mail adresinin belli bir ölçüsü yok kişiden kişiye değişiyor uzunluğu o nedenle fseek kullanamıyorum nasıl o satırları atlayabilirim ?

mufitsozen

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

unknownperson

Alıntı yapılan: mufitsozen - 14 Nisan 2015, 19:13:31
satirlari fgets ile oku

Yani her satırı fgets ile okuyup gerekli satırları bastırayım, o şekilde mi demek istediğiniz ?

unknownperson

Her sorunu çözdüm tek bir sorunum kaldı. Benim dosyadan bir bilgiyi güncellemem için "r+" kullanmam gerekiyor diye biliyorum. Son satırdan bir önceki satırı güncellemem gerekiyor fgets ile o satıra gelip fprintf ile yazdırmaya çalışıyorum yazmıyor  :o İnternette r+ kullanımı ile ilgili de hiçbir örnek yok  :-[

mufitsozen

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

unknownperson

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

struct node{
	char data;
	struct node *nextPtr;
};

typedef struct node Node;
typedef Node *NodePtr;
void insert(NodePtr *sPtr,int value);
void delete(NodePtr *sPtr,int value);
void printlist(NodePtr currentPtr);
main(){
	
	NodePtr *startPtr=NULL;
	int item=1;
	
	while(item!=0){
		
		printf("Please enter number to node(0 to exit):  ");
		scanf("%d",&item);
		if(item==0){
			break;
		}
		insert(&startPtr,item);
		printlist(startPtr);
		
	}
	
	printf("If you delete please enter 1:");
	scanf("%d",&item);
	while(item!=0){
		
		printf("Please enter number to delete node(0 to exit): ");
		scanf("%d",&item);
		if(item==0){
			break;
		}
		delete(&startPtr,item);
		
	}
	
	
	
	
	return 0;
}
void insert(NodePtr *sPtr,int value){
	
	NodePtr newPtr,currentPtr,previousPtr;
	
	newPtr=malloc(sizeof(node));
	if(newPtr!=NULL){
		
		newPtr->data=value;
		newPtr->nextPtr=NULL;
		
		previousPtr=NULL;
		currentPtr=*sPtr;
		
		while(currentPtr!=NULL&& value>(node) (currentPtr->nextPtr)){
			previousPtr=currentPtr;
			currentPtr=currentPtr->nextPtr;	
		}
		if(previousPtr==NULL){
			newPtr->nextPtr=*sPtr;
			*sPtr=newPtr;
		}
		else{
		previousPtr->nextPtr=newPtr;
			newPtr->nextPtr=currentPtr;
			
		}
	}
	else{
		printf("ERROR!!! Memory didn't open.");
	}
	
}

void delete(NodePtr *sPtr,int value){
	
	NodePtr currentPtr,previousPtr,tempPtr;
	
	
	if(value==(*sPtr)->data){
	tempPtr=*sPtr;	
	*sPtr=(*sPtr)->nextPtr;	
		free(tempPtr);
		
	}
	else{
		
		previousPtr=*sPtr;
		currentPtr=previousPtr->nextPtr;
		
		while(currentPtr!=NULL&&currentPtr->data!=value){
			previousPtr=currentPtr;
			currentPtr=currentPtr->nextPtr;
		}
		
		if(currentPtr!=NULL){
		tempPtr=currentPtr;
		previousPtr->nextPtr=currentPtr->nextPtr;
		free(tempPtr);
		
	}
		
	}
	
}

void printlist(NodePtr currentPtr){
	
	
	if(currentPtr!=NULL){
	
	while(currentPtr!=NULL){
		printf("%d --> ",currentPtr->data);
		currentPtr=currentPtr->nextPtr;
	}
}
	else{
		printf("Memory is empty.");
	}
	
	
	
	
}


Böyle bir kod var birçok hata veriyor ben başlıca sorularımı sormak istiyorum:
1.Programın başındaki şu iki satırı neden kullanıyoruz sebebi nedir?
typedef struct node Node;
typedef Node *NodePtr;
2. Sürekli bu hatayı veriyor sebebi bir şeyin bir şeye çevirlemeyeceğini söylüyor ama normalde çevrilmesi gerekiyor kitapta da bu şekilde yapmış ?
cannot convert 'Node*** {aka node***}' to 'Node** {aka node**}' for argument '1' to 'void insert(Node**, int)'
3. Bir de şu alttaki hatanın sebebini anlayamadım ?
expected unqualified-id before 'delete'

mir_as82

#939
typedef struct node Node;
Bunun manasi şu, derleyici struct node adında bir yapimin adini Node olarak belleyeceksin demek. Bir nevi ikinci bir isim veriyorsun.


typedef Node *NodePtr;
burada bir sikinti var. Bu kodu neden yaziyorsun anlamadim.
typedef Node* NodePtr; //olarak değişse ne

unknownperson

#940
Alıntı yapılan: mir_as82 - 25 Nisan 2015, 20:11:01
typedef struct node Node;
Bunun manasi şu, derleyici struct node adında bir yapimin adini Node olarak belleyeceksin demek. Bir nevi ikinci bir isim veriyorsun.


typedef Node *NodePtr;
burada bir sikinti var. Bu kodu neden yaziyorsun anlamadim.
typedef Node* NodePtr; //olarak değişse ne
Deitel kitabından yazıyorum çalışıp anlamak için.
Dediğiniz gibi değiştirdim bir şey değişmedi.


mir_as82

void insert(NodePtr sPtr,int value);//bu şekilde yaz
Delete yi de bu şekilde yaz.

Fonksiyon tanimlamalarini da bu şekilde degistirsene.

mufitsozen

insert((NodePtr *)&startPtr,item);
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

JOKERAS

struct node {
    char data;
    struct node *nextPtr;
};

Derleyici struct node yapısını görünce  "bu adam burda böyle bir şey bildirmiş diyerek" gardını alıyor.
Bu kısım sadece bildirim.

typedef struct node, Burada bildirimini yaptığı yapıyı typedef ile türlüyor ve o türe isim veriyor,artık node yapısında yeni bir türümüz var,türün adı node.


node Node; Buradaki Node ise node türünden bir değişken.

typedef Node *NodePtr; Buradada Node değişkenini türleyip yine o türde bir gösterici yaratmış.

*NodePtr artık bir tür oldu Node türünden adres tutabilen bir tür.

Bildiğim bu.

















yldzelektronik

Selamlar,

Elimde bir bytelık alan var.Bu baytın yüksek 4bitini farklı amaç için düşük 4 bitini farklı amaç için düzenleyebilmek istiyorum.İzahı için şöyle örnekliycem;

1 bytelık bir alanda 7-4 bitlerini delay miktarı 3-0 bitlerini count için tutacak olayım.Ben tek bir struct ile bu bir byte erişip struct elemanlarıyla hem 7-4 arasını hem de 0-3 arasını değiştirebilmek istiyorum.

Aklıma 7-4 aralığı için enum yapıp 0-3 için uint8_t yapmak geldi.Ama böyle olunca 1bytedan büyük olacak.Ama eğer struct ı paketleyebilirsem olabilir.

//Enum için şu tanımı yaptım;
//Ancak bu 7-4 nolu bitlere etki etmeli.
typedef enum{
	W_250us		= 0x00,	//0000
	W_500us		= 0x01,	//0001
	W_750us		= 0x02,	//0010
	W_1000us	= 0x03,	//0011
	W_1250us	= 0x04,	//0100
	W_1500us	= 0x05,	//0101
	W_1750us	= 0x06,	//0110
	W_2000us	= 0x07,	//0111
	W_2250us	= 0x08,	//1000
	W_2500us	= 0x09,	//1001
	W_2750us	= 0x0A,	//1010
	W_3000us	= 0x0B,	//1011
	W_3250us	= 0x0C,	//1100
	W_3500us	= 0x0D,	//1101
	W_3750us	= 0x0E,	//1110
	W_4000us	= 0x0F,	//1111	
}ReTransDelay_t;


struct{
    ReTransDelay_t Delay;
    uint8_t Count;
}AutoRT_Typedef;
//Böyle yaptığımda bir byte dan fazla olacak.
AutoRT_Typedef AutoRT;

AutoRT.Delay = 500us;
AutoRT.Count = 15;

//Dediğimde değerin 0b0001 1111 olmasını istiyorum.



Nasıl yapabilirim?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.