Anfänge mit Visual Studio 2008



  • Hallo Zusammen!

    Ich habe damals viel mit Borland in C++ programmiert und bin nun durch den Zugang zu MSDNAA auf Visual Studio 2008 umgestiegen.

    Leider jedoch muss ich merken, dass hier einiges anders ist und ich habe gerade größere Probleme einen Array anzulegen.

    Gelernt habe ich es folgendermaßen:

    double aArray[10][10];
    
    aArray[0][1] = 10; // Beispielwerte
    aArray[0][2] = 15;
    aArray[1][0] = 20;
    

    Ich nutze in Visual Studio Windows Forms und habe in meinen Projektordner eine weitere *.cpp-Datei eingebunden (diese auch inkludiert, was soweit ganz gut funktioniert).
    In dieser Datei soll nun ein mehrdimensionales Array, wie in meinem Beispiel gezeigt, erzeugt werden und in der Haupt-cpp aufrufbar sein (also global).

    Ich habe im Internet aber leider immer nur etwas über gcnew gelesen und auch die Hilfe von Visual Studio zeigt nur schlechte Beispiele.

    Ich würde mich freuen, wenn mir hier jemand kurz den Gebrauch von einem Array erläutren könnte!!

    Vielen Dank im Voraus und einen guten Rutsch ins neue Jahr,
    Antispy



  • Die Programmiersprache C++ ist weitgehend standardisiert, der eigene Code sollte sich (bis auf spezifische Erweiterungen) also nicht von Compiler zu Compiler unterscheiden.

    Was geht denn konkret nicht? Dein Beispiel ist nämlich so korrekt.



  • Antispy schrieb:

    Gelernt habe ich es folgendermaßen:

    double aArray[10][10];
    
    aArray[0][1] = 10; // Beispielwerte
    aArray[0][2] = 15;
    aArray[1][0] = 20;
    

    funktioniert das denn, wenn du nicht zwei cpp-dateien hast?

    Ich nutze in Visual Studio Windows Forms und habe in meinen Projektordner eine weitere *.cpp-Datei eingebunden (diese auch inkludiert, was soweit ganz gut funktioniert).

    du sollst doch keine cpp-dateien inkludieren.

    In dieser Datei soll nun ein mehrdimensionales Array, wie in meinem Beispiel gezeigt, erzeugt werden und in der Haupt-cpp aufrufbar sein (also global).

    in der einen cpp-datei das ding anlegen. double aArray[10][10];
    in der anderen es extern deklarieren. extern double aArray[10][10];



  • Hi volkard,

    ich habe das soeben einmal ausprobiert und wenn ich den Array direkt in der main() anlege und Werte einfüge bekomme ich auf jeden Fall keine Fehlermeldung!

    Da dieses aber ein ziemlich großer Array werden wird, würd ich diesen gerne in eine andere Datei auslagern..

    In meiner Windows-Forms Datei soll es 3 Dropdown-Felder geben.
    In diesen können z.B. die Werte "1" "3" und "6" ausgewählt werden und es soll anschließend in einer Textbox der Inhalt des Arrays aWerte[1][3][6] ausgegeben werden.

    Ist das so möglich, wie ich das beschrieben habe???

    Danke für die schnelle Hilfe!!

    Liebe Grüße,
    Antispy



  • Antispy schrieb:

    Ist das so möglich, wie ich das beschrieben habe???

    nein. da bekommst du linker-fehler, weil das array mehrfach definiert wird. einmal in der array.cpp und einmal in der main.cpp, die die array.cpp inkludiert.

    wie gesagt:
    in der einen cpp-datei das ding anlegen. double aArray[10][10];
    in der anderen es extern deklarieren. extern double aArray[10][10];
    das müßte unktionieren.



  • Zitat:
    Ich nutze in Visual Studio Windows Forms und habe in meinen Projektordner eine weitere *.cpp-Datei eingebunden (diese auch inkludiert, was soweit ganz gut funktioniert).

    du sollst doch keine cpp-dateien inkludieren.

    Wie könnte ich es denn sonst inkludieren?



  • Antispy schrieb:

    Wie könnte ich es denn sonst inkludieren?

    der compiler compiliert selber schon beide cpp-dateien. und der linker fügt die beiden compilate dann zusammen. dadurch wird dann in der ausführbaren datei alles beisammen sein. es besteht also keine not, da was zu inkludieren.
    durch "extern" sagst du dem compiler "lieber compiler, es folgt eine variablendeklaration für eine variable, die in einer anderen cpp-datei angelegt ist. mach mir jetzt keinen ärger und mecker nicht. der linker wird's richten."



  • main.cpp:

    ...
    int main(array<System::String ^> ^args)
    {
    extern int b_costs[2][2][2];
    ...
    

    building_costs.cpp:

    #include "stdafx.h"
    
    int b_costs[2][2][2];
    b_costs[1][1][1] = 90;
    

    Hier bekomm ich nun diese Fehlermeldung:

    .\building_costs.cpp(36) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    .\building_costs.cpp(36) : error C2369: 'b_costs': Neudefinition; unterschiedliche Feldindizes
    .\building_costs.cpp(3): Siehe Deklaration von 'b_costs'
    .\building_costs.cpp(36) : error C2440: 'Initialisierung': 'int' kann nicht in 'int [1][1][1]' konvertiert werden
    Es gibt keine Konvertierungen von Arraytypen, obwohl es Konvertierungen von Verweisen oder Zeigern in Arrays gibt
    Code wird generiert...



  • zeig auch mal die zeile 36 und die zeile davor.



  • #include "stdafx.h"
    
    int b_costs[2][2][2]; // <-- Zeile 3
    b_costs[1][1][1] = 90; // <-- Zeile 36
    

    Dazwischen liegen nur Kommentare und dahinter nichts mehr.



  • Antispy schrieb:

    #include "stdafx.h"
    
    int b_costs[2][2][2]; // <-- Zeile 3
    b_costs[1][1][1] = 90; // <-- Zeile 36
    

    Dazwischen liegen nur Kommentare und dahinter nichts mehr.

    komisch. der code sieht für mich ganz ok aus.
    ups,
    die zuweisung
    b_costs[1][1][1] = 90;
    geht ja gar nicht im global scope.

    int b_costs[2][2][2]; // <-- Zeile 3
    void init_costs()
    {
       b_costs[1][1][1] = 90;
    }
    
    void init_costs();//diese zeile könnte fein in einen header gehen, der einfachheit halber aber mal schnell so
    int main()
    {
       init_costs();
    ...
    }
    


  • Ich habe nun mal alle Kommentare entfernt und nun sieht meine building_costs.cpp folgendermaßen komplett aus (Zeile 1-5):

    #include "stdafx.h"
    
    int b_costs[2][2][2];
    
    b_costs[1][1][1] = 90;
    

    Die Fehlermeldung ist folgende:

    Kompilieren...
    building_costs.cpp
    .\building_costs.cpp(5) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    .\building_costs.cpp(5) : error C2369: 'b_costs': Neudefinition; unterschiedliche Feldindizes
    .\building_costs.cpp(3): Siehe Deklaration von 'b_costs'
    .\building_costs.cpp(5) : error C2440: 'Initialisierung': 'int' kann nicht in 'int [1][1][1]' konvertiert werden
    Es gibt keine Konvertierungen von Arraytypen, obwohl es Konvertierungen von Verweisen oder Zeigern in Arrays gibt



  • Antispy schrieb:

    Ich habe nun mal alle Kommentare entfernt und nun sieht meine building_costs.cpp folgendermaßen komplett aus (Zeile 1-5):

    Schau dir nochmal volkard's letzten Post an.



  • ohh.. hatte gar nicht gesehen, dass das editiert wurde.

    Das scheint aber soweit zu klappen 🙂

    Jetzt versuche ich bei einem Onklick eines Buttons den Wert eines Labels zu ändern:

    Label1->Text=b_costs[1][1][1];
    

    hier bekomm ich jetzt aber leider folgende Fehldermeldung:

    error C2065: 'b_costs': nichtdeklarierter Bezeichner



  • Was mich komisch dünkt, ist dass der Borland Builder das durchgehen lässt...



  • Antispy schrieb:

    ohh.. hatte gar nicht gesehen, dass das editiert wurde.

    Das scheint aber soweit zu klappen 🙂

    Jetzt versuche ich bei einem Onklick eines Buttons den Wert eines Labels zu ändern:

    Label1->Text=b_costs[1][1][1];
    

    hier bekomm ich jetzt aber leider folgende Fehldermeldung:

    error C2065: 'b_costs': nichtdeklarierter Bezeichner

    int main(array<System::String ^> ^args) 
    { 
    extern int b_costs[2][2][2];
    

    hatte ich nicht so gedacht, sondern eher

    extern int b_costs[2][2][2]; 
    int main(array<System::String ^> ^args) 
    {
    

    ich vermute, dein
    Label1->Text=b_costs[1][1][1];
    ist nicht in der main()

    kannst auch
    extern int b_costs[2][2][2];
    in jede funktion klatschen, wo es gebraucht wird. also als erste zeile in die OnClick()



  • Der Code für den Button befindet sich in der Form1.h

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    			 b_main_wood->Text=b_costs[1][1][1];
    }
    

    b_main_wood ist dabei der Name des Labels.



  • private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                                extern int b_costs[2][2][2]; 
    			 b_main_wood->Text=b_costs[1][1][1];
    }
    

    dürfte klappen.



  • kannst auch
    extern int b_costs[2][2][2];
    in jede funktion klatschen, wo es gebraucht wird. also als erste zeile in die OnClick()

    Da erscheint dann diese Meldung:

    Form1.h(2571) : error C2664: 'void System::Windows::Forms::Control::Text::set(System::String ^)': Konvertierung des Parameters 1 von 'int' in 'System::String ^' nicht möglich
    Es ist kein benutzerdefinierter Konvertierungsoperator verfügbar, oder
    Es ist keine Standardkonvertierung von der mittels Boxing geschachtelten Form des arithmetischen Typs in den Zieltyp vorhanden.



  • ich kenne die richtigen funktionen nicht, aber

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
       extern int b_costs[2][2][2]; 
       System::String^ str;
       str += b_costs[1][1][1];
       b_main_wood->Text=str;
    }
    

    geht, wenn ich http://heifner.blogspot.com/2007/02/int-to-string-under-managed-c.html recht verstehe.
    vielleicht ist

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
       extern int b_costs[2][2][2]; 
       b_main_wood->Text=System.Convert.ToString(b_costs[1][1][1]);
    }
    

    netter.


Anmelden zum Antworten