Forum: Diğer Konular RSS
C lvalue required as left operand of assignment hatası
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: C lvalue required as left operand of assignment hatası
Bir C programını derlemeye çalışırken bu hatayı alıyorum.

hata: lvalue required as left operand of assignment

Derleme sonuçlarına baktığımda bu BITMAP * ile başlayan satırlarda hata verdiğini görüyorum.

    i = mapnumblockstr; while (i) {
        ((BITMAP *) myblkstrpt->bgoff) = abmTiles[myblkstrpt->bgoff];
        if (myblkstrpt->fgoff!=0)
            ((BITMAP *) myblkstrpt->fgoff) = abmTiles[myblkstrpt->fgoff];
        if (myblkstrpt->fgoff2!=0)
            ((BITMAP *) myblkstrpt->fgoff2) = abmTiles[myblkstrpt->fgoff2];
        if (myblkstrpt->fgoff3!=0)
            ((BITMAP *) myblkstrpt->fgoff3) = abmTiles[myblkstrpt->fgoff3];
        myblkstrpt++; i--;
    }
Burada kullanılan değişken bildirimleri de şu şekilde.
typedef struct {                /* Structure for data blocks */
    long int bgoff, fgoff;            /* offsets from start of graphic blocks */
    long int fgoff2, fgoff3;         /* more overlay blocks */
    unsigned long int user1, user2;    /* user long data */
    unsigned short int user3, user4;    /* user short data */
    unsigned char user5, user6, user7;    /* user byte data */
    unsigned char tl : 1;                /* bits for collision detection */
    unsigned char tr : 1;
    unsigned char bl : 1;
    unsigned char br : 1;
    unsigned char trigger : 1;            /* bit to trigger an event */
    unsigned char unused1 : 1;
    unsigned char unused2 : 1;
    unsigned char unused3 : 1;
} BLKSTR;
 
BITMAP ** abmTiles = NULL;
short int mapblockstrsize, mapnumblockstr, mapnumblockgfx;
myblkstrpt = (BLKSTR *) mapblockstrpt;
char * mapblockstrpt = NULL;
stackoverflow'da incelediğim bir çözümdeki gibi üstteki ifadeyi bu şekilde yaptığımda derleniyor ama program çöküyor. Programcının burada karşılaştırma yerine bir değer atama yapmak istediği açık:

        ((BITMAP *) myblkstrpt->bgoff) == abmTiles[myblkstrpt->bgoff];

Sizce hata nerede olabilir  :huh:
erdem (Moderatör) #2
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
erdem:
        ((BITMAP *) myblkstrpt->bgoff) = abmTiles[myblkstrpt->bgoff];

Yukardaki ifadeyi

        ( myblkstrpt->bgoff) = (BITMAP *)abmTiles[myblkstrpt->bgoff];

şeklinde değiştirince derlendi! :)

[Resim: http://ehobi.org/resim/resim/test.png]
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Derleyici haklı. Aynı hatayı şu kodda da görüyoruz:

    long int bgoff = 0;
    int i = 0;
    (int *)bgoff = &i;

bgoff'un değeri ile geçici bir 'int*' oluşturuluyor ve ona i'nin adresi atanmaya çalışılıyor. '(int*)' ile elde edilen geçici gösterge lvalue değildir. (lvalue'nun kaba tanımı "adresi alınabilen şey"dir ve geçici değişkenlerin adresi alınamaz.)

Ali
erdem (Moderatör) #4
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Açıklama için teşekkürler.

O zaman bu kodun derlenebilir sürümü de şu şekilde sanırım.
 
#include <stdio.h>
 
int main()
{
    long int bgoff = 0;
    int i = 0;
 
    /*
      Derleyici hatası
      "lvalue required as left operand of assignment"
      (int *)bgoff = &i;
    */
    bgoff = (int) &i;
}

İlk ifadenin sol tarafı bir BITMAP* olduğu için bu türe dönüştürmüşüz anladığım kadarıyla..
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-21, 12:58:56 (UTC -08:00)