Çözüldü C pointer function istenilen görevi yapmıyor

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

TheAny

Megapat
Katılım
18 Aralık 2018
Mesajlar
7.677
Makaleler
13
Çözümler
103
Ödev için program geliştiriyorum.


[CODE lang="c" title="C"]int sum_1d_array(int *sum, int array[]){
int temp = 0, i;
printf("Function started. \n");
for(i = 0; array != '\0'; i++) {
printf("%d | %d \n", array, temp);
temp = array + temp;
}
printf("Function ended. \n");
*sum = temp;

}[/CODE]

Fonksiyon bu. Bu fonksiyona girilen dizinin içerisindeki elementleri toplaması ve iletmesi gerekiyor. Fakat iletimi pointer kısmına girilmiş değişkene iletmesi gerekiyor. Yani return sum; ile printf("Sum is: %d \n", sum_1d_array(sum, array)); ile çıktı almaktansa printf("Sum is: %d \n", sum); ile çıktı almak istiyorum. Bu yüzden return kullanmak işe yaramaz.

Bu fonksiyon *sum = temp; kısmına kadar düzgün çalışıyor. Aradaki yazdırma komutlarını da o yüzden verdim. Fakat ne zaman *sum = temp kısmına gelse, program end verip kapanıyor.
Ne yapabilirim?
[CODE lang="c" title="C"]void input_1d_array(int *array, int size){
int i;
for(i = 0; i < size; i++){
printf("Please enter value %d: ", i + 1);
scanf("%d", &array);

}
*array;
}[/CODE]
Yukarıdaki kod mesela istediğim şekilde çalışıyor. Ana fonksiyonun içine
[CODE lang="c" title="C"]input_1d_array(array, size);[/CODE] eklediğim zaman, dizinin içerisine belirlediğim miktarda (size) element ekliyor.
 
Son düzenleme:
Çözüm
[CODE lang="c" title="C"]int sum_1d_array(int *sum, int array[]){
int temp = 0, i = 0;
printf("Function started. \n");
for(i; i <= sizeof(array)/sizeof(int); i++) {
printf("%d | %d \n", array, temp);
temp = array + temp;
}
printf("Function ended. \n");
*sum = temp;
}[/CODE]
Bu sefer çıktı da eksik var.
Eki Görüntüle 1047357
Eki Görüntüle 1047359
Yukarıda verdiğim kodla çalışırken çıktı:
Eki Görüntüle 1047362
[CODE lang="c" title="C"]sum_1d_array(sum, array);
printf("Sum is: %d", sum);[/CODE]

Ana fonksiyon içerisinde bulunan yazdırma kodu asla çalışmıyor *sum = temp devreye girdiğinde.


Kendi fonksiyonuna bir pointer verdiğine emin misin?

C:
int sum = 0;
int _array[5];
sum_1d_array(&sum, _array);

Gibi örneğin. Çünkü vermessen undefined behaviour oluşur program hata vermeden çöker.
"int" türü dizilerde null terminator diye geçen "\0" karakteri bulunmaz. O yüzden farklı bir şekilde boyutunu kontrol etmelisin dizinin. Ben şöyle yaparım mesela int türü dizilerde (eğer C dili kullanıyorsam):

C:
void sum_1d_array(int *sum, int array[]){
    int temp = 0, i = 0;
    printf("Function started. \n");
    for(;i<=sizeof(array)/sizeof(int); i++) {
        printf("%d | %d \n", array[i], temp);
        temp = array[i] + temp;
    }
    printf("Function ended. \n");
    *sum = temp;
 
}

C++'ta ise template'ler ile otomatik olarak dizinin boyutunu da alabiliyorsun. Ayrıca bu yöntem için dizinin referansını alman gerekli, böylece bellek alanından da tasarruf etmiş oluyorsun.

[CODE lang="cpp" title="Template'leri göstermek amaçlı örnek"]template <std::size_t arr_size>
void sum_1d_array(int *sum, int (&array)[arr_size]){
int temp = 0, i = 0;
printf("Function started. \n");
for(;i<=arr_size; i++) {
printf("%d | %d \n", array, temp);
temp = array + temp;
}
printf("Function ended. \n");
*sum = temp;

}[/CODE]
 
Ben şöyle yaparım
[CODE lang="c" title="C"]int sum_1d_array(int *sum, int array[]){
int temp = 0, i = 0;
printf("Function started. \n");
for(i; i <= sizeof(array)/sizeof(int); i++) {
printf("%d | %d \n", array, temp);
temp = array + temp;
}
printf("Function ended. \n");
*sum = temp;
}[/CODE]
Bu sefer çıktı da eksik var.
1622327953969.png

1622327986966.png

Yukarıda verdiğim kodla çalışırken çıktı:
1622328063717.png

[CODE lang="c" title="C"]sum_1d_array(sum, array);
printf("Sum is: %d", sum);[/CODE]

Ana fonksiyon içerisinde bulunan yazdırma kodu asla çalışmıyor *sum = temp devreye girdiğinde.
 
[CODE lang="c" title="C"]int sum_1d_array(int *sum, int array[]){
int temp = 0, i = 0;
printf("Function started. \n");
for(i; i <= sizeof(array)/sizeof(int); i++) {
printf("%d | %d \n", array, temp);
temp = array + temp;
}
printf("Function ended. \n");
*sum = temp;
}[/CODE]
Bu sefer çıktı da eksik var.
Eki Görüntüle 1047357
Eki Görüntüle 1047359
Yukarıda verdiğim kodla çalışırken çıktı:
Eki Görüntüle 1047362
[CODE lang="c" title="C"]sum_1d_array(sum, array);
printf("Sum is: %d", sum);[/CODE]

Ana fonksiyon içerisinde bulunan yazdırma kodu asla çalışmıyor *sum = temp devreye girdiğinde.

@TerabyteForever 'ın kodundaki hata sanırım
for döngüsündeki "<=" ifadesinden kaynaklanıyor. "<" ile değişmesi lazım çünkü bir array 0 indexiyle başlar, büyüklüğün bir eksiğine kadar sürmelidir.
 
[CODE lang="c" title="C"]int sum_1d_array(int *sum, int array[]){
int temp = 0, i = 0;
printf("Function started. \n");
for(i; i <= sizeof(array)/sizeof(int); i++) {
printf("%d | %d \n", array, temp);
temp = array + temp;
}
printf("Function ended. \n");
*sum = temp;
}[/CODE]
Bu sefer çıktı da eksik var.
Eki Görüntüle 1047357
Eki Görüntüle 1047359
Yukarıda verdiğim kodla çalışırken çıktı:
Eki Görüntüle 1047362
[CODE lang="c" title="C"]sum_1d_array(sum, array);
printf("Sum is: %d", sum);[/CODE]

Ana fonksiyon içerisinde bulunan yazdırma kodu asla çalışmıyor *sum = temp devreye girdiğinde.


Kendi fonksiyonuna bir pointer verdiğine emin misin?

C:
int sum = 0;
int _array[5];
sum_1d_array(&sum, _array);

Gibi örneğin. Çünkü vermessen undefined behaviour oluşur program hata vermeden çöker.
 
Son düzenleyen: Moderatör:
Çözüm
Çünkü vermessen undefined behaviour
Tamam sorun çözülmüş oldu bununla.
[CODE lang="c" title="Ana fonksiyon"]int main()
{
int size, array[50], sum, avr;
printf("Please enter size of array: ");
scanf("%d", &size);
input_1d_array(array, size);
output_1d_array(array, size);
sum_1d_array(&sum, array);
printf("Sum is: %d", sum);
}[/CODE]


[CODE lang="c" title="Toplama Fonksiyonu"]int sum_1d_array(int *sum, int array[]){
int temp = 0, i = 0, minus;
int size = sizeof array / sizeof array[0];
printf("Function started. \n");
for(i; array != '\0'; i++) {

temp = array + temp;
minus = array;
printf("%d | %d \n", array, temp);
}
temp = temp - minus;
printf("Temp is: %d\n", temp);
*sum = temp;
printf("Function ended. \n");
}[/CODE]

Sorun çözülmüş oldu.
 
@TerabyteForever 'ın kodundaki hata sanırım
for döngüsündeki "<=" ifadesinden kaynaklanıyor. "<" ile değişmesi lazım çünkü bir array 0 indexiyle başlar, büyüklüğün bir eksiğine kadar sürmelidir.
Bundan değil de, sizeof() fonksiyonunu daha çok yanlış yerde kullanmamdan dolayı oldu. Dün internet kesildiği için yazamadım ama sizeof(array) 8 döndürdüğü için (64 bit sistemde pointer boyutudur, dizi olarak parametre alınca pointer çalışıyor) fonksiyon yanlış çalışıyordu.

Aslında bundan dolayı fonksiyonda ek olarak arkadaşın dizi boyutunu parametre olarak almasını isteyecektim ama dediğim gibi internetim kesildi...
 

Yeni konular

Geri
Yukarı