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

—++ дл€ начинающих

¬ойти
–егистраци€
¬осстановить пароль
 
 
–ейтинг: –ейтинг темы: голосов - 10, средн€€ оценка - 4.60
”ль€ниус
1 / 1 / 0
–егистраци€: 15.08.2013
—ообщений: 132
#1

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

29.04.2014, 10:11. ѕросмотров 1318. ќтветов 42
ћетки нет (¬се метки)

ћне необходимо построить код Ўеннона, на основе псевдокода, предложенного в лекции (кодирую текст на английском алфавите).
ѕри создании кода Ўеннона столкнулась с такой проблемой: при передаче в функцию массива 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++
C++ ќшибка при передаче в функцию
“ер€етс€ строка при передаче в функцию C++
ѕосле регистрации реклама в сообщени€х будет скрыта и будут доступны все возможности форума.
aLarman
640 / 561 / 89
–егистраци€: 13.12.2012
—ообщений: 2,109
29.04.2014, 10:37     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #2
C++
1
2
3
4
5
6
7
8
9
10
void create_Mas1 (long *L, long N)
{
 L=(long *)malloc(N*sizeof(long)); //бЃІ§ *®• ђ бᮥ  §Ђ®** ™Ѓ§ЃҐле бЂЃҐ
 if (L==NULL)
 {
  puts("О§*Ѓђ•а*л© ђ бᮥ *• бЃІ§ *!");
  getch();
  return;
 }
}
ћассив ¬ы так не создадите

ƒобавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
void create_Mas1 (long *&L, long N)
{
 L=(long *)malloc(N*sizeof(long)); //бЃІ§ *®• ђ бᮥ  §Ђ®** ™Ѓ§ЃҐле бЂЃҐ
 if (L==NULL)
 {
  puts("О§*Ѓђ•а*л© ђ бᮥ *• бЃІ§ *!");
  getch();
  return;
 }
}
ƒобавлено через 1 минуту
÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
C++
1
2
3
4
float *Q
Lsh=0;
 int **C
long *L
инициализаци€ инициализаци€!!

ƒобавлено через 57 секунд
÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
void create_Mas2 (int **C,long N)
аналогично после выхода из ф-ции C не будет указывать на выделенную область пам€ти

ƒобавлено через 4 минуты
ошибка создани€ массива может повлечь необъ€снимое изменение данных, короч UB, так что переделывайте
”ль€ниус
1 / 1 / 0
–егистраци€: 15.08.2013
—ообщений: 132
29.04.2014, 14:36  [“—]     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #3
÷итата —ообщение от aLarman ѕосмотреть сообщение
C++
1
void create_Mas1 (long *&L, long N)
≈сли € ставлю *&L в функции, компил€тор ругаетс€: Expacted, причем он так ругаетс€ всегда, когда € пытаюсь так поставить. ƒаже когда в учебнике так написано, € не могу так написать в программе. ≈сли такое будет в описании функции, то как € должна вызвать функцию в самой программе? ≈сли пишу Mas1 (&L,N) ругаетс€:Suspicious pointer conversion.

ƒобавлено через 3 минуты
÷итата —ообщение от aLarman ѕосмотреть сообщение
C++
1
2
3
4
float *Q
Lsh=0;
*int **C
long *L
инициализаци€ инициализаци€!!
 ак инициализировать массив?
ƒл€ одномерного массива € использовала функцию memset(), но дл€ двумерного у мен€ не получилось ее использовать.
aLarman
640 / 561 / 89
–егистраци€: 13.12.2012
—ообщений: 2,109
29.04.2014, 14:48     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #4
÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
 ак инициализировать массив?
а ¬ы тут видете массив? € нет, это всего лишь указатель, его в NULL
”ль€ниус
1 / 1 / 0
–егистраци€: 15.08.2013
—ообщений: 132
29.04.2014, 14:50  [“—]     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #5
пон€ла , а на счет того, что выше? ѕро отправку указател€ в функцию?
aLarman
640 / 561 / 89
–егистраци€: 13.12.2012
—ообщений: 2,109
29.04.2014, 15:00     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
void funck(int *&x)
{
    x = new int[10];
}
 
int main()
{
    int *a = NULL;
    funck(a);
    delete []a;
    system("pause");
}
вот така€ вещь работает 100%

ƒобавлено через 47 секунд
÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
ƒаже когда в учебнике так написано, € не могу так написать в программе.
видимо ¬ам все таки есть смысл сменить компил€тор, чего же MSVS не качаетс€ ?)
Denis123456789
43 / 43 / 17
–егистраци€: 02.06.2013
—ообщений: 180
29.04.2014, 15:07     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #7
÷итата —ообщение от aLarman ѕосмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
void funck(int *&x)
{
   x = new int[10];
}
int main()
{
   int *a = NULL;
   funck(a);
   delete []a;
   system("pause");
}
Ёто в с++ так выдел€етс€, а здесь и код вроде на с, и компил€тор, наверное, с только компилирует, а в нем malloc и free используетс€ дл€ выделени€ и освобождени€ динамической пам€ти
”ль€ниус
1 / 1 / 0
–егистраци€: 15.08.2013
—ообщений: 132
29.04.2014, 15:14  [“—]     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #8
я не могу примен€ть функции new() и delete(), компил€тор их не понимает. ј этот компил€тор был вместе с лекци€ми в нашем ¬”«е, т.е. € так понимаю, что мы наверное должны именно его использовать в работе .
MSVS скачала, но при компилировании, он стал ругать мой предыдущий код, € почитала, в нем нет одной стандартной библиотеки, не помню сейчас какой. ¬ итоге € тот предыдущий код дописала без дос бокса на старенькой XP и все заработало...—ама не понимаю, почему нас заставл€ют пользоватьс€ старыми технологи€ми .’от€ в инете читала что Ѕорланд —и++ может очень многое, что в других полностью нереализовано. ћне пока в этом очень трудно разобратьс€, так как надо все врем€ быстрее и быстрее писать и сдавать, на том что есть ... ¬от дл€ HTML нам сразу сказали, что надо пользоватьс€ такой то прогой, € скачала, было оч удобно писать, а тут вот так и вроде даже классы уже проходили, а надо писать без классов, так как классы это уже объектно-ориентированное программирование, а это другой предмет..Ќу или € что-то не понимаю....
Denis123456789
43 / 43 / 17
–егистраци€: 02.06.2013
—ообщений: 180
29.04.2014, 15:15     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #9
÷итата —ообщение от aLarman ѕосмотреть сообщение
x = new int[10];
это в с++ так выдел€етс€, а здесь вроде код на с, и компил€тор с,наверное, только компилирует c, в с будет так вроде:
C
1
2
3
4
5
6
7
8
9
10
11
12
void funck(int *x)
{
    x = (int*) malloc(sizeof(int)*10);
}
 
int main()
{
    int *a = NULL;
    funck(a);
    free(a);
    system("pause");
}
Alex5
1018 / 681 / 100
–егистраци€: 12.04.2010
—ообщений: 1,720
29.04.2014, 15:17     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #10
÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
ѕодскажите, пожалуйста, в чем может быть проблема?
”ль€ниус, что будет выведено на экран?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void f( int a )
{
    a = 456;
    printf( "\n  function f():  a == %d \n\n", a );
}
 
int main(void)
{
    int n = 123;
    f( n );
    printf( "\n  main():  n == %d \n\n", n );
    getchar();
    return 0;
}
”ль€ниус
1 / 1 / 0
–егистраци€: 15.08.2013
—ообщений: 132
29.04.2014, 15:22  [“—]     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #11
¬от предмет называетс€ —и++, компил€тор скачала —и++Builder, но у мен€ есть подозрение, что это все-таки не до конца —и++, так как многими функци€ми € не могу пользоватьс€, в то же врем€, это все-таки не —и, а что-то большее . ѕомогите!!!!

ƒобавлено через 5 минут
÷итата —ообщение от Alex5 ѕосмотреть сообщение
что будет выведено на экран?
456 два раза, а что?
Alex5
1018 / 681 / 100
–егистраци€: 12.04.2010
—ообщений: 1,720
29.04.2014, 15:41     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #12
÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
—ообщение от Alex5
что будет выведено на экран?
456 два раза, а что?
¬ы уверены? Ёто пример, аналогичный ¬ашей проблеме. ( ак в функции изменить какие-то переменные, так чтобы эти изменени€ сохранились после выхода из функции.)

ƒобавлено через 6 минут
—м., что такое ѕередача параметра по значению
aLarman
640 / 561 / 89
–егистраци€: 13.12.2012
—ообщений: 2,109
29.04.2014, 15:49     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #13
Alex5, спасибо
Denis123456789, оп€ть 25 на те же грабли

ƒобавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
насчет с++, да € ошибс€ у ¬ас — юзаетс€ тогда 
 
void create_Mas1 (long **L, long N)
{
 *L=(long *)malloc(N*sizeof(long)); //бЃІ§ *®• ђ бᮥ  §Ђ®** ™Ѓ§ЃҐле бЂЃҐ
 if (*L==NULL)
 {
  puts("О§*Ѓђ•а*л© ђ бᮥ *• бЃІ§ *!");
  getch();
  return;
 }
}
использовать так
C++
1
2
3
4
long * x;
create_Mas1 (long &x, 50);
////
free(x);
ƒобавлено через 2 минуты
÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
’от€ в инете читала что Ѕорланд —и++ может очень многое, что в других полностью нереализовано.
это инфа оч устарела, такое может было примерно в прошлом тыс€чилетии
Denis123456789
43 / 43 / 17
–егистраци€: 02.06.2013
—ообщений: 180
29.04.2014, 16:15     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #14
÷итата —ообщение от aLarman ѕосмотреть сообщение
Alex5
а по ссылке почему нельз€ передавать указатель?

ƒобавлено через 47 секунд
aLarman, а по ссылке почему указатель нельз€ передавать?

ƒобавлено через 4 минуты
C
1
2
3
4
5
6
7
8
9
10
11
12
void funck(int *&x)
{
    x = (int*) malloc(sizeof(int)*10);
}
 
int main()
{
    int *a = NULL;
    funck(a);
    free(a);
    system("pause");
}
¬от так почему нельз€? с ссылок не поддерживает что-ли?
ј так, выдел€ть пам€ть в функции как-то нехорошо по моему?
”ль€ниус
1 / 1 / 0
–егистраци€: 15.08.2013
—ообщений: 132
29.04.2014, 16:18  [“—]     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #15
÷итата —ообщение от aLarman ѕосмотреть сообщение
насчет с++, да € ошибс€ у ¬ас — юзаетс€ тогда
“.е. это все-таки си и надо в будущем в другом разделе форума создавать темки, да? »нтересно почему же тогда предмет си++ называетс€ ...Ќадо будет как выдастс€ свободна€ минутка, препода помучить по этому поводу.
aLarman
640 / 561 / 89
–егистраци€: 13.12.2012
—ообщений: 2,109
29.04.2014, 16:29     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #16
÷итата —ообщение от Denis123456789 ѕосмотреть сообщение
а по ссылке почему указатель нельз€ передавать?
÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
≈сли € ставлю *&L в функции, компил€тор ругаетс€: Expacted,
кажись низ€

ƒобавлено через 1 минуту
÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
“.е. это все-таки си и надо в будущем в другом разделе форума создавать темки, да? »нтересно почему же тогда предмет си++ называетс€
потому что с и с++ это не совершенно разные €зыки программировани€

ƒобавлено через 18 секунд
и ¬ы видимо начинаете изучение с с с++
”ль€ниус
1 / 1 / 0
–егистраци€: 15.08.2013
—ообщений: 132
29.04.2014, 16:32  [“—]     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #17
÷итата —ообщение от Alex5 ѕосмотреть сообщение
¬ы уверены? Ёто пример, аналогичный ¬ашей проблеме. ( ак в функции изменить какие-то переменные, так чтобы эти изменени€ сохранились после выхода из функции.)
ƒа, не права, Ќќ в своей программе € работаю с массивами и переадю в функцию массив, а не переменную и он измен€етс€. ¬ моей программе есть такой пример: функци€ shake(CHAR,w), € передаю туда два статических массива и они на выходе измен€ютс€ (сортируютс€ по убыванию)!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ѕример 4: ѕередача в функцию массива с использованием указател€. –езультат Ц элементы массива возвод€тс€ в квадрат. 
#include <stdio.h>
#include <conio.h>
void quart(int n, float * x) // ћожно void quart(int n, float x[])
{int i;
  for (i=0;i<n;i++)
   x[i]=x[i]*x[i];
}
main()
{float z[]={1,2,3,4};
  int j;
  clrscr();
  for (j=0; j<4; j++)
   printf(" %6.2f",z[j]);
  quart(4,z);
  for (j=0; j<4; j++)
    printf("\n %6.2f",z[j]);
  getch();
}
Denis123456789
43 / 43 / 17
–егистраци€: 02.06.2013
—ообщений: 180
29.04.2014, 16:32     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #18
aLarman, а зачем нам вообще специальную функцию создавать дл€ выделени€ пам€ти, € имею ввиду функцию funck?
”ль€ниус
1 / 1 / 0
–егистраци€: 15.08.2013
—ообщений: 132
29.04.2014, 16:33  [“—]     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #19
÷итата —ообщение от aLarman ѕосмотреть сообщение
и ¬ы видимо начинаете изучение с с с++
MoreAnswers
Ёксперт
37091 / 29110 / 5898
–егистраци€: 17.06.2006
—ообщений: 43,301
29.04.2014, 16:34     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные
≈ще ссылки по теме:

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

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

»ли воспользуйтесь поиском по форуму:
aLarman
640 / 561 / 89
–егистраци€: 13.12.2012
—ообщений: 2,109
29.04.2014, 16:34     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные #20
Denis123456789, потому что так сделал(а) “—

ƒобавлено через 23 секунды
÷итата —ообщение от ”ль€ниус ѕосмотреть сообщение
изучение с с с++
измечение —и с —и++
Yandex
ќбъ€влени€
29.04.2014, 16:34     ѕри передаче в функцию динамического массива, в массиве искажаютс€ данные
ќтвет —оздать тему
ќпции темы

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