Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2012-09-30 09:52:45

  Huk - Smoleńsk BULWA!

Huk
Smoleńsk BULWA!
Zarejestrowany: 2006-11-08

C - jakie są dobre praktyki odnosnie alokacji buforów?

Witam.

Szukam, szukam ale coś znaleźć nie mogę. Mam taki problem - przekierowuje sobie cout'a w taki sposób aby móc go odczytać wewnątrz programu. Wszystko działa OK... program wygląda tak:

Kod:

#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
using namespace std;
 
int main()
{
    int bufSize=100;
    
    char buf[bufSize];
    int x[2];
    
    /* Potrzebny nam numer stdout */
    int stdout_num = fileno(stdout);

    /* Kopiujemy deskryptor; będzie nam potrzebny później */
    int stdout_fd = dup(stdout_num);
    
    memset(buf,0,bufSize);    
    
    pipe(x);
    dup2(x[1],fileno(stdout));
    
    if(fork()==0)
    {
        cout << "ABCD" << "\n" << flush;
    }
          else
          {
              read(x[0],buf,bufSize);    
              dup2(stdout_fd, stdout_num);
    
              printf("%s",buf);
          }    
    return 0;
}//end of function main

No i tutaj zaczynają się jajka - nie wiem czy dobrze myślę, w C specem nie jestem - ale chyba dobrą praktyką była by alokacja takiego bufora jaką wielkość ma wiadomość przesłana do cout... pytanie jak to DOBRZE zrobić? Czy da się jakoś pobrać wielkość buffora wykorzystywanego do przechowywania tego co wpada do cout, czy też trzeba iterować na zasadzie:

Kod:

int i=0;
char znak;
        
do
{
    read(x[0],&znak,1);
    ++i;
}
while(znak!='\n');

Nie ma żadnego ładniejszego sposobu? Prośba o info od szpeców od C :)

Pozdro.

Ostatnio edytowany przez Huk (2012-09-30 09:56:10)

Offline

 

#2  2012-09-30 11:11:00

  djjanek - Użytkownik

djjanek
Użytkownik
Skąd: whereis
Zarejestrowany: 2007-11-15
Serwis

Re: C - jakie są dobre praktyki odnosnie alokacji buforów?

Specjalistą też nie jestem ale string.h chyba należy do C++, a jak już go wykorzystujesz to ja bym zrobił zapisywanie do zmiennej string i się nie męczył z odczytywaniem. Jak dobrze pamiętam w string na pozycji 0 masz ile znaków ma string. dodatkowo nie powinni być:

Kod:

...      
do
{
    read(x[i],&znak,1);
    ++i;
}
...

Ostatnio edytowany przez djjanek (2012-09-30 11:11:40)

Offline

 

#3  2012-09-30 11:28:38

  Huk - Smoleńsk BULWA!

Huk
Smoleńsk BULWA!
Zarejestrowany: 2006-11-08

Re: C - jakie są dobre praktyki odnosnie alokacji buforów?

@djjanek:

Ojj sorry nie patrz na nagłówki do końca, to programik strasznie rozwalony na którym testuję mieszankę - stąd tam nagłówki C++ są. W realnej aplikacji ma być czysty C - C++ wykluczony.

Pozdro.

Offline

 

#4  2012-10-02 01:50:00

  marc - Użytkownik

marc
Użytkownik
Zarejestrowany: 2012-09-09

Re: C - jakie są dobre praktyki odnosnie alokacji buforów?

Nie tylko string nalezy do C++. Cout, etc to C++. C to printf, scanf, etc. C++ jest nabudowane na C, ale wiele rzeczy sie rozni. W jakim jezyku ostatecznie piszesz?

Offline

 

#5  2012-10-02 06:19:01

  Huk - Smoleńsk BULWA!

Huk
Smoleńsk BULWA!
Zarejestrowany: 2006-11-08

Re: C - jakie są dobre praktyki odnosnie alokacji buforów?

@marc:

Ja to wiem, wierz mi ;] programik który był zamieszczony to zlepek C i C++ (a wcześniej jeszcze QT), ale cała sprawa rozchodzi się o to jak to robić w czystym C.

Pozdro.

Offline

 

#6  2012-10-02 10:31:29

  marc - Użytkownik

marc
Użytkownik
Zarejestrowany: 2012-09-09

Re: C - jakie są dobre praktyki odnosnie alokacji buforów?

Aha, to pardon moi ;) tak sie po prostu zdziwilem troche, bo sam kiedys programowalem w C++, dzis w C [ale nie jestem ekspertem, a hobbysta].

Offline

 

#7  2012-10-02 18:57:58

  Piotr3ks - Też człowiek :-)

Piotr3ks
Też człowiek :-)
Zarejestrowany: 2007-06-24

Re: C - jakie są dobre praktyki odnosnie alokacji buforów?

Moim zdaniem tutaj nie ma zbytniego sensu żeby alokować dynamicznie bufor, bo:
- pipe jest ograniczony i tak przez system

Kod:

$ ulimit -a | grep "pipe size"
pipe size            (512 bytes, -p) 8

- nie da się jednoznacznie sprawdzić wielkości danych z pipe'a bez ich odczytania

Offline

 

#8  2012-10-03 07:55:32

  Huk - Smoleńsk BULWA!

Huk
Smoleńsk BULWA!
Zarejestrowany: 2006-11-08

Re: C - jakie są dobre praktyki odnosnie alokacji buforów?

@Piotr3ks:

No właśnie o to mi chodzi. Generalnie zastanawiam się po prostu, jak pisać programy w C - skoro wszystko trzeba robić ręcznie.

Realnie chodzi o to że w swoim śmiesznym pluginie do ALSY, muszę zaczytać to co wypluje komenda:

Kod:

lsof -F p /dev/snd/pcmC0D0p

Raz powyższe zwróci 0, raz 8 a raz 120 znaków - no i pytanie o dobre praktyki przy zaczytywaniu tego. W C++ robimy to dynamicznie i problemu nie ma, ale w C trzeba zaalokować pamięć i robią się jajka, bo albo robię "na pałę" jakiś buffor w stylu:

Kod:

char commandOutput[1024];

Co IMHO - z punktu widzenia programisty C++ - jest "bee", bo zawsze może się przepełnić. Albo dwa razy czytam tego samego pipe'a - raz do ustalenia wielkości, raz do zaczytania realnej zawartości. Pytanie które jest uważane przez programistów C, za dobrą praktykę? Jak dla mnie oba powyższe są do kitu, stąd pytanie, więc może jest jeszcze jakieś podejście lepsze? :)

Pozdro.

Offline

 

#9  2012-10-03 09:20:38

  milyges - inż.

milyges
inż.
Skąd: Gorlice/Kraków
Zarejestrowany: 2006-04-09
Serwis

Re: C - jakie są dobre praktyki odnosnie alokacji buforów?

Alokujesz bufor np. na 1024, czytasz 1024 znaki do niego, jeżeli odczytałeś równe 1024, robisz realloc() + 1024, czytasz znów 1024 bajty do bufora przesuniętego od poczatku o 1024, i tak w pętli poza krokiem 1 ;)
Pozdro

Offline

 

#10  2012-10-03 18:23:58

  HAL9000 - Użytkownik

HAL9000
Użytkownik
Zarejestrowany: 2006-04-22

Re: C - jakie są dobre praktyki odnosnie alokacji buforów?

Opis pojemników Qt, w paragrafie "Growth Strategies" jest coś do poczytania na temat realokacji
http://qt-project.org/doc/qt-4.8/containers.html


For some reason I'm thinking I'm still 25 but I act like I'm 12.

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)