С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
1

Однонаправленные списки. [Error] incompatible types in assignment of 'char*' to 'char [128]'

25.04.2019, 23:36. Показов 5513. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Начал учить однонаправленные списки, но столкнулся с проблемой: [Error] incompatible types in assignment of 'char*' to 'char [128]'. Вродь все очевидно, а как от этого избавится не знаю. Помогите пожалуйста.
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
struct element                      
{
    char x[128];                             
    element *Next;                     
};
 
class List                          
{
    element *Head;                     
    public:
    List() {Head = NULL;}             
    ~List();                           
    void Add(char x[128]);                   
    void Show();                       
};
 
List::~List()                      
{
    while (Head != NULL)            
     {
        element *temp = Head->Next; 
        delete Head;                
        Head = temp;                
     }
}
 
void List::Add(char x[128])               
{
    element *temp = new element;       
    temp->x = x;                        
    temp->Next = Head;
    Head = temp;           
}
 
void List::Show()
{
    char  x[128];
    element *temp = Head;
    while( temp!=NULL )
    {
        temp = temp -> Next;
        FILE *fp;
        if ((fp = fopen("a.txt", "r")) == NULL)
        {  
            printf("cat: can't open file %s\n");
        } 
        while(!feof (fp))
        {                 
            if(fgets (x,126,fp)) ;
            printf("%s",x);
        }
        fclose(fp);
    }
      
}
 
int main()
{          
    char x[128];              
    List lst; 
    lst.Add(x);                    
    lst.Show();                     
    return 0;
}
Не судите строго, я код писал не с нуля, а брал основу с этого сайта http://ci-plus-plus-snachala.ru/?p=57, так как мне пока нужно понять саму суть одномерных списков, и почему вывод идет в обратном порядке( это из-за того, что это не очередь, а стек?)
Еще вопросик, как это реализовать без классов и будет ли это более оптимально?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2019, 23:36
Ответы с готовыми решениями:

Ошибка в работе с файлами: error: incompatible types in assignment of ‘char*’ to ‘char* [255]’
Суть задания Есть файл допустим 1.txt нужно выполнить обработку этого файла а результат вывести в...

Error: incompatible types in assignment of 'const char [5]' to 'char [10]'
Код: #include <iostream> #include <fstream> using namespace std; const int m = 10; class...

Error Incompatible types: Char and String
procedure TForm2.btn1Click(Sender: TObject); var otstyp,i,k,number:Integer; s,probel:string;...

Ошибка [Error] Unit1.pas(165): Incompatible types: 'WideString' and 'Char'
procedure TForm1.GetDrives; var Driv:char; begin SetLength(Drives,0); for Driv:='A' to 'Z' do...

10
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,520
Записей в блоге: 1
26.04.2019, 04:03 2
Цитата Сообщение от Vlast001 Посмотреть сообщение
temp->x = x;
нельзя так массивы копировать. Это же не единичные значения, а массивы. Тут нужно циклом пройтись и скопировать каждый из 128 char'ов
0
Злостный нарушитель
9599 / 5192 / 1185
Регистрация: 12.03.2015
Сообщений: 24,513
26.04.2019, 08:54 3
Цитата Сообщение от Vlast001 Посмотреть сообщение
C++
1
2
3
4
5
struct element                      
{
    char x[128];                             
    element *Next;                     
};
Вообще, ИМХО, если уж юзаешь дин. списки, то используй динамическое выделение памяти на всю катушку. Особенно если это список строк в общем случае переменной длины.
Шоб никаких char x[128]. От этого и каша в голове. Используй только указатели.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class element                      
{
    char* x;                             
    element* Next;                     
    char* setx(char* src); // <---- метод
};
 
//-----------------
void List::Add(char* x)               
{
  element *temp = new element;
  temp->setx(x); // <----- метод, где происходит выделение памяти и копирование
  
  temp->Next = Head;
  Head = temp;           
}
Цитата Сообщение от Vlast001 Посмотреть сообщение
Еще вопросик, как это реализовать без классов и будет ли это более оптимально?
Классы и вообще ООП придумали умные бородатые дядьки для удобства и ускорения. ИМХО, если есть возможность, юзай классы.
0
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,520
Записей в блоге: 1
26.04.2019, 09:30 4
Цитата Сообщение от Verevkin Посмотреть сообщение
Вообще, ИМХО, если уж юзаешь дин. списки, то используй динамическое выделение памяти на всю катушку. Особенно если это список строк в общем случае переменной длины.
Шоб никаких char x[128]. От этого и каша в голове. Используй только указатели.
Ну, раз уж пошёл такой разговор, то ИМХО изучать списки надо на более простых, целочисленных данных, чтобы никакой ручной менеджмент строк не отвлекал от задачи ручного менеджмента самого списка. Никакихх указателей кроме непосредственно изучаемх списков! Зачем возводить число ошибок в квадрат, имея в наличии: указателей на списки * указатели на строки - и те и другие очень легко поломать!
0
Злостный нарушитель
9599 / 5192 / 1185
Регистрация: 12.03.2015
Сообщений: 24,513
26.04.2019, 09:38 5
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Ну, раз уж пошёл такой разговор, то ИМХО изучать списки надо на более простых, целочисленных данных
Согласен.
--------
100500 лет назад передо мной была посталена задача реализовать поддержку ini-файлов. Под чистый DOS. Компайлер - MSQC - аццкий привет из 80-х. Про ООП тогда никто и не слышал.
Вот с помощью таких списков я его и запилил. Хошь исходник покажу?
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
26.04.2019, 10:38  [ТС] 6
Ты изменил только
Цитата Сообщение от Verevkin Посмотреть сообщение
class element * * * * * * * * * * *
{
* * char* x; * * * * * * * * * * * * * *
* * element* Next; * * * * * * * * * *
* * char* setx(char* src); // <---- метод
};
//-----------------
void List::Add(char* x) * * * * * * *
{
* element *temp = new element;
* temp->setx(x); // <----- метод, где происходит выделение памяти и копирование
temp->Next = Head;
* Head = temp; * * * * *
}
и.. Оно заработало? У меня просто ошибка при компиляции ТутБылПуть:\ccpQt2h9.o qwe.cpp: (.text+0x78) : undefined reference to `element::setx(char*)'
ТутТожеБылПуть\collect2.exe [Error] ld returned 1 exit status

P.S. Можно, пожалуйста, ссылку на какой-то ресурс где очень подробно расписано про ООП на С++ , и огромной кучей примеров как и готовых, так и для дз)
Просто пока не дошел до однонаправленных списков с ООП не сталкивался, а теперь сразу две темы
0
Злостный нарушитель
9599 / 5192 / 1185
Регистрация: 12.03.2015
Сообщений: 24,513
26.04.2019, 10:46 7
Цитата Сообщение от Vlast001 Посмотреть сообщение
Ты изменил только... Оно заработало? У меня просто ошибка при компиляции
Перестань не глядя копипастить текст из браузера в код программы.
Это ж набросок самой идеи, а не реализация. Естественно, я ничего не компилил и не запускал. У меня и компьютера-то нету.
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
05.05.2019, 17:58  [ТС] 8
Не копипастить? А как тогда учится?! Больно много инфы я получаю с сайтов прочитав прототип функции, интересно как же мне может это помочь?! На то и коды выкладывают, что бы учиться у друг-друга, и, что бы новичкам можно было хоть как то разобраться в материале, который очень скудно преподносят в учебниках.
Вот, я написал код с нуля, с динамической памятью.
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
#include <iostream>
#include <cstring>
#include <malloc.h>
#include <conio.h>
using namespace std;
 
struct line                      
{
    int total;
    char * text;                             
    line * next;                     
};
void readXD(){
    line *x;
    cin >> x->total; // кол строк которые нужно прочитать с файла
    x->text = new char(x->total);
    line * temp;
    while( temp!=NULL )
    {
        temp = temp -> next;
        FILE *fp;
        if ((fp = fopen("a.txt", "r")) == NULL)
        {  
            printf("cat: can't open file %s\n");
        } 
        while(!feof (fp))
        {                 
            if(fgets (x->text,x->total-1,fp)) ;
            printf("%s",x);
        }
        fclose(fp);
    }
    delete [] x->text;
    
}
int main(){
    readXD();
    return 0;
}
Сначала я сделал через char *x[256] и приложение работало верно, но возвращало значение 3221225477. А на VS пишет ошибки типа не явное обращение к списку в функции readXD();.
Так вот,вернемся к версии с динамической памятью, на DEV C++ компилирует, но после ввода числа (x->total) приложение ничего не выводит...Просто возвращает значение 3221225477. На VS вообще не компилирует.( В основном пишет ошибки типа не явное обращение к списку в функции readXD();
0
Вездепух
Эксперт CЭксперт С++
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,878
05.05.2019, 18:03 9
Цитата Сообщение от Vlast001 Посмотреть сообщение
C++
1
x->text = new char(x->total);
И что здесь, по-вашему, делается?

Цитата Сообщение от Vlast001 Посмотреть сообщение
C++
1
2
line * temp;
while( temp!=NULL )
Проверка значения неинициализированной переменной?

Цитата Сообщение от Vlast001 Посмотреть сообщение
C++
1
while(!feof (fp))
При считывании из файла последний элемент читается дважды
0
Злостный нарушитель
9599 / 5192 / 1185
Регистрация: 12.03.2015
Сообщений: 24,513
05.05.2019, 18:39 10
Цитата Сообщение от Vlast001 Посмотреть сообщение
Не копипастить? А как тогда учится?!
Я сказал
Цитата Сообщение от Verevkin Посмотреть сообщение
не глядя копипастить
Как сказала одна кинозвезда Саша Грей: "Работать надо не 8 часов в день, а головой."
Когда ты начнёшь писать код от меньшего к большему и пользоваться отладчиком, ты станешь отвечать на вопросы на форуме, а не задавать их.
0
31 / 15 / 7
Регистрация: 08.01.2019
Сообщений: 636
06.05.2019, 09:08  [ТС] 11
Вот, заработало!... Только из файла на экран не выводит инфу
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
#include <iostream>
#include <cstring>
#include <malloc.h>
#include <conio.h>
using namespace std;
 
struct line                      
{
    int total;
    char * text;                             
    line * next;                     
};
void readingFl(){
    line * first = 0; //pointer for beging of list
    line *p;
    p = first;
    while(p){ //check list and cout it
    
        FILE * fp;
        if( (fp = fopen("a.txt","r")) == NULL){
            printf("cat: can't open file \n");
        }
        while( !feof(fp) ){
            
            char *str;
            p = new line;
            p->text = str;
            //cin >> p->total;
            if( fgets( str,255/*p->total*/,fp) ){
                printf("%s",str); 
                p = p -> next;
                delete [] p;
            }
        }
        fclose(fp);
    }
}
int main(){
    readingFl();
    return 0;
}
Я делал и так
C++
1
2
3
4
5
6
7
while( !feof(fp) ){
                cin >> p->total;
            if( fgets( p->text,p->total,fp) ){ // или if( fgets( p->text,255,fp)
                      printf("%s",p->text); 
              p = p -> next;
            }
        }
Я так понимаю, это из-за того, что оно не видит содержимого файла? Подскажи, пожалуйста, как сделать чтоб корректно инфа читалась

Добавлено через 25 минут
Не понимаю как завести динамический массив, что бы он работал правильно, для первого аргумента функции fgets (
0
06.05.2019, 09:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2019, 09:08
Помогаю со студенческими работами здесь

[Pascal Error] Unit1.pas(50): E2010 Incompatible types: 'Char' and 'TCaption'
описать логическую функцию ХОДФЕРЗЯ (n1,n2), которая проверяет, может ли ферзь за один ход переидти...

Incompatible types char and char*
Привет. В процессе ознакомления с языком Си и в частности со структурами, на моем пути встретилась...

Incompatible types: 'Char' and 'String'
эта -функция для перевода из 2-ичной системы в 8-миричную. так на 20 стоке вылетает с данной ...

Incompatible types: 'Char' and 'string'
str2 := LowerCase(str) Выдает: Incompatible types: 'Char' and 'string' При обертке правой части в...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru