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

Функция не возвращает в программу структуру C++ - C++

Восстановить пароль Регистрация
 
skafiend
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 10
07.01.2011, 20:42     Функция не возвращает в программу структуру C++ #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
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
 
struct ABC
{
  char szChar;
  float fFreq;
};
 
ABC Frequency_Analysis(FILE *pAnyFile, int nCountSymbols);
 
main()
{
using namespace std;
 
// Переменная хранит количество элементов
const int nCountSymbols = 27;
 
// Создаем экземпляр структуры и обнуляем ее
ABC Enc[nCountSymbols] = {NULL};
ABC NotEnc[nCountSymbols] = {NULL};
 
FILE *pf = NULL;
 
// Открываем обычный файл для определения частот
pf = fopen("File.txt", "r");
 
cout << "Частоты обычного файла:" << "\n";
 
NotEnc[nCountSymbols] = Frequency_Analysis(pf, nCountSymbols);
 
// Закрываем обычный файл в функции
 
pf = NULL;
 
// Открываем файл c шифрованным сообщением
pf = fopen("EncryptedFile.txt", "r");
 
cout << "\n" << "Частоты шифрованного файла:" << "\n";
 
Enc[nCountSymbols] = Frequency_Analysis(pf, nCountSymbols);
 
// Закрываем шифрованный файл в функции
 
pf = NULL;
FILE *pf2 = NULL;
 
// Открываем файл с шифровкой на чтение
  pf = fopen("EncryptedFile.txt", "r");
 
// Открываем файл с расшифровкой на основе частот на запись
  pf2 = fopen("Total.txt", "w");
 
char cBuf = NULL;
 
// Дешифруем на основе частот
  for(int nCount = 0; !feof(pf); nCount++)
  {
    cBuf = fgetc(pf);
    for(int nCount2 = 0; nCount2 < nCountSymbols; nCount2++)
    {
      if (cBuf == Enc[nCount2].szChar)
        {
           cout << cBuf;
           fputc(NotEnc[nCount2].szChar, pf2);
           break;
        }
    }
  }
 
    fclose(pf);
    fclose(pf2);
 
}
 
// Функция осуществляет частотный анализ и возвращает результат 
//+ в программу в виде структуры
ABC Frequency_Analysis(FILE *pAnyFile, int nCountSymbols)
{
 
using namespace std;
 
// Количество символов в сообщении
int nBuf = 0;
 
// Создаем экземпляр структуры
ABC Enc[nCountSymbols];
char cBuf = NULL;
 
// Обнуляем структуру
        for(int nCount = 0; nCount < nCountSymbols; nCount++)
        {
          Enc[nCount].szChar = NULL;
          Enc[nCount].fFreq = NULL;
        }
 
// Считаем количества символов в файле и пишем в структуру
//+ Символ -> Количество
while (!feof(pAnyFile))
{
  nBuf++;
  cBuf = fgetc(pAnyFile);
  if ((int)cBuf != 32)
    {
     Enc[(int)cBuf - 97].szChar = cBuf;
     Enc[(int)cBuf - 97].fFreq = Enc[(int)cBuf - 97].fFreq + 1;
    }
  else
    {
     Enc[26].szChar = ' ';
     Enc[26].fFreq = Enc[26].fFreq + 1;
    }
}
 
// Считаем частоты вхождений
        for(int nCount = 0; nCount < nCountSymbols; nCount++)
        {
          Enc[nCount].fFreq = (Enc[nCount].fFreq / nBuf) * 100;
        }
 
// Временные переменные для хранения значений структуры
float fBuf = 0;
cBuf = NULL;
 
// Делаем перестановку элементов структуры шифра по убыванию частот
  for(int nCount = 0; nCount != nCountSymbols - 1; nCount++)
  {
    for(int nCount2 = nCount; nCount2 != nCountSymbols; nCount2++)
    {
      if (Enc[nCount].fFreq < Enc[nCount2].fFreq)
        {
          fBuf = Enc[nCount2].fFreq;
          Enc[nCount2].fFreq = Enc[nCount].fFreq;
          Enc[nCount].fFreq = fBuf;
 
          cBuf = Enc[nCount2].szChar;
          Enc[nCount2].szChar = Enc[nCount].szChar;
          Enc[nCount].szChar = cBuf;
        }
    }
  }
 
// Выводим структуру
        for(int nCount = 0; nCount < nCountSymbols; nCount++)
        {
          cout.precision(4);
          cout << Enc[nCount].szChar << " = " << Enc[nCount].fFreq << "\n";
        }
 
fclose(pAnyFile);
// Возвращаем структуру в программу
return Enc[nCountSymbols];
}
Не могу понять почему функция не возвратила значение. Посмотрел в отладчике переменные Enc и NotEnc забиты нулями и пустотой. Спасибо за помощь). Компилирую в Linux. g++ Version: 4:4.4.3-1ubuntu1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2011, 20:42     Функция не возвращает в программу структуру C++
Посмотрите здесь:

Функция возвращает массив C++
Функция не возвращает результат=( C++
C++ Функция get() не возвращает значение
C++ Функция возвращает структуру
Функция возвращает auto C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vx5
 Аватар для vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
07.01.2011, 20:46     Функция не возвращает в программу структуру C++ #2
Компилирую в Linux. g++ Version: 4:4.4.3-1ubuntu1
молодец, а то всё VS, да VS
skafiend
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 10
07.01.2011, 20:51  [ТС]     Функция не возвращает в программу структуру C++ #3
Цитата Сообщение от vx5 Посмотреть сообщение
молодец, а то всё VS, да VS
VS больно жирно для нетбука. Да и ставить его по времени долго) А вот как мне быть с кодом? Где косяк, если не секрет?
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
07.01.2011, 20:56     Функция не возвращает в программу структуру C++ #4
перегрузи оператор копирования
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
07.01.2011, 20:56     Функция не возвращает в программу структуру C++ #5
Вы возвращаете элемент массива с индексом, равным общему количеству элементов массива. Этот индекс выходит за границы массива.

Поясню.

Вот есть у вас массив А длинной Х. В нем есть элементы с А[0] по А[X-1]. Элемент с индексом X выходит за границы массива.

Если до сих пор не понятно.
Есть массив A[3] в нем есть элементы A[0], A[1] и A[2]. Элемента с индексом 3 в массиве нет.
skafiend
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 10
07.01.2011, 21:08  [ТС]     Функция не возвращает в программу структуру C++ #6
Цитата Сообщение от sandye51 Посмотреть сообщение
перегрузи оператор копирования
Можно пример? Про перегрузку операторов ничего не слышал

Добавлено через 1 минуту
Цитата Сообщение от lemegeton Посмотреть сообщение
Вы возвращаете элемент массива с индексом, равным общему количеству элементов массива. Этот индекс выходит за границы массива.

Поясню.

Вот есть у вас массив А длинной Х. В нем есть элементы с А[0] по А[X-1]. Элемент с индексом X выходит за границы массива.

Если до сих пор не понятно.
Есть массив A[3] в нем есть элементы A[0], A[1] и A[2]. Элемента с индексом 3 в массиве нет.
Все понял. Индексация не с единицы, а с нуля. От Pascal, не отвык. Спасибо

Добавлено через 7 минут
А как мне вернуть не один символ, а всю переменную Enc. Если просто return Enc, то появляется ошибка при компиляции -
Analiz.cpp: In function ‘ABC Frequency_Analysis(FILE*, int)’:
Analiz.cpp:154: error: conversion from ‘ABC*’ to non-scalar type ‘ABC’ requested
vx5
 Аватар для vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
07.01.2011, 21:14     Функция не возвращает в программу структуру C++ #7
тип возвращаемого функцией значения ставь ABC*
skafiend
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 10
07.01.2011, 21:19  [ТС]     Функция не возвращает в программу структуру C++ #8
Цитата Сообщение от vx5 Посмотреть сообщение
тип возвращаемого функцией значения ставь ABC*
Спасибо. Сейчас подправлю и будет работать. А где здесь кнопка, что вопрос решен и тема закрыта?
vx5
 Аватар для vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
07.01.2011, 21:23     Функция не возвращает в программу структуру C++ #9
предполагается, что найдется еще один человек с такой же проблемой, и он сможет задать вопрос, не создавая новую тему.. темозакрыванием занимаются модераторы
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
08.01.2011, 01:01     Функция не возвращает в программу структуру C++ #10
Можно вернуть указатель на сложный тип. Не забудьте удалить потом выделенную память. Можно создать свой или использовать существующий класс-контейнер данных и возвращать его копию.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2011, 13:27     Функция не возвращает в программу структуру C++
Еще ссылки по теме:

Написать программу:функция что возвращает элемент массива,и удаляет этот элемент з массива C++
Как правильно написать функцию, которая редактирует структуру по полю Name и возвращает новую, исправленную структуру?.. C++
C++ Функция не возвращает значение

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

Или воспользуйтесь поиском по форуму:
skafiend
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 10
08.01.2011, 13:27  [ТС]     Функция не возвращает в программу структуру C++ #11
Всем спасибо за помощь и раъяснения)
Yandex
Объявления
08.01.2011, 13:27     Функция не возвращает в программу структуру C++
Ответ Создать тему
Опции темы

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