Soru & Cevap

Arduinoda dizi içerisinde dizi oluşturma sorunsalı

04.04.2020 - 12:13
int rub1[]={*1,*2,*3,*4};

int rub3[]={*0,*15,*40,*20};
int *sabancG []={rub1,rub3};
int i,j;

void setup(){
for(i=0;i<2;i++)
  {
    for(j=0;j<4;j++)

    
}
 void loop(){
for(i=0;i<2;i++)
  {
    for(j=0;j<4;j++)
    Serial.println(sabancG[i][j]);
    
    
    }
  
  }

Arduinoda dizi içerisinde dizi oluşturmak ve yazdırmak istedim.Sırasıyla ilk dizinin ilk ,2.,3.ve 4. sonra ikinci dizinin ilk 2.,3.ve 4.elemanını yazdırmak için pointer mantığını kullandım.C dilinde yazılmış bir örneği tekrar yazmaya çalıştım 

int main()
{
int t1[4]={0,1,2,3};      
int t2[4]={4,5,6,7};      
int t3[4]={8,9,10,11};    
int t4[4]={12,13,14,15};  
int *tab[4]={t1,t2,t3,t4};
int i,j,k,l;              
for (i=0; i<4;i++)
{
   for (j=0; j<4; j++)
   {
      printf("%d\t", *(tab[j] + i));
   }
return 0;
}

fakat sorunu tam çözememekle beraber hata mesajında pointer ibaresi('*')için "invalid type argument of unary '*' (have 'int')" hatası veriyor.C de sorunsuz çalışırken buradaki sıkıntı neden ?

2. olarak dizi içerisinde farklı tip diziler de barındırabilir miyim? 

198 Görüntülenme

2 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-158072-1530701953.jpg
TGUNEYSU
04.04.2020 - 04:47

Arduino dünyasında bazı işler aynı C veya C++ gibi değil, ondan aksilikler oluyor.

Kodunuzda, POINTER ve ADDRESS of variable karışmış. Bu en zor anlaşılan konulardan biri.

  • rub1 ve rub3 sizin ARRAY leriniz.
  • sabancG, rub[] array'lerin adreslerini yüklediğiniz bir array, yani onların POINTER' ları. Tipinin ( int * olması gerekiyor)
  • buna koyduğunuz değerler rub array'lerinin başlangıç adresleri olduğu için, her öğeyi &rub1[0] olarak kaydetmeniz gerekiyor; yani     &  = adresi   ,   rub1[0] = rub1 array'in ilk öğesi  --->  ilk öğenin adresi
  • Yazmaya gelince: *(sabancG[i] + j) kullanmak gerekiyor, çünkü :
    - sabancG array'indeki değerler öğe array'lerin başlangıç adresleri
    - sabancG[0] bunun ilk öğesi , yani rub1[] array'in başlangıcı.
    - sabancG[i] + j her rub[] öğelerinin teker teker kendi öğeleri.

    *(sabancG[i] + j) yazdır demek:  sabancG öğesinin POINTER yaptığı adresdeki rub array değeri yaz demek.

Umarım aşağıdaki düzeltilmiş kod yardımcı olur.

int rub1[] = {1,  2,  3,  4};
int rub3[] = { 0, 15, 40, 20};

int *sabancG[2] = {&rub1[0], &rub3[0]};
int i, j;

void setup() {
  Serial.begin(9600);
  for (i = 0; i < 2; i++) {
    for (j = 0; j < 4; j++) {

      Serial.println(*(sabancG[i] + j));
    }
  }
}


void loop() {
}

 

İyi çalışmalar.

Turgut

Görsel kaldırıldı.

 

Profile picture for user ingeniator
ingeniator
04.04.2020 - 02:04
int rub1[]={1,2,3,4};

int rub3[]={0,15,40,20};
int sabancG []={*rub1,*rub3};
int i,j;

void setup(){
}

 void loop(){
for(int i=0;i<2;i++)
  {
    for(int j=0;j<4;j++){
    Serial.println(sabancG[j] + i);
    }
  }
  }

Şu tarz bir yazım yardımcı olabilir.