error: initializer element is not constant

Başlatan aware, 30 Kasım 2016 - 17:49:08

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

aware

Merhaba, ben bir dizideki en küçük elemanı bulan bir yenilemeli fonksiyon ihtiva eden program yazmak istiyorum. Lâkin düzeltemediğim bir hata veriyor.

Kod şu;

/* Yenilemeli fonqsiyonla en küçük elemanı bulma */
#include <stdio.h>
#define BOYUT 100

int enKucukEleman( const int [], int boyut );

int main()
{
int a[ BOYUT ], x, eleman;

for( x = 0; x <= BOYUT - 1; x++ ) /* veri oluşturma */
a[ x ] = 2 * x;

eleman = enKucukEleman( a, BOYUT );

printf( "En küçük eleman: a[ %d ] = %d\n", eleman, a[ eleman ] );

return 0;
}

int enKucukEleman( const int dizi[], int boyut )
{
static int enKucuk = dizi[ boyut - 1 ];
static int mevqi;
if( boyut == 1 )
return mevqi;
else {
if( dizi[ boyut -1 ] <= enKucuk ) {
enKucuk = dizi[ boyut -1 ];
mevqi = boyut -1;
}
enKucukEleman( dizi, boyut - 1 );
}
}


Hata ise;

$ cc try.c
try.c: In function 'enKucukEleman':
try.c:24:23: error: initializer element is not constant
  static int enKucuk = dizi[ boyut - 1 ];


googledn araştırdım, lâkin ingilizcem çok iyi olmadığı için tam çözemedim.

Anladığım kadarıyla static bir değişkene atanacak değerin constant olması lâzımmış.
Fakat constant tam olarak nedir, ve nasıl constant olur bilmiyorum. Kodda büyük değişiklikler
yapmadan, sadece dizi[ boyut - 1 ] değerini tanımladığım static değişkene atayabilmek istiyorum.
Nasıl yapabileceğimi çözebileceğimi bilen varsa yardım ederse çok sevinirim.

Yardımcı olacaklara şimdiden teşekkürler...

ShangriLa

C'de eğer static bir değişkene başlangıçta bir değer yükleyeceksen, yüklenecek değerin sabit static olması gerekir.

Sorununun çözümüne gelirsek, kullandığın enKucuk degiskeni fonksiyon her calismasında değişeceği için static kullanmanın bir anlamı yok.
Ubuntu Mate Trusty

Death Pro

Kardeş buyur hallettim :D

#include <stdio.h>
#define BOYUT 100

int enKucukEleman(int[], int, int, int);

int main() {
int a[BOYUT], x, eleman = 0;

for (x = 0; x <= BOYUT - 1; x++) /* veri oluşturma */
a[x] = 2 * x;

a[5] = -1;
eleman = enKucukEleman(a, BOYUT - 1, a[BOYUT - 1], 0);

printf("En küçük eleman: a[ %d ] = %d\n", eleman, a[eleman]);

return 0;
}

int enKucukEleman(int dizi[], int boyut, int enKucuk, int mevqi) {
if (boyut == 1)
return mevqi;
else {
printf("%d\n", enKucuk);
if (dizi[boyut - 1] <= enKucuk) {
enKucuk = dizi[boyut - 1];
mevqi = boyut - 1;
}
enKucukEleman(dizi, boyut - 1, enKucuk, mevqi);
}
}

bugra9

Alıntı YapKodda büyük değişiklikler yapmadan, sadece dizi[ boyut - 1 ] değerini tanımladığım static değişkene atayabilmek istiyorum.
Nasıl yapabileceğimi çözebileceğimi bilen varsa yardım ederse çok sevinirim.
Bunu yapamazsın ki sorunun kaynağı da bu zaten. Static olarak tanımlanmış bir değişkene ilk değeri olarak sabit (değişken olmayan) bir değer vermelisin yoksa sana gösterdiği gibi bir hata iletisini gösterir. Tabi zaten dizi değişkenini const olarak belirttim niye olmuyor diyebilirsin. Her ne kadar const kelimesini kullansanda c bunu tam anlamıyla sabit değer olarak görmez. C'de sabit değerler define ile tanımlanır.

Örneğin şu tarz yazımlar çalışmayacaktır.

int i = 4;
static int j = i;


const int i = 4;
static int j = i;


Aşağıdaki kullanımlarda çalışacaktır.

static int j = 4;


#define i 4
static int j = i;


Çözüme gelirsek, kodda yapmak istediğin enKucuk değişkenine ilk değer olarak dizi elemanları arasında bulunan en küçük sayıya eşit veya daha büyük bir değer vermek. Bunun için diziden herhangi bir değer atayabileceğin gibi (senin yaptığın gibi ama c kuralları gereği bunu yapamazsın) int ile verilebilecek en yüksek değeri verirsen de istediğine ulaşırsın. Yani,
static int enKucuk = dizi[ boyut - 1 ];
satırındaki dizi[ boyut - 1 ] yerine oldukça büyük bir sabit sayı yazman yeterli.

Bu arada yinelemeli bir fonksiyon içerisinde "global" bir değişken kullanmak pek doğru değil çünkü yinelemeli fonksiyon kullanmanın tüm avantajını kaybediyor. Daha güzel bir kullanımı @Death Pro paylaşmış, teşekkürler.

Erdem

Öz yineleme kullanan bu yöntemi de deneyebilirsin.

#include <stdio.h>

int enKucuk(const int a[], size_t n) {
  if (n <= 1) {
      if (n < 0) return 0;
    return a[0];
  }
  size_t yarim = n / 2;
  int sol = enKucuk(a, yarim);
  int sag = enKucuk(&a[yarim], n - yarim);
  return sol < sag ? sol : sag;
}

int main()
{
    int dizi[6] = {5, 23, -1, 28, 41, 7, 1};
    printf("Dizinin en küçük elemanı: %d", enKucuk(dizi, sizeof(*dizi)));
    return 0;
}