Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: С++ Есть ли возможность объединять ячейки в массиве? [РЕШЕНО]  (Прочитано 1233 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Vlad.V

  • Автор темы
  • Активист
  • *
  • Сообщений: 478
    • Просмотр профиля
Доброго времени суток!

После парсинга конфиг файла, есть строка(string) которая имеет примерно такой вид "13, 12, 20, 2, 5" это номера GPIO контактов, которые нужно будет открывать. Открываются они путем записи этих номеров в файл экспорт. Когда эти номера забиты сразу в массиве, то я делаю просто export << MASS, но в данном случае такое не проходит, т.к. число 10 разбито на две ячейки MASS[0]=1 и MASS[1]=3 и при экспорте я получу открытый 1 и 3й контакт, но не 13й. Вот и вопрос, как объединить MASS[0] и MASS[1] и получить в итоге, например, MASS[0]=13?
Заранее благодарю!
« Последнее редактирование: 03 Февраля 2015, 13:58:58 от Vlad.V »

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Vlad.V, чем элементы отделены?
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Впечатление что у Вас вообще не массив, а просто строка без разделителей.
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Vlad.V

  • Автор темы
  • Активист
  • *
  • Сообщений: 478
    • Просмотр профиля
В конфиге - запятыми

Пользователь решил продолжить мысль [time]28 Январь 2015, 23:08:52[/time]:
Да, строка, но к строке я все равно могу обращаться как к массиву. Разделители есть, запятые.

Пользователь решил продолжить мысль 29 Января 2015, 13:37:23:
Хорошо, может кто-то сможет подсказать как прочесть эту
O_PIN=10,15,20,25,1,2,5строку так, чтобы в массиве число 10 это была одна ячейка, т.е. пока запятых нет, это одна ячейка, если получена запятая, запись начинается в новую ячейку.
« Последнее редактирование: 29 Января 2015, 13:37:23 от Vlad.V »

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Хорошо, может кто-то сможет подсказать как прочесть эту
O_PIN=10,15,20,25,1,2,5строку так, чтобы в массиве число 10 это была одна ячейка, т.е. пока запятых нет, это одна ячейка, если получена запятая, запись начинается в новую ячейку.

Разбить/прочитать строку после знака '=', используя запятые в качестве разделителей.

Оффлайн Komorebi

  • Активист
  • *
  • Сообщений: 475
    • Просмотр профиля
Что за бред я только что прочитал?

Оффлайн soarin

  • Старожил
  • *
  • Сообщений: 1850
  • ubuntu 20.04
    • Просмотр профиля
Писец... Могу разве что посоветовать вбить в любой поиск фразу "c++ parse comma delimited string to integer array". Первые ссылки будут о том что надо.
И вообще рекомендую прочитать любой учебник по основам C (даже лучше С без плюсов, ибо для начала без всякого ООП), даже первых глав будет достаточно.
« Последнее редактирование: 01 Февраля 2015, 08:06:07 от soarin »

Оффлайн Vlad.V

  • Автор темы
  • Активист
  • *
  • Сообщений: 478
    • Просмотр профиля
Спасибо! Так и сделаю,  но чего сразу писец? Я только начал изучение и уверен, у каждого было, что ответ рядом, смотришь, но не можешь его увидеть, пока кто-то не ткнет носносом.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Могу высказать предположение что массив (как и строка|переменная) должен быть объявлен с указанием типа.
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн TheDrone

  • Новичок
  • *
  • Сообщений: 22
    • Просмотр профиля
Я не совсем понял (совсем не понял), что вы делаете, но похоже, что вы говорите об этом:
char *c; // это строка, которую ты считал
int i, j, b [100];
// обнуляем массив b
for (i = 0; i < 101; i++)
    b [i] = 0;
i = 0;
// пропускаем символы до знака '='
while (с [i] != '=')
    i++;
i++;
j = 0;
// заполняем массив b
while (c [i] != '\n')
{
    if (c [i] == ',')
        j++;
    else
    {
        b [j] *= 10;
        b [j] += c [i] - '0';
        i++;
    }
}
// получили массив b, состоящий из нужных нам чисел, размером j.
« Последнее редактирование: 02 Февраля 2015, 19:11:47 от TheDrone »

Оффлайн Vlad.V

  • Автор темы
  • Активист
  • *
  • Сообщений: 478
    • Просмотр профиля
Нашел выход с помощью stringstream! Самый реальный и простой вариант.

     while(!config.eof())
     {
     string buff;
     stringstream ss_buff;
     if(!getline(config, buff)) //получаю строку с конфига
       error("PARSING: Can't get line from config");
     
     if(buff.substr(0,3) == "PIN") // проверяю есть ли в этой строке необходимое мне.
     {

       ss_buff << buff.substr(4,20); // записываю буфер типа string в буфер типа stringstream, убираю не нужные мне символы
       for (auto &x: PINs) // диапазонным for из ss буфера копирую интегральные числа в интовый массив PINs.
{
  if(ss_buff >> x); // если int - копируем
  else break;
     
  char c;
  if(ss_buff >> c); // если char - отбрасываем
  else break;
}
   
     }
  }

Пока еще функция не является универсальной, но это уже дело 5-е, работает - это главное! Спасибо всем, кто пытался помочь!!

 

Страница сгенерирована за 0.021 секунд. Запросов: 21.