arkadaşlar 3x3 matriste 1i boşluklu 8 sayı atamayı sormuştum biraz önce. şimdi bi sey daha sormak istiyorum, o boşluğa ben değer girecegim eger saginda, solunda, yukarisinda, asagisinda varsa onla yer degistirecek. soruyu yanlis anlayip satir sutun sirasina gore ayarlamisim ben yani 4e basinca 4.terim bosluktaysa o yer degistirsin yapmisim yani olmasi gereken su : 1 5 6 4 8 2 7 3 eger burda 6ya basarsam şöyle olacak 1 5 4 8 6 2 7 3 boyle boyle ilerlesin istiyorum. nasil ilerleyebilirim ? boşluğu buldurup sonra eger aradaki mesafe >1 degilse yer degistirsin demek istiyorum aslinda mantigi da az cok anliyor ama koda dokemiyorum karistiriyorum düzeltme : arkadaşlar epey yazdım ilerledim bi şekilde sağdan, soldan ve üstten alıyorum değeri fakat aşağıdaki rakamı almaya tıklayınca farklı bi şeyler yapıyor. neresi hatalı anlamadım yardımcı olur musunuz ? kod : #include <iostream> not : evet biliyorum epey uzattım ama anca böyle yapabildim ![]() |
C de yazılmayacak hale gelinceye kadar C de devam edicem ![]() #include <stdio.h> |
Derleyici hata veriyor. Lütfen yardım edermisiniz?
|
for(i=1; i<=N; i++) , dizinin not[5] diye bir adresi yok en son not[4] var . Bunu bir düzelt tekrar bakalım. |
dediğini yaptım i<N şeklinde yaptım ama yine hata verdi. ben resim yükledim belki resimden daha iyi görünebilir hata. < Resime gitmek için tıklayın > |
Resim açılmıyor. |
Yada bu link dede var resim http://a1303.hizliresim.com/17/1/kmmvr.gif |
Kelime secimi yanlis. not yerine baska bir degisken adi kullanmak ile basla. notArr gibi. Sonra diger hatalara bir daha bakarsin. Hata not in reserve olmasi. Edit: Baska hata yokmus... #define N 5 |
Tamam şimdi oldu. İnsanın ingilizcesinin olmaması çok kötü birşey :) Çok teşekkürler. |
Aşağıda verdiğim kodlar normalde bir programın parçası. Ancak bu bölüm programı çok yavaşlatınca, ayırıp tek program yapıp sorunu anlamaya çalışıyorum. Ancak programı bu kadar yavaşlatan şeyin ne olduğunu bir türlü bulamadım. Program 200000 den daha uzun bir karakter dizisinde c ve g karakterlerini arıyor bulduğunda bunların yerini yerler değişkenine atıyor, c ve g karakterlerini de büyük yapıyor. Aslında son derece basit bir kod ama bana kafayı yedirecek. Eğer dizi değişkeni ile ilgili farklı bir işlem yaparsam (yazdırmak gibi) çalışma süresi değişiyor. Bazen 1 sn daha az sürede tamamlarken basit bir değişiklik ile 4-5 sn civarına çıkıyor. Bu konuda bir fikri olan varsa duymak isterim.
|
Normal o kadar çıkması. Ama süreyi kısaltacak birkaç ipucu verebilirim. Dizi boyutu 1-2 mb ı geçmediği sürece yerel olarak ayırmak. Bu, malloc ile alınmış olandan biraz daha hızlı çalışır. Yani; dizi=(char *)malloc(300000); yerine char dizi[300000]; Dosyayı açtıktan sonra büyükçe bir tampon bellek vermek. FILE *gr = fopen(...); char buffer[32 * 1024]; setvbuf(gr, buffer, _IOFBF, 32 * 1024); Dosyayı byte byte okumak yerine tek seferde alıp diziye atmak. fread((void *) dizi, 1, 300000, gr); c ve g karakterlerini ayrı ayrı kontrol etmek yerine tek sefere indirmek. Yani if(*(dizi+i)=='c' && *(dizi+i+1)=='g') yerine const short cg = 25447; // Bu sayının ilk byte ı 'c', ikinci byte ı 'g'. if(*((short *) dizi + i) == cg) ... Aklıma gelenler bunlar. Şimdi bunlar içinde süre alacak olan sadece cg kontrolü. Ortalama 150000 karşılaştırma yapıyor. Eğer diziyi dosya yapısını bozmadan sıralayacak bir yöntem bulunursa ikili arama ile bu son tıkanıklıkta giderilebilir. |
Cevap için teşekkürler. Dizi gb'lara yaklaşabiliyor bazen, o yüzden mümkün değil. Normalde dosyadan satır satır okunuyor (ve öyle olması gerekiyor), onda sıkıntı yok. Asıl sorun kodların kararsız olması. Aynı işlem bazen 1 sn'de bazen 5 sn'de oluyor. Örnek olarak fprintf(ds,"\n\n%s\n\n",dizi); koduyla diziyi yazdırırsam (bu yazdırma kısmı hariç) 4-5 sn olurken o kodu iptal ettiğimde bazen 1 sn'de tamamlıyor. Yada aynı boyutta bellek ayrılmış 2. bir diziye *(dizi2+i)='C';*(dizi2+i+1)='G' şeklinde yaparsam veya oradaki *(dizi+i)='C';*(dizi+i+1)='G' kodunu tamamen iptal edersem yine 1 sn de tamamlıyor. Mantıklı bir açıklama getiremedim yani. Aynı işlem için 4-5 kat fark olması ? (Tabi bu sürelere dosyadan okuma, dosyaya yazma süreleri dahil değil, onlar ciddi bir zaman almıyorlar.) Sanki başka birşeyler programın çalışmasını etkiliyor gibime geliyor ya çözemedim işte! |
Kodu küçük fonksiyonlara ayırıp -pg opsiyonu ile derlersen gprof aracı hangi fonksiyonun ne kadar oyalandığını gösterebilir. Tabi bunlar derleyici gcc ise geçerli. Böylece programın tamamında iz sürmek yerine sadece şüpheli fonksiyonları takibe alabilirsin. http://www.network-theory.co.uk/docs/gccintro/gccintro_80.html Birde programın çalışma zamanını ölçmek için arka arkaya birkaç kez çalıştır ve ortalamasını al. Bir süre geçtikten sonra ilk çalıştırmayı buna dahil etme o yanıltıcı olur. Mesela işletim sistemi harddisk i uykuya aldıysa ilk erişim oldukça uzun sürer. Veya işlemciyi güç koruma moduna geçirdiyse normal frekansına geçene kadar yavaş çalışır. |
Olmazsa bir de gcc ile denerim, normalde Visual Studio kullanıyorum. Zaten kodlarda zaman ölçümü yapıyorum ve asıl zamanı diziyi tarattığım o iki satır alıyor. Durmadan deneme yaptığım için de uyku modu söz konusu değil, saatlerce farklı şeyler deneyince uyumasına fırsat kalmıyor. Aklımda farklı derleyiciyle deneyip sonucu görmek vardı, en kolay gcc ile denerim herhalde. |
#include <stdio.h> #include <stdlib.h> #include <string.h> void *ADDint(void *dataptr1,void *dataptr2){ void *sum=(int*)malloc(sizeof(int)); *sum=*(int*)dataptr1+*(int*)dataptr2; return sum; } void *ADDstr(void *dataptr1,void *dataptr2){ char *str=(char*)malloc(sizeof(char)*33); int i=0; int j=0; while (((char*)dataptr1)!='\0'){ str=((char*)dataptr1); i++; } while(((char*)dataptr2)[j]!='\0'){ str[j]=((char*)dataptr2)[j]; i++; j++; } str[i+1]='\0'; return (int*)i; } void* sumOp(void* dataptr1,void* dataptr2,void * (*ptrToAddFun)(void*, void*)){ return (*ptrToAddFun)(dataptr1, dataptr2); } int main(void) { char str1[99] = "kurtarin"; char str2[99] = "beniii"; char *string = NULL; int sum = 0; int i=33; int y=35; sum=*(int *)sumOp((void*)i, (void*)y,ADDint); string=(char*)sumOp(str1, str2,ADDstr); printf("Sum: %d\nString: %s\n",sum, string); return 0; } hatayı bulamadım yardımm lutfen ustalar.. |
Arkadaşlar lisede turbopascal, c, c++, c# görmüştüm şuan visual studio 2008 i yüklüyorum size bir sorum olacak bu program ile tekrar eden bir makro programı yapabilirmiyim örneğin 10 saniyede 1 klavyeden 1 tuşuna basacak vb. |
Notepad ile .cs dosyasını oluşturuyorum, sonra cmd ile açıyorum fakat .exe dosyasını oluşturmuyor, vista kullanıyorum, daha en baştan böyle saçma sapan birşey yüzünden soğumuş durumdayım. |
compiler kullanmanız lazım. önerin code:blocks gibi bir ide kullanmanız |
öncelikle teşekkürler, evet yeni yaklaşık bir iki aya yakın oluyor siteyi düzenleyeli fırsat buldukça yeni kodalar ve açıklamalar ekleyecegim...