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

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
Прошу помощи
есть код
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.09.2013, 17:04
Ответы с готовыми решениями:

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

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

error: no matching function for call to `QObject::connect(QPushButton&, const char[10], QApplication*, const char[8])'
Ошибка понимаю какая, но не понимаю, почему возникла и как исправить!) #include <QtGui> int...

no matching function for call to 'QObject::connect(QCommandLinkButton*, const char*, cNetwork*, const char*)
компилятор ругается ошибка: no matching function for call to...

20
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 17:08 2
Цитата Сообщение от racushka Посмотреть сообщение
filename не инициализируется.
Откуда видите?
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
13.09.2013, 17:13 3
А в чем проблема, что не позволяет вместо filename использовать f.c_str() ?
1
0 / 0 / 0
Регистрация: 26.10.2010
Сообщений: 40
13.09.2013, 17:23  [ТС] 4
Цитата Сообщение от CheshireCat Посмотреть сообщение
А в чем проблема, что не позволяет вместо filename использовать f.c_str() ?
Это просто супер!
У меня уже тупняк видимо начался))
Огромное спасибо!!!
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 17:29 5
racushka, на вопрос про инициализацию filename , пожалуйста, ответьте:
Цитата Сообщение от alsav22 Посмотреть сообщение
Откуда видите?
1
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
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
0 / 0 / 0
Регистрация: 26.10.2010
Сообщений: 40
13.09.2013, 18:37  [ТС] 7
Цитата Сообщение от alsav22 Посмотреть сообщение
racushka, на вопрос про инициализацию filename , пожалуйста, ответьте:
видела в отладчике. но уже все решилось. я просто не использую переменную
хотя почему не работает в релиз не понятно
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 18:57 8
Цитата Сообщение от racushka Посмотреть сообщение
хотя почему не работает в релиз не понятно
Цитата Сообщение от racushka Посмотреть сообщение
видела в отладчике.
В релиз, в отладчике видели?
0
0 / 0 / 0
Регистрация: 26.10.2010
Сообщений: 40
13.09.2013, 19:18  [ТС] 9
да. не открывался файл в cvLoadImage/ именно в Release. (это open cv)
я пыталась понять в чем дело.
в отладчике только эта переменная не показывалась
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 19:20 10
Цитата Сообщение от racushka Посмотреть сообщение
в отладчике только эта переменная не показывалась
Вопрос остался: в отладчике переменную смотрели в релизе?
0
0 / 0 / 0
Регистрация: 26.10.2010
Сообщений: 40
13.09.2013, 20:19  [ТС] 11
Цитата Сообщение от alsav22 Посмотреть сообщение
Вопрос остался: в отладчике переменную смотрели в релизе?
да в отладчике. выше написала.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 20:23 12
Цитата Сообщение от racushka Посмотреть сообщение
да в отладчике. выше написала.
А что вы в отладчике, в релизе, хотите увидеть?
0
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
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
13.09.2013, 21:01 14
Цитата Сообщение от racushka Посмотреть сообщение
соответственно программа в режиме release не работает. только в режиме debug.
Результат работы этой строки:
Цитата Сообщение от racushka Посмотреть сообщение
const char* filename = f.c_str();
можно увидеть хоть так:
C++
1
cout<<filename;
Включая экстрасенсорику: другой вопрос, почему из папки Release не видно этого файла. Посмотрите в проводнике, что происходит. Потом настройки путей.
0
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
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 21:41 16
Цитата Сообщение от racushka Посмотреть сообщение
т.е. программа никогда не заходит в него в релиз,
В релиз не используйте отладчик. Он не для релиз предназначен. То что не заходит, значит так компилятор в релиз код оптимизировал, это не значит, что неправильно работает. Не прыгайте с дебаг в релиз, это ничего не даст.
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
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
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
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
13.09.2013, 23:19 19
Цитата Сообщение от racushka Посмотреть сообщение
countTemp сразу принимает очень большое значение
Прям сразу? Прям сразу, как ему ноль присваивается, так и становится очень большим?
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
13.09.2013, 23:58 20
Цитата Сообщение от racushka Посмотреть сообщение
countTemp сразу принимает очень большое значение и соответственно дальше алгоритм не проходит и игнорит весь код в цикле
Ну, сразу countTemp очень большое значение принимать не может... если цикл действительно не выполняется ни разу, то NumberTemp(надеюсь эта переменная типа int) <= 0, и проблему нужно искать совсем в другом месте...
0
13.09.2013, 23:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.09.2013, 23:58
Помогаю со студенческими работами здесь

CONST_RETURN char *__cdecl strstr (const char *_Str, const char *_SubStr)
#include &lt;stdio.h&gt; #include &lt;string.h&gt; char tracks = { &quot;ya ostavil svoe serdce v harvardskom...

Если словарь при объявлении инициализируется, его начальная емкость становится равным инициализируемому?
Если словарь при объявлении инициализируется, его начальная емкость становится равной начальному...

invalid operands of types 'const char*' and 'const char [8]' to binary 'operator+'
if (camClient.connect(postHost, postHttpPort)) { uint8_t num = 1; String...

Warring: char * convert to const char * при трансляции
Не подскажет ли кто, как при трансляции на gcc убрать этот warring ? В info-gcc описана куча...

Странное поведение при разном объявлении строки char*
Здравствуйте. Я не могу понять в чем проблема. Я описываю глобальную переменную в заголовочном...

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


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

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