Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Speicherüberlauf in Bibliotheksfunktion ?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
29.09.2006, 20:35 Uhr
~grimmel
Gast


Hallo,

ich habe ein seltsames verhalten in meinem array. Nur bei gewissen eingaben verändern sich ein paar anfangswerte im array nach dem aufruf einer fortran bibliotheksfunktion.
Wenn ich aber vor deren aufruf einfach speicher alloziiere und dann wieder freigebe passt alles. Ist das ein Beweis dafür dass ein speicherüberlauf stattfindet?

Hier mal mein code:


C++:
//Dies ist der vector der sich verändert
std::vector< double >            M;

loop--------------------------------------------------

    //Aufruf einer Insert funktion siehe unten
     //p_col = [1,0,0,1] z.B und e_k_hat = [4,3,0,0] als Beispiel
     Insert(M, p_col, e_k_hat);


     //Hier hat M jetzt einträge
     //Es folgt ein Aufruf einer Fortran Funktion
     fortranf_                     (SIDE,
                                         TRANS,
                                         &m,
                                         &n,
                                         &k,
                                         &A_hat[0],
                                         &lda,
                                         &tau[0],
                                         &e_k_hat[0],
                                         &lda,
                                         &work[0],
                                         &lwork,
                                         &info);
  
        und hier hat  M ein paar werte anders...



//Kopierfunktion:
void
MyClass::Insert(std::vector< double >& M,
                      const std::vector< double >& p_col,
                      const std::vector< double >& e_k_hat)
{
     std::vector< double >::const_iterator el = e_k_hat.begin();
     for( std::vector< double >::const_iterator i = p_col.begin();
          i != p_col.end();
          ++i )
     {
         if( *i != 0.0 )
             M.push_back(*el++);  
         else
             M.push_back(0.0);  
     }
}




wenn ich einfach VOR den ganzen block das hier presse:


C++:
    for(int t = 0; t < 100; t++)
        M.push_back(t);
    M.clear();



dann ist vor UND Nach dem fortran aufruf M identisch. Ohne den Block gibt es unterschiede - dies aber Immer nur in der ersten iteration (alles befindet sich in einer schleife)...

z.B so:



Code:

0.0549
0
0
0.3244

wird zu
0.0523
0.1607
0
0.3244

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.10.2006, 21:25 Uhr
~grimmel
Gast


Hmm,
niemand ne Idee?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.10.2006, 11:55 Uhr
(un)wissender
Niveauwart


Die Iteratoren des vectors werden ungültig durch push_back.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.10.2006, 13:20 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ne daran liegts nicht, M und p_col sind ja nicht der gleiche vektor.

Würde eher auf den Vergleich tippen:


C++:
if(*i != 0.0)



nen fliesskommawert auf nen genauen wert zu prüfen wird nicht hinhauen. Musst mit nem epsilon (z.b 0.000001 oder etwas adequates, muss man testen) prüfen.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.10.2006, 16:28 Uhr
(un)wissender
Niveauwart


Richtig. Aber es gibt trotzdem ein Problem mit den Iteratoren.

el wird inkrementiert, ohne zu testen ob el != end()
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.10.2006, 21:34 Uhr
~grimmel
Gast


Hallo,
danke für eure Hilfe...

ja so wie es da steht hat unwissender recht...aber speziell bei mir ist e_k_hat IMMER kleiner oder gleich gross wie p_col - von daher kein Problem.

Glaubt ihr wirklich der vergleich ist daran schuld dass mir der call der fortran funktion den vector verändert?

Und das mit dem epsilon verstehe ich nicht ganz....meintet ihr so in der art:

float eps = 0.00001;
if *i < eps ?

Danke euch vielmals
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.10.2006, 23:15 Uhr
Blubber2063



Gleitpunktzahl Vergleiche macht man immer mit
Code:
|WertA - WertB| < e
Das liegt daran das Gleitpunktzahlen eben recht ungenau werden, je größer der Bertrag vom Exponenten wird. Falls dich das genauer interessiert solltest du dich mal mit der Funktionsweise von Gleitpunktzahlen auf Rechnern vertraut machen.

Dieser Post wurde am 02.10.2006 um 23:16 Uhr von Blubber2063 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
03.10.2006, 20:39 Uhr
~grimmel
Gast


Danke für die Hilfe...

leider klappt es bei mir mit dem epsilon nicht...

ich mache folgendes:


C++:
#include <math.h>
...

double epsilon = 0.0e-10;
double a = 1.0;
if(abs(a - 1.0) < epsilon)
   ....



er geht nie in den if zweig... warum?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
03.10.2006, 20:46 Uhr
kronos
Quotenfisch
(Operator)


abs ist für ints <--- toller satz oder
da wird gerundet.
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
03.10.2006, 20:56 Uhr
~grimmel
Gast


grmpf
mit fabs gehts a net :/
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: