Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Добавление "Текст" в char* / 22 сообщений из 22, страница 1 из 1
03.03.2015, 15:52
    #38893703
Calligraff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
Добрый день.

Подскажите простой способ добавления строковых данных "Например вот таких" в переменную типа char*

Например:
Имеется
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
struct tPaths {
        char*   Logs;
        char*   Conf;
};

struct tAppConf {
        tPaths          Paths;
} AppConf;



и нужно выполнить AppConf.Paths.Logs = "/var/logs/clgsh.log";

пробовал так:
Код: plaintext
1.
strcpy(AppConf.Paths.Logs, "/var/logs/clgsh.log");



но пишет ошибку сегментирования.

Подскажите как правильно и просто (а не 10 строками) присвоить значение?

Спасибо.
...
Рейтинг: 0 / 0
03.03.2015, 16:05
    #38893728
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
char* это указатель, а не строка. Про указатели почитай.
...
Рейтинг: 0 / 0
03.03.2015, 16:07
    #38893735
Calligraff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
Спасибо. уже читаю.
НО вопрос все же открыт.

Решение пока не найдено ... (для меня) :)
...
Рейтинг: 0 / 0
03.03.2015, 16:12
    #38893743
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
Calligraff,
>> но пишет ошибку сегментирования.
память Пушкин за тебя не выделит, а потом не удалит.

>> Подскажите как правильно и просто (а не 10 строками) присвоить значение?
бери C++ и std::string, а не char*, тогда будет просто. А на С просто не бывает ))
...
Рейтинг: 0 / 0
03.03.2015, 17:05
    #38893851
Calligraff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
Отличное решение... как только теперь в char присвоить значение из std::str
...
Рейтинг: 0 / 0
03.03.2015, 17:07
    #38893857
Calligraff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
К примеру:

Код: plaintext
1.
2.
3.
4.
char fname[254];
char* sensor_name;
sensor_name = f_row[1];
sprintf(fname, "%s/%s/temperature", AppConf.Paths.Data, sensor_name);


уже не прокатит.

AppConf.Paths.Data - std::str

Спасибо
...
Рейтинг: 0 / 0
03.03.2015, 17:12
    #38893863
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
CalligraffОтличное решение... как только теперь в char присвоить значение из std::strа зачем?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
struct tPaths {
    std::string Logs;
    std::string Conf;
};
struct tAppConf {
    tPaths Paths;
};
...
AppConf cfg;
cfg.Paths.Logs = "/var/logs/clgsh.log";
...
Рейтинг: 0 / 0
03.03.2015, 17:15
    #38893867
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
Calligraffуже не прокатит.
Код: plaintext
1.
2.
3.
4.
char fname[254];
char* sensor_name;
sensor_name = f_row[1];
sprintf(fname, "%s/%s/temperature", AppConf.Paths.Data.c_str(), sensor_name);

хэлп можно ведь почитать ещё, или книжку там, какую ;)
...
Рейтинг: 0 / 0
03.03.2015, 17:16
    #38893870
Calligraff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
Решил так (ног правильно ли?):
Код: plaintext
1.
2.
3.
4.
5.
char             fname[254];
const char *     PathData = AppConf.Paths.Data.c_str();
char*            sensor_name;
sensor_name      = f_row[1];
sprintf(fname, "%s/%s/temperature", PathData, sensor_name);
...
Рейтинг: 0 / 0
03.03.2015, 17:17
    #38893873
Calligraff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
одновременно почти написали про ".c_str()" :))
...
Рейтинг: 0 / 0
03.03.2015, 17:17
    #38893874
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
Calligraff, а зачем тебе остальные то char*? делай всё на std::string, что ж ты мучаешься то с ними?
...
Рейтинг: 0 / 0
03.03.2015, 17:24
    #38893886
Calligraff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
egorychCalligraff, а зачем тебе остальные то char*? делай всё на std::string, что ж ты мучаешься то с ними?
Тоже уже подумал об этом

Спасибо большое за помощь.

Вопрос не в эту тему можно?

Код: plaintext
1.
2.
3.
4.
In file included from main.cpp:21:0:
sensor_temp.c: In function ‘void start_sensor_temp()’:
sensor_temp.c:122:34: error: ISO C++ forbids variable length array ‘thread’ [-Werror=vla]
sensor_temp.c:124:24: error: ISO C++ forbids variable length array ‘id’ [-Werror=vla]
cc1plus: all warnings being treated as errors

вот на это:
pthread_t thread[num_rows];
в
Код: plaintext
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.
30.
31.
32.
33.
34.
35.
void start_sensor_temp()
{

        AppConf.Sensers.Temp_Active = true;

        // Описание дескрипторов
        MYSQL mysql;                            // Дескриптор соединения
        MYSQL_RES *res;                         // Дескриптор результирующей таблицы
        MYSQL_ROW row;

        mysql = db_connect();
        res = db_resource(mysql, "SELECT s_id, s_uid FROM v_sensors WHERE s_enabled = 1 AND s_type_id = 1 ORDER BY s_id");


        pthread_attr_t threadAttr;
        pthread_attr_init(&threadAttr);
        pthread_attr_setdetachstate(&threadAttr, PTHREAD_CREATE_DETACHED);

        unsigned num_rows = mysql_num_rows(res);

       pthread_t thread[num_rows];

        int id[num_rows];

        for (unsigned i = 0; i < num_rows; i++)
        {
                row = mysql_fetch_row(res);
                id[i] = atoi(row[0]);
                pthread_create(&thread[i], &threadAttr, thread_func, (void*)id[i]);
        }

        mysql_free_result(res); // Очищаем результаты
        mysql_close(&mysql); // Закрываем соединение

}



при

g++ -ggdb -Wall -Wextra -Werror -ansi -pedantic -o prog `mysql_config --cflags` main.cpp `mysql_config --libs` -pthread
...
Рейтинг: 0 / 0
03.03.2015, 17:25
    #38893890
Calligraff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
Другими словами - запрещаются массивы переменной длины.

ну как бы в данном случае массив конкретный размерностью num_rows
...
Рейтинг: 0 / 0
03.03.2015, 17:40
    #38893925
Calligraff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
pthread_t* thread = new pthread_t[num_rows]; - сработало.
...
Рейтинг: 0 / 0
03.03.2015, 18:48
    #38894003
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
CalligraffДругими словами - запрещаются массивы переменной длины.

ну как бы в данном случае массив конкретный размерностью num_rowsразмер массива должен быть известен на момент компиляции программы, поэтому, кроме как выделять в куче ( pthread_t* thread = new pthread_t[num_rows]; ) другого способа нет
...
Рейтинг: 0 / 0
03.03.2015, 18:48
    #38894006
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
Calligraffpthread_t* thread = new pthread_t[num_rows]; - сработало.
естественно, т.к. выделение памяти во время выполнения кода происходит. Освободить память не забудь.

Так выделяется память во время компиляции:
Код: plaintext
1.
pthread_t thread[num_rows];



PS Почитай книжки, хотя бы "для чайников", С/С++ не бейсик.
...
Рейтинг: 0 / 0
03.03.2015, 19:22
    #38894021
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
egorychразмер массива должен быть известен на момент компиляции программы, поэтому, кроме как выделять в куче ( pthread_t* thread = new pthread_t[num_rows]; ) другого способа нет
Странно это слышать от человека, который только что предлагал std::string

Код: plaintext
1.
2.
std::vector<pthread_t> thread;
thread.resize(num_rows);
...
Рейтинг: 0 / 0
03.03.2015, 19:58
    #38894035
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
Anatoly MoskovskyСтранно это слышать от человека, который только что предлагал std::string принимается
...
Рейтинг: 0 / 0
03.03.2015, 20:11
    #38894045
BagaBaga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
Calligraffpthread_t* thread = new pthread_t[num_rows]; - сработало.

Не забудь почистить память, иначе наделаешь утечек памяти. Для простоты можно использовать умные указатели. Или вообще не использовать динамическое выделение памяти и довериться стандартным контейнерам. vector тебе уже посоветовали. В С++14 появился dyn_array - должен быть легче, чем вектор, и ближе к "сырому" массиву.
...
Рейтинг: 0 / 0
04.03.2015, 19:05
    #38895045
Calligraff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
ok. Спасибо огромное
...
Рейтинг: 0 / 0
04.03.2015, 19:37
    #38895086
BagaBaga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
CalligraffРешил так (ног правильно ли?):
Код: plaintext
1.
2.
3.
4.
5.
char             fname[254];
const char *     PathData = AppConf.Paths.Data.c_str();
char*            sensor_name;
sensor_name      = f_row[1];
sprintf(fname, "%s/%s/temperature", PathData, sensor_name);



Нет. Не правильно.

Никто не гарантирует, что буфер, ссылку на который вы получаете через c_str(), будет сущестовать (после ';') к моменту его использования (у вас - sprintf(fname, "%s/%s/temperature", PathData, sensor_name); ). В большинстве случаев это будет работать, т.к. скорее всего эти данные будут лежать "неиспорченные", но только до тех пор, пока эта память не будет распределена и повторно использована.
...
Рейтинг: 0 / 0
04.03.2015, 20:45
    #38895124
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление "Текст" в char*
egorychCalligraffДругими словами - запрещаются массивы переменной длины.

ну как бы в данном случае массив конкретный размерностью num_rowsразмер массива должен быть известен на момент компиляции программы, поэтому, кроме как выделять в куче ( pthread_t* thread = new pthread_t[num_rows]; ) другого способа нет


есть, использовать вектора...
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Добавление "Текст" в char* / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]