C Programlama diliyle şamatalar

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

mufitsozen

#960
@CLR

Alıntı YapSome architectures (including ARM versions 3 and above, PowerPC, Alpha, SPARC V9, MIPS, PA-RISC, SuperH SH-4 and IA-64) feature a setting which allows for switchable endianness in data segments, code segments or both. This feature can improve performance or simplify the logic of networking devices and software. The word bi-endian, when said of hardware, denotes the capability of the machine to compute or pass data in either endian format.

Many of these architectures can be switched via software to default to a specific endian format (usually done when the computer starts up);

Compiler bunu compile ederken bilemiyecegi icin onermeniz dogru degil problem cikarabilir. Ayni ureticinin ayni ARM MCU bile uygulamada degisik endian olabilir.

Temkinli olmak iyidir.



mesaj birleştirme:: 06 Mayıs 2015, 23:02:50

infocenter.arm.com'dan bir alinti:

Read the AIRCR.ENDIANNESS field to find the implemented endianness, see Application Interrupt and Reset Control Register.

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/I1835.html
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

mir_as82

Mufit hocam senin ornegini inceliyorum simdi.struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
          __u8    ihl:4,
                     version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
          __u8    version:4,
                      ihl:4;
#else
#error  "Please fix <asm/byteorder.h>"
#endif

Az once IP header yapisina baktim. Burada version en dusuk degerlikli bit tarafinda. CLR arkadasin dedigi gibi olmuyor o zaman hakli miyim? Eger little endian sistemde ilk yazilan bit degiskeni en dusuk degerlikli alana geliyorsa. IHL en dusuk degerlikli alana gelir ki bu da IP header yapisina ters olmaz mi?

mufitsozen

Alıntı yapılan: mir_as82 - 06 Mayıs 2015, 23:59:30
Mufit hocam senin ornegini inceliyorum simdi.struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
          __u8    ihl:4,
                     version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
          __u8    version:4,
                      ihl:4;
#else
#error  "Please fix <asm/byteorder.h>"
#endif

Az once IP header yapisina baktim. Burada version en dusuk degerlikli bit tarafinda. CLR arkadasin dedigi gibi olmuyor o zaman hakli miyim? Eger little endian sistemde ilk yazilan bit degiskeni en dusuk degerlikli alana geliyorsa. IHL en dusuk degerlikli alana gelir ki bu da IP header yapisina ters olmaz mi?

ornek benim degil linux kernel deki ip.h header dosyasi.

@CLR soyledikleri hakkinda ben bir yorum yapamam, acik bir forumda ne yazdigini dusunuyordur herhalde, dolayisi ile ona sormanda fayda var.

IP header yapisindan konusmak icin bu baslik dogru degil. Hem bu hafta cevap kotami doldurdum  ;)
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

CLR

@mir_as82

O kodda hiç birşey yok, kernelde  compiler direktifleriyle little/big endian tanımlaması yapılmış. O tanımlamaya göre format big endian tanımlıysa compile edilirken register isimleri yer değişiyor. Bu durumda bit yerleride yer değişmiş olur.


@mufitsozen

Little/big endian bit select olması aslında çok çok önemli değil çünkü kullanıcıların en kötü tahminle %95'i default modda kullanır. Tabii siz ben %5'de önemserim diyorsanız ona eyvallah. Benim tarafımda açıkçası iş yükü oluşturduğu için tercih etmiyorum. Mesela şuana kadar hiç cortex m3'te endian formatı değiştirilebildiği halde big endian program yazan görmedim. Mesela isteseler aşağıdaki gibi big endian formata geçebilirler, hatta siz söyledikten sonra merak ettim hiç stm32'ye big endian yazan kardeş varmı diye, bulamadım. (Register taraması yaptım). Olsada fark etmez, sen öyle yazarsın bende böyle. Terch meselesi.

SCB->AIRCR |= 0x05FA8000;  // big endian


Tabii  sizin yukarıda örnek verdiğiniz  linux gibi hardware seviyesinde değilde daha üst seviyede program yazarken, programı yazan vatandaşa göre değişir. İster big endian yazar, isterse little endian veya mix yapar çünkü user değişkenleri kendi oluşturuyor. 

Pc veya mini pc'ye göre çok küçük kalan 8-16-32 bit embedded uygulamalarda gereksiz görüyorum. Ama sizin tercihiniz böyle olabilir.
Knowledge and Experience are Power

unknownperson

Bu programdaki sorunu bir türlü çözemedim dos ekranı geliyor ama hata veriyor program
//AMAÇ=Palindrome dediğimiz terstende okunuşu aynı olan kelimeleri kontrol eden program 
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<ctype.h>
struct stack{
	char data;
	struct stack *nextPtr;
};

typedef struct stack Stack;
typedef Stack *StackPtr;
void compare(char a[],char b[]);
void push(StackPtr *topPtr,char value);
char pop(StackPtr *topPtr);
main(){
	StackPtr startPtr=NULL;
	char string1[50],string2[50];
	int i;
	printf("Please enter a text: ");
	scanf("%s",string1);
	for(i=0;string1[i]!=NULL;i++){
		push(&startPtr,string1[i]);
	}
	for(i=0;i<=strlen(string1);i++){
		string2[i]=pop(&startPtr);
	}
	compare(string1,string2);
	
	return 0;
}

void push(StackPtr *topPtr,char value){
	StackPtr newPtr;
	newPtr=(Stack*)malloc(sizeof(Stack));
	if(newPtr==NULL){
		printf("Memory is not created.");
	}
	else{
		newPtr->data=value;
		newPtr->nextPtr=*topPtr;
		*topPtr=newPtr;
	}
}

char pop(StackPtr *topPtr){
	StackPtr tempPtr;
	char ch;
	if(*topPtr=NULL){
		return NULL;
	}
	else{
		tempPtr=*topPtr;
		ch=(*topPtr)->data;
		*topPtr=(*topPtr)->nextPtr;
		free(tempPtr);
		return ch;
	}
	
	
}

void compare(char a[],char b[]){
	int i,exit=1;
	for(i=0;i<=strlen(a);i++){
		if(a[i]!=b[i]){
			printf("They are not palindrome.");
			exit=0;
		}
	}
	if(exit!=0){
	printf("They are palindrome.");
}
}

fatih6761

Alıntı yapılan: unknownperson - 09 Mayıs 2015, 22:45:42
Bu programdaki sorunu bir türlü çözemedim dos ekranı geliyor ama hata veriyor program
Amaç sadece palindrom olup olmadığını anlamaksa stack veri yapısına girmeden tek diziyle halledilebilirdi. Gereksiz uzun yola başvurulmuş burada.
#include <stdio.h>

char kelime[100] = {0};
int uzunluk, indis=0;
int orta_indis;
int palindrom = 1;

int main()
{
	printf("Kelimeyi girin: ");
	scanf("%s", kelime);	// kelimeyi al
	
	while(kelime[indis] != 0)
		indis++;
	uzunluk = indis;
	orta_indis = uzunluk/2;
	
	for (indis = 0; indis < orta_indis; indis++)
	{
		if (kelime[indis] != kelime[uzunluk - indis - 1])
			palindrom = 0;
	}
	
	if (palindrom == 1)
		printf("Kelime bir palindrom.");
	else
		printf("Kelime palindrom değil.");
}

unknownperson

Alıntı yapılan: fatih6761 - 09 Mayıs 2015, 22:59:46
Amaç sadece palindrom olup olmadığını anlamaksa stack veri yapısına girmeden tek diziyle halledilebilirdi. Gereksiz uzun yola başvurulmuş burada.
#include <stdio.h>

char kelime[100] = {0};
int uzunluk, indis=0;
int orta_indis;
int palindrom = 1;

int main()
{
	printf("Kelimeyi girin: ");
	scanf("%s", kelime);	// kelimeyi al
	
	while(kelime[indis] != 0)
		indis++;
	uzunluk = indis;
	orta_indis = uzunluk/2;
	
	for (indis = 0; indis < orta_indis; indis++)
	{
		if (kelime[indis] != kelime[uzunluk - indis - 1])
			palindrom = 0;
	}
	
	if (palindrom == 1)
		printf("Kelime bir palindrom.");
	else
		printf("Kelime palindrom değil.");
}

Stack kullanmak zorundayım o yüzden girdim, bir de compare fonksiyonu kullanmadan direk harfleri karşılaştırıp da yapmak daha kısa olabilirdi onu düzenleyebilirim ama stackle yapılcak.

fatih6761

#967
Alıntı yapılan: unknownperson - 09 Mayıs 2015, 23:04:42
Stack kullanmak zorundayım o yüzden girdim, bir de compare fonksiyonu kullanmadan direk harfleri karşılaştırıp da yapmak daha kısa olabilirdi onu düzenleyebilirim ama stackle yapılcak.
O halde şöyle yapalım:
EDIT: aman free'yi unutmayalım memory leak olmasın :)
#include <stdio.h>
#include <stdlib.h>

#define STCK_ELEM	char

struct T_StackElem {
	STCK_ELEM	val;
	struct T_StackElem * next;
	struct T_StackElem * prev;
};

struct T_Stack {
	struct T_StackElem	*head;
	struct T_StackElem	*last;
	int empty;
} myStack;

void stack_init(struct T_Stack *p)
{
	p->head = (struct T_StackElem*)malloc(sizeof(struct T_StackElem));
	p->head->val = 0;
	p->head->next = 0;
	p->head->prev = 0;
	p->last = p->head;
	p->empty = 1;
}

void stack_push(struct T_Stack *p, STCK_ELEM val)
{
	struct T_StackElem *newElem = (struct T_StackElem*)malloc(sizeof(struct T_StackElem));
	newElem->val = val;
	newElem->next = 0;
	newElem->prev = p->last;
	p->last->next = newElem;
	p->last = newElem;
	p->empty = 0;
}

STCK_ELEM stack_pop(struct T_Stack *p)
{
	if (p->last == p->head)
	{
		p->empty = 1;
		return 0;
	}
		
	struct T_StackElem e = *(p->last);
	free(p->last);
	e.next = 0;
	p->last = e.prev;
	return e.val;
}

void stack_free(struct T_Stack *p)
{
	while (!(p->empty))
	{
		stack_pop(p);
	}
}

int main()
{
	char word[50] = {0};
	int i, j, palindrome = 1;
	struct T_Stack * p = &myStack;
	stack_init(p);
	
	scanf("%s", word);
	for (i = 0; word[i] != 0; i++)
		stack_push(p, word[i]);
	
	j = i;
	i = 0;
	
	while (j > i)
	{
		char c = stack_pop(p);
		if (c != word[i])
			palindrome = 0;
		j--;
		i++;
	}
	stack_free(p);
	printf("Palindrome : %d", palindrome);
}

unknownperson

#968
Alıntı yapılan: fatih6761 - 10 Mayıs 2015, 15:58:23
O halde şöyle yapalım:
EDIT: aman free'yi unutmayalım memory leak olmasın :)
#include <stdio.h>
#include <stdlib.h>

#define STCK_ELEM	char

struct T_StackElem {
	STCK_ELEM	val;
	struct T_StackElem * next;
	struct T_StackElem * prev;
};

struct T_Stack {
	struct T_StackElem	*head;
	struct T_StackElem	*last;
	int empty;
} myStack;

void stack_init(struct T_Stack *p)
{
	p->head = (struct T_StackElem*)malloc(sizeof(struct T_StackElem));
	p->head->val = 0;
	p->head->next = 0;
	p->head->prev = 0;
	p->last = p->head;
	p->empty = 1;
}

void stack_push(struct T_Stack *p, STCK_ELEM val)
{
	struct T_StackElem *newElem = (struct T_StackElem*)malloc(sizeof(struct T_StackElem));
	newElem->val = val;
	newElem->next = 0;
	newElem->prev = p->last;
	p->last->next = newElem;
	p->last = newElem;
	p->empty = 0;
}

STCK_ELEM stack_pop(struct T_Stack *p)
{
	if (p->last == p->head)
	{
		p->empty = 1;
		return 0;
	}
		
	struct T_StackElem e = *(p->last);
	free(p->last);
	e.next = 0;
	p->last = e.prev;
	return e.val;
}

void stack_free(struct T_Stack *p)
{
	while (!(p->empty))
	{
		stack_pop(p);
	}
}

int main()
{
	char word[50] = {0};
	int i, j, palindrome = 1;
	struct T_Stack * p = &myStack;
	stack_init(p);
	
	scanf("%s", word);
	for (i = 0; word[i] != 0; i++)
		stack_push(p, word[i]);
	
	j = i;
	i = 0;
	
	while (j > i)
	{
		char c = stack_pop(p);
		if (c != word[i])
			palindrome = 0;
		j--;
		i++;
	}
	stack_free(p);
	printf("Palindrome : %d", palindrome);
}

Çok teşekkür ederim de program saten internette var ben daha çok kendi programımın hatası ne onu çözmeye çalışıyorum

mesaj birleştirme:: 10 Mayıs 2015, 16:50:39

Bu arada sorunu da çözdüm pop içinde if şartında == yerine = yazmışım syntax olarak hata vermeyince de göremedim şimdi adım adım programı test ederken buldum.

fatih6761

Alıntı yapılan: unknownperson - 10 Mayıs 2015, 16:44:08
Çok teşekkür ederim de program saten internette var ben daha çok kendi programımın hatası ne onu çözmeye çalışıyorum

mesaj birleştirme:: 10 Mayıs 2015, 16:50:39

Bu arada sorunu da çözdüm pop içinde if şartında == yerine = yazmışım syntax olarak hata vermeyince de göremedim şimdi adım adım programı test ederken buldum.
Bir de onun yanında sizin program tüm karakterleri birebir eşlemeye çalışıyor onun yerine mesela kelimenin ilk yarısındaki harfleri son yarısındaki harflerle zıt sırada kontrol ederseniz daha az karşılaştırma yaparak sonuca ulaşırsınız. 3-5 kelime için bir şey farketmez ama 1M kelime olursa bariz hız farkı olur. Ayrıca sizin Stack yapısında tüm push edilen elemanlar pop edilmeden stack işi biterse pop edilmeyen elemanlar bellek sızıntısına yol açabilir. Stack_free şeklinde bir fonksiyon ile tüm elemanların free edildiğinden emin olun.
İyi çalışmalar.

unknownperson

Alıntı yapılan: fatih6761 - 10 Mayıs 2015, 17:13:39
Bir de onun yanında sizin program tüm karakterleri birebir eşlemeye çalışıyor onun yerine mesela kelimenin ilk yarısındaki harfleri son yarısındaki harflerle zıt sırada kontrol ederseniz daha az karşılaştırma yaparak sonuca ulaşırsınız. 3-5 kelime için bir şey farketmez ama 1M kelime olursa bariz hız farkı olur. Ayrıca sizin Stack yapısında tüm push edilen elemanlar pop edilmeden stack işi biterse pop edilmeyen elemanlar bellek sızıntısına yol açabilir. Stack_free şeklinde bir fonksiyon ile tüm elemanların free edildiğinden emin olun.
İyi çalışmalar.
Evet bazı dezavantajlar var aslında bellek yönetimi ve program hızı konusunda C programlamada çok bilgim yok, bunları tam olarak nereden öğrenebilirim mesela programı daha az yormayı ve hızlandırmayı , az bellek kullanarak program yazmak gibi.

yldzelektronik

Merhaba,

Cpp header dosyası içinde class tanımlandı, sonra xxx.cpp dosyasında classın ismiyle fonksiyonlar tanımladık.Dosya sonunda anlamsız iki adet "}" mi olmalı?

bisey.h:
class bisey:{

//bir seyler tanımlanmış olsun.

}



bisey.cpp:
uint8_t bisey::funck(){

}
//vs vs
..
..
..
void bisey::funck2(){

}
//buradan sonra iki adet "}" eklenmeli mi?Şöyle ki:

}
}
//Bu iki "}" olmalı mı?


Çünkü bunları eklemediğimde keil projeye eklediğim cpp dosyasını derlerken expected a } hatası veriyor.Hemde iki tane.Projede 3 adet cpp dosyası var.

Cpp1.cpp--->Cpp2.cpp--->Cpp3.cpp şeklinde birbirlerini soldan sağa include ediyorlar.Bu hatayı yalnızca Cpp3.cpp da alıyorum.

Nedir bu işin kerameti?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

bocek

class bisey{

//bir seyler tanımlanmış olsun.

};

class tanımının sonundaki parantezden sonra noktalı virgül koymalısın..
1 ya da 0. işte 'bit'ün mesele..

yldzelektronik

O durum header için halledilmiş durumda.Ancak c++ dosyasında dediğim durum halen geçerli.Sebebini anlamış değilim.

Ayrıca şimdi bir toola ihtiyacım oldu. C ,c++,h dosyalarını belli bir formatta düzenleyen bir program veya web sayfası biliyor musunuz?Programı dağınık yazayım ama o tool ile otomatik belli bir formatta düzenleyeyim.

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