2016-11-23 95 views
-1

我是一年級學生,也是編程新手。我被要求寫一個函數,它可以將數組值與其索引進行交換。 EG如果數組:[4,3,0,5,1,2]然後O/P:array [4] = 0,數組[3] = 1等等。交換數組值與數組索引

這是我的代碼:

#include <stdio.h> 
#include<iostream> 
using namespace std; 

int swaparr(int arr, int len){ 
    int b[len]; 
    int k; 
    for(int i=0; i<len; i++){ 
     k=arr[i]; 
     b[k]=i; 
    } 
    return b; 
} 
int main() 
{ 
    int arr[6]={4, 3, 0, 5, 1, 2}; 
    cout<<swaparr(arr, 6); 
    return 0; 
} 

我得到錯誤:

prog.cpp: In function 'int* swaparr(int, int)': 
prog.cpp:9:16: error: invalid types 'int[int]' for array subscript 
     k=arr[i]; 
       ^
prog.cpp:6:9: warning: address of local variable 'b' returned [-Wreturn-local-addr] 
    int b[len]; 
     ^
prog.cpp: In function 'int main()': 
prog.cpp:17:25: error: invalid conversion from 'int*' to 'int' [-fpermissive] 
    cout<<swaparr(arr, 6); 
         ^
prog.cpp:5:6: note: initializing argument 1 of 'int* swaparr(int, int)' 
int *swaparr(int arr, int len){ 
    ^

請解釋我的錯誤。 P.S我想從錯誤中學習,所以請告訴我缺少什麼基礎知識。

+0

他們希望你把什麼'array [0]'?選擇是'2'和'5'。 – dasblinkenlight

+0

你的函數是'swaparr(int,int)',但是你傳遞一個數組和一個'int'。那不匹配。同樣,對於'return b;'''b''不是一個int,而是幾個'int's。 –

+0

_'int b [len];'_變長數組無效C++。 –

回答

0
  1. 返回任何局部變量的地址是非常危險的。 (對於 例如,返回數組b的第一個元素, 你試圖做的地址)
  2. 陣列是從指針不同,雖然隱式轉換可以 來執行,當你試圖分配一個陣列到指針(或 用數組初始化指針)。實際上,指針 將存儲陣列中第一個元素的地址,並且在轉換期間該陣列的長度爲 會丟失。
  3. 你不能複製構造一個數組與另一個數組(類似於 int arr [10] = foo(),其中foo將返回一個數組類型,而不是 可能)。或者將一個數組分配給另一個。但是您可以返回 對數組的引用,這是另一個故事。
  4. 您最好從書本上學習這些知識,而不是閱讀由不擅長英語的人編寫的 答案。

我已經用盡可能少的更改更正了您的代碼。

#include <stdio.h> 
#include <iostream> 
using namespace std; 

void swaparr(int *arr, int len, int *output){ 
    int k; 
    for(int i=0; i<len; i++){ 
     k=arr[i]; 
     output[k]=i; 
    } 
} 

int main() 
{ 
    int arr[6]={4, 3, 0, 5, 1, 2}; 
    int swapped[6]={0}; 

    swaparr(arr,6,swapped); 
    for (int i=0; i<6; ++i) 
     cout << swapped[i] << " "; 
    cout << endl; 
    return 0; 
} 
  1. 而不是返回的數組或一個地址的,我製備在 功能主陣列,和把它傳遞給功能swaparr,和swaparr將 結果寫入到這個陣列。
  2. 不能簡單地要求std :: cout來打印一個數組,你必須打印 它是一個又一個的元素。
  3. 當您完成打印後,不要忘記打印一個endl。 (總是)
+0

非常感謝你的努力。你的代碼可以幫助我理解我在做什麼錯誤。 –