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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
student101
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 17
#1

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

01.12.2010, 04:28. Просмотров 1746. Ответов 24
Метки нет (Все метки)

помогите найти ошибку(или исправить):
#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, приведение в стиле С или приведение в стиле функции
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.12.2010, 04:28     ошибка преобразования char
Посмотрите здесь:

Преобразования с char в string - C++
Помогите исправить и переделать чтобы использовать с string а не с char.Очень прошу:wall::help: #include &lt;iostream&gt; #include...

Преобразования char в double - C++
Здравствуйте, я использую visual studio 15 и при компиляции следующего кода выводиться ошибка преобразования: #include &quot;stdafx.h&quot; ...

функция для преобразования __time64_t в char * - C++
Добрый день! Нужна в\у функция а еще лучше пример с ней. Задача примерно выглядит так: дана структура __finddata64_t a; из &lt;io.h ...

Преобразования массива с типа int к типу char - C++
Помогите решить задачу. Требуется создать шаблон класса для преобразования массива с типа int к типу char, помогите кто чем сможет буду...

Ошибка: "invalid conversion from char* to char" - C++
Граждане,товарищи изучаю C++ и зациклился на проблеме,мне надо подсчитать количество букв в массиве введённом с клавиатуры#include...

Ошибка преобразования - C++
Вот мой код. В общем в конце выбивает &quot;error C2664: kasat: невозможно преобразовать параметр 5 из &quot;double (__cdecl *)(double,double)&quot;...

Ошибка преобразования типов - C++
В чем именно я ошибся,если код ошибки #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include &lt;string&gt; #include &lt;ctype.h&gt; using...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
student101
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 17
02.12.2010, 02:43  [ТС]     ошибка преобразования char #16
А для массива с[m] как тогда сделать? там ведь слияние
accept
4821 / 3241 / 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
4821 / 3241 / 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
student101
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 17
02.12.2010, 21:06  [ТС]     ошибка преобразования char #20
Цикл do while у меня должен выполнять слияние массивов в один. Потом в случае, если один массив закончится, еще два while для каждого массива.
А где неправильные границы циклов? подскажите, пожалуйста, я не понимаю...
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
02.12.2010, 23:09     ошибка преобразования char #21
там этот do ... while() начинается, а i и j не инициализируются нулями, то есть они остались с предыдущего цикла
внутри цикла условие такое, что когда один из массивов закончится, то значения из него будут продолжать сравниваться, соответственно, если условие сработает, будет выход за край

Цитата Сообщение от student101
А где неправильные границы циклов?
C
1
for(kolstrB=0;kolstrB<100;kolstrB++)
правильно

C
1
for(i=0;i<=kolstrA;i++)
неправильно

C
1
for(m=0;m<=(kolstrA+kolstrB);m++)
неправильно

C
1
for(i=0;i<=kolstrB-2;i++)
вот эффект, здесь условие правильное, но оно неправильно записано

C
1
for (i = 0; i < kolstrB - 1; i++)
вот так оно должно выглядеть

C
1
for (i = 0; i + 1 < kolstrB; i++)
или так

C
1
2
    while (j <= kolstrB) {
        pc[m] = pb[j];
вот ошибка, идёт обращение к pb[j] элементу, такого нет, когда j == kolstrB

отступы очень важны, это не просто так делают
student101
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 17
05.12.2010, 02:31  [ТС]     ошибка преобразования char #22
Спасибо, уже лучше, частично заработало(сортирует пузырьком оба файла). но вот слияние не хочет сделать...
в цикле do while вроде бы все долдно быть нормально, ибо аналогичная прога для массива чисел работает.
на данный момент:
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
#include<iostream>
#include<string.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
 
 
FILE*out1,*out2,*out3;
void main()
{out1=fopen("text1.txt","r");
out2=fopen("text2.txt","r");
int i,j,m,kolstrA,kolstrB;
char in[81];
char an[81];
char*pa[100];
char*pb[100];
char*pc[200];
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;
 
for(i=0;i<=kolstrA-2;i++)
  for(j=i+1;j<=kolstrA-1;j++)
 
 {if(strcmp(pa[i], pa[j]) < 0) {
        char *p = pa[i];
        pa[i] = pa[j];
        pa[j] = p;
};}
 
for(i=0;i<=kolstrB-2;i++)
  for(j=i+1;j<=kolstrB-1;j++)
   {if(strcmp(pb[i],pb[j])<0)
 {
        char *p = pb[i];
        pb[i] = pb[j];
        pb[j] = p;
};}
 
 i=0;j=0;m=0;
do
{if(strcmp(pa[i],pb[j])<0)
  {strcpy(pc[m],pa[i]);
  i=i+1;
  m=m+1;}
else
 if(strcmp(pa[i],pb[j])>0)
  {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;
  }
что не так?

Добавлено через 42 минуты
и если поменять, как вы сказали, здесь
C++
1
2
3
4
5
6
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];};
то сразу возникают ошибки указателей.
и пузырек с такими циклами работает.

если можно, подскажите, как исправть ошибку, а не только строчку, где она содержится.потому как не всегда понятно, что исправлять следует.
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.12.2010, 09:48     ошибка преобразования char #23
не должно быть различий в размерах массивов, либо везде 80, либо везде 81

C
1
2
3
4
if(fgets(in,81,out1)==NULL)
     {break;};
      in[80]='\0';
      strncpy(a[kolstrA],in,80);};
в a[] все строки имеют длину 80, in же имеет длину 81, это значит, что в a[][] можно записать только 79 символов и последний должен быть нуль-символ, а в in можно записать 80 символов и последний должен быть нуль-символ
в результате получается перекос, если в in попадёт 80 нормальных символов, то 81 делается нуль-символом in[80]='\0'; - это 81й символ

прикинь, в строку, где может быть 79 символов, копируется 80 символов, 80й попадает на место нуль-символа, это значит, что функцию сравнения нельзя применять к такой строке, потому что функция сравнения strcmp() для обеих строк концы определяет по нуль-символам в них

это значит, что при сравнении, если она дойдёт до конца массива, она выйдет за его пределы и будет дальше сравнивать, пока за его пределами не встретит байт со значением равным нулю

поэтому везде либо 80, либо 81, но не по-разному

C
1
for(i=0;i<=kolstrA;i++)
неправильно, нету там столько элементов

C
1
for(i = 0; i < kolstrA; i++)
если kolstrA == 100, то тело цикла выполнится сто раз

из этого же цикла pa[i], представь, если i == 100, это будет обращение к 101му элементу, в то время как char*pa[100]; содержит только сто элементов

C++
1
2
    for (i = 0; i < kolstrA - 1; i++)
        for (j = i + 1; j < kolstrA; j++)
такая сортировка работает неправильно, потому что у тебя логическая ошибка там
ты когда, например, прочитала три строки из файла, у тебя kolstrA равно не три, а два
а зачем тебе два, если у тебя три ?
поэтому тебе нужно либо fgets() перенести в условие цикла из тела, либо при выходе из цикла, когда файл закончился, наращивать kolstrA
student101
0 / 0 / 0
Регистрация: 24.11.2010
Сообщений: 17
05.12.2010, 16:53  [ТС]     ошибка преобразования char #24
размеры массивов я поменяла, как вы сказали. про обращение к 100му и 101 элементу-он два отдельных массива сортирует и с этим значениями. в файлах у меня сильно меньше, чем 100 строк.

видимо, в do-while или while где то ошибка, (до этого этапа ведь все работает)но я никак ее не найду.

Добавлено через 7 минут
Если быть точнее, то в каждом файле по 10 строк. для простоты. 100*80-просто максимум. Вряд ли при этом он до 100 дойдет...

Добавлено через 8 минут
И, как ни странно, отдельно взятым файлам с малым числом коротких строк все равно, 80 там или 81...ничего не меняется. Как сделать так, чтобы она хотя бы эти два коротких файла сливала? (Логические ошибки про ста строках не так важны, мне бы хоть что-то сдать)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2010, 22:54     ошибка преобразования char
Еще ссылки по теме:

Ошибка преобразования класса - C++
Добрый день! Уважаемые, помогите пожалуйста найти ошибку. #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include...

Ошибка преобразования типа - C++
Задача состояла в следующем: реализация алгоритма проверки n на простоту, используя малую теорему Ферма. В силу недостаточного опыта и...

Ошибка преобразования типа в классе - C++
Дан класс, который реализует длинную арифметику с положительными\отрицательными целыми числами. Все числа одинаковой длины и их макс....

Ошибка в функции преобразования Фурье - C++
Здравствуйте! Делаю гитарный тюнер, и застряла на моменте определения частоты уже снятого с микрофона звука. Звук с микрофона снимается в...

Ошибка в функции преобразования времени - C++
Как можно или нужно написать программу, которая, при вводе с клавиатуры, делает преобразования времени при помощи двух функций. Одна...


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

Или воспользуйтесь поиском по форуму:
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
05.12.2010, 22:54     ошибка преобразования char #25
Цитата Сообщение от accept
ты когда, например, прочитала три строки из файла, у тебя kolstrA равно не три, а два
а зачем тебе два, если у тебя три ?
поэтому тебе нужно либо fgets() перенести в условие цикла из тела, либо при выходе из цикла, когда файл закончился, наращивать kolstrA
это мне показалось, не обращай внимание
но сортировка всё равно должна выглядеть
C++
1
2
    for (i = 0; i < kolstrA - 1; i++)
        for (j = i + 1; j < kolstrA; j++)
важно, чтобы kolstrA было равно количеству строк, которые прочитаны в a[][]
для этого можно специально вывести kolstrA перед теми циклами, где оно задаёт границу

Цитата Сообщение от student101
Вряд ли при этом он до 100 дойдет...
я тебе показал, как такие циклы переделать, переделаешь
меньше, чем сто строк? а ты думаешь, если он прочитал десять строк, там не будет того же самого? будет, только обращаться он будет не к 101й строке, а к 11й, которой там нет

поменяешь всё на 80 и всё

C++
1
strcmp(pa[i],pb[j])<0
в цикле do ... while () идёт обращение к pa[kolstrA], если i выросло до kolstrA
а pa[kolstrA] элемента там нет, pb[kolstrB] элемента тоже нет
а если их там нет, зачем они сравниваются ?
а равные строки вообще не сохраняются

C++
1
while(i<kolstrA||j<kolstrB);
C++
1
while (i < kolstrA && j < kolstrB);
Yandex
Объявления
05.12.2010, 22:54     ошибка преобразования char
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru