鍍金池/ 問答/ C++問答
假灑脫 回答
  1. C++的代碼為什么要放java的標簽?
  2. 問題排版成這樣難道不知道編輯嗎?

言歸正傳
編譯報錯是最好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

這兩者的目的都是爲了保證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 typealias, 和first-class是無關的.

換而言之, 它不能作爲參數(shù)傳遞, 再換而言之, 它不能在傳參時進行深拷貝, 它能做的只是傳指針, 同樣的道理, 如果你想將函數(shù)傳遞, 在c語法裏面也只能傳函數(shù)指針, c++11開始能用struct來模擬lambda實現(xiàn)真正傳遞函數(shù)的功能.

好, 饒了一圈, 回答剛剛那個問題, 現(xiàn)在你應該明白了, 你這裏的形參char[]不得不退化成char*了, 其實vs的提示也暗示你這個信息了. 你的解決辦法有這麼幾種:

  1. 只用std::string/std::wstring
  2. 形參: 改成const char*/char const *

其實很早以前人們就發(fā)現(xiàn)text segment在這種情況下被修改會很危險, 但是c這貨一直不高興寫進標準來規(guī)定, 不過posix倒是弄了個strdup(3), 然後c才也跟著糊了個出來, 貌似posix不嚴格要求帶error code, 後來把may改成shall了. 那麼cppreference的表述就出錯了...或許窩該去改下cppreference...更新: 改好了...

所以跟我大聲唱:

Pointer is shit, C is shit.

Update:

補充下標準中(n4741)的wording:

clipboard.png

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的差別。另外你在什么瀏覽器上測試的?我中午或下午可以在瀏覽器上測試一下。

艷骨 回答

Update1

注意, 因爲窩太垃圾了, 以下答案很有可能存在不嚴謹, 甚至錯誤的部分, 窩也在不斷的修訂. 所以, 想踩的話請隨意, 但是窩不太想刪, 刪了話自己可能沒有動力總結了, 好吧, 窩的確很自私. 但是窩相信終有一天這個答案會self-contained並且邏輯不再混亂.

Update2

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. 因爲這個網(wǎng)站的域名就是segmentfault.com.
  2. 是因爲你搜索的姿勢不對, 它不是一個單詞...而是一個詞組: segment fault. 當然, 也有縮寫: segfault, 或者Segmentation-fault.

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. 至於Segmentationfault這倆詞語, 我們從操作系統(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:

  1. Protection ring
  2. Have a single address space for all software, and rely on the programming language's virtual machine to make sure that arbitrary memory cannot be accessed – applications simply cannot acquire any references to the objects that they are not allowed to access

好, 爲了鞏固記憶, 接下來我們換一種問法, 什麼情況下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++了

陌顏 回答

您好,您這個問題解決了嗎,遇到類似的問題,方便給予解答嗎。 qq郵箱 137370999@qq.com 。謝謝!

忠妾 回答
voiceObj.pageList[index].showList=!this.data.voiceObj.pageList[index].showList
祈歡 回答

Bus error 表示程序要讀不可能存在的內(nèi)存地址,檢查mongod引用了什么so文件,編譯和執(zhí)行時的so文件要一樣。