Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
racushka
0 / 0 / 0
Регистрация: 26.10.2010
Сообщений: 40
#1

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

13.09.2013, 17:04. Просмотров 1152. Ответов 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?
При объявлении const у нас значение переменной или адрес переменной не...

Чем отличаются объявления const char* и const* char
Прошу объяснить мне, чем отличаются объявления const char* и const* char и как...

Error C2440: return: невозможно преобразовать "const char *" в "const char (&)[6]"
Вроде все правильно а все равно не работает. Подскажите в чем ошибка ...

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

Ошибка: Cannot convert 'char const[18]' to 'const wchar_t *'
Unit1.cpp(59): E2034 Cannot convert 'char const' to 'const wchar_t *' Full...

20
alsav22
5441 / 4836 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 17:08 #2
Цитата Сообщение от racushka Посмотреть сообщение
filename не инициализируется.
Откуда видите?
0
CheshireCat
Эксперт С++
2912 / 1261 / 114
Регистрация: 27.05.2008
Сообщений: 3,463
13.09.2013, 17:13 #3
А в чем проблема, что не позволяет вместо filename использовать f.c_str() ?
1
racushka
0 / 0 / 0
Регистрация: 26.10.2010
Сообщений: 40
13.09.2013, 17:23  [ТС] #4
Цитата Сообщение от CheshireCat Посмотреть сообщение
А в чем проблема, что не позволяет вместо filename использовать f.c_str() ?
Это просто супер!
У меня уже тупняк видимо начался))
Огромное спасибо!!!
0
alsav22
5441 / 4836 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 17:29 #5
racushka, на вопрос про инициализацию filename , пожалуйста, ответьте:
Цитата Сообщение от alsav22 Посмотреть сообщение
Откуда видите?
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7045 / 3346 / 452
Регистрация: 04.12.2011
Сообщений: 9,304
Записей в блоге: 5
13.09.2013, 18:01 #6
Всё работает и так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <string>
#include <windows.h>
#include<fstream>
using namespace std;
int main(){
SetConsoleCP (1251); SetConsoleOutputCP (1251);
std::string f = "bla-bla-bla!";
const char* filename = f.c_str();
const char* out_cstring = "bla bla bla";
ofstream out_file(filename, ios::out);
out_file<<out_cstring;
out_file.close();
ifstream in_file(filename, ios::in);
string word;
string rezult;
while (in_file >> word){
cout<<word<<endl;
rezult+=word+" ";
}
    cout << "rezult " << rezult << endl;
     in_file.close();
cin.get();   
return 0;
}
1
racushka
0 / 0 / 0
Регистрация: 26.10.2010
Сообщений: 40
13.09.2013, 18:37  [ТС] #7
Цитата Сообщение от alsav22 Посмотреть сообщение
racushka, на вопрос про инициализацию filename , пожалуйста, ответьте:
видела в отладчике. но уже все решилось. я просто не использую переменную
хотя почему не работает в релиз не понятно
0
alsav22
5441 / 4836 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 18:57 #8
Цитата Сообщение от racushka Посмотреть сообщение
хотя почему не работает в релиз не понятно
Цитата Сообщение от racushka Посмотреть сообщение
видела в отладчике.
В релиз, в отладчике видели?
0
racushka
0 / 0 / 0
Регистрация: 26.10.2010
Сообщений: 40
13.09.2013, 19:18  [ТС] #9
да. не открывался файл в cvLoadImage/ именно в Release. (это open cv)
я пыталась понять в чем дело.
в отладчике только эта переменная не показывалась
0
alsav22
5441 / 4836 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 19:20 #10
Цитата Сообщение от racushka Посмотреть сообщение
в отладчике только эта переменная не показывалась
Вопрос остался: в отладчике переменную смотрели в релизе?
0
racushka
0 / 0 / 0
Регистрация: 26.10.2010
Сообщений: 40
13.09.2013, 20:19  [ТС] #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Вопрос остался: в отладчике переменную смотрели в релизе?
да в отладчике. выше написала.
0
alsav22
5441 / 4836 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 20:23 #12
Цитата Сообщение от racushka Посмотреть сообщение
да в отладчике. выше написала.
А что вы в отладчике, в релизе, хотите увидеть?
0
racushka
0 / 0 / 0
Регистрация: 26.10.2010
Сообщений: 40
13.09.2013, 20:44  [ТС] #13
Цитата Сообщение от alsav22 Посмотреть сообщение
А что вы в отладчике, в релизе, хотите увидеть?
Ну вообще я думала, что там ничего не будет показывать. Но показывает все тоже самое что и в debug...

Добавлено через 51 секунду
За исключением, что в дебаге ошибка не вылазила и константа прекрасно инициализировалась. все осталольное также

Добавлено через 15 минут
Теперь новый косяк
C++
1
2
3
4
for(int countTemp = 0; countTemp<NumberTemp; countTemp++)
{
     if (FoundPointsFinish[countTemp].value>=ThresholdVal)
     {...
countTemp показывает какое-то непонятное число...

Добавлено через 16 секунд
тоже в release

Добавлено через 2 минуты
соответственно программа в режиме release не работает. только в режиме debug.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7045 / 3346 / 452
Регистрация: 04.12.2011
Сообщений: 9,304
Записей в блоге: 5
13.09.2013, 21:01 #14
Цитата Сообщение от racushka Посмотреть сообщение
соответственно программа в режиме release не работает. только в режиме debug.
Результат работы этой строки:
Цитата Сообщение от racushka Посмотреть сообщение
const char* filename = f.c_str();
можно увидеть хоть так:
C++
1
cout<<filename;
Включая экстрасенсорику: другой вопрос, почему из папки Release не видно этого файла. Посмотрите в проводнике, что происходит. Потом настройки путей.
0
racushka
0 / 0 / 0
Регистрация: 26.10.2010
Сообщений: 40
13.09.2013, 21:34  [ТС] #15
Цитата Сообщение от IGPIGP Посмотреть сообщение
Результат работы этой строки:

можно увидеть хоть так:
C++
1
cout<<filename;
Включая экстрасенсорику: другой вопрос, почему из папки Release не видно этого файла. Посмотрите в проводнике, что происходит. Потом настройки путей.
Почему не видно? все видно, после того как я сделала так:
C++
1
cvLoadImage(filenShot.c_str())
с файлом все в порядке.
у меня теперь счетчик в другом месте программы не инициализируется.
т.е. программа никогда не заходит в него в релиз, а в дебаг заходит отлично
0
alsav22
5441 / 4836 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 21:41 #16
Цитата Сообщение от racushka Посмотреть сообщение
т.е. программа никогда не заходит в него в релиз,
В релиз не используйте отладчик. Он не для релиз предназначен. То что не заходит, значит так компилятор в релиз код оптимизировал, это не значит, что неправильно работает. Не прыгайте с дебаг в релиз, это ничего не даст.
0
rangerx
1941 / 1550 / 478
Регистрация: 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
5441 / 4836 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 23:19 #19
Цитата Сообщение от racushka Посмотреть сообщение
countTemp сразу принимает очень большое значение
Прям сразу? Прям сразу, как ему ноль присваивается, так и становится очень большим?
0
rangerx
1941 / 1550 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
13.09.2013, 23:58 #20
Цитата Сообщение от racushka Посмотреть сообщение
countTemp сразу принимает очень большое значение и соответственно дальше алгоритм не проходит и игнорит весь код в цикле
Ну, сразу countTemp очень большое значение принимать не может... если цикл действительно не выполняется ни разу, то NumberTemp(надеюсь эта переменная типа int) <= 0, и проблему нужно искать совсем в другом месте...
0
13.09.2013, 23:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2013, 23:58

Cannot convert 'const wchar_t *' to 'const char *'
HMODULE hMod=GetModuleHandle(NULL); if(!hMod) { } HRSRC...

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

Error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в 'char *'
error C2664: sprintf: невозможно преобразовать параметр 1 из 'const char *' в...


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

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

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