запомнить несколько выходов в строковом массиве - PullRequest
0 голосов
/ 15 мая 2018

Мне нужно получить различную информацию о времени отправки character из родительского процесса в процесс child.Каждую секунду у меня будет array, в котором будет храниться количество раз, которое был получен конкретный символ.

Однако моя проблема в том, что я не знаю, как отправить всю эту информацию в канал обратно к родителюобрабатывать как ответ.

Я пытаюсь сделать следующее:

char caracter;
int number;

while((number = read(pipe1[0], &character, 1) > 0)) 
    stats[position] += number;  
close(pipe1[0]); 

Теперь мне нужно отправить значения в:

stats[0]+stats[1]+stats[2]+stats[3]+stats[4],stats[0],stats[1],stats[2],stats[3],stats[4]

на pipe2.

Я хочу отправить его через:

write(pipe2[1], [stats values] ,strlen([stats values]));

Я не знаю, как запомнить все за один array, а затем уметь печатать отдельно количество разперсонаж был прочитан вторым.Я должен упомянуть, что я не могу знать заранее, как долго будет этот массив.

Может кто-нибудь мне помочь?

1 Ответ

0 голосов
/ 15 мая 2018

Одна из идей здесь: если вам нужен массив, который может содержать количество значений, о которых вы не знаете заранее, вы можете использовать простую реализацию расширяемого буфера.

Здесь Buf - это структура, которая использует поле len и cap для определения количества пространства, оставшегося в буфере, прежде чем ему нужно будет вызвать realloc и развернуть, чтобы добавить больше места.

#include <stdio.h>
#include <stdlib.h>


// C dynamic buffer

//checks if buffer is full.
#define Buf_FULL(buf) (buf->len == buf->cap)

// Macro to expand buffer.
#define Buf_EXPAND(buf, amount) \
        buf->cap += amount; \
        buf = realloc(buf, sizeof(Buf) + buf->cap)


typedef struct
{
  size_t len;
  size_t cap;
  int data[0];
} Buf;

Buf* Buf_new(size_t capacity)
{
  Buf* newb = malloc(sizeof(Buf) + capacity);
  newb->len = 0;
  newb->cap = capacity;
  return newb;
}

void Buf_write(Buf* buf, int num)
{
  if(Buf_FULL(buf)) Buf_EXPAND(buf, 10);
  buf->data[buf->len++] = num;
}

int main(void)
{
  Buf* foo = Buf_new(10);
  Buf_write(foo, 50);
  Buf_write(foo, 10);
  return 0;
}

Затем вы можете прочитать значения типа int с помощью доступа к b->data[i], как если бы вы использовали обычный массив. Поле int data[0]; является фиктивным указателем, который позволяет массиву получать доступ к любому размеру, который передается в malloc. Это означает, что вы можете использовать кучную память для создания массива любого начального размера, который вы выберете.

Примечание : Вам также необходимо освободить буфер с помощью free, когда вы закончите его использовать.

...