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

ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные - C++

¬осстановить пароль –егистраци€
 
 
–ейтинг: –ейтинг темы: голосов - 10, средн€€ оценка - 4.60
”ль€ниус
 јватар дл€ ”ль€ниус
1 / 1 / 0
–егистраци€: 15.08.2013
—ообщений: 132
29.04.2014, 10:11     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #1
ћне необходимо построить код Ўеннона, на основе псевдокода, предложенного в лекции (кодирую текст на английском алфавите).
ѕри создании кода Ўеннона столкнулась с такой проблемой: при передаче в функцию массива CHAR_S (динамический массив, содержащий в упор€доченном виде символы, встречающиес€ в файле) и ws (упор€доченный массив частот) в функцию
C++
1
Lsh=Shennon(p,N,CHAR_S,ws)
часть данных искажаетс€, подскажите, пожалуйста, с чем это может быть св€зано?  ак только эти массивы оказываютс€ в функции, данные в них уже неправильные.
ƒо передачи в функцию CHAR_S[N]:

ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные

ѕосле передачи:
ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные

ƒо передачи в функцию ws[N]:

ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные

ѕосле передачи в функцию, в массиве ws, вообще кака€ то ерунда:

ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные

ƒалее, внутри функции Shennon(p,N,CHAR_S,ws) происходит искажение массива L[N]. “ак выгл€дит массив сразу после окончани€ заполнени€:

ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные

Ќо уже после выполнени€ следующих операций данные в массиве L искажаютс€ при i=0:

ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные

i=5

ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные

ѕодскажите, пожалуйста, в чем может быть проблема?
‘айл NEW прикреплен к теме: Ќе считает произведение разных типов данных
¬ целом рабочий код € приведу ниже, комментарии на русском, в компил€торе читаемы, а при переносе в блокнот и в ворд нечитаемы, поэтому прошу не ругатьс€, все комментарии переписывать, это с ума сойти, прошу лишь загрузить в компил€тор, чтобы проверить, что код реально рабочий, и то может и не понадобитс€ код вовсе, а знающим люд€м итак будет пон€тно в чем причина.
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
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#include <alloc.h>
 
#define n 94 //™ЃЂ®з•б⥁ б®ђҐЃЂЃҐ Ґ  *£Ђ®©б™Ѓђ  Ђд Ґ®в• 32 ѓЃ 126 ™Ѓ§ б®ђҐЃЂ   в °Ђ®жл ASCII
 
 
void swap (long *w, char *CHAR, long i, long j) //Ѓ°ђ•* нЂ•ђ•*вЃҐ ђ бᮥ 
 {
  long t; char T;
  t=w[i];
  w[i]=w[j];
  w[j]=t;
  T=CHAR[i];
  CHAR[i]=CHAR[j];
  CHAR[j]=T;
 }
 
void shake (long *x, char *CHAR) //§Ђп гѓЃап§Ѓз•*®п ђ бᮥ  Ґ•аЃпв*Ѓбв•© ѓЃ ҐЃІа бв *®о ®бѓЃЂмІг•ђ и•©™•а*го бЃав®аЃҐ™г
  {
   long L,R,N,S,j,i;
   L=0;  //Ђ•Ґ п £а *®ж  ђ бᮥ 
   R=n-1;  //ѓа Ґ п £а *®ж  ђ бᮥ 
   N=n-1;    //™ЃЂ®з•б⥁ нЂ•ђ•*вЃҐ ђ бᮥ  (*гђ•а ж®п б 0)
   while (L<R)
   {
    for(j=R; j>L; --j)  //ѓаЃеЃ§ бѓа Ґ  * Ђ•ҐЃ
    {
     if (x[j]>x[j-1])
     {
      swap(x,CHAR,j,j-1);
      N=j;
     }
    }
    L=N;
     for (j=L; j<R; ++j)  //ѓаЃеЃ§ бЂ•Ґ  * ѓа ҐЃ
     {
      if (x[j]<x[j+1])
      {
       swap(x,CHAR,j,j+1);
       N=j;
      }
     }
     R=N;
   }
   for (i=0,S=1;i<n-2;++i)
   {
   if (x[i]<x[i+1])
     S++;
   }
  if (S>1)
   {
    printf("\n Ои®°™ , ђ бᮥ *• ЃвбЃав®аЃҐ *, ™ЃЂ®з•б⥁ б•а®© °ЃЂми• 1 \n");
    getch();
   }
  }
 
 
void create_Mas1 (long *L, long N)
{
 L=(long *)malloc(N*sizeof(long)); //бЃІ§ *®• ђ бᮥ  §Ђ®** ™Ѓ§ЃҐле бЂЃҐ
 if (L==NULL)
 {
  puts("О§*Ѓђ•а*л© ђ бᮥ *• бЃІ§ *!");
  getch();
  return;
 }
}
 
void create_Mas2 (int **C,long N)
{
 long i;
 C=(int**)malloc(N*sizeof(int*)); //бЃІ§ *®• §®* ђ®з ђ бᮥ  г™ І в•Ђ•© *  г™ І в•Ђ® * з Ђ  бваЃ™
 if (C==NULL)
 {
  puts("М бᮥ г™ І в•Ђ•© бваЃ™ С *• бЃІ§ *!");
  getch();
  return;
 }
 for (i=0;i<N;i++)//Ґл§•Ђп•ђ ѓ ђпвм ѓЃ§ N ђ бᮥЃҐ -бваЃ™ ѓЃ N нЂ•ђ•*вЃҐ Ґ ™ ¶§Ѓђ
 {
  C[i]=(int *)malloc(N*sizeof(int*));
  if (C[i]==NULL)
  {
   puts("М бᮥ С *• бЃІ§ *!");
   return;
  }
  }
}
 
 
void print (char *CHAR_S, long *ws, long *L, int **C, long N)
{
 FILE *fw;
 long i,j,l;
 fw=fopen("COD_H.txt","a");//І ѓ®бм Ґ д ©Ђ
 if (fw==NULL)
  {
   printf("\n Ои®°™  бЃІ§ *®п д ©Ђ ! \n");
   getch();
   exit(0);
  }
 printf ("\n С®ђҐЃЂ   Ч бвЃв    КЃ§ЃҐЃ• бЂЃҐЃ   ДЂ®**  ™Ѓ§ЃҐЃ£Ѓ");
 printf ("\n                                    бЂЃҐ ");
 fprintf(fw,"\n Symbol   Frequency   Codeword   Codeword lenght");
 for(i=0; i<N; i++)
 {
  printf ("\n %c        %d          ", CHAR_S[i], ws[i] );
  fprintf(fw, "\n %c        %d          ", CHAR_S[i], ws[i] );
  l=L[i];
  for (j=0;j<l;j++)
    {
     printf ("%d",C[i][j]);
     fprintf(fw,"%d",C[i][j]);
    }
  printf ("                   %d",L[i] );
  fprintf(fw,"                   %d",L[i] );
 }
}
 
 
float Shennon (float *p, long N,char *CHAR_S, long *ws)
{
 float *Q,    //ђ бᮥ §Ђп Ґ•Ђ®з®* Qi
       Lsh=0;
 int **C; //ђ ва®ж  нЂ•ђ•*в а*ле ™Ѓ§ЃҐ
 long *L, //ђ бᮥ §Ђ®* ™Ѓ§ЃҐле бЂЃҐ
      i,j;//бз•вз®™®
 create_Mas1(L,N);
 create_Mas2(C,N);
 Q=(float *)malloc(N*sizeof(float)); //бЃІ§ *®• ђ бᮥ  §Ђ®** ™Ѓ§ЃҐле бЂЃҐ
 if (Q==NULL)
 {
  puts("О§*Ѓђ•а*л© ђ бᮥ *• бЃІ§ *!");
  getch();
  return 0;
 }
 Q[0]=0;
 for (i=1; i<N; i++)
 {
  Q[i]=Q[i-1]+p[i];
 }
 for (i=0; i<N; i++)
 {
  L[i]=-ceil(log(p[i])/log(2.0));
  if(1.0/pow(2,-1*L[i])>p[i])
    L[i]++;
  if (i==0)
    L[i-1]=1;
  if (1.0/pow(2,-1.0*L[i-1])<p[i])
   printf("\n Н•ѓа Ґ®Ђм*Ѓ а ббз®в *  §Ђ®*  ™Ѓ§ЃҐЃ£Ѓ бЂЃҐ  Ш•**Ѓ* !!!");
 }
 for (i=0; i<N; i++)
 {
  for (j=0;j<L[i];j++)
  {
   Q[i-1]=Q[i-1]*2.0;
   C[i][j]=(int)(Q[i-1]);
   if(Q[i-1]>1.0)
    Q[i-1]=Q[i-1]-1.0;
  }
 }
 
 for (i=1; i<N; i++)
 {
  Lsh+=p[i]*L[i];
 }
 print (CHAR_S,ws,L,C,N);
 for (i=0;i<N;i++)
  free(C[i]);
 free(C);
 free(L);
 free(Q);
 return Lsh;
}
 
 
 
 
void main()
{
 FILE  *f,*fw;
 char  key, ch,
    fname[50], //ђ бᮥ §Ђп еа *•*®п ®ђ•*® д ©Ђ 
    CHAR[n],  //ђ бᮥ Ґб•е б®ђҐЃЂЃҐ  *£Ђ®©б™Ѓ£Ѓ  Ђд Ґ®в 
    *CHAR_S, //ђ бᮥ §Ђп еа *•*®п б®ђҐЃЂЃҐ Ґбва•з ой®ебп Ґ д ©Ђ•
    COD,COD1; //ѓ•а•ђ•** п §Ђп ҐлҐЃ§ ™Ѓ§ЃҐле бЂЃҐ *  ѓ•з вм
 long  i,j,m,N,B, //ѓ•а•ђ•**л• бз•вз®™®
    w[n], //з бвЃвл ѓЃпҐЂ•*®п б®ђҐЃЂЃҐ Ґ в•™бв•
    *ws;//ЃвбЃав®аЃҐ **л© ђ бᮥ з бвЃв
 float *p,//ђ бᮥ Ґ•аЃпв*Ѓбв•© ѓЃпҐЂ•*®п б®ђҐЃЂ  Ґ § **Ѓђ в•™бв•
    H=0.0,//н*ваЃѓ®п Ш•**Ѓ* 
    Lsh, //ба•§*пп §Ђ®**  ™Ѓ§ЃҐЃ£Ѓ бЂЃҐ  Ш•**Ѓ* 
    s;//™Ѓ*ваЃЂм ѓа Ґ®Ђм*Ѓбв® а бз•в  ђ бᮥ  Ґ•аЃпв*Ѓбв•©
 memset(CHAR,0 ,sizeof(CHAR));
 for(i=0;i<n;i++)//І ѓЃЂ*•*®• ђ бᮥ  ™Ѓ§ ђ® б®ђҐЃЂЃҐ бЃ£Ђ б*Ѓ в °Ђ®ж• ASCII
 {
  CHAR[i]=32+i;
 }
 
 fw=fopen("COD_H.txt","w");//бЃІ§ *®• д ©Ђ  §Ђп ҐлҐЃ§  ®*дЃађ ж®®
 fclose(fw);
 do
 {
  clrscr();
  m=0;  //І* з•*®п Ѓ°*гЂповбп §Ђп ®б™Ђоз•*®п Ѓи®°Ѓ™ ѓа® Ѓв™алв®® §аг£Ѓ£Ѓ д ©Ђ 
  N=0; //™ЃЂ®з•б⥁ б®ђҐЃЂЃҐ Ґ в•™бв• ®б™Ђоз п ѓЃҐвЃа•*®п
  memset(w,0.0,sizeof(w));
  memset(fname,0,sizeof(fname));
  printf ("\n ВҐ•§®в• * ®ђ•*ЃҐ *®• д ©Ђ  ® ѓгвм ™ *•ђг. \n");
  fgets(fname,sizeof(fname),stdin);
  m=strlen(fname);
  fname[m-1]=0;
  f=fopen(fname,"rt") ;
  if (f==NULL)
  {
   printf("\n Ои®°™  Ѓв™алв®п д ©Ђ ! \n");
   getch();
   exit(0);
  }
  B=0; // ™ЃЂ®з•б⥁ б®ђҐЃЂЃҐ Ґ в•™бв•
  while(!feof(f))
  {
   ch=getc(f);    //бз®влҐ *®• б®ђҐЃЂЃҐ
   B++;
   for (j=0;j<n;j++)
   {
    if (ch==CHAR[j])
    {
     i=j;
     break;
    }
   }
   w[i]+=1;
 }
 B--;
 
 shake(w,CHAR);//бЃав®аЃҐ™  ђ бᮥ  з бвЃв
 
 for (i=0; i<n; i++)
 {
  if (w[i]!=0)
   N++;
 }
 
 ws=(long *)malloc(N*sizeof(long));
 if (ws==NULL)
 {
  puts("М бᮥ ws *• бЃІ§ *!");
  getch();
  return;
 };
 
 CHAR_S=(char *)malloc(N*sizeof(char));
 if (CHAR_S==NULL)
 {
  puts("М бᮥ CHAR_S *• бЃІ§ *!");
  getch();
  return;
 }
 for (i=0; i<N; i++)//™Ѓѓ®аЃҐ *®• б®ђҐЃЂЃҐ б з бвЃвЃ© ѓЃпЂҐ•*®п >0 Ґ §®* ђ®з•б™®© ђ бᮥ
 {
   ws[i]=w[i];
   CHAR_S[i]=CHAR[i];
 }
 
 
 p=(float *)malloc(N*sizeof(float)) ;
 if (p==NULL)
 {
  puts("М бᮥ p *• бЃІ§ *!");
  getch();
  return;
 }
for (i=0; i<N; i++) //а ббз•в н*ваЃѓ®® д ©Ђ 
 {
  p[i]=1.0*ws[i]/B;//І ѓЃЂ*•*®• ђ бᮥ  Ґ•аЃпв*Ѓбв•© ѓЃпҐЂ•*®п б®ђҐЃЂЃҐ
  H+=-1.0*p[i]*log(p[i])/log(2.0);
 }
 
 Lsh=Shennon(p,N,CHAR_S,ws);
 
 fw=fopen("COD_H.txt","a");
 printf ("\n Э*ваЃѓ®п ®беЃ§*Ѓ£Ѓ   Са•§*пп §Ђ®*  ™Ѓ§ЃҐЃ£Ѓ бЂЃҐ ");
 printf ("\n       в•™бв          КЃ§ Х ддђ *   КЃ§ Ш•**Ѓ*   КЃ§ Ф *Ѓ");
 printf("\n       %2.4f           %2.4f            %2.4f     %2.4f", H,Lh,Lsh,Lf);
 
 fprintf(fw, "\n Entropy of the    Average lenght codeword ");
 fprintf(fw, "\n sourse text       Haffman cod   Shennon cod   Fano cod");
 fprintf(fw,"\n       %2.4f           %2.4f            %2.4f     %2.4f",H,Lh,Lsh,Lf);
 fclose(fw);
 
 //ЃбҐЃ°Ѓ¶§•*®• ѓ ђпв® Ѓв бЃІ§ **ле §®* ђ®з•б™®е ђ бᮥЃҐ
 fclose(f);
 free(p);
 free(CHAR_S);
 free(ws);
 getch();
 fclose(f);
 puts ("\n Ов™алвм §аг£Ѓ© д ©Ђ? (Н•в=Esc)");
 key=getch();
 }
 while (key!=27);//ESC
}
Similar
Ёксперт
41792 / 34177 / 6122
–егистраци€: 12.04.2006
—ообщений: 57,940
29.04.2014, 10:11     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные
ѕосмотрите здесь:

“рабл в передаче двумерного массива в функцию! C++
ѕри попытке вернуть одномерный массив чисел из функции, данные искажаютс€ C++
ќшибка при передаче двумерного массива в функцию C++
C++ ћусор в элементах массива при передаче в функцию
ќшибка при передаче двумерного массива в функцию std::thread C++
ѕосле регистрации реклама в сообщени€х будет скрыта и будут доступны все возможности форума.
”ль€ниус
 јватар дл€ ”ль€ниус
1 / 1 / 0
–егистраци€: 15.08.2013
—ообщений: 132
29.04.2014, 16:35  [“—]     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #21
÷итата —ообщение от Denis123456789 ѕосмотреть сообщение
aLarman, а зачем нам вообще специальную функцию создавать дл€ выделени€ пам€ти, € имею ввиду функцию funck?
ѕотому что € еще буду создавать эти два массива в еще двух функци€х - кодирование ‘ано и ’аффмана, € так решила оптимизировать код...
ѕосле регистрации реклама в сообщени€х будет скрыта и будут доступны все возможности форума.
aLarman
636 / 557 / 89
–егистраци€: 13.12.2012
—ообщений: 2,109
29.04.2014, 16:41     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #22
÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
ƒа, не права, Ќќ в своей программе € работаю с массивами и переадю в функцию массив, а не переменную и он измен€етс€. ¬ моей программе есть такой пример: функци€ shake(CHAR,w), € передаю туда два статических массива и они на выходе измен€ютс€ (сортируютс€ по убыванию)!
именно массив расположенный по адресу, ¬ы передаете адрес и модифицируете значени€ в пам€ти
а как модифицировать входной указатель? в ф-ции create ¬ы выдел€ете пам€ть, и записываете значение на начало выделенной пам€ти, у ¬ас 3пути
1) передавать указатель по ссылке - как мы вы€снили это у ¬ас не катит
2) передавать указатель на указатель - € пример приводил - его ¬ы не прокомментировали
3) ¬ернуть указатель из ф-ции
C++
1
2
3
4
5
long * create(long N)
{
long * ptr = (long*)malloc(sizeof(long)*N)
return ptr;
}
”ль€ниус
 јватар дл€ ”ль€ниус
1 / 1 / 0
–егистраци€: 15.08.2013
—ообщений: 132
29.04.2014, 17:03  [“—]     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #23
÷итата —ообщение от aLarman ѕосмотреть сообщение
2) передавать указатель на указатель - € пример приводил - его ¬ы не прокомментировали
ѕроверила, еще хуже: на i=3 в массив L начинает помещатьс€ чепуха

ƒобавлено через 2 минуты
≈ще заметила, что при создании массива CHAR_S, в который € копирую только те символы, которые встречаютс€ в тексте, в нем почему то не 12 символов, а 13, причем последний символ 5...
aLarman
636 / 557 / 89
–егистраци€: 13.12.2012
—ообщений: 2,109
29.04.2014, 17:05     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #24
÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
12 символов, а 13, причем последний символ 5...
ищите кос€ки,

Ќе по теме:

и пожалуйста перейдите ¬ы уже на MSVS

”ль€ниус
 јватар дл€ ”ль€ниус
1 / 1 / 0
–егистраци€: 15.08.2013
—ообщений: 132
29.04.2014, 19:25  [“—]     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #25
Ќе могу найти кос€к, все правильно создаетс€, но после строки 271 к данным массива CHAR_S, добавл€етс€ 5, такое ощущение, что после выделени€ пам€ти массиву p, что-то ломаетс€
÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
p=(float *)malloc(N*sizeof(float)) ;
Alex5
881 / 616 / 81
–егистраци€: 12.04.2010
—ообщений: 1,552
29.04.2014, 21:18     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #26
÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
ѕроверила, еще хуже: на i=3 в массив L начинает помещатьс€ чепуха ...
≈ще заметила, ...
÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
Ќе могу найти кос€к
”ль€ниус, ¬ы исправили создание массивов L и C? ћожет быть, после исправлени€ этой ошибки,
и ещЄ какие-то кос€ки пропадут, и не нужно будет их искать

÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
C++
1
2
3
4
5
int **C; //ђ ва®ж нЂ•ђ•*в а*ле ™Ѓ§ЃҐ
 long *L, //ђ бᮥ §Ђ®* ™Ѓ§ЃҐле бЂЃҐ
 i,j;//бз•вз®™®
 create_Mas1(L,N);
 create_Mas2(C,N);
ѕри использовании create_Mas1(), create_Mas2() из сообщени€ #1
значени€ указателей L и C останутс€ такими, какими они были перед вызовом create_Mas.
ѕоэтому, когда ¬ы что-то записываете в L[i], C[i], куда это записываетс€, можно только гадать.
„тобы убедитьс€ в этом, можно добавить такую проверку:
C++
1
2
3
4
5
6
7
8
9
10
11
12
int **C=NULL;
long *L=NULL;
create_Mas1(L,N);
create_Mas2(C,N);
if( NULL == L )
{
    printf( "\n Error:  L == NULL \n" );
}
if( NULL == C )
{
    printf( "\n Error:  C == NULL \n" );
}
”ль€ниус
 јватар дл€ ”ль€ниус
1 / 1 / 0
–егистраци€: 15.08.2013
—ообщений: 132
29.04.2014, 22:00  [“—]     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #27
÷итата —ообщение от Alex5 ѕосмотреть сообщение
”ль€ниус, ¬ы исправили создание массивов L и C? ћожет быть, после исправлени€ этой ошибки,
и ещЄ какие-то кос€ки пропадут, и не нужно будет их искать
ƒа, € исправила, как советовали, стало еще хуже . ј массив CHAR_S ломаетс€ раньше, чем создаютс€ массивы L и — , он ломаетс€ как только выдел€етс€ пам€ть под массив р ( ломаетс€ - делаетс€ вдруг не 12 символьным, а 13...)
aLarman
636 / 557 / 89
–егистраци€: 13.12.2012
—ообщений: 2,109
30.04.2014, 10:30     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #28
вобщем задебажил ваш код
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
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
//#include <alloc.h>
 
#define n 94 //™ЃЂ®з•б⥁ б®ђҐЃЂЃҐ Ґ  *£Ђ®©б™Ѓђ  Ђд Ґ®в• 32 ѓЃ 126 ™Ѓ§ б®ђҐЃЂ   в °Ђ®жл ASCII
 
 
void swap (long *w, char *CHAR, long i, long j) //Ѓ°ђ•* нЂ•ђ•*вЃҐ ђ бᮥ 
{
    long t; char T;
    t=w[i];
    w[i]=w[j];
    w[j]=t;
    T=CHAR[i];
    CHAR[i]=CHAR[j];
    CHAR[j]=T;
}
 
void shake (long *x, char *CHAR) //§Ђп гѓЃап§Ѓз•*®п ђ бᮥ  Ґ•аЃпв*Ѓбв•© ѓЃ ҐЃІа бв *®о ®бѓЃЂмІг•ђ и•©™•а*го бЃав®аЃҐ™г
{
    long L,R,N,S,j,i;
    L=0;  //Ђ•Ґ п £а *®ж  ђ бᮥ 
    R=n-1;  //ѓа Ґ п £а *®ж  ђ бᮥ 
    N=n-1;    //™ЃЂ®з•б⥁ нЂ•ђ•*вЃҐ ђ бᮥ  (*гђ•а ж®п б 0)
    while (L<R)
    {
        for(j=R; j>L; --j)  //ѓаЃеЃ§ бѓа Ґ  * Ђ•ҐЃ
        {
            if (x[j]>x[j-1])
            {
                swap(x,CHAR,j,j-1);
                N=j;
            }
        }
        L=N;
        for (j=L; j<R; ++j)  //ѓаЃеЃ§ бЂ•Ґ  * ѓа ҐЃ
        {
            if (x[j]<x[j+1])
            {
                swap(x,CHAR,j,j+1);
                N=j;
            }
        }
        R=N;
    }
    for (i=0,S=1;i<n-2;++i)
    {
        if (x[i]<x[i+1])
            S++;
    }
    if (S>1)
    {
        printf("\n Ои®°™ , ђ бᮥ *• ЃвбЃав®аЃҐ *, ™ЃЂ®з•б⥁ б•а®© °ЃЂми• 1 \n");
        getch();
    }
}
 
 
void create_Mas1 (long **L, long N)
{
    *L=(long *)malloc(N*sizeof(long)); //бЃІ§ *®• ђ бᮥ  §Ђ®** ™Ѓ§ЃҐле бЂЃҐ
    if (*L==NULL)
    {
        puts("О§*Ѓђ•а*л© ђ бᮥ *• бЃІ§ *!");
        getch();
        return;
    }
}
 
void create_Mas2 (int ***C,long N)
{
    long i;
    *C=(int**)malloc(N*sizeof(int*)); //бЃІ§ *®• §®* ђ®з ђ бᮥ  г™ І в•Ђ•© *  г™ І в•Ђ® * з Ђ  бваЃ™
    if (*C==NULL)
    {
        puts("М бᮥ г™ І в•Ђ•© бваЃ™ С *• бЃІ§ *!");
        getch();
        return;
    }
    for (i=0;i<N;i++)//Ґл§•Ђп•ђ ѓ ђпвм ѓЃ§ N ђ бᮥЃҐ -бваЃ™ ѓЃ N нЂ•ђ•*вЃҐ Ґ ™ ¶§Ѓђ
    {
        (*C)[i]=(int *)malloc(N*sizeof(int));
        if ((*C)[i]==NULL)
        {
            puts("М бᮥ С *• бЃІ§ *!");
            return;
        }
    }
}
 
 
void print (char *CHAR_S, long *ws, long *L, int **C, long N)
{
    FILE *fw;
    long i,j,l;
    fw=fopen("COD_H.txt","a");//І ѓ®бм Ґ д ©Ђ
    if (fw==NULL)
    {
        printf("\n Ои®°™  бЃІ§ *®п д ©Ђ ! \n");
        getch();
        exit(0);
    }
    printf ("\n С®ђҐЃЂ   Ч бвЃв    КЃ§ЃҐЃ• бЂЃҐЃ   ДЂ®**  ™Ѓ§ЃҐЃ£Ѓ");
    printf ("\n                                    бЂЃҐ ");
    fprintf(fw,"\n Symbol   Frequency   Codeword   Codeword lenght");
    for(i=0; i<N; i++)
    {
        printf ("\n %c        %d          ", CHAR_S[i], ws[i] );
        fprintf(fw, "\n %c        %d          ", CHAR_S[i], ws[i] );
        l=L[i];
        for (j=0;j<l;j++)
        {
            printf ("%d",C[i][j]);
            fprintf(fw,"%d",C[i][j]);
        }
        printf ("                   %d",L[i] );
        fprintf(fw,"                   %d",L[i] );
    }
}
 
 
float Shennon (float *p, long N,char *CHAR_S, long *ws)
{
    float *Q,    //ђ бᮥ §Ђп Ґ•Ђ®з®* Qi
        Lsh=0;
    int **C= NULL; //ђ ва®ж  нЂ•ђ•*в а*ле ™Ѓ§ЃҐ
    long *L=NULL, //ђ бᮥ §Ђ®* ™Ѓ§ЃҐле бЂЃҐ
        i,j;//бз•вз®™®
    create_Mas1(&L,N);
    create_Mas2(&C,N);
    Q=(float *)malloc(N*sizeof(float)); //бЃІ§ *®• ђ бᮥ  §Ђ®** ™Ѓ§ЃҐле бЂЃҐ
    if (Q==NULL)
    {
        puts("О§*Ѓђ•а*л© ђ бᮥ *• бЃІ§ *!");
        getch();
        return 0;
    }
    Q[0]=0;
    for (i=1; i<N; i++)
    {
        Q[i]=Q[i-1]+p[i];
    }
    for (i=0; i<N; i++)
    {
        L[i]=-ceil(log(p[i])/log(2.0));
        if(1.0/pow(2.,-1*L[i])>p[i])
            L[i]++;
        if (i==0)
            L[i-1]=1;
        if (1.0/pow(2,-1.0*L[i-1])<p[i])
            printf("\n Н•ѓа Ґ®Ђм*Ѓ а ббз®в *  §Ђ®*  ™Ѓ§ЃҐЃ£Ѓ бЂЃҐ  пњљ•**Ѓ* !!!");
    }
    for (i=1; i<N; i++)
    {
        for (j=0;j<L[i];j++)
        {
            Q[i-1]=Q[i-1]*2.0;
            C[i][j]=(int)(Q[i-1]);
            if(Q[i-1]>1.0)
                Q[i-1]=Q[i-1]-1.0;
        }
    }
 
    for (i=1; i<N; i++)
    {
        Lsh+=p[i]*L[i];
    }
    print (CHAR_S,ws,L,C,N);
    for (i=0;i<N;i++)
        free(C[i]);
    free(C);
    free(L);
    free(Q);
    return Lsh;
}
 
 
 
 
void main()
{
    FILE  *f,*fw;
    char  key, ch,
        fname[50], //ђ бᮥ §Ђп еа *•*®п ®ђ•*® д ©Ђ 
        CHAR[n],  //ђ бᮥ Ґб•е б®ђҐЃЂЃҐ  *£Ђ®©б™Ѓ£Ѓ  Ђд Ґ®в 
        *CHAR_S, //ђ бᮥ §Ђп еа *•*®п б®ђҐЃЂЃҐ Ґбва•з ой®ебп Ґ д ©Ђ•
        COD,COD1; //ѓ•а•ђ•** п §Ђп ҐлҐЃ§ ™Ѓ§ЃҐле бЂЃҐ *  ѓ•з вм
    long  i,j,m,N,B, //ѓ•а•ђ•**л• бз•вз®™®
        w[n], //з бвЃвл ѓЃпҐЂ•*®п б®ђҐЃЂЃҐ Ґ в•™бв•
        *ws;//ЃвбЃав®аЃҐ **л© ђ бᮥ з бвЃв
    float *p,//ђ бᮥ Ґ•аЃпв*Ѓбв•© ѓЃпҐЂ•*®п б®ђҐЃЂ  Ґ § **Ѓђ в•™бв•
        H=0.0,//н*ваЃѓ®п пњљ•**Ѓ* 
        Lsh, //ба•§*пп §Ђ®**  ™Ѓ§ЃҐЃ£Ѓ бЂЃҐ  пњљ•**Ѓ* 
        s;//™Ѓ*ваЃЂм ѓа Ґ®Ђм*Ѓбв® а бз•в  ђ бᮥ  Ґ•аЃпв*Ѓбв•©
    memset(CHAR,0 ,sizeof(CHAR));
    for(i=0;i<n;i++)//І ѓЃЂ*•*®• ђ бᮥ  ™Ѓ§ ђ® б®ђҐЃЂЃҐ бЃ£Ђ б*Ѓ в °Ђ®ж• ASCII
    {
        CHAR[i]=32+i;
    }
 
    fw=fopen("COD_H.txt","w");//бЃІ§ *®• д ©Ђ  §Ђп ҐлҐЃ§  ®*дЃађ ж®®
    fclose(fw);
    do
    {
        m=0;  //І* з•*®п Ѓ°*гЂповбп §Ђп ®б™Ђоз•*®п Ѓи®°Ѓ™ ѓа® Ѓв™алв®® §аг£Ѓ£Ѓ д ©Ђ 
        N=0; //™ЃЂ®з•б⥁ б®ђҐЃЂЃҐ Ґ в•™бв• ®б™Ђоз п ѓЃҐвЃа•*®п
        memset(w,0.0,sizeof(w));
        memset(fname,0,sizeof(fname));
        printf ("\n ВҐ•§®в• * ®ђ•*ЃҐ *®• д ©Ђ  ® ѓгвм ™ *•ђг. \n");
        fgets(fname,sizeof(fname),stdin);
        m=strlen(fname);
        fname[m-1]=0;
        f=fopen(fname,"rt") ;
        if (f==NULL)
        {
            printf("\n Ои®°™  Ѓв™алв®п д ©Ђ ! \n");
            getch();
            exit(0);
        }
        B=0; // ™ЃЂ®з•б⥁ б®ђҐЃЂЃҐ Ґ в•™бв•
        while(!feof(f))
        {
            ch=getc(f);    //бз®влҐ *®• б®ђҐЃЂЃҐ
            B++;
            for (j=0;j<n;j++)
            {
                if (ch==CHAR[j])
                {
                    i=j;
                    break;
                }
            }
            w[i]+=1;
        }
        B--;
 
        shake(w,CHAR);//бЃав®аЃҐ™  ђ бᮥ  з бвЃв
 
        for (i=0; i<n; i++)
        {
            if (w[i]!=0)
                N++;
        }
 
        ws=(long *)malloc(N*sizeof(long));
        if (ws==NULL)
        {
            puts("М бᮥ ws *• бЃІ§ *!");
            getch();
            return;
        };
 
        CHAR_S=(char *)malloc(N*sizeof(char));
        if (CHAR_S==NULL)
        {
            puts("М бᮥ CHAR_S *• бЃІ§ *!");
            getch();
            return;
        }
        for (i=0; i<N; i++)//™Ѓѓ®аЃҐ *®• б®ђҐЃЂЃҐ б з бвЃвЃ© ѓЃпЂҐ•*®п >0 Ґ §®* ђ®з•б™®© ђ бᮥ
        {
            ws[i]=w[i];
            CHAR_S[i]=CHAR[i];
        }
 
 
        p=(float *)malloc(N*sizeof(float)) ;
        if (p==NULL)
        {
            puts("М бᮥ p *• бЃІ§ *!");
            getch();
            return;
        }
        for (i=0; i<N; i++) //а ббз•в н*ваЃѓ®® д ©Ђ 
        {
            p[i]=1.0*ws[i]/B;//І ѓЃЂ*•*®• ђ бᮥ  Ґ•аЃпв*Ѓбв•© ѓЃпҐЂ•*®п б®ђҐЃЂЃҐ
            H+=-1.0*p[i]*log(p[i])/log(2.0);
        }
        float Lh = 0;
        float Lf = 0;
        Lsh=Shennon(p,N,CHAR_S,ws);
 
        fw=fopen("COD_H.txt","a");
        printf ("\n Э*ваЃѓ®п ®беЃ§*Ѓ£Ѓ   Са•§*пп §Ђ®*  ™Ѓ§ЃҐЃ£Ѓ бЂЃҐ ");
        printf ("\n       в•™бв          КЃ§ Х ддђ *   КЃ§ пњљ•**Ѓ*   КЃ§ Ф *Ѓ");
        printf("\n       %2.4f           %2.4f            %2.4f     %2.4f", H,Lh,Lsh,Lf);
 
        fprintf(fw, "\n Entropy of the    Average lenght codeword ");
        fprintf(fw, "\n sourse text       Haffman cod   Shennon cod   Fano cod");
        fprintf(fw,"\n       %2.4f           %2.4f            %2.4f     %2.4f",H,Lh,Lsh,Lf);
        fclose(fw);
 
        //ЃбҐЃ°Ѓ¶§•*®• ѓ ђпв® Ѓв бЃІ§ **ле §®* ђ®з•б™®е ђ бᮥЃҐ
        fclose(f);
        free(p);
        free(CHAR_S);
        free(ws);
        getch();
        fclose(f);
        puts ("\n Ов™алвм §аг£Ѓ© д ©Ђ? (Н•в=Esc)");
        key=getch();
    }
    while (key!=27);//ESC
}
ƒобавлено через 20 секунд
¬ыправил создани€ массивов

ƒобавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
for (i=0; i<N; i++)
    {
        L[i]=-ceil(log(p[i])/log(2.0));
        if(1.0/pow(2.,-1*L[i])>p[i])
            L[i]++;
        if (i==0)
            L[i-1]=1;//тут кос€к при i == 0 за пределы массива выходим
        if (1.0/pow(2,-1.0*L[i-1])<p[i])
            printf("\n Н•ѓа Ґ®Ђм*Ѓ а ббз®в *  §Ђ®*  ™Ѓ§ЃҐЃ£Ѓ бЂЃҐ  пњљ•**Ѓ* !!!");
    }
аналогичный кос€к

C++
1
2
3
4
5
6
7
8
9
10
for (i=1; i<N; i++)
    {
        for (j=0;j<L[i];j++)
        {
            Q[i-1]=Q[i-1]*2.0;//при i == 0 выход за пределы
            C[i][j]=(int)(Q[i-1]);//при i == 0 выход за пределы
            if(Q[i-1]>1.0)//при i == 0 выход за пределы
                Q[i-1]=Q[i-1]-1.0;//при i == 0 выход за пределы
        }
    }
эти кос€ки вызвали у мен€ повреждение  учи, исправл€йте

ƒобавлено через 4 минуты
и еще после метода shake получилось так что символ с частотой 4 был на 1ом месте с частотой 2 на 2ом месте с частотой 3 на 3ем месте, € думаю так же где то кос€к, насчет самого меода shake € как пон€л результатом должен быть массив в котором упор€доченны частоты по€вл€ени€ символов по убыванию, + в массиве CHAR символы так же переставл€ютс€ на места их частот, один вопрос - а че как сложно алгоритм сделан? у ¬ас там сложность чуть примерно 2*N^2

ƒобавлено через 10 минут
да не совсем пон€л что тут за действи€
C++
1
2
3
4
5
Q[0]=0;
    for (i=1; i<N; i++)
    {
        Q[i]=Q[i-1]+p[i];
    }
но руководствова€сь логикой думаю тут должно быть так
C++
1
2
3
4
5
Q[0]=p[0];
    for (i=1; i<N; i++)
    {
        Q[i]=Q[i-1]+p[i];
    }
ƒобавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
for (i=1; i<N; i++)
    {
        for (j=0;j<L[i];j++)
        {
            Q[i-1]=Q[i-1]*2.0;//при i == 0 выход за пределы
            C[i][j]=(int)(Q[i-1]);//при i == 0 выход за пределы
            if(Q[i-1]>1.0)//при i == 0 выход за пределы
                Q[i-1]=Q[i-1]-1.0;//при i == 0 выход за пределы
        }
    }
€ писал про кос€к, а код подправлен в вашем коде первый цикл с i = 0 начинаетс€

ƒобавлено через 7 минут
о еще кос€к, почему то дл€ последнего символа в тексте делаетс€ лишний w[i]+=1; т.е в моем тексте "а" попадаетс€ 2 раза а по выходу из цикла дл€ "а" частота 3

ƒобавлено через 5 минут
короч вот это

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  B=0; // ™ЃЂ®з•б⥁ б®ђҐЃЂЃҐ Ґ в•™бв•
  while(!feof(f))
  {
   ch=getc(f);    //бз®влҐ *®• б®ђҐЃЂЃҐ
   B++;
   for (j=0;j<n;j++)
   {
    if (ch==CHAR[j])
    {
     i=j;
     break;
    }
   }
   w[i]+=1;
 }
 B--;
замените на
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
B=0; // ™ЃЂ®з•б⥁ б®ђҐЃЂЃҐ Ґ в•™бв•
        while((ch = getc(f)) != EOF)
        {
            //ch=getc(f);    //бз®влҐ *®• б®ђҐЃЂЃҐ
            B++;
            for (j=0;j<n;j++)
            {
                if (ch==CHAR[j])
                {
                    i=j;
                    break;
                }
            }
            w[i]+=1;
        }
и B-- не надо после цикла
”ль€ниус
 јватар дл€ ”ль€ниус
1 / 1 / 0
–егистраци€: 15.08.2013
—ообщений: 132
01.05.2014, 10:27  [“—]     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #29
÷итата —ообщение от aLarman ѕосмотреть сообщение
о еще кос€к, почему то дл€ последнего символа в тексте делаетс€ лишний w[i]+=1; т.е в моем тексте "а" попадаетс€ 2 раза а по выходу из цикла дл€ "а" частота 3
да, это кос€к, € его уже тоже заметила, он происходит из-за того, что в конце текста ничего нет, но все равно цикл запускаетс€ при ch=' ', пробовала ставить условие : если ch='\0', то цикл не запускать, но цикл все равно запускаетс€. ¬ итоге сделала в окончании цикла w[i]--ж тогда частота последнего символа считаетс€ верно

ƒобавлено через 2 минуты
÷итата —ообщение от aLarman ѕосмотреть сообщение
и еще после метода shake получилось так что символ с частотой 4 был на 1ом месте с частотой 2 на 2ом месте с частотой 3 на 3ем месте, € думаю так же где то кос€к, насчет самого меода shake € как пон€л результатом должен быть массив в котором упор€доченны частоты по€вл€ени€ символов по убыванию, + в массиве CHAR символы так же переставл€ютс€ на места их частот, один вопрос - а че как сложно алгоритм сделан? у ¬ас там сложность чуть примерно 2*N^2
Ќу тут все просто, выпендритьс€ хотела, типа крутой метод сортировки, благо он у мен€ есть с другого предмета (сама делала). я что-то запуталась, думала так будет лучше, но думаю теперь что лучше пузырьковую сортировку применить...

ƒобавлено через 14 минут
÷итата —ообщение от aLarman ѕосмотреть сообщение
аналогичный кос€к
C++
1
2
3
4
5
6
7
8
9
10
for (i=1; i<N; i++)
  {
    for (j=0;j<L[i];j++)
    {
      Q[i-1]=Q[i-1]*2.0;//при i == 0 выход за пределы
      C[i][j]=(int)(Q[i-1]);//при i == 0 выход за пределы
      if(Q[i-1]>1.0)//при i == 0 выход за пределы
        Q[i-1]=Q[i-1]-1.0;//при i == 0 выход за пределы
    }
  }
ѕравильно, при i=0 кос€к, только i здесь измен€етс€ с 1, чтобы не было кос€ка, а Q[0]=0 -перед циклом.

ƒобавлено через 3 минуты
÷итата —ообщение от aLarman ѕосмотреть сообщение
да не совсем пон€л что тут за действи€
C++
1
2
3
4
5
Q[0]=0;
  for (i=1; i<N; i++)
  {
    Q[i]=Q[i-1]+p[i];
  }
но руководствова€сь логикой думаю тут должно быть так
C++
1
2
3
4
5
Q[0]=p[0];
  for (i=1; i<N; i++)
  {
    Q[i]=Q[i-1]+p[i];
  }
Ќе, тут друга€ логика , тут Q[0]=0, Q[1]=Q[0]+P[1],...Q[n]=1(так как сумма веро€тностей равна 1), но последнее значение Q мне не нужно в дальнейшем, поэтому расчет останавливаетс€ на Q[n-1] считает.

ƒобавлено через 6 минут
÷итата —ообщение от aLarman ѕосмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
for (i=0; i<N; i++)
  {
    L[i]=-ceil(log(p[i])/log(2.0));
    if(1.0/pow(2.,-1*L[i])>p[i])
      L[i]++;
    if (i==0)
      L[i-1]=1;//тут кос€к при i == 0 за пределы массива выходим
    if (1.0/pow(2,-1.0*L[i-1])<p[i])
      printf("\n Н•ѓа Ґ®Ђм*Ѓ а ббз®в * *§Ђ®* *™Ѓ§ЃҐЃ£Ѓ бЂЃҐ *пњљ•**Ѓ* !!!");
  }
Ёто € специально сделала, но вы наверное правы, это наверное неправильно, мне дл€ расчета нужно L[-1]которого нет.

ƒобавлено через 20 минут
исправила код:
C++
1
2
3
4
5
6
7
8
9
10
 for (i=0; i<N; i++)
 {
  L[i]=-ceil(log(p[i])/log(2.0));
  if(1.0/pow(2,-1*L[i])>p[i])
    L[i]++;
  if (i==0)
    l=1;
  else
    l=L[i-1];
  if (1.0/pow(2,-1.0*l)<p[i])
Alex5
881 / 616 / 81
–егистраци€: 12.04.2010
—ообщений: 1,552
01.05.2014, 20:09     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #30
÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
Q[0]=0, Q[1]=Q[0]+P[1],...Q[n]=1(так как сумма веро€тностей...
“ак в результате получим: Q[0]=0, Q[1]=P[1], Q[2]=P[1]+P[2], Q[3]=P[1]+P[2]+P[3], ...
ћожет быть, и P[0] нужно прибавить? »ли P[0] всегда == 0 ?
”ль€ниус
 јватар дл€ ”ль€ниус
1 / 1 / 0
–егистраци€: 15.08.2013
—ообщений: 132
03.05.2014, 06:15  [“—]     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #31
Alex5, “очно, вы правы! я первый раз сделала правильно, потом исправила на так, дело в том, что путаница из-за того, что в псевдокоде идет обращение к массивам с нулевого кода
aLarman
636 / 557 / 89
–егистраци€: 13.12.2012
—ообщений: 2,109
05.05.2014, 08:46     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #32
÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
ѕравильно, при i=0 кос€к, только i здесь измен€етс€ с 1, чтобы не было кос€ка, а Q[0]=0 -перед циклом.
¬ вашем коде i начинаетс€ с 0, а не с 1, 1туда попала когда € копировал из вижы подправленный код, который не вызывал падений
”ль€ниус
 јватар дл€ ”ль€ниус
1 / 1 / 0
–егистраци€: 15.08.2013
—ообщений: 132
05.05.2014, 10:11  [“—]     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #33
÷итата —ообщение от aLarman ѕосмотреть сообщение
вобщем задебажил ваш код
¬ы хотите сказать что вы выложили этот код из визуал студио? ƒело в том, что € скачала себе визуал студио экспресс и у мен€ ругаетс€ на мой код на чем свет стоит. ѕопробовала новый билдер, ну не совсем новый,в общем XE3, там толковой инструкции не нашла. Ќажимаю троссировку, а он мне в ответ код ассемблера, скоторым € вообще не знаю что делать .
÷итата —ообщение от aLarman ѕосмотреть сообщение
¬ вашем коде i начинаетс€ с 0, а не с 1, 1туда попала когда € копировал из вижы подправленный код, который не вызывал падений
ѕон€ла, да вы всетаки правы, запуталась € в хитром псевдокоде . —пасибо

ƒобавлено через 2 минуты
C#
1
2
3
4
5
6
7
8
9
10
for (i=0; i<N; i++)
 {
  for (j=0;j<L[i];j++)
  {
   Q[i]=Q[i]*2.0;
   C[i][j]=(int)(Q[i]);
   if(Q[i]>1.0)
    Q[i]=Q[i]-1.0;
  }
 }
aLarman
636 / 557 / 89
–егистраци€: 13.12.2012
—ообщений: 2,109
05.05.2014, 10:16     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #34
÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
¬ы хотите сказать что вы выложили этот код из визуал студио? ƒело в том, что € скачала себе визуал студио экспресс и у мен€ ругаетс€ на мой код на чем свет стоит. ѕопробовала новый билдер, ну не совсем новый,в общем XE3, там толковой инструкции не нашла. Ќажимаю троссировку, а он мне в ответ код ассемблера, скоторым € вообще не знаю что делать .
что то у ¬ас все плохо
¬общем да код из вижы € могу скинуть, кажетс€ не удалил еще, ничего не ругаетс€ и работает, вижа 2010

ƒобавлено через 50 секунд
÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
ƒело в том, что € скачала себе визуал студио экспресс
омг скачайте просто визуал студио
”ль€ниус
 јватар дл€ ”ль€ниус
1 / 1 / 0
–егистраци€: 15.08.2013
—ообщений: 132
05.05.2014, 11:17  [“—]     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #35
÷итата —ообщение от aLarman ѕосмотреть сообщение
омг скачайте просто визуал студио
 акую именно? профессионал или ультиматум?


а что вижа легче в работе?
aLarman
636 / 557 / 89
–егистраци€: 13.12.2012
—ообщений: 2,109
05.05.2014, 19:41     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #36
ultimate
ну как сказать легче, по крайней мере сносный дебаг, и норм компиль
”ль€ниус
 јватар дл€ ”ль€ниус
1 / 1 / 0
–егистраци€: 15.08.2013
—ообщений: 132
07.05.2014, 10:46  [“—]     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #37
aLarman, Alex5, —пасибо, ¬ам, за помощь, в новой проге нашла где пам€ть ломаетс€. ¬ итоге создала массивы в теле main() и пам€ть перестала ломатьс€ . ј пон€ть почему именно ломаетс€ не получилось..
aLarman
636 / 557 / 89
–егистраци€: 13.12.2012
—ообщений: 2,109
07.05.2014, 10:53     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #38
÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
ј пон€ть почему именно ломаетс€ не получилось..
по-моему ¬ам об этом писали
”ль€ниус
 јватар дл€ ”ль€ниус
1 / 1 / 0
–егистраци€: 15.08.2013
—ообщений: 132
07.05.2014, 19:55  [“—]     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #39
Ќу мне писали о том, что пам€ть занимаетс€ чем-то другим, пробовала делать по разному и как писали тоже, но все равно ломалась пам€ть...
MoreAnswers
Ёксперт
37091 / 29110 / 5898
–егистраци€: 17.06.2006
—ообщений: 43,301
08.05.2014, 09:05     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные
≈ще ссылки по теме:

C++ ќшибка при передаче в функцию
“ер€етс€ строка при передаче в функцию C++
Ќаписать процедуру дл€ суммировани€ матриц. ќшибка при передаче массива в функцию C++

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

»ли воспользуйтесь поиском по форуму:
aLarman
636 / 557 / 89
–егистраци€: 13.12.2012
—ообщений: 2,109
08.05.2014, 09:05     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #40
”ль€ниус, раз не получилось, давайте обновленный код в студию
Yandex
ќбъ€влени€
08.05.2014, 09:05     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные
ќтвет —оздать тему
ќпции темы

“екущее врем€: 00:55. „асовой по€с GMT +3.
 ибер‘орум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
–ейтинг@Mail.ru