Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача значений классу, Ошибка в передаче 
V
    Опции темы
Dr_VOLAND
  Дата 24.9.2007, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем привет!
Перед Вами программка, которая подсчитывает число повторений символов в файле.
Класс param – содержит всякую информацию про символ:
number - аски код
povtor - число повторений в тексте
и некую переменную code, с которой у меня и возникли проблемы.

Код

#include <map>
#include <iostream>
#include <math.h>
#include <algorithm>
using namespace std;

char *file_in="1.log";
long i=0;

///////////////////////////////////////////////////////
class param
{
public:
    long  povtor, number;
    char *code;
    param()
    {
        number=0L;
        povtor=0L;
        code = new char(sizeof(char*));
        strcpy(code, "");
    }
    code_set(char *lh)
    {
        strcat(code, lh);
    }    
};

void test(map<long, param> &obj1)
{
    map<long, param>::iterator Iter1;
    for (Iter1 = obj1.begin(); Iter1 != obj1.end(); Iter1++)
        cout<<Iter1->second.number<<"\t-\t"<<Iter1->second.povtor<<"\t-\t"<<Iter1->second.code<<endl;    
}
///////////////////////////////////////////////////////

int main()
{
    FILE *in;
    
    map<long,param> obj;
    map<long,param>::iterator Iter1;
    param f;

    for (i=0; i<256; i++)  
    {
        obj.insert(pair<long,param>(i,f));
        obj[i].number = i;
    }

    if ((in = fopen(file_in, "rb"))== NULL)
    {
        fprintf(stderr, "Cannot open input file.\n");
        return 1;
    }
    else
    {
        do
        { 
            i = fgetc(in);
            if(i>0)
            {
                obj[i].number = i;
                obj[i].povtor++;
            }
        }
        while (!feof(in));
    }
    
    map<long, param> obj1 = obj;
    Iter1 = obj.begin();
    Iter1->second.code_set("1");
    test(obj1);    

fclose(in);
return 0;
}


сode – это строка, в которую я буду записывать информацию.
А ошибка в функции code_set, … в конце программы.
Я хочу записать единицу только в класс первого ключа, а она записывает и в остальные тоже, хотя по конструктору они должны быть пустые((

Вот результат работы кода:
Код

0       -       0       -       1
1       -       0       -       1
2       -       0       -       1
3       -       0       -       1
4       -       0       -       1
5       -       0       -       1
6       -       0       -       1
7       -       0       -       1
8       -       0       -       1
9       -       0       -       1
10      -       5       -       1
11      -       0       -       1
12      -       0       -       1
13      -       5       -       1
14      -       0       -       1
15      -       0       -       1
16      -       0       -       1
17      -       0       -       1
18      -       0       -       1
19      -       0       -       1
20      -       0       -       1
21      -       0       -       1
22      -       0       -       1
23      -       0       -       1
24      -       0       -       1
25      -       0       -       1
26      -       0       -       1
27      -       0       -       1
28      -       0       -       1
29      -       0       -       1
30      -       0       -       1
31      -       0       -       1
32      -       2       -       1
33      -       0       -       1
34      -       0       -       1
35      -       0       -       1
36      -       0       -       1
37      -       0       -       1
38      -       0       -       1
39      -       0       -       1
40      -       0       -       1
41      -       0       -       1
42      -       0       -       1
43      -       0       -       1
44      -       0       -       1
45      -       0       -       1
46      -       1       -       1
47      -       0       -       1
48      -       3       -       1
49      -       0       -       1
50      -       0       -       1
51      -       0       -       1
52      -       0       -       1
53      -       0       -       1
54      -       0       -       1
55      -       1       -       1
56      -       0       -       1
57      -       0       -       1
58      -       0       -       1
59      -       0       -       1
60      -       0       -       1
61      -       3       -       1
62      -       0       -       1
63      -       0       -       1
64      -       0       -       1
65      -       0       -       1
66      -       0       -       1
67      -       1       -       1
68      -       0       -       1
69      -       0       -       1
70      -       2       -       1
71      -       0       -       1
72      -       0       -       1
73      -       1       -       1
74      -       0       -       1
75      -       0       -       1
76      -       1       -       1
77      -       0       -       1
78      -       0       -       1
79      -       0       -       1
80      -       0       -       1
81      -       0       -       1
82      -       3       -       1
83      -       2       -       1
84      -       0       -       1
85      -       0       -       1
86      -       1       -       1
87      -       0       -       1
88      -       0       -       1
89      -       0       -       1
90      -       0       -       1
91      -       2       -       1
92      -       0       -       1
93      -       2       -       1
94      -       0       -       1
95      -       0       -       1
96      -       0       -       1
97      -       1       -       1
98      -       0       -       1
99      -       0       -       1
100     -       2       -       1
101     -       10      -       1
102     -       0       -       1
103     -       1       -       1
104     -       1       -       1
105     -       5       -       1
106     -       0       -       1
107     -       0       -       1
108     -       8       -       1
109     -       0       -       1
110     -       4       -       1
111     -       4       -       1
112     -       1       -       1
113     -       0       -       1
114     -       1       -       1
115     -       6       -       1
116     -       4       -       1
117     -       2       -       1
118     -       1       -       1
119     -       0       -       1
120     -       0       -       1
121     -       0       -       1
122     -       0       -       1
123     -       0       -       1
124     -       0       -       1
125     -       0       -       1
126     -       0       -       1
127     -       0       -       1
128     -       0       -       1
129     -       0       -       1
130     -       0       -       1
131     -       0       -       1
132     -       0       -       1
133     -       0       -       1
134     -       0       -       1
135     -       0       -       1
136     -       0       -       1
137     -       0       -       1
138     -       0       -       1
139     -       0       -       1
140     -       0       -       1
141     -       0       -       1
142     -       0       -       1
143     -       0       -       1
144     -       0       -       1
145     -       0       -       1
146     -       0       -       1
147     -       0       -       1
148     -       0       -       1
149     -       0       -       1
150     -       0       -       1
151     -       0       -       1
152     -       0       -       1
153     -       0       -       1
154     -       0       -       1
155     -       0       -       1
156     -       0       -       1
157     -       0       -       1
158     -       0       -       1
159     -       0       -       1
160     -       0       -       1
161     -       0       -       1
162     -       0       -       1
163     -       0       -       1
164     -       0       -       1
165     -       0       -       1
166     -       0       -       1
167     -       0       -       1
168     -       0       -       1
169     -       0       -       1
170     -       0       -       1
171     -       0       -       1
172     -       0       -       1
173     -       0       -       1
174     -       0       -       1
175     -       0       -       1
176     -       0       -       1
177     -       0       -       1
178     -       0       -       1
179     -       0       -       1
180     -       0       -       1
181     -       0       -       1
182     -       0       -       1
183     -       0       -       1
184     -       0       -       1
185     -       0       -       1
186     -       0       -       1
187     -       0       -       1
188     -       0       -       1
189     -       0       -       1
190     -       0       -       1
191     -       0       -       1
192     -       0       -       1
193     -       0       -       1
194     -       0       -       1
195     -       0       -       1
196     -       0       -       1
197     -       0       -       1
198     -       0       -       1
199     -       0       -       1
200     -       0       -       1
201     -       0       -       1
202     -       0       -       1
203     -       0       -       1
204     -       0       -       1
205     -       0       -       1
206     -       0       -       1
207     -       0       -       1
208     -       0       -       1
209     -       0       -       1
210     -       0       -       1
211     -       0       -       1
212     -       0       -       1
213     -       0       -       1
214     -       0       -       1
215     -       0       -       1
216     -       0       -       1
217     -       0       -       1
218     -       0       -       1
219     -       0       -       1
220     -       0       -       1
221     -       0       -       1
222     -       0       -       1
223     -       0       -       1
224     -       0       -       1
225     -       0       -       1
226     -       0       -       1
227     -       0       -       1
228     -       0       -       1
229     -       0       -       1
230     -       0       -       1
231     -       0       -       1
232     -       0       -       1
233     -       0       -       1
234     -       0       -       1
235     -       0       -       1
236     -       0       -       1
237     -       0       -       1
238     -       0       -       1
239     -       0       -       1
240     -       0       -       1
241     -       0       -       1
242     -       0       -       1
243     -       0       -       1
244     -       0       -       1
245     -       0       -       1
246     -       0       -       1
247     -       0       -       1
248     -       0       -       1
249     -       0       -       1
250     -       0       -       1
251     -       0       -       1
252     -       0       -       1
253     -       0       -       1
254     -       0       -       1
255     -       0       -       1
Press any key to continue


В чём ошибка??

Это сообщение отредактировал(а) Dr_VOLAND - 24.9.2007, 20:36
PM MAIL   Вверх
Fazil6
Дата 24.9.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

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



Код

       code = new char(sizeof(char*));
        strcpy(code, "");

что призван делать сей потрясающий код?
PM MAIL   Вверх
Dogo
Дата 24.9.2007, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ошибка в этом куске кода.
Объект f каждый раз перезаписывается, то есть он у вас после работы цикла остается всего один.

Цитата

Код

param f;
    

    for (i=0; i<256; i++)  
    
    {
    
        obj.insert(pair<long,param>(i,f));
    
        obj[i].number = i;
    
    }



Перенисите его объявление в тело цикла и программа заработает так, как задуманно.

Код

    for (i=0; i<256; i++)    
    {
        param f;    
        obj.insert(pair<long,param>(i,f));    
        obj[i].number = i;    
    }



--------------------
 
PM MAIL ICQ   Вверх
Dr_VOLAND
Дата 24.9.2007, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо Dogo!
В яблочко!!  smile  Очень полезен взгляд со стороны, помогли как новичек- новичку)). 


Это сообщение отредактировал(а) zkv - 23.12.2007, 12:42
PM MAIL   Вверх
Lazin
Дата 25.9.2007, 07:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(Fazil6 @  24.9.2007,  20:48 Найти цитируемый пост)
Выделить всёкод C++
1:
2:
    
       code = new char(sizeof(char*));
        strcpy(code, "");

что призван делать сей потрясающий код? 

Сей код выделяет в памяти 4 байта, затем копирует туды строку "", зачем - хз, видимо автор хотел сделать что-то другое, но получилось так.
Предложу свой вариант, на всякий случай:
Код

code = new char(sizeof(char)*4);
strcpy(code,"");

 smile

Добавлено через 3 минуты и 12 секунд
Кстати классу param  не помешал-бы деструктор.
зы
param - param, param - param  smile самое сложное в программировании придумывать имена переменных(классов)
PM MAIL Skype GTalk   Вверх
akizelokro
Дата 25.9.2007, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



А так не пойдет?

Код

typedef int ascii_cod;
typedef int povtor;

int i=0,in;
map <ascii_cod,povtor> smthintext;
for(int i=0;i<255;i++)
{
  smthintext.insert(pair<ascii_cod,povtor>(i,0));
}
if ((in = fopen(file_in, "rb"))== NULL)
{
        fprintf(stderr, "Cannot open input file.\n");
        return 1;
}
else
{
    while(1)
    { 
         i = fgetc(in);
            if(i != EOF)
            {
                smthintext[i]++;
            }
            else
              break;

    }
fclose(in);
for(int i=0;i<255;i++)
{
// вывод
}



--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Fazil6
Дата 25.9.2007, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

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



Цитата(Lazin @  25.9.2007,  07:37 Найти цитируемый пост)
Сей код выделяет в памяти 4 байта, затем копирует туды строку "", зачем - хз, видимо автор хотел сделать что-то другое, но получилось так.Предложу свой вариант, на всякий случай:


этот бредовый код выделяет 1 char и инициализирует его значением sizeof(char*).  Все это вобщем законно, но вот сомневаюсь, что вы именно этого добивались 


Цитата(Dr_VOLAND @  24.9.2007,  23:47 Найти цитируемый пост)
P.S. Некоторые, рано получают звание "Эксперт".
ой, и не говори... кругом одни дэбилы.....
PM MAIL   Вверх
akizelokro
Дата 25.9.2007, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



smile а, не вьехал((( Это тема по передаче значений классу (за красивые слова надо платить, полиморфизм и наследование чего-то да стоят)
Предлагаю тогда вместо typedef создать 

class povtor
{
  int value;
  povtor(int i=0): value(i) {};
}

поменяется строчка на

smthintext[i].value++;

простите, если что не так smile

Добавлено @ 09:01
Об экспертах. Нашел в законах Паркинсона-Мэрфи ссылку на определение

Цитата

Эксперт - любой человек не из нашего города.




Это сообщение отредактировал(а) akizelokro - 25.9.2007, 13:08


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
zkv
Дата 25.9.2007, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



Цитата(akizelokro @  25.9.2007,  08:56 Найти цитируемый пост)
Эксперт - любой человек не из нашего города.

Сий статус дают за словоблудие smile © dumb

Это сообщение отредактировал(а) zkv - 23.12.2007, 12:44
PM MAIL   Вверх
Dr_VOLAND
Дата 25.9.2007, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Lazin @  25.9.2007,  05:37 Найти цитируемый пост)
param - param, param - param   самое сложное в программировании придумывать имена переменных(классов) 


Эт точно! =))

Всё - тема закрыта! Спасибо Dogo, ...решил проблему по существу.
PM MAIL   Вверх
akizelokro
Дата 26.9.2007, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Цитата

param - param, param - param   самое сложное в программировании придумывать имена переменных(классов) 

Гмык.. Самое сложное - не придумывать ненужных переменных, тогда и вопрос с их именованием отпадет сам собой. Например, в первоначальном ASCII-код символа закладывается в param::number и его же значение - ключ в map<int,param>. При этом, видна попытка прописать его напрямую в param::code. 
Совершенно неэффективна попытка дублирования в map <int,param> obj1. Хочется еще раз повторить вышеприведенную цитату smile . 

Кстати, на ошибку в выделении памяти для char * code же говорили (ошибку, которая приводит к другой ошибке - при использовании функции code_set).  Хочу отметить, чтобы сбить апломб выступающих(его), что раз выделил память с помощью new, будь добр освободить ее деструктором). 

Кстати, дальше я сам чутка лопухнулся smile 

Это сообщение отредактировал(а) akizelokro - 26.9.2007, 07:34


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
zkv
Дата 26.9.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



Цитата(akizelokro @  26.9.2007,  07:22 Найти цитируемый пост)
 Хочу отметить, чтобы сбить апломб выступающих(его), что раз выделил память с помощью new, будь добр освободить ее деструктором). 

не собьешь  smile 
просто человек не любит критику, кому захочется дальше показывать его ошибки, я, к примеру, посмотрел в код только для того, чтобы оценить резонность замечания Fazil6,  что там дальше написано - пофиг, челу виднее.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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