Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

C++ - array sorunu


fizban

Öne çıkan mesajlar

yetkilerimi kötüye kullanıp siliyorum yazdığım herşeyi yeni bir soru var çünkü :P

iki sorum var.

1. assignment diyor ki;
struct ta değişkenin tipi "char *" olsun.
onu initialize eden fonksiyon "const char *" olsun.
strcpy() hata verdi.. nasıl yapabilirim ?

2. overloaded functions, VE default parameters kullanın diyor.
fakat, fonksiyonun değişkenleri (const char* a, const char* b, string c)
b ve c'nin default parametreleri olsun deniyor.
ve fonksiyon 4 sekilde cagirilabilir.
i. fonksiyon(a, b, c)
ii. fonksiyon(a)
iii. fonksiyon(a, b);
iv. fonksiyon (a, c);

nasıl yapabilirim, bilemedim. yardım plox.
Link to comment
Sosyal ağlarda paylaş

ya bu arada şöyle yapınca çözüldü de, yapmak doğru mudur ?

global fonksiyon tanımladım (tek dosya var sonuçta)

static struct Book** bookArray;

bitti. yalnız bir sorum daha var. kendi kodum yukarıda da, expand nasıl ederim arrayleri ? siz nasıl yapıyorsunuz ? delete yapamıyorum çünkü, düdük gibi kalıyorum öyle.
Link to comment
Sosyal ağlarda paylaş

Birinci sorunu pek anlayamadım.

İkinci soruyu iki fonksiyon yazarak çözebilirsin. İlk fonksiyon f(a,b,c) şeklinde olacak. b ve c parametrelerine default değer vereceksin. Yani f(a), f(a,b) ve f(a,b,c) diye çağrılabilecek. İkinci fonksiyonu ise f(a,c) diye tanımlayacaksın (f ismi daha önce kullanılmış olduğu için overloading oluyor).

Şekilde 1a:

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

using namespace std;

void f(const char* a, const char* b = "b", string c = *new string("c")) {
cout << a << b << c << endl;
}

void f(const char* a, string c) {
cout << a << c;
}

int main() {
f("hello");
f("hello", "world");
f("hello", "mello", *new string("cello"));
f("hello", *new string("fizban"));
return 0;
}


Üçüncü soruna gelince... c'den kalma bir alışkanlık diyelim. String çok daha düzenli ve anlaşılabilir bir yapı. Çekinme kullan. :)
Link to comment
Sosyal ağlarda paylaş

sağol mirage öncelikle cevap icin.

1. soruyu yeniden sorayım şöyle,

assignment diyor ki struct şu tip olsun

struct mtruct {
char *a;
char *b;
string c;
}

fakat onu init eden fonksiyonda değişken tipi const char* olsun.

fonksiyonumben (const char* a, const char *b, string c) {

--> buraya işte strcpy(mtruct-> a, a) koydum

fakat strcpy hata veriyor, nedendir ?

}
Link to comment
Sosyal ağlarda paylaş

2. sorunun cevabına gelince, tabi aptallık bende, overloaded function koyduktan sonra default parametre niye koyarsın ki hala eksik parametre varken.. dimi.

demin yazdığım sorunu şöyle çözdüm

f(a,b,c) b ve c default parametrelerle
f(a,c,b) c ve b default parametrelerle..


3. sorum da zaten şey şeklindeydi. neden bir assignment'ta zorla "const char* kullan" denilir ki ? string gibi MÜK-KEM-MEL bir tip varken..
Link to comment
Sosyal ağlarda paylaş

char *a = "fizboz";

dediğin zaman sadece pointer tanımlamıyorsun, compiler kardiş gidiyor otomatik olarak hafızadan senin için "fizboz" string'i için yer ayırıyor.


struct mtruct {
char *a;
char *b;
string c;
}


Şu yukardaki struct tanımında yaptığın gibi sadece "char *a" dersen sadece pointer tanımlamış oluyorsun. String için herhangi bir yer ayırmıyorsun.

Sonra strcopy ile bu struct içindeki a değişkenine bir string kopyalamaya çalışıyorsun. Ama a pointer'ı hafızada rastgele bir yeri gösteriyor. Böylece hafızada rastgele bir yere ulaşmaya çalışıyor ve access vialation ya da benzeri hatalar alıyorsun.

Çözüm? String için gereken yeri hafızada açıp, a pointer'ını bu hafızadaki yere gösterteceksin. Bunu da malloc ile yapabilirsin.

Mesela init metodunda:

m->a = (char*) malloc ( strlen(a) + 1 );

diyerek hafızada gereken yeri açıyorsun. mtruct içindeki a pointer'ı da bu yeri gösteriyor. Sonra da strcpy işlemini gönül rahatlığı ile yapıyorsun (umarım).

C++ tecrübem yok. Daha şık yolları olabilir. Yanlışlık da olabilir. Ohne Gewähr. :)
Link to comment
Sosyal ağlarda paylaş

ben anlamadım burdaki çözümü.
i. fonksiyon(a, b, c)
ii. fonksiyon(a)
iii. fonksiyon(a, b);
iv. fonksiyon (a, c);
ilk ikisini anladım da 3 ve 4 ü birbirinden nasıl ayırt edicekki compiler?
bide default valueları fonksiyonun içine direk yazmak varken neden syntaxa tanımladınız ki?

void f(const char* a) {
cout << a << "b" << "c" << endl;
}

yapılsa aynı şey olmayacak mı? ki her overload 3 parametreli olmadığından compiler da şaşırmaz dimi?

ben mi çok yanlış anladım?
Link to comment
Sosyal ağlarda paylaş

yok lethe, zaten öyle çağırma ihtimallerim var, nasıl overload edebilirim diye sormuştum.

şöyle overload edince tüm ihtimalleri kapsadı.

fonksiyon (const char* a, const char* b="b", string c="c")
fonksiyon (const char* a, string c="c", const char* b="b")

mirage çözümünü deneyip başını ekşitecek gene :P
Link to comment
Sosyal ağlarda paylaş

ben soruyu anlamamışım galiba..

fonksiyon (const char* a, const char* b="b", string c="c")
fonksiyon (const char* a, string c="c", const char* b="b")

yaparsan diyelimki inputumuz e, f ve h. sen ne yaparsan yap outputun ebc yada ecb olmuyormu burda? değeri atıyorsun sonra tekrar b ye ve c ye eşitliyorsun sonuçta.

bunu her türlü inputla yazdım bana dediki compiler:
error: call of overloaded `f(char, const char[4], char)' is ambiguous|

ayrı ayrı yapılcak hepsi gibi gelio bana
Link to comment
Sosyal ağlarda paylaş

fizban said:

yok lethe, zaten öyle çağırma ihtimallerim var, nasıl overload edebilirim diye sormuştum.

şöyle overload edince tüm ihtimalleri kapsadı.


fonksiyon (const char* a, const char* b="b", string c="c")
fonksiyon (const char* a, string c="c", const char* b="b")




LethE'nin dediği gibi, bunu compiler'ın kabul etmemesi lazım. Sen bu fonksiyonu

fonksiyon("oleeey");

diye çağırırsan compiler hangi fonksiyonu çağrılacağına karar veremez çünkü. O yüzden unambigious diyor.

O yüzden ilk önerdiğim çözümde sadece ilk fonksiyona default değerler verdim. Yani şöyle tanımlarsan problem ortadan kalkıyor:


fonksiyon (const char* a, const char* b="b", string c="c")
fonksiyon (const char* a, string c)


Bu durumda ikinci satırda ikinci parametrenin default değeri yok. Yani

fonksiyon("oleeey");

diye çağrınca ilk fonksiyonu çağrıcağına karar verebiliyor.
Link to comment
Sosyal ağlarda paylaş

Ha Fizban'ın ilk yazdığı da doğru değilmiş o zaman. Sonradan düzeltmiş. Neyse.. :)

C++'da "hodo" diye bir statement yazdığın zaman bunun türü const char* olur, string değil.

void foo(string a) {}

diye bir fonksiyon yazarsan aslında string türünden bir argüman bekler. Yani aslında çağırırken foo(*new string("hodo")) diye çağırman lazım. Ama C++ kolaylık olsun diye const char* 'ı string'e çevirebiliyor. Yukardaki metodu şu şekilde de çağırabilirsin yani:

const char *c = "loyloy";
foo(c);

Dediğim gibi, kolaylık olsun diye const char* 'ı string'e çeviriyor. (Bu compiler'a özel bir şey olabilir. Gcc yapıyor.) Ama gerçekten const char* türünden bir argüman bekleyen fonksiyon varsa, öncelik onda oluyor.

Yani fizban'ın yazdığı ikinci metodu çağırmak istersen f("a", "b", "c") diye çağırmak yerine, gerçekten bir string nesnesi vermen lazım. Mesela:

f("a", *new string("b"), "c")
Link to comment
Sosyal ağlarda paylaş

son sorumla karşınızdayım

global olarak tanımladığım array'im var

static mtruct** Array ;

main'de initalize ediyorum;

Array = new mtruct* [] ;

kullanıyorum ediyorum, program bitmeden ben bunu deinitalize etmek istiyorum:

void deinitialize (mtruct **Array, int size) {

for (int i=0;i<=size;i++)
delete Array[i];

delete Array;
}

bunun nesi yanlış canlar ?
Link to comment
Sosyal ağlarda paylaş

Abi cunku Array isimli pointera pointeri size + 1 kere silmeye calisiyorsun :)


for(int i=0; i<size; i++)
delete *(array + (i * sizeof(mtruct)) );

delete array;


ha biri confirm etsin C++ yazmayali cok oldu, ama smdi bu array dedigin sey bir arraye point ediyor.
once point ettigi pointer arrayini silmelisin, sonra da kendisini silmelisin. sen de onu yapmak istemissin zaten ama dedigim gibi cotak diye pointera pointeri size+1 defa silmeye calismissin.

simdi oncelikle bir arraye pointer arrayin 0. indexini gosterir. yukaridaki for loopu, arrayde mtruct tasindigi icin, once 0. sonra mtruct in size i kadar bi adimdaki, sonra bi sonraki adimdaki (yani 2. indexteki) pointerlari silecek boyle adim adim. * da ise bu memory address in point ettigi seyi donduruyor, yani arrayde tasidigin pointerlari iste.

sonra da kendisini siliyorsun arrayin.
(bi de abi arrayi kucuk harfli yaz)
Link to comment
Sosyal ağlarda paylaş

ilk evvela başlamadan önce, array'in adı normalde typeArray şeklinde de, buraya geçirirken değiştiriyorum biraz, o yüzden array kaldı adı. yoksa struct'ımın adı da mtruct değil tahmin edersin ki =)

<= size olayı mallık tabi de, bir ara saçma bir şekilde değişkenin adı size'dı ama array'in boyutu size+1'di, ondan öyle kalmıştı, sonra düzelttim onu bu öyle kalmış. onu düzeltmeme rağmen bir alt satırında hata veriyor şimdi.

hem senin tipinle (ilke senden bahsediyorum !) hem kendi tipimle yazmama rağmen, o fonksiyon çağırıldığında hata aynı:

crt detected that the application wrote to memory after end of heap buffer.

mirage;onlar da benim yaptığım gibi yapmış, ama gariptir olmuyor. acaba diyorum global değişken olduğu için falan olabilir mi ?
Link to comment
Sosyal ağlarda paylaş

Windows has triggered a breakpoint in cmpe160.exe.

This may be due to a corruption of the heap, which indicates a bug in cmpe160.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while cmpe160.exe has focus.

The output window may have more diagnostic information.

diyor hatta.
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...