導航:首頁 > 源碼編譯 > pg類型轉換為數組源碼

pg類型轉換為數組源碼

發布時間:2022-12-25 10:23:52

A. PG字元串操作

1、查看是否包含子串

2、字元串切割為數組

3、替換子串

4、截取子串

4、拼接字元串

B. C語言里 灰度圖像怎麼轉換為二維數組

1、步驟大概這樣
第一步:讀取圖像數據到內存
第二步:讀取文件頭
第三步:讀取信息頭
第四步:讀取圖像矩陣到二維數組
2、常式:

FileName=fileDlg.GetFileName();
FILE*fp=fopen(FileName,"rb");//二進制讀方式打開指定的圖像文件
fread(&FileHead,sizeof(BITMAPFILEHEADER),1,fp);//讀取文件頭,文件指針自動後移
fread(&InfoHead,sizeof(BITMAPINFOHEADER),1,fp);//讀取信息頭,文件指針自動後移
//獲取圖像寬、高、每像素所佔位數等信息
bmpWidth=InfoHead.biWidth;
bmpHeight=InfoHead.biHeight;
//下面完成圖像數據向內存數組的存儲
ImageData=newunsignedchar*[bmpHeight];
if(InfoHead.biBitCount==24)
{
for(inti=0;i<bmpHeight;i++)
{
ImageData[i]=newunsignedchar[(bmpWidth*3+3)/4*4];
}
for(intk=0;k<bmpHeight;k++)
{
for(intj=0;j<(bmpWidth*3+3)/4*4;j++)
{
fread(&ImageData[k][j],1,1,fp);//上面完成動態二維數組的申請,這里實際讀取圖像數據
}
}
fclose(fp);//關閉文件

C. 內存管理技術四:xvisor實現源碼分析2

Guest在發生異常的時候,會觸發vm_exit從guest切換到host,xvisor作為當前的host觸發中斷,通過stvec寄存器,調用在 xvisor/arch/riscv/cpu/generic/cpu_entry.S 中定義的 _handle_hyp_exception 異常處理函數。
HANDLE_EXCEPTION 定義的 do_handle_exception 是在 arch_cpu_irq_setup 中將其地址寫入到了CSR_STVEC寄存器中,stvec寄存器是用來保存處理中斷函數地址的寄存器。 arch_cpu_irq_setup 函數可以追溯到 vmm_entry 中的 cpu_init 。

_handle_hyp_exception 首先對通用寄存器和虛擬化h寄存器的內容進行保存然後跳轉到HANDLE_EXCEPTION, HANDLE_EXCEPTION 會調用 do_handle_exception 。 xvisor/arch/riscv/cpu/generic/cpu_exception.c 中do_handle_exception函數調用對應的中斷或者異常,此處進入 do_handle_trap ,根據寄存器cause的值,判斷是哪一種trap,此處我們要處理的page fault將會根據case中跳轉到 cpu_vcpu_page_fault 中。

cpu_vcpu_page_fault 中首先會獲取fault_addr,此處的fault_addr可以理解為guest的gpa。接著根據這個地址先去guest的region_list中判斷當前的fault_addr是否在region中,如果識別到當前的地址指向的是一個 VMM_REGION_VIRTUAL 的虛擬設備,則直接通過 cpu_vcpu_emulate_load/store 進行模擬的讀寫操作。如果當前地址不是虛擬的設備,則通過map的方式尋找到gpa對應hpa。接下來我們將詳細講述以上描述的過程。

首先要理解,兩階段地址轉換是不會觸發page fault的,guest在正常運行的過程中,首先會在vsatp寄存器中獲取頁表的地址,然後再hgatp寄存器中獲取第二階段頁表的地址,通過nest的方式完成定址。發生page fault是因為訪問硬體設備,或者申請的虛擬地址並沒有真正分配內存的時候。 cpu_vcpu_page_fault 函數處理的流程就是根據fault_addr,也就是guest的gpa來判斷是否能夠找到對應的region,且這個region還是一個virtual的device,這樣的話就可以直接調用調用 cpu_vcpu_emulate_load/stroe 去完成。
vmm_guest_find_region 中首先會根據reg的flag判斷設備到底是屬IO/Memory,在xvisor中將所有的設備都定義為了memory形式。然後根據flag信息獲得設備樹的根節點,因為IO/Memory是不同的設備樹,擁有不同的根節點。在獲取設備樹的根節點之後,判斷傳入的fault_addr也就是gpa在哪個節點。如此就通過樹的方式找到是否找到了gpa對應的region。

vmm_guest_find_region 函數會根據傳入的gpa和flag信息找到對應的region,如果可以找到,則表明當前的gpa訪問的是一個虛擬的設備。就可以直接進行模擬的讀寫操作。在 vmm_devemu_emulate_read 的模擬讀的操作中,真正執行讀操作的是 devemu_doread ,傳入的參數就有 reg->devemu_priv ,也就是在 region_add 中給 virtual device 傳入的模擬設備的結構體變數, devemu_priv 是一個指針,指向的emulator設備。有了定義的模擬的設備的結構體,就可以去對應模擬設備中執行操作,比如讀取rtc的時間。Guest讀取rtc的操作是在guest啟動的時候從vmm中獲取一個起始時間,加上系統運行的時間就獲得了實時的時間。

如果傳入的gpa訪問的不是虛擬的設備,那麼就需要找到gpa對應的hpa。這個操作就是由 cpu_vcpu_stage2_map 來完成的。

cpu_vcpu_stage2_map中首先定義了一個頁 struct mmu_page pg; 的結構體,用來保存gpa,hpa,size和flag等信息。

定義一個地址將gpa的後12位清零,因為gpa->hpa的轉換後12位為頁內偏移,是不會變化的,所以想要找到gpa對應的hpa只要找到gpa的頁對應的hpa對應的物理頁即可。
inaddr = fault_addr & PGTBL_L0_MAP_MASK;
在獲得gpa對應的頁之後,嘗試將頁去guest對應的設備樹中尋找對應的hpa頁。 vmm_guest_physical_map 函數首先是繼續將獲得頁作為gpa去 vmm_guest_find_region 。

如果轉化成頁的gpa還沒有找到對應的region,則表明 cpu_vcpu_stage2_map 階段失敗,將直接返回並列印出錯誤的gpa地址。

在guest的region_list中找到gpa頁對應的region之後,就可以去region中去找對應的hpa了, vmm_guest_find_mapping 用來完成這個步驟。 vmm_guest_find_mapping-> mapping_find 根據gpa的地址尋找到mapping數組中對應的i。在region_add章節中可以知道,mapping是一個數組,比如mem0代表guest內存的部分,就有一百多個數組。
map = mapping_find(guest, reg, &i, gphys_addr);
在獲得數組的對應的i之後,就可以根據region的起始地址加上i對應的偏移量之後,得到region中對應的gpa。Hphys是mapping數組的起始hpa,加上偏移量就得到了數組中對應的hpa的地址。將這個得到的hphys傳給指針hphys_addr指針指向的地址。

到這里 vmm_guest_physical_map 中傳入的參數hphys_addr就已經獲取到了hpa的對應地址,此時要將對應的gpa,hpa,size等信息填充到mmu_page這個結構體中。

(TODO:在cpu_vcpu_stage2_map中對RAM/ROM和64位的情況下有另外的操作,比如對於64位的情況不再是對頁進行映射,而是對vpn[3]作為gpa進行地址進行映射,需要進行分析這么做的原因是什麼)

在擁有了gpa,hpa,size和flag等信息之後,需要將該部分內容填充到頁表中。雖然頁表的定址是通過mmu,tlb等硬體完成的,但是頁表項pte等內容是由軟體來完成的。 arch_mmu_pgflags_set 根據獲得region flag來填充pg結構體中flag的內容。注意在xvisor中,MMU_STAGE2是用來描述gpa->hpa的,但是MMU_STAGE1並不是用來描述guest在第一階段的地址轉換,而是xvisor自身的mmu轉換,這個和文檔中的內容有所不同。
arch_mmu_pgflags_set(&pg.flags, MMU_STAGE2, pg_reg_flags);
接著根據pg結構體的內容來填充stage2的頁表內容。 riscv_guest_priv(vcpu->guest)->pgtbl 是從guest結構體中獲得arch_priv指針指向的riscv_guest_priv結構體,並獲得pgtbl頁表的指針。頁表結構體中用來存放虛擬地址,頁的地址,pte頁表項的內容信息。

mmu_map_page首先根據sz的判斷,找到頁表的對應的最後一級頁表,此處採用的是遞歸的方式。因為我們知道頁表指向的最後一級頁表的PPN就是對應的物理地址,所以此處要填充的一定是最後一級頁表中PPN的地址。mmu_pgtbl_get_child顧名思義,獲取下一級頁表返回一個頁表結構體給child。

mmu_pgtbl_get_child 中將gpa對應的vpn[i]中的內容取出,變成了pte數組中的index。Pte指向的是上一級頁表中的pte頁表的pte數組首地址,pte_val就是數組中對應的pte的值。Pte_val本身也是一個數組,即頁表項,由PPN和flag組成。

arch_mmu_pte_is_valid 用來判斷pte的有效位是不是為1,如果為1就可以將頁表項中的PPN通過偏移轉換成地址賦給tbl_pa。 mmu_pgtbl_find ->mmu_pgtbl_nonpool_find ,去頁表池中根據地址找到空閑的頁表返回給child並且對child頁表結構體進行初始化 mmu_pgtbl_alloc 。
找到需要填充的頁表,並獲得結構體之後,需要對虛擬地址對應的pte頁表項內容進行填充,依然是根據虛擬地址找到對應的index,和pte數組的起始地址。
index = arch_mmu_level_index(pg->ia, pgtbl->stage, pgtbl->level); pte = (arch_pte_t *)pgtbl->tbl_va;
根據pg結構體中的內容填充pgtbl中pte頁表項的內容。 arch_mmu_pte_set(&pte[index], pgtbl->stage, pgtbl->level, pg->oa, &pg->flags);
arch_mmu_pte_set 傳入的參數arch_pte_t *pte就是&pte[index],是vpn[]對應的pte,pte本身也是一個數組,首先將pa也就是pg->oa,是region中找到的hpa填充到pte對應的PPN中。

再來回顧一下sv32中pte頁表項的內容,注意雖然PPN劃分成了PPN[0]和PPN[1],但這兩個在使用的時候是作為一個整體的。在經歷過 arch_mmu_pte_set 後,gpa->hpa第二階段頁表中vpn[]對應的頁表項的內容已經根據region尋找到了對應hpa並填充在對應的pte頁表項pte中。這樣硬體mmu就可以從多級頁表的結構中尋找到gpa對應的hpa。多級頁表的填充是同過遞歸的方式來實現的。

D. pg庫substring數組用法

1) start_position==0時,子串的起始位置為1,即從第一個字元開始;
2) start_position<0時,字串的起始位置從字元串尾部開始後推。
3) length參數可以預設。

E. java怎麼處理postgresql的存儲函數返回的數組

postgreSQL的JDBC驅動是支持數組返回的,數組對應的類型為org.postgresql.jdbc4.Jdbc4Array(我用的是jdbc4).

一個示例, 函數如下:

createorreplacefunctionfn_rtbAry()
returnsinteger[]
as$fn_rtbAry$
begin
return'{10,20,30}'::integer[];
end;
$fn_rtbAry$languageplpgsql;

Java中獲得返回的數組, 要引入java.lang.*,java.sql.*,java.util.*,org.postgresql.jdbc4.*:

Connectionconn=null;
Statementcmd=null;
ResultSetrs=null;
Jdbc4Arrayobj=null;
Integer[]dataAry=null;
//...連接,查詢創建以及初始化代碼省略
rs=cmd.executeQuery("selectfn_rtbAry()asv");
//循環獲得數據
while(rs.next()){
obj=(Jdbc4Array)rs.getObject(1);
dataAry=(Integer[])obj.getArray();//這里獲得函數返回的數組,並轉換成Integer數組
//其他代碼省略
}
//釋放對象代碼省略

F. postgresql中如何將類型轉換成numeric

select
24::numeric;

select '-20'::numeric;

G. Python中字元串與數組的轉換方法

Python實現字元串與數組相互轉換功能,具體如下:


1、字元串轉數組:

H. postgresql里邊的數組怎麼操作

1. 數組可以作為欄位類型

PostgreSQL中數據是一種基本的數據類型,可以作為欄位的類型定義。例如,

CREATETABLEads.tb_mo_item
(
mo_keyintegerNOTNULL,
input_flowinteger[]NOTNULLDEFAULTARRAY[]::integer[]
);

2. 可以用array[]來初始化一個數組

selectarray[1,3,4]::int[];

3. 操作數組有一系列函數, 可以實現數組比較,添加新元素,一般數組是否包含另一數組的判斷,等等。具體參考PostgreSQL說明文檔中函數和操作符中有關Array的部分。

操作符有: =, <>, <, >, >=, <=, @>, @<, &&, ||

函數有: array_append, array_cat, array_ndims, array_dims, array_fill, array_length, array_lower, array_remove, array_replace, array_to_string, array_upper, string_to_array, unnest等.

其中,常用的是: array_append, array_length, unnest

4. 使用數組下標獲得數組的元素,下標是從1開始的

select(array[1,3,4]::int[])[2];

5. 可以用unnest將數組轉換成一個結果集,個人覺得這個很有用處

selecta.afromunnest(array[1,3,4]::int[])a;

I. pgsql里邊怎樣把integer類型轉換為date類型

可以轉的,只要你清楚資料庫存儲時間的真正格式。
事實上是float的
一天分為24小時,而小數點前面的整數就是天數,把24小時作為1。也就是說
1.5的意思,實際上是1天12個小時。單位可能不一定對,大概就是這么個意思

以此類推,往後的小數點排列不用我說了吧?

如果不相信,可以試試這個select cast(getdate() as float)

J. pg資料庫如何傳一個數組對象急急急。。。

pg資料庫是什麼?在sql里,首先,傳遞數組,不如傳遞字元串,然後通過自定義function,來split 這個字元串。當然,如果你一定要傳遞數組,那也可以在sql中創建自定義類型。然後創建存儲過程,將數組錄入到datatable,之後傳遞給你的存儲過程中的這個自定義類型。

閱讀全文

與pg類型轉換為數組源碼相關的資料

熱點內容
gz壓縮文件夾 瀏覽:177
字母h從右往左跑的c語言編程 瀏覽:127
安卓手機如何擁有蘋果手機橫條 瀏覽:765
業余編程語言哪個好學 瀏覽:137
按照文件夾分個壓縮 瀏覽:104
航空工業出版社單片機原理及應用 瀏覽:758
如何在電信app上綁定親情號 瀏覽:376
安卓的怎麼用原相機拍月亮 瀏覽:805
配音秀為什麼顯示伺服器去配音了 瀏覽:755
c盤清理壓縮舊文件 瀏覽:325
app怎麼交付 瀏覽:343
圖蟲app怎麼才能轉到金幣 瀏覽:175
如何做徵文app 瀏覽:446
用什麼app管理斐訊 瀏覽:169
安卓如何下載寶可夢劍盾 瀏覽:166
編譯器開發屬於哪個方向 瀏覽:940
megawin單片機 瀏覽:687
以色列加密貨幣監督 瀏覽:909
程序員前端現在怎麼樣 瀏覽:499
伺服器和介面地址ping不通 瀏覽:557