5 Mart 2017 Pazar

-CC++ pointer fonksiyon nesneler-


Merhabalar,

CCpp'da pointer'lar birçok şekilde kullanılabilir.
Temel düzeyde pointer'lar,değişken tanımlama,değer atama ve pointer değişkenden
bir başka pointer'e atamalarda karşılaşırız-kullanırız.
Bu örnekte pointer'ların fonksiyonlar ile birlikte nasıl kullanıldığını göreceğiz.

Temel düzeyde fonksiyonların pointer ile kullanıma dair önceki makalemi okuyabilirsiniz.
 link

Bu örnekte üç(3) adet fonksiyon mevcuttur.
Bu fonksiyonlar,oluşturulan sanal bir pointer fonksiyon nesnesine tek tek atanabileceği gibi,
toplu olarak da atanabilir.  Böyle bir atama işleminde,sanal olarak oluşturulan fonksiyon nesnesi
artık atanan fonksiyonun yerine kullanılabilir.
Dolayısıyla fonksiyonu çağırma,parametre gönderme ve geri döndürdüğü değeri bu sanal fonksiyon pointeri
üzerinden elde edebiliriz.

Aşağıda verilen örneklerde ilk olarak tek fonksiyon kullanılıyor.

NOT: Bu makalede temel "pointer" kavramını bildiğiniz varsayılmıştır.

#include <stdio.h>
#include <string.h>

void func1(int *a)
{
printf("func1: %d\n",*a);
}
void func2(int *a)
{
printf("func2: %d\n",*a);
}
void func3(int *a)
{
printf("func3: %d\n",*a);
}

int main()
{
 // tek fonksiyon kullanımı:
   /*
   * Pointer olarak oluşturulan sanal fonksiyon aşağıda verilmiştir.
   * Atanacak fonksiyon "func1" ismindedir. Fonksiyon int türünden bir parametre almaktadır
   * ve geri değer döndürmüyor. Dolayısıyla sanal fonksiyon da buna uygun tasarlanmıştır.
   * "void": elde edilecek fonksiyonun geri dönüş değeri.
   * "(*function)": sanal fonksiyon nesnesidir.
   * "(int *)" : func1 fonksiyonun parametre türüdür. Parametre sayısı kadar oluşturulmalıdır.
   **/
   void (*function)(int *) = func1; //func1 fonksiyonu atanıyor.
   int a = 55;
   //func1 fonksiyonuna sanal nesne üzerinden değer gönderiliyor.
  (*function)(&a); // func(&a) ile aynı görevi görmektedir.

  //Fonksiyon atamasını aşağıdaki gibi yapabiliriz.
  void (*function)(int *) = &func1; //"&" karakterine dikkat!!

  //şayet funk1 fonksiyonu iki parametreli olsaydı,bu durumda pointer tanımlaması şöyle olacaktı:
  void (*function)(int *,int *) = func1;
}


//ÖRNEK 2:
Bu örnekte elimizde bulunan tüm(3 adet) fonksiyonları tek bir pointer nesnesi üzerinden kontrol edeceğiz.
Bu nedenle bir array(dizi) oluşturmamız gerekir.
Aşağıda tüm fonksiyonlar tek pointer nesnesine atanmıştır.

int main()
{
   //pointer nesnesi array olarak tanımlanıyor.
   void (*functions[3])(int *) = {func1,func2,func3}; //fonksiyonlar atanıyor.
 
     int a = 10;
     int b = 20;
     int c = 30;
     //parametre gönderiliyor:
     (*functions[0])(&a);
     (*functions[1])(&b);
     (*functions[2])(&c);
    return 0;
}


//ÖRNEK 3:
Son örneğimizde ise fonksiyonlarımız geri dönüş değerine sahiptir.
Bu durumda,oluşturacağımız sanal fonksiyon pointeri bu yapıya uygun tasarlanmalıdır.
Yani fonksiyon geri dönüş tipi-türüne uygun olmalıdır.

int *func1(int *a)
{
printf("func1: %d\n",*a);
*a = *a + 5;
return a;
}
int *func2(int *a)
{
printf("func2: %d\n",*a);
*a = *a + 5;
return a;
}
int *func3(int *a)
{
printf("func3: %d\n",*a);
*a = *a + 5;
return a;
}

int main()
{
     int a = 10;
     int b = 20;
     int c = 30;
     //func1,func2,func3 fonksiyon dönüş tipleri "int" olduğu için:
    int* (*functions[3])(int *) = {func1,func2,func3};
   
    printf("%d\n",*(*functions[0])(&a)); // pointer karakterine(*) dikkat.
    printf("%d\n",*(*functions[1])(&b));
    printf("%d\n",*(*functions[2])(&c));
     
return 0;
}


İyi çalışmalar.

1 Mart 2017 Çarşamba

Bilişim Sohbetleri 3 Mart 2017 Cuma

3 Mart 2017 Cuma Türkiye saati ile 21:30'da Bilişim Sohbetleri canlı yayınında konuğumuz Turkey Java User Group Başkan Yardımcısı, Android-AOSP/Linux Kernel Developer(R&D Engineer), Java/Android Teknik Kitap Yazarı Sayın Kerim Fırat hocamız ile Yazılım Sektörünün İhtiyaçları üzerine konuşacağız. Sakın kaçırmayın. :)
Canlı yayın adresimiz: https://youtu.be/wCLH2HiuHIk
Hazırlayıp sunanlar:Mimar Aslan & Çağdaş Öğüt


4 Şubat 2017 Cumartesi

Go Programlama Dili

Merhabalar,
Go programlama diline yönelik kaynaklara cihan özhan'a ait blogdan ulaşabilirsiniz.

 

15 Aralık 2016 Perşembe

Android Studio ile Programlama kitabı + 54 saat video eğitimi

"Android Studio ile Programlama + 54 saat Android video eğitimi" kitabım Abakus yayınlarıyla Ocak ayı itibariyle yayında olacaktır.
www.abakuskitap.com

17 Eylül 2016 Cumartesi

-Java Reflection Kullanımı 2 -

Merhabalar,
Java'da Class bünyesinde bulunan yapılandırıcıları,alanları ve fonksiyonların kullanımı ile ilgili
daha önce yazdığım "Java Reflection Kullanımı" makalesi burada yer alıyor.
Bu konuya yönelik farklı sorular aldığım için "Java Reflection Kullanımı 2 " 'yi yazma gereği duydum.

Bu makalede geliştireceğimiz örnek uygulamada bir adet "Person.java"  ve "Main.java" Classı bulunuyor.
Person class içeriğinde  çeşitli set,get ve print fonksiyonları yer almaktadır.
Bu fonkisyonlar çeşitli veri türlerden parametrelere sahip.  Bu fonksiyonlara Main.java tarafından parametre gönderilecektir. Ancak fonksiyonların aldığı parametre tür ve sayıları önemlidir.
Dolayısıyla kullanım aşamasında parametre türü ve parametre sayıları önem arz etmektedir.
Ayrıca parametre gönderilecek-işletilecek fonksiyonların isimleri bilinmelidir.
Tüm bu detaylara aşağıda yer verilmiştir.

Person.java Class içeriği:

public class Person {

private String name;
private String s_name;
private int age;

public Person(){
//Constructor
System.out.println("Constructor");
}

public void setName(String _n){
this.name = _n;
}
public void setSurname(String _sn){
this.s_name = _sn;
}
public void setAge(int _a){
this.age = _a;
}

public String getName(){
return this.name;
}

public void print(){
System.out.println("Name:" + name + "\nSurname:" + s_name + "\nAge:" + age);
}

public void setAandB(String _s,int _i){
//
System.out.println("" +_s +"," + _i);
}
}

Main.java Class içeriği:
public class Main {


public static void main(String[] args){
try{
//Class ismi:
/*
* farklı paket altında bulunan class'lar paket ismi ile belirtilmelidir.
* Örn 1: "java.util.Date"
* Örn 2: "java.io.InputStreamReader"
*/
   String className = "Person";
   //String olarak alınan Class ismi "Class"'a convert ediliyor:
       Class<?> cClass = Class.forName(className);
     
       ///Class bünyesinde kullanılabilecek fonskiyonlar:
      //Class'a ait yapılandırıcıları elde etmek için:
        //public Constructor<?>[] getConstructors()

     //Class'a ait paketi elde etmek için:
        //public Package getPackage()

     //Declare edilmiş Class'ları elde etmek için:
       //public Class<?>[] getDeclaredClasses()
     
       //Constructor çağrılıyor:
       Object param = cClass.newInstance();  
         
       String methodName = "";

       //setName isminde tek String parametreye sahip fonksiyona parametre gönderiliyor:
       methodName = "setName";
       //gönderilecek parametre türleri belirleniyor.
       Method setNameMethod = param.getClass().getMethod(methodName, String.class);
       //fonksiyona parametre gönderiliyor-işletiliyor:
       setNameMethod.invoke(param, "Kerim");
     
       //
      //setSurname isminde tek String parametreye sahip fonksiyona parametre gönderiliyor:
       methodName = "setSurname";
       Method setSurNameMethod = param.getClass().getMethod(methodName, String.class);
       setSurNameMethod.invoke(param, "FIRAT");
       //
     //setAge isminde tek int parametreye sahip fonksiyona parametre gönderiliyor:
       methodName = "setAge";
       Method setAgeNameMethod = param.getClass().getMethod(methodName, int.class);
       setAgeNameMethod.invoke(param, 30);
   
       //
       //print isminde herhangi bir parametreye sahip olmayan fonksiyon çağrılıyor:
       methodName = "print";
       Method printMethod = param.getClass().getMethod(methodName);
       printMethod.invoke(param); 
   
       //
       //setAandB isminde iki ayrı türden parametreye sahip fonksiyona parametre gönderiliyor:
       methodName = "setAandB";
       /*
        * gönderilecek parametre türleri belirleniyor.
        * NOT: parametre türleri parametre sırasına göre belirlenmelidir.
        */
       Class<?>[] paramTypes = {String.class, int.class};
       //fonksiyon ismi ve parametre tür bilgisi tanımlanıyor:
       Method setAandBMethod = param.getClass().getMethod(methodName, paramTypes);
       //fonksiyona parametre gönderiliyor-işletiliyor:
       setAandBMethod.invoke(param,"A",44);
     
       //Class bünyesinde bulunan tüm fonksiyonları elde listelemek:
       Method[] methods = Person.class.getMethods();
       for(Method method : methods){
           System.out.println("method = " + method.getName()); 
           System.out.println("parametre sayısı = " +method.getParameterCount());
       }
     
       //Method class bünyesinde kullanılabilecek fonksiyonlar:
       //fonksiyona ait parametreleri elde etmek için:
          //public Parameter[] getParameters()
     
       //fonksiyona ait Exception türünü elde etmek için:
          //public Class<?>[] getExceptionTypes()
       
       //fonksiyona ait parametre türlerini elde etmek için:
          // public Class<?>[] getParameterTypes()
       
       //fonksiyona ait dönüş türünü elde etmek için:
          //public Class<?> getReturnType()
     
}catch(Exception e){
e.printStackTrace();
}
}
Çıktı:
   Constructor
   Name:Kerim
   Surname:FIRAT
  Age:30
  A,44

İyi Çalışmalar.

16 Eylül 2016 Cuma

-/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games hatası ve çözümü-

Merhabalar,
Sistemde yüklü olan uygulamaların kısa yolları ve/veya Uçbirim penceresinde işletmek istediğiniz 
komutlar çalışmıyorsa,yani tepkisiz kalıyorsa(böyle bir komut yok) aşağıdaki yöntem çözüm olacaktır.

ilk olarak "etc/environment" dosya içeriğini kontrol ediniz.
Dosya içeriği aşağıdaki gibi olmalıdır.
Dosya içeriği:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

Yukarıdaki satırı aşağıdaki şekilde değiştirerek Uçbirim(Konsol) penceresine yapıştırıp ENTER yapınız.
Bu işlemden sonra Uçbirim komutları işlenebilir olacaktır.
İyi çalışmalar.

11 Eylül 2016 Pazar

-git ascii codec decode sorunu ve çözümü-

Merhaba,
Bu kısa makalemde "git" ile kaynak kod çekerken python ile ilgili yaşanan "ascii" codec sorunu ve çözümüne açıklık getirmeye çalışacağım.
Detaylara aşağıda yer verilmiştir.

Problem:
"git" ile android kaynak kodları indirirken python "ascii" codec problemi yaşadım.

Burada problemin kaynağı repo ile ilgilidir. Dolayısıyla "git" kullanılarak yapılan işlemlerde bu problemin yaşanması muhtemeldir.
Ancak sisteminizde yüklü python sürümünde "sitecustomize.py" içerisinde "ascii" yerine "utf8" yer alıyorsa bu problem ortaya çıkmayacaktır.
Aşağıda yaşadığım problem yer almaktadır. 

git komutu çıktısı:
...
...
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 17: ordinal not in range(128)


Çözümü:
$ cat /etc/python2.7/sitecustomize.py

Sisteminizde yüklü olan python sürüm-sürümlerine ait "sitecustomize.py" dosya içeriklerini aşağıdaki şekilde düzenleyiniz.  Sadece default olarak kullanılan python sürümüne ait dosyayı düzenlemek yeterlidir.
NOT: sisteminizde python yüklü dizin yolu farklılık gösterebilir. 
Benim sisteminde python "usr/lib" dizini altında bulunuyor. Ancak "sitecustomize.py"  dosyasına ait kısayol "etc/pythonx.x" dizininde yer almaktadır. Her iki yerden de değiştirilebilir.

aşağıdaki kodları ekleyin:
# encoding=utf8  
import sys  
reload(sys)  
sys.setdefaultencoding('utf8')

konsol penceresinden eklentiyi kontrol edelim:
$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys      //ekle-ENTER
>>> reload(sys)     //ekle-ENTER
<module 'sys' (built-in)>
>>> sys.getdefaultencoding() //ekle-ENTER
'utf8'  //<çıktıyı gözlemleyiniz. 
>>> 

Yukarıdaki eklentiyi yapmadan evvel 'utf8' yerine 'ascii' anahtar kelimesi yer almaktaydı.
İyi çalışmalar.