Değişken içeriğini Adres olarak işaretçiye geçmek.

Başlatan Klein, 20 Ocak 2017, 10:18:59

Klein

işaretçiye adres değeri olarak bir değişkenin içeriğini geçmek istiyorum. fakat GCC kızıyor. C++ ile yapabiliyordum ama GCC yapmıyor. Embitz kullanıyorum.

int x = 100;
int *ptr  = (int)x;

şeklindeki atamaya

error: initializer element is not constant

hatası veriyor. Değişken içeriğini adres değeri olarak kabul etmiyor. Kendince haklı. Çok tehlikeli bir operasyon. Hata vermektense warning vermesini beklerdim.

eğer değişken yerine sabit kullanırsam sorun yok.

int *ptr  = (int)100;

Bu şekilde sorunsuz derleniyor ve çalışıyor.

Bu hatayı kapatacak derleyici direktifi veya yöntem arıyorum.

Not: Çeşit çeşit casting denedim. Hatta iç içe castingler oluşturdum ama nafile.

superconductor

#include <stdio.h>

int main()
{
	int x = 100;
	int *ptr = x;
	
	printf("gcc version: %d.%d.%d\n",__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__);
	return 0;
}


gcc version: 5.4.0

Uyarı ile derliyor: asd.c:6:13: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
  int *ptr = x;



Klein

bir de casting ile
int x = 100;
int *ptr = (int *)(int)x;

şeklinde deneyebilir misiniz?

mufitsozen

Alıntı yapılan: Klein - 20 Ocak 2017, 10:18:59
işaretçiye adres değeri olarak bir değişkenin içeriğini geçmek istiyorum. fakat GCC kızıyor. C++ ile yapabiliyordum ama GCC yapmıyor. Embitz kullanıyorum.

int x = 100;
int *ptr  = (int)x;

şeklindeki atamaya

error: initializer element is not constant

hatası veriyor. Değişken içeriğini adres değeri olarak kabul etmiyor. Kendince haklı. Çok tehlikeli bir operasyon. Hata vermektense warning vermesini beklerdim.

eğer değişken yerine sabit kullanırsam sorun yok.

int *ptr  = (int)100;

Bu şekilde sorunsuz derleniyor ve çalışıyor.

Bu hatayı kapatacak derleyici direktifi veya yöntem arıyorum.

Not: Çeşit çeşit casting denedim. Hatta iç içe castingler oluşturdum ama nafile.

ptr degerini basta initialize ettigniz icin sabit degil diyor, asagidaki gibi yapiniz.



#include <stdio.h>

int main() {
    int x = 100;
   
   
   int *ptr;
   
   ptr = (int *)x;


    printf("\n x=%d,  ptr=%d \n", x, (int)ptr);

   // your code goes here
   return 0;
}
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

superconductor

Böyle hocam:

asd.c:6:13: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
  int *ptr = (int *)(int)x;

mufitsozen

error: initializer element is not constant hatasi derleme sirasinda icerigin belirlenememesinden kaynaklaniyor. diyecektim ama GCC benden akilli tabiiki

   int *ptr= (int *)x; yazincada calisiyor  ;D
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Klein

Yok hocam. Örnek kolay olsun diye init aşamasında yaptım aktarmayı. Nerede yaparsam yapayım derleme hatası alıyorum.

ARM GCC Compiler (EmBitz-Bare-Metal)

gcc version: 5.4.1


Klein

warning - error ayarlarına baktım ama göremedim bunula ilgili bir opsiyon.

C standartı Iso9899:2011  seçili  C99, C98 ne bulduysam denedim.  aynı.

mufitsozen

Alıntı yapılan: Klein - 20 Ocak 2017, 11:23:53
warning - error ayarlarına baktım ama göremedim bunula ilgili bir opsiyon.

C standartı Iso9899:2011  seçili  C99, C98 ne bulduysam denedim.  aynı.

Hocam eminmisiniz bende GCC ile denedim (internetdeki bir online compiler ile prb yok)
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

mufitsozen

eminmisiniz derken bir onceki satirda ; eksiktir yada baska bir warning, yada error vardir once/sonra filan diye sordum

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Klein

Eminim hocam.
Coocox ile denedim. O da GCC kullanıyor ama farklı bir sürüm. O da aynı hatayı veriyor.

Birazdan keil kurup deneyeceğim.

Değişkeni kullanmadıysanız  optimize edip hiç derlemiyor olabilir mi?

Klein

Hocam az önce online derleyici ile ben de denedim.

durum aynı.
prog.c:4:1: error: initializer element is not constant

Derleyici olarak c++ seçersem sorunsuz derleniyor.
C++ ile derlemede sorun yoktu zaten.

mufitsozen

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

serdararikan

#13
Değişkenin başına & koymaniz gerekmiyor mu?

Pardon degiskenin içeriği kısmına dikkat etmemişim

muhittin_kaplan

#14
bende ac6 ile deneyeyim aclipse+gcc kullanıyor.

Doğrudan derledi (warning verdi.)