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.