On Tuesday, 24 May 2022 at 13:42:44 UTC, Ali Çehreli wrote:
> On 5/23/22 22:26, Salih Dincer wrote:
[...] Şu program açıklayıcı olabilir:
import std.stdio;
import core.stdc.stdlib;
struct S {
int i;
}
[...]
Hocam D'nin gözünü seveyim bea! Kodu C'de yazayım dedim o tutorial senin burdaki benim uğraştım durdum 😀
Neyse, bu örnek çok iyi oldu. Neticede bilgilerimizi tazeledik. Hele ki bunca seneden sonra, devamının olduğunu bildiğimiz bir işaretçi üzerinde, sanki bir diziymiş gibi kullanılabildiğini öğrenmek güzeldi.
Ben de D özelliği zannediyordum, teşekkürler...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct S {
  int8_t id;
  char name[6]; // 5 + 1(\0)
};
const int CITY = 35;
int main()
{
  int n = 0;
  struct S s, *ptr;
  ptr = (struct S*) malloc(CITY * sizeof(struct S));
  printf("ilk adresi: %p\n", ptr); // 0x55aca99ec260
  for(int i = 0; i < CITY; ++i)
  {
    ptr[i].id = i + 1;
  }
  printf("plaka kodu: %d\n", ptr[n].id);
  strcpy(ptr[n].name, "adana");
  printf("ilin ismi : %s\n", ptr[n].name);
  n = CITY - 1;
  printf("plaka kodu: %d\n", ptr[n].id);
  strcpy(ptr[n].name, "izmir");
  printf("ilin ismi : %s\n", ptr[n].name);
  for(int i = 0; i < CITY; ++i)
  {
    printf("%d: %s\n", ptr[i].id, ptr[i].name);
  }
  printf("son adresi: %p\n", &ptr[n]); // 0x55aca99ec34e
/* Son adresinden (...34e) ilk adresi (...260)'ı çıkarınca
 * 0xEE kalıyor ki bu onluk 238 demek ve bunu 34'e bölünce 7
 * değeri bulunuyor. Yani S yapısı 1 + 6 baytdan oluşuyor.
 */
  s = ptr[0];
  ptr[0].id = 0;
  printf("%s'nın plaka kodu: %d\n", s.name, s.id);
  return 0;
} /* ÇIKTISI:
ilk adresi: 0x55aca99ec260
plaka kodu: 1
ilin ismi : adana
plaka kodu: 35
ilin ismi : izmir
1: adana
2:
3:
...
35: izmir
son adresi: 0x55aca99ec34e
adana'nın plaka kodu: 1
*/