• Компиляция c++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    получается mainx узнает о том что есть функция printx() на этапе линковки [mainx.o] и [printx.o]?

    Да.

    Каким образом происходит передача информации в [mainx] что функция printx() существует?

    Это работа линковщика связывать ссылки на неопределённые символы с определениями этих символов.
    В main.o в месте вызова printx ставится команда вызова, в секции символов заводится неопределённый символ printx а в секции релокаций заводится запись, связывающая команду вызова с символом:

    objdump -dr mainx.o
    ...
    0000000000000000 <main>:
       0:   55                      push   %rbp
    ...
      3a:   89 c7                   mov    %eax,%edi
      3c:   e8 00 00 00 00          callq  41 <main+0x41>
                            3d: R_X86_64_PLT32      _Z6printxi-0x4
      41:   b8 00 00 00 00          mov    $0x0,%eax
      46:   c9                      leaveq 
      47:   c3                      retq   
    ...


    readelf -a mainx.o
    ...
    Relocation section '.rela.text' at offset 0x580 contains 12 entries:
      Offset          Info           Type           Sym. Value    Sym. Name + Addend
    ...
    00000000003d  001400000004 R_X86_64_PLT32    0000000000000000 _Z6printxi - 4
    ...
    
    Symbol table '.symtab' contains 25 entries:
       Num:    Value          Size Type    Bind   Vis      Ndx Name
    ...
        20: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND _Z6printxi
    ...


    В printx.o в секции символов заводится символ, ассоциированный с адресом в коде, где определена функция printx:

    readelf -a printx.cpp
    ...
    Symbol table '.symtab' contains 24 entries:
       Num:    Value          Size Type    Bind   Vis      Ndx Name
    ...
        14: 0000000000000000    75 FUNC    GLOBAL DEFAULT    1 _Z6printxi
    ...

    Здесь value == 0 -- потому что printx оказалась по адресу 0 в секции .text.

    Линковщик объединяет входные секции согласно скрипту линковки, после чего вставляет конечные адреса символов в места, которые ссылаются на них.
    Ответ написан
    Комментировать
  • Как найти мин и мах?

    @BlvckManeM
    Немножко понимающий Java
    import java.util.Arrays;
    
    public class Test {
        public static void main(String[] args){
            int[] tab = {12, 1, 21, 8};
            int min = Arrays.stream(tab).min().getAsInt();
            int max = Arrays.stream(tab).max().getAsInt();
            System.out.println("Min = " + min);
            System.out.println("Max = " + max)
        }
    
    }


    Вы можете просто использовать новый Java 8 Stream s, но вам нужно работать с int.

    Stream метод класса Arrays дает вам IntStream, на котором вы можете использовать min. Вы также можете сделать max, sum, average,...

    Метод getAsInt используется для получения значения из OptionalInt
    Ответ написан
    1 комментарий
  • Вопрос по синтаксису Qt?

    axifive
    @axifive
    Software Engineer
    QLabel *label = new QLabel("Привет");
    Указателю присвается адресс нового объекта типа QLabel c текстом - "Привет"

    SomeClass a это переменная типа SomeClass
    SomeClass *p указатель на переменную типа SomeClass
    Ответ написан
    Комментировать
  • В чем ошибка выскакивает на компиляции?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    непонятная ошибка

    Что непонятного-то? Вроде отчётливо видно, что ReadFromFile использует CreateList, но функция CreateList (с таким прототипом, как в ReadFile) не определена. И ошибка не компиляции а линковки.
    Ответ написан
    Комментировать
  • Куда поступать на программиста в Новосибирске после 9 или лучше после 11?

    kawabanga
    @kawabanga
    Есть неплохой шанс потерять мотивацию после 9го класса. Поэтому я все таки рекомендую закончить 11 класс.
    В 9 классе вы еще молоды, и многие ваши действия я бы отдал под контроль родителей. Опять же, колледж будет перенасыщен людьми, которые просто не смогли пойти в 10 класс. А это очень опасное окружение, которое может негативно сыграть на ваше будущее.

    А вот в 10-11 классе вы можете пойти в школы подготовки, вроде как они есть у нас тут в НСК. И уже к концу 11 класса будете иметь представление о том, куда вы планируете развиваться.

    Английский учите. Без вариантов. Впрочем, за 2 года вызубрить ЕГЭ - не думаю что это проблема.
    Ответ написан
    5 комментариев
  • Где в коде ошибка?

    zagayevskiy
    @zagayevskiy
    Android developer at Yandex
    static убирать не следует, смысл этого B подсчитать , сколько экземпляров класса А создано(static значит, что из всех мест программы виден один и тот же объект в этой переменной).
    С этой точки зрения доступ к статистической переменной через указатель на экземпляр класса это не совсем верно( a->storage.counter). Я бы ожидал видеть A::storage.counter.

    delete [] в деструктор к АА, тут ты верно заметил. Нужно использовать именно эту форму delete, т.к. память выделена под массив (new int[10]). В остальных местах выделен 1 объект, поэтому надо delete без [].

    Но, для того, чтобы деструктор АА вызывался при удалении указателя на А(auto a = new A; выведет тип A*), когда по этому указателю лежит объект класса АА, нужно объявить деструктор virtual ~А(а вовсе не virtual ~AA). При этом объявление виртуальным деструктоа АА само по себе ошибкой не будет.

    someValue++ в конструкторе АА достаточно бессмысленно, т.к. это поле класса А, которое просто инициализированно нулём. В результате во всех экземплярах АА там будет 1. Непонятно, чего пытались добиться.

    Вместо printf в С++ следует использовать operator<<, но не думаю, что придурок, составлявший такой тест, особо думал об этом.

    Больше ничего не заметил.
    Ответ написан
    Комментировать
  • Как добавить путь LD_LIBRARY_PATH в коде с++?

    @none7
    Ваша программа, это не sh скрипт. И пара строк:
    std::system("export myvar=1");
    std::system("echo $myvar");

    неожиданно выведут пустую строку. Нужно либо устанавливать переменную в том же вызове system(env LD_LIBRARY_PATH=${LD_LIBRARY_PATH} path/to/app) или ручками менять переменные своей программы(getenv/setenv).
    Ответ написан
    Комментировать
  • Почему if в массиве работает не так как нужно?

    @Wexter
    if(a[i]=b[i])

    Вы либо присваивайте, либо сравнивайте
    Ответ написан
    3 комментария
  • Как задать значение данным в структуре на Си?

    Vagrant0610
    @Vagrant0610
    PHP разработчик
    Возможно здесь есть решение: https://learnc.info/c/structures.html
    #include<stdio.h>
    
    struct tableI  
    {
        char *name[4];
        float doctor[16];
        float bunk[16];
    } tableI;
    
    int main()
    {
        struct tableI a;
        a.name[0] = "РСФСР";
        a.name[1] = "Украина";
        a.name[2] = "Латвия";
        a.name[3] = "Эстония";
        // и т.д. ...
        printf("%s|%s|%s|%s", a.name[0],a.name[1],a.name[2],a.name[3]);
    }
    Ответ написан
    2 комментария
  • Компиляция C++ из C++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как на C++ скомпилировать файл main2.cpp и выполнить его?

    #include <stdlib.h>
    int main()
    {
        if (system("g++ main2.cpp -o main2") == 0)
            system("./main2");
    }
    Ответ написан
    Комментировать
  • Как развиваться дальше и где черпать идеи/задачи?

    @Wentixon
    Твоя проблема на самом деле в том, что видя трудности впереди ты бежишь от них и сразу же берешься за новое дело. Ты начал делать проект, так где он? Ты доделал его или все же получилось не то, что ты хотел сделать? Теперь ты изучаешь плюсы, не понимая зачем они тебе нужны? Это ли не безумие? Может тебе стоит попробовать что то другое? Например, вагоны поразгружать или кассиром поработать, как вариант. Короче не хочется много писать, просто возьми что то одно и доводи это до ума. То есть одна технология, один проект, который ты будешь постоянно развивать. Неважно что это будет, просто бей ниже мочи в жижу! Иначе далеко ты не уедешь, чтобы ты не изучал, будут появляться сложности, но если не будешь их преодолевать никогда не выйдешь на новый уровень. Я тоже в свое время метался, изучая и веб и андроид и игры и все короче.. Но потом понял, что я полный нуль и все знаю поверхностно, так что главное тупо идти в одном направлении и становится профи в чем то одном!
    Ответ написан
    9 комментариев
  • Как развиваться дальше и где черпать идеи/задачи?

    @res2001
    Developer, ex-admin
    Идите либо работать с тем, что умеете, там вам дадут задачи, либо учиться в универ, если еще там не были, там то же чем-нибудь нагрузят мозг.

    PS: на плюсах можно выполнять практически все прикладные задачи, гораздо больше, чем на питоне или java. Но часто трудозатраты будут выше, чем с использованием специализированных языков.
    С/С++ обычно используются там где нужна скорость, недостижимая на других ЯП, или для работы с оборудованием на низком уровне.
    Ответ написан
    Комментировать
  • Битовое представление чисел в c++?

    0xD34F
    @0xD34F
    Делаете две битовые маски - все единицы для младших разрядов (до вырезаемого бита), все единицы для старших (после вырезаемого бита). Применяете обе маски к числу, смещаете старшие разряды на единицу вправо, объединяете получившиеся числа:

    int value = // ваше число, чему-то там равно, вам виднее
    
    int bit = // номер вырезаемого бита, тоже вам виднее
    
    int maskLower = 0;
    for (int i = 0; i < bit - 1; i++) {
      maskLower |= 1 << i;
    }
    int maskUpper = ~maskLower;
    
    value = ((value >> 1) & maskUpper) | (value & maskLower);


    UPD. Цикл для создания маски конечно лишний, как справедливо заметил в комментариях res2001.
    Ответ написан
    2 комментария
  • Как правильно сделать разбиение строки по пробелам и добавление в массив?

    Nipheris
    @Nipheris Куратор тега C++
    Ну если вам прямо по пробелу, и если действительно на C++, то вот:
    #include <iostream>
    #include <sstream>
    #include <vector>
    
    int main()
    {
    	std::istringstream input{ "foo bar baz qux" };
    	std::vector<std::string> result;
    
    	// extract substrings one-by-one
    	while (!input.eof()) {
    		std::string substring;
    		input >> substring;
    		result.push_back(substring);
    	}
    
    	// print all the extracted substrings
    	for (const std::string& substring : result) {
    		std::cout << substring << std::endl;
    	}
    }


    А вообще тут столько вариантов, что и не сосчитать (есть даже более короткий вариант с использованием std::copy).
    Ответ написан
    2 комментария