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

Подскажите простой способ добавления строковых данных "Например вот таких" в переменную типа 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
Добавление "Текст" в char*
    #38893728
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
char* это указатель, а не строка. Про указатели почитай.
...
Рейтинг: 0 / 0
Добавление "Текст" в char*
    #38893735
Calligraff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. уже читаю.
НО вопрос все же открыт.

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

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


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

AppConf.Paths.Data - std::str

Спасибо
...
Рейтинг: 0 / 0
Добавление "Текст" в char*
    #38893863
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Добавление "Текст" в char*
    #38893867
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Добавление "Текст" в char*
    #38893870
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);
...
Рейтинг: 0 / 0
Добавление "Текст" в char*
    #38893873
Calligraff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
одновременно почти написали про ".c_str()" :))
...
Рейтинг: 0 / 0
Добавление "Текст" в char*
    #38893874
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calligraff, а зачем тебе остальные то char*? делай всё на std::string, что ж ты мучаешься то с ними?
...
Рейтинг: 0 / 0
Добавление "Текст" в char*
    #38893886
Calligraff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Добавление "Текст" в char*
    #38893890
Calligraff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Другими словами - запрещаются массивы переменной длины.

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

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

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



PS Почитай книжки, хотя бы "для чайников", С/С++ не бейсик.
...
Рейтинг: 0 / 0
Добавление "Текст" в char*
    #38894021
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Добавление "Текст" в char*
    #38894035
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyСтранно это слышать от человека, который только что предлагал std::string принимается
...
Рейтинг: 0 / 0
Добавление "Текст" в char*
    #38894045
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Calligraffpthread_t* thread = new pthread_t[num_rows]; - сработало.

Не забудь почистить память, иначе наделаешь утечек памяти. Для простоты можно использовать умные указатели. Или вообще не использовать динамическое выделение памяти и довериться стандартным контейнерам. vector тебе уже посоветовали. В С++14 появился dyn_array - должен быть легче, чем вектор, и ближе к "сырому" массиву.
...
Рейтинг: 0 / 0
Добавление "Текст" в char*
    #38895045
Calligraff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ok. Спасибо огромное
...
Рейтинг: 0 / 0
Добавление "Текст" в char*
    #38895086
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Добавление "Текст" в char*
    #38895124
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychCalligraffДругими словами - запрещаются массивы переменной длины.

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


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


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