1

Тема: Класи

Добрий день. Щойно почав вивчати C++ на ubuntu.

#include <stdio.h>
typedef int i;
class string
{
    public:
    char* str;
    int len;
        char* tstr;
        char* ttstr;
        int init(int n, char* st)
    {
        if(n>0) {
                len=n;
                str=new char[len];
                }
        else return -1;
        
                for (i a; a<n; a++) str[a]=st[a];
        return 0;
    }
    
};
class pstr
{
    public:
        int print(string* str)
        {
            if(str.len>0) printf("%s", str.str);
                        else return -1;
            return 0;
        }
};
int main()
{
    string s;
    pstr p;
    s.init(n, "hello, world!");
    p.print(s);
    return 0;
}

Програма не компілюється командою

8887.cpp: In member function ‘int pstr::print(string*)’:
8887.cpp:28:11: error: request for member ‘len’ in ‘str’, which is of pointer type ‘string*’ (maybe you meant to use ‘->’ ?)
    if(str.len>0) printf("%s", str.str);
           ^
8887.cpp:28:35: error: request for member ‘str’ in ‘str’, which is of pointer type ‘string*’ (maybe you meant to use ‘->’ ?)
    if(str.len>0) printf("%s", str.str);
                                   ^
8887.cpp: In function ‘int main()’:
8887.cpp:37:8: error: ‘n’ was not declared in this scope
 s.init(n, "hello, world!");
        ^
8887.cpp:38:10: error: no matching function for call to ‘pstr::print(string&)’
 p.print(s);
          ^
8887.cpp:38:10: note: candidate is:
8887.cpp:26:7: note: int pstr::print(string*)
   int print(string* str)
       ^
8887.cpp:26:7: note:   no known conversion for argument 1 from ‘string’ to ‘string*’

2

Re: Класи

закінчуй, не твоє це

3

Re: Класи

Виправив

int print(string* str)

на

int print(string str)

та

s.init(n, "hello, world!");

на

s.init(13, "hello, world!");

Все одно не компілюється. Помилка

8887.cpp: In function ‘int main()’:
8887.cpp:37:27: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
 s.init(13, "hello, world!");
                           ^

4

Re: Класи

розпочни з першого рядка. шо не так?

5

Re: Класи

Mister.C написав:

Виправив
Все одно не компілюється. Помилка

8887.cpp: In function ‘int main()’:
8887.cpp:37:27: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
 s.init(13, "hello, world!");
                           ^

Стрічкові літерали (на кшталт "hello, world!") мають оброблятися як const char * - їх змінювати може бути погано. Тобто

int init(int n, const char* st)

Пане ur_naz, припиняйте вже коментувати роботу новачків. Це не ваше.

Подякували: Mister.C1

6

Re: Класи

Спочатку не компілювалось

g++ 8887.cpp

тоді відкрив help, виявляється треба -o задати:

g++ -o 8887 8887.cpp

Зкомпілювало, запускаю:

./8887
Segmentation fault (core dumped)

Що зараз не так?

7

Re: Класи

Є такий тип людей, що побачуть лайно і відразу намагаються його помацати, але дуже вередливі, бо одні сорти вони мацають залюбки, а інші ігнорують.

Прихований текст

Вибачаюсь, передивився подерв'янського, а в нього лайно по всій творчості граціозно розмазане.

Тож маємо дитину 1 шт. І маємо віталіка, який цю дитину затролив. І що робить програміст? замість того, щоб відкрити очі бідній дитині, колупається в тім, чого взагалі не повинно бути. Бо хто ж хоче по вусах від бубунти отримати. І саме тому воно депрекейтед. Бо з тих граблів можна ціле місто побудувати. і це лише квіточки...

Прихований текст

я не буду писати про аутизм, бо виявляється це образа, алкоголізм не образа, а аутизм образа... отакі подвіні стандарти... але якщо ти не спілкуєшся навіть з компілятором, то який вибачаюсь з тебе програміст?

8

Re: Класи

Що зараз не так?

оце якраз тобі бубунта по хвізіономії надавала

9

Re: Класи

Чому? Я загуглив помилку, у першому результаті
https://www.geeksforgeeks.org/core-dump … ult-c-cpp/
Я десь вийшов за межі пам'яті? Я сьогодні не уважний, не можу знайти де саме

10

Re: Класи

Спробував додати

#include <alloc.h> 

та змінив

str=new char[len];

на

str=malloc(len);

тепер

9.cpp:2:20: fatal error: alloc.h: No such file or directory
 #include <alloc.h> 
                    ^
compilation terminated.

Зараз спробую на wine/Dev-Cpp :(

11

Re: Класи

Не так, передусім, те, що ви почали вивчати класи, не розібравшися зі стандартним введенням-виведенням. Ви маєте значно складнішу структуру коду за те, чим можете поки що керувати.
А конкретно тут помилка в тому, що в C стрічки мають закінчуватися на нульовий символ, а ви використовуєте саме функцію з C (на що вам і натякав пан ur_naz).
Перевіримо:

    char s[] = "hello, world!"; //розмір s буде визначено компілятором
    std::cout<<sizeof(s);

https://ideone.com/0YiDpd
Як бачите, "hello, world!" містить 14 символів. 13 із них ви скопіювали до str - але останній, "невидимий" '\0', не був скопійований. А printf намагається виводити все поспіль, доки його не знайде. І дістається кінця сегменту пам'яті, що належить програмі - звідси Segmentation fault. У принципі, могло так статися, що той 14-й символ випадково буде нульовим, тоді б ви не помітили цієї помилки.

Подякували: Mister.C1

12

Re: Класи

malloc, Carl
https://static.mk.ru/upload/entities/2015/05/28/articles/detailPicture/b0/30/c7/818343149_4347189.jpg

13 Востаннє редагувалося ur_naz (02.12.2020 16:32:11)

Re: Класи

Базовий принцип с++ за 5 хвилин
увага, рос.
https://www.youtube.com/watch?v=6AYE8PO2uMU

14

Re: Класи

Тут працює:
https://ideone.com/aZQCLS
А в убунті залишається

Segmentation fault (core dumped)

15

Re: Класи

ur_naz нарешті дістає бан на 3 дні за порушення П.1.1 Правил.
Шкода, що флейм не заборонений.

16

Re: Класи

for (i a; a<n; a++) str[a]=st[a];

Взагалі дуже погана практика перейменовувати без потреби типи, і ще гірша - давати їм однолітерні імена. Але яке початкове значення змінної a цьому коді?

Подякували: Mister.C1

17

Re: Класи

Дякую, поставив a=0 і нарешті зпрацювало! :) Чомусь сьогодні неуважний