Orta/İleri Seviye C Bilen Var Mı?

turkmen

2 GHz Mod
2 GHz
Katılım
30 Eki 2023
Mesajlar
62
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.
 

Frekans

Frekans TV
Yönetici
Katılım
28 Eki 2023
Mesajlar
171
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
 

turkmen

2 GHz Mod
2 GHz
Katılım
30 Eki 2023
Mesajlar
62
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.
 

Frekans

Frekans TV
Yönetici
Katılım
28 Eki 2023
Mesajlar
171
Bu alanlar yeterli mi ek başlık lazım mı?

 

turkmen

2 GHz Mod
2 GHz
Katılım
30 Eki 2023
Mesajlar
62
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.
 

Frekans

Frekans TV
Yönetici
Katılım
28 Eki 2023
Mesajlar
171
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.
bana yazabilirsin ya da txt olarak atabilirsin dediğin kategori ya da forum düzenlemesi yaparım
 

dutyfree

New member
Katılım
13 Kas 2023
Mesajlar
3
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.
 

turkmen

2 GHz Mod
2 GHz
Katılım
30 Eki 2023
Mesajlar
62
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);
}
 

dutyfree

New member
Katılım
13 Kas 2023
Mesajlar
3
Problemi tam olarak anlayamamış olabilirim. Öncelikle şimdi sizin text dosyanızda diyelim ki her satırda 40 ile 50 karakter aralığında yazılar var. Eğer buffer_size olarak 50'den büyük bir değer geçerseniz satırdaki tüm satırı bufferınıza almak istiyorsunuz. Ancak örnek olarak her satırda diyelim ki 50 karakter var buffer_size olarak da 20 geçtiniz, satırdaki ilk 20 karakteri okuyup bufferınıza aldınız daha sonraki çağrıda en son okuduğunuz yerden satır sonuna kadar bir 20 karakter daha okudunuz bir sonraki çağrıda ise kalan 10 karakteri okumak istiyorsunuz değil mi ? Doğru mu anlamışım ?
 

turkmen

2 GHz Mod
2 GHz
Katılım
30 Eki 2023
Mesajlar
62
şö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.
 

dutyfree

New member
Katılım
13 Kas 2023
Mesajlar
3
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);
}
 
Son düzenleme:

turkmen

2 GHz Mod
2 GHz
Katılım
30 Eki 2023
Mesajlar
62
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
 

Son konular

Üst