C Programlama diliyle şamatalar

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

CLR

Alıntı yapılan: unknownperson - 15 Mart 2015, 00:19:34
Dev C kullanıyorum program çıktımda bir tablo olacak bu nedenle dos ekranı büyük olmalı en az 800x600 , bunu nasıl yapabilirim ?


Çıktı dos ekranındayken, pencere üzerinde sağ click yap ve özelliklere gir

yerleşim tab'ından istediğin pencere büyüklüğüne getirebilirsin, hatta yazı renklerini vs değiştirebilirsin
Knowledge and Experience are Power

unknownperson

#901
Alıntı yapılan: CLR - 15 Mart 2015, 00:51:12

Çıktı dos ekranındayken, pencere üzerinde sağ click yap ve özelliklere gir

yerleşim tab'ından istediğin pencere büyüklüğüne getirebilirsin, hatta yazı renklerini vs değiştirebilirsin
Çok teşekkür ederim :)

mesaj birleştirme:: 15 Mart 2015, 01:15:49

Bir sıkıntım daha var :
//Programın amacı 1 den 1000 e rastgele sayı üretip bunu diziye koymak sonra da dizideki elemanları sırasıyla bir sayıyı bastırıp bir de yanında sayıların hane sayılarının toplamını bastırmak fakat hane sayısını alırken sorun yaşıyorum her yolu denedim bulamadım. (%n kullanma zorunluluğum var)
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
main(){
int array[10],total=0,i=0,y;

srand ( time ( NULL ) );


for(i=0;i<10;i++){

array[i] = rand( ) % 1000 +1;
printf("%d%n",array[i],&y);

total=total+y;
printf("%10d\n",total);

}
return 0;
}


http://www.geeksforgeeks.org/g-fact-31/ 
Bu sitede de aynı problemle karşılaşılmış fakat çözüm bulunamamış  :(

CLR

O parametreyi ben hiç kullanmadım ama kısaca baktığımda devcpp'de sanırım printf'in o özelliği pass geçilmiş(belkide vardır) ama microsoft VC++ ile test edersen çalışıyormuş

default olarak o özellik kapalıymış, açmak için aşağıdaki gibi kullanman gerekiyor

int A=100;

A=_set_printf_count_output(1); // %n printf özelliğini açıyor, kapatmak için 0

printf("A : %n \r\n", &A);

Knowledge and Experience are Power

unknownperson

Alıntı yapılan: CLR - 15 Mart 2015, 02:16:07
O parametreyi ben hiç kullanmadım ama kısaca baktığımda devcpp'de sanırım printf'in o özelliği pass geçilmiş(belkide vardır) ama microsoft VC++ ile test edersen çalışıyormuş

default olarak o özellik kapalıymış, açmak için aşağıdaki gibi kullanman gerekiyor

int A=100;

A=_set_printf_count_output(1); // %n printf özelliğini açıyor, kapatmak için 0

printf("A : %n \r\n", &A);


Şu hatayı aldım:

C:\Users\Berkay\AppData\Local\Temp\ccGbZGbt.o   İsimsiz1.cpp:(.text+0x1c): undefined reference to `__imp__set_printf_count_output'

CLR

#904
https://msdn.microsoft.com/en-us/library/ms175782.aspx


// crt_set_printf_count_output.c
#include <stdio.h>

int main()
{
   int e;
   int i;
   e = _set_printf_count_output( 1 );
   printf( "%%n support was %sabled.\n",
        e ? "en" : "dis" );
   printf( "%%n support is now %sabled.\n",
        _get_printf_count_output() ? "en" : "dis" );
   printf( "12345%n6789\n", &i ); // %n format should set i to 5
   printf( "i = %d\n", i );
}




aşağıdaki online vc++ compilerda test ettim çalışıyor

http://webcompiler.cloudapp.net/
Knowledge and Experience are Power

unknownperson

Aşağıdaki kodda bulunan iki struct yapısında ilkinde 6 bayt , ikincisinde 12 bayt bellek kullanımı olması gerekirken sizeof komutuyla ekrana bastırdığımda ilkinde 8 ikincisinde 16 bayt gösteriyor. Bunun nedeni nedir struct başına 2 byte fazla neden gösterir ?

#include <stdlib.h>
#include <stdio.h>
struct memory1{
	int lenght;
 char name_type[2];

};

struct memory2{
char id[2];
 struct memory1 number;
 int counter;
};


main(){
int size;
size=sizeof(memory1);
printf("Size of struct is %d\n",size);	
size=sizeof(memory2);
printf("Size of struct is %d",size);
	
	return 0;
}

hasankara

platformun 32 bitlik ise, char tanımlamalarını size olarak yukarı yuvarlar. şöyle ki, 4 adet char tanımlarsın 4 byte kaplar, 3 adet char tanımlayıp üstüne 1 adet int tanımlarsan arada kalan 1 char lık kısmı göz ardı eder ve 8 byte yer kaplamış olur. bunu, kitap bilgisinden değil tecrübeden söylüyorum, bu sebeple çürütülmeye açık bir bilgi olduğunu belirteyim.

unknownperson

Alıntı yapılan: hasankara - 19 Mart 2015, 21:47:04
platformun 32 bitlik ise, char tanımlamalarını size olarak yukarı yuvarlar. şöyle ki, 4 adet char tanımlarsın 4 byte kaplar, 3 adet char tanımlayıp üstüne 1 adet int tanımlarsan arada kalan 1 char lık kısmı göz ardı eder ve 8 byte yer kaplamış olur. bunu, kitap bilgisinden değil tecrübeden söylüyorum, bu sebeple çürütülmeye açık bir bilgi olduğunu belirteyim.
platformdan kasıt ne demek istediğinizi anlayamadım ama programda şunları denedim dediğiniz sanırım doğru:

memory1 in içinde 1 boyutu olan dizi ekledim gene 8 gösterdi yani 7 göstermedi demekki 8'e tamamladı,
sonra 3 boyutu olan dizi ekledim 9 yerine 12 yazdı demekki 12'ye tamamladı,

3 boyutlu diziyi ekleyince memory2 18 yerine 20 gösterdi,
sonra alttaki memory2 deki integer sildim 14 yerine 16 gösterdi

Sonuç: Sanırım 4'erli şekilde 8,12,16,20 şekilden yuvarlanıyor.

Bu arada teşekkür ederim ben de internet ve kitapta böyle bir açıklama göremedim yardımınız için teşekkür ederim.

CLR

packed struct diye araştırırsan daha iyi bilgiler elde edebilirsin, forumda araştırırsan var,  ben bir kaç arkadaş anlatmıştık,  bu konu C'nin püf noktalarındandır
Knowledge and Experience are Power

unknownperson

Araştırırken struct padding diye bir şey bulmuştum ama o pointerlarla ilgiliymiş, burada: https://medium.com/@cngzhnp/c-programlama-dilinde-struct-yap%C4%B1s%C4%B1-1bfea688e112

Packed struct öğrenmem iyi oldu daha net bilgilere ulaştım teşekkür ederim  :D

hasankara

platformdan kastım kodları yürüttüğün ortam. bilgisayar olabilir ya da mikrodenetleyici olabilir yada ... . platformun kaç bitlik olduğu konusunda ise, platformun üzerinde ki işlemcinin data genişliğini kast ettim. C nin eli çok yere uzanıyor. 8 bitlik bir mikrodenetleyici için kullanılan bir c derleyicisi bu şekilde yukarı yuvarlamaya gerek duymaz zaten ram in her datası 8 bitlik hücrelerden oluşmuştur.

X-Fi

Konu derleyici ve işlemcinin hafıza erişimi ile alakalı C de bu durumu düzelten bir komut yok bildiğim kadarıyla derleyici detaylarına bakmak lazım.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

unknownperson

Alıntı yapılan: hasankara - 19 Mart 2015, 22:19:03
platformdan kastım kodları yürüttüğün ortam. bilgisayar olabilir ya da mikrodenetleyici olabilir yada ... . platformun kaç bitlik olduğu konusunda ise, platformun üzerinde ki işlemcinin data genişliğini kast ettim. C nin eli çok yere uzanıyor. 8 bitlik bir mikrodenetleyici için kullanılan bir c derleyicisi bu şekilde yukarı yuvarlamaya gerek duymaz zaten ram in her datası 8 bitlik hücrelerden oluşmuştur.
Tamam doğru anlamışım acaba dedim platform derken Dev C ya da Visual anlamında mı yoksa pc anlamında mı sorduğunuz diye ikileme düşmüştüm.

CLR

C'nin püf noktası derken sanırım yanlış anlaşılmış, compiler'ın C struct yapıları için direktifleri var onları kullanmak gerekiyor,

mesela keil için __packed, #pragma pack(push,x) , pack(pop)  gibi
Knowledge and Experience are Power

unknownperson

islemlerde su sekilde donusum yapiyoruz ya : a=(float) b*1

Peki bunu floattan integera gecirirken yapabilir miyim su sekilde

b=(integer) a*1

?