Как передать строку по ссылке в Arduino C ++ - PullRequest
1 голос
/ 10 апреля 2020

Я новичок в Arduino и почти десять лет не занимался C ++. Итак, вот мой действительно базовый c вопрос:

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

void return_array_byref((char[]) & device, (char[]) & command) 
{
    device = malloc(8 * sizeof(char));
    device[0] = 'C';
    device[1] = '\n';

    command= malloc(8 * sizeof(char));
    command[0] = 'C';
    command[1] = '\n';
}

void loop() {
    char * device;
    char * command;
    return_array_byref(device, command);

    ...
}

Я пытался использовать char **, char[] &, char * &, но, похоже, ничего не работает. С кодом выше я получаю это:

arduino:6:25: error: variable or field 'return_array_byref' declared void

 void  return_array_byref((char[]) & device)

                         ^

Как правильно сделать это в C ++?

[РЕДАКТИРОВАТЬ] [РЕШЕНИЕ]

Это код, который я искал. Я пришел к этому решению, основываясь на ответе, представленном ниже, так что заслуга @Doncho:)

void return_array_byref(char * * device) 
{

  *device = (char*) malloc(sizeof(char) * 8); // allocate the size of the pointer array

   (*device)[0] = 'A';
   (*device)[1] = 'B';
   (*device)[2] = 'C';
   (*device)[3] = '\n'; // this is just a new line, does not end the string
   (*device)[4] = '\0'; // null terminator is important!
}

void main() 
{
  char * string;
  return_array_byref(&string);

  cout << string << endl; 

  free(string);
}

1 Ответ

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

Я бы не стал передавать массив строк в качестве ссылки. Используйте мощность C, передайте указатель на массив, который вы будете динамически выделять.

Код, который приведен ниже, делает это: он получает указатель на массив C -строк. Затем он сначала выделяет массив (sizeof (char *) * count) элементов, затем он выделяет каждую строку в этом массиве и присваивает значение. Если вам нужна настоящая строка в стиле C, вам нужно завершить ее символом '\ 0', а не '\ n'.

У меня больше нет настроек Arduino, но код должен выглядеть следующим образом это:

void return_array_byref(char * * device, unsinged count) 
{
  *device = malloc(sizeof(char *)*count); // allocate the size of the pointer array
  int i;

  for(i=0; i<count; i++) {
    device[i] = malloc(sizeof(char)*10); // just for the example, allocate 9 char length string

    device[i][0] = 'A'+i;
    device[i][1] = '\n'; // this is just a new line, does not end the string
    device[i][2] = '\0'; // null terminator is important!
  }  
}

// the loop routine runs over and over again forever:
void loop() {

  char ** string; // bear in mind this is just ONE string, not two
  return_array_byref_string(string);

  // bear in mind, somewhere in your code you need to free up the memory!
  // free up each of the strings:
  // for(int i=0; i<count; i++) free(string[i]); // free up the strings allocation
  // free(string); // free up the strigs array array
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...