當前位置:首頁 » 編程語言 » c語言slave什麼意思
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言slave什麼意思

發布時間: 2022-12-09 17:29:57

❶ 設置C就是Master"(主盤)和"Slave"(從盤)在什麼地方

不是設置c盤是主從盤而是設第一塊硬碟是主從盤
你可以將c盤設為主分區

❷ NIS的信息服務

(Network Information Service)
NIS是Sun Microsystem於1985年發布的一項目錄服務技術(Diretory Service),用來集中控制幾個系統管理資料庫的網路用品。NIS簡化了UNIX和LINUX桌面客戶的管理工作,客戶端利用它可以使用中心伺服器的管理文件。桌面系統的用戶無需建立他們自己的/etc/passwd,他們只簡單的使用維護在NIS伺服器的文件即可。 提到NIS不得不先說明一下WINDOWS2000的域控制器,在區域網內有一台WIN2000域控制器,下面有一些機器加入到這個域中,在下的機器登錄時,有一個選項是選擇登入到本機還是登入到域內,登入本地的密碼有本機控制,但是如果登入域內,密碼由域控制器負責管理。
LINUX也是操作系統,跟WIN2000沒有本質的區別,所以仔細讀上段話,就能理解NIS是原理是什麼樣了,這時出現了一個重要的文件/etc/nsswitch.conf 事實上, NIS 的運作流程一點也不困難。一個不是很龐大的網路中,大約會有一部NIS Server ,並且同時有很多部的 NIS Client 。 NIS Server 與 NIS Client 的架構,整體架構有點像底下的圖示:

如圖示。NIS 提供的 /etc/passwd,/etc/group 以及 /etc/hosts 等 ASCII 格式檔案的信息, NIS Server 會將前述幾個ASCII 檔案內容復製成為 DBM 資料庫格式的檔案,當用戶藉由個人計算機聯機到 NISClient主機嘗試登入時, NIS Client 將會到 NIS Server 去查尋該用戶的賬號與密碼,以做為用戶登入驗證的依據。
NIS Server 將自己系統內的 /etc/passwd, /etc/group,/etc/hosts 等製作成為 DBM 的資料庫格式檔案;
NIS Client 若有用戶登入的要求時,會前往 NIS Server搜尋資料庫裡面數據做為驗證用。
每次更動 NIS Server 上面的用戶數據時,則 NIS Server需要重新製作 DBM 資料庫檔案!
需要設定的有:NIS Server 端;
NIS Client 端。 NIS Server 在整個網域之中,一般比較小型的網域常見的方法。萬一,如果網域裡面有幾乎100 部以上的主機,這個時候,只有一部NIS Server 可能無法提供快速的數據查尋與響應的狀態!這時需要 NIS Sever的 master 與 slave 的架構。
slave藉由將來自 master主機的數據加以更新到自己的資料庫當中,並且提供與master 相同的查尋功能!這個 NIS 的 master 與 slave 架構則完全相同。NIS Server 的 master 先將自己的賬號、密碼相關檔案製作成為資料庫檔案(databasefile);NIS Server 的 master 將自己的資料庫檔案傳送到 slave上面;NIS Server 的 slave 接收來自『信任的 NIS Server master主機』的數據後,更新自己的資料庫,使自己的資料庫與 master 主機的數據同步;網域當中的所有 NIS Client 查尋 NIS Server 時,會找尋『最先回應的那一部NIS 主機的資料庫內容』。
所以,我們可以知道的是,NIS 的 master 與 slave 架構主要在分散查尋 NIS時候的主機負荷,因此,除非您的網域真的很大,否則是沒有必要架設 NIS Slave與 master 的架構的啦!底下我們沒有架設 master 與 slave 。只有一部主要的master 而已。 NIS是一個客戶機/伺服器系統,ypbind是定義NIS伺服器的客戶端進程。一旦確定了伺服器位置,客戶機綁定到了伺服器上,所以客戶端的住處查詢都發往伺服器。ypserv是回答客戶端查詢的伺服器進程。
基本上, NIS 建議直接使用原版光碟上面給我們的 RPM 來安裝即可。
yp-tools :提供 NIS 相關的查尋指令功能
ypbind :提供 NISClient 端的設定套件
ypserv :提供 NISServer 端的設定套件
portmap :就是 RPM 一定需要的數據啊! NIS Server 主要以 ypserv 這個套件提供的數據來進行設定,主要內容有:
/etc/ypserv.conf :就是主要的設定檔了
/usr/sbin/ypserv :主要的服務(daemon)執行檔
/usr/sbin/rpc.yppasswdd:RPC的服務啰!
/usr/sbin/rpc.ypxfrd :同樣的, RPC 的服務啰!
/usr/lib/yp/ypinit :建立 NIS 資料庫的執行程序
所以,事實上我們最重要的就是設定 ypserv.conf 這個檔案而已啦!至於 RPC的設定,就直接啟動他即可!另外,還有 yp-tools 會提供的相關數據喔:
/usr/bin/yppasswd :更改你在NIS database (NIS Server 所製作的資料庫) 的密碼
/usr/bin/ypchsh :同上,但是是更改shell
/usr/bin/ypchfn :同上,但是是更改一些使用者的訊息! 進程ypbind這客記機的NIS域定位伺服器,NIS域包括所有NIS伺服器和客戶機。它與DNS不同,盡管有些管理員將NIS域名等同於DNS的域名。NIS域名只對那NIS伺服器和客戶機起作用。
有兩種方式配置NIS域名:
nisdomainname 定義顯示NIS域名
yp.conf文件配置NIS域名。
#nisdomainname gogo
#nisdomainname
gogo
默認地,ypbind使用nisdomainname命令返回NIS域名,向NIS伺服器發出請求時在網路內廣播該地址。
yp.conf文件
/etc/yp.conf定義了yp.conf配置。如果找不到yp.conf文件,ypconf進程使用nisdomainname 命令返回的NIS域名,廣播定位NIS伺服器。ypbind將綁定到第一個相應請求的伺服器上。
ypserver hostname
domain nisdomain broadcast | server hostname
========
hostname,nisdomain字元為變數。
使用ypserver配置選項為客戶機指定伺服器。yp.conf文件包括ypserver選項時,客戶機使用命令nisdomainname返回的NIS域名,向ypserver命令的hostname欄位指定的伺服器發出請求。/etc/hosts文件中必須包含該主機的IP地址,還記得我說過什麼了嗎,DNS是取代的HOSTS的,在DNS中設定也是可以的。ypserver選項強制客戶機連接到特定的伺服器上。
在yp.conf文件中使用domain選項定義了NIS域名,指出客戶機是廣播定位還是直接向伺服器發送請求。
example:
#/etc/yp.conf
#
domain first server jh
=========
first作為域名,jh是這個域的伺服器 jh在hosts中必須有相對應的IP地址
或者jh IN A 192.168.1.1還記得這條指令是干什麼的嗎?
------------------------
創建NIS伺服器
安裝ypserv
rpm -ivh ypserv*
-----------
NIS伺服器提供的資料庫,稱為NIS映射表.
創建獨立伺服器
如果用戶只有一個NIS域伺服器,建立獨立伺服器,如果用戶NIS域中有多個伺服器,就需要選擇其中一個作為該域的主伺服器。其他作為從伺服器。
用戶可以使用make命令初始化獨立伺服器,建立NIS映射表,文件/var/yp/Makefile包含了創建資料庫的命令。
example:
#nsidomainname first
#cd /var/yp
#make
gamke[1]:Entering directory '/var/yp/terns'
Updateing passd.byname......
Updateing passwd.byuid...... 使用ypinit命令初始化主伺服器,常見NIS映射表。默認地.ypinit同make命令給出的操作一樣。要創建相對於從伺服器的主伺服器,用戶需要編輯/var/yp/Makefile文件。在Makefile文件中找到NOPUSH設置為NOPUSH=false.
修改後,運行ypinit -m
exmpale:
#nisdomwiname first
#cd /var/yp
#/usr/lib/yp/ypinit m
...........
next host to add:1111.first .my home.c om
next host to add:2222.first .my home. c om
..............
............
..............
is this correct? [y/n]y
..........
.........
updateing passwd.byname.........
.............
..........
...........
從伺服器配置比主伺服器簡單。主伺服器保存了所有的映射表。從伺服器只需知道哪個是主伺服器即可。ypinit -s 配置從伺服器。
example:
#/usr/lib/yp/ypinit -s salve
salve的IP地址也必須保存在hosts中。
----------
安全性
用戶可以在/var/yp/securenets文件中定義伺服器的安全性能。
example:
255.255.255.0 192.168.1.0
授權192.168.1.0子網的用戶可以訪問伺服器。
-----------------
ypserv.conf文件
用戶必須使用securenets文件,未必用ypserv.conf定義安全性。
語法如下:
host:map:security:[mangle[]]
欄位如下
host 授權或禁止訪問的計算機,它由地址/掩碼對確定.例如 192.168.1.0/255.255.255.0 . *表示所有主機
map 該欄位表示訪問的NIS映射表項名稱。例如:passwd.byuid。*表示映射表中所有的欄位都可用。
security 授權訪問類型
none 允許訪問,不加強安全性。
port 允許特權埠訪問。只接收源埠小於1024的連接。
deny禁止訪問。
des 訪問時需要數字加密標准(DES)認證。
[mangle[]] 指定應該在發出響應之前用「X」覆蓋掉的欄位(不明白)
example:
# Host : MAP : Security : mangle
192.168.1.0/255.255.255.0 : * :none :no
* :* :deny :no
啟動伺服器
/etc/init.d/ypserv restart
啟動NIS客戶端
/etc/init.d/ypbind restart
測試NIS
NIS客戶端應該綁定到伺服器。ypwhich命令可以檢測客戶端是否正確的連接到伺服器。
如果客戶機正確的綁定到伺服器,用ypcat檢測伺服器提供的信息。
NIS與DNS是兩會事,大家一定要搞清楚。雖然都有可能涉及到域名。但確實是兩會事,他們之間會有一些連系。但絕不可以混在一起。切記,切記。
====================================
nsswitch.conf文件
nsswitch.conf文件不僅能處理主機表和DNS之間的優先次序,還能處理其它的問題。它為幾個不同的系統管理資料庫定義來源(多看幾篇這句話,「幾個不同的系統管理資料庫」,可以是DNS,NIS,大家想一想)
由nsswitch.conf控制的資料庫
alias EMAIL別名
ehters 用於RARP的乙太網地址。
hosts主機名和IP地址
password 用戶帳號信息。
還有許多,沒有列出來。
使用不帶NIS的nsswitch.conf example:
password: files
shadow: files
...........
hosts: dns files
#這句很重要,dns在先,files在後,這里的files指的是/etc/hosts文件,如果有客戶端查詢的時候,先找dns,再找files。順序很重要。
aliases: files
.........
.........
.........
使用帶NIS的nsswitch.conf example:
hosts: files nis dns
protocols: nis files
.........
........
........
控制選擇過程
nsswitch.conf文件提供了幾個可用於查詢測試的狀態關鍵字:
success(成功)查詢返回所期望的結果。該狀態的預設的動作是返回結果給提交查詢的應用程序(想一下,在我的DNS第二講,說到解析器,就可以是提交查詢的應用程序,不過他是DNS查詢是了),然後退出查詢過程。
nofound(沒有找到) 雖然查詢工作正常,但所期望值沒有找到。預設的動作是查詢下一行的源。
unavail(不可用) 提交查詢的源不可用。例,名稱伺服器沒有運行。
tryagain(重度) 源暫時不可用。預設的動作是繼續向下一個源提交查詢。
有兩個關鍵字可以識別預設的動作:return和continue。return告訴解析器返回值給應用程序並結束查詢。continue告訴解析器繼續向下一個源提交查詢。
狀態和動作關鍵字可以結合起來,加到nsswitch.conf文件的源單中,以控制查詢過程何時移到下一個源。
狀態檢查的語法是:
[ ( ! ? status=action ) + ]
問號(?)代表任何狀態值;嘆號(!)對狀態值取反。!SUCCESS是不成功的意思。方括弧[]用於包括整個條件語句。圓括弧()是可選的,只用來包含每個測試條件,可以有多個條件,每個條件用圓括弧包含,之間用加號連接。
例如:
[ ( NOFOUND=RETURN ) + ( TRYAGAIN+TRETURN) ]
其實就是c語言中的「與」「或」「非」的關系。
下面是nsswitch.conf中的主機一行:
hosts: dns [ !UNAVAIL=return ] files
說明了UNAVAIL之外的所有狀態,解析器應該將返回值給應用程序,然後退出。
只有當DNS名稱伺服器沒有運行的時候,解析器才能向主機表查詢。如果有條件語句改變,預設的動作卞會起作用,UNAVAI的預設動作是continue。
nsswich.conf文件已經取代了hosts.conf,因為它可以提供更多的資源控制方式。LINUX系統中通常這兩個文件都有,但實際上起作用的是nsswitch.conf文件。

❸ C語言中##什麼意思,

##在C/C++中具有連接字元串的作用。例如:
執行完A ## B後變為AB(連接A和B並去掉空格)。

下面通過具體實例來說明##的工作原理:

假設程序中已經定義了這樣一個帶參數的宏:
#define paster( n ) printf( "token" #n " = %d", token##n )
同時又定義了一個整形變數:
int token9 = 9;
現在在主程序中以下面的方式調用這個宏:
paster(9);
那麼在編譯時,上面的這句話被擴展為:
printf( "token" "9" " = %d", token9 );
注意到在這個例子中,paster(9);中的這個」9」被原封不動的當成了一個字元串,與」token」連接在了一起,從而成為了token9,而#n也被」9」所替代。
可想而知,上面程序運行的結果就是在屏幕上列印出token9=9

❹ 高分懸賞急求哪位單片機C語言編程高手幫我翻譯這個程序,由於要提問到每句,請務必能幫我每句都解釋哦!

你這個也太長了, 是個gpio 模擬 i2c 匯流排的吧? 問題一個一個得問吧,不然怎麼回答。

❺ 主程序的名詞解釋

1、計算機基本的被獨立提供出來的程序,它能夠調用子程序,而不被任何子程序所調用。它是計算機程序的中心部分。
2、包含調用子程序的程序稱為主程序。主程序不能被它的子程序調用。主程序和子程序兩者是相對的。比如,某主程序在某個過程中調用了子程序A,子程序A在某個過程中又調用了子程序B,那麼A對主程序而言是子程序,但對B而言它又成了主程序。 1、一個WindOW程序必須有一個名為WinMain的主函數也稱為主程序.在傳統的Windows程序設計中WindOW應用程序由主程序、窗口函數和模塊定義文件三部分組成
2、2.子程q的概念子程序指的是可以多次調用的一段程序而調用子程序的程序稱為主程序.在使用於程序時要求主程序應有相應的調用指令使程序能夠轉人子程序執行而於程序的最後一條指令應是返回指令使程序能夠返回到主程序調用指令的下一條指令接著執行
3、其中的主程序是指主流程程序它應包含整機的正常開停機條件、緊急停止條件、動力監視、安全條件等.子程序包括各部分動作的手動程序和自動程序如單手徐敷自動程序、單手塗出手動程序、雙手塗出自動程序等
4、這里的「主程序」是指調用當前子程序的上一級程序.它可能是真正意義上的主程序,也可能是某一級子程序,應根據具體情況而定
5、我們把調用子程序而本身不被調用的程序稱為主程序.在主程序的若乾地方可以對它調用,子程序結束時返回主程序.不僅主程序可以調用子程序,子程序也可以調用子程序,這稱為子程序的嵌套調用
6、程序主部在QuickBASIC和FORTRAN語言中稱為主程序,在C語言中稱為主函數.模塊結構在QuickBASIC中稱為過程,在FORTRAN中稱為子程序,在C中稱為函數
7、調用第一層子程序的指令所在的主程序第一層第二層第三層第四層圖1子程序調用格式Fig.1111eformatOfcallingsub--program加工程序稱為主程序
8、其中數據分析和波浪生成軟體包又稱為主程序,包含8個不同功能的程序組,共有150多個應用程序,可滿足水工實驗數據分析處理的各種需要
9、這種模式可以進一步地劃分為兩類:主從(masterslave)或主機節點(hostnode)模式:它有一個獨立的控製程序稱為主程序,負責:1)申請和釋放處理器,載入節點程序
10、驅動模塊被稱為「主程序」,它接收測試用例數據並將這些數據傳遞到被測模塊,接著調用被測模塊.THrun自動為』.c源文件產生一個sequence(序列文件,它包含驅動模塊)
11、驅動模塊在大多數場合稱為「主程序」,他接收測試數據並將這些數據傳遞到被測模塊,被測試模塊被調用後,「主程序」發送「進入退出」消息

❻ 詳解Redis 主從復制及主從復制原理

Redis是一個開源的使用ANSI C語言編寫、支持網路、可基於內存亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持。從2013年5月開始,Redis的開發由Pivotal贊助。

概述

在現有企業中80%公司大部分使用的是redis單機服務,在實際的場景當中單一節點的redis容易面臨風險。

2、容量瓶頸。 當我們有需求需要擴容 Redis 內存時,從 16G 的內存升到 64G,單機肯定是滿足不了。當然,你可以重新買個 128G 的新機器。

解決辦法

要實現分布式資料庫的更大的存儲容量和承受高並發訪問量,我們會將原來集中式資料庫的數據分別存儲到其他多個網路節點上。

Redis 為了解決這個單一節點的問題,也會把數據復制多個副本部署到其他節點上進行復制,實現 Redis的高可用,實現對數據的冗餘備份,從而保證數據和服務的高可用。

主從復制

什麼是主從復制

主從復制,是指將一台Redis伺服器的數據,復制到其他的Redis伺服器。前者稱為主節點(master),後者稱為從節點(slave),數據的復制是單向的,只能由主節點到從節點。

默認情況下,每台Redis伺服器都是主節點;且一個主節點可以有多個從節點(或沒有從節點),但一個從節點只能有一個主節點。

主從復制的作用

1、數據冗餘: 主從復制實現了數據的熱備份,是持久化之外的一種數據冗餘方式。

2、故障恢復: 當主節點出現問題時,可以由從節點提供服務,實現快速的故障恢復;實際上是一種服務的冗餘。

3、負載均衡: 在主從復制的基礎上,配合讀寫分離,可以由主節點提供寫服務,由從節點提供讀服務(即寫Redis數據時應用連接主節點,讀Redis數據時應用連接從節點),分擔伺服器負載;尤其是在寫少讀多的場景下,通過多個從節點分擔讀負載,可以大大提高Redis伺服器的並發量。

4、讀寫分離: 可以用於實現讀寫分離,主庫寫、從庫讀,讀寫分離不僅可以提高伺服器的負載能力,同時可根據需求的變化,改變從庫的數量。

5、高可用基石: 除了上述作用以外,主從復制還是哨兵和集群能夠實施的基礎,因此說主從復制是Redis高可用的基礎。

主從復制啟用

從節點開啟主從復制,有3種方式:

1、配置文件: 在從伺服器的配置文件中加入 slaveof<masterip><masterport>。

2、啟動命令: redis-server啟動命令後加入 --slaveof<masterip><masterport>。

3、客戶端命令: Redis伺服器啟動後,直接通過客戶端執行命令 slaveof<masterip><masterport>,則該Redis實例成為從節點。

通過 info replication 命令可以看到復制的一些信息。

主從復制原理

主從復制過程大體可以分為3個階段:連接建立階段(即准備階段)、數據同步階段、命令傳播階段。

在從節點執行 slaveof 命令後,復制過程便開始運作,下面圖示可以看出復制過程大致分為6個過程。

主從配置之後的日誌記錄也可以看出這個流程。

1、保存主節點(master)信息

執行 slaveof 後 Redis 會列印如下日誌:

2、從節點與主節點建立網路連接

從節點(slave)內部通過每秒運行的定時任務維護復制相關邏輯,當定時任務發現存在新的主節點後,會嘗試與該節點建立網路連接。

從節點與主節點建立網路連接。

從節點會建立一個 socket 套接字,從節點建立了一個埠為51234的套接字,專門用於接受主節點發送的復制命令。從節點連接成功後列印如下日誌:

如果從節點無法建立連接,定時任務會無限重試直到連接成功或者執行 slaveofnoone 取消復制。

關於連接失敗,可以在從節點執行 info replication 查看 master_link_down_since_seconds 指標,它會記錄與主節點連接失敗的系統時間。從節點連接主節點失敗時也會每秒列印如下日誌,方便發現問題:

3、發送 ping 命令

連接建立成功後從節點發送 ping 請求進行首次通信, ping 請求主要目的如下:

如果發送 ping 命令後,從節點沒有收到主節點的 pong 回復或者超時,比如網路超時或者主節點正在阻塞無法響應命令,從節點會斷開復制連接,下次定時任務會發起重連。

從節點發送的 ping 命令成功返回,Redis 列印如下日誌,並繼續後續復制流程:

4、許可權驗證

如果主節點設置了 requirepass 參數,則需要密碼驗證,從節點必須配置 masterauth 參數保證與主節點相同的密碼才能通過驗證。如果驗證失敗復制將終止,從節點重新發起復制流程。

5、同步數據集

主從復制連接正常通信後,對於首次建立復制的場景,主節點會把持有的數據全部發送給從節點,這部分操作是耗時最長的步驟。

6、命令持續復制

當主節點把當前的數據同步給從節點後,便完成了復制的建立流程。接下來主節點會持續地把寫命令發送給從節點,保證主從數據一致性。

作者:LoyaltyLu

鏈接:https://segmentfault.com/a/1190000018268350

❼ C語言數組的聲明問題

你這個數組的大小是根據上面函數的返回值決定的, 是需要程序在運行時動態分配的,
動態分配使用指針,具體方法:
uint16 *pretData = (uint16 *)malloc(sizeof(uint16) * length);
使用:
*(pretData + i) 或者 pretData[i]

❽ 請用C語言編寫:

我用一個類似的不過我沒看明白
#include <stdio.h>
#include <stdlib.h>
#define maxloop 100 //最大層數,對於不同的擴展方法自動調整取值
#define pristnum 3
#define slavenum 3
struct SPQ
{
int sr,pr; //船運行一個來回後河右岸的野人、傳教士的人數
int sl,pl; //船運行一個來回後河左岸的野人、傳教士的人數
int ssr,spr; //回來(由左向右時)船上的人數
int sst,spt; //去時(由右向左時)船上的人數
int loop; //本結點所在的層數
struct SPQ *upnode ,*nextnode;//本結點的父結點和同層的下一個結點的地址
}spq;
int loopnum;//記錄總的擴展次數
int openednum;//記錄已擴展節點個數
int unopenednum;//記錄待擴展節點個數
int resultnum;
struct SPQ *opened;
struct SPQ *oend;
struct SPQ *unopened;
struct SPQ *uend;
struct SPQ *result;
void initiate();
void releasemem();
void showresult();
void addtoopened(struct SPQ *ntx);
int search();
void goon();
int stretch(struct SPQ* ntx);
void recorder();
void main()
{
int flag; //標記擴展是否成功
for( ; ; )
{
initiate();
flag = search ();
if(flag == 1)
{
recorder();
releasemem();
showresult();
goon();
}
else
{
printf("無法找到符合條件的解");
releasemem();
goon();
}
}
}
void initiate()
{
int x;
char choice;
uend = unopened = (struct SPQ*)malloc(sizeof(spq));
if(uend==NULL)
{
printf("\n內存不夠!\n");
exit(0);
}
unopenednum=1;
openednum=0;
unopened -> upnode = unopened; //保存父結點的地址以成鏈表
unopened -> nextnode = unopened;
unopened -> sr = slavenum;
unopened -> pr = pristnum;
unopened -> sl = 0;
unopened -> pl = 0;
unopened -> sst = 0;
unopened -> spt = 0;
unopened -> ssr = 0;
unopened -> spr = 0;
unopened -> loop = 0;
printf("題目:設有n個傳教士和m個野人來到河邊,打算乘一隻船從右岸到左岸去。\n");
printf("該船的負載能力為兩人。在任何時候,如果野人人數超過傳教士人數,野人\n");
printf("就會把傳教士吃掉。他們怎樣才能用這條船安全的把所有人都渡過河去?\n");
printf("\n默認的n、m值皆為3\n");
for(;;)
{
printf("\n是否修改?(Y/N)");
scanf("%s",&choice);
choice=toupper(choice);
if(choice=='Y')
{
printf("\n請輸入傳教士人數");
for(;;)
{
scanf("%d",&x);
if(x>0)
{
unopened -> pr = x;
break;
}
else printf("\n輸入值應大於0!\n請重新輸入");
}
printf("\n請輸入野人人數");
for(;;)
{
scanf("%d",&x);
if(x>0)
{
unopened -> sr = x;
break;
}
else printf("\n輸入值應大於0!\n請重新輸入");
}
break;
}
if(choice=='N')break;
}

}
int search()
{
int flag;
struct SPQ *ntx; //提供將要擴展的結點的指針
for( ; ; )
{
ntx = unopened; //從待擴展鏈表中提取最前面的一個
if(ntx->loop == maxloop)
return 0;
addtoopened(ntx); //將ntx加入已擴展鏈表,並將這個節點從待擴展鏈表中去掉
flag = stretch(ntx); //對ntx進行擴展,返回-1,0,1
if(flag == 1)
return 1;
}
}
int stretch(struct SPQ *ntx)
{
int fsr , fpr ; //在右岸上的人數
int fsl , fpl ; //在左岸上的人數
int sst , spt ; //出發時在船上的人數
int ssr , spr ; //返回時船上的人數
struct SPQ *newnode;
for (sst = 0 ; sst <= 2 ; sst++) //討論不同的可能性並判斷是否符合條件
{
fsr = ntx -> sr;
fpr = ntx -> pr;
fsl = ntx -> sl;
fpl = ntx -> pl;
if ((sst <= fsr) && (( 2 - sst) <= fpr))//滿足人數限制
{
spt = 2 - sst;
fsr = fsr - sst;
fpr = fpr - spt;
if((fpr == 0) && (fsr == 0))//搜索成功
{
newnode = (struct SPQ*) malloc (sizeof(spq));
if(newnode==NULL)
{
printf("\n內存不夠!\n");
exit(0);
}
newnode -> upnode = ntx; //保存父結點的地址以成鏈表
newnode -> nextnode = NULL;
newnode -> sr = 0;
newnode -> pr = 0;
newnode -> sl = opened -> sr;
newnode -> pl = opened -> pr;
newnode -> sst = sst;
newnode -> spt = spt;
newnode -> ssr = 0;
newnode -> spr = 0;
newnode -> loop = ntx -> loop + 1;
oend -> nextnode = newnode;
oend = newnode;
openednum++;
return 1;
}
else if ((fpr - fsr) * fpr >= 0) //判斷是否滿足傳教士人數必須大於或等於野人人數
{
fsl = fsl + sst;
fpl = fpl + spt;
for (ssr = 0 ; ssr <= 1 ; ssr++) //返回
{
int ffsl , ffpl;
if ((ssr <= fsl) && ((1 - ssr) <= fpl))
{
spr = 1 - ssr;
ffsl = fsl - ssr;
ffpl = fpl - spr;
if ((ffpl - ffsl) * ffpl >= 0)
{ //若符合條件則分配內存並付值
int ffsr , ffpr;
ffsr = fsr + ssr;
ffpr = fpr + spr;
newnode = (struct SPQ*) malloc (sizeof(spq));
if(newnode==NULL)
{
printf("\n內存不夠!\n");
exit(0);
}
newnode -> upnode = ntx; //保存父結點的地址以成鏈表
newnode -> sr = ffsr;
newnode -> pr = ffpr;
newnode -> sl = ffsl;
newnode -> pl = ffpl;
newnode -> sst = sst;
newnode -> spt = spt;
newnode -> ssr = ssr;
newnode -> spr = spr;
newnode -> loop = ntx -> loop + 1;
uend -> nextnode = newnode;
uend = newnode;
unopenednum++;

}
}
}
}
}
}
return 0;
}
void addtoopened(struct SPQ *ntx)
{
unopened = unopened -> nextnode;
unopenednum--;
if (openednum == 0 )
oend = opened = ntx;
oend -> nextnode = ntx;
oend = ntx;
openednum++;
}
void recorder()
{
int i , loop;
struct SPQ *newnode;
struct SPQ *ntx;
loop = oend -> loop;
ntx = oend;
resultnum = 0;
for( i = 0 ; i <= loop ; i++ )
{
newnode = (struct SPQ*) malloc (sizeof(spq));
if(newnode==NULL)
{
printf("\n內存不夠!\n");
exit(0);
}
newnode -> sr = ntx -> sr;
newnode -> pr = ntx -> pr;
newnode -> sl = ntx -> sl;
newnode -> pl = ntx -> pl;
newnode -> sst = ntx -> sst;
newnode -> spt = ntx -> spt;
newnode -> ssr = ntx -> ssr;
newnode -> spr = ntx -> spr;
newnode -> nextnode = NULL;
ntx = ntx -> upnode;
if(i == 0)
result = newnode;
newnode -> nextnode = result;
result = newnode;
resultnum++;
}
}
void releasemem()
{
int i;
struct SPQ* nodefree;
for ( i = 1 ; i < openednum ; i++ )
{
nodefree = opened;
opened = opened -> nextnode;
free(nodefree);
}
for ( i = 0 ; i < unopenednum ; i++ )
{
nodefree = unopened;
unopened = unopened -> nextnode;
free(nodefree);
}
}
void showresult()
{
int i;
int fsr , fpr ; //在右岸上的人數
int fsl , fpl ; //在左岸上的人數
struct SPQ* nodefree;
printf("%d個傳教士",result -> pr);
printf("%d個野人",result -> sr);
printf("%d個傳教士",result -> pl);
printf("%d個野人",result -> sl);
for ( i = 1 ; i < resultnum ; i++ )
{
nodefree = result;
result = result -> nextnode;
free(nodefree);
printf("\n\n\t左岸人數 船上人數及方向 右岸人數\n");
printf("第%d輪\n",i);
fpl = result -> pl - result -> spt + result -> spr;
fpr = result -> pr - result -> spr;
fsl = result -> sl - result -> sst + result -> ssr;
fsr = result -> sr - result -> ssr;
printf("傳教士%8d%8d\t<-\t%8d\n",fpl,result -> spt,fpr);
printf("野 人%8d%8d\t<-\t%8d\n",fsl,result -> sst,fsr);
printf("傳教士%8d%8d\t->\t%8d\n",result -> pl,result -> spr,result -> pr - result -> spr);
printf("野 人%8d%8d\t->\t%8d\n",result -> sl,result -> ssr,result -> sr - result -> ssr);
}
printf("\n全體傳教士和野人全部到達對岸");
free(result);
}
void goon()
{
char choice;
for(;;)
{
printf("是否繼續?(Y/N)\n");
scanf ("%s" , &choice);
choice=toupper(choice);
if(choice=='Y')break;
if(choice=='N')exit(0);
}
}

❾ #在c語言中是什麼意思

##用來連接前後兩個參數,把它們變成一個字元串。
舉例說:
#define
Conn(x,y)
x##y
int
n
=
Conn(123,456);
結果就是n=123456;
char*
str
=
Conn("asdf",
"adf")結果就是
str
=
"asdfadf";
你給出的宏
SHORT_REC_ADR_INIT(6)相當於{ad_rec[6].slave_address
=
SPI_AD_DATA_6_BASE;