Модераторы: 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   Вверх
Страницы: (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.0627 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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