четверг, 29 марта 2012 г.

Значение-ссылка-значение-указатель C++

Как распределена память компьютера? Как мы работаем с переменными? Что такое объект, зачем нам ссылки на него?
Все это вопиет с небес на землю
И ждет разбора.
И его найдет.


Все мы знаем, ЧТо такое ссылка на объект, и что такое сам объект. Когда мы только начинали нежно прикасаться к C++. Мы недоумевали разницы между "->"и ".". Почему иногда надо то а иногда то.
Это конечно от того что мы смело кинулись писать в Здоровилах типа RAD Studio Professional, VisualStudio Ultimate ,Qt4. Где можно начать писать буквально мышкой, и имея некие представления о синтаксисе, уча его по ходу чтения кучи namespase-ов классов, непонятных define-ов typedef-ов enum-ов tamplate-ов и прочих вкусностей C++. и не прочитав ни одной страницы книги по C++ мы уже писали более не менее сложные программки. По ходу дела учась и объектно-ориентированному, и клиент-серверному,осваивая синтаксис в процессе разгребания n-ной сотни error-ов компилятора.

В хороших традициях надо начинать с простых программ, консольных, небольших, на чистом ANSI C.Постепенно в него вкрапляя С++. Например с gcc и g++;

И вот хочу сейчас продемонстрировать Что такое объект, а что такое ссылка.

Для начала освоим такие операторы..
*,&

Что они делают?

Ну сначала вспомним, как мы создаём любой объект

class A{};
 
A*Obj = new A(); 

Да, и что мы получили?
*Obj - ссылка, определяющая начало той области памяти, где находиться объект.
Оператор * возвращает копию области памяти на которой находиться объект.

Оператор & возвращает ссылку на объект
то есть &Obj будет типа **A.


Давайте, посмотри пример в котором я постарался показать как изменяются значения, если использовать ссылки и сами объекты.

#include <string>
#include <iostream>
using namespace std;
 
 
#define BallLink The_Ball*
 
 
struct The_Ball{
 string Color;
};
 
 
 
void Paint_in_Pink(The_Ball* Ball){
Ball->Color = "Pink";
}
 
void Paint_in_Gray(The_Ball Ball){
Ball.Color = "Gray";
}
 
void Paint_in_Yellow(The_Ball& Ball){
Ball.Color = "Yelow";
}
 
int main() {
 The_Ball b1;
 b1.Color = "Red";
 BallLink b1Num = &b1;
 cout<<"b1 = "<<b1.Color<<"; Adress of b1 = "<<b1Num<<"; Value got by Adress = "<<b1Num->Color<<endl;
 b1.Color = " blue";
 cout<<"b1 ="<<b1.Color<<";Adress of b1 = "<<b1Num<<" ;Value got by Adress"<<b1Num->Color<<endl;
 The_Ball b2 = b1;
 b2.Color = "Red";
 
 cout<<"b1= "<<b1.Color<<";b2 = "<<b2.Color<<endl;
 BallLink b3Num = b1Num;
 The_Ball b3 = *b3Num;
 b1.Color = "Green";
 cout<<"b3 = "<<b3.Color<<"; Value got by adress b3Num thas the same as b1Num ="<<b3Num->Color<<endl;
 b1.Color = "Black";
 b2.Color = "Black";
 b3.Color = "Black";
 cout<<"Swich all to Black"<<endl;
 Paint_in_Pink(&b1);
 Paint_in_Gray(b2);
 Paint_in_Yellow(b3);
 cout<<"b1 = "<<b1.Color<<endl;
 cout<<"b2 = "<<b2.Color<<endl;
 cout<<"b3 = "<<b3.Color<<endl;
 
}
 

И вывод
b1 = Red; Adress of b1 = 0x7fffc1b84e70; Value got by Adress = Red
b1 = blue;Adress of b1 = 0x7fffc1b84e70 ;Value got by Adress blue
b1=  blue;b2 = Red
b3 =  blue; Value got by adress b3Num thas the same as b1Num =Green
Swich all to Black
b1 = Pink
b2 = Black
b3 = Yelow
 

Начнём.
Я объявил структуру The_Ball у которой есть поле color.
И определил макрос BallLink как указатель

В первых строках main я создаю Красный мячик и ссылку на него

Дальше по значению меняю цвет на синий. После изменений, ссылка тоже указывает на теперь синий мячик.
Потом я создаю второй мячик как КОПИЮ 1-го. И меняю его цвет на Красный. И получается что 1-й у меня остаётся Синим, а второй красным. Потом я создаю ещё одну ссылку b3Num которая указывает тот-же адрес что и ссылка на 1 мячик, и создаю объект по этой ссылке, И этот объект у меня получается копия 1-го мячика, но ссылка указывает на 1-й.И при изменении цвета 1-го мячика на Зелёный, ссылка b3Num указывает уже на Зелёный цвет, когда объект созданный по ссылке, указывает на Красный.
И вот время перекрасить все объекты в Чёрный для определения. Если бы я вывел все ссылки, вы бы убедились что они тоже все обязательно указывают на Чёрное.
И теперь время вызывать функции в первую функцию Я передаю указатель на переменную, которую функция окрасит в Розовый. Во вторую Я передаю саму переменную, и в третью адресс переменной.
И что мы вилим на выходе? когда передаём ссылку, всё краситься, когда передаём саму переменную, ничего не происходит, потому что по сути мы передали копию переменной. И когда передаём ардесс переменной всё тоже хорошо красится. Вот и вся магия.Это стоит запомнить, когда буем сообщать функциям переменные которые стоит менять и не стоит менять.

Читать дальше......

вторник, 20 марта 2012 г.

SIOCSIFFLAGS: Operation not possible due to RF-kill

Микро заметка, для себя. И если понадобиться для ещё кого.
Сегодня еду на олимпиаду. Нужет будет Вайфай. Вот тестю. Не работает
Если вы пользуетесь Wicd то нужно ручками вписать в консльку
sudo ifconfig wlan0 up
Сам Wicd делать этого не умеет. Ну или я не знаю что он умеет.
Если у вас вываливаеться ошибка
SIOCSIFFLAGS: Operation not possible due to RF-kill
То нужно установить улитку rfkill
(sudo apt-get install)/(yaourt -S)/(pacman -S)/(yum)  rfkill 
выполнить разблокировку если заблокировано что-то в
rfkill list
rfkill unblock all
И снова запускать
sudo ifconfig wlan0 up
Всё. Wicd спокойно подключаеться.
П.С. Если хотите подключиться из консоли то вот


iwconfig wlan0 essid имя_точки_доступа mode managed key s: пароль
ifconfig wlan0 ip_адрес netmask маска

А какие сети доступны, из консольки вам скажет

iwlist wlan0 scanning

Читать дальше......