Elemente eines Array lassen sich nicht beschreiben!



  • Servus!
    Ich hab ein ganz kurioses Problem und hoffe ihr könnt mir weiterhelfen!
    Und zwar benötige ich in meinem Programm 3 Listen welche double Werte speichern sollen. Hier erstmal der Quelltext:

    int *DistanceLeft = 0;     
        DistanceLeft = new int [1000];
    
        float DistanceRight[1000]; 
    
        double *DistanceThree = 0;      
        DistanceThree = new double [1000];      
    
    for(int i=0; i<1000; i++)
            { 
              DistanceLeft[i] = 1234.5656;
              DistanceRight[i] = 22151.45;
              DistanceThree[i] = 55343.756;
              printf("DistanceLeft[%i]: %i\n",i,DistanceLeft[i]);
              printf("DistanceRight[%i]: %i\n",i,DistanceRight[i]);
              printf("DistanceThree[%i]: %i\n",i,DistanceThree[i]);
            }
    

    Wenn ich das Array als 'int' definiere funktioniert alles wunderbar! Wenn ich es allerdings als 'double' oder 'float' bzw. dynamisch oder Statisch definiere (siehe Quelltext) kann ich keine Zahlen reinschreiben und ich bekomme immer den Wert "0" für jedes Element! Woran liegt das? Leider sind die Werte die danach reinkommen sehr, sehr krumme Zahlen und wir brauchen die genauigkeit 😃
    Ich hab schon überall mit google gesucht und auch mein Mitbewohner (Informatiker 6. Semester) wusste da nicht wirklich weiter und empfahl mir vom Konsolenprogramm zu C-Sharp zu wechseln ^^
    Naja, hoffe ihr könnt das Problem nachvollziehen und mir weiterhelfen!

    Vielen Dank!

    grüße teddds

    EDIT:
    Interessanterweise funktioniert im selben Programm über die selbe Definition ein zweidimensionales Array mit Double Zahlen wunderbar! Ich dachte übrings auch schon an ein Problem mit dem Compiler aber auch mit einem anderen wurden keine Zahlen in das eindimensionale Array übernommen 😞
    Hier die Definition das Mehrdimensionales Array:

    double **grid;
         grid = new double*[res_x];
         for (int i = 0; i<res_x; i++) 
             {
              grid[i] = new double[res_y];
             }
    
    for (int i=0; i<(res_x/2); i++) 
             {
              for (int j=0; j<(res_y/2); j++) 
                  {
                   t=(res_y/2)-j;
                   k=(res_x/2)-i;
                   grid[i][j] = (resolution*sqrt(k*k+t*t)) ;         
                  }
              }
    

    Wie schon gesagt, das funktioniert wunderbar!



  • teddds schrieb:

    Ich hab ein ganz kurioses Problem
    ...

    int *DistanceLeft = 0;     
        ...
        float DistanceRight[1000]; 
        double *DistanceThree = 0;      
        ...
        for(int i=0; i<1000; i++) { 
            ...
            printf("DistanceRight[%i]: %i\n",i,DistanceRight[i]);
            printf("DistanceThree[%i]: %i\n",i,DistanceThree[i]);
        }
    

    Du verwendest %i für floating-point-Zahlen. Nicht gut.
    (Alternativ: %f oder gleich std::cout benutzen)

    Du verwendest new[]. Nicht gut.
    (Alternativ: std::vector benutzen)

    kk



  • krümelkacker schrieb:

    teddds schrieb:

    Ich hab ein ganz kurioses Problem
    ...

    int *DistanceLeft = 0;     
        ...
        float DistanceRight[1000]; 
        double *DistanceThree = 0;      
        ...
        for(int i=0; i<1000; i++) { 
            ...
            printf("DistanceRight[%i]: %i\n",i,DistanceRight[i]);
            printf("DistanceThree[%i]: %i\n",i,DistanceThree[i]);
        }
    

    Du verwendest %i für floating-point-Zahlen. Nicht gut.
    (Alternativ: %f oder gleich std::cout benutzen)

    Du verwendest new[]. Nicht gut.
    (Alternativ: std::vector benutzen)

    kk

    die [%i] war nur für mich schnell um die eingabe zu überprüfen. Aber hast natürlich recht das da dann %f oder %d stehen sollte... ist allerdings egal weil weiterhin in jedem element der liste "0" steht 😞
    und wegen "std::vector", da weiß ich nicht ob das unter C laufen wird... weil das prog nachher unter einem C compiler laufen muss.



  • Du musst dich schon entscheiden, übrigens auch für das richtige Forum. 😉

    new ist c++ und kein c. Wenn du reines C verwenden willst brauchst du z.B. malloc.

    Das hier funktioniert wunderbar:

    #include <cstdio>
    using namespace std;
    
    int main()
    {
    int *DistanceLeft = 0;    
        DistanceLeft = new int [1000];
    
        float DistanceRight[1000];
    
        double *DistanceThree = 0;      
        DistanceThree = new double [1000];      
    
    for(int i=0; i<1000; i++)
            {
              DistanceLeft[i] = 1234.5656;
              DistanceRight[i] = 22151.45;
              DistanceThree[i] = 55343.756;
              printf("DistanceLeft[%i]: %i\n",i,DistanceLeft[i]);
              printf("DistanceRight[%i]: %f\n",i,DistanceRight[i]);
              printf("DistanceThree[%i]: %f\n",i,DistanceThree[i]);
            } 
    
    	return 0;
    }
    

    Kann mir eigentlich nicht vorstellen, dass bei dir dann überall 0 stehen soll. Ist das, was du hier ins Forum geschrieben hast wirklich der Quelltext, den du kompilierst und ausführst?

    P.S.: bei den printf Aufrufen, stimmt das erste %i weil die Variable i tatsächlich ein int ist. Nur das zweite %i sollte in den letzten beiden Aufrufen ein %f sein.



  • habs jetzt nochmal compiliert und natürlich die ausgabe mit %.2f gemacht und siehe da, aus "0" wurde 1234.123 ^^
    trotzdem danke!

    manchmal sinds halt doch die kleinen sachen die man dann einfach nicht mehr sieht!
    kann geclosed werden!

    Vielen dank nochmal!

    OT: Dann hoffe ich mal das der C-Compiler das dann schluckt... mir wurde heute nur gesagt das ich nicht die standart ein/ausgaben (cin / cout) nutzen kann weil der compiler das nicht nimmt. Deshalb denke ich mal das das Prog in C sein muss.
    Wie Sieht denn ein Array mit malloc?! denn aus? Hab sowas bisjezt immer mit C++ gemacht 🙄

    Schönen abend euch alle!



  • teddds schrieb:

    Aber hast natürlich recht das da dann %f oder %d stehen sollte... ist allerdings egal weil weiterhin in jedem element der liste "0" steht 😞

    %f gilt für floating-point, nicht nur für float. %f ist auch richtig für double. Beim Aufruf von VarArg-Funktionen werden float-Werte vorher nach double konvertiert. das printf bekommt also immer double-Werte. Das gleiche gilt für Ganzzahlen. Hier findet eine "integral promotion" statt. Eine Zahl vom Typ signed short wird zB als signed int übergeben.

    teddds schrieb:

    und wegen "std::vector", da weiß ich nicht ob das unter C laufen wird... weil das prog nachher unter einem C compiler laufen muss.

    Dann bist Du hier im falschen Unterforum.

    kk



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • krümelkacker schrieb:

    Beim Aufruf von VarArg-Funktionen werden float-Werte vorher nach double konvertiert. das printf bekommt also immer double-Werte. Das gleiche gilt für Ganzzahlen.

    und was wenn mein system nur 4 bytes ausgeben kann und bei 8 bytes explodiert?



  • Dann würde die Implementierung für dein System sicher 4 byte doubles implementieren...


Anmelden zum Antworten