Orta/İleri Seviye C Bilen Var Mı?

  • Konuyu Başlatan Konuyu Başlatan turkmen
  • Başlangıç tarihi Başlangıç tarihi

turkmen

Üye
30 Eki 2023
62
54
18
Arkadaşlar herkese merhaba,
özellikle unistd.h gibi standart library ile kod yazabilen. C'ye hakim birileri var mı acaba forumda? Sadece "hello world" yazdırmaktan bahsetmiyorum. Kendi "printf" fonksiyonunu sıfırdan yazabilecek derecede C bilgisi olan birileri lazım bir proje için. Eğer hiç yoksa ve istek gelirse ben belki C ile kodlama hakkında videolar çekebilir ve forumda paylaşabilirim. Özellikle gömülü sistemlere ilgisi olan arkadaşların hoşuna gidebilir.
 
discord sayfasında aslında bunun için bir toplantı yapabilirsin. sanırım kodçu arkadaşlar olacaktı. Ayrıca forumda yazılım sayfası için kategori açabilirim. orada senin desteğin iyi olur
 
katılıyorum yazılım hakkında ayrıca bir başlık açılabilir. Belki yaşı da bana yakın üniversiteli veya mühendis arkadaşlar vs varsa onlarla da kaynaşmış oluruz.
 
Açıkçası programlama için daha detaylı alt başlıklar olabilir diye düşünüyorum. Programlama Genel veya Programlama Dilleri adında bir başlık uygun olabilir.
 
Selam dostum, C++ yazılım geliştiricisi olarak çalışmaktayım ama daha öncesinde embedded tarafta C ile de çalıştım. Bildiğim ve yardımcı olabileceğim bir şey varsa destek olabilirim.
Merhaba öncelikle çok sevindim. Zaten c++ bilginiz anlatacağım proje için yeterli olacaktır diye düşünüyorum. Direkt yapmak istediğim şeyle başlayayım. Benim istediğim char *getnextline(int fd); prototipinde bir fonksiyonum olacak. Bu fonksiyonumda sadece malloc, free ve read fonksiyonlarını kullanabilirim. Olay şu: File descriptor değeri olarak gönderdiğim fd değerini read fonksiyonumda kullanarak Buffer_sıze miktarı kadar burası çok önemli satır satır okuma yapacağım yani \n görene kadar okuma yapacağım. Buradaki püf nokta şu ben fonksiyonu her çağırdığımda tek satır okuyacak. Yani ben buffer_sıze olarak 100 gönderdim ve 20 karakterlik veri var diyelim yine bana satır satır okuyacak ama buffer size olarak 10 gönderdim diyelim ve her 10 karakterde bir boşluk var diyelim ve 30 karakter var diyelim o zaman her çağırdığımda 10 karakter okuyacak. Buradaki sıkıntı şu statik değişken olarak read'den dönen okunmuş değeri tutuyorum. Ama read her çağrıldığında bir sonraki 10 karakteri okuyor. Ama bu sefer eskiden tuttuğum karakterleri yazdırmadan read diğer kısmı okumuş oluyor. Anlatınca çok karmaşık geldi. En iyisi kod örneği veriyim. Bir de kodda leak olmaması lazım. O yüzden free'lememiz şart.
C:
char    *get_next_line(int fd)
{
    int            readed;
    static char    bufstr[BUFFER_SIZE];
    static int    cursor = 0;
    size_t        i;
    char        *str;

    i = -1;
    str = (char *)malloc((BUFFER_SIZE + 1) * sizeof(char));
    if (!str)
        return (NULL);
    readed = read(fd, bufstr, BUFFER_SIZE);
    if ((readed == 0 && bufstr[cursor] == 0) || readed < 0 || BUFFER_SIZE <= 0
        || fd < 0)
        return (free(str), NULL);
    while (++i, i < BUFFER_SIZE)
    {
        str[i] = bufstr[cursor];
        if (bufstr[cursor] == '\n')
            break ;
        cursor++;
    }
    cursor++;
    str[i + 1] = 0;
    return (str);
}

.h dosyası
C:
#ifndef GET_NEXT_LINE_H
# define GET_NEXT_LINE_H

# ifndef BUFFER_SIZE
#  define BUFFER_SIZE 42
# endif

char    *get_next_line(int fd);
#endif
Main kısmı:
C:
#include <fcntl.h>
#include <stdio.h>

int    main(void)
{
    int fd;

    fd = open("test.txt", O_RDONLY);
    printf("%s", get_next_line(fd));
    printf("%s", get_next_line(fd));
    printf("%s", get_next_line(fd));
    printf("%s", get_next_line(fd));
    printf("%s", get_next_line(fd));
    printf("%s", get_next_line(fd));
    printf("%s", get_next_line(fd));
    printf("%s", get_next_line(fd));
    printf("%s", get_next_line(fd));
    close(fd);
}
 
şöyle yapayım direkt örnek üzerinden anlatıyım ben
iki tane kritik durum var onun üzerinden gideceğim ilk olarak benim kendi kodumda hallettiğim kısım olan
diyelim ki buffer_sıze okuyacağımız text'den büyük durumu o zaman zaten başta buffer_sıze kadar bir char dizisi oluştuğu için tüm okunan karakterler oraya atılıyor ve ben fonksiyonu her çağırdığımda yeni satıra kadar olan kısım okunuyor. Ve eğer yeni satır yoksa null dönüyor. Bunda sorun yok. Ama diyelim ki bizim buffer_sıze'ımız okuyacağımız karakter sayısından küçük. O zaman nasıl yapacağım onu çözemedim. Buffer sıze ne olursa olsun benim text dosyamdaki içeriğin tamamını okumam lazım. Buffer_size 1 de versem bu sefer 1'er 1'er okuma yapacak ama yine de ben fonksiyonu her çağırdığımda o ilk satırı okuyacak. Yani buffer'i 1 de versem ben get_next_line fonksiyonumu çağırdığımda text dosyasının ilk satırında diyelim ki "merhaba" yazıyor o "merhaba" çıktısı bana dönecek. Bu durumda da farklı if şartları ile buffer_size'i kontrol etmem \n görene kadar bir yerde o karakterleri tutmam lazım. Ama bu sefer de sorun şurda oluyor diyelim ki buffer_size 1 ama ben read'i her çağırdığımda bir sonraki karaktere geçiyor o zaman \n görene kadar read'i çağırıp toplam kaç karaktere ihtiyacım olduğunu bulup mallocla yer açtım diyelim o zaman da sorun şu oluyor read'i her çağırdığımızda bir sonraki karaktere baktığı için bu sefer tekrardan ilk karaktere nasıl baktıracağız. Ama ana fikri anlamışsınızdır buffer_size ne olursa olsun ben text dosyamdaki her bir satırı fonksiyon her çağrıldığında bir satır olacak şekilde okumam ve döndürmem gerekiyor. Ayrıca tabii ki kodda leak olmaması gerekiyor.
 
Biraz karışık açıkçası, dosyalarla ilgili işlem yapan POSIX fonksiyonlarını da tam olarak hatırladığımı söyleyemem ama çok kısa şöyle bir kod yazdım belki bir fikir verebilir. lseek fonksiyonuyla dosya konum göstericisini ayarlamak işinize yarayabilir. Tabi lseek fonksiyonuna geçeceğiniz değer fonksiyonda statik olarak tanımlı olmalı ve read fonksiyonuyla BUFFER_SIZE kadar her okuma yaptığınızda da lseek'e geçeceğiniz değeri güncellemeniz gerekir. Ben yazdığım fonksiyonda tüm satırı alıp null karaktere bakma kodunu zaten orası işin görece daha basit tarafı olduğu için eklemedim. Bir yandan vakit bulunca daha detaylı da bakmaya çalışacağım.

C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>

#define BUFFER_SIZE 10

char* get_next_line(int fd)
{
    char* str;
    int result;
    char buf[BUFFER_SIZE + 1];
    static int lastReadIndex = 0;

    lseek(fd, lastReadIndex, SEEK_SET);
    /*if ((str = (char*)malloc(BUFFER_SIZE + 1)) == NULL)
        return NULL;*/

    if ((result = read(fd, buf, BUFFER_SIZE)) == -1)
        return NULL;

    buf[result] = '\0';
    lastReadIndex += result;

    printf("****************\n");
    printf("%s", buf);
    printf("\n****************\n\n");

    return NULL;
}

int main(void)
{
    int fd;

    if ((fd = open("test.txt", O_RDONLY)) == -1) {
        fprintf(stderr, "open:%s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }

    get_next_line(fd);
    get_next_line(fd);
    get_next_line(fd);
    get_next_line(fd);
    get_next_line(fd);

    close(fd);
}
güzel fikir ama bizim dökümantasyonda özellikle belirtildiği üzere lseek kullanmak da yasak :) Hile olarak görüyor. Ayrıca normalde fonksiyon içinde printf vs de yasak ama main'de testlerimizi yazdırmak amaçlı kullanabiliriz. Sadece read, malloc, free bu 3 fonksiyonu kullanabiliriz. Hatta direkt dökümanın linkini koyayım daha detaylı bakmak isterseniz güzel kafa açan bir proje. Dökümantasyon