Советы по расщеплению строк для скорости в C - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть массив символов (uint8_t), который имеет размер 3060. Это происходит от чтения файла CSV, для каждой строки которого есть 51 байт данных. Я хочу, чтобы это было разделено, чтобы я мог получить эти данные 51 байт за раз. Итак, я хочу 0-51, затем 52-102 и т. Д. c.

Что я собираюсь сделать с этим, то отправить эти данные через соединение Bluetooth GATT у меня работает. Можно ли запоминать часть этого массива, например:

memcpy(my3060_data[0-50],data_to_send_1,sizeof(data_to_send_1));

Тогда l oop значение до 3060?

Поэтому я хочу, чтобы этот процесс быть быстрым, любой совет?

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

Я хочу, чтобы этот процесс был быстрым, любой совет?

Прочитайте файл с 1 fread(). Самое большое место для экономии времени - эффективная операция ввода-вывода.

Это до того, как OP "У меня есть массив chars(uint8_t), который имеет размер 3060", но это будет более полезно для ускорения что в последующем коде более незначительный твик кода.

#define DATA_SIZE 3060
uint8_t data[DATA_SIZE+1];  // One more to detect too large a file.
if (DATA_SIZE == fread(data, 1, sizeof data, CSV_file)) {
  // Success
} else {
  // Oops
}

OP memcpy(), безусловно, не так.

// Bad
// memcpy(my3060_data[0-50],data_to_send_1,sizeof(data_to_send_1));

// More like
#define LINE_SIZE 51
for (int index = 0; index < DATA_SIZE; index += LINE_SIZE) {

  uint8_t data_to_send_1[LINE_SIZE];
  memcpy(data_to_send_1, &my3060_data[index], LINE_SIZE);
  send_it(data_to_send_1, LINE_SIZE);

  // OR skip the copy

  send_it(&my3060_data[index], LINE_SIZE);
}
0 голосов
/ 16 апреля 2020

Если вы можете читать файл CSV построчно, вы можете сделать что-то вроде:

char buffer[100];
FILE *fptr;
if ((fptr = fopen("file_to_open.csv", "r")) = NULL) 
{
    printf("Error! opening file");
    // Program exits if file pointer returns NULL.
    exit(1);
}


while(fscanf(fptr, "%[^\n]", buffer)!=EOF)
{
//process buffer
}
fclose(fptr);
0 голосов
/ 16 апреля 2020

Использование al oop упростит процесс. Например:

#include <stdint.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
    uint8_t buffer[52], chunkSize, data[3060];
    uint16_t processed = 0;

    while(processed < sizeof(data))
    {
        if((processed + sizeof(buffer)) < sizeof(data))
            chunkSize = sizeof(buffer);
        else
            chunkSize = sizeof(data) - processed;

        printf("%u, ", chunkSize);

        memcpy(buffer, data + processed, chunkSize);
        processed += chunkSize;
    }
    printf("\n");

    return 0;
}

Это приводит к следующему:

$ gcc main.c -o main.exe; ./main.exe
52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 44,

Обратите внимание, что последний блок составляет 44 байта.

То, что вы делаете с буфером, зависит от вас.

...