言歸正傳
編譯報錯是最好debug的錯誤之一,所有的錯誤編譯器都明確告訴你了
請看代碼中的這一行:
vmm[i].insert(it->first,count);
這里vmm[i]
是一個 map<int,char*>
, 且不說插入值的時候需要用pair<int, char*>
包裝鍵值對,it->first
是一個int
,count
也是一個int
,值的類型和map
的定義不符。
如果不在乎insert的返回值的話,個人覺得用map[key] = value
的方式更簡潔
前后端分離的話,前端獲取返回的數(shù)據(jù),根據(jù)業(yè)務(也就是你的類型)進行跳轉
未分離的情況如果用的是balde模板,改下return view('你想跳轉的頁面的名稱')即可吧
有的字符就是空白,比如回車,tab,有的顯示成文號,可能是你電腦上沒有這個字符集吧。
你確定你編譯出來了嗎?cout << *p;
你都沒加分號。另外#include <iostream>
和using namepspace std;
你加了嗎?還有C++的main
一定要return
一個整型的,而不是void
。
以下代碼我已經(jīng)測試過了,會輸出55。
#include <iostream>
using namespace std;
class base {
private:
int x;
public:
void setx(int a) {x = a;}
int getx() {return x;}
};
int main() {
int * p;
base a;
a.setx(55);
p = new int(a.getx());
cout << *p;
return 0;
}
c++版藥丸...一天都沒人回答...果然沒什麼人留下來了...回答的答案也沒有人搭理...
它已經(jīng)提示你了嘛, 你的字符串"朱明"
的類型是const char*
, 至於爲什麼是這個類型呢?
因爲c++的string literal("朱明")是不可修改, 從c++11開始就只能用以下兩種方法聲明了:
const char* str = "朱明";
const str
指向具體實現(xiàn)中的text segment, const
保護了此數(shù)據(jù)`or
str[] = "朱明";
str
本身也會深複製"朱明"到Activation Records, 其具體實現(xiàn)可以是stack`這兩者的目的都是爲了保證text segment中的數(shù)據(jù)不被修改. 原因窩在註釋中解釋了.
如果你的形參(parameter)是char *
, 那麼傳進來的參數(shù)不就有了被修改text segment(這裏是string literal)"朱明"
)的危險, 所以爲了安全期間, c++11開始ban了這樣的方式,
當然, 你可能會有這樣的亦或:
窩明明形參(parameter)的類型是char[]
不是char*
呀.
其實呢, 這該c背鍋, c風格的字符串在c++裏面不是一等公民, 或者說first-class, (這裏有人會誤解或者說是因爲字符串或者函數(shù)他們不是base type, 而是derived type, 所以不能做到傳值, 不, 不是這樣的, struct同樣是derived type, 它就能傳值, derived type僅僅是composite type的alias, 和first-class是無關的.
換而言之, 它不能作爲參數(shù)傳遞, 再換而言之, 它不能在傳參時進行深拷貝, 它能做的只是傳指針, 同樣的道理, 如果你想將函數(shù)傳遞, 在c語法裏面也只能傳函數(shù)指針, c++11開始能用struct來模擬lambda實現(xiàn)真正傳遞函數(shù)的功能.
好, 饒了一圈, 回答剛剛那個問題, 現(xiàn)在你應該明白了, 你這裏的形參char[]
不得不退化成char*
了, 其實vs的提示也暗示你這個信息了. 你的解決辦法有這麼幾種:
std::string
/std::wstring
const char*
/char const *
其實很早以前人們就發(fā)現(xiàn)text segment在這種情況下被修改會很危險, 但是c這貨一直不高興寫進標準來規(guī)定, 不過posix倒是弄了個strdup(3)
, 然後c才也跟著糊了個出來, 貌似posix不嚴格要求帶error code
, 後來把may
改成shall
了. 那麼cppreference的表述就出錯了...或許窩該去改下cppreference...更新: 改好了...
所以跟我大聲唱:
補充下標準中(n4741)的wording:
diff在這裏可以看到
http://www.open-std.org/jtc1/...
var a = 1
就是講a定義為全局變量,你fn1()執(zhí)行的時候,fn1函數(shù)內(nèi)部,alert(a)前面并沒有定義a,就會在全局作用域中尋找a,所以第一次是alert(1),然后你的a被改為2(第二次的a也是全局的),最下面的那個alert(a)中的a就為2
放遠程cnd啥的、然后大家都引用。
fgetc的返回值是int類型。一個可能的解釋是fgetc失敗了,返回了-1,導致你換算后的二進制全是1。
把ch的聲明改成int
while( (ch = fgetc(fp)) != 255){
改為
while( (ch = fgetc(fp)) != -1){
while之后打印一下errno:
printf("%d %s\n", errno, strerror(errno));
看到底是什么原因導致fgetc失敗.
extensions: ['', '.js', '.json', '.scss'];
新版本的空字符是會報錯;
改成extensions: ['*', '.js', '.json', '.scss'];
你可能忘記了mybatis的xml文件可以寫ResultMap這個東西
多表查詢之后 結果映射到ResultMap里
func()
?哪來的func()
?能不能把你的代碼補充完整,包括你在哪里用了this
,并且把你期望這個this
指向哪個對象也補上。我猜你可能用了箭頭函數(shù),箭頭函數(shù)沒有this
關鍵字哦。
我試了一下以下代碼(手機上只有node,node的原型是__proto__
。瀏覽器上跑不方便)
function Graph() {}
var Graph = new Graph();
Graph.__proto__.foo = function() {
console.log('old foo', this);
return this;
}
Graph.__proto__.fun = function() {
console.log('old fun', this);
return this;
}
Graph.__proto__.foo = function() {
console.log('new foo', this);
function subfoo() {
console.log('subfoo', this);
this.fun();
return this;
}
subfoo.call(this);
return this;
}
Graph.foo();
結果是
new foo Graph {}
subfoo Graph {}
old fun Graph {}
Graph {}
非常的正常,不知道你有沒有漏了什么信息沒有提供的,當然也有可能是瀏覽器和node的差別。另外你在什么瀏覽器上測試的?我中午或下午可以在瀏覽器上測試一下。
I don't have Chinese input method editor, so I will write in English(but too lazy to translate the original contexts into English, So previous Chinese wording preserved)
很不幸, 之所以你搜segmentfault都是這個論壇, 有兩個原因,
1.1. segment fault既不是linux特有的, 也不是c++特有的, 甚至從語言規(guī)範中, 它不屬於c++, 因爲c++的標準文檔中沒有對Segmentation fault沒有過定義. 喂雞百科中它被定義爲:
In computing, a segmentation fault (often shortened to segfault) or access violation is a fault, or failure condition, raised by hardware with memory protection, notifying an operating system (OS) the software has attempted to access a restricted area of memory (a memory access violation).
長話短說, 就是軟件訪問了不該訪問的memory, 而硬件具有內(nèi)存保護功能. 具體的說, 就是當MMU檢測到非法內(nèi)存被訪問了, 那麼它就讓CPU產(chǎn)生一個exception.
1.2. c或者c++這種既接近底層, 又古老的語言會引起段錯誤.
1.3. 書沒什麼好推薦的, 畢竟這玩意一般第一天寫c/c++就會碰到...碰到多了自然知道了, 非要推薦的話去看些操作系統(tǒng)之類的書(CSAPP, OSTEP, etc)會有比較深刻的認知吧,比如trap. 不過也別迷信讀書, 畢竟現(xiàn)在互聯(lián)網(wǎng)這麼發(fā)達. 你把英文喂雞上的關於它的內(nèi)容看一邊也差不多了.
2.1. bus error, stack overflow(更新: 有一種說法是stack overflow本身不是錯誤(error/fault), 但是它的存在會觸發(fā)其它錯誤(error/fault), 其中之一就是Segmentation fault, 因爲call stack溢出後, 程序有可能對非法地址進些讀寫操作. ......好多好多呢, 你去這個列表看下,
2.2. 至於Segmentation和fault這倆詞語, 我們從操作系統(tǒng)講起:
假想下你的操作系統(tǒng)就是一個巨大的庫, 所有操作(包括應用軟件)都只要調(diào)用這個庫(的API)就行了, 沒有任何權限限制, 這其實就是早期操作系統(tǒng)的設計形態(tài), 後來人們逐漸意識到這麼做是不安全的, 放到今天應該會很容易明白, 比如你肯定不希望手機流氓軟件(應用軟件)訪問你在磁盤上的個人信息吧, 但是我們依然要確保操作系統(tǒng)有權限訪問, 所以我們需要一場革命, 帶來一個新的內(nèi)存保護機制, 或者說是一個新的文件系統(tǒng), 當然, 這個文件系統(tǒng)肯定不能作爲一個庫, 不然還是什麼都沒有改變, 最終, 這個革命者名爲system call, 其實現(xiàn)是通過硬件(CPU的trap)指令, 伴隨它的還有user mode, kernel mode(這兩個mode是針對CPU的, 比如, CPU可以用一個bit來表徵, 0代表kernel mode, 1代表kernel mode等. 具體的做法就是system call賦予操作系統(tǒng)更高的硬件優(yōu)先級. 應用軟件處於user mode, 不能進行讀寫磁盤/物理內(nèi)存等操作, 它將某些數(shù)值放在寄存器或棧幀, 表示自己希望從操作系統(tǒng)處得到那些東西, 然後應用軟件調(diào)用trap)指令, 即執(zhí)行system call, 此時CPU轉換爲kernel mode, 並且跳轉到一些指令處, 這些指令是屬於操作系統(tǒng)的, 他們會聆聽(通過之前的寄存器或者棧幀)應用軟件, 然後也切換到kernel mode, 執(zhí)行這些請求.
However, how can we separate user mode from kernel mode? Two approaches:
好, 爲了鞏固記憶, 接下來我們換一種問法, 什麼情況下system call會被執(zhí)行呢?
答案還是trap)(需要注意的是此處的trap)不同於上面的trap)指令, 是兩回事, 這裏的trap)是一個泛指, 是interrupt的子集, 特指非硬件層面的interrupt). 經(jīng)常, trap)也可以用其同義詞--falut或者exception來代替. 有些地方會將這些分開, 比如如果你關注國外各個大學的操作系統(tǒng)(設計(與實現(xiàn))的課的話, 會發(fā)現(xiàn)他們往往會對其定義有差別, 比如由硬件還是軟件觸發(fā)之類, 具體如fault有時會特指page fault, 再比如Intel microprocessor manuals裏將synchronous interrupts定義爲exceptions, asynchronous interrupts 定義爲interrupts, 但是很多時候大家對其區(qū)分不是很嚴格, 經(jīng)常一個interrupt signal就包括前面?zhèn)z貨了, 不過這個實現(xiàn)都是平臺相關的, 可能別的體系就有另一套說辭, 或者能更一步細化, 比如在古老的Linux/i386中, 其實現(xiàn)就是interrupt 0x80
說完fault, 我們再回到Segmentation, 其實它就是一段內(nèi)存, 但是帶有一個值來標記內(nèi)存, 並且還包含偏移量, 當然也分爲物理內(nèi)存和虛擬內(nèi)存, 這裏只說虛擬內(nèi)存, 因爲你編寫的c/c++程序用到的都是虛擬內(nèi)存而不是物理內(nèi)存. Segmentation fault]合在一起就是一個trap/exception/fault/software interrupt, 因爲它訪問了不該訪問的內(nèi)存.
不用數(shù)學的思想 單純用遞歸的思想
比如傳入4
先執(zhí)行先序遞歸 index++
先序遞歸做value = 1+2+3+4
滿足條件后 return;
然后執(zhí)行后續(xù)遞歸 開始index--
后續(xù)遞歸做value += 3+2+1+0;
var cal = function() {
var index=0;
var value=0;
return function show(n) {
if(n < 0) return;
value += index;
if(index === n)return;
index++;
show(n);
index--;
value += index;
return value;
}
};
cal()(4) // 16
for(int i = 0; i < n; i++) {
if(a[i] == x) {
cout << i << endl;
break; // 這里break了,下面的flag=true不會被執(zhí)行到
flag = true;
}
}
也是遇到這樣的問題,現(xiàn)在直接放棄c++了
it's my typo: data->date
Thanks for Chen's answer
您好,您這個問題解決了嗎,遇到類似的問題,方便給予解答嗎。 qq郵箱 137370999@qq.com 。謝謝!
voiceObj.pageList[index].showList=!this.data.voiceObj.pageList[index].showList
Bus error 表示程序要讀不可能存在的內(nèi)存地址,檢查mongod引用了什么so文件,編譯和執(zhí)行時的so文件要一樣。
arr.ubshift(obj )
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學院和江蘇省首批服務外包人才培訓基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術與教育服務機構,發(fā)展為教育服務業(yè)的綜合性企業(yè)集團,成為集合面授教學培訓、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。