Thread overview
C lvalue required as left operand of assignment hatası
Aug 10, 2012
erdem
Aug 10, 2012
erdem
Aug 10, 2012
erdem
August 10, 2012

Bir C programını derlemeye çalışırken bu hatayı alıyorum.

Alıntı:

>

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:

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 10, 2012

Alıntı (erdem):

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

>

Yukardaki ifadeyi


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


şeklinde değiştirince derlendi! :)

<http://ehobi.org/resim/resim/test.png>

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
August 10, 2012

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..

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 10, 2012

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]