第2天 棧和寄存器

来源:http://www.cnblogs.com/yevgeny/archive/2016/06/06/5563365.html
-Advertisement-
Play Games

第2天 棧和寄存器 多文件編程 筆者在私下和很多C語言的愛好者和初學者交流的過程中發現,大家已經能夠使用C語言做出來很出色的程式了。但是這些出色的程式中的一部分竟然只有一個源文件。所以,筆者決定要介紹一下如何使用多個源文件進行編程。不得不說,多文件編程有非常多的優勢。比如在維護上非常方便,同時也給多 ...


第2天 棧和寄存器

多文件編程

筆者在私下和很多C語言的愛好者和初學者交流的過程中發現,大家已經能夠使用C語言做出來很出色的程式了。但是這些出色的程式中的一部分竟然只有一個源文件。所以,筆者決定要介紹一下如何使用多個源文件進行編程。不得不說,多文件編程有非常多的優勢。比如在維護上非常方便,同時也給多人合作提供了便利。當然,筆者我最喜歡多文件編程的一點就是因為它看起來舒服。接下來,我們就一起來學習如何進行多文件編程。

進入DEV-C++集成開發環境之後,在頂部菜單中找到“文件”→“新建”→“項目”。在彈出的對話框中選擇"空項目"(Empty Project),註意還需要選擇開發的語言並給項目起名。點擊確定後需要對工程文件進行保存。

圖

之後請在左側的項目管理中找到剛剛新建的項目,新建的項目預設有一個源代碼文件,請將它移除併在項目中添加我們在昨天編寫的源文件。

圖

接下來我們需要在我們的項目中新建一個源文件,並把它命名為 kia_style.h 實際上它是一個頭文件。這樣我們就可以把我們之前編寫的除了最基本框架的部分都扔到 kia_style.h 這個頭文件中。於是 kia_style.h 就變成了:

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>

#ifndef KIA_STYLE_H
#define KIA_STYLE_H

unsigned short kia_fc=7;
unsigned short kia_bc=0;

void kia_refreshcolor() {
    HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hCon,(kia_fc%16)|(kia_bc%16*16));
}

void kia_color(unsigned short c) {
    kia_fc=c;
    kia_refreshcolor();
}

void kia_out(char *str) {
    unsigned short kia_sfc=kia_fc;
    if(strcmp(str,"none")==0)
        kia_color(7);
    printf("%s",str);
    kia_color(kia_sfc);
}

void kia_outln(char *str) {
    unsigned short kia_sfc=kia_fc;
    if(strcmp(str,"none")==0)
        kia_color(7);
    printf("%s\n",str);
    kia_color(kia_sfc);
}

void kia_limout(unsigned char lim,char *str,char style) {
    unsigned char i=0,j=0,len=strlen(str);
    if(len<=lim) {
        kia_out(str);
        for(i=0; i<(lim-len); i++)
            kia_out(" ");
        if(style!=0)
            kia_outln("");
    }
    if(len>lim) {
        if(style==0) {
            for(i=0; i<(lim-3); i++)
                printf("%c",str[i]);
            kia_out("...");
        } else {
            while((j*lim+i)<len) {
                for(i=0; i<lim; i++) {
                    printf("%c",str[j*lim+i]);
                    if((j*lim+i)>=len)
                        break;
                }
                if(style==abs(style))
                    printf("\n");
                if((j*lim+i)<len)
                    for(i=0; i<abs(style); i++)
                        printf(" ");
                j++;
            }
            if(style!=abs(style))
                printf("\n");
        }
    }
}

void kia_tag(char *str) {
    strlwr(str);
    if(strcmp(str,"tip")==0) {
        kia_color(10);
        kia_limout(10,"tip",0);
    } else if(strcmp(str,"error")==0) {
        kia_color(12);
        kia_limout(10,"error",0);
    } else if(strcmp(str,"warning")==0) {
        kia_color(13);
        kia_limout(10,"warning",0);
    } else {
        kia_color(11);
        kia_limout(10,str,0);
        kia_color(14);
    }
}

#endif

這樣一來,主文件就會變得非常的簡單清爽。按照筆者的習慣,主文件被命名為 main.c

#include "kia_style.h"

int kia_end() {
    kia_tag("tip");
    kia_limout(69,"Press any key to return.",10);
    getch();
    kia_fc=7;
    kia_bc=0;
    kia_refreshcolor();
    return 0;
}

int main(int argc, char *argv[]) {
    SetConsoleTitle("kiasm virtual machine");
    kia_tag("tip");
    kia_limout(69,"test-00000-test-11111-test-22222-test-33333-test-44444-test-55555-test-66666-test",10);
    kia_tag("error");
    kia_limout(69,"test-00000-test-11111-test-22222-test-33333-test",10);
    kia_tag("warning");
    kia_limout(69,"test-00000-test-11111-test-22222-test-33333-test",10);
    kia_tag("test");
    kia_limout(69,"test-00000-test-11111-test-22222-test-33333-test",10);
    kia_tag("testtesttest");
    kia_limout(69,"none",10);
    return kia_end();
}

這裡有兩件事需要引起特別的註意。首先在 kia_style.h 頭文件中

#ifndef KIA_STYLE_H
#define KIA_STYLE_H

//省略程式塊

#endif

這裡#ifndef#define#endif都是預處理命令,它們的作用是避免頭文件中的函數和變數被重覆聲明。

其次,在主文件中只需要包括一個 kia_style.h 頭文件,因為主函數沒有直接調用其他的頭文件,在kia_style.h 頭文件中調用的其他頭文件應當在kia_style.h 頭文件中包含,而不是在主文件中包含。另外值得註意的是,由於 kia_style.h 頭文件是我們自行開發的頭文件,所以它要被雙引號包裹,而不是被尖括弧包裹。

現在可以點擊編譯並運行試試看,是不是得到了和昨天一模一樣的結果。

無類型語言的建立

雖然說在那些已經非常健壯的編程語言中無類型語言已經是過去時了。但是如果我們一開始就建立一種有類型語言的話,似乎會給我們製造編程語言的歷程帶來很多額外的負擔。所以,暫時來說筆者還是要建立一種無類型的語言,在後續的章節中我會告訴你,有類型語言是如何實現的。

所謂無類型語言並不是說一種數據類型都沒有的語言,它只有一種數據類型。這種數據類型可以根據大家的喜好來決定。筆者最喜歡的類型是無符號的字元型,即 unsigned char 。選擇這種類型作為無類型語言的唯一的數據類型的原因就是它很容易就能變成其他的類型。為我們後續創造有類型的編程語言提供了極大的便利。如果每一次都要寫 unsigned char 來定義這種數據類型未免太過於麻煩了。所以我們使用 typedefunsigned char 起一個別名供我們使用。這裡筆者起的名字是 kia_t

typedef unsigned char kia_t;

預知後事如何,請聽下回分解。關註我,第一時間獲得更新動態。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • XML是一種可擴展標記語言,它被設計用來傳輸和存儲數據。XML是各種應用程式之間進行數據傳輸的最常用的工具。它與Access,Oracle和SQL Server等資料庫不同,資料庫提供了更強有力的數據存儲和分析能力,例如:數據索引、排序、查找、相關一致性等,它僅僅是**存儲數據**。事實上它與其他數... ...
  • 知識點: 介紹Maven 本機搭建Maven環境 DEMO測試 本地倉庫遷出 Maven簡介: 百度百科: 說到底就是一個項目管理工具。 本機搭建Maven環境: Maven的環境需要jdk環境的支持,首先要保證本機上已經有jdk環境,並且環境變數配置成功。 下載地址:http://maven.ap ...
  • 通過配置文件的方式實現一個簡單的HelloWorld。 一、新建項目 1、新建動態web項目 2、命名工程springmvc-01 3、勾選"Generate web.xml deployment descriptor" 4、導入jar包 5、新建springmvc配置文件 6、命名配置文件spri ...
  • ...
  • Django 遵從 MVC 模型,並將其特色化為 MTV 模型。模型的核心是通過用戶訪問的 url 來指向處理的函數,而函數處理後返回相應的結果。所以url決定了用戶訪問的入口,另外表單處理的提交地址也需要指定的url。url是所有功能的入口,所以url的編寫就變得非常重要。 Django 的 ur ...
  • <?php //php操作memcache的使用測試總結--學習 //1 Memcache::connect; //$memcache = new Memcache; //$memcache->connect('127.0.0.1',11211) or die("鏈接失敗!"); //2 Memca ...
  • 某個子站是php寫的,訪問的時候nginx時不時會冒出現502錯誤,高峰時更頻繁,檢查php-fpm的日誌發現大量的 child exited on signal 7 (SIGBUS),並且和accesslog里的502時間完全吻合,排除了php進程過載的可能,然後又排除了apc的嫌疑。 既然php ...
  • ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...