Çok Boyutlu İşaretçi Katara Karakter Atanmıyor

Başlatan Jey@Nfer, 25 Mayıs 2011 - 10:55:14

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

Jey@Nfer

Arkadaşlar işaretçilere çalışıyorum ve bi noktada takılıp kaldım..Sırf belki de basit bi şey yüzünden 3 gündür programı yazamıyorum..
çok boyutlu işaretçi katar dizisine karakter düzeyinde atama yaparken hata alıyorum bunu nasıl çözebilirim?

yani örnek olarak

main()
{
int i,j,k;

char *katar[]={"deneme", "katar", "dizilerine", "deger", "atama"};

katar[2][3]='s'; //hata veriyor

strcpy(katar[2][3], 's'); //hata veriyor
strcpy(katar[2][3],"s"); // hata veriyor..

}


yani arkadaşlar bi türlü karakter ataması yapamıyorum.. ama geri kalan her şeyi yapabiliyorum aşağıya örnek kodları da koydum..
sadece  bu karakter ataması olayını yapamıyorum ..
yani bu şekildeki bir çok boyutlu işaretçi katar dizisine tek karakteri nasıl atayabilirim bi yardımcı olur musunuz lütfen !!!


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 25 Mayıs 2011 - 10:55:58

aşağıdaki kodda olduğu üzere sadece katar dizisine atama yapamıyorum.. geri kalan bütün dizilere harf harf atama yapabiliyorum..
niye ya niye bu katar[] dizisinde hata veriyor??



#include "stdio.h"
#include "stdlib.h"

main()
{
    int i, j, k;
    char *katar[]={"deneme", "katar", "dizilerine", "deger", "atama"};

    char *katar2[10];

    char katar3[10][15]={"cok", "boyutlu", "katar", "dizilerinde", "atama","yapmak"};

    char *katar4[10][15];

///////////////////////////////////////////////////////////////////////////////////////////////////////

    printf("\n.......katar yazdırılıyor............\n");
    for(i=0; katar[i];i++)
    {
        for(j=0;katar[i][j];j++)
        {
            printf("%c",katar[i][j]);
        }
        printf("\n");
    }

    printf("\n%s %s %s %s %s \n",katar[0],katar[1],katar[2],katar[3],katar[4]);

    printf("\nkatar : %s\n",*katar);
///////////////////////////////////////////////////////////////////////////////////////////////////////

    for(i=0; katar[i]; i++)
    katar2[i]=(char*)malloc(sizeof(katar[i])+3);


printf("\n\n.......katar2[i][j]=katar[i][j] yazdırılıyor............\n");


    for(i=0;i<6;i++)
    {
        for(j=0;katar[i][j];j++)
        {
        katar2[i][j]=katar[i][j];
        printf("i: %d | j: %d | %c\n",i,j,katar2[i][j]);
        }
    }

    printf("\n...................\n");
    for(i=0; i<6 ;i++)
    {
        for(j=0;katar2[i][j];j++)
        {
            printf("%c",katar2[i][j]);
        }
        printf("\n");
    }

    printf("\n%s %s %s %s %s \n",katar2[0],katar2[1],katar2[2],katar2[3],katar2[4]);

///////////////////////////////////////////////////////////////////////////////////////////////////////



printf("\n\n.......katar3 yazdırılıyor............\n");
    for(i=0;i<6;i++)
    {
    printf("%s ", katar3[i]);
    }

printf("\n\n");

    for(i=0;i<6;i++)
    {
        for(j=0;katar3[i][j];j++)
        {
            printf("%c",katar3[i][j]);
        }
        printf("\n");
    }



///////////////////////////////////////////////////////////////////////////////////////////////////////

    printf("\n.......katar4[i][j]=katar3[i][j] yazdırılıyor............\n");

    for(i=0; i<6 ; i++)
    {
        for(j=0;katar3[i][j];j++)
        {
            katar4[i][j]=katar3[i][j];
            printf("%c",katar4[i][j]);
        }
        printf("\n");
    }

///////////////////////////////////////////////////////////////////////////////////////////////////////

    for(i=0;i<6;i++)
    {
        for(j=0;katar3[i][j];j++)
        {
        katar3[i][j]='s';
        }
    }


printf("\n\n   ...katar3[i][j]='s' yazdırılıyor... \n");

    for(i=0; i<5 ;i++)
    {
        for(j=0;katar3[i][j];j++)
        {
            printf("%c",katar3[i][j]);
        }
        printf("\n");
    }


///////////////////////////////////////////////////////////////////////////////////////////////////////


    printf("\n.......katar4 yazdırılıyor............\n");

    for(i=0; i<6 ; i++)
    {
        for(j=0;katar3[i][j];j++)
        {
            printf("%c",katar4[i][j]);
        }
        printf("\n");
    }

//////////////////////////////// HATA OLAN KıSıM /////////////////////////////////////////////////////

for(i=0;katar[i];i++)
{
    for(j=0;katar[i][j];j++)
    {
        katar[i][j]='s';
    }
}

}



evet çalışmayan kısım en alttaki kısım.. derleyince en sonda segmentation fault veriyor..
bu problemi nasıl aşabilirim?


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 25 Mayıs 2011 - 11:11:05

katar2, katar3 ve katar4 işaretçi katar dizilerinin hepsine bi şekilde harf harf atama yapabiliyorum kodda göründüğü üzere..
ama sadece katar dizisine yapılamıyor.. oysa hafızada onun için ayrılmış bir alan var...yani olmayan bir hafızaya değer ataması yapmaya çalışmıyoruym..
ki benim canımı sıkan :

katar[5[="merhaba";

gibi bi atama dahi yapılabiliyor yani olmayan 6. bir yer daha istenip alınabiliyorken hafızada var olan karakteri nasıl değiştiremem çıldırcam ya..

sadece katar dizisinin herhangi bir harfine atamak yapmak istiyorum olay bundan ibaret arkadaşlar lütfen biri yardımcı olsun ya... yok internette ardım yok örneği..


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 25 Mayıs 2011 - 13:55:11

evet arkadaşlar zar zor gene bi şekilde kendi başıma çözdüm .. gene de ilginiz için teşekkürler..

ben yine nasıl çözdüğümü anlatayım hemen..
öncelikle gecici bir cahr tipli işaretçi değişken taıyorum..geçici değişken için ilgili katarın boyutunda yer ayırıyorum sora da katarı gecici değişkene atıyorum.. katarın hafızasının yine önceki boyutu kadarlık dinamik olarak atıyorum.. sora geçici değişkendeki içeriği katara aktarıyorum..

aklıma başka bi yöntem de gelmedi arkadaşlar sizin bildiğiniz kütüphane fonksiyonları falan varsa paylaşırsanzı sevinirm çünkü bunun bir kısayolu olduğunu ve benim yaptığım yöntemin biraz sivri bir yöntem olduğunun düşünüyorum..
neyse kodlara geçelim:


int g;
char *gecici;

printf("\n\nkatar[2] uzunlugu : %d\n\n",strlen(katar[2]));

for(g=0;katar[2][g];g++);
printf(" G : %d \n",g);

        gecici=(char *)malloc(g);

for(i=0;i<g;i++)
    gecici[i]=katar[2][i];

printf("gecici uzunlugu : %d\n\n",strlen(gecici));
printf("gecici yazdırılıyor : |%s| \n",gecici);

    katar[2]=(char *)malloc(g);

for(i=0;i<g;i++)
    katar[2][i]='s';

printf("katar[2] yazdırılıyor : |%s| \n",katar[2]);
printf("katar[2] uzunlugu : %d\n\n",strlen(katar[2]));

for(i=0;i<g;i++)
    katar[2][i]=gecici[i];

printf("katar[2] yazdırılıyor : |%s| \n",katar[2]);
printf("katar[2] uzunlugu : %d\n\n",strlen(katar[2]));



yukardaki koda bu satırları ekleyince bir sorun kalmıyor..
Hırs , azim , tevekkül ...

www.mehmetvahit.net

Erdem

    char dizi[10][20] = { "deneme",
                          "katar",
                          "dizilerine",
                          "deger",
                          "atama"};
   

    // dizinin ilk elemanını gösteren gösterge
    char (*p) [20] = dizi;


Bu şekilde olur. Hatta daha iyisi typedef kullanmak. Daha sonra da göstergeyi diziymiş gibi kullanabilirsin.

    typedef char satirlar[20];

    satirlar * dizimiz = dizi;

    dizimiz[0][0] = 'c';


Ama bu satırlar yazan aslında sütün olabilir. Ya da tam tersi emin değilim  :)
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

sem

Paylaştığınız ikinci kod içerisinde hatalı olarak belirttiğiniz yere bakamadım. Aslını isterseniz konuyu da tam anlamı ile okuyamadım. Kusura bakmayın diyeyim bu nedenle ve o şekilde konuya giriş yapayım (zaman dar =))

Öncelikle kod hatalı olan yere gidemiyor bende ve şurada çakılıyor ;


    for(i=0; katar[i];i++)
    {
        for(j=0;katar[i][j];j++)
        {
            printf("%c",katar[i][j]);
        }

        printf("\n");
    }
    printf("\n%s %s %s %s %s \n",katar[0],katar[1],katar[2],katar[3],katar[4]);

    printf("\nkatar : %s\n",*katar);




Yani ilk yorum ve ikinci yorum çizgileri (////////////////////) arasından çıkamıyor bende program.


        for(j=0;katar[i][j];j++)

Bu ikinci for döngünüz. Karakter katarları NULL ile sonlandırıldığı için ve NULL da for içerisinde yanlış olarak nitelendirildiği için ikinci for kırılarak program ilk for döngüsüne girecek ve oradaki değişiklikleri alarak ikinci for döngüsüne tekrar girece ve tekrar NULL görünce birinci for a geri dönecek. Burası güzel. İlk for'a dönelim;

for(i=0; katar[i];i++)

Burada katar 5 boyutlu "karakter dizisi dizisi" olarak işleme sokuluyor. Karakter dizileri NULL ile bittiği için for döngüsünü kıracaktır. Peki birisi;

katar[5] = '\0';

bu şekilde null eklemezse birinci for döngüsünü kim kıracak?



C'de dizi uzunları dizi isimleri ile saklanan bir veri değildir ya da boyutunu alabileceğimiz bir fonksiyonu yoktur (C++ daki gibi). O nedenle dizilerle çalışırken boyutlarını programcı hesaba katarak ona göre kod yazmalı.

Bir istisna vardır. O da sizin ikinci for döngünüzde çok güzel kullanmış olduğunuz karakter dizileri. C'de if, for, while gibi koşul bekleyen yönlendiriciler biliyorsunuz bir sayı alırlar ve ona göre işlem yaparlar. Aldıkları sayının 0 olması ya da olmaması durumuna göre yanlış ya da doğruluğuna karar verilir.

NULL'da hiç bir yeri göstermeyen boş bir adres olarak tanımlanmıştır ve 0 olarak işlem görüyor bu for, while gibi yönlendiricilerde(hatırlayınız null karakter ataması:   '\0' şeklinde yapılıyor.). Bu da koşulun 'yanlış' olması olarak yorumlanıyor.

Fakat bir tam sayı dizisini bu şekilde kullanamazsınız. Aynı şekilde kendi tanımladığınız karakter dizisini tutan karakter dizisi de NULL karakter ile sonlanmayacağı için döngünün kırılmasını sağlayamayacaktır.

Biraz acele yazdım, umarım  düşündüklerimi anlatabilmişimdir.

".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?