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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.07.2009, 14:06   #11
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

Цитата:
Сообщение от rangerx Посмотреть сообщение
вторую можно переписать так:
Код:
void fnPlus(char *dest, char *src, int dest_buf_size) //dest_buf_size это реальный размер dest массива
{
    /*здесь должны быть все необходимые проверки на то хватит ли места для копирования и т.д.
        ...
    */

    char *p = dest + strlen(dest);
    while(*src) *(p++) = *(src++);
}
P.S. Переход к след элементу осуществляется так p++, а не так, как у вас. Так *p++ вы увеличиваете само значение(если вам так будет понятней, то вы по сути делаете p[1]++).
а попробуйте теперь освободить указатель p и увидете что будет, не советую указатели массивов приравнивать, по сути вы присваиваете адресс в памяти одного указтеля другоу и получаеться тогда что это обсолютно одинаковые указетели. и по сути он не делает p[1]++, во первых нумерация в С++ начинаеться с нуля, во вторых p[1]++ изменяет значение одного байта в массиве на еденицу, а именно этой вашей еденицы. p[1]++ и *p++ не одно и тоже. звездочка указывает на самый первый элемент в массиве а два плюса это начало двигают ) ггггг
lennon вне форума Ответить с цитированием
Старый 28.07.2009, 14:10   #12
Vladss
 
Аватар для Vladss
 
Регистрация: 28.07.2009
Сообщений: 8
По умолчанию

Цитата:
Сообщение от rangerx Посмотреть сообщение
В первом случае никакой ошибки, на первый взгляд, быть не должно.
Вопрос скорее в том, что вы передаёте ей в качестве аргумента.
Ответ: массив символов типа char, либо указатель на строку char *....
Vladss вне форума Ответить с цитированием
Старый 28.07.2009, 15:04   #13
Vladss
 
Аватар для Vladss
 
Регистрация: 28.07.2009
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А где wlen вычисляется?
Прости, ошибся в написании переменной - не wlen, а len......
Vladss вне форума Ответить с цитированием
Старый 28.07.2009, 15:05   #14
rangerx
Пользователь
 
Регистрация: 30.05.2009
Сообщений: 46
По умолчанию

Цитата:
а попробуйте теперь освободить указатель p и увидете что будет
Зачем?
Цитата:
не советую указатели массивов приравнивать, по сути вы присваиваете адресс в памяти одного указтеля другоу и получаеться тогда что это обсолютно одинаковые указетели.
В смысле приравнивать? Где? Вы явно что-то напутали.
Цитата:
по сути он не делает p[1]++, во первых нумерация в С++ начинаеться с нуля
1 здесь была как пример, причём здесь начинается с нуля или не начинается?
Цитата:
вторых p[1]++ изменяет значение одного байта в массиве на еденицу, а именно этой вашей еденицы. p[1]++ и *p++ не одно и тоже.
да, здесь я ошибся. Глаз замылился )
++*p или (*p)++; - изменяем само значение.
*p++(но это не тоже самое, что p++) или p++ или p+=1 - изменяем адрес.
Цитата:
звездочка указывает на самый первый элемент в массиве а два плюса это начало двигают ) ггггг
звездочка может указывать хоть на десятый элемент массива, на то это и указатель(см. мой предыдущий пост). Насчёт "двигающих плюсов" ответил выше.

Последний раз редактировалось rangerx; 28.07.2009 в 17:02.
rangerx вне форума Ответить с цитированием
Старый 28.07.2009, 15:18   #15
rangerx
Пользователь
 
Регистрация: 30.05.2009
Сообщений: 46
По умолчанию

Цитата:
Сообщение от Vladss Посмотреть сообщение
Ответ: массив символов типа char, либо указатель на строку char *....
приведите пример неработающего кода.
P.S. во второй функции вы просто перезаписываете массив, а не присоединяете один к другому. Смотрите пример, который я вам привёл.

Последний раз редактировалось rangerx; 28.07.2009 в 15:20.
rangerx вне форума Ответить с цитированием
Старый 28.07.2009, 16:36   #16
Vladss
 
Аватар для Vladss
 
Регистрация: 28.07.2009
Сообщений: 8
По умолчанию

Цитата:
Сообщение от oleg kutkov Посмотреть сообщение
Так же не могу не обратить внимание на переменную wlen, судя по всему это какая-то глобальная переменная. //***
Вообще работа с указателям - опасная штука. Нужно быть очень внимательным, особенно при активном их использовании.
Вторую функцию предлагаю полностью переписать/****
А вообще, что бы не изобретать велосипед есть замечательные функции:
strcpy и strncpy.
Спасибо за столь развернутый и познавательный ответ, но!
а) переменная wlen - это я по ошибке....Реально len....
б) насчет strcpy и strncpy я полностью согласен. Просто не могу понять - почему в тех примерах просто не могу присвоить значение *(p++) = *(src++);
Vladss вне форума Ответить с цитированием
Старый 28.07.2009, 16:47   #17
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Цитата:
Код:
void fnReverse(char *str) //переворачиваю строку
{
        char temp;
        int len = strlen(str);
        for(int i = 0; i < len/2; i++) 
        {                   
                temp    =       str[i];    
                str[i]    =       str[len-i-1]; //здесь и возникает ошибка
                str[len-i-1] = temp;   
        }
}
теперь найди отличие в двух листингах.
1, Рабочий
Код:
#include <iostream>

void fnReverse(char *str) //переворачиваю строку
{
	char temp;
	int len = strlen(str);
	for(int i = 0; i < len/2; i++) 
	{                   
		temp    =       str[i];    
		str[i]  =       str[len-i-1]; //здесь и возникает ошибка
		str[len-i-1] = temp;   
	}
}

int main() {
	char c[] = "forum";
	fnReverse(c);
	std::cout << c << '\n';
	return 0;
}
2, Не рабочий
Код:
#include <iostream>

void fnReverse(char *str) //переворачиваю строку
{
	char temp;
	int len = strlen(str);
	for(int i = 0; i < len/2; i++) 
	{                   
		temp    =       str[i];    
		str[i]  =       str[len-i-1]; //здесь и возникает ошибка
		str[len-i-1] = temp;   
	}
}

int main() {
	char *c = "forum";
	fnReverse(c);
	std::cout << c << '\n';
	return 0;
}
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 28.07.2009, 17:24   #18
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

Цитата:
Сообщение от rangerx Посмотреть сообщение
Зачем?

В смысле приравнивать? Где? Вы явно что-то напутали.

1 здесь была как пример, причём здесь начинается с нуля или не начинается?

да, здесь я ошибся. Глаз замылился )
++*p или (*p)++; - изменяем само значение.
*p++(но это не тоже самое, что p++) или p++ или p+=1 - изменяем адрес.

звездочка может указывать хоть на десятый элемент массива, на то это и указатель(см. мой предыдущий пост). Насчёт "двигающих плюсов" ответил выше.
зачем нафлудил то?
значит первое: ненужно умничать.
второе: объявлен указатель значит он раположить в динамиской памяти, его нужно освобождать, только переменная в стеке разрушаеться сама когда выходит из области видимости, указатели надо освобождать самому иначе программа будет требовать много ОЗУ а потом когда оно закончиться не будет работать.
третье: ненужно неправильных примеров.
четвертое: двигающиеся плюсы это двигающиеся плюсы
пятое: зачем расписано мне
Код:
да, здесь я ошибся. Глаз замылился ) 
++*p или (*p)++; - изменяем само значение.
*p++(но это не тоже самое, что p++) или p++ или p+=1  - изменяем адрес.
я сказал что p[0]++ не одноо и тоже что и *p++ во втором случае вы поставили указатель которые делает смещает адресс в памяти, в первом всего лишь добавилася еденица. ЛОЛ ))) ненадо пожалуйста больше спорить : )
lennon вне форума Ответить с цитированием
Старый 28.07.2009, 17:34   #19
Vladss
 
Аватар для Vladss
 
Регистрация: 28.07.2009
Сообщений: 8
По умолчанию

Цитата:
Сообщение от ISergeyN Посмотреть сообщение
теперь найди отличие в двух листингах.
1, Рабочий

char c[] = "forum";
fnReverse(c);

2, Не рабочий
char *c = "forum";
fnReverse(c);

}[/CODE]
Ага!!! Спасибо, теперь сам характер ошибки понятен и теперь всё встает на свои места ....код начинает работать. НО! Объясните, пожалуйста, какая между ними разница при передаче оных в качестве агрументов функции?...........
Имхо *str в void fnReverse(char *str) в любом случае указывает на начало массива!???
Заранее спасибо за ответ!
Vladss вне форума Ответить с цитированием
Старый 28.07.2009, 17:46   #20
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Код:
char *c = "forum";
это костанта и вот по этому у тебя прога и падала при попытке изненить значение.
Код:
char c[] = "forum";
а это просто обычный массив с которым можно делать что угодно.
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при работе с БД Access Evgen1976 БД в Delphi 8 16.06.2009 21:29
Ошибка при работе с структурой Nullator Общие вопросы C/C++ 11 07.03.2008 23:52
Ошибка при работе с файлом LeoN Общие вопросы Delphi 1 07.12.2007 15:21
Ошибка при работе с БД malevich БД в Delphi 8 25.11.2007 15:10