| 

.NET C# Java Javascript Exception

1
Folgende Situation hat mich jetzt einige Zeit aufgehalten:

function2(stru1_ *qa)
{
stru1_ q0, q1, q2, q3, q4, q5, q6, q7;
...
qa[0] = q0; qa[1] = q1; qa[2] = q2; qa[3] = q3;
qa[4] = q4;
qa[5] = q5;
qa[6] = q6;
qa[7] = q7;
...
}
function1(double phi)
{
stru1_ qaa[220];
...position 1
function2(&qaa[200]);
...position 2
}

An position 1 hat phi einen anderen Wert als an position 2, obwohl mit phi nichts gemacht wird. Ich hatte dann den Verdacht, dass in function2 irgendeine Speicherverletzung stattfindet. Dem war wohl auch so, denn wenn ich das array qaa auf 320 erhöhe, dann bleibt phi im Wert gleich... Soweit so gut, nur hat einer von euch Cracks eine Ahnung, was hier schiefläuft - abgesehen davon, dass das Ganze schrecklich programmiert ist!?
News:
12.04.2012
Eiger 1,9k 2 9
Eiger 1,9k 2 9
Ich vermute, das ist ein Tippfehler? Wo wird q0 deklariert?
Hast Du Dir einfach mal die Adressen ausgegeben? Also was bekommst Du für &qaa[200], &qaa[201], ... und was hat dann qa, bzw. qa[0], qa[1] für eine Adresse?
Xantiva 13.04.2012
q0 hatte ich vergessen, habs editiert. Adressen ausgeben ist mal eine gute Idee!
Eiger 13.04.2012
Adressen habe ich gecheckt. Stimmen überein...
Eiger 16.04.2012
struct1_ q0,... sind afaik lokal.
In C reservierst du dir erst Speicher mit z.B. malloc und arbeitest dann mit Zeigern bzw. Adressen.
Patrick-Oliver 26.07.2012
5 Antworten
0
Muss du nicht den Pointer zu dem gesamten Array an die Funktion2 übergeben?
Denn so wählst du den 200. Eintrag aus und in der Funktion noch mal welche (wie viele denn?) und wenn du beides zusammenzählst bist du -von der Position her- nicht mehr in dem Array.
Alles nur ne Vermutung, habe schon lange nichts mehr mit c++ gemacht.
12.04.2012
LiRo 1,3k 1 9
Na ja, das ist ja gerade beabsichtigt von dem, der es programmiert hat. Er übergibt den pointer auf den 200. Eintrag im array und dann geht er da noch 7 Stellen weiter in function2. Das sollte vom Platz her auch gehen, da er ja 220 Stellen alloziiert hat. Nun habe ich schonmal überlegt, ob die Allokation in function1 vielleicht nicht sequentiell im Speicher ist und function2 aber sequentiell arbeitet, da er den Speicher von qaa ja nicht kennt...Ich weiss es eben nicht.
Eiger 13.04.2012
Wäre mir neu, dass Arrays nicht am Stück allokiert werden.
LiRo 13.04.2012
1
Ich würde gerne noch den Gedanken der unterschiedlichen Struktgrößen verfolgen. Könntest du in beiden Funktionen mal mit sizeof die Größes des Struktes mit printf ausgeben. Und dann ggf. die Größe der einzelnen Members? Dann wüssten wir, an welchem Element es ggf. hängt.
KN 13.04.2012
OK. Strukturgrössen sind in beiden Funktionen gleich. Das wars nicht...
Eiger 16.04.2012
0
ich vermute, dass stru1_ eine Struct-Definition ist.
Kann es sein, dass die beiden Funktionen in zwei verschieden Sources definiert sind und mit unterschiedlichem structure packing arbeiten ?
Dann hätten die Strukturen unterschiedliche Größen im Speicher und der Effekt wäre erklärt.
bei Microsoft compilern wird das in den Eigenschaften der Projekt-Datei oder über das pragma pack eingestellt.
13.04.2012
KN 1,7k 1 8
Ja, das ist eine Struktur. Gute Idee, aber weder sind die Funktionen in unterschiedlichen sourcen, noch benutzen sie logischerweise verschiedene structure packings...
Eiger 13.04.2012
0
Wenn sich ein Parameter einer Funktion während der Ausführung einer Methode ohne zutun ändert liegt das manchmal daran, dass der Stack korrupt ist. Kannst du dein Programm mit einer Library zur Speicherüberwachung übersetzen (früher gab es z.B. sowas wie electric fence).
Das hat den Vorteil, dass es dann (wahrscheinlich) direkt an der problematischen Stelle abstürzt.
13.04.2012
puls200 3,8k 7
Also das efence kriege ich jetzt auf die Schnelle nicht zum Laufen. Ich tippe mal, dass es nicht Win7 kompatibel ist...
Eiger 16.04.2012
Das war nur ein Beispiel. Im Prinzip müsste dir ein Memory Profiler weiterhelfen. Beispiel: http://stackoverflow.com/questions/818673/memory-profiler-for-c
puls200 16.04.2012
0
Es ist zu wenig Code von Dir da um das sinnvoll zu analysieren. Dennoch folgende Hinweise:

Sind die Member initialisiert? Beispiel für stru1?
stuct stru1_
{
int a; // a ist nicht initialisiert
}


Dann schau Dir nochmal genau die Parameter an
void function1(double phi)
{
stru1_ qaa[220]; // wenn du hier auf 320 erhoehst ...
// ...
function2(&qaa[200]); // ... erhoehst Du dann hier auf 300?
// function2 wird nicht automatisch
// bis zum ende des arrays laufen
// (so sieht jedenfalls der code oben aus)
// ...
}
23.07.2012
Vash 440 2 6
Ähm, die Initialisierung der member hat mit meinem Code nix zu tun, denke ich. Der angegebene Code sollte ausreichend für meine Problemstellung sein. Das mit dem Erhöhen auf 300 macht keinen Sinn. Die Intention ist ja, beim Index 200 ins array einzusteigen und von dort aus weiterzuarbeiten... Es geht also eher ums array als um die Struktur. welche Struktur es ist, ist eigentlich egal!
Eiger 26.07.2012
0
Ich habe auch keine neue Idee mehr für die Ursache, aber wenn es sich stabil reproduzieren lässt, würde ich mal den Speicher von phi im Auge behalten, während du schrittweise durch function2 läufst.
An irgendeiner Stelle muss sich phi dann ja ändern.
Vielleicht lässt sich das so etwas eingrenzen.

Ansonsten halte ich einen korrupten Stack auch für die wahrscheinlichste Ursache.
26.07.2012
jsc 289 1 7

Stelle deine Cplusplus-Frage jetzt!