Форум программистов, компьютерный форум CyberForum.ru

Ошибка в главной функции программы - C++

Восстановить пароль Регистрация
 
Алина_258
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 11
13.06.2011, 14:33     Ошибка в главной функции программы #1
Здравствуйте!
Код программы:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
//Объявите класс с именем text. Объявите функцию show(), функция сортирования текста по возрастанию.
//Текст можно вставить любой, а сортировать по количеству букв в слове от меньшего к большему ну или на оборот.
 
//подключаемые файлы
#include <ctype>
#include <fstream>
//
#include <windows>
#include <iomanip>
#include "stdafx.h"
#include <string.h>
#include <locale>
#include <stdio.h>
#include <iostream>
//подключение поля namespase
using namespace std;
 
//класс текст
class Text
{
    //скрытые элементы класса
private:
    //указатель на слово
    char* str;
    int st3;
    //разсер
    int size;
    //количество овторений
    int* k;
     //буфер
    char buffer;
    //доступные элементы класса
public:  
    //Функция возврата массива символов 
    const char* Show(void);
 
    //Функция сортировки слов (по возрастанию)
    void SortWord(void);
 
    //Опаратор присваивание Text = char*;
    Text& operator= (char*);
    
    //Перегрузка конструктора копирование  по умолчанию
    Text& operator= (Text&);
    //Конструктор по умолчанию + инициализация переменной
    &Text(char* = "");    
    //Деструктор класса
    ~Text();
};
 
//Перегрузка конструктора копирование  по умолчанию
Text& Text::operator= (Text& Value)
{
    //удаляем переменную str
    delete[] str;
    //в прееменнуб длины записывает длину слова
    size = strlen(Value.str);
    //заводим символьную переменную с вычисленны м размером
    str = new char[size+1];
    //заводим числовой массив частоты слов
    k= new int[size+1];
    //копируем в str строку
    strcpy(str,Value.str);
    //возвращаемуказатель *this
    return *this;
}
 
//Конструктор по умолчанию + инициализация переменной
Text& Text::operator= (char *Value = "") 
{
    size = strlen(Value); // Запишим размер строки 
   str = new char[size+1]; //Выделим память под размер строки + нулевой символ 
 memset(str,0,size+1); //Обнулим выделеную память
   if (strlen(Value)>0)
   {
        strcpy(str,Value); //Скопируем Value - в память
 }
    k= new int[size+1] ; // переменной k с длиной size+1 даёсзначение 1
    return *this;
 
}
 
//Функция возврата массива символов 
const char* Text::Show(void)  // константный символьный указатель на функцию класса возвращает значение str
{
 
    int Word = 0; //Счетчик слов
    char** ArrWord = new char*[size+1]; //Массив слов
    char *buffer = new char[size+1]; //Буферная переменная
    char *ptr = buffer; //Указатель на буферную переменную
    memset(buffer,0,size+1); //Обнулим буфрную переменную
    char *pl;
    char c = ' ';
 
     for (int i=0; i <= strlen(str); i++) //Обойдем по-символьно всю строку
    
 
        *pl = *strrchr(str, c);
 
        int i = 0;
 
        if (!pl) //Если не пробел
        {
            char *ptr;
            *ptr++ = str[i]; //Пишим в буферную переменную и сдвигаем указатель
            i++;
 
        }
        else 
            if (strlen(buffer)>0) //Если же управляющий или разделитель и длина буферной переменной >0
        {
            ArrWord[Word] = new char[size+1]; //Выделим память под слово
            strcpy(ArrWord[Word++],buffer); //Скопируем буферную переменную в слово
            memset(buffer,0,size+1); //Обнулим память буферной переменной
            ptr = buffer; //Поставим указатель на начало буферной переменной
        }
            else {}
 
 
    char buf='0';
    const char *buff = &buf;
    strcpy(str,ArrWord[0]);
    strcpy(str, buff);
    strcpy(str, ArrWord[Word]);
 
//const int Word;
    //const int kо=k[0];
    //const int kw=k[Word];
 
    //struct stroka
    //{char str;
    //int ko;
    //int   kw;};
 
    return  str;
    k[0];
    k[Word];
}
 
//Функция сортировки слов (по возрастанию)
void Text::SortWord(void)
{        
 
    int Word = 0; //Счетчик слов
    char** ArrWord = new char*[size+1]; //Массив слов
    char *buffer = new char[size+1]; //Буферная переменная
    char *ptr = buffer; //Указатель на буферную переменную
    memset(buffer,0,size+1); //Обнулим буфрную переменную
    char *pl;
    char c = ' ';
 
    for (int i=0; i <= strlen(str); i++) //Обойдем по-символьно всю строку
    {
 
 
        *pl = *strrchr(str, c);
 
        if (!pl) //Если не пробел
        {
            char *ptr;
            *ptr++ = str[i]; //Пишим в буферную переменную и сдвигаем указатель
            k[i]=1;
        }
        else 
            if (strlen(buffer)>0) //Если же управляющий или разделитель и длина буферной переменной >0
        {
            ArrWord[Word] = new char[size+1]; //Выделим память под слово
            strcpy(ArrWord[Word++],buffer); //Скопируем буферную переменную в слово
            memset(buffer,0,size+1); //Обнулим память буферной переменной
            ptr = buffer; //Поставим указатель на начало буферной переменной
        }
            else {}
 
    }
    for (int i=0; i<Word-1; i++) /*в цикле обходим все лова*/
    {for (int j=1; j<Word; j++)
 
        {if (ArrWord[i]==ArrWord[j]) /*если слова под обоими объектами одинаковы */
    {k[i] = k[i] + 1;}/* количество повторений увеличиваем на 1*/
}}
 
    //const char *bufer= &buffer;
 
    //int k[size] = {1};
 
    //int str_len = strlen(buffer);
 
    //int i;
   // for(i = 0; i < str_len; i++)
   // {
   //     k[(unsigned char)str[i]]++;
   // }
 
 
    memset(str,0,size+1); //Обнулим строку
    //Сортируем слова по длине
 
    //char Arrword[100];
 
    for (int i = 0; i<Word-1; i++)//Обойдем весь массив слов
    {
        int mkol=k[i];//mkol присваивается значение k текущее
        char * Max =  ArrWord[i];// символьной переменной Max присваивается указатель на пермененную с индексом i массива Arrword
        int pos = i; // значению целочисленной переменной pos присваивается значение i
 
        for (int j=i; j<Word; j++) //Обойдем все слова с i 
        {
            if (mkol < k[pos])
            {
               Max =  ArrWord[j];
                mkol = k[j];
                pos = j;
            }
 
 
if (ArrWord[i]==Max)
{}
else
{strcpy(buffer, ArrWord[i]);
strcpy (ArrWord[i],ArrWord[j]);
strcpy (ArrWord[j], buffer);
}
 
                Max =  ArrWord[i];
                mkol = k[i];
                pos = i;
strcat(str,ArrWord[i]);
                }
        if ( (i+1) != Word) strcat(str," ");
    }
    for (int i = 0; i<Word; i++)
    {
        delete[] ArrWord[i];
    }
    delete [] buffer;
    delete [] ArrWord;
}
 
//Деструктор класса
Text::~Text()
{
    delete[] str;
}
 
 
// главный код программы
int _tmain(int argc, _TCHAR* argv[])
{
    //поключение русского языка
    setlocale(LC_ALL, "Russian");
    
    //Тестирование класса Text
    //инициализируем k
 
char ttext;
cout<<"введите текст"<< endl;
cin>> ttext;
char *text= &ttext;
cout<< text<< endl;
    Text K(text);
    //выполняе выполнение функции для K объекта с текстом 
    K.SortWord();
    //печатаем результат
    std::cout<<K.Show()<<std::endl;
return 0;
}
Выводимые ошибки:
Ошибка 23 error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Text::Text(char *)" (??0Text@@QAE@PAD@Z) в функции _wmain la3.obj la3
Ошибка 24 fatal error LNK1120: 1 неразрешенных внешних элементов K:\учёба\Разработка и стандартизация\la3\Debug\la3.exe 1 la3

Что это значит и в чём ошибка?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
13.06.2011, 14:41     Ошибка в главной функции программы #2
1. Надо писать, в какой системе работаешь. Хотя, скорее всего - в Студии.
2. Это что за фигня:
C++
1
2
   //Конструктор по умолчанию + инициализация переменной
    &Text(char* = "");


3. Это - не конструктор копирования - это операция присваивания.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Перегрузка конструктора копирование  по умолчанию
Text& Text::operator= (Text& Value)
{        //удаляем переменную str
    delete[] str;
        //в прееменную длины записывает длину слова
    size = strlen(Value.str);
        //заводим символьную переменную с вычисленны м размером
    str = new char[size+1];
        //заводим числовой массив частоты слов
        k= new int[size+1];
        //копируем в str строку
    strcpy(str,Value.str);
        //возвращаемуказатель *this
    return *this;
}
И в ней - классический косяк!
C++
1
2
      //удаляем переменную str
    delete[] str;
А если a = a?
Огребешь все прелести потерянных ссылок.
tylix
68 / 55 / 6
Регистрация: 10.06.2011
Сообщений: 149
13.06.2011, 16:07     Ошибка в главной функции программы #3
C++
1
2
3
4
5
&Text(char* = ""); по этому поводу
 
Объяви две функции члена
Text(); // Конструктор по умолчанию
Text(char *Value); // Конструктор с параметром
И как сообщил уважаевый ValeryLaptev, огребешь ох огребешь..

Не по теме:

а задание прикольное, попробую решить



Добавлено через 1 час 14 минут
Вот функция которая поменяет следование слов в строке (короткие слова влево длин. вправо
минус: не учитывается кол-во пробелов между слов, т.е. в результирующей строке между словами ставится один пробел

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
struct WordInfo {
    char *p;        // ссылка на сл.
    int l;          // длина сл.
};
 
void SplitAndSort(char* dst, char *src) {
    char *p;
    int count; // кол-во слов
    WordInfo wi[30]; // резерв. под 30 слов
    WordInfo tmp_wi;
    count = 0; // пока их 0
 
    p = src;
    for (;;) {
        while (*p && *p == ' ') p++; // пропускаем пробелы
        if (*p)
            wi[count].p = p; // начало слова
        else
          break; // все слова найдены
        while (*p && *p != ' ') p++;
        wi[count].l = p - wi[count].p; // размер слова в символах
        count++;
    }
    // сортировка мет. пуз. по длине слов
    for (int x = count; x > 0; x --)
        for (int y = 0; y < x; y++) {
            // короткие слова влево длинные вправо
            if (wi[y].l > wi[y+1].l) {
                tmp_wi  = wi[y+1];
                wi[y+1] = wi[y];
                wi[y]   = tmp_wi;
            }
        }
    p = dst;
    for (int i = 0; i < count; i++) {
        memcpy(p, wi[i].p, wi[i].l);
        if (i < count - 1) {
            p[wi[i].l] = ' '; // вставляем разд. между слов
            p += wi[i].l + 1;
        }
        else
            p[wi[i].l] = '\0'; // иначе конец строки
    }
}
Алина_258
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 11
13.06.2011, 18:07  [ТС]     Ошибка в главной функции программы #4
Пишу в Visual Studio 2008.
Вижу, delete и правда не к месту.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
13.06.2011, 18:36     Ошибка в главной функции программы #5
Цитата Сообщение от Алина_258 Посмотреть сообщение
Пишу в Visual Studio 2008.
Вижу, delete и правда не к месту.
Оно к месту. Только все это надо делать внутри
C++
1
2
3
4
if(this != Value)
{
...
}
Это контрольная проверка как раз для а = а;
Ведь в этом случае ничего делать-то и не надо...
tylix
68 / 55 / 6
Регистрация: 10.06.2011
Сообщений: 149
13.06.2011, 18:54     Ошибка в главной функции программы #6
Вот пример, вроде работает, если я правильно понял задание
ПС: в первой функции которую я выложил ошибка!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
 
 
struct WordInfo {
    char *p;        // ссылка на сл.
    int l;          // длина сл.
};
 
 
class Text {
    char *buf;
    int size;
public:
    Text();
    Text(char *s);
    ~Text() { delete [] buf; };
    Text &operator=(Text &txt);
    Text &operator=(char *s);
    void Show();
    void Sort();
 
};
 
void Text::Show() {
    cout << buf << endl;
}
 
Text::Text() {
    size = 1;
    try {
        buf = new char[size];
    } catch (bad_alloc xa) {
        cout << "Ошибка выбеления памяти\n";
        exit(1);
    }
    buf[0] = '\0';
}
 
Text::Text(char *s) {
    size = strlen(s) + 1;
    try {
        buf = new char[size];
    } catch (bad_alloc xa) {
        cout << "Ошибка выбеления памяти\n";
        exit(1);
    }
    strcpy(buf, s);
}
 
Text& Text::operator=(Text &txt) {
    if (txt.size > size) {
        delete [] buf;
        try {
            buf = new char[txt.size];
        } catch (bad_alloc xa) {
            cout << "Ошибка выбеления памяти\n";
            exit(1);
        }
        size = txt.size;
    }
    strcpy(buf, txt.buf);
 
    return *this;
}
 
Text& Text::operator=(char *s) {
    int sz = strlen(s) + 1;
 
    if (size < sz) {
        delete [] buf;
        try {
            buf = new char[sz];
        } catch (bad_alloc xa) {
            cout << "Ошибка выбеления памяти\n";
            exit(1);
        }
        size = sz;
    }
    strcpy(buf, s);
    return *this;
}
 
 
 
void Text::Sort() {
    char *p;
    int count; // кол-во слов
    WordInfo wi[30]; // резерв. под 30 слов
    WordInfo tmp_wi;
    count = 0; // пока их 0
    char *dst;
 
    p = buf;
    for (;;) {
        while (*p && *p == ' ') p++; // пропускаем пробелы
        if (*p)
            wi[count].p = p; // начало слова
        else
          break; // все слова найдены
        while (*p && *p != ' ') p++;
        wi[count].l = p - wi[count].p; // размер слова в символах
        count++;
    }
    // сортировка мет. пуз. по длине слов
    for (int x = count-1; x > 0; x--)
        for (int y = 0; y < x; y++) {
            // короткие слова влево длинные вправо
            if (wi[y].l > wi[y+1].l) {
                tmp_wi  = wi[y+1];
                wi[y+1] = wi[y];
                wi[y]   = tmp_wi;
            }
        }
    try {
       dst = new char[size];
    } catch (bad_alloc xa) {
        cout << "Ошибка выбеления памяти\n";
        exit(1);
    }
    p = dst;
    for (int i = 0; i < count; i++) {
        memcpy(p, wi[i].p, wi[i].l);
        if (i < count - 1) {
            p[wi[i].l] = ' '; // вставляем разд. между слов
            p += wi[i].l + 1;
        }
        else
            p[wi[i].l] = '\0'; // иначе конец строки
    }
    strcpy(buf, dst);
    delete [] dst;
}
 
int main()
{
    Text A;
    
    A = "This is my program I like C++";
    
    Text B("VeryLongWord Hello People");
 
    A.Show(); B.Show();
    A.Sort(); B.Sort();
    cout << endl;
    A.Show(); B.Show();
    return 0;
}
Yandex
Объявления
13.06.2011, 18:54     Ошибка в главной функции программы
Ответ Создать тему
Опции темы

Текущее время: 06:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru