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

ошибка преобразования char - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
student101
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 17
01.12.2010, 04:28     ошибка преобразования char #1
помогите найти ошибку(или исправить):
#include<iostream>
#include<string.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef char *pChar;
typedef char **ppChar;

FILE*out1,*out2,*out3;
void main()
{out1=fopen("text1.txt","r");
out2=fopen("text2.txt","r");
out3=fopen("text3.txt","w");
int i,j,m,n,kolstrA,kolstrB;
char in[80];
char an[80];
char*pa[100];
char*pb[100];
char*pc[100];
char*pk[100];
char a[100][80];
char b[100][80];
char c[200][80];


for (kolstrA=0;kolstrA<100;kolstrA++)
{if(fgets(in,80,out1)==NULL)
{break;};
in[80]='\0';
strncpy(a[kolstrA],in,80);};
fclose(out1);
for(kolstrB=0;kolstrB<100;kolstrB++)
{if(fgets(an,80,out2)==NULL)
{break;};
an[80]='\0';
strncpy(b[kolstrB],an,80);};
fclose(out2);

for(i=0;i<=kolstrA;i++)
{pa[i]=a[i];};
for(j=0;j<=kolstrB;j++)
{pb[j]=b[j];};
for(m=0;m<=(kolstrA+kolstrB);m++)
{pc[m]=c[m];};
i=0;
j=0;
m=0;
for(i=0;i<=kolstrA-2;i++)
for(j=i+1;j<=kolstrA-1;j++)
{if(strcmp(pa[i],pa[j])<0)
{strcpy(pk,pa[i]);
strcpy(pa[i],pa[j]);
strcpy(pa[j],pk);};};
for(i=0;i<=kolstrB-2;i++)
for(j=i+1;j<=kolstrB-1;j++)
{if(strcmp(pb[i],pb[j])<0)
{strcpy(pk,pb[i]);
strcpy(pb[i],pb[j]);
strcpy(pb[j],pk);};};
do
{if(strcmp(pa[i],pb[j])<0)
{pc[m]=pa[i];
i=i+1;
m=m+1;}
else
{pc[m]=pb[j];
j=j+1;
m=m+1;};}
while(i<kolstrA||j<kolstrB);
while(j<=kolstrB)
{pc[m]=pb[j];
j=j+1;
m=m+1;};
while(i<=kolstrA)
{pc[m]=pa[i];
i=i+1;
m=m+1;};
cout<<"rezultat"<<"\n";
for(m=0;m<(kolstrA+kolstrB);m++)
{printf("%s\n",pc[m]);};
return;
}

error C2664: strcpy: невозможно преобразовать параметр 2 из 'char *[100]' в 'const char *'
Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.12.2010, 04:32     ошибка преобразования char #2
C
1
strcpy(pa[j], pk);
C
1
strcpy(pa[j], pk[?]);
скорее всего нужно оставить strcpy(), а поменять
C
1
char*pk[100];
на
C
1
char pk[80];
student101
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 17
01.12.2010, 04:49  [ТС]     ошибка преобразования char #3
Заменила:
char*pk[80];

и
{if(strcmp(pa[i],pa[j])<0)
{strcpy(pk[1],pa[i]);
strcpy(pa[i],pa[j]);
strcpy(pa[j],pk[1]);};};

теперь появилась debug error
"Run-Time Check Failure #3 - The variable 'pk' is being used without being initialized."

а с этим как бороться?
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.12.2010, 06:57     ошибка преобразования char #4
ты внимательнее смотри, заменила неправильно
C
1
2
3
4
5
6
7
8
9
char pk[80];
 
...
 
    if (strcmp(pa[i], pa[j]) < 0) {
        strcpy(pk, pa[i]);
        strcpy(pa[i], pa[j]);
        strcpy(pa[j], pk);
    }
student101
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 17
01.12.2010, 20:53  [ТС]     ошибка преобразования char #5
переделала, стало так:
#include<iostream>
#include<string.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef char *pChar;
typedef char **ppChar;

FILE*out1,*out2,*out3;
void main()
{out1=fopen("text1.txt","r");
out2=fopen("text2.txt","r");
out3=fopen("text3.txt","w");
int i,j,m,kolstrA,kolstrB;
char in[81];
char an[81];
char*pa[100];
char*pb[100];
char*pc[100];
char pk[80];
char a[100][80];
char b[100][80];
char c[200][80];


for (kolstrA=0;kolstrA<100;kolstrA++)
{if(fgets(in,81,out1)==NULL)
{break;};
in[80]='\0';
strncpy(a[kolstrA],in,80);};
fclose(out1);
for(kolstrB=0;kolstrB<100;kolstrB++)
{if(fgets(an,81,out2)==NULL)
{break;};
an[80]='\0';
strncpy(b[kolstrB],an,80);};
fclose(out2);

for(i=0;i<=kolstrA;i++)
{pa[i]=a[i];};
for(j=0;j<=kolstrB;j++)
{pb[j]=b[j];};
for(m=0;m<=(kolstrA+kolstrB);m++)
{pc[m]=c[m];};
i=0;
j=0;
m=0;
for(i=0;i<=kolstrA-2;i++)
for(j=i+1;j<=kolstrA-1;j++)
{if(strcmp(pa[i],pa[j])<0)
{strcpy(pk,pa[i]);
strcpy(pa[i],pa[j]);
strcpy(pa[j],pk);};};
for(i=0;i<=kolstrB-2;i++)
for(j=i+1;j<=kolstrB-1;j++)
{if(strcmp(pb[i],pb[j])<0)
{strcpy(pk,pb[i]);
strcpy(pb[i],pb[j]);
strcpy(pb[j],pk);};};
do
{if(strcmp(pa[i],pb[j])<0)
{pc[m]=pa[i];
i=i+1;
m=m+1;}
else
{pc[m]=pb[j];
j=j+1;
m=m+1;};}
while(i<kolstrA||j<kolstrB);
while(j<=kolstrB)
{pc[m]=pb[j];
j=j+1;
m=m+1;};
while(i<=kolstrA)
{pc[m]=pa[i];
i=i+1;
m=m+1;};
cout<<"rezultat"<<"\n";
for(m=0;m<(kolstrA+kolstrB);m++)
{printf("%s\n",pc[m]);};
return;
}
но вот теперь на экране при запске нечто странное выдается, вроде скобок квадратных, в большом количетсве, но не бесконечно.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
01.12.2010, 23:37     ошибка преобразования char #6
C
1
2
    an[80]='\0';
    strncpy(b[kolstrB], an, 80);};
strncpy() не запишет нуль-символ в b[kolstrB], если не дойдёт до него в строке an
у тебя напутано с размерами

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char an[80];
 
...
 
    if (fgets(an, sizeof an, out2) == NULL)
 
...
 
    strcpy(b[kolstrB], an);
 
#if 0
    strncpy(b[kolstrB], an, strlen(an));
    b[kolstrB][strlen(an)] = '\0';
#endif
student101
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 17
02.12.2010, 00:09  [ТС]     ошибка преобразования char #7
int i,j,m,kolstrA,kolstrB;
char in[81];
char an[81];
char*pa[100];
char*pb[100];
char*pc[100];
char pk[80];
char a[100][80];
char b[100][80];
char c[200][80];


for (kolstrA=0;kolstrA<100;kolstrA++)
{if(fgets(in,sizeof in,out1)==NULL)
{break;};
strcpy(a[kolstrA], in);

заменила:
#if 0
strncpy(a[kolstrA], in, strlen(in));
a[kolstrA][strlen(in)] = '\0';
#endif
};
fclose(out1);
for(kolstrB=0;kolstrB<100;kolstrB++)
{if(fgets(an,sizeof an,out2)==NULL)
{break;};
strcpy(b[kolstrB], an);

#if 0
strncpy(b[kolstrB], an, strlen(an));
b[kolstrB][strlen(an)] = '\0';
#endif
};

fclose(out2);
теперь все указатели получаются неправильными - Нарушение прав доступа при чтении "0xcccccccc"
htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
02.12.2010, 00:16     ошибка преобразования char #8
Попробуй выводить не printf("%s", pc[m]), а так printf("%c", pc[m]).
Объясняю - ты выводишь в цикле строчку, а т. к. у тебя масив символов, то ты и должна выводить символы, а не строчки.

Да и в следующий раз структурируй код, и пользуйся тегами для кода. Так легче и быстрее найти ошибку, и это также привкус хорошего программиста
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.12.2010, 00:25     ошибка преобразования char #9
Цитата Сообщение от htonasral
а т. к. у тебя масив символов
pc - массив указателей на строки
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.12.2010, 00:30     ошибка преобразования char #10
student101, ты видишь такие значки ?
оформи свой первейший код с их помощью
Миниатюры
ошибка преобразования char  
htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
02.12.2010, 00:36     ошибка преобразования char #11
Цитата Сообщение от accept Посмотреть сообщение
pc - массив указателей на строки
Мда блин, как я там не увидел звёздочку...
student101
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 17
02.12.2010, 00:56  [ТС]     ошибка преобразования char #12
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
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef char *pChar;
typedef char **ppChar;
 
FILE*out1,*out2,*out3;
void main()
{out1=fopen("text1.txt","r");
out2=fopen("text2.txt","r");
out3=fopen("text3.txt","w");
int i,j,m,kolstrA,kolstrB;
char in[81];
char an[81];
char*pa[100];
char*pb[100];
char*pc[100];
char pk[80];
char a[100][80];
char b[100][80];
char c[200][80];
 
 
for (kolstrA=0;kolstrA<100;kolstrA++)
{if(fgets(in,sizeof in,out1)==NULL)
{break;};
strcpy(a[kolstrA], in);
#if 0
    strncpy(a[kolstrA], in, strlen(in));
    a[kolstrA][strlen(in)] = '\0';
#endif
};
fclose(out1);
for(kolstrB=0;kolstrB<100;kolstrB++)
{if(fgets(an,sizeof an,out2)==NULL)
{break;};
strcpy(b[kolstrB], an);
#if 0
    strncpy(b[kolstrB], an, strlen(an));
    b[kolstrB][strlen(an)] = '\0';
#endif
};
fclose(out2);
 
for(i=0;i<=kolstrA;i++)
{pa[i]=a[i];};
for(j=0;j<=kolstrB;j++)
{pb[j]=b[j];};
for(m=0;m<=(kolstrA+kolstrB);m++)
{pc[m]=c[m];};
i=0;
j=0;
m=0;
for(i=0;i<=kolstrA-2;i++)
for(j=i+1;j<=kolstrA-1;j++)
{if(strcmp(pa[i],pa[j])<0)
{strcpy(pk,pa[i]);
strcpy(pa[i],pa[j]);
strcpy(pa[j],pk);};};
for(i=0;i<=kolstrB-2;i++)
for(j=i+1;j<=kolstrB-1;j++)
{if(strcmp(pb[i],pb[j])<0)
{strcpy(pk,pb[i]);
strcpy(pb[i],pb[j]);
strcpy(pb[j],pk);};};
do
{if(strcmp(pa[i],pb[j])<0)
{strcpy(pc[m],pa[i]);
i=i+1;
m=m+1;}
else
{strcpy(pc[m],pb[j]);
j=j+1;
m=m+1;};}
while(i<kolstrA||j<kolstrB);
while(j<=kolstrB)
{strcpy(pc[m],pb[j]);
j=j+1;
m=m+1;};
while(i<=kolstrA)
{strcpy(pc[m],pa[i]);
i=i+1;
m=m+1;};
cout<<"rezultat"<<"\n";
for(m=0;m<(kolstrA+kolstrB);m++)
{printf("%c\n",pc[m]);};
return;
}
здесь ошибка в указателях идет

а так:
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
#include<iostream>
#include<string.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef char *pChar;
typedef char **ppChar;
 
FILE*out1,*out2,*out3;
void main()
{out1=fopen("text1.txt","r");
out2=fopen("text2.txt","r");
out3=fopen("text3.txt","w");
int i,j,m,kolstrA,kolstrB;
char in[81];
char an[81];
char*pa[100];
char*pb[100];
char*pc[100];
char pk[80];
char a[100][80];
char b[100][80];
char c[200][80];
 
 
for (kolstrA=0;kolstrA<100;kolstrA++)
{if(fgets(in,81,out1)==NULL)
{break;};
in[80]='\0';
strncpy(a[kolstrA],in,80);};
fclose(out1);
for(kolstrB=0;kolstrB<100;kolstrB++)
{if(fgets(an,81,out2)==NULL)
{break;};
an[80]='\0';
strncpy(b[kolstrB],an,80);};
fclose(out2);
 
for(i=0;i<=kolstrA;i++)
{pa[i]=a[i];};
for(j=0;j<=kolstrB;j++)
{pb[j]=b[j];};
for(m=0;m<=(kolstrA+kolstrB);m++)
{pc[m]=c[m];};
i=0;
j=0;
m=0;
for(i=0;i<=kolstrA-2;i++)
for(j=i+1;j<=kolstrA-1;j++)
{if(strcmp(pa[i],pa[j])<0)
{strcpy(pk,pa[i]);
strcpy(pa[i],pa[j]);
strcpy(pa[j],pk);};};
for(i=0;i<=kolstrB-2;i++)
for(j=i+1;j<=kolstrB-1;j++)
{if(strcmp(pb[i],pb[j])<0)
{strcpy(pk,pb[i]);
strcpy(pb[i],pb[j]);
strcpy(pb[j],pk);};};
do
{if(strcmp(pa[i],pb[j])<0)
{strcpy(pc[m],pa[i]);
i=i+1;
m=m+1;}
else
{strcpy(pc[m],pb[j]);
j=j+1;
m=m+1;};}
while(i<kolstrA||j<kolstrB);
while(j<=kolstrB)
{strcpy(pc[m],pb[j]);
j=j+1;
m=m+1;};
while(i<=kolstrA)
{strcpy(pc[m],pa[i]);
i=i+1;
m=m+1;};
cout<<"rezultat"<<"\n";
for(m=0;m<(kolstrA+kolstrB);m++)
{printf("%s\n",pc[m]);};
return;
}
выводится 20 строк символов, не соответствующих действительности.

возможно, я что-то опять не поняла.
htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
02.12.2010, 01:08     ошибка преобразования char #13
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
#include<iostream>
#include<string.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef char *pChar;
typedef char **ppChar;
 
FILE*out1,*out2,*out3;
void main()
{
    out1=fopen("text1.txt","r");
    out2=fopen("text2.txt","r");
    out3=fopen("text3.txt","w");
 
    int i,j,m,n,kolstrA,kolstrB;
 
    char in[80];
    char an[80];
 
    char*pa[100];
    char*pb[100];
    char*pc[100];
    char*pk[100];
 
    char a[100][80];
    char b[100][80];
    char c[200][80];
 
 
for (kolstrA=0;kolstrA<100;kolstrA++)
{
    if(fgets(in,80,out1)==NULL)
    {
         break;
    };
     in[80]='\0';
     strncpy(a[kolstrA],in,80);
};
     fclose(out1);
 
for(kolstrB=0;kolstrB<100;kolstrB++)
{
   if(fgets(an,80,out2)==NULL)
   {
         break;
   };
    an[80]='\0';
    strncpy(b[kolstrB],an,80);
};
    fclose(out2);
 
for(i=0;i<=kolstrA;i++)
{
     pa[i]=a[i];
};
 
for(j=0;j<=kolstrB;j++)
{
     pb[j]=b[j];
};
 
for(m=0;m<=(kolstrA+kolstrB);m++)
{
     pc[m]=c[m];
};
     i=0;
     j=0;
     m=0;
for(i=0;i<=kolstrA-2;i++)
     for(j=i+1;j<=kolstrA-1;j++)
     {
          if(strcmp(pa[i],pa[j])<0)
          {
                strcpy(pk,pa[i]);
                strcpy(pa[i],pa[j]);
                strcpy(pa[j],pk);
          };
     };
 
for(i=0;i<=kolstrB-2;i++)
     for(j=i+1;j<=kolstrB-1;j++)
     {
           if(strcmp(pb[i],pb[j])<0)
           {
                strcpy(pk,pb[i]);
                strcpy(pb[i],pb[j]);
                strcpy(pb[j],pk);
           };
     };
 
do
{
     if(strcmp(pa[i],pb[j])<0)
     {
           pc[m]=pa[i];
           i=i+1;
           m=m+1;
     }
     else
     {
           pc[m]=pb[j];
           j=j+1;
           m=m+1;
      };
}while(i<kolstrA || j<kolstrB);
 
while(j<=kolstrB)
{
    pc[m]=pb[j];
    j=j+1;
    m=m+1;
};
 
while(i<=kolstrA)
{
     pc[m]=pa[i];
     i=i+1;
     m=m+1;
};
 
cout << "rezultat" << "\n";
for(m=0; m<(kolstrA+kolstrB); m++)
{
      printf("%s\n",pc[m]);
};
return;
}
Старался

Добавлено через 4 минуты
Выложи свои текстовые файлы
student101
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 17
02.12.2010, 01:25  [ТС]     ошибка преобразования char #14
да это скорее набор букв, чем тексты.
Вложения
Тип файла: txt text1.txt (28 байт, 11 просмотров)
Тип файла: txt text2.txt (28 байт, 13 просмотров)
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.12.2010, 02:17     ошибка преобразования char #15
C++
1
2
3
4
5
    if(strcmp(pa[i], pa[j]) < 0) {
        strcpy(pk, pa[i]);
        strcpy(pa[i], pa[j]);
        strcpy(pa[j], pk);
    }
здесь возникает ошибка из-за того, что pk должна быть строкой, а она определена как массив указателей

почему бы просто не обменять указатели ? зачем копировать строки, меняя их местами ?
C++
1
2
3
4
5
    if(strcmp(pa[i], pa[j]) < 0) {
        char *p = pa[i];
        pa[i] = pa[j];
        pa[j] = p;
    }
Добавлено через 5 минут
точку с запятой нужно ставить только после цикла do ... while ();
после циклов for {}, while() {} и после условий if {} точку с запятой ставить не нужно
student101
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 17
02.12.2010, 02:43  [ТС]     ошибка преобразования char #16
А для массива с[m] как тогда сделать? там ведь слияние
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.12.2010, 02:58     ошибка преобразования char #17
а, ну ясно, оставляй через strcpy(), раз между массивами перемещаешь
а в чём смысл тогда вообще создания массивов указателей ?

C
1
if (strcmp(pa[i],pa[j]) < 0)
C
1
if (strcmp(a[i], a[j]) < 0)
student101
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 17
02.12.2010, 03:04  [ТС]     ошибка преобразования char #18
Задание требует указателей. Только что с strcpy, что без нее строки не выводятся. Уже все перепробовала, даже не знаю, что еще сделать
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.12.2010, 04:57     ошибка преобразования char #19
Цитата Сообщение от student101
выводится 20 строк символов, не соответствующих действительности.
у тебя там много ошибок, я имею в виду версию с отступами, которую запостил сюда htonasral

неправильные границы циклов
неправильное использование strncpy()
цикл do ... while() что делает ?

логическая ошибка
массив содержит только 100 указателей, а вывод в конце устанавливает границу kolstrA + kolstrB, в массивах a и b может быть по 100 строк в каждом, следовательно граница получается до 200
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2010, 21:06     ошибка преобразования char
Еще ссылки по теме:

C++ ошибка в программе (cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*')
Ошибка "error C2446: :: нет преобразования "int" в "char *" C++
Преобразования массива с типа int к типу char C++

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

Или воспользуйтесь поиском по форуму:
student101
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 17
02.12.2010, 21:06  [ТС]     ошибка преобразования char #20
Цикл do while у меня должен выполнять слияние массивов в один. Потом в случае, если один массив закончится, еще два while для каждого массива.
А где неправильные границы циклов? подскажите, пожалуйста, я не понимаю...
Yandex
Объявления
02.12.2010, 21:06     ошибка преобразования char
Ответ Создать тему
Опции темы

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