Форум программистов, компьютерный форум CyberForum.ru

Возврат char* через return - C++

Восстановить пароль Регистрация
 
TiiL
0 / 0 / 0
Регистрация: 02.12.2010
Сообщений: 17
28.06.2012, 08:55     Возврат char* через return #1
Вот написал маленький пример, того с чем не могу разобраться в большой программе:
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
26
27
28
29
char *filename;
FILE *fd;
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_pushButton_clicked()
{
    QString name = ui->lineEdit->text ();
    filename = stringtochar(name);
    qDebug(filename);
    fd = fopen(filename, "w");
    fprintf(fd,"ok");
    fclose(fd);
}
char *MainWindow::stringtochar (QString name)
{
    QByteArray file = name.toLocal8Bit ();
    return file.data ();
}
Я знаю что при заканчивание функции stringtochar всё что к ней относится удаляется, но почему по ретурну вовзращается вот такой бред:
i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?[cS
подскажите как правильно все это организовать?

PS Создаю функцию char *stringtochar для того что бы облагородить свою Большой проект, но напопролся на такую вещь(
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.06.2012, 08:55     Возврат char* через return
Посмотрите здесь:

C++ В чем разница между return и return false/true
return *char C++
C++ Как вывести строку в терминал через return?
Функция с CharToOem не возвращает слово через return C++
C++ return + char*
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Aneron
 Аватар для Aneron
157 / 156 / 12
Регистрация: 20.04.2010
Сообщений: 570
28.06.2012, 09:25     Возврат char* через return #2
char *MainWindow::stringtochar (QString name)
{
QByteArray file = name.toLocal8Bit ();
return file.data ();
}
пока существует объект file - указатель существует.
Как только он разрушился - указатель указывает хрен знает куда.

Решение.
1. Передавать в функцию укатель на область памяти,куда ты будешь копировать file.data ().
2. Копировать результат функции в какой то массив.

например,
C++
1
2
char filename[1024];
sprintf(filename,"%.*s",sizeof(filename)-1,stringtochar(name));
TiiL
0 / 0 / 0
Регистрация: 02.12.2010
Сообщений: 17
28.06.2012, 09:48  [ТС]     Возврат char* через return #3
Тут Такой косяк похоже...

вот в моём большом проекте происходит вот так:
C++ (Qt)
1
2
3
4
        QString filename1 = ui->lineEdit->text ();
        QByteArray c_file1 = filename1.toLocal8Bit ();
        c_file = c_file1.data ();
        filename1.clear ();
ну так вот, только этот кусок кода помещаю в {} сразу выдаётся ерунда, и почему то если делать
C++ (Qt)
1
c_file = filename.toLocal8Bit ().data();
то появляется ерунда,

хотя делаю туже самую ерунду у себя маленьком примерчеке, но если задаю(создаю) сам название файла то эта весчь проходит, такое ощущение виновата кодировка файла, но может ошибаюсь
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
28.06.2012, 10:37     Возврат char* через return #4
Можно попробовать так:
C++
1
2
3
4
5
6
char *MainWindow::stringtochar (QString name)
{
    static QByteArray file = QByteArray();
    file = name.toLocal8Bit ();
    return file.data ();
}
Разумеется полученный указатель будет действительным только до следующего вызова этой функции.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
28.06.2012, 13:44     Возврат char* через return #5
Мб стоит использовать std::string?
Yandex
Объявления
28.06.2012, 13:44     Возврат char* через return
Ответ Создать тему
Опции темы

Текущее время: 08:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru