arşiv

‘Programlama’ kategorisi için arşiv

C/C++ geçici dosya adı bulma

Çarşamba, 18 Nis 2012 yorum yok

Merhabalar;

Bazen kısa sureli dosya oluşturmanız gerekebilir ve bu dosyanın da bulunduğu dizinde aynı isimli dosya olmamasını isterseniz.

Bu tip durumlarda  ”tmpnam” fonksiyonunu kullanabilirsiniz. Örnek kod aşağıdaki gibidir.

Selec All Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <iostream>
 
using namespace std;
 
int main()
{
	char filename[L_tmpnam+1];
	char *ptr = tmpnam(filename);
 
	cout << "dosya adı: " << ptr << endl;
 
	return 0;
}

Selamlar

Toplam Görüntülenme: 9

Linux altında projeden tüm “.svn” dizinlerini kaldırmak

Cuma, 16 Mar 2012 yorum yok

Merhabalar;

Sürüm kontrollerinden biri olan subversion ile çalıştığınızda, projedeki tüm dizinler altına sürüm kontrolü yapmak için .svn dizini atar. Siz projeyi kopyalarken veya yedeğini alırken farkında olmadan .svn dizinleriyle beraber alırsınız. Bu bazen projenizin boyutunu gereksiz yere artırabilir.

Aşağıdaki komut ile bu dizinlerden kurtulabilirsiniz.

Selec All Code:
FOLDER=/home/kullaniciAdi/Proje
 
for var in `find $FOLDER -name ".svn"`
do
	rm -rf $var
done

Yalnız bunu çalıştırmadan projeyi başka alana kopyalayın ve oradaki .svn dizinlerini kaldırın. Yoksa projeniz artık sürüm kontrolünde olmaz.

Selamlar

Toplam Görüntülenme: 10

Karşı taraf bağlantıyı kapattığında “send” ve “write” fonksiyonundan alınan hata hakkında

Perşembe, 01 Mar 2012 yorum yok

Merhabalar;

Tcp soket ile ağ bağlantılarında bildiğiniz üzere “send” veya “write” fonksiyonlarını kullanıyoruz. “send” ve “write” fonksiyonlarının prototipi aşağıdaki gibidir.

Selec All Code:
#include <unistd.h>
 
ssize_t write(int fildes, const void *buf, size_t nbyte);
 
----------------------------------------------------------------------
 
#include <sys/socket.h>
 
ssize_t send(int socket, const void *buffer, size_t length, int flags);

Bu iki fonksiyondan herhangi biri ile karşı tarafa mesaj göndermeye çalışıldığında, eğer karşı taraf bağlantıyı kapatmış ise programınız beklenmedik bir şekilde sonlanır ve “try, catch” blokları ile de bu sonlanmayı yakalayamazsınız.

Sebebi ise “write” ve “send” fonksiyonlarının karşı taraf bağlantıyı kesmiş ise “SIGPIPE” sinyali göndermesidir. Bir programda sinyalin varsayılan davranışı programı sonlandırmak olduğu için, programınız sonlanır. Karşı taraftaki bağlantının kapanmasını anlamak için bu sinyali yakalayabilir ona göre işlem yapabilirsiniz. Sinyal yakalama bu yazının konusu olmadığı için anlatmayacağım.

Hata vermemesi için bir diğer yöntem ise send fonksiyonunun “flags” adlı parametresini aşağıdaki gibi ayarlamaktır.

Selec All Code:
send( sockFd, mesaj, mesajuzunlugu, MSG_NOSIGNAL );

Bu şekilde fonksiyon çağrıldığında “send” fonksiyonu sinyal göndermez, dönüş değerini -1 olarak döndürür ve “errno” değerini ayarlar. “errno” değerine bakarak karşı tarafın bağlantıyı kapattığını anlayabilirsiniz.

Bir de bazı sistemlerde soket seçeneğini değiştirerek, karşı taraf bağlantıyı kapattığında sinyal göndermemesini sağlayabilirsiniz. Fakat böyle bir kullanış taşınabilir olmamaktadır. Ben ubuntu’da denedim fakat böyle bir seçenek değiştirmeyi kullanamadım. Yani ubuntuda bu özellik yok. Kullanım şekli aşağıdadır.

Selec All Code:
int set = 1;
setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));

Selamlar

Toplam Görüntülenme: 4

C++ vector içinde ki ilk değeri bulma

Perşembe, 15 Ara 2011 yorum yok

algoritm kütüphanesi içinde ki find fonksiyonunu kullanarak bir vector’de gezinmenize gerek kalmadan, bir değerin bulunduğu yeri bulabilirsiniz.

Selec All Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std;
 
int main()
{
   int a[ 10 ] = { 10, 2, 17, 5, 16, 8, 13, 11, 20, 7 };
   vector< int > v( a, a + 10 ); // kopyalama
   ostream_iterator< int > output( cout, " " );
 
   cout << "Vector v contains: ";
   copy( v.begin(), v.end(), output ); // standart cikista goster
 
   vector< int >::iterator location;
   location = find( v.begin(), v.end(), 16 );
 
   if ( location != v.end() ) // 16 bulundu
      cout << "\n\nFound 16 at location " << ( location - v.begin() );
   else // 16 bulunamadi
      cout << "\n\n16 not found";
 
   cout << endl;
   return 0;
}

Toplam Görüntülenme: 59

Qt – Pencerenin ekranın merkezinde açılması

Cuma, 25 Kas 2011 yorum yok

Aşağıda ki kodu kullanarak qt’de pencerenizin ekranın merkezinde açılmasını sağlayabilirsiniz. Başka yöntemleri mevcuttur. Kısa olsun diye tek satırlık olanını yazıyorum.

Selec All Code:
1
2
#include <QDesktopWidget>
setGeometry( QStyle::alignedRect( Qt::LeftToRight, Qt::AlignCenter, size(), QDesktopWidget().availableGeometry() ) );

 

Toplam Görüntülenme: 12

QTextEdit’ten içinde ki yazıyı çekmek

Pazartesi, 21 Kas 2011 yorum yok

QTextEdit’ten, yazılan yazıyı çekmek için QLineEdit gibi “text” fonksiyonu kullanılmamaktadır. Bunun yerine aşağıda ki kodda ki gibi “toPlainText” fonksiyonu ile yazılan yazıyı çekebilirsiniz.

Selec All Code:
1
Qstring str = textEdit->toplainText();

 

Toplam Görüntülenme: 7

“QSqlDatabasePrivate::removeDatabase: connection ‘qt_sql_default_connection’ is still in use, all queries will cease to work” uyarısını gidermek

Cuma, 18 Kas 2011 yorum yok

Merhabalar;

Qt’de veritabanıyla uğraşırken böyle bir uyarıyla karşılaşabilirsiniz. Bu uyarı eklediğiniz veritabanını kaldırmadan uygulamayı sonlandırmış olduğunuz için alınır. Uyarı, kurduğunuz bağlantının hala kullanımda olduğunu ve sonlandırılacağını söylüyor. Bu uyarıyı engellemek için uygulamanızdan çıkmadan aşağıda ki gibi veritabanını kaldırınız.

Selec All Code:
1
db.removeDatabase("veritabaniadi");

veritabaniadi yerine eklerken kullandığınız adı ekleyiniz. Bu örnek ise aşağıdadır.

Selec All Code:
1
db.setDatabaseName("veritabani.sqlite");

yani bu örnekte veritabaniadi yerine veritabani.sqlite yazmanız gerekmekte.

Selamlar

Related Posts Plugin for WordPress, Blogger...

Toplam Görüntülenme: 18