โปรแกรมนับจำนวนหรือเปรียบเทียบจำนวนบรรทัดของ Code

สำหรับใครที่กำลังหาโปรแกรมที่ใช้นับจำนวนบรรทัดของ Code, เปรียบเทียบจำนวน Code, นับบรรทัดว่าง Space หรือ Comment ต่างๆ ใน Project Source code ของเรา ทั้งหมดที่ว่ามานี้สามารถใช้โปรแกรมที่มีชื่อว่า Cloc ซึ่งโปรแกรมนี้สามารถใช้งานได้กับแทบจะทุกภาษาโปรแกรมมิ่ง ไม่ว่าจะเป็น C, C++, Php, Python, Java, Javascript, หรือแม้กระทั้ง Markdown เพื่อนๆสามารถเช็คภาษาและนามสกุลไฟล์ที่รองรับได้ที่นี้ https://github.com/AlDanial/cloc#recognized-languages- หรือจะใช้คำสั่ง cloc –show-lang ก็ได้เช่นกัน

มาดูวิธีใช้งาน (ตัวอย่างสำหรับ Windows) กันดีกว่า

ก่อนอื่นให้ดาวโหลด Cloc มาก่อน โดยสามารถ Download Release version ของ Cloc (โหลดเอาไฟล์ .exe สำหรับคนที่ใช้ Windows) ได้ที่ https://github.com/AlDanial/cloc/releases

เมื่อเราได้ Cloc มาแล้วให้ทำการวาง .exe ของโปรแกรมไว้แล้วทำการเรียกใช้งานโดยผ่านทาง Command line หรือ Power shell ของ windows

จากตัวอย่างเราจะทำการวาง Code ทั้งโปรเจคอยู่ที่ Folder EVM430_CT_1V_1C_50Hz_1 ตามที่อยู่ด้านล่างนี้ C:\Users\Beer\Desktop\EVM430_CT_1V_1C_50Hz_1

เวลาเรียกใช้ก็สามารถพิมพ์ Command line ได้ว่า

.\cloc-1.82.exe C:\Users\Beer\Desktop\EVM430_CT_1V_1C_50Hz_1

ทีเด็ดของโปรแกรม Cloc ก็คือสามารถ Export เป็น report Excel ไฟล์ได้เลย โดยใช้คำสั่งตามนี้
.\cloc-1.82.exe –by-file-by-lang –csv –report-file=test.csv C:\Users\Beer\Desktop\EVM430_CT_1V_1C_50Hz_1

หรือจะเปรียบเทียบ Code ระหว่าง 2 โปรเจคว่ามีความแตกต่างกันยังไงบ้าง สมมติว่ามี โปรเจค EVM430_CT_1V_1C_50Hz_1 และ EVM430_CT_1V_1C_50Hz_2 ก็สามารถใช้คำสั่งได้ดังนี้

.\cloc-1.82.exe –by-file-by-lang –count-and-diff C:\Users\Beer\Desktop\EVM430_CT_1V_1C_50Hz_1 C:\Users\Beer\Desktop\EVM430_CT_1V_1C_50Hz_2

ส่วนการ Export เป็น Excel ทดลองแล้วไม่สำเร็จ ก็เลยต้องใช้อีกวีธีหนึ่งคือ ให้ print ออกมาที่ หน้า Console เป็น csv format แล้วก็ก๊อปปี้ไป save เป็น csv เอง โดยใช้คำสั่งดังนี้
.\cloc-1.82.exe –by-file-by-lang –csv –count-and-diff C:\Users\Beer\Desktop\EVM430_CT_1V_1C_50Hz_1 C:\Users\Beer\Desktop\EVM430_CT_1V_1C_50Hz_2

Visual Studio แต่ละเวอร์ชั่นต่างกันอย่างไร

สำหรับใครที่กำลังงงและสงสัยกับ Visual Studio ของ Microsoft ว่าแต่ละเวอร์ชั่นนี้ต่างกันอย่างไรแล้วแบบไหนใช้งานได้ฟรีบ้าง บทความนี้มีคำตอบ เดียวจะมาอธิบายให้ฟัง

โดย Microsoft นั้นอนุญาติให้สามารถนำ Visual Studioเวอร์ชั่น Visual Studio Community มาใช้งานได้ฟรี สำหรับท่านที่มีคุณสมบัติตาม 5 ข้อนี้

1. คนที่ใช้งานเพื่อการศึกษา การสอน
2. นักพัฒนาทั่วไปที่ไม่ใช่บริษัท
3. นักพัฒนาที่พัฒนาโปรแกรม Opensource
4. เป็นบริษัทขนาดเล็กที่ไม่ได้มีรายได้ไม่เกิน 1 ล้านเหรียญสหรัฐ และ มี PC ไม่ถึง 250 เครื่อง
5. เป็นบริษัทขนาดเล็กที่มีการใช้งานพร้อมกันไม่เกิน 5 เครื่อง

นอกนั้นต้องเสียเงิน โดย มี 2 เวอร์ชั่น Visual Studio Professional และ Visual Studio Enterprise

สามารถดูตารางเปรียบเทียบฟังชั่นการทำงาน ของ Visual Studio Community, Visual Studio Professional และ Visual Studio Enterprise ต่างๆได้ตามด้านล่าง

Supported Features Visual Studio
Community

Visual Studio
Professional

Buy
Visual Studio
Enterprise

Buy
Supported Usage Scenarios Seventy-five percent feature support One hundred percent feature support One hundred percent feature support
Individual Developers Feature supported Feature supported
Classroom Learning Feature supported Feature supported Feature supported
Academic Research Feature supported Feature supported Feature supported
Contributing to Open Source Projects Feature supported Feature supported Feature supported
Non-enterprise organizations 1,
for up to 5 users
Feature supported Feature supported Feature supported
Enterprise Feature supported Feature supported
Integrated Development Environment Seventy-five percent feature support Seventy-five percent feature support One hundred percent feature support
Live Dependency Validation Feature supported
Architectural Layer Diagrams Feature supported
Architecture Validation Feature supported
Code Clone Feature supported
CodeLens Feature supported Feature supported Feature supported
Peek Definition Feature supported Feature supported Feature supported
Refactoring Feature supported Feature supported Feature supported
One-Click Web Deployment Feature supported Feature supported Feature supported
Model Resource Viewer Feature supported Feature supported Feature supported
Visualize solutions with Dependency Graphs and Code Maps Feature supported3 Feature supported3 Feature supported
Multi-Targeting Feature supported Feature supported Feature supported
Advanced Debugging and Diagnostics Fifty percent feature support Fifty percent feature support One hundred percent feature support
IntelliTrace Feature supported
Code Map Debugger Integration Feature supported
.NET Memory Dump Analysis Feature supported
Code Metrics Feature supported Feature supported Feature supported
Graphics Debugging Feature supported Feature supported Feature supported
Static Code Analysis Feature supported Feature supported Feature supported
Performance and Diagnostics Hub Feature supported Feature supported Feature supported4
Snapshot Debugger Feature supported
Time Travel Debugging (Preview) Feature supported
Testing Tools Twenty-five percent feature support Twenty-five percent feature support One hundred percent feature support
Live Unit Testing Feature supported
IntelliTest Feature supported
Microsoft Fakes (Unit Test Isolation) Feature supported
Code Coverage Feature supported
Unit Testing Feature supported Feature supported Feature supported
Cross-platform Development Fifty percent feature support Fifty percent feature support One hundred percent feature support
Embedded Assemblies Feature supported
Xamarin Inspector Feature supported
Xamarin Profiler Feature supported
Remoted iOS Simulator for Windows Feature supported Feature supported Feature supported
Share code between Android and iOS with Xamarin Feature supported Feature supported Feature supported
Native iOS and Android UI Designers Feature supported Feature supported Feature supported
Xamarin.Forms Feature supported Feature supported Feature supported
Collaboration Tools and Features One hundred percent feature support One hundred percent feature support One hundred percent feature support
PowerPoint Storyboarding Feature supported Feature supported Feature supported
Code Review Feature supported Feature supported Feature supported
Task Suspend/Resume Feature supported Feature supported Feature supported
Team Explorer (third-party development tools support) Feature supported Feature supported Feature supported
Visual Studio Live Share Feature supported Feature supported Feature supported
  1. สำหรับ บริษัท ที่มีจำนวน PC  มากกว่า 250 หรือ หรือมีรายได้มากกว่า 1 ล้านเหรียญสหรัฐ ต่อปี
  2. Windows Desktop, Universal Windows Apps, Web (ASP.NET), Office 365, Business Applications, Azure Stack, C++ Cross-Platform Library Development, Python, Node.js, .NET Core, Docker Tools
  3.  สามารถเปิด diagrams generated ใน Visual Studio editions เวอร์ชั่นอื่นในโหมดอ่านได้อย่างเดียว
  4. Includes Tier Interaction Profiling.

ข้อมูลอ้างอิงจาก https://visualstudio.microsoft.com/vs/compare/

วิธีทำให้ Visual Studio Code เปลี่ยนภาษาต่างด้าวได้

สำหรับใครที่ใช้งาน Visual Studio Code หรือ VsCode ในการอ่าน Source code ที่เป็นภาษาญี่ปุ่นหรือภาษาอื่นๆแล้วมักจะเจอตัวหนังสือเป็นภาษาต่างด้าว อ่านไม่ออกแบบนี้

ซึ่งสาเหตุนั้นเป็นเพราะว่าตัวไฟล์ source code มีการเข้ารหัส encode ไม่ถูกต้อง โดยในบทความนี้จะมาสอนวิธีการเปลี่ยน Encode ของโปรเจคของเราให้สามารถอ่านภาษาต่างด้าวนั้นได้

มาเริ่มกันที่ไปที่ File แล้วเลือก Preferences แล้วก็ Setting

แล้วเลือกไปที่ Workspace จากนั้นพิมพ์ Encode ในช่องการค้นหา Setting ได้เลย แล้วก็จะเจอ หัวข้อ Files: Encoding ให้เราเลือก Shiftjis (ในตัวอย่างเป็นไฟล์ภาษาญี่ปุ่น) หรือตัวเลือกที่ตรงกับไฟล์ที่ Encode ที่เราต้องการ

จากนั้นลองมาเปิดไฟล์ในโปรเจคของเราก็จะเห็นว่าสามารถอ่าน Comment ที่เป็นภาษาญี่ปุ่นออกแล้วละ

หากเราลองไปดูที่ไฟล์ Setting.json ใน Folder .vscode ก็จะเห็นว่ามีการ Setting File encoding ตามที่เรา Setting ไว้เลยละ

วิธีใช้ GCC กับภาษา C หลายๆไฟล์

วิธี Compile ภาษา C โดยใช้ GCC สำหรับในกรณีที่ไฟล์ .c หลายไฟล์ เป็นโปรเจคเดียวกัน สามารถใช้วิธี compile โดยใช้ GCC ได้ดังนี้

ขั้นแรกให้เรา Compile ไฟล์ .c แต่ละไฟล์ โดยใช้ –c เพื่อบอกว่า compile ไฟล์นี้เท่านั้น ไม่ต้อง link กับไฟล์อื่น

gcc -c ไฟล์ที่1.c
gcc -c ไฟล์ที่2.c

ไปเรื่อยๆ ขึ้นอยู่กับตามจำนวนไฟล์ .c

หลังจากนั้นเราก็จะได้ ไฟล์ object นามสกุล .o ออกมา เสร็จแล้วทำการ link ไฟล์ object แต่ละไฟล์เข้าด้วยกัน

gcc -o โปรแกรม.exe ไฟล์ที่1.o ไฟล์ที่2.o

ให้เราใส่ ไฟล์ .o ตามจำนวนไฟล์ .c ของโปรแกรมเรา

ตัวอย่าง สมมติว่ามีไฟล์
hellofunc.c

#include <stdio.h>
#include "hellomain.h"

void myPrintHello(void) {

  printf("Hello HAHAHA!\n");

  return;
}

hellomain.c

#include "hellomain.h"

int main() {
  // call a function in another file
  myPrintHello();

  return(0);
}

hellomain.h

void myPrintHello(void);

การใช้ GCC ถ้าเป็น windows

gcc -c hellofunc.c
gcc -c hellomain.c
gcc -o program.exe hellofunc.o hellomain.o


การใช้ GCC ถ้าเป็น linux

gcc -c hellofunc.c
gcc -c hellomain.c
gcc -o program hellofunc.o hellomain.o
./program

ก็จะได้ผลลัพธ์ตามรูป

วิธีใช้ GCC กับภาษา C ด้วย -Wall

สำหรับคำสั่งของ GCC ที่ใช้การ compile ใน ภาษา C ที่สำคัญและมีประโยชน์อีกคำสั่งนั้นก็คือ –Wall
โดย –Wall นั้นหมายความวว่าเราต้องการให้ GCC แจ้งเตื่อน Warning ทั้งหมด หรือ Show warning all นั้นเอง

ตัวอย่างของ การใช้ –Wall และผลลัพธ์ของการเตื่อน Warning

helloworld3.c

#include <stdio.h>
#include "helloworld3.h"

int main (void)
{
    int x;

    
    printf("%s\n", HELLO);
    return 0;
}

helloworld3.h

#define HELLO "HELLO WORLD 3"

จะเห็นว่าถ้าไม่ใช้ -Wall ก็จะไม่มีคำเตื่อนอะไรเลย

ส่วนถ้าใส่ -Wall ก็จะขึ้นดังรูป

จะเห็นว่ามี Warning บอกว่า 6:9 warning : unused variable ‘x’
นั้นหมายความว่า ไม่มีการใช้งานตัวแปร x โดยตัวเลข 6:9 นั้นเป็นการบอกตำแหน่งของ warning ที่ source code บรรทัดที่ 6 คอลัมน์ที่ 9 (นับเป็น space ก็จะได้ 9 space)

วิธีใช้ GCC กับภาษา C

วิธีการ Compile ภาษา C โดยใช้ Gnu GCC compilerในกรณีที่มีไฟล์ภาษา C หนึ่งไฟล์ สามารถ Compile ออกมาเป็นโปรแกรมได้โดยใช้คำสั่งตามนี้

ในกรณี Windows (compile เพื่อให้ output ออกมาเป็นไฟล์ exe)

gcc –o ชื่อโปรแกรม.exe ชื่อไฟล์..c

หรือ

gcc ชื่อไฟล์..c –o ชื่อโปรแกรม.exe

ในกรณี Linux (compile เพื่อให้ output เป็นไฟล์ที่ไม่ต้องมีนามสกุล หรือจะเป็นไฟล์ที่มีนามสกุล.out ก็ได้เช่นกัน)

gcc –o ชื่อโปรแกรม ชื่อไฟล์..c

หรือ

gcc –o ชื่อโปรแกรม.out ชื่อไฟล์..c

หรือ

gcc ชื่อไฟล์..c –o ชื่อโปรแกรม

หรือ

gcc ชื่อไฟล์..c –o ชื่อโปรแกรม.out

จะเห็นว่าสามารถสลับตำแหน่งการเรียงคำสั่งได้


ตัวอย่างเช่นถ้าเรามีไฟล์ helloworld.c

#include <stdio.h>

int main (void)
{
    printf("HELLO WORLD\n");
    return 0;
}

Compile helloworld.c ใน Windows

gcc –o helloworld.exe helloworld.c
helloworld.exe

Complie helloworld.c ใน Linux

gcc –o helloworld helloworld.c
./helloworld

ส่วนในกรณีที่ ไฟล์ C ของเรามีการ include header file เข้ามาด้วย เวลาใช้คำสั่ง gcc ก็ไม่ต้องสนใจไฟล์ header .h ให้เราทำการ compile แค่ไฟล์ .c ตามปกติ
ตัวอย่างเช่น
helloworld2.c

#include <stdio.h>
#include "helloworld2.h"

int main (void)
{
    printf("%s\n", HELLO);
    return 0;
}

helloworld2.h

#define HELLO "HELLO WORLD 2"

Complie helloworld.c ใน Windows

gcc –o helloworld2.exe helloworld2.c
helloworld2.exe

การเก็บ Code เก่าไว้ ในภาษา C

หากมีการแก้ไข Code บางส่วน แล้วเราต้องการที่จะเก็บ Code เก่าบางส่วนเอาไว้เพื่อเอาไว้อ้างอิง ในอนาคตในภาษา C ซึ่งมีอยู่หลายวิธี

หลายๆคนอาจจะใช้วิธีการ Block comment แต่การ Block comment นั้นมีข้อเสียตรงที่ หากใน Code ของเรามี Block comment อยู่ก็จะให้เกิด syntax error ได้ ตามตัวอย่างด้านล่างนี้

#include <stdio.h>

int main(void)
{

 
 /*   /* Month */
    printf("This month is May\n");

    printf("This month is Jul\n"); */
 

    /* Day of week */
    printf("This day is Monday\n");

    return 0;
}

อีกวิธีหนึ่งก็คือการใช้ #ifdef NOT_DEFINE แล้วปิดด้วย #endif ก็สามารถทำได้เช่นกัน แต่ก็มีข้อเสียตรงที่ต้องระวังหากมีใครไปเปิดปิด ค่า Define ของเรา ก็จะทำให้ code ที่เราปิดไว้ทำงานขึ้นมาได้

จึงมีอีกวิธีหนึ่งก็คือการใช้ #if 0 แล้วปิดด้วย #endif ซึ่ง compiler จะ compile #if 0 ออกมาเป็น เท็จเสมอทำให้ code ที่เราปิดไว้ไม่ถูก compile นั้นเอง
ตัวอย่างการใช้ #if 0

#include <stdio.h>

int main(void)
{
    #if 0
    /* Month */
    printf("This month is May\n");

    printf("This month is Jul\n");
    #endif

    /* Day of week */
    printf("This day is Monday\n");

    return 0;
}

แต่ข้อเสียของ #if 0 ก็มี นั้นคือ ไม่สามารถใช้กับ code ที่เขียนไม่ถูกต้องได้ เช่น การเขียนภาษาอื่นที่ไม่ใช่ภาษา C หรือ การใส่เครื่องหมาย double quote(“) หรือ single quote (‘) ที่ไม่ครบ หรือการใช้ block comment ที่ไม่ครบ block ก็จะทำให้เวลาใช้ #if 0 แล้วทำให้ compile แล้ว error
ตัวอย่าง

Double quote(“) ไม่ครบ

#include <stdio.h>

int main(void)
{

    #if 0
    /* Month */
    printf(This month is May\n");

    printf("This month is Jul\n");
    #endif

    /* Day of week */
    printf("This day is Monday\n");

    return 0;
}

Block comment ไม่ได้ปิดท้าย

#include <stdio.h>

int main(void)
{

    #if 0
    /* Month
    printf("This month is May\n");

    printf("This month is Jul\n");
    #endif

    /* Day of week */
    printf("This day is Monday\n");

    return 0;
}

อีกวิธีก็คือการใช้ Line comment ข้อเสียของวิธีนี้ก็คือ ต้องใช้ความสามารถของ IDE หรือ Text editor ช่วยในการ comment ในกรณีที่ code มีหลายๆบรรทัด ซึ่งส่วนใหญ่จะมีฟังชั่นเหล่านี้อยู่แล้ว
Line comment short cut ใน Sublime Text ก็คือ (Ctrl + /)
Line comment short cut ใน Notepad++ ก็คือ (Ctrl + k)
ตัวอย่าง Line comment

#include <stdio.h>

int main(void)
{


    // /* Month*/
    // printf("This month is May\n");

    // printf("This month is Jul\n");


    /* Day of week */
    printf("This day is Monday\n");

    return 0;
}

ดังนั้นหากจะต้องการที่จะเก็บ Code เก่าบางส่วนเอาไว้เพื่อเอาไว้อ้างอิง ก็ขอแนะนำให้ใช้ Line comment หรือหันมาใช้พวก Version control ดีกว่า

ขนาดของตัวแปรใน ภาษา C ในแต่ละ CPU

ขนาดของตัวแปรใน ภาษา C หรือ C++ นั้นจะขึ้นอยู่กับชนิดของ CPU และ Complier ซึ่งอาจจะเหมือนกันหรือต่างกันก็ได้ เรามาดูกันดีกว่าว่าแต่ละ CPU มีการกำหนดขนาดตัวแปรที่แตกต่างกันอย่างไร

ขนาดของตัวแปรใน x86

ขนาดของตัวแปร ใน CPU ARM 32 bit

อ้างอิงจาก ARM Compiler Reference

ขนาดของตัวแปรใน MCU TI MSP430

อ้างอิงจาก slaa534 MSP430 Embedded Application Binary Interface

จะเห็นได้ว่า แต่ละ CPU จะมีขนาดของตัวแปรที่กำหนดแตกต่างกันไป ดังนั้นการเขียนโปรแกรมในภาษา C หรือ C++ แล้วนำเอาไปใช้งานในแต่ละ CPU จึงต้องระมัดระวัง เนื่องจากขนาดของตัวแปรที่แตกต่างกันอาจจะทำให้โปรแกรมของเราทำงานได้ไม่ถูกต้องก็ได้

ค่าสูงสุดและต่ำสุดของตัวแปร Real ในภาษา C

เราสามารถหาค่าสูงสุดและต่ำสุดของตัวแปร ตัวเลขจำนวนจริง (Real) แต่ละชนิดในภาษา C ได้จากค่า Define ที่อยู่ใน ไฟล์ float.h

ตารางด้านล่างนี้แสดง Define ที่ใช้สำหรับกำหนดค่าสูงสุด (Max) หรือต่ำสุด (Min) และความละเอียด (Precision)

ซึ่งสามารถนำเอาค่า Define มา print แสดงค่าได้ โดย Include ไฟล์ float.h ดัง Source code ตัวอย่าง

#include <stdio.h> /* For command line input and output */
#include <float.h> /* For limits on floating-point types */

int main(void)
{
    printf("min float is %.6e\n", FLT_MIN);
    printf("max float is %.6e\n", FLT_MAX);
    printf("float provide %u decimal digits precision.\n\n", FLT_DIG);

    printf("min double is %.15e\n",DBL_MIN);
    printf("max double is %.15e\n", DBL_MAX);
    printf("double provide %u decimal digits precision.\n\n", DBL_DIG);

    printf("min long double is %.18Le\n", LDBL_MIN);
    printf("max long double is %.18Le\n", LDBL_MAX);
    printf("long double provide %u decimal digits precision.\n",LDBL_DIG);

    return 0;
}

จะได้ผลลัพธ์ดังนี้ (Windows 7 32 bit, gcc 4.9.2)

สำหรับใครที่ลองเอา Code ไปรันแล้วเจอค่าขึ้น -1.#QNAN e+000 ดังรูป

วิธีแก้ไขก็คือเวลาที่เรา Compile ให้กำหนด standard ด้วย เช่น –std=c99 เวลา compile กับ gcc

สำหรับคนที่ใช้ Code Block ก็ให้เข้าไป Setting ค่าที่ setting complier ให้ ติ๊กถูก “Have gcc follow the 1999 ISO C language standard [-std=c99]”