PDA

Tam Sürümünü Görmek İçin : çok basit bir soru


cefurkan
04/12/2006, 16:18
evet sadece bu fonksiyondaki hatami soyleyin ben sadece 1 sayi girdigimde neden bu girdigim sayiyi printf ile cikti olarak alamiyorum bunu soyleyin bunu asayim yeterli tesekkurler:aglama: :aglama: :aglama: :aglama:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct dugum {
int veri;
struct dugum *next_prime;
struct dugum *next;
} dugum_tipi;

typedef struct liste {
struct dugum *liste_ptr;
struct dugum *asal_ptr;
} liste_tipi;
liste_tipi *listeye_ekle (dugum_tipi*,liste_tipi*);
dugum_tipi *dugum_al(int );
int main(int argc,char *argv[]){
int i,deger;

dugum_tipi *t;
liste_tipi *listep;
listep->liste_ptr=NULL;
listep->asal_ptr=NULL;

deger=atoi(argv[1]);
t=dugum_al(deger);

listeye_ekle(t,listep);

t=listep->liste_ptr;
printf("%d",t->veri);



return 0;
}
dugum_tipi *dugum_al(int deger){
dugum_tipi *yenidugum;
yenidugum=(dugum_tipi *)malloc(sizeof(dugum_tipi));
if(yenidugum==NULL)
printf("bellek alinamadi\n");
else
{
yenidugum->veri=deger;
yenidugum->next=NULL;
yenidugum->next_prime=NULL;
}
return yenidugum;
}
liste_tipi *listeye_ekle(dugum_tipi *dugum,liste_tipi *liste)
{


liste->liste_ptr=dugum;

return (liste);

}


cefurkan
04/12/2006, 16:31
arkadas lar buldum hatami gerek kalmadi nese astik gene bir tane hata :D

cefurkan
04/12/2006, 17:20
for(i=1; i<argc; i++) {
deger=atoi(argv[i]);
t=dugum_al(deger);
listeye_ekle(t,listep);
}


bunda bir hata var anlamadim gitti

bunu sole yazinca duzgun sonuc verirken oburunde program hata verip kendini sonlandiriyor :D


deger=atoi(argv[1]);
t=dugum_al(deger);
listeye_ekle(t,listep);

simdi 2. si gibi yapip 1 deger girince duzgun cikti alabiliyorum

ama ilki gibi yapip dongude 1 deger girince program hata verip kapaniyor

Sabahi
04/12/2006, 23:45
Yanilmiyorsam NULL character okuyorsun. O yuzden de program hata veriyor. Command Line i asagidaki gibi parse etmeyi denersen sorunun cozulur sanirim.


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

int main(int argc,char **argv)
{

int index=0;
char *s=NULL;


printf("Number of arguments:%i\n", argc);

if (argc < 1) return 0;

for(index=1; index<argc; index++)
{
s = strtok(argv[index], "\n");
printf("%i\n", atoi(s));
}


return 0;
}

cefurkan
05/12/2006, 00:04
hocam burda bir tek ben su kismi farkli gordum ben
if (argc < 1) return 0;

onu de ekledim hat0a devam ediyor


bendeki main bu tipde
int main(int argc,char *argv[])

Sabahi
05/12/2006, 00:11
strtok(argv[index], "\n");

Dikkatli bak string.h ve strtok fonksiyonunu ekledim. strtok sayesinde "\n" karakterini kadar okuyorum sadece. Loop icerisnde strtok dondukten sonra asagidaki gibi ekleyeceksin.

deger= atoi(s);
t=dugum_al(deger);
listeye_ekle(t,listep);

Sabahi
05/12/2006, 00:39
Bu arada yukarida verdiginiz kod parcasindaki hatalarinizi duzeltmis oldugunuzu kabul ediyorum yoksa daha loop a girmeden programiniz crash oluyor.

cefurkan
05/12/2006, 00:44
hocam loop suz tek atama yaptigimda yukarda belirttigim gibi calisiyor ama

sizin verdiginiz deisiklikleri yapmama ramen hala hata devam ediyor :aglama:

Sabahi
05/12/2006, 00:46
Loopsuz calisiyor dediginiz kodu yollarmisiniz cunki ben yukardaki ornege baktigimda hic bir sey calismiyor.

acehreli
05/12/2006, 06:54
Bir kac aciklamayi [Ali] ile isaretledim.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

// [Ali] Tek bagli liste dugumlerinde yalnizca bir tane "next"
// olur. next_prime sanki fazla gibi geliyor.
typedef struct dugum {
int veri;
struct dugum *next_prime;
struct dugum *next;
} dugum_tipi;

typedef struct liste {
struct dugum *liste_ptr;
struct dugum *asal_ptr;
} liste_tipi;
liste_tipi *listeye_ekle (dugum_tipi*,liste_tipi*);
dugum_tipi *dugum_al(int );
int main(int argc,char *argv[]){
int i,deger;

dugum_tipi *t;
liste_tipi *listep;
listep->liste_ptr=NULL;
/* [Ali] HATA! listep'yi sanki yasal bir gostergeymis gibi kullandin.
* Halbuki listep'nin gosterdigi bir liste_tipi nesnesi yok.
*/
listep->asal_ptr=NULL;
// [Ali] Ayni hata...

deger=atoi(argv[1]);
t=dugum_al(deger);

listeye_ekle(t,listep);

t=listep->liste_ptr;
printf("%d",t->veri);



return 0;
}
dugum_tipi *dugum_al(int deger){
dugum_tipi *yenidugum;
yenidugum=(dugum_tipi *)malloc(sizeof(dugum_tipi));
if(yenidugum==NULL)
printf("bellek alinamadi\n");
else
{
yenidugum->veri=deger;
yenidugum->next=NULL;
yenidugum->next_prime=NULL;
}
return yenidugum;
}
liste_tipi *listeye_ekle(dugum_tipi *dugum,liste_tipi *liste)
{
// [Ali] Burayi once bir kagida cizerek yap. liste_ptr'ye dugum'u
// atayinca liste_ptr'nin daha once gosterdigi dugum'e ne olur?
// Cunku sen burada ekleme yapmiyorsun; varolani unutup yeni bir
// dugum gosteriyorsun.

liste->liste_ptr=dugum;

// [Ali] return'den sonra parantez kullanmaya gerek yoktur; ama
// yanlis da degil.
return (liste);

}

Ali

acehreli
05/12/2006, 07:05
Sabahi, program parametrelerinin iclerine '\n' karakteri karistigini sanmiyorum. strtok kullanmak programin davranisinda herhalde hicbir etki yapmiyordur.

Ama strtok'un, kendisine verilen dizgiyi "bozmak" gibi bir ozelligi oldugu icin, parametreleri degistiriyoruz. Programin sonraki bir noktasinda parametreleri tekrar okumak istesek, degismis olurlar. ('\n'lerin yerine '\0' karakteri yazilmis olur.)

argv'nin icerdigi dizgilerle ilgili bir yazi aklima geldi. Yanlis hatirlamiyorsam, her ne kadar 'char*' iceriyor olsa da, argv'nin dizgilerini degistiremiyor olabilirmisiz. Okudugum yazida (cok eskiden usenet'te) C standardinin bundan bahsetmedigi de belirtiliyordu.

Yani sonucta o dizgilere sabitlermis gibi davranmak en iyisi. Sanki 'const char*' iceriyorlarmis gibi...

Gereksiz bir ayrinti... :)

Ali

Sabahi
05/12/2006, 08:56
#include <stdio.h>
#include <stdlib.h>


// Tur tanimlari.
typedef struct dugum
{
int veri;
struct dugum *next_prime;
struct dugum *next;

} dugum_tipi;

typedef struct liste
{
struct dugum *liste_ptr;
struct dugum *asal_ptr;

} liste_tipi;



// Prototypes.
dugum_tipi * yeni_dugum(int v);
liste_tipi * yeni_liste();
void ilistir(int v);


liste_tipi * ilk = NULL;

int main(int argc,char *argv[])
{

int index=0;
char *s=NULL;
dugum_tipi * t=NULL;

if (argc < 2) return 0;
for(index=1; index<argc; index++)
{

s = argv[index];
ilistir(atoi(s));
}

t = ilk->liste_ptr;
while(t)
{
printf("%d\n", t->veri );
t = t->next;
}

return 0;
}

dugum_tipi * yeni_dugum(int v)
{
dugum_tipi * d = (dugum_tipi *)malloc(sizeof(dugum_tipi));

if ( d == NULL ) return NULL;

d->next = NULL;
d->next_prime = NULL;
d->veri = v;

return d;
}


liste_tipi * yeni_liste()
{
liste_tipi * l = (liste_tipi *)malloc(sizeof(liste_tipi));

if (l==NULL) return NULL;

l->asal_ptr = NULL;
l->liste_ptr = NULL;

return l;
}

void ilistir(int v)
{
dugum_tipi * t=NULL;

if (ilk == NULL)
{
ilk = yeni_liste();
if (ilk == NULL)
{
printf("Hafiza hatasi!\n");
return;
}else
{
ilk->liste_ptr = yeni_dugum(v);
if(ilk->liste_ptr == NULL)
{
printf("Hafiza hatasi!\n");
return;
}
}

}else
{
t = yeni_dugum(v);
if(t == NULL)
{
printf("Hafiza hatasi!\n");
return;
}else
{
t->next = ilk->liste_ptr;
ilk->liste_ptr = t;
}
}
}

Sabahi
05/12/2006, 09:12
@acehreli haklisin soylediginde. Ben zaten arkadas loop olmadan calisiyor dedigi icin sorunun '\n' okumak olacagini dusunmustum ama arkadasin koduna dikkatli bakinca asil sorunun insertion problemi oldugunu gordum.

@cefurkan sizin kodu yukardaki sekilde biraz degistirdim. Bu hali ile calisyor ancak bu sadece listeye nasil dugum eklenecegini gosteren yollardan biri. Yapmaniz gereken daha cok is var.

cefurkan
05/12/2006, 23:06
valla ustadlar cok saolun yardimlariniz icin

daha cok calismam lazim sizin gibi olmak icin :ginginn:


su anda elimde 2 veri li liste var

bundan sonra eklenencek verileri sirali eklicek sekilde yapacak fonksiyon uzerinde calisiyorum :D daha dorusu bunu yapacak donguyu kurmaya calisiyorum

sabah arkadas 5 dakka da buldu bellek almadigimi aslinda cok kolay bir hata idi ama neden se biz ilk basta goremedim :)

cefurkan
05/12/2006, 23:55
yaw bende baya bir if else oldu karisti artik parantezler bir program da parantezleri renkli renkli isaret liyor denklestiriyor felandi

bana bu gorevi yapacak program soyleyebilirmisiniz link de verirseniz download icin super olur kafam karisti goremiyom artik parantezleri :D

su anda calisiyor ama daha bug lar var mesela 1 2 3 4 555 543 34 23 felan ekleseme calisiyor ama fonk basi deisirse yani mesela 23 34 54 3 23 45 45 1 diye eklersem hata veriyor :D

cefurkan
05/12/2006, 23:56
yo ole de vermiyor ama bazen veriyor hata
hatanin sebebini bulmam icin bole renkli renkli gostercek bir program lazim :D

cefurkan
05/12/2006, 23:59
su strtok kaldirdim eski haline getirdim su anda tek problem ilk girdigim veriyi en son da yazmasi gibi gozukuyor :P

cefurkan
06/12/2006, 00:29
for(index=1; index<argc; index++)
{
deger= atoi(argv[index]);
t=dugum_al(deger);
listeye_ekle(t,listep);
}

ya bu donguye ole bise ekliyeyim ki deger =-1 olunca dongu sonlansin
if(deger==-1)
break;
diyorum ama hata veriyor

acehreli
06/12/2006, 01:14
Derleme hatasi mi; calisma zamani hatasi mi? Yazdigin kadarinda hata goremiyorum...

Ali

Sabahi
06/12/2006, 07:32
ya bu donguye ole bise ekliyeyim ki deger =-1 olunca dongu sonlansin
if(deger==-1)
break;
diyorum ama hata veriyor
Garip bir hata. deger bir sekilde int disinda bir value ataniyor olabilir emin olmak icin if(-1==atoi(deger)) break; gibi yazin bakalim bir sey degisecek mi?
su anda tek problem ilk girdigim veriyi en son da yazmasi gibi gozukuyor
Girdigin veriyi ters sirali yazmasi problem degil. Listeye bir dugum ilistirdiginde eger dugumu listenin onune koyarsan ki en kolay cozum, bu durumda ilk ilistirdigin dugum en son cikacaktir. Eger ilk girenin ilk cikmasini istersen o zaman her ilistirdigin dugumu listenin sonuna koyman gerek. Senin durumunda ikisi arasinda cok buyuk bir fark yok aslinda cunki listenin sirali olmasi gerekiyor. Yani iki secenegin var ya hali hazirda yaptigin gibi command linedan okudugun degerleri aninda listeye girip sonra bir list sorting algoritmasi yazacaksin ki gorunuse gore kalan zamaniniz icinde bunu basarmaniz zor gorunuyor. Yada isin kolayina kacip (argc-1) * sizeof(int) buyuklugunde bir dinamik array of integers yaratip command linedan okudugunuz degerleri burada herhangi basit bir sorting algoritmasi ile buyukten kucuge siralayip sonra dugumleri one ilistireceksiniz. Tabi odevinizde secim size birakilmissa. Yine de ogrenmek isterseniz listenin sonuna dugum eklemeye bir ornek olarak asagidaki fonksiyona bir gor atabilirsiniz. Iki dugumun arasina nasil girilir onu cozmek size kaliyor.

// Global
liste_tipi * ilk = NULL;
liste_tipi * son = NULL;


void ardina_ilistir(int v)
{
dugum_tipi * t=NULL;

if (ilk == NULL)
{
ilk = yeni_liste();
ilk->liste_ptr = yeni_dugum(v);
son = yeni_liste();
son->liste_ptr = ilk->liste_ptr;

}else
{
t = yeni_dugum(v);
son->liste_ptr->next = t;
son->liste_ptr = t;
}
}

cefurkan
06/12/2006, 09:40
valla bizde her veriyi aldiginda liste sirali hale geliyor

yani ole listeyi alayim sonra siraliyayim ole deil

o yuzden dedigin gibi malesef yapma imkanim yok :D


istersen sana su andaki programi atayim bak bir pm den atiyorum

Sabahi
06/12/2006, 19:11
valla bizde her veriyi aldiginda liste sirali hale geliyor

yani ole listeyi alayim sonra siraliyayim ole deil

Bu demektir ki verileriniz hali hazirda kucukten buyuge sirali giriliyor. Bu durumda butun yapmaniz gereken yukarida ornegini verdigim void ardina_ilistir(int v) fonksiyonunu kullanarak dugumleri eklemeniz. Boylece baska hic bir seyi degistirmeden ilk girenin ilk cikmasini saglamis olursunuz.

cefurkan
06/12/2006, 20:29
ya abi sen de tam super anlamissin ha :D

hayir girdigi verileri her listeye ekleyisimde ben siraliyorum

su anda %90 daha dorusu cok veri girdigim de 1 veri haric hepsini doru siraliyor o 1 veriyi neden yanlis yere siraliyor anlamadim :D

simdi yurta geciyorum aksam msn den gorusebilirsek super olur sabahi hocam

saygilarimla

cefurkan
06/12/2006, 22:47
bu program da sadece ilk dugumdeki veriyi geri alabiliyorum main e dondugune ilk veriden sonraki listedeki verileri yazdirirken segmentation fault aliyorum

hatami bulamadim goren soyleyebilir mi ?

burda girdi olarak liste(su anda olusmus sirali bir listedir bu fonksiyona direk dugumlerden olusan sirali liste aliyorum(gerci 1 tane verisi sacma bir yerde oluyor ama dierleri sirali :D))


liste_tipi * listeden_sil(liste_tipi *liste){
dugum_tipi *c,*d;

liste_tipi *listex;
listex=(liste_tipi *)malloc(sizeof(liste_tipi));
listex->liste_ptr=NULL;
listex->asal_ptr=NULL;
c=liste->liste_ptr;
d=(dugum_tipi*)malloc(sizeof(dugum_tipi));
d->next=NULL;
d->next_prime=NULL;
while(c->next!=NULL)
{


if(listex->liste_ptr==NULL){
if(asal_sorgu(c->veri)==0){
d=c;
listex->liste_ptr=d;
}
else
break;
}
else{


if(asal_sorgu(c->veri)==0){
d->next=c;
d=d->next;
}
}
c=c->next;

}

return (listex);
}

cefurkan
06/12/2006, 22:55
ya bu tek veriyi neden adam gibi siralamiyor anlamadim mesela

1 2 4 23 435 12 12 4 5 7 23 6 67 23 67 23 67 87 23 23 1 34 67 diye girdigimi varsayalyim

çikti sole oluyor
1
1
2
4
4
5
6
7
12
12
23
23
23
23
23
23
34
67
67
67
87
435
67//tek killik yapan veri :D

sabahi abi
abi
saat 1 e kadar msn deyim ya da baska yardim i dokunabilecek abilerde olur cok ufak bir iki soru sorucam

cefurkan@hotmail.com msn

cefurkan
07/12/2006, 01:02
tuh ya ekleyen cikmadi :aglama: :aglama: :aglama:

MEHMET
07/12/2006, 08:15
Bu projenin(ödevin) adı nedir?

cefurkan
07/12/2006, 21:31
ya pff cok ufak 2 problem kaldi ama zaman kalmadi gonullu yardim edicek var mi acaba

programin adi yok adam lar ne isterse onu yapmaya calisiyoruz

1. problem veri leri buyuk kucuk buyuk diye alirsam sacma bir sekilde yanlis ekliyor diger 7 ihtimalde doru ekliyor
2. problem asallari bir birine baglarken 1 rakamini girince program crash oluyor dier turlu fistik gibi calisiyor

acil yardim lazim bu iki konuda yardim edicek arkadas lar

cefurkan@hotmail.com ekleyebilir mi acaba

cefurkan
07/12/2006, 23:12
tek bir problem kaldi o da

liste deki asal lari bir birine atarken 1 sayisi girildiginde crash olmasi

1 haric ne asali girersem gireyim crash vs olmadan gayet guzel calisiyor


yardim eden de cikmadi am anese :(