Home Blog Page 15

[Tips] ComboBox AutoCompleted C#

When using the combobox. Sometime you need the combobox with auto completed. So you can create any combox with auto-complete feature by using KeyPress and TextChanged or create any class override two above function

On the OnKeyPress function. If users press any key, this can change and replace the text on comboBox. If the users press backspace or function key we don’t do anything. See the below example .

ComboBox AutoCompleted C#

ComboBox AutoCompleted C#

CAutoCompletedComboBox.cs

// Developer: VịLH / Zidane (huuvi168@gmail.com)
// Last Modified: 2016-07-01

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace AutoCompletedDemo
{

    public class CAutoCompleterComboBox: ComboBox
    {
        // bKey use when the special keys is pressed
        // In this case, the replace will be cancel!

        private bool bkey = false;

        // confirm the special key is pressed or not?
        protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e){

            base.OnKeyPress(e);
            if (e.KeyChar == (int)Keys.Escape)
            {
                // remote text
                this.SelectedIndex = -1;
                this.Text = "";
                bkey = true;
            }

            else if (Char.IsControl(e.KeyChar))
                bkey = true;
            else
                bkey = false;
        }

        // remove the text
        protected override void OnTextChanged(EventArgs e)
        {
            base.OnTextChanged(e);

            if (this.Text != "" && !bkey) {
                // Find the same Item.
                string matchText = this.Text;
                int match = this.FindString(matchText);

                // If found insert it
                if (match != -1)
                {
                    this.SelectedIndex = match;

                    // choose (test had just insert it)
                    // that can be replace if users type

                    this.SelectionStart = matchText.Length;
                    this.SelectionLength = this.Text.Length - this.SelectionStart;
                }
            }
        }
    }
}

FrmMain.cs


// Developer: VịLH / Zidane (huuvi168@gmail.com)
// Last Modified: 2016-07-01

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace AutoCompletedDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            CAutoCompleterComboBox combo = new CAutoCompleterComboBox();
            combo.Location = new Point(10, 10);
            combo.Width = 200;
            this.Controls.Add(combo);

            string[] arItems = new string[] {
                "Money",
                "CSharp",
                "Dot net",
                "C++",
                "PHP",
                "Lua",
                "Javascript",
                "Java",
                "Learn Tech Tips",
                "Zidane",
                "huuvi168@gmail.com",
                "facebook"
            };

            for (int i=0; i< arItems.Length; i++)
            {
                combo.Items.Add(arItems[i].ToString());
            }
        }
    }
}

 
Have any question, leave your comment, we can discuss about it!
Have a nice day!
Zidane 
http://learn-tech-tips.blogspot.com/

[Tutorial] Learn Facebook Apps development

Facebook is one of the social network in the world, so we should know how to programming with Facebook.

What need you do to become facebook developer!
1. Register one facebook account. Register here
2. Domain and Hosting
3. Register SSL Certificate (with https://) –  Example: Heroku, wordpress
4. Phone
5. IDE developer: Example: Notepad++, PHP Designer, Dream Weaver,…

Understand it will be help you in business so much in the future, …

This tutorial will demo to you how to create a facebook apps and using facebook api (PHP SDK)
We’re using Facebook API v2.6.

Step 1: Create your facebook account!

Step 2: Create your facebook apps, follow my instructions:

Login https://developers.facebook.com/

Create apps by “Add a new app”

Learn Facebook Apps development

Enter the name “Get Info Email List”
See below the options (this option maybe change up to Facebook development)

Learn Facebook Apps development

See the config apps:
Basic Settings:

Learn Facebook Apps development

Use Canvas Page name:
https://apps.facebook.com/email_list_app

Secure Canvas URL:
https://vilh.herokuapp.com/

Site URL:
https://vilh.herokuapp.com/

Learn Facebook Apps development

Learn Facebook Apps development

Valid OAuth redirect URLs:
https://vilh.herokuapp.com/callback.php

Advanced Settings:

Learn Facebook Apps development

Step 3: Build Source code

Download PHP SDK from the above link, after that use this link into your projects. Create two files with index.php and callback.php, set up your facebook SDK folder

Rename to facebook-sdk-v5

In source code remember   “always define the SDK source with /facebook-sdk-v5/”

Learn Facebook Apps development

Inside facebook-sdk-v5

Learn Facebook Apps development

Source code

index.php




<?php
   if(!session_id()) {
    session_start();
}
?>

<!DOCTYPE HTML>
<html>
<head>

    <title>Login with Facebook</title>
    <link href = "http://www.bootstrapcdn.com/twit
ter-bootstrap/2.2.2/css/bootstrap-combined.min.css"  rel = "stylesheet" />

    <meta http-equiv="content-type" content="text/html" />
    <meta name="author" content="GallerySoft.info" />

    <title>Get list email address</title>
</head>

<body>

<?php

define('FACEBOOK_SDK_V4_SRC_DIR', __DIR__ . '/facebook-sdk-v5/');
require_once __DIR__ . '/facebook-sdk-v5/autoload.php';

echo "<h1>Welcome to get list email address!</h1>";

$fb = new FacebookFacebook([
  'app_id'          => '144224829331429',
// Replace {app-id} with your app id
  'app_secret'      => 'ff0af80e8d80467adadbf8fa32e6c312',
  'default_graph_version' => 'v2.6',
    ]);
$helper = $fb->getRedirectLoginHelper();

// Optional permissions
$permissions = ['email', 'user_likes', 'manage_pages', 'publish_pages', 'read_stream'];

$loginUrl = $helper->getLoginUrl('https://vilh.herokuapp.com/callback.php', $permissions);


// add below foreach let's it don't got Cross-site request forgery validation failed.
// Required param “state” missing

foreach ($_SESSION as $k => $v)
{
    if (strpos($k, "FBRLH_") != FALSE){
        if (!setcookie($k, $v))
        {}
        else
            $_COOKIE[$k] = $v;
    }
}

echo '<pre>';
print_r ($_COOKIE);
echo '</pre>';


echo htmlspecialchars($loginUrl) . "<br> <br>";

echo '<a href="' . htmlspecialchars($loginUrl) . '">Log in with Facebook! ya</a>';

/*
try {
  // Returns a `FacebookFacebookResponse` object
  $response = $fb->get('/me?fields=id,name', '{access-token}');
 
  echo '<pre>'; 
  echo $response; 
  echo '</pre>';
 
} catch(FacebookExceptionsFacebookResponseException $e) {
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
} catch(FacebookExceptionsFacebookSDKException $e) {
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;
}
*/

?>
</body>
</html>

callback.php





<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="content-type" content="text/html" />
    <meta name="author" content="GallerySoft.info" />

    <title>Login</title>
</head>

<body>


<?php

    // get UserInfo function - use it when you want to get information
    function getUserInfo()   
    {
         try {
          // Returns a `FacebookFacebookResponse` object
          // $response = $fb->get('/me?fields=email', $accessToken);
         
          $response = $fb->get('/me?fields=id, name, email', $accessToken);
          $userNode = $response->getGraphUser();
         
          echo '<h3> Users Information </h3>';
          /*
          echo '<pre>';
          print_r ($userNode);         
          echo '</pre>';
          */
                   
          echo '<h1> Id: </h1>';
          echo ($userNode["id"]);
         
          echo '<h1> Name: </h1>';
          echo ($userNode["name"]);
         
          echo '<h1> Email: </h1>';
          echo ($userNode["email"]);
                   
          echo "<br>";
         
        } catch(FacebookExceptionsFacebookResponseException $e) {
          echo 'Graph returned an error: ' . $e->getMessage();
          exit;
         
        } catch(FacebookExceptionsFacebookSDKException $e) {
          echo 'Facebook SDK returned an error: ' . $e->getMessage();
          exit;
        }
    } 
?>


<?php

    foreach ($_COOKIE as $k=>$v)
    {
        if (strpos($k, "FBRLH_") != FALSE)
        $_SESSION[$k]  = $v;
    }

    // ph?i có session_id
    if(!session_id()) {
        session_start();

    }
 

  // always define the SDK source with /facebook-sdk-v5/
   define('FACEBOOK_SDK_V4_SRC_DIR', __DIR__ . '/facebook-sdk-v5/');
   require_once __DIR__ . '/facebook-sdk-v5/autoload.php';

      
   $fb = new FacebookFacebook([
          'app_id'          => '144224829331429', // Replace {app-id} with your app id
          'app_secret'      => 'ff0af80e8d80467adadbf8fa32e6c312',
          'default_graph_version' => 'v2.6',
          ]);

    $helper = $fb->getRedirectLoginHelper();
     
       

    try {
      $accessToken = $helper->getAccessToken();   
     
    } catch(FacebookExceptionsFacebookResponseException $e) {
      // When Graph returns an error
      echo 'Graph returned an error: ' . $e->getMessage();
      exit;
     
    } catch(FacebookExceptionsFacebookSDKException $e) {
   

  // When validation fails or other local issues
      echo 'Facebook SDK returned an error: ' . $e->getMessage();
      exit;
    }
   
       
    if (! isset($accessToken)) {
      if ($helper->getError()) {
        header('HTTP/1.0 401 Unauthorized');
        echo "Error: " . $helper->getError() . "n";
        echo "Error Code: " . $helper->getErrorCode() . "n";
        echo "Error Reason: " . $helper->getErrorReason() . "n";
        echo "Error Description: " . $helper->getErrorDescription() . "n";
      } else {
        header('HTTP/1.0 400 Bad Request');
        echo 'Bad request';
      }
      exit;
    }

    // Logged in
  
    // The OAuth 2.0 client handler helps us manage access tokens
    $oAuth2Client = $fb->getOAuth2Client();
   
    // Get the access token metadata from /debug_token
    $tokenMetadata = $oAuth2Client->debugToken($accessToken);
   

    // Validation (these will throw FacebookSDKException's when they fail)
    $tokenMetadata->validateAppId('144224829331429'); // Replace {app-id} with your app id
    // If you know the user ID this access token belongs to, you can validate it here
    //$tokenMetadata->validateUserId('123');
    $tokenMetadata->validateExpiration();
   
    if (! $accessToken->isLongLived()) {
      // Exchanges a short-lived access token for a long-lived one
      try {
        $accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken);
      } catch (FacebookExceptionsFacebookSDKException $e) {
        echo "<p>Error getting long-lived access token: " . $helper->getMessage() . "</p>nn";
        exit;
      }
   
    /*
      echo '<h3>Long-lived</h3>';
      echo '<pre>';
      print_r($accessToken->getValue());
      echo '</pre>';
      echo '<br>';
      */
    }
   
    $_SESSION['fb_access_token'] = (string) $accessToken;   
 
   
  
          try {
           
            $response = $fb->get('/203174996740517/likes?fields=id, name, pic, username, picture, link', $accessToken);
            $graphObject = $response->getGraphEdge();
           
            /*
            echo '<pre>';
            print_r ($graphObject);
            echo '</pre>';
           
            echo '<hr>';       
            */          


           // echo $graphObject[0]['id'] . "<br>";

            $i =  0;
            foreach ($graphObject as $obj)
            {
                $i =  $i + 1;
                echo $i;
                echo '<h3> Id       = ' . $obj['id'] . '</h3>' ;          
                echo '<h3> name     = ' . $obj['name'] . '</h3>';
                echo '<h3> pic      = ' . $obj['pic'] . '</h3>';
                echo '<h3> username = ' . $obj['username'] . '</h3>';
                echo '<h3> picture  = ' . $obj['picture']["url"] . '</h3>';
                echo '<h3> link     = ' . $obj['link'] . '</h3>';
            }
   
                   
          echo "<br>";        
         
        } catch(FacebookExceptionsFacebookResponseException $e) {
          echo 'Graph returned an error: ' . $e->getMessage();
          exit;
         
        } catch(FacebookExceptionsFacebookSDKException $e) {
          echo 'Facebook SDK returned an error: ' . $e->getMessage();
          exit;
        }

   
    // User is logged in with a long-lived access token.
    // You can redirect them to a members-only page.
    // header('Location: https://vilh.heroku.com/members.php');

?>

</body>
</html>

If you don’t have hosting for test, you can use Heroku cloud platform to test it! By upload to heroku. You can see this link (This can help you deploy any project to Heroku)

If you have any question or feedback, leave your comment, we can discuss about it!
Zidane
http://learn-tech-tips.blogspot.com/

[Knowdedge] Pointer in C++ and Pascal From basic to advanced

1. What are pointer?

Pointer

A pointer is a dynamic variable, whose value is the address of another variable, i.e., direct address of the memory location. Like any variable or constant, you must declare a pointer before you can use it to store any variable address.

Printing a Memory Address in Pascal

In Pascal, we can assign the address of a variable to a pointer variable using the address operator (@). We use this pointer to manipulate and access the data item. However, if for some reason, we need to work with the memory address itself, we need to store it in a word type variable.

NIL Pointer

It is always a good practice to assign a NIL value to a pointer variable in case you do not have exact address to be assigned. This is done at the time of variable declaration. A pointer that is assigned NIL points to nowhere.

Pascal Pointers in Detail

Pointers have many but easy concepts and they are very important to Pascal programming. There are following few important pointer concepts, which should be clear to a Pascal programmer

Pascal – Pointer arithmetic
Pascal – Array of pointers
Pascal – Pointer to pointer
Passing pointers to subprograms in Pascal
Return pointer from subprograms in Pascal

Ref
http://www.tutorialspoint.com/pascal/pascal_pointer_arithmetic.htm

Để hiểu rõ về con trỏ thì mới các bạn làm quen với các khái niệm: Bộ nhớ ảo, địa chỉ ảo trước nhé bạn!

2. Virtual Memory – Bộ nhớ ảo:

        Quản lý bộ nhớ vật lý (cấp phát, thu hồi) là một vấn đề cực kì phức tạp trong hệ thống máy tính, để bảo đảm sự hiệu quả, đúng đắn, an toàn cho việc quản lý đó, hệ điều hành xây dựng lên các vùng nhớ ảo.
        Trong hệ thống máy tính, bộ nhớ ảo (virtual memory) là một kĩ thuật cho phép một chương trình ứng dụng tưởng rằng mình đang có một dải bộ nhớ liên tục (một không gian địa chỉ), – các hộp tủ liên tục
        Trong khi thực ra phần bộ nhớ này có thể bị phân mảnh trong bộ nhớ vật lý và thậm chí có thể được lưu trữ cả trong đĩa cứng.
        So với các hệ thống không dùng kĩ thuật bộ nhớ ảo, các hệ thống dùng kĩ thuật này cho phép việc lập trình các ứng dụng lớn được dễ dàng hơn và sử dụng bộ nhớ vật lý thực (ví dụ RAM) hiệu quả hơn.
Lưu ý rằng:
–    khái niệm “bộ nhớ ảo” không chỉ có nghĩa “sử dụng không gian đĩa để mở rộng kích thước bộ nhớ vật lý” – nghĩa là chỉ mở rộng hệ thống bộ nhớ để bao gồm cả đĩa cứng.
–    Việc mở rộng bộ nhớ tới các ổ đĩa chỉ là một hệ quả thông thường của việc sử dụng các kĩ thuật bộ nhớ ảo.
–    Định nghĩa của “bộ nhớ ảo” có nền tảng là việc định nghĩa lại không gian địa chỉ bằng một dải liên tục các địa chỉ bộ nhớ ảo để “đánh lừa” các chương trình rằng chúng đang dùng các khối lớn các địa chỉ liên tục.

3. Virtual Address – Địa chỉ ảo:

–    Trong cái vùng bộ nhớ ảo ở trên đã nói, để cho tiến trình (process) sử dụng, hệ điều hành dễ hiểu, hai  bên này cùng nhau quy định chia nhỏ ra theo từng byte, và đánh số từ 1 đến hết
–    Ô nhớ đã được đánh số là i thì ta nói địa chỉ của cái ô nhớ đó là i

Example: int a;
=> Trong tiến trình hiểu là: a nằm trong cái ô thứ 0x006e6e1 thì a có địa chỉ là 0x006e6e1
=> Trong hệ điều hành hiểu là: cái địa chỉ này tương đương với ô nào đó trong thanh RAM mà ta quản lý

=   =>  Trong window 32 bit (xp, vista, 7) địa chỉ ảo có độ dài là 32 bits
        => Trong window 32 bits thì không gian địa chỉ ảo có địa chỉ từ 0000000h -> 7FFFFFFF

Pointer in C++ and Pascal

4. Con trỏ là gì?

– Miền giá trị của biến con trỏ là địa chỉ ô nhớ
– Là môt biến bình thường
– Chứa cái ‘địa chỉ ảo’.

5. Pointer declaration and initialization pointer in C and Pascal

Pointer declaration (C/C++)


Type *pointer;

void *p;
char *p;
double *p;
(we said p is pointer, not said *p is pointer)

Pointer declaration (Pascal)


var variables:^pointer;

var i:^integer; 
var p:pointer;
var p:^char;
var p:^double;
(we said p is pointer, not said ^p is pointer)

Initialization pointer pointer (C/C++)


pointer = address

int a  = 7777;
int *p = &a;
int *p;
P  =  &a;

Initialization pointer pointer (Pascal)


variables:@address

var x:integer
var p:pointer
p := @x;

Pointer in C++ and Pascal

Notes:

a = 3 & 2;    // toán tử & hai ngôi
p = &a;        // toán tử & một ngôi
scanf (“%d”, &a); // toán tử & một ngôi, là toán tử lấy địa chỉ một biến

when you declare; int *p = &a (or p = &a) <===> *p Equal with  a


a =  2;    <=> *p = 2;
a++;    <=>    (*p)++; // (*p) trong ngoặc vì toán tử * có độ ưu tiên thấp hơn ++
b = c + a – 200;    <=>     b = c + (*p) – 200;
(*p) = (*p) – 777;  <=>        a = a – 777;
scanf(“%d”, &a);    <=>     scanf(“%d”, p);

6. Pointer arithmetic – các phép toán trên con trỏ

Assignments – Phép gán:

–  Tất cả các loại con trò đều có phép gán
–  Phép gán với con trỏ yêu cầu vế trái là 1 con trỏ và vế phải là 1 địa chỉ
–  Phép gán yêu cầu sự tương xứng về kiểu dữ liệu, nếu ko tương xứng chúng ta phải ép kiểu
Example:  p=(int*)7777;
– p có kiểu dữ liệu là int*
– còn 7777 là 1 hằng số nguyên, nên phải ép kiểu về int* rồi thực hiện phép gán

Compare – Phép so sánh: 

–    Phép so sánh bằng dùng để:
    o    Kiểm tra hai con trỏ có trỏ vào cùng một vùng nhớ hay không?
    o    Kiểm tra một con trỏ có đang trỏ vào NULL hay không? (trong trường hợp cấp phát động, mở file, resource, …)
–    Phép so sánh lớn, nhỏ hơn <, >, <=, >= dùng để:
    o    Kiểm tra độ thấp cao giữa hai địa chỉ, con trỏ nào nhỏ hơn thì trỏ vào địa chỉ thấp hơn
    o    Được so sánh mọi con trỏ với 0, vì 0 chính là NULL

1st Example:

// huuvi168@gmail.com
// Last modified: 2016-06-28

int a=778,*p=&a;
 double *y;
 p==&a;
 main==0; 
 p==0;
 y==0;

2nd Example:


 int a=197,*p=&a;
 double b=0,*x=&b;

 // so sánh 2 con trỏ
 int)p==(int)x;
 p==(int *)x;
 (double*)p==x;
 (void*)p==(void*)x;
 p==(void*)x;
 (float*)p==(float*)x;

 //so sánh con trỏ với số nguyên
 p==(int*)9999;
 int(p)==9999;
  
 // con trỏ void có thể so sánh với con tất cả con trỏ khác
 (int(*)())p==main;

Incrementing a Pointer, Decrementing a Pointer – Phép cộng trừ, tăng giảm: + += – -= — ++ +

–   Tăng/ giảm con trỏ p đi 1 đơn vị là cho p trỏ đến ô nhớ bên cạnh phía dưới/trên.
Chú ý:
+ Khi tăng giảm con trỏ p đo 1 đơn vị không có nghĩa là trỏ sang byte bên cạnh
+ Việc tăng giảm con trỏ đi 1 đơn vị phụ thuộc vào kiểu dữ liệu và nó trỏ đến, quy tắc là
p+1 => giá trị chứa trong p + sizeof (kiểu dữ liệu của biến mà p trỏ đến)

Tuy nhiên:

+ Không có phép tăng giảm trên con trỏ void
+ Không có phép tăng giảm trên con trỏ hàm
+ Không có phép cộng 2 con trỏ với nhau
+ Phép trừ 2 con trỏ trả về độ lệch pha giữa 2 con trỏ

Example:

void main()
{
    char xau[200];

    printf("Nhap xau : ");
    scanf("%[a-zA-Z ]",xau);


    //Viết hoa xâu  (duyệt xuôi)
    printf("Viet hoa  : ");

    //viết đầy đủ sẽ là (char *p=xau;*p!=NULL;p++)
    for (char *p=xau;*p;p++) //p trỏ đến xâu; kí tự trỏ đến khác NULL;p=p+1
        printf("%c",toupper(*p));

    //Viết đảo ngược xâu  (duyệt ngược)
    printf("nDao nguoc xau : ");

// cho p trỏ vào từ cuối cùng; p còn lớn hơn xau;p=p-1
for(char *p=xau+strlen(xau)-1;p>=xau;p--) 
        printf("%c",*p);

    getch();

7. Pointer Constant – Hằng con trỏ? Con trỏ hằng

Hằng Con Trỏ Con Trỏ Hằng
Những con trỏ mà chỉ trỏ cố định vào 1 vùng nhớ , những con trỏ này ko có khả năng trỏ vào vùng nhớ khác, ko thay đổi được (1) -> gọi là Hằng con trỏ

Những con trỏ mà trỏ vào một vùng nhớ cố định, con trỏ này chỉ có tác dụng trỏ đến, chứ không có khả năng thay đổi giá trị của vùng nhớ này, con trỏ này được ứng dụng gần như là tác dụng của phương thức hằng trong OOP (2) -> gọi là Con trỏ hằng

Example: Hằng con trỏ

void main()
{
    char buf[] = "bonjour";
    char * const p = buf;

    p++;         // báo lỗi tại đây
    p[4]++;      // hoàn toàn có thể thay đổi giá trị vùng nhớ mà p trỏ đến
}

Example: Con trỏ Hằng:

void main()
{
    char *p="learn tech tips";   
    p++;

    (*p)++;     // không báo lỗi biên dịch nhưng lỗi run-time
    p[2]='b';     // không báo lỗi biên dịch nhưng lỗi run-time)

}

char buf[] = "bonjour";
char const *p = buf;   // const char *p = buf;

p++;    /* đúng */
p[4]++; /* ko được, sai */

Mục đích và ứng dụng Con trỏ Hằng

 Ứng dụng lớn nhất của char const * đó là chú ý khi khai báo và sử dụng các hàm trả về const

const char *FunctionofAnotherPeople(void)
{
    return "abc";
}
 
void HamCuaToi(void)
{
    //gọi và sử dụng đến kết quả hàm bên trên thế nào?
    char const *pstr=FunctionofAnotherPeople();     // how to used?
}

Khi code trong 1 project lớn. Giả sử bạn có 1 hàm, thao tác với 1 mảng, hàm này chỉ đọc mảng thôi, ko làm thay đổi các giá trị trong mảng . Và quan trọng là, khi share code cho các bạn khác trong cùng project, làm sao để họ biết điều này?

Vậy ta sẽ cài đặt hàm của mình như sau
// đối với trường hợp hằng con trỏ là tham số hình thức thì
// void ham(const int *) và void ham(int const *) => là như nhau, từ const khi đóng góp vào trong tham số hình thức là như nhau.


void input(const int *a,int n) 
{
    //xử lý gì đó
}


void main()
{
    int a[100]={1, 77},

    int n=2;

    input(a,n);    // khi sử dụng hàm này có nghĩa là hàm này không thay đổi mảng a của mình đâu, yên tâm sử dụng, nếu có lỗi gì đó thì ko phải sinh ra từ đây...
}

Phụ lục, Con trỏ Hằng (nâng cao)


int a=3;
const int *p;
p=&a;      //  Bản thân p thì có thể thay đổi, cho p gán vào chỗ khác được tuy nhiên
(*p)++;    //  Báo lỗi

8. Array – Pointer

Pointer in C++ and Pascal From basic to advanced

Khi ta khai báo mảng thì tương đương với:
Xin cấp phát 1 vùng nhớ có kich thước như khai báo và khai báo ra một Hằng con trỏ trỏ vào đầu vùng nhớ đó?

Bài toán ở trên:

int a[100];
– Có thể coi a là một hằng con trỏ trỏ vào phần tử thứ 0 của mảng, a mang đầy đủ tính chất của một hằng con trỏ nhưng có thêm 1 số khác biệt nhỏ (ví dụ khi dùng size of)
– Các phép toán nhằm làm a trỏ tới vùng khác (thay đổi giá trị của a) là ko thể (++ — = )
–    a tương đương với &a[0]
–    a+i tương đương với &a[i]
–    *a tương đương với a[0]
–    *(a+i) tương đương với a[i]
–    3[a] tương đương với *(a+3) tương đương với a[3]

Chú ý : trình biên dịch luôn hiểu a[i] là *(a+i)
–    Các phần tử được sắp xếp liên tiếp trên bộ nhớ => đặc điểm cơ bản của mảng 1 chiều
–    Sử dụng toán tử sizeof đối với mảng trên để trả về kích thước của mảng
–    Chỉ cần 1 con trỏ trỏ vào đầu mảng là ta có thể kiểm soát được cả mảng rồi bằng cách lấy tên mảng + i là độ lệch
–    Việc sử dụng a[i] để kiểm soát cũng chính là +i

Source code 1

// huuvi168@gmail.com
void main()
{
    float a[100];
    int n;
    //nhập n
    printf("Input n :");
    scanf("%d",&n);
    // nhập mảng
    for(int i=0;i<n;i++)
    {
        printf("Input the elem: %d",i+1);
        scanf("%f",a+i);
    }

    // xuất mảng
    printf("Array output : n");
    for(int i=0;i<n;i++)
        printf("%f  ",*(a+i));

    getch();
}


Source code 2

#include <stdio.h>
#include <conio.h>

void main()
{
    int a[100]={0,1,2,3,4,5,6};
    printf("%d",2[a]); //in ra 2, tại sao vậy ?

    getch();
}

2[a] là gì?

Thật ra :
2[a] trình biên dịch sẽ hiểu là *(2+a)
*(2+a) hoàn toàn tương đương với *(a+2)
mà *(a+2) chính là a[2]
vậy 2[a] cũng đơn giản là a[2]

9. String – Xâu Ký tự

Xâu kí tự là trường hợp đặc biệt của mảng 1 chiều khi mà cách thành phần của mảng là 1byte
Xâu kí tự kết thúc bằng NULL. NULL là 1 kí tự đặc biệt có mã là 0,
Có 3 cách viết NULL trong C như sau : NULL , ‘’ , 0

Các trường hợp bị SAI

Chưa có bộ nhớ đã sử dụng

char *xau;
gets(xau);

      Code trên vẫn biên dịch được, nhưng khi chạy sẽ sinh ra lỗi run-time, ở 1 số trình biên dịch ngày xưa thì có thể không bị lỗi đâu
       Nhưng sai thì vẫn là sai, code này sai thuộc loại chưa cấp phát

Thay đổi giá trị của một hằng


char *xau="huuvi168@gmail.com";
 xau[6]='A';

Explain
vẫn biên dịch được, nhưng khi chạy sẽ sinh ra lỗi run-time, lỗi này là lỗi cố tình thay đổi giá trị của 1 hằng

        Nguyên nhân sâu xa của vấn đề như sau :
Khi khai báo char *xau=”huuvi168@gmail.com”; thì bản chất là
+ Trong vùng nhớ data của chương trình sẽ có 1 hằng chuỗi “huuvi168@gmail.com” . (chuỗi chuỗi, đã là hằng thì ko thể bị thay đổi)
+ Cho con trỏ xau trỏ đến đầu của vùng nhớ đó.
Câu lệnh tiếp theo xau[6]=’A’; cố tình thay đổi giá trị của hằng, rõ ràng là sinh ra lỗi rồi

Cố tình thay đổi giá trị của hằng con trỏ


char xau[100];
xau="Zidane ViLH"; // không biên dịch được

char *xau="huuvi168@gmail.com";
 xau[6]='A';

Explain   
Vì phép toán trên có nghĩa là khai báo 1 chuỗi “Zidane ViLH” trong vùng nhớ code, rồi sau đó cho hằng con trỏ xâu trỏ vào đó, Rất tiếc xau là hằng con trỏ nên ko thể trỏ đi đâu khác được, ngoài vị trí đã được khởi tạo trong câu lệnh khai báo

Notes
char xau[100]=”Zidane ViLH”; hoặc char xau[100]={0}; thì hoàn toàn hợp lệ

Dùng phép toán so sánh để so sánh nội dung 2 xâu

void main()
{
    char xau[100]="learntechtips";
    if (xau == "learntechtips")
    {
        ...
    }
  
}

Explain
if (xau == “learntechtips”)
=> chỗ này không sai về syntax, ko sinh ra lỗi runtime, nhưng mang lại kết quả ko như người dùng mong muốn, vì như phép toán của con trỏ, ta có Phép so sánh ngang bằng dùng để, kiểm tra 2 con trỏ có trỏ vào cùng 1 vùng nhớ hay không, hoặc kiểm tra 1 con trỏ có phải là đang trỏ vào NULL hay không? chứ ko phải là phép so sánh nội dung của xâu ký tự
Do đó để so sáng nội dung của xâu ta phải dùng những hàm strcmp (string compare) hoặc stricmp hay những hàm tự định nghĩa

Mỗi chương trình thực hiện 1 hàm, 1 khối lệnh thì các đối tượng cục bộ khai báo trong khối hay hàm đó được tổ chức lưu trữ trong ngăn xếp (stack).
Stack phình to ra, nở rộng xuống phía dưới,
khi hàm kết thức, các đối tượng cục bộ được giải phóng, stack nhỏ lại

Pointer in C++ and Pascal From basic to advanced

10. Dynamically allocated? – Cấp phát động?

Cú pháp C:

–    Dùng malloc, free
contro = (Ép kiểu) malloc ( … )
–    malloc trả về 1 địa chỉ đến 1 vùng nhớ và coi vùng nhớ này là void *, nên trong câu lệnh malloc luôn đi kèm với việc ép kiểu
–    Cấp phát là luôn phải đi kèm với giải phóng, ở đâu cũng thế, malloc là phải free, ok ? Code mà để thoát chương trình rồi chưa giải phóng cho dù là có hệ thống có tự giải phóng đi nữa vẫn bị coi là CODE KHÔNG TỐT !!!!
–    Trong java chỉ cần cho reference = null là nó giải phóng nhưng trong C thì bắt buộc phải có thao tác giải phóng free()

Cú pháp C++:


-    Dùng new, delete
int *p = new int();
delete (p);

Cú pháp pascal:

-    Dùng new, dispose
var intPointer: ^integer;
new (intPointer);
dispose(intPoinster);

Sự khác nhau giữ malloc và new?

–    Malloc là hàm, cấp phát trả về void*,
–    Malloc ko gọi hàm tạo, free không gọi hàm hủy
–    Malloc trả về NULL nếu thất bại

–    New là toán tử, new gọi hàm tạo, new có thể được đa năng hóa (nạp chồng)
–    New ném ra exception nếu thất bại
–    Toán tử new new và toán tử new[] không có khả năng realloc

–    Dùng để cấp phát bộ nhớ to nếu dùng a[1000000] -> không cho cấp phát vì vùng Stack của mỗi chương trình là CÓ giới hạn, vì vậy phải dùng kỹ thuật cấp phát động xem lại Bộ nhớ ảo và Địa chỉ Ảo

11. Con trỏ Hàm

–    Bản chất của con trỏ hàm cũng là 1 con trỏ có định kiểu
–    Sử dụng con trỏ hàm để gọi hàm (invoke) khi biết địa chỉ

Source code – Gọi nội hàm

// http://learn-tech-tips.blogspot.com
#include <stdio.h>
#include <conio.h>
int min(int a,int b)
{
    if (a>b) return a;
    return b;
}
void main()
{
    int (*p)(int,int);
    p=min;
    printf("min cua 4 va 5 la %d", p(4,5));
    getch();
}

Chú ý:
khi khai báo ta phải dùng toán tử () với ý nghĩa là * này thuộc về p, là 1 con trỏ hàm. int (*p)(int,int);

Source code – Gọi ngoài hàm

void (*p) (int)
p =   (void (*)(int)) 0x873AB;
p(3); // gọi hàm với tham số là 3

12. Hằng con trỏ hàm

Khi khai báo một hàm, tên của hàm chính là hằng con trỏ hàm (con trỏ này cố định vao vùng nhớ của hàm). => hằng con trỏ hàm cũng gần gần giống như khái niệm hằng con trỏ với mảng một chiều

(int) p  = int (main)
P == (int*)main;
(int (*)()) p == main;
 P = (void*)main;

Ứng dụng của con trỏ hàm:

–    Gọi hàm từ chương trình khác, làm auto game võ lâm bấm Ctrl + Z mở hộp thư
–    Nguyên tắc là: dùng kỹ thuật hook để cái 1 Thread vào trong game. Thread này khi người dùng ấn nút Ctrl+Z nó sẽ gọi hàm mở hộp thư ingame

Example:
Giả sử ta có hàm dạng: open(int a) tại địa chỉ 0x007712CE thì để gọi hàm này minh làm:

void (*p) (int);
p = (void (*) (int)) 0x00712CE;
p(7);    // gọi hàm với tham số là 7

Summary

– Miền giá trị của biến con trỏ là địa chỉ ô nhớ

1. p point to a (p trỏ đến a)

Pointer in C++ and Pascal From basic to advanced

Source code:

int a = 7777;
int *p;
P trỏ đến a khi giá trị trong p chứa địa chỉ ảo của a

Error

Pointer in C++ and Pascal From basic to advanced

int a = 7777;
int *p;
p = a (or *p = a) -> Không có dấu &

Như hình trên p trỏ vào 1 ô nhớ mà không hề biết tới. không hề biết rằng ô nhớ này có bộ nhớ vật lý hay chưa, cũng không hề biết rằng nó chứa cái gì trong đấy/ nằm ở vùng nhớ nào

=> Do đó khả năng gây lỗi run-time là vô cùng lớn

2. Nhiều con trỏ cùng trỏ vào một ô nhớ

Pointer in C++ and Pascal From basic to advanced

Source code:


int a = 7777;
int *p, *q;
p = &a;
q =  &a; // or q = p;

–    Tuy Hai biến cùng trỏ đến một địa chỉ ảo thì nó vẫn nằm trong ba biến CON TRỎ khác nhau
–    Do đó khi thay đổi giá trị a từ 7777 sang 8888 thì giá trị của con trỏ p và con trỏ q cũng khác nhau (nhưng địa chỉ của hai con trỏ p, q trỏ tới vẫn giống nhau là 0x00778EA1)

3. Ép kiểu con trỏ

Source code

int *p =  (int *)0x0077EFA1
char *p = (char*)0x0088ADD3

Nhưng, con trỏ void thì thoải mái, ép kiểu gì cũng được

void * p = (double *)0x00778BDE
void * p = (char *)0x00778BDE
void * p = (int *)0x00778BDE

4. Tăng giảm con trỏ:

Pointer in C++ and Pascal From basic to advanced

Source code:

double a = 7777;
double *p;
p = &a
p++ // p = p + 1;

Do p trỏ đến một biến double nên việc +1 sẽ làm tương ứng với giá trì trong p + 8 đơn vị
Vì sizeof(double) = 8
p = p + 1 <=> 0x00778EA0 + 0x8 = 0x00778EA8
p = p – 1 <=> 0x00778EA0 – 0x8 = 0x00778E98

[Sưu Tầm Internet + sách kỹ thuật lập trình C++/Pascal + Góp ý]

[Tips] Get Exported function in dll files written by C++ programming language

You wanna get all exported function in process, dll or window files, … 
In the case if you have dll files, you don’t have the .h, .lib (Im focus C++ in window project, not C++ in linux projects), how do you use that dll?

I can introduce to you two tool. One is dll export, another is resource view. From this tool, that can help you easy to dump function address, function name, and another information …
Using this tool can help you view resource in any dll files
Using this tool can help you export function in dll files (support 32 bits, 64 bits OS)

This utility displays the list of all exported functions and their virtual memory addresses for the specified DLL files. You can easily copy the memory address of the desired function, paste it into your debugger, and set a breakpoint for this memory address. When this function is called, the debugger will stop in the beginning of this function. 

For example: If you want to break each time that a message box is going to be displayed, simply put breakpoints on the memory addresses of message-box functions: MessageBoxA, MessageBoxExA, and MessageBoxIndirectA (or MessageBoxW, MessageBoxExW, and MessageBoxIndirectW in unicode based applications) When one of the message-box functions is called, your debugger should break in the entry point of that function, and then you can look at call stack and go backward into the code that initiated this API call. 
Have any question or discuss about this topic, leave your comment, we can discuss about it!
Have a nice day!
Zidane

[Tutorial] How to use Heroku projects – cloud application platform

When you build succeed a website with Node.js, PHP or Ruby you want to deploy it to web host for study, for business or asking someone, somebody about bug, error in your source code

The problem you encountered?

=> Hard to find a free host support about your thing.
=> Every time you asking someone about source code, you must build a website up for local pc and show up to them
=> Time consuming, exhausting and money.

Solution: 

=> You should build a website on cloud application platform, so you can access it every where, every time. That help you so much! That’s on Heroku
 

How to use Heroku projects - cloud application platform
Heroku command

Beside,  Heroku free projects can support you many thing, see the list below. This projects is free but if you use for one team, you must charged with it!

– Java
– PHP
– Python
– Go
– Scale
– Clojure

 [Tutorial] How to use Heroku projects - cloud application platform

What is Heroku? 

Heroku is a cloud application platform – a new way of building and deploying web apps. Our service lets app developers spend their time on their application code, not managing servers, deployment, ongoing operations, or scaling.

Heroku was founded in 2007 by Orion Henry, James Lindenbaum, and Adam Wiggins. It was acquired by Salesforce in 2011, and Heroku is now part of the Salesforce App Cloud.

Heroku support three method for deploy your source code

– Heroku Git (Use Heroku Toolbelt) or Heroku command line
– Git huh
– Dropbox

Heroku basic command

Login (1)


$ heroku login

Clone the repository (2)


$ heroku git:clone -a vilh
$ cd vilh

Deploy your changes (3)


$ git add .
$ git commit -am "nake it better"
$ git push heroku master

Create your apps (4)


$ heroku create appsname

Init your projects (5)


$ git init

How to create your apps?

5 steps for create your apps

1. Login with heroku account (1)
2. Create your apps in your local disk (4)
3. Access your apps path by cd ….
4. Init your projects (5)
5. Deploy your changes (3)

Your web link here!

Live video tutorial

Have a nice day!
Zidane

[Tips] Tool support check File Encoding

One another topics is how to encode and stored info in computer. if you can understand it clearly, you can use programing language for write files with any format.
This topic is focus two thing: 
– Help you easy understanding the text encoding and file encoding
– Support you one Tool, Software for check file encoding

Let’s see how to window work => below pictures is generator from binary number to Hex data. After that using basic encoding to translate for users purpose.

Understand how Unicode works:

To understand how Unicode works, you need to first understand how encoding works. Any text file containing data that you open and edit in Window is displayed using encoding. In the simplest terms, encoding is how the raw hex data of a file is interpreted and displayed in the editor as readable text, which you then can manipulate using your keyboard.
Since we know that everything on our computer is composed of 0’s and 1’s, you can visualize how encoding works by looking over the following diagram.

Translate binary code to ASCII

Tool support Check File Encoding
Unicode strives to map most of the world’s written characters to a single encoding set. This allows you to view Chinese scripts, English alphanumeric characters, Russian and Arabic text all within the same file without having to change the encoding (code page) for each specific text. 
Prior to Unicode, you would probably have needed to select a different code page (encoding) to see each script, and most of the scripts would not have been viewable at the same time (or at all).
Translate binary code to UNICODE

Tool support Check File Encoding

The list thing: Unicode vs. UTF-8, UTF-16, etc.

Because the hex format of Unicode requires many extra, sometimes unnecessary bytes (hex separator characters), a derivation of Unicode was developed to conserve space and optimize the hex data of Unicode strings (and subsequently file size) called UTF-8 (Unicode Transformation Format in 8-bit format). 
UTF-8 is still encompassed by the Unicode character set, but its system of storing characters is different and improved. There are other Unicode encoding such as UTF-16, UTF-32, and UTF-7, but UTF-8 is the most popular and widely-used Unicode format today. 

How to check file encoding?

This topic I’ll suggest you The File Encoding Checker with free listen. 
We should Thanks to Jeevan James and licensed under the Mozilla public license 1.1
Thank you!
You can download tool from here

Tool support Check File Encoding

Relative topics: (may be you need it)

http://learn-tech-tips.blogspot.com/2015/05/c-programming-convert-tcvn3-to-unicode.html
http://learn-tech-tips.blogspot.com/2015/05/readwritefileinCsharp.html

Any feedback, leave your comment, we can discuss about it!
Thanks a lots!
Zidane

[Tips] How to use SmartAssembly for obfuscation dotnet source code

When you write a projects using dot net framework, that easy and take less time to create your app fit with your request. But the problem is the exe build by dot net framework is not secure. So many people can crack and use it….
One of the reason is protect your source code. That is encrypt it. The market have many tools support about it! This is one is SmartAssembly!
 
You can download use trial or buy from here: 

Link Mirror 1

“SmartAssembly is an obfuscator that helps protect your application against reverse-engineering or modification, by making it difficult for a third-party to access your source code.

If your entire business rests on the IP embodied in your software or you don’t want your C# or VB.NET code exposed internationally, then obfuscating your code becomes a necessity, not a luxury.

With SmartAssembly, you get a comprehensive set of obfuscation features, including name mangling, control flow obfuscation, strings encoding, reference dynamic proxy, and declarative obfuscation.”

 
View the tutorial from here

Tips:

Some time if your projects integrated with C++ Source code! you shouldn’t check Purning mode, because this mode is purning your function, function name, function title, function description….. So that will be make C# app (dot net) cannot comunication with C++ dll.

How to use SmartAssembly for encrypt your Dot Net Source Code
How to use SmartAssembly for encrypt your Dot Net Source Code
How to use SmartAssembly for encrypt your Dot Net Source Code
How to use SmartAssembly for encrypt your Dot Net Source Code

How to use SmartAssembly for encrypt your Dot Net Source Code

That’s my choose mode!

Have any question, leave your comment, we can disccuss about it!
Regards!
Zidane (Learn Tech Tips Founder)

[Tips] How to Build Android Library and add it to another project to use it

Many question about how to build Android library and how to add it to another projects to used it!
This is your best question, (I think) => Because I had making it the fastest. 😀

This tutorial I’m use Android Studio 2.0 IDE and Build AAR Android Library. 
Follow my Code Snippet for more knowledge

How to Build Android Library and add it to another project to use it

1. Answer the 1st questions “How to build Android Library?”

First create your new projects,
File -> New Projects -> use Add No Activity -> Press Finished
Because The lib we don’t write anything to did, so we can choose “Add No Activity” mode

How to Build Android Library and add it to another project to use it

After finished, you can see own projects same here.

How to Build Android Library and add it to another project to use it

Then, Create my library -> File -> New Module ->  Android Library -> Choose Next.

How to Build Android Library and add it to another project to use it

Set MyLib name (The Package name cannot choose because MyLib and LibDemo is same package (same location)

How to Build Android Library and add it to another project to use it

Here is the MyLib location .

How to Build Android Library and add it to another project to use it

Ok, Now we have MyLib library already, so we can write code here.
Example: My code is have two class: one class is Customer and another is CustomerProvider

— Customer.java


package huuvi168.com.mylib;

// Created by huuvi168@gmail.com on 5/20/2016.
public class Customer {
private String name;
private int age;
private String sex;

public Customer(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}

@Override public String toString() {
return "Name = " + name + "n";
}
}

— CustomerProvider.java


package huuvi168.com.mylib;

import android.content.Intent;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

// Created by huuvi168@gmail.com on 5/20/2016.
public class CustomerProvider {

public static List<Customer> getInfo()
{
List<Customer> lstCustomer = new ArrayList<Customer>();

Random r = new Random();

// random number of item but at least 3
Integer n = r.nextInt(10) + 3;
String[] arName = new String[]{
"Tom",
"Jerry",
"Alibaba",
"LearnTechTips",
"huuvi168" };

String[] arSex = new String[]{
"Male",
"Female",
"Other" };



for (int i=0; i < n; i++)
{
int nName = r.nextInt(arName.length);
int nAge = r.nextInt(80) + 18; // at least 18 ages
int nSex = r.nextInt(arSex.length);
Customer cus = new Customer(arName[nName], nAge, arSex[nSex]);

lstCustomer.add(cus);

}

return lstCustomer;
}
}



Tips:
Sometime you cannot build release mode when config on Build Variants .
If you CANNOT build release mode, don’t worry, Choose Projects mode -> Choose Gradle Properties -> double click on assembleRelease, you will see IDE will download some lib files on Internet (so you should connect with Internet if you do it action)

How to Build Android Library and add it to another project to use it

Then access to your outputs folder -> Do you see aar folder? that’s your release files
=> If you don’t see it, please tell me by comment on the below this topic, I can help you easy do it

2. Answer the 2nd questions “How to add Android Library to Android projects?”

You can add AAR package by this way
At the projects you used it, File -> New Module -> Import JAR/.AAR package -> Next -> 

How to Build Android Library and add it to another project to use it

 Create Lib name and add your lib-release AAR resource to your proejcts!

How to Build Android Library and add it to another project to use it

Add lib to Project
At Projects want to use lib -> Open Module Settings -> Choose Dependences -> Choose Module Dependency (3)

Tips:

– If you choose Librara dependency (1) -> This is your remote file -> This same org.apache.commons.commons-lang:3:3:4

– If you choose File dependency (2) -> Your files will be add to your projects

How to Build Android Library and add it to another project to use it

-> Here is your lib

How to Build Android Library and add it to another project to use it

Done -> Now go to used it!
Create your projects with Button and TextView ->  Use Customer and CurtomerProvider as you can!


package huuvi168.com.demolib2;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.List;

import huuvi168.com.mylib.Customer;
import huuvi168.com.mylib.CustomerProvider;
import huuvi168.com.mylib.RssFeedProvider;
import huuvi168.com.mylib.RssItem;

public class MainActivity extends AppCompatActivity {

Button btnClicked;
TextView txtMsg;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

btnClicked = (Button)findViewById(R.id.buttonClicked);
btnClicked.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

List<Customer> list = CustomerProvider.getInfo();
String text = String.valueOf(list.toString());

txtMsg = (TextView)findViewById(R.id.textViewMessage);
txtMsg.setText(text);
}
});
}
}

Have any feedback, leave your comment, we can discuss about it!
If you see this helpful for you, please share and +1 google plus or facebook,

We’re thanks so much!
Zidane – Learn Tech Tips (Founder)

[Tips] Get All Files in any folder with Recursive function in C#

You wanna get all files and folder in any folder. You can easy do it with my below function
Using Recursive technical skill, you can easy do it by yourself

A recursive function definition has one or more base cases, meaning input(s) for which the function produces a result trivially (without recurring), and one or more recursive cases, meaning input(s) for which the program recurs (calls itself).

Get All Files in any folder with Recursive function in C#

You can download full source from here

Using Recursive function for get all files in folder with sPath

Source Code:



public static List<string> GetAllFilesInFolder(string sDirPath)
{
// 1.// Store results in the file results list.
List<string> result = new List<string>();

// 2.// Store a stack of our directories.
Stack<string> stack = new Stack<string>();

// 3.// Add initial directory.
stack.Push(sDirPath);

// 4.// Continue while there are directories to process
while (stack.Count > 0)
{
// A.// Get top directory
string dir = stack.Pop();

try
{
// B. // Add all files at this directory to the result List
// get all file with txt and folder
result.AddRange(Directory.GetFiles(dir, "*.txt"));

// C. // Add all directories at this directory.
foreach (string dn in Directory.GetDirectories(dir))
{
stack.Push(dn);
}
}
catch
{
// D. // Could not open the directory
}
}
return result;
}