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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2010, 00:16   #1
lameroid
 
Регистрация: 03.09.2010
Сообщений: 4
По умолчанию int vs size_t on 64-bit systems

привет.
имею слудеющую проблему

Код:
char *ch_codepage(char *codepage, char *text, int *len) {
	int one = 1;
	static char buf[2048];
	char my_result[2048]="";
	const char *msghold = text;
	char *res = my_result, *holder = &buf[0];
	size_t outsize, r;
	iconv_t cd;
	char ignore_codepage[40];
	strncpy(ignore_codepage, codepage, 39);
	strncat(ignore_codepage, "//IGNORE", 39 - strlen(codepage));
	cd = iconv_open(ignore_codepage, DEF_CODEPAGE);
	if (cd == (iconv_t)(-1)) {
		return text;
	}
	outsize = 2048;

	r = iconv (cd,(char **) &msghold, len, &holder, &outsize);

	if (r < 0 || (*len) != 0) {
		iconv_close (cd);
		return text;
	}
	*len = 2048 - outsize;
	buf[*len] = 0;
	iconv_close (cd);
	return &buf[0];
}
в данном коде,
r = iconv (cd,(char **) &msghold, len, &holder, &outsize);
len - тип int, но iconv подразумевает, что там будет передан тип size_t

extern size_t iconv (iconv_t __cd, char **__restrict __inbuf,
size_t *__restrict __inbytesleft,
size_t *__restrict __outbytesleft);

на 32 битных системах оно работает нормально. на 64 битах имеем сегментейшен фоулт. как я понимаю из-за неверного представления о размере size_t.

подскажите пожалуйста, как заставить это дело работать на 64 бит.
lameroid вне форума Ответить с цитированием
Старый 03.09.2010, 00:24   #2
nowaalex
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 59
По умолчанию

На первый взгляд...size_t - это не int, а unsigned int...
nowaalex вне форума Ответить с цитированием
Старый 03.09.2010, 00:53   #3
lameroid
 
Регистрация: 03.09.2010
Сообщений: 4
По умолчанию

Цитата:
Сообщение от nowaalex Посмотреть сообщение
На первый взгляд...size_t - это не int, а unsigned int...
Это то понятно. Но на 32-бит оно работает нормально. Нужно как-то решить проблему с 64. Вот и прошу совета.
lameroid вне форума Ответить с цитированием
Старый 03.09.2010, 14:46   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
len - тип int
А что, кроме религии, не позволяет сделаеть его size_t?
p51x вне форума Ответить с цитированием
Старый 03.09.2010, 15:38   #5
lameroid
 
Регистрация: 03.09.2010
Сообщений: 4
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
А что, кроме религии, не позволяет сделаеть его size_t?
То, что переписывать придется достаточно много. И в этом случае потребности нету, т.к. проблема именно в этом одном месте.

Нужно как-то внутри этой функции разбораться с типами.... Помогите пожалуйста.
lameroid вне форума Ответить с цитированием
Старый 03.09.2010, 21:36   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Попробуйте приведение типов.
p51x вне форума Ответить с цитированием
Старый 04.09.2010, 00:38   #7
lameroid
 
Регистрация: 03.09.2010
Сообщений: 4
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Попробуйте приведение типов.
пробовал по разному, ничего не вышло.

size_t hui = *len;
r = iconv (cd,(char **) &msghold, &hui, &holder, &outsize);

компилятор не ругается, не сегфолтится, но и не работает.

в чем же может быть проблема?
lameroid вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
int vs unsigned int Kn793 Общие вопросы C/C++ 13 28.08.2010 22:00
Импорт 32-bit dll в 64-bit valchakov Общие вопросы Delphi 8 25.12.2009 15:18
Autorestart systems , HELP me NecRoMat Свободное общение 5 12.08.2008 19:45