Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
racushka
0 / 0 / 0
Регистрация: 26.10.2010
Сообщений: 40
#1

const char не инициализируется при объявлении - C++

13.09.2013, 17:04. Просмотров 1085. Ответов 20
Метки нет (Все метки)

Доброго времени суток.
Прошу помощи
есть код
C++
1
2
3
std::string f = "бла-бла-бла";
...
const char* filename = f.c_str();
в режиме Debug все работает. А в Reliase нет.
filename не инициализируется.
Пробовала так:
C++
1
2
3
char* cname;
std::strcpy(cname,f.c_str());
const char *filename = cname;
та же ерунда. причем
сname принимает значение строки f, filename так и остается не инициализорванным и вообще в отладчике пишет:
filename CXX0017: ошибка: не найден символ "filename"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2013, 17:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос const char не инициализируется при объявлении (C++):

Изменяется ли адрес или значение переменной при объявлении ее как const? - C++
При объявлении const у нас значение переменной или адрес переменной не изменяется?

Чем отличаются объявления const char* и const* char - C++
Прошу объяснить мне, чем отличаются объявления const char* и const* char и как объявить: указатель на константный массив символов, ...

Error C2440: return: невозможно преобразовать "const char *" в "const char (&)[6]" - C++
Вроде все правильно а все равно не работает. Подскажите в чем ошибка #include <iostream> template<typename T> inline const T...

char operator[](unsigned short offset) const; // что означает const? - C++
Собстенно вопрос уже озвучен :).

Ошибка: Cannot convert 'char const[18]' to 'const wchar_t *' - C++
Unit1.cpp(59): E2034 Cannot convert 'char const' to 'const wchar_t *' Full parser context Unit1.cpp(55): parsing: void _fastcall...

Cannot convert 'const wchar_t *' to 'const char *' - C++
HMODULE hMod=GetModuleHandle(NULL); if(!hMod) { } HRSRC hRes=FindResource(hMod,"acc.dll",RT_RCDATA); if(!hRes){ } HGLOBAL...

20
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 21:41 #16
Цитата Сообщение от racushka Посмотреть сообщение
т.е. программа никогда не заходит в него в релиз,
В релиз не используйте отладчик. Он не для релиз предназначен. То что не заходит, значит так компилятор в релиз код оптимизировал, это не значит, что неправильно работает. Не прыгайте с дебаг в релиз, это ничего не даст.
0
rangerx
1937 / 1546 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
13.09.2013, 22:11 #17
Цитата Сообщение от racushka Посмотреть сообщение
std::string f = "бла-бла-бла";
...
const char* filename = f.c_str();
Так вообще никогда не нужно делать. c_str() возвращает указатель на данные используемые непосредственно строкой f, следовательно любое изменение содержимого этой строки может привести к тому, что указатель filename станет недействительным. Простой пример, который выглядит вполне корректным
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <string>
#include <cassert>
 
int main()
{
    std::string s1 = "abc";
    std::string s2 = s1;
 
    const char* p = s2.c_str();
    assert(s2.c_str() == p);   // нормально
 
    s2[0] = '!';               // всего лишь меняем первый символ
    assert(s2.c_str() == p);   // ???
}
На первый взгляд всё нормально. Но, если класс std::string использует стратегию copy-on-write, p будет указывать уже совсем не туда, куда ожидалось. И это далеко не самый коварный пример. Если приходится использовать метод c_str(), то используйте его непорсдественно там, где это необходимо.
2
racushka
0 / 0 / 0
Регистрация: 26.10.2010
Сообщений: 40
13.09.2013, 23:15  [ТС] #18
Цитата Сообщение от rangerx Посмотреть сообщение
Так вообще никогда не нужно делать. c_str() возвращает указатель на данные используемые непосредственно строкой f, следовательно любое изменение содержимого этой строки может привести к тому, что указатель filename станет недействительным. Простой пример, который выглядит вполне корректным
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <string>
#include <cassert>
 
int main()
{
    std::string s1 = "abc";
    std::string s2 = s1;
 
    const char* p = s2.c_str();
    assert(s2.c_str() == p);   // нормально
 
    s2[0] = '!';               // всего лишь меняем первый символ
    assert(s2.c_str() == p);   // ???
}
На первый взгляд всё нормально. Но, если класс std::string использует стратегию copy-on-write, p будет указывать уже совсем не туда, куда ожидалось. И это далеко не самый коварный пример. Если приходится использовать метод c_str(), то используйте его непорсдественно там, где это необходимо.
Спасибо. Буду знать.
А что на счет вот этого? Почему так может быть ведь программа не работает в релиз

C++
1
2
3
4
for(int countTemp = 0; countTemp<NumberTemp; countTemp++)
{
     if (FoundPointsFinish[countTemp].value>=ThresholdVal)
     {...
Добавлено через 49 минут
countTemp сразу принимает очень большое значение и соответственно дальше алгоритм не проходит и игнорит весь код в цикле
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 23:19 #19
Цитата Сообщение от racushka Посмотреть сообщение
countTemp сразу принимает очень большое значение
Прям сразу? Прям сразу, как ему ноль присваивается, так и становится очень большим?
0
rangerx
1937 / 1546 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
13.09.2013, 23:58 #20
Цитата Сообщение от racushka Посмотреть сообщение
countTemp сразу принимает очень большое значение и соответственно дальше алгоритм не проходит и игнорит весь код в цикле
Ну, сразу countTemp очень большое значение принимать не может... если цикл действительно не выполняется ни разу, то NumberTemp(надеюсь эта переменная типа int) <= 0, и проблему нужно искать совсем в другом месте...
0
racushka
0 / 0 / 0
Регистрация: 26.10.2010
Сообщений: 40
14.09.2013, 09:52  [ТС] #21
Да действительно, ошиблась. Дело не в countTemp.
C++
1
if (FoundPointsFinish[countTemp].value>=ThresholdVal)
это условие ни разу не выполняется в Release. Хотя в дебаг выполняется минимум три раза из четырех.

Добавлено через 1 минуту
Объявление динамического массива
C++
1
FStructEl* FoundPointsFinish = new FStructEl[NumberTemp];
структура FStructEl
C++
1
2
3
4
5
6
7
typedef struct FStructEl
{
    double value;
    CvPoint Point;
    std::string FileName;
    int num;
}FStructEl;
0
14.09.2013, 09:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2013, 09:52
Привет! Вот еще темы с ответами:

Почему при изменении литерала const char* программа падает? - C++
точнее литерала. ладно, если бы выходил за пределы

Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' - C++
error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *' void crpost(const statep &amp;struc1) { ...

Работа со строками - Invalid conversion from 'char' to 'const char*' - C++
#include &lt;iostream&gt; #include &lt;ctype.h&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; using namespace std; void poisk(int n, char...

Error: incompatible types in assignment of 'const char [5]' to 'char [10]' - C++
Код: #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; const int m = 10; class name {


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.