Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 55
1

Как задать значения map при объявлении?

22.07.2015, 13:39. Показов 4444. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем добрый день!

Имею следующие объявления.
C++
1
2
3
4
5
6
7
8
map<string, double> NatureMap;
 
int main(int argc, char *argv[]){
 
  NatureMap["\"I\""]=1e-12;
  ...
  
};
Объявление NatureMap содержится в заголовочном файле defs.h, который инклудится в main.cpp и в других, поскольку NatureMap там тоже используется.

В принципе, NatureMap можно даже объявить const, поскольку этот словарь таковым и является.

При расположении кода, как сейчас, я получаю сообщения компилятора типа
PsfFileReader.o.bss+0x0): multiple definition of `NatureMap'
main.o.bss+0x0): first defined here
Analyzer.o.bss+0x0): multiple definition of `NatureMap'
main.o.bss+0x0): first defined here
...и т.д.

Если бы я умел проинициализировать NatureMap в defs.h, это решило бы проблему. Но код NatureMap["\"I\""]=1e-12; в заголовках не проходит.
А так - я вообще не понимаю, почему возникает конфликт объявлений. То есть, догадываюсь. Видимо, при линковке.
Но как избежать этого?

Гы, смайлики получились... но, в общем, к месту
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.07.2015, 13:39
Ответы с готовыми решениями:

Как при объявлении переменной типа Sprite сразу задать нужный спрайт
using System.Collections; using System.Collections.Generic; using UnityEngine; public class...

Как присвоить начальные значения массиву при объявлении и вывести элементы массива на экран?
Как присвоить начальные значения массиву при объявлении и вывести элементы массива на экран?

Присвоение переменной значения при ее объявлении
Доброго времени суток! Возник такой вопрос: обязательно ли нужно присваивать какое-либо значение...

Можно ли полям структуры при их объявлении присвоить значения
A) Да, но только стандартным типам B) Нет C) Да D) Да, но только типам-значениям

10
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
22.07.2015, 13:45 2
Лучший ответ Сообщение было отмечено rotciv как решение

Решение

В заголовочном:
C++
1
extern map<string, double> NatureMap; // только объявление, без определения
В одном из .cpp:
C++
1
map<string, double> NatureMap; // определение
1
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
22.07.2015, 14:33 3
Лучший ответ Сообщение было отмечено rotciv как решение

Решение

Цитата Сообщение от rotciv Посмотреть сообщение
Как задать значения map при объявлении?
С++11
C++
1
2
3
4
5
6
7
8
// в h
extern const std::map<std::string, double> NatureMap;
 
// в одном из cpp
const std::map<std::string, double> NatureMap
{
    {"\"I\"", 1e-12}, {"\"PI\"", 3.14} //, { и т.д. }
};
C++98
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// в h
extern const std::map<std::string, double> NatureMap;
 
// в одном из cpp
static const std::pair<std::string, double> NatureArr[] =
{
    std::make_pair("\"I\"", 1e-12), std::make_pair("\"PI\"", 3.14) //, и т.д.
};
 
#define ARRSIZE(arr) (sizeof((arr))/sizeof((arr)[0]))
 
const std::map<std::string, double> NatureMap(NatureArr, NatureArr + ARRSIZE(NatureArr));
 
#undef  ARRSIZE
1
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 55
22.07.2015, 17:34  [ТС] 4
DrOffset, большое спасибо. Вариант С++98 скомпилировался.

А что нужно сделать, чтобы работала поддержка С++11 на линуксе?
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
22.07.2015, 18:07 5
Цитата Сообщение от rotciv Посмотреть сообщение
А что нужно сделать, чтобы работала поддержка С++11 на линуксе?
Компилятор достаточной версии и ключ -std=c++11 (в идеале лучше GCC 4.8 и выше). В более старых версиях может работать -std=c++0x, но возможности не все поддерживаются.
0
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 55
23.07.2015, 10:10  [ТС] 6
Я пользуюсь g++, хотя он говорит, что он - gcc, хотя на самом деле немного разные.

~/Simulation_TC/wsf_test/OO >> g++ --version
g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

~/Simulation_TC/wsf_test/OO >> gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

~/Simulation_TC/wsf_test/OO >> which g++
/usr/bin/g++
~/Simulation_TC/wsf_test/OO >> which gcc
/usr/bin/gcc
~/Simulation_TC/wsf_test/OO >> ls -l /usr/bin/g++
-rwxr-xr-x. 4 root root 271368 Sep 1 2014 /usr/bin/g++
~/Simulation_TC/wsf_test/OO >> ls -l /usr/bin/gcc
-rwxr-xr-x. 2 root root 268256 Sep 1 2014 /usr/bin/gcc

Ключ -std=c++0x можно попробовать. Он сам в логе про него говорил, когда я пытался вариант С++11 компилировать.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
23.07.2015, 10:17 7
Цитата Сообщение от rotciv Посмотреть сообщение
g++ (GCC) 4.4.7
Лучше обновиться до более свежей версии.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,284
23.07.2015, 12:04 8
Цитата Сообщение от rotciv Посмотреть сообщение
Я пользуюсь g++, хотя он говорит, что он - gcc, хотя на самом деле немного разные.
Ликбез: GCC - это GNU Compiler Collection. Сборник из нескольких компиляторов под общим названием. Непосредственно бинарник gcc сам умеет определять (по расширению) файл на каком языке ему подсунули и вызывать нужный компилятор.
g++ - это компилятор и линкер для С++ в одном флаконе из состава GCC.

PS. на деле там под капотом все это распадается еще на несколько отдельных бинарников: компилятор, транслятор, линкер, препроцессор, ассемблер. Но это уже несущественные детали.

Добавлено через 2 минуты
Цитата Сообщение от rotciv Посмотреть сообщение
g++ (GCC) 4.4.7
Это достаточно старая версия. С++11 там не ждать (разве что tr1 можно попробовать заюзать, но это только библиотека). В общем-то там даже С++03 с багами.

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
С++11 там не ждать
Хотя я не прав. Кое-что все-таки есть: https://gcc.gnu.org/gcc-4.4/cxx0x_status.html.
1
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 55
23.07.2015, 16:58  [ТС] 9
Я пока продолжаю с вариантом С++98.

Опять не понимаю.

Строка в исходнике...
C++
1
2
3
     map<string, double> GroupVars;
      ....
      GroupVars[tempString[0]]=NatureMap[tempString[1]];
...дает такую ошибку.

PsfFileReader.cpp: In constructor ‘PsfFileReader::PsfFileReader(std::string)’:
PsfFileReader.cpp:71: error: passing ‘const std::map<std::basic_string<char,
std::char_traits<char>, std::allocator<char> >, double,
std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char>
> >, std::allocator<std:air<const std::basic_string<char,
> >std::char_traits<char>, std::allocator<char> >, double> > >’ as ‘this’
> >argument of ‘_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const
> >_Key&) [with _Key = std::basic_string<char, std::char_traits<char>,
> >std::allocator<char> >, _Tp = double, _Compare =
> >std::less<std::basic_string<char, std::char_traits<char>,
> >std::allocator<char> > >, _Alloc = std::allocator<std:air<const
> >std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
> >double> >]’ discards qualifiers


Что бы это значило? Я пытаюсь значение double присвоить полю double.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
23.07.2015, 17:07 10
rotciv, NatureMap const, оператор [] не может использоваться для константной мапы, ибо может изменить саму мапу. Либо делайте NatureMap не const, либо юзайте map.find, который вернет итератор и который надо будет проверить перед тем как разыменовать.
2
0 / 0 / 0
Регистрация: 04.03.2015
Сообщений: 55
23.07.2015, 17:29  [ТС] 11
ForEveR, точно. Убрал const, заработало. Спасибо!
0
23.07.2015, 17:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.07.2015, 17:29
Помогаю со студенческими работами здесь

Как задать двумерный массив, чтобы значения можно было писать при запуске программы?
мне нужен самый простой способ

Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std::map?
Здравствуйте. Возможно ли создать контейнер std::map, в котором в качестве значения была бы...

Как задать зависимость значения ячейки от даты при заданном значении ячейки функцией (сегодня)
Профессионалы, помогите новичку пожалуйста! Как задать зависимость значения ячейки при изменении...

Как инициализировать массив нулями при объявлении?
Если это делается автоматически, то зачем компилятор выдаёт предупреждения о том что переменная...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru