Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2015, 23:44   #1
apomin
 
Регистрация: 28.09.2008
Сообщений: 7
По умолчанию Инициализация строки числами

Нужно проинициализировать элемент массива, объявленный как строка char *, значениями, которые объявлены через #define
Последний элемент в строке будет = 0

Например,
Код:
#define FLAG1 150
#define FLAG2 63

struct Test
{
char *ptr;
}

struct Test TestStruct = {
"???" // что сюда писать? должна получиться строка {150, 63, 0}
}
Поясню: дефайнами объявлены значения в диапазоне от 1 до 255.
В каждом элементе массива может быть разное количество значений в такой строке, поэтому показалось логичным объявить элемент строкой.

Реально строка будет использоваться как массив чисел, заканчивающийся нулём.

То есть технически вполне можно хранить в строке такие числа.
Но как это объявить, имея структуру и дефайны?

Может быть, есть какое-нибудь определение массива int с плавающей длиной?

Последний раз редактировалось Stilet; 23.10.2015 в 08:41.
apomin вне форума Ответить с цитированием
Старый 23.10.2015, 07:42   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Код:
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)

struct Test var = { TOSTRING(FLAG1) };
Только зачем??
waleri вне форума Ответить с цитированием
Старый 24.10.2015, 14:19   #3
apomin
 
Регистрация: 28.09.2008
Сообщений: 7
По умолчанию

не очень понял
STRINGIFY(FLAG1) преобразует один int в строку
а как объявить несколько int в строку?
например,
Код:
struct arr {
char	*str;
};
struct arr arr1 = 
{
???
};
#define VAL1 1
#define VAL2 150
нужно, чтобы строка str содержала значения VAL1, VAL2, 0

У меня объявляется массив из 150 элементов, в каждом строка str.
В каких-то элементах массива она пустая, в каких-то должна содержать одно, два и пр. количество символов.
Значения символов у меня объявлены дефайнами, которые используются также в других местах программы.
Хочется их запихнуть в инициализацию массива.

Вместо char * можно объявить, например, с запасом char str[20] или int[20], и заполнять первые элементы, а остальные не использовать.
Но любопытно, есть ли вариант объявления, который использовал бы каждый раз требуемое количество символов

вопрос можно сузить просто к инициализации строки безо всякого массива

Код:
#define VAL1 1
#define VAL151 151 // значения от 0 to 254

char *str = {VAL1, VAL151, 0}; // естественно, не работает
char str[3] = { VAL1, VAL151, 0 }; // работает, но мне нужна строка
любой длины, сколько бы ни было задано элементов

Последний раз редактировалось Stilet; 24.10.2015 в 15:41.
apomin вне форума Ответить с цитированием
Старый 25.10.2015, 17:40   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
#include <iostream>

#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)

#define VAL1 1
#define VAL151 151 // значения от 0 to 127

const char *str = TOSTRING(VAL1)  TOSTRING(VAL15); 


int main()
{
    std::cout << "Hello, world!\n" ;
}
на что вам нужно обратитье внимание?

1.
в зависях вида:
Код:
char *str = {VAL1, VAL151, 0};
в левой части указатель, а не массив

2.
Код:
const char *str
а не
Код:
char *str
потому что указывает на неизменяемые данные (на константу)

3.
вам нужно понять, как работает препроцессор
сейчас вы похоже не понимаете, что делает STRINGIFY

4.
вы не можете закладываться на беззнаковость типа char
а значит, вам гарантируется лишь диапазон от нуля до 127
_Bers вне форума Ответить с цитированием
Старый 29.10.2015, 02:24   #5
apomin
 
Регистрация: 28.09.2008
Сообщений: 7
По умолчанию

signed-unsigned - можно указать тип unsigned char

Вариант со stringify
const unsigned char *str = TOSTRING(VAL1) TOSTRING(VAL151);
даёт строку
"1151"
а мне нужно два байта со значениями
1, 151
И ноль в конце - но это не суть, это можно сделать, если понять, как в принципе инициализировать строку интеждерами.
Может быть, так вообще нельзя проинициализировать, я же не знаю.

Я могу сделать с помощью массива заведомо больше длины, чем нужно
unsigned char str3[5] = {1,151, 0, 0, 0};

На другом форуме мне ещё предложили
std::string str = { VAL1, VAL151, 0};
это нормально работает, но используется класс string

Вопрос любопытен в принципе - можно ли инициализировать просто строку просто числами, безо всяких классов
apomin вне форума Ответить с цитированием
Старый 29.10.2015, 06:49   #6
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Цитата:
Сообщение от apomin Посмотреть сообщение
Нужно проинициализировать элемент массива, объявленный как .... *
Динамические массивы инициализируются только в одном варианте: все элементы конструктором по умолчанию. Ну есть ещё возможность формально динамическому массиву скормить статическую инициализацию. Но как ты собираешься её подстраивать к количеству элементов? Если он фактически статический, тогда фокус проходит. А с истинно динамическим не получится.

Последний раз редактировалось taras-proger; 29.10.2015 в 06:51.
taras-proger вне форума Ответить с цитированием
Старый 29.10.2015, 09:01   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от apomin Посмотреть сообщение
можно ли инициализировать просто строку просто числами, безо всяких классов
Выбирайте, а от не очень понятно что для вас строка, что массив.
const char* array = TOSTRING(VAL1) "," TOSTRING(VAL151);
const char* array[] = { TOSTRING(VAL1), TOSTRING(VAL151) };
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
инициализация vibraxo Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 11.06.2013 03:39
вывести вектор, элементы которого являются наибольшими числами каждой строки матрицы Artur1992 Помощь студентам 1 23.11.2010 11:35
Инициализация Aleksey1989 Общие вопросы Delphi 10 11.09.2010 21:50
Pelles C: операции над двоичными числами в файле, удаление строки из массива TripleX Помощь студентам 12 13.06.2010 14:54
Инициализация Krumyura Общие вопросы C/C++ 5 20.03.2010 23:37