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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2023, 19:56   #1
максхи
Пользователь
 
Регистрация: 20.12.2021
Сообщений: 59
По умолчанию как правильно инициализировать строку

Функция создаёт строку CString на основе числа.
В строке chce[s] = sem[u % 7]; появляется ошибка "нарушение прав доступа при чтении".
Код:
CString* tose(float i)
{
	int s = 0;
	CString* zac=0;
	char sem[7] = { '0', '1', '2', '3', '4', '5', '6' };
	float ma;
	float ex = modf(i, &ma);
	int u = (int)ma;
	CString* chce = new CString;
	CString* chdr = new CString[7];
	chce[s] = '0';
	chdr[s] = '0';
	while (u != 0)
	{

		chce[s] = sem[u % 7];
		s += 1;
		u = u / 7;
	}
	for (int t = s; t >= 0; t--)
		s = 0;
	do {
		ex = ex * 7;
		ex = modf(ex, &i);
		chdr[s] = sem[(int)i];
		s = s + 1;
	} while ((ex != 0) && (s < 6));
        return (zac);
	delete(chdr);	delete(chce);	delete(zac);
}
Как мне правильно задавать chce и chdr, если размер неизвестен?
максхи вне форума Ответить с цитированием
Старый 04.08.2023, 21:36   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Выкинуть все new, тем более, что zac так и осталась неиспользованна.
Выкинуть все delete, тем более, что после return код функции дальше не исполняется.
Для добавления символа хотя бы использовать оператор +.
Выкинуть бесполезный цикл
Код:
for (int t = s; t >= 0; t--)
p51x вне форума Ответить с цитированием
Старый 05.08.2023, 11:10   #3
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 736
По умолчанию

Из десятичной системы счисления в семиричную? Абсолютно все нужно исправлять.
Cuprum5 на форуме Ответить с цитированием
Старый 05.08.2023, 13:40   #4
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 736
По умолчанию

Почему в CodeBlocks вот эта строка вначале программы:
Код:
#include <iostream>
#include <cstring>
using namespace std;
CString zac;
приводит к ошибке:
main.cpp|4|error: 'CString' does not name a type|
Как это решить?
Cuprum5 на форуме Ответить с цитированием
Старый 05.08.2023, 14:01   #5
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 736
По умолчанию

Что-то Cstring совсем не работает. Если можно, то лучше перейти на string или null-terminated C string?
Cuprum5 на форуме Ответить с цитированием
Старый 05.08.2023, 15:00   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
Как это решить?
Код:
#include <atlstr.h>
Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
Что-то Cstring совсем не работает. Если можно, то лучше перейти на string или null-terminated C string?
А Cstring не null-terminated? Если не понимает человек как с объектами работать, то какая разница Cstring или string.
p51x вне форума Ответить с цитированием
Старый 05.08.2023, 15:05   #7
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 736
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
#include <atlstr.h>
- это что? Для VS? У меня Code Blocks.
Cuprum5 на форуме Ответить с цитированием
Старый 06.08.2023, 07:13   #8
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 965
По умолчанию

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
приводит к ошибке:
main.cpp|4|error: 'CString' does not name a type|
Как это решить?
CString - это класс из MFC


Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
#include <cstring>
а это стандартный заголовок для работы с сишными строками (аналог <string.h> из C)

используй
Код:
#include <string>
...
std::string
Алексей1153 вне форума Ответить с цитированием
Старый 06.08.2023, 12:00   #9
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 736
По умолчанию

Со string вот так:
Код:
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
string zac;

void to_sem(float i)
{
	int s = 0, dl;
	char temp, sem[7] = {'0', '1', '2', '3', '4', '5', '6'};
	float ip, ex = modf(i, &ip);
	int u = (int)ip;
	string chce, chdr;

	while(u)
	{
		chce += sem[u%7];
		s++;
		u /= 7;
	}

	//Reverse
	dl = chce.length();
	for(int t = 0; t < dl/2; t++)
    {
        temp = chce[t];
        chce[t] = chce[dl-t-1];
        chce[dl-t-1] = temp;
    }

	do{
		ex *= 7;
		ex = modf(ex, &i);
		chdr += sem[(int)i];
		s++;
	}while(ex && (s < 7));

    zac = chce + '.' + chdr;
    //return zac;
}

int main()
{
    float n = 1010.187;
    //string* ps = &zac;
    to_sem(n);

    cout << "sem = " << zac << '\n';
    return 0;
}
Cuprum5 на форуме Ответить с цитированием
Старый 06.08.2023, 12:09   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Глобальные переменные, using namespace std; глобально, длина и индекс интами, ручной реверс строки, ... я б вас даже джуном не взял.
p51x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расшифровать строку правильно Arthur80321 Помощь студентам 0 05.12.2018 21:38
cout не выводит правильно строку. FULEREN Общие вопросы C/C++ 2 10.02.2015 21:14
Как правильно заменить строку WennY Общие вопросы Delphi 5 05.09.2011 09:16
как правильно записать строку? Vladimir-belikov Помощь студентам 4 10.06.2011 08:40
Как правильно инициализировать через функцию массив? Catharsis Общие вопросы C/C++ 3 14.05.2010 16:34