Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> What is wrong in C++? MS VC++ 6.00 
:(
    Опции темы
alex22222
Дата 21.11.2004, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 21.11.2004

Репутация: нет
Всего: нет



What is wrong in C++?

Осваиваю язык С++ на MS VC++ 6.00 Win98.
Написал простую программу для работы с указателями, однако она не работает.
Что тут не так?
Дебагер пишет ошибку: Access Violation

Вот текст файла

// TestLearnDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TestLearn.h"
#include "TestLearnDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

………

void CTestLearnDlg::OnButtontest1()
{
char* mystr1;
char* mystr2;

mystr1 = "mytest";
L= strlen(mystr1);
for (i =0; i<L; i++)
{
*mystr2 = *mystr1;
*mystr2 = mytest;
mystr2++;
mystr1++;
}

Вроде бы все учебнику….


PM MAIL   Вверх
sergejzr
Дата 21.11.2004, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Ну да, весь код тут ошибка smile

mystr2 не имеет своего места в памяти, а мы ему присваиваем значение smile
*mystr2 = *mystr1;

Скажите, что именно Вы собираетесь делать?

И пожалуйста, пользуйтесь тэгами [code=cpp] [/code]


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
alex22222
Дата 21.11.2004, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 21.11.2004

Репутация: нет
Всего: нет



Я пытаюсь скопировать строку как указано в учебниках, а также в файле strcopy.c.
Указатель mystr2 задан в памяти, поэтому нет проблем записать по этому адресу символ.
Например в strcopy.c. выполняется копирование так
*mystr2++=*mystr++;
Но у меня опять ошибка - Access Violation !
Ваше предложение относительно тэгов я не понял, я пока только учусь.
С большим удовольствием приму любую помощь.

PM MAIL   Вверх
sergejzr
Дата 21.11.2004, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Ок smile пройдёмся ещё раз по пунктам smile

Код

// TestLearnDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TestLearn.h"
#include "TestLearnDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

void CTestLearnDlg::OnButtontest1()
{
char* mystr1;
char* mystr2;//Тут задекларирован указатель, но куда он показывает? пока не ясно....

mystr1 = "mytest";//Вот первый указатель показывает на константную строку. Это ОК

L= strlen(mystr1);//Что такое L? Ладно, мы то тогадаемся , что это int
for (i =0; i<L; i++)//Вообще то стринг всегда длиннее на один символ,
//который и показывает, что стринг кончился
{
*mystr2 = *mystr1;//Итак здесь первому элементу mystr2 присваивается первый елемент mystr1.
//Но ведь у  mystr2  не элементов.... Мы так и не определились, куда он показывает :)

*mystr2 = mytest;// Странная переменная mytest. откуда, зачем?
mystr2++; //mystr2 до сих пор не определён :)
mystr1++;//Это ОК
}

Насколько я понимаю, желается следующее:

Код

// TestLearnDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TestLearn.h"
#include "TestLearnDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

void CTestLearnDlg::OnButtontest1()
{
char* mystr1;
char* mystr2;

mystr1 = "mytest";
int L= strlen(mystr1);
mystr2=new char[L+1];//Дадим всё таки память этому указателю :)

for (i =0; i<=L; i++)//последний символ тоже скопируем :)
{
*mystr2 = *mystr1;
//*mystr2 = mytest; смутно представляю, зачем эта строка вообще :)
mystr2++;
mystr1++;
}


Вся конструкция однако заменяется (я бы так написал):
Код

// TestLearnDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TestLearn.h"
#include "TestLearnDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

void CTestLearnDlg::OnButtontest1()
{
char* mystr1;
char* mystr2;

mystr1 = "mytest";
mystr2=new char[strlen(mystr1)+1];//Дадим всё таки память этому указателю :)

while(*mystr2++=*mystr1++);
}



насчёт тэгов smile
сверху есть кнопка КОД
попробуйте вставить в свой пост:
[code=cpp]
#include "stdio.h"
int main(){/*итд.*/}
[/code]


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
alex22222
Дата 21.11.2004, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 21.11.2004

Репутация: нет
Всего: нет



Спасибо за хорошую вещь.
Однако у меня остается смутное впечатление, что все таки я далек от понимания.
Я хочу написать код не пользуясь функциями типа strlen. Опять же в файле strlen.c используется операция *p1=*p2. Почему у меня это не работает?

Относительно вставки [code=cpp] и т.д. то в какой файл это нужно добавить?
Я создал простой проект в MS VC, диалоговое окно с кнопкой OnButtontest1.
При нажатии на эту кнопку я пытаюсь выполнить код. Как в фале strcopy.c.
Еше раз прошу за дремучесть, но уж больно это все интересно.

PM MAIL   Вверх
manu
Дата 21.11.2004, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 14.10.2004

Репутация: 2
Всего: 3



Сам говорил и сам же ошибсяЖ)))

Код

mystr2=new char[strlen(mystr1)+1];//Дадим всё таки память этому указателю :)

PM   Вверх
sergejzr
Дата 21.11.2004, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Вставка [code] это в сообщение на форуме. Для того, чтобы код подсвечивался.

А насчёт без strlen так это надо просто mystr2 памяти сразу побольше дать и 3-ий вариант использовать smile
Цитата(alex22222 @ 21.11.2004, 21:15)
Еше раз прошу за дремучесть

Нет нет, абсолютно ничего страшного smile мы все здесь друг другу помогаем smile

PS:
manu, спасибо smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Guest
Дата 21.11.2004, 23:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А как все таки использовать тело функции strcopy or strrev напрямую, как это делается в файлах strcopy.с or strrev.с. Почему код типа *p2=*p1 не выполняется у меня.

char* mystr1;
char* mystr2;

mystr1 = "mytest";
mystr2 = "notest";

while(*mystr2++=*mystr1++);

тут опять ошибка - Access Violation !
Что не правильно?
  Вверх
bel_nikita
Дата 22.11.2004, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Цитата
Почему код типа *p2=*p1 не выполняется у меня.

переключись в релиз версию
Код

char* mystr1;
char* mystr2;

mystr1 = "mytest";
mystr2 = "notest "; // тута пробельчик надо добавить :)

while(*mystr2++=*mystr1++);



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Гость_alex22222
Дата 22.11.2004, 00:14 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Не работает!
  Вверх
sergejzr
Дата 22.11.2004, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



По вопросу.
  • Во первых не рекомендуется присваивать константным строкам значения. От этого и виолэйшен.
    mystr2 должна указывать на свой участок памяти. Значит закладываться она должна например так:
    Код

    char mystr2[512];
    //или
    char * mystr2=new char[512];
    //а это означает, что память выделена один раз и менять её нельзя! Указатель всего лишь указывает на констаныную память.
    char* mystr2= "Вот тут константная строка!";
  • Во вторых, дже сли бы строка не была константной, у Вас mystr1 на один символ длиннее чем mystr2 (как правильно заметил bel_nikita).

--------------------------------------------

Кстати
while(*mystr2++=*mystr1++);
Это bel_nikita написал первым (не хочу плагиатить smile)

И ещё кстати, bel_nikita, опять ты с константными строками балуешься smile Тем более новичку smile
Как же релиз потом дебагить?
Добавлено @ 00:20
Вот это вставьте в функцию и всё будет прекрасно работать smile
Код

char* mystr1;
char* mystr2;

mystr1 = "mytest";
mystr2=new char[strlen(mystr1)+1];//Дадим всё таки память этому указателю :)
while(*mystr2++=*mystr1++);

printf(mystr2);



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
bel_nikita
Дата 22.11.2004, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Guest
Последуйте совету sergej.z, заверните свой код в функцию.
Вот, 100% рабочий пример:
Код
#include <stdio.h>
void copy(char* out, const char* in)
{
 while (*out++ = *in++);
}

int main(int argc, char* argv[])
{
 char string1[]="TRA-LA-LA";
 char string2[]="LA-LA-TRA";

 copy(string1,string2);

 printf("\nstring1 = %s",string1);
 printf("\nstring2 = %s",string2);

 return 0;
}



smile
Цитата
Кстати while(*mystr2++=*mystr1++);
Это bel_nikita написал первым (не хочу плагиатить )
До меня был Бьерн Страуструп smile

Цитата
И ещё кстати, bel_nikita, опять ты с константными строками балуешься
Кстати, тут в соседнем топике кое-чего про константы написал smile



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
alex22222
Дата 22.11.2004, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 21.11.2004

Репутация: нет
Всего: нет



Уважаемые специалисты!
Прошу прощения за дремучесть еще раз.
Проблема вот в чем.
Я создаю проект в MS VC++, диалоговое окно, с кнопкой Buttontest1.
затем я беру тело функции strcopy, please look at source strcopy.c.
затем я пытаюсь выполнить код
void CTestLearnDlg::OnButtontest1()
{
char* mystr1;
char* mystr2;

mystr1 = "mytest";
mystr2 = "notest";

while(*mystr2++=*mystr1++);

}
Все инициализировано!
Однако ошибка - Access Violation !

Я не хочу использовать стандартные функции типа strlen.
Я просто повторяю код из функции strcopy!
тут нет функции типа main() {}
ЭТО MFC!

PM MAIL   Вверх
sergejzr
Дата 22.11.2004, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Код

mystr1 = "mytest";
mystr2 = "notest";

Разве в стандартной strcpy такое есть?

Цитата(alex22222 @ 21.11.2004, 23:43)
тут нет функции типа main() {}
ЭТО MFC!

Это не важно smile

Код

void CTestLearnDlg::OnButtontest1()
{
char* mystr1;
char empty[512];
char* mystr2=empty;


mystr1 = "mytest";

while(*mystr2++=*mystr1++);

}

Вот рабочий вариант smile
-------------------------

bel_nikita да я имею ввиду, что в дебаге с таким извращением работать невозможно. То, что скомпиленая верся "пропускает" кучу ошибок я не спорю smile Просто зачем делать эти ошибки специально smile?


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
bel_nikita
Дата 22.11.2004, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



alex22222
Код

void copy(char* out, const char* in)
{
  while (*out++ = *in++);
}

void CTestLearnDlg::OnButtontest1()
{
 char mystr1[] = "CONSOLE ";
 char mystr2[] = "NEA, MFC";

 copy(mystr1,mystr2);

 // ну, а тут выводи строки куда хочешь :)
}


Это сообщение отредактировал(а) bel_nikita - 22.11.2004, 01:04


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
JackYF
Дата 22.11.2004, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Люди, как вы не поймете! smile

нельзя использовать конструкцию типа:

Код

char* mystr1;
mystr1="abcde";


можно только так:

Код

char* mystr1="abcde"


Кажется, что отличия минимальны, но первый вариант принципиально неправильный потому что используется ПРИСВАИВАНИЕ, а второй - правильный, потому что компилятор переделывает такую запись приблизительно в

Код

char* mystr1={'a','b','c','d','e','\0'}



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
sergejzr
Дата 22.11.2004, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Какая разница в этом случае?
Кроме конечно "лишнего" присваивания?


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
bel_nikita
Дата 22.11.2004, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



sergej.z
Цитата
То, что скомпиленая верся "пропускает" кучу ошибок я не спорю  Просто зачем делать эти ошибки специально ?
Это дебагер глючный! smile Если я выделил память, то ее я могу должен пользовать, как я хочу. А если я не хочу чтобы этот кусок памяти менялся я конкретно долже указать через const, т.е.:
Код
 const char* const p="NIKOMU NE DAM STROKU";

Вот, теперь я замуровал, так, что никто не доберется smile



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 22.11.2004, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



bel_nikita, неа, не убедил smile
По умолчанию должно быть замуровано. А если надо, то можно и руками размуровать smile

Но помоему это дело вкуса smile т.е. "религиозная война" smile
Так что каждый при своём останется.

Но всё равно было очень интересно.
Жму руку smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
bel_nikita
Дата 22.11.2004, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



JackYF
Цитата
Люди, как вы не поймете! 
нельзя использовать конструкцию типа:

Неа, можно smile Можно все, что не запрещено компилятором smile

Вот, код:
Код
 char* string1;//="TRA-LA-LA";
 char* string2;//="LA-LA_TRA";

 string1 = "TRA-LA-LA";
 string2 = "LA-LA_TRA";

 char* string3="TRA-LA-LA";
 char* string4="LA-LA_TRA";

давайте посмотрим, что творит компилер:
Код

113:
114:    char* string1;//="TRA-LA-LA";
115:    char* string2;//="LA-LA_TRA";
116:
117:    string1 = "TRA-LA-LA";
004055CB   mov         dword ptr [ebp-38h],offset string "TRA-LA-LA" (00434058)
118:    string2 = "LA-LA_TRA";
004055D2   mov         dword ptr [ebp-3Ch],offset string "LA-LA_TRA" (0043403c)
119:
120:    char* string3="TRA-LA-LA";
004055D9   mov         dword ptr [ebp-40h],offset string "TRA-LA-LA" (00434058)
121:    char* string4="LA-LA_TRA";
004055E0   mov         dword ptr [ebp-44h],offset string "LA-LA_TRA" (0043403c)
122:

Так, в чем разница?

Добавлено @ 01:18
smile

sergej.z
неа, а зачем тогда вообще const? как раз для таких случаев smile
Цитата
Но всё равно было очень интересно.
Жму руку 
аналогично smile


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
alex22222
Дата 22.11.2004, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 21.11.2004

Репутация: нет
Всего: нет




/***
*strncpy.c - copy at most n characters of string
*
* Copyright © 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* defines strncpy() - copy at most n characters of string
*
*******************************************************************************/

#include <cruntime.h>
#include <string.h>

/***
*char *strncpy(dest, source, count) - copy at most n characters
*
*Purpose:
* Copies count characters from the source string to the
* destination. If count is less than the length of source,
* NO NULL CHARACTER is put onto the end of the copied string.
* If count is greater than the length of sources, dest is padded
* with null characters to length count.
*
*
*Entry:
* char *dest - pointer to destination
* char *source - source string for copy
* unsigned count - max number of characters to copy
*
*Exit:
* returns dest
*
*Exceptions:
*
*******************************************************************************/

char * __cdecl strncpy (
char * dest,
const char * source,
size_t count
)
{
char *start = dest;

while (count && (*dest++ = *source++)) /* copy string */
count--;

if (count) /* pad out with zeroes */
while (--count)
*dest++ = '\0';

return(start);
}



Уважаемые специалисты!
Я посылаю исходных код функции strcpy в MS
Пожалуйста, не приплетайте сюда const! Иначе пришлю исходный текст strrev.c!!!!
Почему не работает этот код

void CTestLearnDlg::OnButtontest1()
{
char* mystr1;
char* mystr2;

mystr1 = "mytest";
mystr2 = "notest";

while(*mystr2++=*mystr1++);

}
Прошу вас не искать обходные пути, смотрите на исходный текст MS. Почему он работает, когда я вызываю функцию strcpy, а мой нет!

Cordially

начинающий программист Alex



PM MAIL   Вверх
bel_nikita
Дата 22.11.2004, 02:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



alex22222
Чуть было монитор не разбил smile
smile smile smile
Еще раз привожу код:
Код

// делаем свою функцию
void copy(char* out, const char* in)
{
 while (*out++ = *in++);
}

void CTestLearnDlg::OnButtontest1()
{
char mystr1[] = "CONSOLE ";
char mystr2[] = "NEA, MFC";

copy(mystr1,mystr2);

// ну, а тут выводи строки куда хочешь :)
}
Что не работает? На какой строке выдает ошибку? Какую ошибку выдает?


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 22.11.2004, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Мда.а.а ну попробуем тоже ещё раз с другой перспективы...

Строка mystr2 (не побоюсь этого слова) константна для Вижуала. Вы не можете изменять значения константной строки!

или

Компилируйте в Release.. Тогда Вижуал не будет это проверять




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
bel_nikita
Дата 22.11.2004, 02:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



sergej.z
да не, просто надо в функцию завернуть.

Вот, рабочий код в дебаг версии:
Код

void copy(char* out, const char* in)
{
 while (*out++ = *in++);
}

int main(int argc, char* argv[])
{
 char string1[] = "TRA-LA-LA";
 char string2[] = "LA-LA_TRA";

 copy(string1,string2);

 printf("\nstring1 = %s",string1);
 printf("\nstring2 = %s",string2);

 return 0;
}

А вот, если сделаю так, то получу по рукам:
Код
...
 char string1[] = "TRA-LA-LA";
 char string1[] = "LA-LA_TRA";

 while (*string1++ = *string1++);
...


З.Ы.: все! я спасть. завтра на работу, однако...

З.Ы.2: тьфу! сегодня smile

Это сообщение отредактировал(а) bel_nikita - 22.11.2004, 02:19


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 22.11.2004, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Дык ведь он спрашивает, почему его код не работает smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
alex22222
Дата 22.11.2004, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 21.11.2004

Репутация: нет
Всего: нет



Уважаемые специалисты!
Опять я повторяю, я не хочу пользоваться стандартными фукциями типа copy and etc.
Я просто пытаюсь проверить код тела функции strcpy, а она не работает!
Идет ошибка в присваивании
*string1++ = *string1++;
Иду простым путем, повторяю примеры и пытаюсь использовать исходные тексты MS, а они не работают!
Попытки "Компилируйте в Release.. " - это уход от темы и проблемы!
Помогите !!!!!!!!!!!!!!!!!!
PM MAIL   Вверх
sergejzr
Дата 22.11.2004, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата(sergej @ 22.11.2004, 01:12)
Строка mystr2 (не побоюсь этого слова) константна для Вижуала. Вы не можете изменять значения константной строки!

Поэтому он иругается.
то есть

mystr2="чего нибудь";

надо заменить на

mystr2=new char[512];

И тогда mystr2 не будет константной и колпилятор ругаться не будет.





--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
alex22222
Дата 22.11.2004, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 21.11.2004

Репутация: нет
Всего: нет



Эта конструкция мне понятна.
Мне не понятно, почему нельзя делать
*string2++ = *string1++;

для примера попробуйте так:
*string1++ = *string1++;
опять ошибка!
Хотя при вызове стандартной функции strcpy, исходный текст которой я привел, все ОК.
Значит ошибка слева от = *string1++; !!!!!
Может быть надо включить какой ни будь режим типа pragma# когда в режиме MFC, подобные вещи начинают правильно работать?

PM MAIL   Вверх
sergejzr
Дата 22.11.2004, 04:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата(alex22222 @ 22.11.2004, 02:52)
Мне не понятно, почему нельзя делать
*string2++ = *string1++;


потому что string2 константна, а Вы ей значения присваиваете.
А в стандартную strcpy если Вы два константных стринга передадите, тоже будет виолейшен.

Попробуйте написать что нибудь типа:

Код

mystr1 = "mytest";
mystr2 = "notest";
strcpy(mystr1, mystr2);


Точно так же будет виолейшен.

ПС:
Если Вам надоели мои ответы, скажите просто smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
alex22222
Дата 22.11.2004, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 21.11.2004

Репутация: нет
Всего: нет



Да это правда. Однако почему mystr2 рассматривается как константный указатель, остается вопросом. Ведь явно он не был так определен! С оператором new все идет нормально.
PM MAIL   Вверх
shedon
Дата 22.11.2004, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: 4
Всего: 11



Цитата(JackYF @ 21.11.2004, 21:54)
можно только так:


Код 

char* mystr1="abcde"

это неправильно, над так:
char mystr1[]="abcde";

Просто попробуйте соед. код:
Код

char *s = "dfjd";
char z[] = "dfjd";

s[0] ^= s[1];   // Что будет тут
z[0] ^= z[1];   // А что тут ?
   return 0;



--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
!Жека!
Дата 27.11.2004, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 26.11.2004

Репутация: нет
Всего: нет



Цитата(alex22222 @ 22.11.2004, 17:49)
Однако почему mystr2 рассматривается как константный указатель, остается вопросом

Все очень просто.
Ты объявляеш указатель:
Код
char *mystr2;

При этом компилятор не выделяет ни какой памяти, он просто запоминает имя и тип переменной.
Этот указатель не начто не указывает - так.

Далее ты пишеш:
Код
mystr2 = "asdfghjkl";

Здесь компилятор делает небольшую хитрость он выделяет память и иницилизирует ее строкой "asdfghjkl".
Т.е. он выполняет все так как если бы ты написал:
Код
char *mystr2 = "asdfghjkl";
а это константный указатель.
Понял smile
PM MAIL   Вверх
bel_nikita
Дата 27.11.2004, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



!Жека!
Цитата
а это константный указатель.
Понял smile 
Неа smile
Какой же это константный указатель, коли там const нет?


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 27.11.2004, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Условно - константный.
Или константный для дибагера smile
Подойдёт? smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
!Жека!
Дата 27.11.2004, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 26.11.2004

Репутация: нет
Всего: нет



Путь ты и
Код

const
не написал, но при этом ты не иницилизировал свои указатели (
Код

char *mystr
) по этому компилер при первом присваивании значения выделяет память, стоько сколько нужно и константит его. По этому что бы избежать таких вот оштбок необходимо вседа иницилизировать указатели.
Хотя все это зависит от среды программирования и настроек. Вот уменя такой фокус не прошел с выделением и памяти. пришлось писать так:
Код

char *mystr1 = new char[10];
char *mystr2 = "qwerrt";

При этом если ты напишеш так:
Код

char mystr[10];
// а потом
*mystr++ = что-то там

то тоже получиш ошибку, а почему - догадайся. А вообще выкинь тот учебник в котором ты взял такой пример. Это плохой пример или перечитай заново эту статью может что и упустил.[s]
PM MAIL   Вверх
sergejzr
Дата 27.11.2004, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Цитата
то тоже получиш ошибку, а

А ты в релиз скомпиль, ошибка пропадёт smile
Это вечный спор и мы его с Никитой уже долго вели smile
При этом каждый при своём остаётся smile
ПС:
!Жека!, тоже CTRL+S 'ом пытаешься мессагу отправить? smile




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
!Жека!
Дата 27.11.2004, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 26.11.2004

Репутация: нет
Всего: нет



Цитата(sergej @ 27.11.2004, 22:45)
тоже CTRL+S 'ом пытаешься мессагу отправить

Да!!! smile
Ну и на этом закончим!!!
PM MAIL   Вверх
Волод
Дата 27.11.2004, 23:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Прошу прощения, что вмешиваюсь, но меня заинтересовало начало кода с выделением памяти под указатель *mystr2. Как я понял, мы "разносим" указатели в пространстве, выделяя под каждый из них свой блок памяти. А как сделать так, чтобы оба указателя ссылались на один блок? Если это нельзя сделать через *mystr2 = *mystr1; - тогда как?

И второй вопрос по циклу:
Код

while(*mystr2++=*mystr1++);

ЧТо здесь является признаком окончания цикла? Если это выражение при очередном присвоении возвращает ложь, то как и почему? - как здесь происходит контроль выхода за пределы массива?

  Вверх
bel_nikita
Дата 28.11.2004, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



shedon
Цитата
Просто попробуйте соед. код:
Код
char *s = "dfjd";
char z[] = "dfjd";

s[0] ^= s[1];   // Что будет тут
z[0] ^= z[1];   // А что тут ?
  return 0;

Пробывал, в релиз MSVC6 smile Работает smile
!Жека!
Цитата
Ну и на этом закончим!!!
Так, соббсно вопрос не разрешен. Сдаешься? smile

Цитата
А вообще выкинь тот учебник в котором ты взял такой пример
Любите книгу - источник знаний! ( М.Горький ) smile
Цитата

Код
char *mystr2 = "asdfghjkl";
а это константный указатель.
Понял 
Ну какой же это константный указатель? Я бы на твоем месте взял бы учебник полистал, который ты мне предложил выкинуть smile
Вот, константный указатель:
Код
char* const constp = (char*)"dfjd";
И в этом случае, компилятор однозначно будет бить по рукам, вот, к примеру:
Код
 char* const constp = (char*)"dfjd";
 char* p = "dfjd";

 p = (char*)12;
 constp = (char*)12;

так, что char* p = "dfjd"; - никакой не константный указатель.

Волод
Цитата
И второй вопрос по циклу:
Код
while(*mystr2++=*mystr1++);
ЧТо здесь является признаком окончания цикла? Если это выражение при очередном присвоении возвращает ложь, то как и почему? - как здесь происходит контроль выхода за пределы массива?

По другому это выглядит так:
Код
int len=strlen(mystr1);
 for (int i=0; i<len; ++i )
 {
  mystr2[i] = mystr1[i];
 }
 mystr2[i] = 0;


Вернемся к нашей проблеме.
sergej.z
Цитата
Условно - константный.
Или константный для дибагера
Подойдёт? 
Неа smile То что константно в Си, тому приписывается идентификатор const
А проблема, то что в дебаг не работает, а в релиз работает - это все в распеределении памяти smile
Вот, простенький примерчик:
Код
 char *s  = "dfjd";
 printf("\ns = %p",s);
 *s = 2;

Запустите его в дебаг, потом в релиз. И внимательно посмотрите на то, что выпишет printf. Запишите адреса на бумажку. Потом для укрепления теории smile Выполните в релиз:
Код
__asm{
   mov     byte ptr ds:[вставте сначала один адрес, который вы выписали на бумажку. потом второй],2
 };

Я так понимаю, делается это дебагером специально, чтобы в релиз при оптимизации не возникали проблемы.
Кстати, в MSVC 7.1 выдает экзепшен как в дебаг, так и в релиз. Там, немного по другому память выделяется

З.Ы.: кому интересно отличие char*p от char p[] читаем здесь . Потом запускам дебаг режим и смотрим, что компилятор генерит в этих случаях.


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 28.11.2004, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Я всё же попытаюсь коротко ответить на сам вопрос Волод smile

Цитата
Если это нельзя сделать через *mystr2 = *mystr1; - тогда как?

оператор * - содержимое указателя. В этом случае то же, что и [0].
То есть *mystr2 == mystr2[0]
Чтобы указатель показывал на другой участок памяти делаем просто:
mystr2 = mystr1
------------------
Цитата
while(*mystr2++=*mystr1++);

вот когда содержимое указателя mystr1 станет 0. цикл и остановится smile





--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Guest
Дата 28.11.2004, 18:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











sergej.z, спасибо. Ведь знал, что после обьявления указателя обращение к нему идет без оператора*- и вот надо же, стал читать чужой листинг и запарил.
  Вверх
sergejzr
Дата 28.11.2004, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Не проблема smile Все через это проходили smile

ПС:
Добро пожаловать к нам на форум! smile Регистрируйтесь, Вам откроются новые возможности smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1865 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.