2010-11-23 15 views
1

Ich habe das folgende Programm, wo zwei Variablen durch Verweis auf eine Funktion übergeben werden, wo ihre Werte basierend auf externen Faktoren bestimmt werden, bevor sie an main() zurückgegeben werden, damit sie von anderen Funktionen verwendet werden können. Die erste Variable, die ich versuche zu übergeben, ist eine int, und das geht gut, aber die andere ist ein Array von Strings, die mir einige Probleme verursacht.Wie kann ich ein Array durch Verweis auf eine Funktion in C++ übergeben?

Ich habe genug Forschung darüber getan, um zu wissen, dass Sie kein Array oder Referenzen haben können (obwohl ich noch nicht herausfinden warum) und ich fragte mich, ob jemand mir helfen könnte, herauszufinden, wie dies zu tun ist ? Die verschiedenen Methoden, die ich versucht habe, haben alle segmentation faults ergeben.

NB: Der Code unten hat das Array von Wert übergeben, da ich einfach nicht weiß, was ich dafür schreiben soll.

Update: Ich bin verpflichtet, ein Array für meine Kursarbeit zu verwenden. Einige andere Datenstrukturen, wie die vector, die vorgeschlagen wurde, wäre großartig, aber ich muss bestimmte Strukturen verwenden.

void initialise_existing_devices(int& no_of_existing_devices, string existing_devices[100]); 

int main() 
{ 
    int no_of_existing_devices = 0; 
    string existing_devices[100]; 

    initialise_existing_devices(no_of_existing_devices, existing_devices[100]); 
} 

void initialise_existing_devices(int& no_of_existing_devices, string existing_devices[100]) 
{ 
    string line; 
    ifstream DeviceList; 
    DeviceList.open("devices/device_list"); 
    while (true) 
    { 
     getline(DeviceList, line, '\n'); 
     if (DeviceList.eof()) 
     { 
      break; 
     } 
     ++ no_of_existing_devices; 
    } 
    DeviceList.close(); 

    DeviceList.open("devices/device_list"); 
    for (int i = 0; i < no_of_existing_devices; i ++) 
    { 
     getline(DeviceList, line, '\n'); 
     existing_devices[i] = line; 
    } 
} 

Antwort

5

Eine Referenz auf ein Array wie folgt aussieht:

void f(std::string (&a)[N]) { } 

wo a der Name des Parameters und N die Anzahl der Elemente in dem Array ist.


jedoch in der Regel in C++ Sie durch Verweis nicht ein Array übergeben (Sie können; es ist einfach nicht üblich). Andere Optionen sind:

  • Übergeben Sie einen Zeiger auf das Anfangselement des Arrays; In diesem Fall sollten Sie die Größe des Arrays als zweites Argument an die Funktion übergeben.

  • Verwenden Sie ein std::vector<std::string> oder ein std::array<std::string, N> statt und geben es durch Verweis (Sie können auch die array psuedo-Container in-Boost finden;. Sperrung, dass, sollten Sie Ihre eigenen Schreiben Wenn Sie einen Blick auf die Boost-Quellcode nehmen, es ist ganz einfach und unkompliziert).

  • Übergeben Sie ein Paar Iteratoren (Anfang und Ende) an die Funktion und verwenden Sie sie, um den Bereich zu manipulieren.

Die letzte Option ist der idiomatische C++ - Ansatz; Es ist auch das allgemeinste, da Sie jeden beliebigen Containertyp verwenden können, einschließlich Arrays, Standardbibliothekscontainer oder Container, die Sie selbst geschrieben haben.


Da Sie tatsächlich versuchen, den Parameter als „out“ Parameter zu verwenden, ist es wahrscheinlich besser, nur ein std::vector<string> oder ein std::array<string, 100> mit den Ergebnissen zurückzukehren; Das ist viel sauberer.

+0

Der Code in der Frage versucht, ein Array übergeben * in * eine Funktion, erhalten nicht ein . –

+0

@Andy: Es wird als ein out-Parameter verwendet; Die Funktion gibt Ergebnisse über das Array zurück, das das OP als Referenz übergeben möchte. Es ist viel sauberer, Rückgabewerte anstelle von Out-Parametern zu verwenden. –

+0

Oder wenn Sie denken, dass Sie einen Container als Out-Parameter benötigen, verwenden Sie stattdessen einen Ausgabe-Iterator, und lassen Sie den Aufrufer 'back_inserter' verwenden. Diese Annahmevorlagen sind in Ordnung. –

1

diese Linie tun, ist nicht das, was Sie erwarten:

initialise_existing_devices(no_of_existing_devices, existing_devices[100]) 

Hinweis: Array-Index, 100 ...

Ich würde vorschlagen, dass Sie eine anstelle des Arrays verwenden und diese als Referenz übergeben.

EDIT: Okay, das Update gegeben:

können Sie eine struct verwenden? Wenn dem so ist, kann die Anordnung in einer struct Einschlag:

struct string_array 
{ 
    string data[100]; 
}; 

und dann eine Instanz dieses in Haupt definieren, und übergeben, daß durch Bezugnahme? Ich bin sicher, dass Sie die Details ausfüllen können .. :)

0

Sie sollten eine std::vector<T> für Heap-verwalteten Arrays oder eine boost::/std::array<T, N> für Stack-basierte Arrays verwenden. Diese Objekte haben ihre eigene Größe.

0

Für das tatsächliche Argument verwendet nur die Array-Namen, die die Adresse des Arrays darstellt:

initialise_existing_devices(no_of_existing_devices, existing_devices); 

für die Parameter dieses auf das Array für einen konstanten Zeiger verwenden:

void initialise_existing_devices(int& no_of_existing_devices, string existing_devices[]) 

Das heißt, die Verwendung eines std :: vector als Rückgabetyp oder Referenzparameter würde die Notwendigkeit erschweren, die Anzahl der Geräte vor dem Aufruf zu erraten.

0

Dies ist eines der Dinge, die C++ mit C gemeinsam hat. Arrays werden nicht nach Wert übergeben. Sie werden zu Zeigern zu ihren ersten Elementen degradiert. Die Array-Syntax in den Funktionsparametern ist im Wesentlichen nur ein Kommentar. Sie können sagen, indem Sie eine sizeof(existing_devices) in Ihrem Funktionsaufruf tun. Die Antwort auf Ihre Frage ist also, dass Sie es bereits tun.

0

Sie können Vorlagen verwenden, etwa so:

template <size_t size> 
initialise_existing_devices(int& no_of_existing_devices, string (&existing_devices)[size]) 
{ 
} 

oder Sie tun können:

typedef string hundred_strings[100]; 

initialise_existing_devices(int& no_of_existing_devices, hundred_strings &existing_devices) 
{ 
} 
+0

Aber wenn Sie keinen wirklich guten Grund für die Verwendung von festen Arrays haben (und die meisten Male nicht in diesen Tagen), dann ist die Verwendung eines Vektors eine bessere Wahl) – Mordachai

Verwandte Themen