2016-03-24 8 views
-1

Ich schreibe einen Array-basierten Code, der nach dem Kompilieren einige verwirrende Fehler verursacht. Ich habe im Internet nach Beispielcode gesucht, den ich mehr oder weniger verstehe, aber es ist hilfreich für mich, Fehler in meinem eigenen Code/Gedankenprozess zu identifizieren.Array und Größe der Probleme beim Kompilieren von Fehlern C++

Die Aufgabe besteht darin, eine Funktion zu erstellen, die ein Array mit einer unbekannten Anzahl von Ganzzahlen akzeptiert und die geraden Zahlen im Array summiert. Mir wurde gesagt, dass der letzte Eintrag des Arrays -1 ist, aber ich denke nicht, dass diese Information nützlich ist.

Hier ist mein Code:

#include <iostream> 
using namespace std; 

int sumEven(int myArray[]) 
{ 
int len = (sizeof(myArray)/sizeof(myArray[0])); 
int i = 0; 
int count = 0; 

while (i < len) 
{ 
    if (myArray[i] % 2 == 0) 
    { 
    count = count + myArray[i]; 
    } 
    i++;  
} 

return count; 
} 

Ich versuche len wie die Anzahl der Array-Elemente zu definieren. Ich denke, dass dies nicht funktionieren, da ein Fehler zu dieser Linie bezieht sich:

prog.cpp:13:18: error: sizeof on array function parameter will return size of 'int *' instead of 'int []' [-Werror,-Wsizeof-array-argument] 
int len = (sizeof(myArray)/sizeof(myArray[0])); 
       ^
prog.cpp:11:17: note: declared here 
int sumEven(int myArray[]) 
       ^
1 error generated. 

Ich habe Erfahrung mit Matlab, Mathematica und Python, und so kann meine C++ Formatierung seltsam sein. Danke für einen Blick.

+0

Sie müssen nicht die Länge finden, nur iterieren, bis Sie -1 drücken. – pstrjds

+0

Ich plane für den Fall, dass -1 mehr als einmal auftritt. –

+0

Von der Formulierung Ihrer Frage habe ich das als Hausaufgabe genommen und Ihnen gesagt, dass der letzte Eintrag -1 ist. Wenn das die Bedingung ist, die Sie erhalten, dann können Sie aufhören, wenn Sie eine -1 finden. Das Problem Statement gibt Ihnen im Grunde die Lizenz, an diesem Punkt zu stoppen, so dass Sie den Fall einer zusätzlichen -1 nicht behandeln müssen. – pstrjds

Antwort

2

Das Problem ist, dass, wenn sie als Argumente einer Funktion übergeben, Arrays zu Zeigern abklingt auf das erste Element, so dass die Funktion

int sumEven(int myArray[]) { ... } 

ist eigentlich gleich

int sumEven(int *myArray) { ... } 

Und Einnahme Die Größe eines Zeigers gibt die Größe des Zeigers zurück und nicht das, auf das er zeigt.

Wenn Sie die Größe in der Funktion wissen müssen, sollten Sie die Anzahl der Elemente als Argument übergeben:

int sumEven(int *myArray, size_t len) { ... } 
+0

Re "das Problem ist", sehe ich ein paar weitere Probleme. –

1

Arrays Zerfall Zeiger, wenn man sich an eine Funktion. Das bedeutet, dass die Information bezüglich der Größe des Arrays verloren geht.

Dies bedeutet, dass (sizeof(myArray)/sizeof(myArray[0])) nicht tun, was Sie in diesem Zusammenhang wollen, denn hier myArray ist ein Zeiger.

Die kanonische Lösung besteht darin, einen weiteren Parameter hinzuzufügen, der die Array-Größe darstellt, und diesen stattdessen zu verwenden. Dies ist der Ansatz in C.

In C++ sollten Sie wahrscheinlich std:: vector verwenden, es sei denn, Sie haben einen bestimmten Grund, mit Arrays zu bleiben, die notorisch fehleranfällig sind.