Огромная ошибка сегментации компиляции initializer_list - PullRequest
0 голосов
/ 08 июня 2018
    const QHash<QString, float> idfs = {{"the", 0.0023450551861261},
    {"of", 0.00258603321106053},
    {"to", 0.00375511856396871},
    {"and", 0.0040408455383457}

.. 293060 строк больше

Команда компиляции: /usr/local/bin/mpic++ -DQT_CORE_LIB -DQT_NO_DEBUG --isystem /usr/include/x86_64-linux-gnu/qt5 -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore -isystem /usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -Wall -Wextra -std=c++11 -O2 -fPIC -fPIC -o CMakeFiles/antiplagiarism.dir/src/idfs.cc.o -c /home/user/newanalyzer/common/src/idfs.cc

Результат компиляции: g++: internal compiler error: Segmentation fault (program cc1plus)

Можно ли иметь огромный список инициализации дляgcc?

gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9) 

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Можно ли иметь огромный список инициализации для gcc?

Да.Это не нормально иметь такой большой размер, что система, на которой вы строите, исчерпывает ресурсы.Нет никаких ограничений, присущих архитектуре gcc.

Но это статические данные, и QHash - не тот инструмент для работы.Вместо этого вы должны использовать что-то вроде gperf с предоставленной пользователем структурой.

Входной файл для gperf в вашем случае будет выглядеть следующим образом:

 %language=C++
 %struct-type
 %define class-name WordHash
 %define slot-name text
 struct Word { const char *text; double frequency; };
 %%
 the, 0.0023450551861261
 of, 0.00258603321106053
 to, 0.00375511856396871
 and, 0.0040408455383457

Использованиесгенерированный gperf код, вы должны выглядеть следующим образом:

double getFrequency(const char *text) {
  auto *word = WordHash::in_word_set(text, strlen(text));
  Q_ASSERT(!word || strcmp(word->text, text) == 0);
  return word ? word->frequency : -1;
}
0 голосов
/ 12 июня 2018

Ошибка в gcc была отправлена ​​https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86118 Проблема была решена с использованием отсортированного массива и двоичного поиска.

0 голосов
/ 08 июня 2018

Можно ли иметь огромный список инициализации для gcc?

Нет.

Вместо этого отформатируйте данные в массив объектов JSON (или как объектс "key" : value парами).Вероятно, вы можете сделать это быстро с помощью некоторых простых команд регулярных выражений (или изменить то, что вы используете для создания списка инициализации). QT имеет поддержку JSON .

Если вам необходимо иметь данные внутри программы (а не как отдельный файл .json для простого обновления), тогда вставьте файл как определение const char *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...