Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Ich bin mit meinem Latein am Ende!

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 <
000
22.01.2016, 17:43 Uhr
Yadgar



Hi(gh)!

Warum ergibt dieser Code:


C++:
for (i=0; i<messtemp; i++)
  {
    
    jahrsumm_temp += DatenTemperatur[i].Wert;
    if (i>0)
    {
      if (DatenTemperatur[i].Monat != DatenTemperatur[i-1].Monat)
      {
    monat++;
    monmax_temp[monat] = -300;
    monmin_temp[monat] = 999;
      }    
    }
}



einen Speicherzugriffsfehler? messtemp ist ein integer-Wert so um die 8500 herum, i ist vom Typ unsigned short, und die innerste Bedingung wird nur geprüft, wenn i größer als 0 (also mindestens 1) ist, so dass i-1 in keinem Fall negativ sein kann... ICH VERSTEHE DAS NICHT!!!

HILFE!!!!!

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.01.2016, 21:43 Uhr
Hans
Library Walker
(Operator)


Hi,

hast Du Dir das schon mal im Debugger angesehen? - Also welchen Wert i hat, wenn der Fehler auftritt?
Dann wäre die Frage, wieviele Bits unsigned short umfasst? Reichen die womöglich nicht aus? - Das halte ich zwar für unwahrscheinlich, aber im Augenblick gerade nicht für unmöglich.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.01.2016, 22:32 Uhr
Yadgar




Zitat von Hans:
Hi,

hast Du Dir das schon mal im Debugger angesehen? - Also welchen Wert i hat, wenn der Fehler auftritt?
Dann wäre die Frage, wieviele Bits unsigned short umfasst? Reichen die womöglich nicht aus? - Das halte ich zwar für unwahrscheinlich, aber im Augenblick gerade nicht für unmöglich.

Hans


Debugger? Kann ich nicht mit umgehen, ich weiß nicht einmal, ob es bei gcc überhaupt einen gibt...

Ich habe mir i ausgeben lassen, es wird hochgezählt bis 8754... also liegt es nicht an den beiden Bedingungen (die ich zwischenzeitlich wieder zu einer zusammengefasst habe), sondern - an der Variable monat!

Die wird nämlich von 0 bis 13 hochgezählt, obwohl die Arrays monmax_temp und monmin_temp (speichern die absoluten Temperaturmaxima und -minima jedes Monats) natürlich nur jeweils 12 Elemente haben.

Ich korrigierte also den Code:


C++:
for (i=0; i<messtemp-1; i++)
  {
    
    jahrsumm_temp += DatenTemperatur[i].Wert;
    // cout << DatenTemperatur[i].Monat << endl;
    if (i>0 && monat < 12 && (DatenTemperatur[i].Monat != DatenTemperatur[i-1].Monat))
    {
      cout << monat << endl;
      monmax_temp[monat] = -300;
      monmin_temp[monat] = 999;
      monat++;
    }
   [...]
}



und habe jetzt zumindest in dieser ersten inneren Schleife keine Bereichsüberschreitung mehr.

Als ich aber dann einen weiteren Programmteil, den ich zwecks Fehlersuche auskommentiert hatte, wieder dazunahm:


C++:
  for (i=0; i<messtemp-1; i++)
  {
    
    jahrsumm_temp += DatenTemperatur[i].Wert;
    // cout << DatenTemperatur[i].Monat << endl;
    if (i>0 && monat < 12 && (DatenTemperatur[i].Monat != DatenTemperatur[i-1].Monat))
    {
      
      monmax_temp[monat] = -300;
      monmin_temp[monat] = 999;
      monat++;
    }    
    if ((i>0 && DatenTemperatur[i].Tag != DatenTemperatur[i-1].Tag) || i == messtemp-1)
    {
      tagavg_temp = tagsumme_temp/messtemp_tag;
      tagavgs_temp.push_back(tagavg_temp);
      tagmaxs_temp.push_back(tagmax_temp);
      tagmins_temp.push_back(tagmin_temp);
      if (i == messtemp-1)
    break;
      tag++;
      tagmax_temp = -300;
      tagmin_temp = 999;
      tagsumme_temp = 0;
      messtemp_tag = 0;
    }
    cout << monat << endl;
[...]
}



habe ich sofort wieder den Speicherzugriffsfehler... und kann noch nicht einmal sagen, wo!
Warum? Warum??? WARUM???!!!???

Warum schmeißt einem dieses Scheiß-C++ dauernd Knüppel zwischen die Beine?
Warum ist Programmieren nicht so einfach wie... wie... ...Fahrradfahren?!?

Kurz davor, meine Wohnung kurz und klein zu schlagen und mich anschließend mit Benzin zu übergießen und anzuzünden...

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.01.2016, 05:34 Uhr
Hans
Library Walker
(Operator)


Hi,

Zitat:
Debugger? Kann ich nicht mit umgehen, ich weiß nicht einmal, ob es bei gcc überhaupt einen gibt...


klar gibt es da einen. Der nennt sich gdb und ist hier zu finden. Aber da das Ding auf Kommandozeilenebene arbeitet, hab ich mich damit auch noch nicht intensiver beschäftigt, sondern nutze meisstens den Debugger vom Open Watcom Paket. Der hat nämlich ein grafisches Frontend. Für gdb gibt zwar weitere Frontends, auch grafische, wie etwa ddd, aber dafür gilt in meinem Fall das Gleiche wie für gdb selbst. - Ich sollte eigentlich mal testen ob und falls ja, wie es sich aus Code::Blocks heraus damit arbeiten lässt...
Wichtig ist in jedem Fall, das Du dem Compiler mitteilst, dass er Debuginformationen haben willst. Das ist beim gcc die Option -g. Es gibt, wie bei gcc üblich, dann noch einen ganzen Schwung weiterer Optionen zum Debugging, aber die lassen wir jetzt mal aussen vor. Evtl. ergibt sich durch das Übersetzen mit Debuginfos ja schon eine bessere Fehlermeldung beim Programmabbruch, die darauf schliessen lässt, in welcher Zeile der Fehler auftritt.

Warum Dein jetziger Code wieder Speicherzugriffsfehler produziert, kann ich so auch nicht sagen.
Ansonsten würde ich erst mal eine Runde Spazieren gehen, wenn ich überhaupt nicht mehr weiter komme. Evtl. eine Tasse Tee trinken. Oder einen Boxsack verprügeln, denn dem juckt das nicht. - Der ist ja schliesslich dafür da.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 23.01.2016 um 05:42 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.01.2016, 08:57 Uhr
~f.-th.
Gast


Kann so gewollt sein, find ich aber interessant:


C++:
      monmax_temp[monat] = -300;
      monmin_temp[monat] = 999;



min ist grösser als max?

Mich irritiert so was - gehe i.d.R. davon aus das max grüsser ist.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.01.2016, 15:19 Uhr
ao

(Operator)


gdb ist wunderbar in Eclipse integriert. Solltest du dir mal näher ansehen.


Zitat:
Warum schmeißt einem dieses Scheiß-C++ dauernd Knüppel zwischen die Beine?
Warum ist Programmieren nicht so einfach wie... wie... ...Fahrradfahren?!?

Weil du es falsch angehst, Yadgar. Du programmierst echt viel und auch große Projekte, aber du arbeitest mit Methoden, mit denen ich höchstens einen Zehnzeiler schreiben würde. Na ja, vielleicht auch zwanzig ...

Leg mal einen Monat lang alle "echten" Programmierprojekte beiseite und verbessere deine Werkzeugsammlung. Als allerwichtigstes leg dir eine IDE zu, die einen Debugger integriert, sowas wie Eclipse CDT, das funktioniert ganz fantastisch. Und kümmer dich um Versionskontrolle. Leg dir einen Account auf einem öffentlichen Subversion- oder Git-Server an, wo du deine Sourcen regelmäßig einchecken kannst, dann wirst du auch nicht mehr von "gestern-gings-noch"-Problemen überrascht.

Ein guter Programmierer kennt nicht nur seine Sprache genau, sondern hat auch Arbeitsmethoden drauf, mit denen er zielstrebig vorgehen kann und nicht immer wieder in dieselben Fallen tappt. Und hier, scheint mir, fehlt dir noch einiges. Ich glaube dir sofort, dass es wahnsinnig frustrierend ist, das immer wieder zu erleben. Aber dann tu was dagegen und lerne.

Ach ja, zu deinem Code: Mach dir bitte die Mühe und bau ein vollständiges Codebeispiel, das den Fehler aufweist, nicht nur diesen Schnipsel da. Der Fehler kann woanders liegen oder mit anderen Teilen zumindest in Zusammenhang stehen. Das heißt nicht, dass du zehn Meter Sourcecode posten sollst. Aber bitte irgendwas, was wir nehmen und durch den Compiler jagen können, ohne uns den Rest (Typendeklarationen, Variablen, Mainfunktion) erst noch dazudenken zu müssen. Danke.

Dieser Post wurde am 23.01.2016 um 15:23 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: