С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Алина_258
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 11
#1

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

13.06.2011, 14:33. Просмотров 366. Ответов 5
Метки нет (Все метки)

Здравствуйте!
Код программы:


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

Что это значит и в чём ошибка?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2011, 14:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка в главной функции программы (C++):

Написать функцию, организовать ее вызов в главной функции программы - C++
Помогите, пожалуйста, написать программу. Только начали изучать функции, не могу понять, как надо сделать.

Не могу вывести "функции" за пределы главной программы - C++
#include&lt;iostream&gt; #include&lt;cmath&gt; #include&lt;iomanip&gt; using namespace std; int main() { setlocale(0, &quot;&quot;); float...

Написание программы вычисления функции. Ошибка - C++
Написал программу, не могу понять, где описать часть условия, и вывести главное. Задание написать программу вычисления функции: ...

Аварийное завершение программы, ошибка в функции вывода. - C++
Здравствуйте все. Пишу программу для сложения, вычитания матриц. Использую перегрузку операторов. При выводе результатов возникает ошибка и...

В главной функции main () ввести входные данные, и вызвав собственные функции, вычислить значение выражения и вывести результаты - C++
В главной функции main () ввести входные данные, и вызвав собственные функции, вычислить значение выражения и вывести результаты. ...

Циклы внутри главной функции - C++
Здравствуйте. Помогите новичку с решением задачи. Необходимо создать массив (количество элементов массива будет вводиться с клавиатуры,...

5
ValeryLaptev
Эксперт С++
1046 / 825 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
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?
Огребешь все прелести потерянных ссылок.
0
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'; // иначе конец строки
    }
}
0
Алина_258
0 / 0 / 0
Регистрация: 10.06.2011
Сообщений: 11
13.06.2011, 18:07  [ТС] #4
Пишу в Visual Studio 2008.
Вижу, delete и правда не к месту.
0
ValeryLaptev
Эксперт С++
1046 / 825 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
13.06.2011, 18:36 #5
Цитата Сообщение от Алина_258 Посмотреть сообщение
Пишу в Visual Studio 2008.
Вижу, delete и правда не к месту.
Оно к месту. Только все это надо делать внутри
C++
1
2
3
4
if(this != Value)
{
...
}
Это контрольная проверка как раз для а = а;
Ведь в этом случае ничего делать-то и не надо...
0
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;
}
0
13.06.2011, 18:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2011, 18:54
Привет! Вот еще темы с ответами:

Что в главной функции main - C++
Друзья, вот программка: добавление данных в упорядоченное двоичное дерево. У меня есть функция добавления, все норм, только вот никак не...

Ошибка в конструкторе с параметром. Компилятор не ругается, но при запуске программы возникает ошибка - C++
Я знаю точно, что ошибка в конструкторе с параметром. Компилятор не ругается, но при запуске моей программы windows выдает ошибку. Почему ?...

Переменные из процедуры доступны в главной функции - C++
Добрый вечер. Друг мне дал процедуру: void multm(int a, int b, int result) { int i, j, i1; for (i=0; i&lt;3; i++) { ...

Укажите где ошибка (ошибка во время выполнения программы) - C++
Здравствуйте, помогите пожалуйста найти ошибки в коде которые возникаю при выполнении программы Картинка с ошибкой внизу поста. Код: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.