電子發燒友網 > 嵌入式技術 > 正文

嵌入式世界里,堆棧的作用和意義

2020年02月06日 15:57 ? 次閱讀

棧這種結構在嵌入式里其實是非常常用的,比如函數調用與返回就是典型的棧應用,雖然很多時候棧都是?CPU?系統在自動管理,我們只需要在鏈接文件里分配棧大小以及棧存放位置,但稍微了解一下棧的原理會更加利于我們去理解嵌入式代碼執行機制,以及幫助我們進一步去調試。

1. 何為堆棧?

堆?HEAP?與棧 STACK 是兩個不同概念,其本質上都是一種數據結構。
  

棧是一種按數據項排列的數據結構,只能在一端(棧頂 top)對數據項進行插入和刪除,其符合后進先出(Last-In / First-Out)原則。棧(os)一般是由編譯器自動分配釋放,其使用的是一級緩存。
  

堆也是一種分配方式類似于鏈表的數據結構,其可以在任意位置對數據項進行操作。堆(os)一般由程序員手動分配釋放,其使用的是二級緩存。
  

在嵌入式世界里,堆棧一般指的僅是棧。

2. 作用與意義

MCU 中,棧這種結構一般被 cpu 和 os 所使用。
  

在 cpu 裸機中使用情況分兩種:一、主動進行函數調用時,STACK 用以暫存下一條指令地址、函數參數、函數中定義的局部變量;二、硬中斷來臨時,暫存當前執行的現場數據(下一條指令地址、各種緩存數據),中斷結束后,用以恢復。
  

含羞草 在 os 中使用時,硬棧的使用同 cpu 裸機;但 os 一般會為每個任務額外分配一個軟棧,在任務調度時,可用軟中斷打斷當前正在執行的任務,棧則用以保存各自任務以恢復。

3. 軟硬之分

硬件堆棧:是通過寄存器 SP 作為索引指針的地址,是調用了 BL 等函數調用指令后硬件自動填充的堆棧。
  

軟件堆棧:是編譯器為了處理一些參數傳遞而做的堆棧,會由編譯器自動產生和處理,可以通過相應的編譯選項對其進行編輯。
  

簡單一點說,硬件堆棧主要做為地址堆棧用,而軟件堆棧主要會被分配成數據堆棧。或看其棧頂指針是否和 CPU 具有特殊的關聯,有關聯者(如 SP)“硬”,而無關聯者“軟”。

4. 棧的純 C 實現

基本的抽象數據類型(ADT)是編寫 C 程序必要的過程,這類 ADT 有鏈表、堆棧、隊列和樹等,本節主要講解下堆棧的幾種實現方法以及他們的優缺點。
  

含羞草 堆棧(stack)的顯著特點是后進先出(Last-In First-Out, LO),其實現的方法有三種可選方案:靜態數組、動態分配的數組、動態分配的鏈式結構。

含羞草 靜態數組:特點是要求結構的長度固定,而且長度在編譯時候就得確定。其優點是結構簡單,實現起來方便而不容易出錯。而缺點就是不夠靈活以及固定長度不容易控制,適用于知道明確長度的場合。


動態數組:特點是長度可以在運行時候才確定以及可以更改原來數組的長度。優點是靈活,缺點是由此會增加程序的復雜性。


含羞草 鏈式結構:特點是無長度上線,需要的時候再申請分配內存空間,可最大程度上實現靈活性。缺點是鏈式結構的鏈接字段需要消耗一定的內存,在鏈式結構中訪問一個特定元素的效率不如數組。

首先先確定一個堆棧的頭文件,里面包含了各個方案下的函數原型,放在一起是為了實現程序的以及便于修改。然后再接著分別介紹各個方案的具體實施方法。
  

含羞草 堆棧接口 stack.h 文件代碼:

4.1 靜態數組

在靜態數組堆棧中,STACK_SIZE 表示堆棧所能的元素的最大值,用 top_element 作為數組下標來表示堆棧里面的元素,當 top_element == -1 的時候表示堆棧為空;當 top_element == STACK_SIZE - 1 的時候表示堆棧為滿。push 的時候 top_element 加 1,top_element == 0 時表示第一個堆棧元素;pop 的時候 top_element 減 1。
  

含羞草 a_stack.c 源代碼如下:

4.2 動態數組

頭文件還是用 stack.h,改動的并不是很多,增加了 stack_size 變量取代 STACK_SIZE 來保存堆棧的長度,數組由一個指針來代替,在全局變量下缺省為 0。
  

create_stack 函數首先檢查堆棧是否已經創建,然后才分配所需數量的內存并檢查分配是否成功。destroy_stack 函數首先檢查堆棧是否存在,已經釋放內存之后把長度和指針變量重新設置為零。is_empty 和 is_full 函數中添加了一條斷言,防止任何堆棧函數在堆棧被創建之前就被調用。
  

d_stack.c 源代碼如下:

4.3 鏈式結構

由于只有堆棧頂部元素才可以被訪問,因此適用單鏈表可以很好實現鏈式堆棧,而且無長度限制。把一個元素壓入堆棧是通過在鏈表頭部添加一個元素實現。彈出一個元素是通過刪除鏈表頭部第一個元素實現。由于沒有長度限制,故不需要 create_stack 函數,需要 destroy_stack 進行釋放內存以避免內存泄漏。
  

l_stack.c 源代碼如下:

下載發燒友APP

打造屬于您的人脈電子圈

關注電子發燒友微信

有趣有料的資訊及技術干貨

關注發燒友課堂

鎖定最新課程活動及技術直播

電子發燒友觀察

一線報道 · 深度觀察 · 最新資訊
收藏 人收藏
分享:

評論

相關推薦

0 課程大綱介紹和IDE安裝1 指針:地址的外號&2 指針與變量3 指針就是一個數4 如何使用一個數據5 一級指針的類型
發表于 2018-12-09 00:00? 3105次閱讀

嵌入式里堆棧原理是怎么樣的如何進行純C實現

棧這種結構在嵌入式里其實是非常常用的,比如函數調用與返回就是典型的棧應用,雖然很多時候棧都是CPU系....
發表于 2020-02-06 16:23? 24次閱讀
嵌入式里堆棧原理是怎么樣的如何進行純C實現

便攜式醫療設備的設計人員正面臨著一些獨特的挑戰。醫療照護領域對電子產品的審查控管相當嚴格,尤其在產品設計的壽命...
發表于 2020-02-06 07:00? 132次閱讀

Python如此受歡迎的原因是什么

Python帶有許多數據可視化的包。Matplotlib 是最為常用的庫,可以生成基本的圖形和圖表。
發表于 2020-02-05 18:37? 39次閱讀
Python如此受歡迎的原因是什么

嵌入式的CPU自定義指令有什么特點

Arm的自定義指令最早將在2020年上半年在ArmCortex?M33CPU中開展,而新的和現有的被....
發表于 2020-02-05 17:32? 506次閱讀
嵌入式的CPU自定義指令有什么特點

搞嵌入式,為啥要有uboot?

搞嵌入式的,為啥要有uboot?
發表于 2020-02-05 12:00? 213次閱讀
搞嵌入式,為啥要有uboot?

#define的高級用法簡介

#define的高級用法
發表于 2020-02-05 11:50? 59次閱讀
#define的高級用法簡介

C語言到底是不是真的過時了嗎

現在說到編程,大家提得更多的似乎永遠是前端、后端、小程序、Android App、iOS App,但....
發表于 2020-02-05 11:02? 150次閱讀
C語言到底是不是真的過時了嗎

第三版HBM2存儲標準發布,環比提升33%

按照設計規范,單Die最大2GB、單堆棧12 Die(無標準高度限制),也就是24GB容量,匹配10....
發表于 2020-02-04 17:34? 262次閱讀
第三版HBM2存儲標準發布,環比提升33%

基于RapidIO互連構架實現雙主機節點通信系統...

隨著嵌入式系統對信號處理性能和數據傳輸性能的不斷提高,單純依靠提高處理器性能來改善系統性能的方法已無....
發表于 2020-02-04 11:55? 69次閱讀
基于RapidIO互連構架實現雙主機節點通信系統...

嵌入式和互聯網行業應該如何選擇

我的看法是:首先考慮自己個人的興趣,這兩個行業的模式、思維、市場還是有較大不同。
發表于 2020-02-03 14:49? 218次閱讀
嵌入式和互聯網行業應該如何選擇

基于嵌入式Internet技術實現網絡打印服務器...

隨著信息技術的發展和網絡時代的到來,基于TCP/IP協議的嵌入式Internet技術越來越受到人們的....
發表于 2020-01-22 10:47? 151次閱讀
基于嵌入式Internet技術實現網絡打印服務器...

基于排爆機器人PBJ-1的嵌入式控制系統的設計與...

但是國外的排爆機器人價格過高,出現故障后維修特別不方便。因此國家863專家組已經將高性能排爆機器人的....
發表于 2020-01-22 10:36? 192次閱讀
基于排爆機器人PBJ-1的嵌入式控制系統的設計與...

基于ARM9、Linux與CAN總線實現應用于橡...

橡塑機械是現代制造技術中一類重要工具,是一種由數控裝置、伺服驅動裝置、機床主體和其他輔助裝置構成的機....
發表于 2020-01-22 10:20? 413次閱讀
基于ARM9、Linux與CAN總線實現應用于橡...

嵌入式系統的物聯網存在什么價值

嵌入式系統在物聯網應用中,已經扮演著越來越重要的角色。
發表于 2020-01-21 17:51? 47次閱讀
嵌入式系統的物聯網存在什么價值

關于嵌入式系統中USB主機方式的應用

USB 就是指通用串行總線(Universal Serial Bus),是計算機外圍設備通訊的總線標....
發表于 2020-01-21 10:07? 51次閱讀
關于嵌入式系統中USB主機方式的應用

德承P2100系列嵌入式系統問市 搭載模塊化設計...

德承是專業的嵌入式計算機制造商,推出了P2100系列嵌入式計算機(含P2102 和P2102E)。P....
發表于 2020-01-21 00:42? 304次閱讀
德承P2100系列嵌入式系統問市 搭載模塊化設計...

通過利用UART與若干器件進行連接解決通信問題

在各種外圍的設備中,使用了通用的異步接收和發送(UART)接口。例如,一個基于微控制的系統有四個這樣....
發表于 2020-01-20 17:17? 336次閱讀
通過利用UART與若干器件進行連接解決通信問題

如何實現嵌入式應用的人機界面交互性設計

用戶界面設計是屏幕產品的重要組成部分,它為人機交互構建了一個溝通環境。其中交互性設 計是用戶界面設計....
發表于 2020-01-19 10:46? 106次閱讀
如何實現嵌入式應用的人機界面交互性設計

設計嵌入式驅動程序有哪些小竅門

每一個嵌入式應用軟件都會在某些時候訪問最底層的固件和進行一些硬件控制。 驅動的設計和實施是確保一個系....
發表于 2020-01-18 12:07? 312次閱讀
設計嵌入式驅動程序有哪些小竅門

增加嵌入式存儲交換技術可靠性的解決方案

嵌入式存儲交換技術還是比較常用的,于是我研究了一下如何增加嵌入式存儲交換技術的可靠性,在這里拿出來和....
發表于 2020-01-18 09:06? 278次閱讀
增加嵌入式存儲交換技術可靠性的解決方案

不是所有便攜式系統都像圖1(參見本系列文章的第二部分)所示的系統這么簡單。圖3給出了可穿戴電子設備的典型方框圖。由...
發表于 2020-01-17 08:00? 906次閱讀

已經查閱了A53的手冊沒有找到相關的答案,自己有剛剛接觸這方面,老大給的任務,希望有大佬幫忙指點一下,或是有相關...
發表于 2020-01-16 20:32? 359次閱讀

在使用Orange Pi Zero開發板時,安裝Armbian的系統,有開發者反饋找不到聲卡,這是因為聲卡的功能是在Zero的轉接...
發表于 2020-01-16 19:42? 3365次閱讀

嵌入式串口網關怎樣實現多串口轉換

TCP/IP 協議由應用層、UDP 層、IP 層和數據鏈路層組成。為了實現透明傳輸,增加應用進程協議....
發表于 2020-01-16 17:43? 112次閱讀
嵌入式串口網關怎樣實現多串口轉換

采用PC/104嵌入式模塊與1553B總線卡實現...

隨著我國航空事業的迅速發展,各種新型飛機和發控設備相繼研制成功,以往一些測控設備在功能和性能上已無法....
發表于 2020-01-16 10:17? 373次閱讀
采用PC/104嵌入式模塊與1553B總線卡實現...

利用W3150A+芯片和LPC2292微控制器實...

通過以太網進行傳輸已經成為一種經濟、有效的數據傳輸方式。越來越多的工業測控設備需要配置網絡接入功能,....
發表于 2020-01-16 10:14? 297次閱讀
利用W3150A+芯片和LPC2292微控制器實...

IDRS分布式網絡遠程監控系統的特點性能及應用設...

視頻工作站是監控中心的核心監控設備,即“網絡監控錄像主機”,負責具體連接前端網絡攝像機,提供所有遠程....
發表于 2020-01-16 09:53? 201次閱讀
IDRS分布式網絡遠程監控系統的特點性能及應用設...

利用嵌入式系統與Internet相連接實現Web...

在硬件系統的設計中,本文采用了ATMEL公司開發的高性能8位AVR(Advanced RISC)單片....
發表于 2020-01-16 09:47? 188次閱讀
利用嵌入式系統與Internet相連接實現Web...

利用嵌入式網絡模塊實現計算機實驗平臺設計

《計算機網絡》課程是大學計算機及相關專業開設的一門計算機與通信的專業課程。本課程具有很強的實踐性,很....
發表于 2020-01-16 09:46? 346次閱讀
利用嵌入式網絡模塊實現計算機實驗平臺設計

嵌入式DVR的應用技術方案及發展趨勢

目前,DVR的技術發展方向有三個,即智能化、集成化、網絡化。要預測嵌入式DVR的技術發展趨勢,首先要....
發表于 2020-01-16 09:45? 276次閱讀
嵌入式DVR的應用技術方案及發展趨勢

基于VxWorks嵌入式實現多串口驅動的開發與通...

VxWorks操作系統是美國Wind River公司于1983年設計開發的一種嵌入式實時操作系統(R....
發表于 2020-01-16 09:37? 346次閱讀
基于VxWorks嵌入式實現多串口驅動的開發與通...

嵌入式DVR技術方案的組成及發展分析

二十世紀九十年代末,伴隨著電腦技術、圖像處理技術和網路技術的發展與普及,興起了數字化監控浪潮,而PC....
發表于 2020-01-16 09:36? 230次閱讀
嵌入式DVR技術方案的組成及發展分析

在Linux操作系統上實現無線接入點AP的設計

20世紀90年代以來,隨著個人數據通信的發展,為了實現任何人在任何時間,任何地點均能實現數據通信的目....
發表于 2020-01-16 09:34? 390次閱讀
在Linux操作系統上實現無線接入點AP的設計

基于ARM嵌入式系統與Internet網絡技術實...

基于Internet網絡的在線監控模式,一方面運行在Web服務器上的CGI程序根據客戶端瀏覽器的請求....
發表于 2020-01-16 09:25? 124次閱讀
基于ARM嵌入式系統與Internet網絡技術實...

多通道數字硬盤錄像機結構及系統特點分析

隨著現代電子技術的發展,尤其是近年來編解碼技術、多媒體通信技術以及嵌入式技術的日趨成熟,一大批有著嶄....
發表于 2020-01-16 09:22? 244次閱讀
多通道數字硬盤錄像機結構及系統特點分析

電力系統中嵌入式通信控制系統設計關鍵要點及前置機...

目前,嵌入式系統(Embedded Systems)已被廣泛地應用于工業制造、過程控制、通信、儀器、....
發表于 2020-01-16 09:22? 365次閱讀
電力系統中嵌入式通信控制系統設計關鍵要點及前置機...

Lattice MachXO2控制開發板的特性及...

Lattice公司的MachXO2系列是高度可配置的串行邏輯器件(PLD),具有低誤差,具有和高系統....
發表于 2020-01-16 09:11? 173次閱讀
Lattice MachXO2控制開發板的特性及...

OrangePi 2G-IOT 提供了兩種方式的 Android 啟動, 分別為 SD 卡啟動和 Nand 啟動。當需要升級 SD 卡或者 ...
發表于 2020-01-15 20:53? 1335次閱讀

關于8位MCU產品十大誤解

關于8位MCU產品的十大誤解
發表于 2020-01-15 16:26? 411次閱讀
關于8位MCU產品十大誤解

年關將至,趁著快回家過年,除了吃喝玩樂“葛優躺”的例行活動,我們還可以來一點不一樣的活動——開發板測評!下面就...
發表于 2020-01-14 16:47? 548次閱讀

大多數汽車]  差異化的多晶硅浮柵嵌入式閃存 多年來,大多數] ...
發表于 2020-01-12 08:00? 839次閱讀

方法1:]a. 命令行輸入 看是否有網卡(wlan*) $ insmod xradio_wlan.ko c. 輸入命令 ifconfig,應該可以看到 wlan0(假設是...
發表于 2020-01-10 19:49? 3816次閱讀

Python語言為什么可以得到廣泛的應用

Python語言目前是IT行業內最為流行的編程語言之一,同時Python也是全場景編程語言之一,目前....
發表于 2020-01-10 14:55? 298次閱讀
Python語言為什么可以得到廣泛的應用

PC架構和嵌入式錄播主機的優劣對比

隨著信息化技術的深度滲透,利用先進科技服務課堂教學,打造教學相長、互動高效的“智慧”課堂就成為了當前....
發表于 2020-01-10 14:33? 181次閱讀
PC架構和嵌入式錄播主機的優劣對比

瑞浦爾嵌入式無風扇主機可助力智能工業的發展

近年來,隨著我國人口紅利的逐漸消失,企業用工成本不斷上漲,各種工業機器人獲得了廣泛的應用,推動了產業....
發表于 2020-01-10 14:29? 253次閱讀
瑞浦爾嵌入式無風扇主機可助力智能工業的發展

嵌入式導航系統是在怎樣的設計下實現的

構成嵌入式導航系統的硬件核心是 S3C2440A 微處理器。它是一款 ARM920T 的內核 RIS....
發表于 2020-01-10 14:05? 281次閱讀
嵌入式導航系統是在怎樣的設計下實現的

1.1 中斷的理解1.1.1 中斷概念程序正在執行,突然有外部信號或者內部信號打斷正在執行的程序,需要執行該事件,執行完...
發表于 2020-01-10 11:04? 5709次閱讀

1.1 嵌入式概述1.1.1 嵌入式的含義嵌入式的全稱為嵌入式計算機系統。詳細的講嵌入式系統是以嵌入式計算機為技術核心,...
發表于 2020-01-10 10:53? 335次閱讀

采用JP13模塊和BENQ-M32模塊設計手持無...

隨著光纖通信傳輸網的延伸以及通信維護任務的增加,為加強通信線路的維護,并及時發現維護過程中存在的各種....
發表于 2020-01-09 16:23? 983次閱讀
采用JP13模塊和BENQ-M32模塊設計手持無...

如何基于STM32的四軸飛行器進行學習

實踐動手學習 | 基于STM32的四軸飛行器
發表于 2020-01-09 14:51? 596次閱讀
如何基于STM32的四軸飛行器進行學習

蘋果的新嵌入式電路織物專利或將成為智能表帶

美國專利商標局于近期通過了蘋果的一項專利申請,涉及織物的應用,諸如紡織品束帶等嵌入式元件。
發表于 2020-01-09 14:19? 327次閱讀
蘋果的新嵌入式電路織物專利或將成為智能表帶

嵌入式計算機在體育場館監控系統中的應用

體育場館是人們聚集活動的區域,這種區域人口密度大,又因為是運動場所,易有危險產生,為了更好地將危險防....
發表于 2020-01-09 14:13? 172次閱讀
嵌入式計算機在體育場館監控系統中的應用

Python和PyQT來開發嵌入式ARM界面如何...

隨著Python在互聯網人工智能領域的流行,大家也慢慢感受到Python開發的便利,本文就基于嵌入式....
發表于 2020-01-08 14:51? 309次閱讀
Python和PyQT來開發嵌入式ARM界面如何...

嵌入式處理器與AI芯片存在什么樣的差異

智能化工具領域業已成熟,智能機器領域依托 AI 芯片、神經網絡、深度學習、云際交互逐漸向強人工智能領....
發表于 2020-01-08 14:35? 164次閱讀
嵌入式處理器與AI芯片存在什么樣的差異

何為嵌入式主板,有哪些常見的嵌入式主板

嵌入式工控機是一套與工控工作臺集成在一起的單片機控制系統。配備了合適尺寸的液晶顯示屏以顯示工作菜單,....
發表于 2020-01-08 14:30? 252次閱讀
何為嵌入式主板,有哪些常見的嵌入式主板

嵌入式網絡化視頻監控系統按照怎樣的流程來設計

本系統采用B/S(瀏覽器/服務器)模式的通信構架。用戶只需在遠程客戶機安裝一個普通的瀏覽器軟件,其他....
發表于 2020-01-08 09:21? 186次閱讀
嵌入式網絡化視頻監控系統按照怎樣的流程來設計

嵌入式導航系統如何設計實現

嵌入式導航系統由硬件層、軟件層和中間層組成。
發表于 2020-01-08 09:15? 200次閱讀
嵌入式導航系統如何設計實現

SysConfig對嵌入式系統的開發有什么幫助

嵌入式系統開發人員面臨的重大挑戰之一是如何高效而精確地配置系統。當今先進的微控制器(MCU)包括各類....
發表于 2020-01-08 09:10? 131次閱讀
SysConfig對嵌入式系統的開發有什么幫助

嵌入式設計軟件哪一些功能比較重要

在測試軟件包的易用性之后,請查看對所需其他功能的支持。這可能包括對實時操作系統(RTOS)以及通信硬....
發表于 2020-01-07 14:29? 163次閱讀
嵌入式設計軟件哪一些功能比較重要

嵌入式計算機相對于商用主機的優勢是什么

工控機主要是應用于工業現場,往往是嵌入大型的機械設備中,所以也叫作為嵌入式工控機。
發表于 2020-01-07 14:16? 128次閱讀
嵌入式計算機相對于商用主機的優勢是什么

哪一種物聯網協議比較合適

與過去大多數傳統嵌入式設備的開發方式不同,物聯網設備將始終具有某種形式的通信功能。
發表于 2020-01-07 14:05? 128次閱讀
哪一種物聯網協議比較合適

嵌入式計算機的特點和優勢分別是什么

嵌入式工控機功耗低,體積小,無風扇,穩定性強,廣泛應用于工廠生產線控制,視頻監控,視頻監控,軌道交通....
發表于 2020-01-07 11:30? 151次閱讀
嵌入式計算機的特點和優勢分別是什么

基于嵌入式的物聯網安全如何來保障

隨著越來越多的設備連接到物聯網(IoT)中,對互聯網的依賴性將不斷增加。如果設備不安全,這種依賴將導....
發表于 2020-01-03 11:37? 153次閱讀
基于嵌入式的物聯網安全如何來保障

單片機堆棧的基本原理解析

堆棧指針指向最后壓入堆棧的有效數據項,稱為滿堆棧;堆棧指向下一個要放入的空位置,稱為空堆棧;有四種類....
發表于 2020-01-02 15:48? 242次閱讀
單片機堆棧的基本原理解析

高性能的嵌入式ARM MPU在醫療電子系統中的應...

當前,全球醫療電子行業正逐漸展現出誘人的發展前景,產品更新換代的速度不斷提高,同時,由于醫療電子產品....
發表于 2019-12-31 14:51? 255次閱讀
高性能的嵌入式ARM MPU在醫療電子系統中的應...

嵌入式工程師對8位MCU有哪一些誤解

32位處理器的處理更加以軟件為中心,可以做更多的代碼復用。而8位處理器更多地利用硬件外設來完成任務。....
發表于 2019-12-27 16:51? 389次閱讀
嵌入式工程師對8位MCU有哪一些誤解

嵌入式計算機是依據什么來分類的

嵌入式計算機是為特定的軟件控制任務而設計的專用計算平臺。
發表于 2019-12-27 16:34? 352次閱讀
嵌入式計算機是依據什么來分類的

嵌入式開發的應用重點是什么

盡管物聯網,嵌入式視覺,機器學習和其他新興技術在開發組織中的重要性日益提高,但C和C ++仍是嵌入式....
發表于 2019-12-27 16:17? 1170次閱讀
嵌入式開發的應用重點是什么
'+data.username+'
';*/ var login_content = ' 寫文章
' + data.username + '
'; $('#login_area').html(login_content); var win_width = $(window).width(); if (win_width > 1000) { $("#mine").mouseDelay(200).hover(function () { $("#mymenu").show(); }, function () { $("#mymenu").hide(); }); } } else { var content = '登錄'; $('#login_area').html(content); $(".special-login").click(function (e) { $.tActivityLogin(); return false; }); } }); } (function () { /* * 插入單點登錄JS */ var setHost = 'https://passport.elecfans.com'; //設置域名 var script = document.createElement('script'); script.type = 'text/javascript'; script.src = setHost + '/public/pc/js/t.passport.js'; script.setAttribute("id", "sso_script"); script.setAttribute("data-ssoSite", setHost); script.setAttribute("data-ssoReferer", encodeURIComponent(location.href)); script.setAttribute("data-ssoSiteid", "11"); var body = document.getElementsByTagName("body").item(0); body.appendChild(script); })() /* * 推薦文章無圖時樣式修改 * */ $(".article .thumb").each(function () { if ($(this).find('img').attr('src') == "") { $(this).find('img').remove(); $(this).parent().css('padding-left', '0px'); } }); /*百度分享*/ window._bd_share_config = { common: { bdText: '',//自定義分享內容 bdDesc: '',//自定義分享摘要 bdUrl: window.location.href,//自定義分享url地址 bdPic: '' }, share: [{ "bdSize": 60 }] } with (document)0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?cdnversion=' + ~(-new Date() / 36e5)]; var add_url = '/d/article/write/'; // var check_allow = "{:U('Api/iscantalk')}"; var check_allow = "/d/api/iscantalk"; var click_items_length = $('.art_click_count').length; if (click_items_length > 0) { var id_str = ''; $('.art_click_count').each(function () { id_str += $(this).attr('data-id') + ','; }) // var url = "{:U('Api/getclickbyids')}"; var url = "/d/api/getclickbyids"; var id_data = 'id_str=' + id_str; $.ajax({ url: url, data: id_data, type: 'post', dataType: 'json', success: function (re) { if (re.list.length >= 1) { var list = re.list; for (var i in list) { var temp_id = list[i]['id']; var temp_span = $(".art_click_count[data-id=" + temp_id + "]") temp_span.html(list[i]['click']); } } } }) } $("#comContent").click(function () { if (now_uid == '') { $.tActivityLogin(); return false; } }); $("#comSubmit").click(function () { if (now_uid == '') { $.tActivityLogin(); return false; } }); $(function () { var follow_wrap = $(".author-collect"); var now_uid = "{$_super['uid']}"; var face_src = "{$_super['uface']}"; var getFollowNum = $(".followNum strong").html(); //關注 $(window).on('click', '.author-collect', function () { if (now_uid == '') { $.tActivityLogin(); return false; } if ($(this).attr('id') == 'follow') { $.post('/d/user/follow', { tuid: article_user_id }, function (data) { //返回的數據格式: if (data.status == "successed") { $(".followNum strong").html(++getFollowNum); follow_wrap.html('已關注').attr('id', 'cancelFollow').css('background', '#999'); var follow_user = ''; $('#follow_list').append(follow_user); } if (data.status == "failed") { alert(data.msg); } } ); } else { //取消關注 if ($(this).attr('id') == 'cancelFollow') { $.post('/d/user/cancelFollow', { tuid: article_user_id }, function (data) { //返回的數據格式: if (data.status == "successed") { follow_wrap.html('關注').attr('id', 'follow').css('background', '#f90'); $(".followNum strong").html(--getFollowNum); $('#follow_list .face').each(function () { var target_uid = $(this).attr('data-uid'); if (target_uid == now_uid) { $(this).remove(); } }) } if (data.status == "failed") { alert(data.msg); } } ); return false; } } }); });