İç içe struct yapılar

merhaba arkadaşlar,ödev yaparken ‘’[Error] request for member ‘list’ in something not a structure or union.’’ hatasıyla karşılaşıyorum. Düzeltemedim göz atarsanız çok sevinirm DEVC++ kullanıyorum.

#include<stdio.h>
#include<string.h>
struct exItem{
double max;
double min;
double average;
char name[3];
};
struct exRate{
int ay;
struct exItem list[3];
};
int main(){
struct exRate ay[10];
struct exItem list[3];
printf(“ay?\n”); // ay girişi sıralı varsayılabilir.
scanf("%d",&ay[i]);
printf(“Item adi,max,min ve average degerleri?\n”); // değerler sırayla olmak zorunda değil
scanf("%lf %lf %lf %s",&ay.list.average,&ay.list.max,&ay.list.min,ay.list.name);

}

return 0;
}

Merhaba, baya yanlışınız var.

öncelikle aşağıdaki kodunuza bir çekidüzen verelim.

clang-format --style webkit -i ays2.c

ays2.c

#include <stdio.h>
#include <string.h>
struct exItem {
    double max;
    double min;
    double average;
    char name[3];
};
struct exRate {
    int ay;
    struct exItem list[3];
};
int main()
{
    struct exRate ay[10];
    struct exItem list[3];
    printf("ay?\n"); // ay girişi sıralı varsayılabilir.
    scanf("%d", &ay[i]);
    printf("Item adi,max,min ve average degerleri?\n"); // değerler sırayla olmak zorunda değil
    scanf("%lf %lf %lf %s", &ay.list.average, &ay.list.max, &ay.list.min, ay.list.name);
}

return 0;
}

Şİmdi de hata çıktılarına bir göz atalım.

gcc -std=c99 -Wall -Werror ays2.c -o ays2

yazdım ve sonuçlar:

ays2.c: 'main' işlevinde:
ays2.c:18:21: hata: 'i' undeclared (first use in this function)
   18 |     scanf("%d", &ay[i]);
      |                     ^
ays2.c:18:21: bilgi: each undeclared identifier is reported only once for each function it appears in
ays2.c:20:32: hata: '(struct exRate *)&ay' is a pointer; did you mean to use '->'?
   20 |     scanf("%lf %lf %lf %s", &ay.list.average, &ay.list.max, &ay.list.min, ay.list.name);
      |                                ^
      |                                ->
ays2.c:20:50: hata: '(struct exRate *)&ay' is a pointer; did you mean to use '->'?
   20 |     scanf("%lf %lf %lf %s", &ay.list.average, &ay.list.max, &ay.list.min, ay.list.name);
      |                                                  ^
      |                                                  ->
ays2.c:20:64: hata: '(struct exRate *)&ay' is a pointer; did you mean to use '->'?
   20 |     scanf("%lf %lf %lf %s", &ay.list.average, &ay.list.max, &ay.list.min, ay.list.name);
      |                                                                ^
      |                                                                ->
ays2.c:20:77: hata: '(struct exRate *)&ay' is a pointer; did you mean to use '->'?
   20 |     scanf("%lf %lf %lf %s", &ay.list.average, &ay.list.max, &ay.list.min, ay.list.name);
      |                                                                             ^
      |                                                                             ->
ays2.c:16:19: hata: 'list' değişkeni kullanılmamış [-Werror=unused-variable]
   16 |     struct exItem list[3];
      |                   ^~~~
ays2.c:15:19: hata: variable 'ay' set but not used [-Werror=unused-but-set-variable]
   15 |     struct exRate ay[10];
      |                   ^~
ays2.c: Üst düzeyde:
ays2.c:23:1: hata: expected identifier or '(' before 'return'
   23 | return 0;
      | ^~~~~~
ays2.c:24:1: hata: expected identifier or '(' before '}' token
   24 | }
      | ^
cc1: all warnings being treated as errors

Tek tek hatalara bakalım şimdi:

ays2.c:18:21: hata: 'i' undeclared (first use in this function)
   18 |     scanf("%d", &ay[i]);
      |                     ^

Burada i diye bir değişken yok. derleyici de zaten ne diyor: ‘i’ undeclared

ays2.c:20:32: hata: '(struct exRate *)&ay' is a pointer; did you mean to use '->'?
   20 |     scanf("%lf %lf %lf %s", &ay.list.average, &ay.list.max, &ay.list.min, ay.list.name);
      |                                ^
      |                                ->
ays2.c:20:50: hata: '(struct exRate *)&ay' is a pointer; did you mean to use '->'?
   20 |     scanf("%lf %lf %lf %s", &ay.list.average, &ay.list.max, &ay.list.min, ay.list.name);
      |                                                  ^
      |                                                  ->
ays2.c:20:64: hata: '(struct exRate *)&ay' is a pointer; did you mean to use '->'?
   20 |     scanf("%lf %lf %lf %s", &ay.list.average, &ay.list.max, &ay.list.min, ay.list.name);
      |                                                                ^
      |                                                                ->
ays2.c:20:77: hata: '(struct exRate *)&ay' is a pointer; did you mean to use '->'?
   20 |     scanf("%lf %lf %lf %s", &ay.list.average, &ay.list.max, &ay.list.min, ay.list.name);

ay.list.average ifadesi baya yanlış bir ifade . main fonksiyonu içindeki ay bir struct değil, struct dizisi, yani ay yerine ay[0] gibi kullanman lazım. Hadi ay[0] şeklinde kullandık diyelim. Bu sefer yine bir sorunumuz var: ay.list.average

ay[0].list[0].average şeklinde kullanmalısın. çünkü ay[0] daki list, bir struct değil, bir struct dizisi

ays2.c: Üst düzeyde:
ays2.c:23:1: hata: expected identifier or '(' before 'return'
   23 | return 0;
      | ^~~~~~
ays2.c:24:1: hata: expected identifier or '(' before '}' token
   24 | }

Göründüğü üzere

[ . . .]
int main()
{
    struct exRate ay[10];
    struct exItem list[3];
    printf("ay?\n"); // ay girişi sıralı varsayılabilir.
    scanf("%d", &ay[i]);
    printf("Item adi,max,min ve average degerleri?\n"); // değerler sırayla olmak zorunda değil
    scanf("%lf %lf %lf %s", &ay.list.average, &ay.list.max, &ay.list.min, ay.list.name);
}

return 0;
}

[ . . . ]

return 0; ifadesi main fonksiyonunun içinde olmalıydı.

Şimdi şu hataları bir düzeltelim ve son duruma şöyle bir göz atalım.

Kodun hatalardan düzeltilmiş hali.

#include <stdio.h>
#include <string.h>
struct exItem {
    double max;
    double min;
    double average;
    char name[3];
};

struct exRate {
    int ay;
    struct exItem list[3];
};

int main()
{
    struct exRate ay[10];
    /*Asagidaki satırda list degiskenini tanımlamış ama kullanmamıssın
       Bu yüzden struct exItem list[3] satırını iptal ediyoruz.
    */
    //struct exItem list[3];
    
    printf("ay?\n"); // ay girişi sıralı varsayılabilir.
    scanf("%d", &ay[0].ay);

    printf("Item adi,max,min ve average degerleri?\n"); // değerler sırayla olmak zorunda değil
    
    scanf("%lf %lf %lf %s", &ay[0].list[0].average, &ay[0].list[0].max, &ay[0].list[0].min, ay[0].list[0].name);
    return 0;
}

Benden sana birkaç tavsiye:

  • Kodunun girintilerine özen ver. Yoksa nerede hata yaptığını görmen baya zorlaşabilir. Okunaklı kod çoğu zaman hayat kurtarır.
    (Bunu şu anlık dikkate almayabilirsin, cmd yle felan haşır neşir ol o zaman dikkate alabilirsin) Eğer kodunun görünümünü güzelleştirmek istiyorsan
clang-format --style webkit -i ays.c

Şeklinde kullanabilirsin. Baya hoş bir araç.

  • Hata çıktıları, bizim hatalarımızı bulmamıza yarar, onları iyi oku, ne demek istiyor bir kulak ver.

  • Bir foruma soru sorarken hata çıktısını da atman, ne yaptığını ne ettiğini vs. açıklaman cevaplayan için baya faydalı olacaktır, en azından vakit kaybımız daha da azalır.

İyi geceler.

3 Beğeni

Çok teşekkür ederimm,düzelttim.

1 Beğeni

Rica ederim kolay gelsin.