카테고리

asm (27) bootloader_x86_grub (1) C (92) compile (11) config (76) CPP (13) CSS (1) debugging (7) gimp (1) Go (1) html (1) Java (1) JavaScript (1) kernel (19) LibreOffice (3) Linux system progamming (21) MFC (1) opencv (4) OpenGL (1) PHP (1) Python (4) qemu (29) shell (3) socket (7) troubleshooting (2) ubuntu18.04 (2) windows (1)

2018/12/05

CPP 문자열 처리

#include <iostream>

using namespace std;

int main() {
    cout <<"Starting program..." << flush; // 나머지 버퍼(메모리) 정리

cout << "This is some test." << endl;

cout << "Banana." << "Apple." << "Orange." << endl;
cout << "Banana." " " << "Apple." " " << "Orange." << endl;
cout << "Banana. " << "Apple. " << "Orange. " << endl;

cout << "This is more some test." << endl;

return 0;
}

OOP 다향성

다향성

다형성 = 하나 이상의 형식을 취하는 능력

(객체에는 두 가지 이상의 유형이 있다)
- 부모 인터페이스를 통해 클래스를 사용할 수 있다.
- 자식 클래스는 부모 클래스의 일부 동작을 재정의 할 수 있다.

다형성은 추상 동작을 정의하고 사용할 수 있게 해준다.
- 추상 동작은 기본 클래스의 인터페이스에서 정의되며 하위 클래스에서 구현된다.
- 추상 또는 가상으로 선언

단어 하나의 각기 다른 해석.

Example 1
int main(){
    Rectangle rect;
    Triangle trgl;
    Polygon * ppoly1 = &rect;
    Polygon * ppoly2 = &trgl;
    pply1->set_values (4,5);
    pply2->set_values (4,5);
    cout << rect.area() << '\n';
    cout << trgl.area() << '\n';
    return 0;
}

#include <iostream>
usnig namespace std;

class Polygon {
    protected:
        int width, height;
    public:
        void set_values (int a, int b)
            {width=a; height=b; }
};

class Rectangle: public Polygon {
    public:
        int area()
         {return width*height:}
};

class Triangle: public Polygon {
    public:
        int area()
         { return width*height/2; }
};

OOP 캡슐화

캡슐화

캡슐화는 구현 세부 상항을 숨긴다.
인터페이스는 멤버를 숨겨서는 안된다.

캡슐화 이점
- 구조적 변화가 지역적으로 유지되도록 보장한다.

클래스 내부를 변경해도 클래스 외부의 코드에는 영향을 주지 않는다.

변경 메소드의 구현은 사용하는 클라이언트를 반영하지 않습니다.
- 캡슐화를 통해 클라이언트 데이터에 접근 할 때 일부 논리를 추가 할 수 있다.
예: 속성 값 수정시 유효성 검사
- 구현 정보를 숨기면 복잡성이 줄어든다.

OOP 추상화

추상화

추상화는 일반화의 한 방법이다.
- 관련없는 기능, 속성 또는 기능을 무시하고 관련 기능을 강조한다.

추상화 = 복잡성 관리
- 단순화 된 모델에 대한 복잡한 현실을 표현할 수 있다.

인터페이스 추상화 제공
- 그것을 사용하는 방법 만 알면된다.
- 내부 구현을 알 필요 없다.

객체의 추상화는 필요로하는 것만을 유지한다.
- 물건을 보면서 의미있는 것을 본다.
- 추상화는 필요한 실재의 속성을 강조 표시하고 다른 실재를 숨 긴다.

Example 1
int main()
{
    Adder a;

    a.addnum(10);
    a.addNum(20);
    a.addNum(30);

    count << "Total " << a.getTotal() <<endl;
    return 0;
}



#include <iostream>
unsing namespace std;
class Adder{
public:
    // 생성자
    Adder(int i = 0){
        total = i;
    }

    //interface to outside world
    void addNum(int number){
        total += number;
    }

    //interface to outside world
    int getTotal(){
        return total;
    };

private:
    // hidden data from outside world
    int total;
};

OOP 계승

계승

하위 클래스는 상위 클래스의 특성을 상속한다.
- 속성(필드 및 속성)
- 운영(방법)

하위 클래스는 상위 클래스를 확장 할 수 있다.
- 새 필드 및 메소드 추가
- 메서드 재정의(기존 동작 수정)

상속에는 많은 이점이 있습니다.
- 확장 성
- 재사용 성
- 추상화 제공
- 중복 코드 제거

Base Class == Parent Class
Derived class == child class
동일한 표현이다.

파생 클래스의 이름 뒤에 기본 클래스의 이름을 지정한다.
public class shape
{...}

public class Circle(자식 프로세스 이름) : shape(부모 프로세스 이름)
{...}
부모 자식 관계 성립

파생 클래스의 생성자에서는 base라는 키워드를 사용하여 base 클래스의 생성자를 호출한다.
public Circle (int x, int y) : base(x)
{...}


Example 1
class Emplyee {
public:
    Employee(string theName, float thePayRate); // 함수 선언

    string getName();   // 함수 선언
    float getPayRate(); // 함수 선언

    float pay(float hoursWorked); //함수 선언

Protected: // 데이터 멤버 선언
string name;
float payRate;
};

Employee::Employee(string theName, float thePayRate) // 소속클래스::멤버 함수 정의 
{
    name = theName;
    payRate = thePayRate;
}

string Employee::getName() // 소속클래스::멤버 함수 정의
{
    return name;
}

float Employee::getPayRate() // 소속클래스::멤버 함수 정의 
{
    return payRate;
}



float Employee::pay(float hoursWorked) // 소속클래스::멤버 함수 정의
{
    return hoursWorked * payRate;




Example 2 (no reuse) 재 사용하지 않고 독립적으로 따로 만든 예제.
class Manager {
public:
    Manager(string theName, float thePayRate, bool isSalaried)

    string getName();
    float getPayRate();
    bool getSalaried();

    float pay(float hoursWorked);

Protected:
    string name;
    float payRate;
    bool salaried;
};

Manager::Manager(string theName, float thePayRate, bool isSalaried) {
    name = theName;
    payRate = thePayRate;
    salaried = isSalaried;
}

string Manager::getName(){
    return name;
}

float Manager::getPayRate()
{
    return payRate;
}

bool Manager::getSalaried()
{
   return salaried;
}


float Manager::pay(float hoursWorked)
{
    if (salaried)
        return payRate;
    /* else */
    return hoursWorked * payRate;
}


Example (with reuse) 재 사용 하는 예제, OOP의 언어를 최대한 사용한 예제.
class Employee {
public:
    Employee(string theName, float thePayRate);

    string getName();
    float getPayRate();

    float pay(float hoursWorked);

protected:
   string name;
   float payRate;
};


#include "employee.h"
class Manager : public Employee {
public:
    Manager(string theName, float thePayRate, bool isSalaried);

    bool getSalaried();
    float pay(float hoursWorked);

protected:
    bool salaried;
};

OOP의 기본 원칙

계승
- 부모 클래스의 멤버 상속

추상화
- 추상 동작 정의 및 실행

캡슐화
- 클래스의 내부 숨기기

다향성
- 부모 인터페이스를 통해 클래스에 접근

ubuntu 18.04 cdt eclipse Project create and Compile

프로젝트 생성.
File -> c/C++ Project -> C++ Managed Build
Projectname:Cpp01

선택
Project type:
HelloWorldC++ Project

Toolchains:
Linux GCC

Next 클릭
Author : Jang

Finish 버튼 클릭

Next 클릭
Configurations:
Debug
Release
체크

Finsh 클릭

Debug Compile
1. 프로젝트 빌드
Project -> Build Project 또는 Build All
단축키: Ctrl + B

1.1 C++ Managed Build 빌드 설정 위치
Window-> Preferences
C/C++ -> Build -> Environment

1.2 Makefile Project
Window-> Preferences
C/C++ -> Makefile Pages settings

2. 실행
Run -> Run
단축키 : Ctrl + F11

2.1 Launch failed. Binary not found.
바이너리 파일 경로 설정
Run -> Run Configurations
C/C++ Application

Project: Cpp01
C/C++Application:
Debug/Cpp01 ---> 경로 설정 Browse 클릭
Apply
Run

Console 창
!!!Hello World!!!

Release Compile
1. Project -> Build Configuration -> Set Active -> Release 선택
2. 프로젝트 빌드
Project -> Build Project 또는 Build All
단축키: Ctrl + B

3. Run -> Run
단축키 : Ctrl + F11

터미널 실행 방법
1. 소스 위치 확인 방법
화면 구성 왼쪽 창 마우수 좌표 이동
Cpp01 오른쪽 마우스 클릭 -> Properties 선택
Location: 프로젝트 경로 드래그 복사

2. 터미널 실행 ctrl + art + t
cd ~/eclipse-workspace/Cpp01/Debug
./Cpp01

cd ~/eclipse-workspace/Cpp01/Release
./Cpp01

Ubunt 18.04 cdt Eclipse Install

eclipse 설치
c++ 환경 구축시 cdt 패키징 설치

우분투 18.04
0. 설치 버전 확인
cat /etc/*release

1. Eclipse 설치
2. 현재 저장소 패키지 관련 없음. 2018 12 05

3. Eclipses CDT 설치
sudo apt install -y eclipse-cdt-*

4. Eclipse 다운로드
URL=https://www.eclipse.org/downloads/download.php
ECLIPSE=/oomph/epp/oxygen/R/eclipse-inst-linux64.tar.gz
MIRROR=1

wget -q -O eclipse-inst-linux64.tar.gz "${URL}?file=${ECLIPSE}&mirror_id=${MIRROR}"

tar zxf eclipse-inst-linux64.tar.gz

5. 프로그램 실행
./eclipse-installer/eclipse-inst

6. 팝업창 선택
Eclipse IDE for C / C ++ Developers

7. 설치
Install 버튼 클릭

8. 동의
Accept Now 버튼 클릭

9. 라이센스 수락
Accept

10. 패키지 선택
Select All

11. 설치 완료
LAUNCH

12. 설치 프로그램 제거
$ rm -rf eclipse-inst-linux64.tar.gz eclipse-installer

sudo sed -i /usr/share/applications/eclipse.desktop \
  -e "s;^Exec=eclipse;Exec=${HOME}/eclipse/cpp-oxygen/eclipse/eclipse;g"

13. 실행
./eclipse/cpp-oxygen/eclipse/eclipse

CPP

example 1
vi foo.cpp
#include <iostream>

using namespace std;

int main(int argc, *argv[]) {
    cout << "Hello World!";

    return 0;
}

example 2
vi foo1.cpp
#include <iostream>

using namespace std;

int main(int argc, *argv[]) {
    cout << "Hello World!" << endl;
    return 0;
}

example 3
#include <iostream> // usr/include/C++/버전/iostream 위치 확인. 

using namesapce std; // std::endl 사용정의 

int main(int argc, *argv[]) {
    cout << "Hello World!" << endl1;
    return 0
}

iostream using 검증 == iostream using 는 곳 C에서 iostream.h 유사한 형식을 가진다. 
vi /usr/include/c++/7/iostream
namespace std _GLIBCXX_VISIBILITY(default)

Compile 
g++ -o foo foo.c
g++ -o foo1 foo.c

일반적인 Nasm 파일 구성

Section .data
; 주석 표현

hello: db 'this is an example string', 10
HelloLenghth: equ 26

;db = 바이트 정의, dw = word 정의, dd = word 정의

Section .bss
;여기는 수정 가능한 변수를 선언
Variable1: resb 255
Variable2: resb 1
Variable3: resw 1

Section .text
;프로그램 코드로 이동

global _start ; 외부 프로그램 시작
_start:              ;프로그램이 실제로 시작
                          ;여기에서 코딩 시작

Example File
Section .data
hello:    db 'Hello world!',10
helloLen: equ 13

section .text
global _start
_start:
    mov eax, 4       ;리눅스 sys_write 호출
    mov ebx, 1       ;파일 기술자
                     
    mov ecx, hello   ;문자열 주소 넣기 
                     
    mov edx,helloLen ;hello 문자열 공간 크기 
    
    int 80h          ;리눅스 시스템 인터럽트 
                         
    mov eax, 1    ; sys_exit 호출
                     
    mov ebx,0    ;매개변수 0
    int 80h          ;리눅스 시스템 인터럽트 

Compile: 
nasm -f elf filename.asm
ld -s -o outputfilename filename.o


Wifi troubleshooting

LG Touch notebook wifi driver problem


ls pci
Network controller: Intel Corporation Wireless 7260 (rev bb)

modinfo iwlwifi | grep 7260
firmware:       iwlwifi-7260-17.ucode

cd /lib/firmware
sudo rm iwlwifi-7260-17.ucode
sudo wget https://github.com/OpenELEC/iwlwifi-firmware/raw/master/firmware/iwlwifi-7260-17.ucode
sudo modprobe -r iwlwifi
sudo modprobe iwlwifi
dmesg | grep iwl
reboot